Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Socket
Sign inDemoInstall

depcheck

Package Overview
Dependencies
Maintainers
2
Versions
53
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

depcheck - npm Package Compare versions

Comparing version 1.4.3 to 1.4.7

.github/workflows/publish.yml

199

dist/check.js

@@ -6,30 +6,16 @@ "use strict";

});
exports.default = check;
exports.default = void 0;
var _path = _interopRequireDefault(require("path"));
var _debug = _interopRequireDefault(require("debug"));
var _isCoreModule = _interopRequireDefault(require("is-core-module"));
var _lodash = _interopRequireDefault(require("lodash"));
var _readdirp = _interopRequireDefault(require("readdirp"));
var _minimatch = _interopRequireDefault(require("minimatch"));
var _requirePackageName = _interopRequireDefault(require("require-package-name"));
var _utils = require("./utils");
var _parser = _interopRequireDefault(require("./utils/parser"));
var _typescript = require("./utils/typescript");
var _constants = require("./constants");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
function isModule(dir) {

@@ -43,3 +29,2 @@ try {

}
function mergeBuckets(object1, object2) {

@@ -52,3 +37,2 @@ return _lodash.default.mergeWith(object1, object2, (value1, value2) => {

}
function detect(detectors, node, deps) {

@@ -64,2 +48,60 @@ return (0, _lodash.default)(detectors).map(detector => {

// Apply imports map from package.json to a discovered dependency. If the
// dependency starts with '#' and we have a matching entry in "imports" in
// the package.json we'll substitute the possible mapped imports in place of
// that dependency.
//
// Conditions can be well-known ones implemented by node, TypeScript, or webpack like
// "import", "browser", "types", or "require". They can also be custom ones as configurable
// in webpack configuration or using the enhanced-resolve package.
//
// See also:
// - https://nodejs.org/api/packages.html#subpath-imports
// - https://www.typescriptlang.org/docs/handbook/esm-node.html
// - https://webpack.js.org/configuration/resolve/#resolveconditionnames
function applyImportsMap(importsMap, dep) {
const resolvedDeps = [];
function accumulateDeps(v, wildcardMatch) {
if (v) {
if (typeof v === 'string') {
resolvedDeps.push(wildcardMatch && v.includes('*') ? v.replaceAll('*', wildcardMatch) : v);
} else if (typeof v === 'object') {
Object.values(v).forEach(vv => accumulateDeps(vv, wildcardMatch));
}
}
}
// Match input against the path pattern; if it matches, and there was a wildcard in the patten,
// return the part of the input that matched the wildcard. If there was no wildcard, return
// an empty string.
function matchPathPattern(pattern, input) {
if (pattern.includes('*')) {
const escapedPattern = pattern.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&');
const regexPattern = escapedPattern.replace(/\\\*/g, '.*');
(0, _debug.default)('depcheck:applyImportsMap:matchPathPattern:regexPattern')(pattern, input, regexPattern);
const regex = new RegExp(`^${regexPattern}$`);
const match = input.match(regex);
if (match) {
return match[0];
}
} else if (pattern === input) {
return '';
}
return null;
}
if (dep.startsWith('#')) {
Object.entries(importsMap).forEach(m => {
const match = matchPathPattern(m[0], dep);
if (match !== null) {
accumulateDeps(m[1], match);
}
});
if (resolvedDeps.length) {
(0, _debug.default)('depcheck:applyImportsMap:resolved')(dep, resolvedDeps);
return resolvedDeps;
}
(0, _debug.default)('depcheck:applyImportsMap:unresolved')(dep);
}
return [dep];
}
function discoverPropertyDep(rootDir, deps, property, depName) {

@@ -73,7 +115,15 @@ const {

}
async function getDependencies({
deps,
dir,
filename,
detectors,
importsMap,
parser
}) {
const result = await parser(filename, deps, dir);
async function getDependencies(dir, filename, deps, parser, detectors) {
const result = await parser(filename, deps, dir); // when parser returns string array, skip detector step and treat them as dependencies.
const dependencies = _lodash.default.isArray(result) && result.every(_lodash.default.isString) ? result : (0, _lodash.default)((0, _parser.default)(result)).map(node => detect(detectors, node, deps)).flatten().uniq().map(_requirePackageName.default).thru(_dependencies => parser === _constants.availableParsers.typescript ? // If this is a typescript file, importing foo would also use @types/foo, but
// when parser returns string array, skip detector step and treat them as dependencies.
const dependencies = _lodash.default.isArray(result) && result.every(_lodash.default.isString) ? result : (0, _lodash.default)((0, _parser.default)(result)).map(node => detect(detectors, node, deps)).flatten().uniq().flatMap(_lodash.default.partial(applyImportsMap, importsMap)).map(_requirePackageName.default).thru(_dependencies => parser === _constants.availableParsers.typescript ?
// If this is a typescript file, importing foo would also use @types/foo, but
// only if @types/foo is already a specified dependency.

@@ -84,9 +134,5 @@ (0, _lodash.default)(_dependencies).map(dependency => {

}).flatten().value() : _dependencies).value();
const discover = _lodash.default.partial(discoverPropertyDep, dir, deps);
const discoverPeerDeps = _lodash.default.partial(discover, 'peerDependencies');
const discoverOptionalDeps = _lodash.default.partial(discover, 'optionalDependencies');
const peerDeps = (0, _lodash.default)(dependencies).map(discoverPeerDeps).flatten().value();

@@ -97,4 +143,10 @@ const optionalDeps = (0, _lodash.default)(dependencies).map(discoverOptionalDeps).flatten().value();

}
function checkFile(dir, filename, deps, parsers, detectors) {
function checkFile({
deps,
detectors,
dir,
filename,
importsMap,
parsers
}) {
(0, _debug.default)('depcheck:checkFile')(filename);

@@ -104,7 +156,13 @@ const targets = (0, _lodash.default)(parsers).keys().filter(glob => (0, _minimatch.default)(filename, glob, {

})).map(key => parsers[key]).flatten().value();
return targets.map(parser => getDependencies(dir, filename, deps, parser, detectors).then(using => {
return targets.map(parser => getDependencies({
deps,
detectors,
dir,
filename,
importsMap,
parser
}).then(using => {
if (using.length) {
(0, _debug.default)('depcheck:checkFile:using')(filename, parser, using);
}
return {

@@ -124,4 +182,11 @@ using: {

}
function checkDirectory(dir, rootDir, ignorer, deps, parsers, detectors) {
function checkDirectory({
dir,
rootDir,
ignorer,
importsMap,
deps,
parsers,
detectors
}) {
(0, _debug.default)('depcheck:checkDirectory')(dir);

@@ -135,3 +200,10 @@ return new Promise(resolve => {

finder.on('data', entry => {
promises.push(...checkFile(rootDir, entry.fullPath, deps, parsers, detectors));
promises.push(...checkFile({
deps,
detectors,
dir: rootDir,
filename: entry.fullPath,
importsMap,
parsers
}));
});

@@ -159,11 +231,24 @@ finder.on('warn', error => {

}
function buildResult(result, deps, devDeps, peerDeps, optionalDeps, skipMissing) {
const usingDepsLookup = (0, _lodash.default)(result.using) // { f1:[d1,d2,d3], f2:[d2,d3,d4] }
.toPairs() // [ [f1,[d1,d2,d3]], [f2,[d2,d3,d4]] ]
.map(([file, dep]) => [dep, _lodash.default.times(dep.length, () => file)]) // [ [ [d1,d2,d3],[f1,f1,f1] ], [ [d2,d3,d4],[f2,f2,f2] ] ]
.map(pairs => _lodash.default.zip(...pairs)) // [ [ [d1,f1],[d2,f1],[d3,f1] ], [ [d2,f2],[d3,f2],[d4,f2]] ]
.flatten() // [ [d1,f1], [d2,f1], [d3,f1], [d2,f2], [d3,f2], [d4,f2] ]
.groupBy(([dep]) => dep) // { d1:[ [d1,f1] ], d2:[ [d2,f1],[d2,f2] ], d3:[ [d3,f1],[d3,f2] ], d4:[ [d4,f2] ] }
.mapValues(pairs => pairs.map(_lodash.default.last)) // { d1:[ f1 ], d2:[ f1,f2 ], d3:[ f1,f2 ], d4:[ f2 ] }
function buildResult({
result,
deps,
devDeps,
peerDeps,
optionalDeps,
skipMissing
}) {
const usingDepsLookup = (0, _lodash.default)(result.using)
// { f1:[d1,d2,d3], f2:[d2,d3,d4] }
.toPairs()
// [ [f1,[d1,d2,d3]], [f2,[d2,d3,d4]] ]
.map(([file, dep]) => [dep, _lodash.default.times(dep.length, () => file)])
// [ [ [d1,d2,d3],[f1,f1,f1] ], [ [d2,d3,d4],[f2,f2,f2] ] ]
.map(pairs => _lodash.default.zip(...pairs))
// [ [ [d1,f1],[d2,f1],[d3,f1] ], [ [d2,f2],[d3,f2],[d4,f2]] ]
.flatten()
// [ [d1,f1], [d2,f1], [d3,f1], [d2,f2], [d3,f2], [d4,f2] ]
.groupBy(([dep]) => dep)
// { d1:[ [d1,f1] ], d2:[ [d2,f1],[d2,f2] ], d3:[ [d3,f1],[d3,f2] ], d4:[ [d4,f2] ] }
.mapValues(pairs => pairs.map(_lodash.default.last))
// { d1:[ f1 ], d2:[ f1,f2 ], d3:[ f1,f2 ], d4:[ f2 ] }
.value();

@@ -173,5 +258,3 @@ const usingDeps = Object.keys(usingDepsLookup);

const allDeps = deps.concat(devDeps).concat(peerDeps).concat(optionalDeps);
const missingDeps = _lodash.default.difference(usingDeps, allDeps);
return (0, _lodash.default)(missingDeps).map(missingDep => [missingDep, usingDepsLookup[missingDep]]).fromPairs().value();

@@ -188,6 +271,6 @@ })();

}
function check({
var _default = ({
rootDir,
ignorer,
importsMap,
skipMissing,

@@ -200,8 +283,22 @@ deps,

detectors
}) {
}) => {
const allDeps = _lodash.default.union(deps, devDeps);
return checkDirectory(rootDir, rootDir, ignorer, allDeps, parsers, detectors).then(result => buildResult(result, deps, devDeps, peerDeps, optionalDeps, skipMissing));
}
return checkDirectory({
dir: rootDir,
rootDir,
ignorer,
importsMap,
deps: allDeps,
parsers,
detectors
}).then(result => buildResult({
result,
deps,
devDeps,
peerDeps,
optionalDeps,
skipMissing
}));
};
exports.default = _default;
module.exports = exports.default;

@@ -7,21 +7,12 @@ "use strict";

exports.default = cli;
var _fs = _interopRequireDefault(require("fs"));
var _path = _interopRequireDefault(require("path"));
var _lodash = _interopRequireDefault(require("lodash"));
var _index = _interopRequireDefault(require("./index"));
var _package = require("../package.json");
var _configurationReader = require("./utils/configuration-reader");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function checkPathExist(dir, errorMessage) {
return new Promise((resolve, reject) => _fs.default.exists(dir, result => result ? resolve() : reject(errorMessage)));
}
function getParsers(parsers) {

@@ -31,3 +22,2 @@ if (!parsers) {

}
const parserTuples = Object.entries(parsers).map(([extension, parserNames]) => {

@@ -48,15 +38,11 @@ // parserNames might not be an array due to user error when creating a configuration file.

}
function getDetectors(detectors) {
return _lodash.default.isUndefined(detectors) ? undefined : detectors.map(detectorName => _index.default.detector[detectorName]);
}
function getSpecials(specials) {
return _lodash.default.isUndefined(specials) ? undefined : specials.map(specialName => _index.default.special[specialName]);
}
function noIssue(result) {
return _lodash.default.isEmpty(result.dependencies) && _lodash.default.isEmpty(result.devDependencies) && _lodash.default.isEmpty(result.missing);
}
function prettify(caption, deps, oneline) {

@@ -66,7 +52,5 @@ if (oneline) {

}
const list = deps.map(dep => `* ${dep}`);
return list.length ? [caption].concat(list) : [];
}
function mapMissing(missing, rootDir, oneline) {

@@ -76,6 +60,4 @@ if (oneline) {

}
return _lodash.default.map(missing, (foundInFiles, key) => `${key}: ${_lodash.default.replace(_lodash.default.first(foundInFiles), rootDir, '.')}`);
}
function print(result, log, opt, rootDir) {

@@ -85,3 +67,5 @@ if (opt.json) {

} else if (noIssue(result)) {
log('No depcheck issue');
if (!opt.quiet) {
log('No depcheck issue');
}
} else {

@@ -94,6 +78,4 @@ const deps = prettify('Unused dependencies', result.dependencies, opt.oneline);

}
return result;
}
async function cli(args, log, error, exit) {

@@ -103,5 +85,3 @@ try {

const dir = opt._[0] || '.';
const rootDir = _path.default.resolve(dir);
await checkPathExist(rootDir, `Path ${dir} does not exist`);

@@ -127,3 +107,2 @@ await checkPathExist(_path.default.resolve(rootDir, 'package.json'), `Path ${dir} does not contain a package.json file`);

}
module.exports = exports.default;

@@ -6,5 +6,8 @@ {

"es7",
"graphql",
"jsx",
"sass",
"storybook",
"svelte",
"tsconfig",
"typescript",

@@ -11,0 +14,0 @@ "vue"

@@ -6,12 +6,7 @@ "use strict";

});
exports.defaultOptions = exports.availableSpecials = exports.availableDetectors = exports.availableParsers = void 0;
exports.defaultOptions = exports.availableSpecials = exports.availableParsers = exports.availableDetectors = void 0;
var _path = _interopRequireDefault(require("path"));
var _lodash = _interopRequireDefault(require("lodash"));
var _component = _interopRequireDefault(require("./component.json"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function constructComponent(source, name) {

@@ -21,16 +16,16 @@ return (0, _lodash.default)(source[name]).map(file => [file, require(_path.default.resolve(__dirname, name, file)) // eslint-disable-line global-require

}
const availableParsers = constructComponent(_component.default, 'parser');
exports.availableParsers = availableParsers;
const availableDetectors = constructComponent(_component.default, 'detector');
exports.availableDetectors = availableDetectors;
const availableSpecials = constructComponent(_component.default, 'special');
exports.availableSpecials = availableSpecials;
const defaultOptions = {
const availableParsers = exports.availableParsers = constructComponent(_component.default, 'parser');
const availableDetectors = exports.availableDetectors = constructComponent(_component.default, 'detector');
const availableSpecials = exports.availableSpecials = constructComponent(_component.default, 'special');
const defaultOptions = exports.defaultOptions = {
ignoreBinPackage: false,
ignoreMatches: [],
ignorePatterns: ['.git', '.svn', '.hg', '.idea', 'node_modules', 'bower_components', // Images
'*.png', '*.gif', '*.jpg', '*.jpeg', '*.svg', // Fonts
'*.woff', '*.woff2', '*.eot', '*.ttf', // Archives
'*.zip', '*.gz', // Videos
ignorePatterns: ['.git', '.svn', '.hg', '.idea', 'node_modules', 'bower_components',
// Images
'*.png', '*.gif', '*.jpg', '*.jpeg', '*.svg',
// Fonts
'*.woff', '*.woff2', '*.eot', '*.ttf',
// Archives
'*.zip', '*.gz',
// Videos
'*.mp4'],

@@ -40,2 +35,4 @@ skipMissing: false,

'**/*.js': availableParsers.jsx,
'**/*.mjs': availableParsers.jsx,
'**/*.cjs': availableParsers.jsx,
'**/*.jsx': availableParsers.jsx,

@@ -45,2 +42,7 @@ '**/*.coffee': availableParsers.coffee,

'**/*.coffee.md': availableParsers.coffee,
'**/*.graphql': availableParsers.graphql,
'**/.storybook/main.js': availableParsers.storybook,
'**/tsconfig*.json': availableParsers.tsconfig,
'**/*.cts': availableParsers.typescript,
'**/*.mts': availableParsers.typescript,
'**/*.ts': availableParsers.typescript,

@@ -55,3 +57,2 @@ '**/*.tsx': availableParsers.typescript,

specials: _lodash.default.values(availableSpecials)
};
exports.defaultOptions = defaultOptions;
};

@@ -7,7 +7,5 @@ "use strict";

exports.default = detectExportDeclaration;
function detectExportDeclaration(node) {
return (node.type === 'ExportNamedDeclaration' || node.type === 'ExportAllDeclaration') && node.source && node.source.value ? [node.source.value] : [];
}
module.exports = exports.default;

@@ -7,11 +7,7 @@ "use strict";

exports.default = expressViewEngine;
var _lodash = _interopRequireDefault(require("lodash"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function expressViewEngine(node) {
return node.type === 'CallExpression' && node.callee && node.callee.property && node.callee.property.name === 'set' && node.arguments[0] && node.arguments[0].value === 'view engine' && node.arguments[1] && _lodash.default.isString(node.arguments[1].value) ? [node.arguments[1].value] : [];
}
module.exports = exports.default;

@@ -7,11 +7,9 @@ "use strict";

exports.extractInlineWebpack = extractInlineWebpack;
// Not fond of default exports, disable here */
/* eslint import/prefer-default-export: off */
function extractInlineWebpack(value) {
const parts = value.split('!');
if (parts.length === 1) {
return [value]; // ['module-name'] or ['path/to/file']
return /^https?:\/\//i.test(value) ? [] // ignore URLs (https://foo.bar/file.js)
: [value]; // ['module-name'] or ['path/to/file']
}

@@ -23,12 +21,9 @@

const loaderParts = parts[1].split('?');
if (loaderParts.length === 1) {
return parts;
}
return loaderParts[0];
} // ['something-loader', 'another-loader', 'path/to/file']
}
// ['something-loader', 'another-loader', 'path/to/file']
return parts;
}

@@ -7,7 +7,5 @@ "use strict";

exports.default = detectGruntLoadTaskCallExpression;
function detectGruntLoadTaskCallExpression(node) {
return node.type === 'CallExpression' && node.callee && node.callee.property && node.callee.property.name === 'loadNpmTasks' && node.arguments[0] ? [node.arguments[0].value] : [];
}
module.exports = exports.default;

@@ -7,11 +7,15 @@ "use strict";

exports.default = importCallExpression;
var _lodash = _interopRequireDefault(require("lodash"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function importCallExpression(node) {
return node.type === 'CallExpression' && node.callee && (node.callee.type === 'Identifier' && node.callee.name === 'import' || node.callee.type === 'Import' || node.callee.type === 'MemberExpression' && node.callee.object && node.callee.object.name === 'System' && node.callee.property && node.callee.property.name === 'import') && node.arguments[0] && _lodash.default.isString(node.arguments[0].value) ? [node.arguments[0].value] : [];
if (node.type === 'CallExpression' && node.callee && (node.callee.type === 'Identifier' && node.callee.name === 'import' || node.callee.type === 'Import' || node.callee.type === 'MemberExpression' && node.callee.object && node.callee.object.name === 'System' && node.callee.property && node.callee.property.name === 'import') && node.arguments[0]) {
if (_lodash.default.isString(node.arguments[0].value)) {
return [node.arguments[0].value];
}
if (node.arguments[0].type === 'TemplateLiteral' && node.arguments[0].quasis.length === 1 && _lodash.default.isString(node.arguments[0].quasis[0].value.raw)) {
return [node.arguments[0].quasis[0].value.raw];
}
}
return [];
}
module.exports = exports.default;

@@ -7,19 +7,15 @@ "use strict";

exports.default = detectImportDeclaration;
var _extract = require("./extract");
function detectImportDeclaration(node, deps) {
if (node.type !== 'ImportDeclaration' || !node.source || !node.source.value) {
return [];
} // Typescript "import type X from 'foo'" - doesn't need to depend on the
}
// TypeScript "import type X from 'foo'" - doesn't need to depend on the
// actual module, instead it can rely on `@types/<module>` instead.
if (node.importKind === 'type' && deps.includes(`@types/${node.source.value}`)) {
return [`@types/${node.source.value}`];
}
return (0, _extract.extractInlineWebpack)(node.source.value);
}
module.exports = exports.default;

@@ -7,5 +7,3 @@ "use strict";

exports.default = requireCallExpression;
var _extract = require("./extract");
function requireCallExpression(node) {

@@ -16,3 +14,2 @@ if (node.type === 'CallExpression' && node.callee && node.callee.type === 'Identifier' && node.callee.name === 'require' && node.arguments.length === 1) {

}
if (node.arguments[0].type === 'TemplateLiteral' && node.arguments[0].quasis.length === 1 && node.arguments[0].expressions.length === 0) {

@@ -22,6 +19,4 @@ return (0, _extract.extractInlineWebpack)(node.arguments[0].quasis[0].value.raw);

}
return [];
}
module.exports = exports.default;

@@ -7,11 +7,7 @@ "use strict";

exports.default = detectRequireCallExpression;
var _lodash = _interopRequireDefault(require("lodash"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function detectRequireCallExpression(node) {
return node.type === 'CallExpression' && node.callee && node.callee.type === 'MemberExpression' && node.callee.object && node.callee.object.name === 'require' && node.callee.property && node.callee.property.name === 'resolve' && node.arguments[0] && _lodash.default.isString(node.arguments[0].value) ? [node.arguments[0].value] : [];
}
module.exports = exports.default;

@@ -7,9 +7,6 @@ "use strict";

exports.default = detectTypescriptImportEqualsDeclaration;
var _extract = require("./extract");
function detectTypescriptImportEqualsDeclaration(node) {
return node.type === 'TSImportEqualsDeclaration' && node.moduleReference && node.moduleReference.expression ? (0, _extract.extractInlineWebpack)(node.moduleReference.expression.value) : [];
}
module.exports = exports.default;

@@ -7,7 +7,5 @@ "use strict";

exports.default = detectTypescriptImportType;
function detectTypescriptImportType(node) {
return node.type === 'TSImportType' && node.argument && node.argument.value ? [node.argument.value] : [];
}
module.exports = exports.default;

@@ -10,7 +10,5 @@ declare function depcheck(rootDir: string, options: depcheck.Options): Promise<depcheck.Results>;

declare namespace depcheck {
interface Node {
[key: string]: any;
}
type Node = Record<string, any>;
type Parser = (content: string, filePath: string, deps: ReadonlyArray<string>, rootDir: string) => Node;
type Parser = (filePath: string, deps: ReadonlyArray<string>, rootDir: string) => Node | string[];

@@ -77,5 +75,8 @@ type Detector = (node: Node) => ReadonlyArray<string> | string;

'es7': Parser;
'graphql': Parser;
'jsx': Parser;
'sass': Parser;
'storybook': Parser;
'svelte': Parser;
'tsconfig': Parser;
'typescript': Parser;

@@ -82,0 +83,0 @@ 'vue': Parser;

@@ -7,37 +7,24 @@ "use strict";

exports.default = depcheck;
var _fs = _interopRequireDefault(require("fs"));
var _path = _interopRequireDefault(require("path"));
var _lodash = _interopRequireDefault(require("lodash"));
var _multimatch = _interopRequireDefault(require("multimatch"));
var _ignore = _interopRequireDefault(require("ignore"));
var _debug = _interopRequireDefault(require("debug"));
var _check = _interopRequireDefault(require("./check"));
var _utils = require("./utils");
var _file = require("./utils/file");
var _constants = require("./constants");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
function registerTs(rootDir) {
if (!require.extensions['.ts']) {
const ts = (0, _utils.tryRequire)('typescript', [rootDir, process.cwd(), __dirname]);
if (ts) {
require.extensions['.ts'] = (module, filename) => {
const content = _fs.default.readFileSync(filename, 'utf8');
const options = (0, _utils.tryRequire)(_path.default.join(rootDir, 'package.json')) || {};
options.fileName = filename;
const transpiled = ts.transpileModule(content.charCodeAt(0) === 0xfeff ? content.slice(1) : content, options); // eslint-disable-next-line no-underscore-dangle
const transpiled = ts.transpileModule(content.charCodeAt(0) === 0xfeff ? content.slice(1) : content, options);
// eslint-disable-next-line no-underscore-dangle
module._compile(transpiled.outputText, filename);

@@ -48,7 +35,5 @@ };

}
function isIgnored(ignoreMatches, dependency) {
return Boolean((0, _multimatch.default)(dependency, ignoreMatches).length);
}
function hasBin(rootDir, dependency) {

@@ -60,7 +45,5 @@ const {

}
function filterDependencies(rootDir, ignoreBinPackage, ignoreMatches, dependencies) {
return (0, _lodash.default)(dependencies).keys().reject(dep => isIgnored(ignoreMatches, dep) || ignoreBinPackage && hasBin(rootDir, dep)).value();
}
function getIgnorer({

@@ -72,41 +55,33 @@ rootDir,

const ignorer = (0, _ignore.default)();
ignorer.add(ignorePatterns); // If an .*ignore file is configured
ignorer.add(ignorePatterns);
// If an .*ignore file is configured
if (ignorePath) {
const ignorePathFile = _path.default.resolve(rootDir, ignorePath);
if (_fs.default.existsSync(ignorePathFile)) {
(0, _debug.default)('depcheck:ignorer')(`Using ${ignorePathFile} as ignore file.`);
const ignorePathFileContent = _fs.default.readFileSync(ignorePathFile, 'utf8');
ignorer.add(ignorePathFileContent);
}
return ignorer;
} // Fallback on .depcheckignore or .gitignore
}
// Fallback on .depcheckignore or .gitignore
const ignoreFile = ['.depcheckignore', '.gitignore'].map(file => _path.default.resolve(rootDir, file)).find(file => _fs.default.existsSync(file));
if (ignoreFile) {
(0, _debug.default)('depcheck:ignorer')(`Using ${ignoreFile} as ignore file.`);
const ignoreContent = _fs.default.readFileSync(ignoreFile, 'utf8');
ignorer.add(ignoreContent);
}
return ignorer;
}
function depcheck(rootDir, options, callback) {
registerTs(rootDir);
const getOption = key => _lodash.default.isUndefined(options[key]) ? _constants.defaultOptions[key] : options[key];
const ignoreBinPackage = getOption('ignoreBinPackage');
const ignoreMatches = getOption('ignoreMatches');
const ignorePath = getOption('ignorePath');
const skipMissing = getOption('skipMissing'); // Support for ignoreDirs and ignorePatterns
const skipMissing = getOption('skipMissing');
// Support for ignoreDirs and ignorePatterns
// - potential BREAKING CHANGE with previous implementation

@@ -116,5 +91,3 @@ // - ignoreDirs was previously matching the exact name of a given directory

// - given the previous usage, should be mostly retro-compatible
const ignorePatterns = _lodash.default.union(_constants.defaultOptions.ignorePatterns, options.ignoreDirs, options.ignorePatterns);
const detectors = getOption('detectors');

@@ -131,2 +104,3 @@ const parsers = (0, _lodash.default)(getOption('parsers')).mapValues(value => _lodash.default.isArray(value) ? value : [value]).merge({

const devDeps = filterDependencies(rootDir, ignoreBinPackage, ignoreMatches, devDependencies);
const importsMap = metadata.imports || {};
const ignorer = getIgnorer({

@@ -140,2 +114,3 @@ rootDir,

ignorer,
importsMap,
skipMissing,

@@ -150,5 +125,4 @@ deps,

missing: _lodash.default.pick(results.missing, filterDependencies(rootDir, ignoreBinPackage, ignoreMatches, results.missing))
})).then(callback);
})).then(callback).finally(_file.clearContent);
}
depcheck.parser = _constants.availableParsers;

@@ -155,0 +129,0 @@ depcheck.detector = _constants.availableDetectors;

@@ -7,13 +7,8 @@ "use strict";

exports.default = parseCoffeeScript;
var _depsRegex = _interopRequireDefault(require("deps-regex"));
var _file = require("../utils/file");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const re = new _depsRegex.default({
matchES6: false
});
async function parseCoffeeScript(filename) {

@@ -23,3 +18,2 @@ const content = await (0, _file.getContent)(filename);

}
module.exports = exports.default;

@@ -7,7 +7,4 @@ "use strict";

exports.default = parseES6;
var _parser = require("@babel/parser");
var _file = require("../utils/file");
async function parseES6(filename) {

@@ -19,3 +16,2 @@ const content = await (0, _file.getContent)(filename);

}
module.exports = exports.default;

@@ -6,9 +6,6 @@ "use strict";

});
exports.default = parseES7;
exports.parseES7Content = parseES7Content;
exports.default = parseES7;
var _parser = require("@babel/parser");
var _file = require("../utils/file");
function parseES7Content(content) {

@@ -20,3 +17,4 @@ return (0, _parser.parse)(content, {

// note that babel/parser 7+ does not support *, due to plugin incompatibilities
plugins: ['asyncGenerators', 'bigInt', 'classProperties', 'classPrivateProperties', 'classPrivateMethods', // ['decorators', { decoratorsBeforeExport: true }],
plugins: ['asyncGenerators', 'bigInt', 'classProperties', 'classPrivateProperties', 'classPrivateMethods',
// ['decorators', { decoratorsBeforeExport: true }],
'decorators-legacy', 'doExpressions', 'dynamicImport', 'exportDefaultFrom', 'exportNamespaceFrom', 'flow', 'flowComments', 'functionBind', 'functionSent', 'importMeta', 'logicalAssignment', 'nullishCoalescingOperator', 'numericSeparator', 'objectRestSpread', 'optionalCatchBinding', 'optionalChaining', ['pipelineOperator', {

@@ -27,3 +25,2 @@ proposal: 'minimal'

}
async function parseES7(filename) {

@@ -30,0 +27,0 @@ const content = await (0, _file.getContent)(filename);

@@ -7,7 +7,4 @@ "use strict";

exports.default = parseJSX;
var _parser = require("@babel/parser");
var _file = require("../utils/file");
async function parseJSX(filename) {

@@ -23,10 +20,11 @@ const content = await (0, _file.getContent)(filename);

decoratorsBeforeExport: true
}], // not decorators-legacy
}],
// not decorators-legacy
'doExpressions', 'dynamicImport', 'exportDefaultFrom', 'exportNamespaceFrom', 'flow', 'flowComments', 'functionBind', 'functionSent', 'importMeta', 'logicalAssignment', 'nullishCoalescingOperator', 'numericSeparator', 'objectRestSpread', 'optionalCatchBinding', 'optionalChaining', ['pipelineOperator', {
proposal: 'minimal'
}], 'throwExpressions', // and finally, jsx
}], 'throwExpressions',
// and finally, jsx
'jsx']
});
}
module.exports = exports.default;

@@ -7,112 +7,40 @@ "use strict";

exports.default = parseSASS;
var _path = _interopRequireDefault(require("path"));
var _fs = _interopRequireDefault(require("fs"));
var _lodash = _interopRequireDefault(require("lodash"));
var _path = _interopRequireDefault(require("path"));
var _requirePackageName = _interopRequireDefault(require("require-package-name"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const importModuleRegex = /@(?:use|import|forward)\s+['"]([^'"]+)['"]/gm;
// Paths prefixed with "~" or "node_modules/" are both considered paths to external deps in node_modules
const nodeModulePrefixRegex = /^~|^(?:\.[\\/])?node_modules[\\/]/;
const {
parse
} = require('scss-parser');
const createQueryWrapper = require('query-ast');
const sass = require('sass');
const IMPORT_RULE_TYPE = 'atrule';
const IMPORT_KEYWORDS = ['import', 'use', 'forward'];
function unixSlashes(packagePath) {
return packagePath.replace(/\\/g, '/');
} // TODO::remove stuff after ':'
function removeNodeModulesOrTildaFromPath(packagePath) {
let suspectedFileName = packagePath; // remove ':'
const colonsIndex = packagePath.indexOf(':');
if (colonsIndex > 1) {
suspectedFileName = suspectedFileName.substring(0, colonsIndex);
} // remove 'node_modules/'
const nodeModulesIndex = suspectedFileName.indexOf('node_modules/');
if (nodeModulesIndex > -1) {
return suspectedFileName.substring(nodeModulesIndex + 'node_modules/'.length);
} // remove '~'
if (suspectedFileName.indexOf(`~`) === 0) {
return suspectedFileName.substring(1);
}
return suspectedFileName;
}
function isLocalFile(filePath, folderName) {
if (filePath[0] === '_') {
/**
* Sass allows omitting different parts of file path when importing files from relative paths:
* - relative path prefix can be omitted "./" (Sass tries to import from current file directory first)
* - underscore "_" prefix of partials can be omitted (https://sass-lang.com/guide/#partials)
* - sass/scss file extension can be omitted
* Reference: https://sass-lang.com/documentation/at-rules/import/#finding-the-file
* This filter checks for existence of a file on every possible relative path and then filters those out.
*/
function isModuleOnRelativePath(filename, importPath) {
if (importPath.startsWith('./') || importPath.startsWith('../')) {
return true;
}
if (filePath[0] === '@') {
return false;
}
return _fs.default.existsSync(_path.default.join(folderName, `${filePath}.scss`));
const basePath = _path.default.dirname(filename);
const extension = _path.default.extname(filename);
const pathWithExtension = _path.default.extname(importPath) !== '' ? importPath : importPath + extension;
const pathWithUnderscorePrefix = _path.default.join(_path.default.dirname(pathWithExtension), `_${_path.default.basename(pathWithExtension)}`);
const possiblePaths = [_path.default.join(basePath, pathWithExtension), _path.default.join(basePath, pathWithUnderscorePrefix)];
return possiblePaths.some(modulePath => _fs.default.existsSync(modulePath));
}
function parseSCSS(filename) {
const folderName = _path.default.dirname(filename);
const fileContents = _fs.default.readFileSync(filename).toString();
const ast = parse(fileContents);
const queryWrapper = createQueryWrapper(ast);
const imports = queryWrapper(IMPORT_RULE_TYPE).nodes.filter(node => IMPORT_KEYWORDS.includes(node.children[0].node.value)).map(node => node.children[2].node.value);
const result = (0, _lodash.default)(imports).filter(packagePath => packagePath !== filename).map(unixSlashes).map(removeNodeModulesOrTildaFromPath).map(_requirePackageName.default).uniq().filter(filePath => !isLocalFile(filePath, folderName)).filter(x => x).value();
return result;
}
async function parseSASS(filename) {
const isScss = _path.default.extname(filename) === '.scss';
const sassString = _fs.default.readFileSync(filename).toString();
if (isScss) {
return parseSCSS(filename);
}
const includedFiles = [];
let sassDetails = {};
try {
// sass processor does not respect the custom importer
sassDetails = sass.renderSync({
file: filename,
includePaths: [_path.default.dirname(filename)],
importer: [function importer(url) {
includedFiles.push(url);
return {
contents: `
h1 {
font-size: 40px;
}`
};
}]
});
} catch (e) {
sassDetails.stats = {
includedFiles
};
}
const result = (0, _lodash.default)(sassDetails.stats.includedFiles).filter(packagePath => packagePath !== filename).map(unixSlashes).map(removeNodeModulesOrTildaFromPath).map(_requirePackageName.default).uniq().filter(x => x).value();
return result;
// https://sass-lang.com/documentation/at-rules/import/#load-paths
const deps = Array.from(sassString.matchAll(importModuleRegex))
// Pick the matched group
.map(([, match]) => match.startsWith('sass:') ? 'sass' // Add 'sass' dependency for built-in modules
: match.replace(nodeModulePrefixRegex, '')).filter(importPath => !isModuleOnRelativePath(filename, importPath)).map(_requirePackageName.default);
return _lodash.default.uniq(deps);
}
module.exports = exports.default;

@@ -7,11 +7,6 @@ "use strict";

exports.default = parseSvelte;
var _parser = require("@babel/parser");
var _file = require("../utils/file");
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
async function parseSvelte(filename) {

@@ -29,3 +24,2 @@ const {

}
module.exports = exports.default;

@@ -7,23 +7,18 @@ "use strict";

exports.default = parseTypescript;
var _parser = require("@babel/parser");
var _file = require("../utils/file");
async function parseTypescript(filename) {
const content = await (0, _file.getContent)(filename); // Enable all known compatible @babel/parser plugins at the time of writing.
const content = await (0, _file.getContent)(filename);
// Enable all known compatible @babel/parser plugins at the time of writing.
// Because we only parse them, not evaluate any code, it is safe to do so.
// note that babel/parser 7+ does not support *, due to plugin incompatibilities
return (0, _parser.parse)(content, {
sourceType: 'module',
plugins: ['typescript', 'jsx', 'asyncGenerators', 'bigInt', 'classProperties', 'classPrivateProperties', 'classPrivateMethods', // { decorators: { decoratorsBeforeExport: true } },
'decorators-legacy', 'doExpressions', 'dynamicImport', 'exportDefaultFrom', 'exportNamespaceFrom', 'functionBind', 'functionSent', 'importMeta', 'logicalAssignment', 'nullishCoalescingOperator', 'numericSeparator', 'objectRestSpread', 'optionalCatchBinding', 'optionalChaining', {
pipelineOperator: {
proposal: 'minimal'
}
}, 'throwExpressions']
plugins: ['typescript', 'jsx', 'asyncGenerators', 'bigInt', 'classProperties', 'classPrivateProperties', 'classPrivateMethods',
// ['decorators', { decoratorsBeforeExport: true }],
'decorators-legacy', 'doExpressions', 'dynamicImport', 'exportDefaultFrom', 'exportNamespaceFrom', 'functionBind', 'functionSent', 'importMeta', 'logicalAssignment', 'nullishCoalescingOperator', 'numericSeparator', 'objectRestSpread', 'optionalCatchBinding', 'optionalChaining', ['pipelineOperator', {
proposal: 'minimal'
}], 'throwExpressions', 'importAssertions', 'explicitResourceManagement']
});
}
module.exports = exports.default;

@@ -7,18 +7,19 @@ "use strict";

exports.default = parseVue;
var _parser = require("@babel/parser");
var _compilerSfc = require("@vue/compiler-sfc");
var _file = require("../utils/file");
async function parseVue(filename) {
const content = await (0, _file.getContent)(filename);
const parsed = (0, _compilerSfc.parse)(content);
if (!parsed.descriptor.script) {
if (!parsed.descriptor.script && !parsed.descriptor.scriptSetup) {
return [];
}
return (0, _parser.parse)(parsed.descriptor.script.content, {
let script = '';
if (parsed.descriptor.script) {
script += parsed.descriptor.script.content;
}
if (parsed.descriptor.scriptSetup) {
script += parsed.descriptor.scriptSetup.content;
}
return (0, _parser.parse)(script, {
sourceType: 'module',

@@ -29,11 +30,13 @@ // Enable all known compatible @babel/parser plugins at the time of writing.

// Because the guys using React always want the newest syntax.
plugins: ['asyncGenerators', 'bigInt', 'classProperties', 'classPrivateProperties', 'classPrivateMethods', // ['decorators', { decoratorsBeforeExport: true }],
'decorators-legacy', // Vue cannot support both decorators
plugins: ['typescript', 'asyncGenerators', 'bigInt', 'classProperties', 'classPrivateProperties', 'classPrivateMethods',
// ['decorators', { decoratorsBeforeExport: true }],
'decorators-legacy',
// Vue cannot support both decorators
'doExpressions', 'dynamicImport', 'exportDefaultFrom', 'exportNamespaceFrom', 'functionBind', 'functionSent', 'importMeta', 'logicalAssignment', 'nullishCoalescingOperator', 'numericSeparator', 'objectRestSpread', 'optionalCatchBinding', 'optionalChaining', ['pipelineOperator', {
proposal: 'minimal'
}], 'throwExpressions', // and finally, jsx
}], 'throwExpressions',
// and finally, jsx
'jsx']
});
}
module.exports = exports.default;

@@ -7,13 +7,8 @@ "use strict";

exports.default = parseBabel;
var _path = _interopRequireDefault(require("path"));
var _lodash = _interopRequireDefault(require("lodash"));
var _cliTools = require("../utils/cli-tools");
var _file = require("../utils/file");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
function parse(content) {

@@ -30,17 +25,22 @@ try {

}
function contain(array, dep, prefix, scope) {
function contain(array, dep, prefix, babelScope) {
if (!array) {
return false;
} // extract name if wrapping with options
}
// extract name if wrapping with options
const names = array.map(item => _lodash.default.isString(item) ? item : item[0]);
if (names.indexOf(dep) !== -1) {
if (names.some(name => name.startsWith(dep))) {
return true;
}
// Parse a valid scope from dep if babelScope not defined
const scopeMatch = dep.match(/^@[\w-]+/);
const scope = babelScope !== null && babelScope !== void 0 ? babelScope : scopeMatch && scopeMatch.at(0);
const fullPrefix = scope ? `${scope}/${prefix}` : prefix;
// Support scoped plugin/preset with default name, e.g. preset with name '@scope' uses '@scope/babel-preset' dep
if (fullPrefix && fullPrefix.endsWith('-') && dep === fullPrefix.slice(0, -1)) {
return true;
}
if (prefix && dep.indexOf(fullPrefix) === 0) {

@@ -50,6 +50,4 @@ const identifier = dep.substring(fullPrefix.length);

}
return false;
}
function getReactTransforms(deps, plugins) {

@@ -61,3 +59,2 @@ const transforms = (0, _lodash.default)(plugins || []).filter(plugin => isPlugin(plugin, 'react-transform')).map(([, plugin]) => plugin.transforms.map(({

}
function filter(deps, options) {

@@ -71,3 +68,2 @@ const presets = deps.filter(dep => contain(options.presets, dep, 'babel-preset-'));

}
function checkOptions(deps, options = {}) {

@@ -78,12 +74,29 @@ const optDeps = filter(deps, options);

}
const regex = /^(\.babelrc(\.(cjs|js(on)?))?|babel\.config\.(cjs|js(on)?))?$/;
function callConfigIfFunction(config) {
if (typeof config === 'function') {
return config({
cache: _extends(() => null, {
forever() {},
never() {},
using() {},
invalidate() {}
}),
caller(cb) {
cb({
name: 'depcheck'
});
},
env() {
return true;
}
});
}
return config;
}
async function parseBabel(filename, deps, rootDir) {
const config = await (0, _cliTools.loadConfig)('babel', regex, filename, rootDir);
if (config) {
return checkOptions(deps, config);
return checkOptions(deps, callConfigIfFunction(config));
}
if (_path.default.basename(filename) === 'package.json') {

@@ -94,6 +107,4 @@ const content = await (0, _file.getContent)(filename);

}
return [];
}
module.exports = exports.default;

@@ -7,16 +7,9 @@ "use strict";

exports.default = parseBinary;
var _path = _interopRequireDefault(require("path"));
var _lodash = _interopRequireDefault(require("lodash"));
var _utils = require("../utils");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const binaryCache = {};
function getCacheOrLoad(dep, dir) {
const index = `${dir}/${dep}`;
if (!binaryCache[index]) {

@@ -26,23 +19,18 @@ const metadata = (0, _utils.loadModuleData)(dep, dir).metadata || {};

}
return binaryCache[index];
}
function getBinaries(dep, dir) {
const binMetadata = getCacheOrLoad(dep, dir);
if (typeof binMetadata === 'string') {
return [[dep, binMetadata]];
// Use path.basename to discard any scope
// e.g. a package named "@foo/bar" creates a command named "bar"
return [[_path.default.basename(dep), binMetadata]];
}
return _lodash.default.toPairs(binMetadata);
}
function getBinaryFeatures(dep, [key, value]) {
const binPath = _path.default.join('node_modules', dep, value).replace(/\\/g, '/');
const features = [key, `--require ${key}`, `--require ${key}/register`, `-r ${key}`, `-r ${key}/register`, `$(npm bin)/${key}`, `node_modules/.bin/${key}`, `./node_modules/.bin/${key}`, binPath, `./${binPath}`];
return features;
}
function isBinaryInUse(dep, scripts, dir) {

@@ -52,3 +40,2 @@ const binaries = getBinaries(dep, dir);

}
async function parseBinary(filename, deps, dir) {

@@ -58,3 +45,2 @@ const scripts = await (0, _utils.getScripts)(filename);

}
module.exports = exports.default;

@@ -7,29 +7,18 @@ "use strict";

exports.default = parseCommitizen;
var _path = _interopRequireDefault(require("path"));
var _requirePackageName = _interopRequireDefault(require("require-package-name"));
var _file = require("../utils/file");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
async function parseCommitizen(filename, deps, rootDir) {
const packageJsonPath = _path.default.resolve(rootDir, 'package.json');
const resolvedFilePath = _path.default.resolve(filename);
if (resolvedFilePath === packageJsonPath) {
const content = await (0, _file.getContent)(filename);
const metadata = JSON.parse(content);
if (metadata.config && metadata.config.commitizen && metadata.config.commitizen.path) {
const commitizenPath = metadata.config.commitizen.path;
if (!commitizenPath.startsWith('.')) {
return [(0, _requirePackageName.default)(commitizenPath)];
}
const normalizedPath = _path.default.normalize(commitizenPath).replace(/\\/g, '/');
if (!normalizedPath.startsWith('node_modules')) {

@@ -39,3 +28,2 @@ // The path is not refering to a file in another module

}
const packagePath = normalizedPath.substring('node_modules/'.length);

@@ -45,6 +33,4 @@ return [(0, _requirePackageName.default)(packagePath)];

}
return [];
}
module.exports = exports.default;

@@ -7,25 +7,15 @@ "use strict";

exports.default = parseESLint;
var _path = _interopRequireDefault(require("path"));
var _lodash = _interopRequireDefault(require("lodash"));
var _requirePackageName = _interopRequireDefault(require("require-package-name"));
var _utils = require("../utils");
var _cliTools = require("../utils/cli-tools");
var _file = require("../utils/file");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function resolveConfigModule(preset, rootDir) {
const presetParts = preset.split('/');
let moduleName = presetParts.shift();
if (moduleName.startsWith('@')) {
moduleName += `/${presetParts.shift()}`;
}
const moduleData = (0, _utils.loadModuleData)(moduleName, rootDir);

@@ -35,6 +25,4 @@ const includedDeps = moduleData.metadata && moduleData.metadata.dependencies && typeof moduleData.metadata.dependencies === 'object' ? Object.keys(moduleData.metadata.dependencies) : [];

}
function requireConfig(preset, rootDir) {
const [presetPath, includedDeps] = _path.default.isAbsolute(preset) ? [preset, []] : resolveConfigModule(preset, rootDir);
try {

@@ -46,2 +34,3 @@ return [require(presetPath), includedDeps]; // eslint-disable-line global-require

}
/**

@@ -55,8 +44,6 @@ * Brings package name to correct format based on prefix

*/
function normalizePackageName(name, prefix) {
let normalizedName = name;
const convertPathToPosix = p => _path.default.normalize(p).replace(/\\/g, '/');
const convertPathToPosix = p => _path.default.normalize(p).replace(/\\/g, '/');
/**

@@ -67,8 +54,5 @@ * On Windows, name can come in with Windows slashes instead of Unix slashes.

*/
if (normalizedName.indexOf('\\') > -1) {
normalizedName = convertPathToPosix(normalizedName);
}
if (normalizedName.charAt(0) === '@') {

@@ -81,3 +65,2 @@ /**

const scopedPackageNameRegex = new RegExp(`^${prefix}(-|$)`);
if (scopedPackageShortcutRegex.test(normalizedName)) {

@@ -95,6 +78,4 @@ normalizedName = normalizedName.replace(scopedPackageShortcutRegex, `$1/${prefix}`);

}
return normalizedName;
}
function resolvePresetPackage(preset, rootDir) {

@@ -105,7 +86,5 @@ // inspired from https://github.com/eslint/eslint/blob/5b4a94e26d0ef247fe222dacab5749805d9780dd/lib/config/config-file.js#L347

}
if (preset.startsWith('./') || preset.startsWith('../')) {
return _path.default.resolve(rootDir, preset);
}
if (preset.startsWith('plugin:')) {

@@ -115,28 +94,22 @@ const pluginName = preset.slice(7, preset.lastIndexOf('/'));

}
return normalizePackageName(preset, 'eslint-config');
}
function checkConfig(config, rootDir, includedDeps = []) {
const configs = [config];
if (config.overrides) {
configs.push(...config.overrides);
}
const plugins = (0, _lodash.default)(configs).map(value => (0, _utils.wrapToArray)(value.plugins)).flatten().map(plugin => normalizePackageName(plugin, 'eslint-plugin')).value();
const parser = (0, _lodash.default)(configs).map(value => (0, _utils.wrapToArray)(value.parser)).flatten().value();
const extendsArray = (0, _lodash.default)(configs).map(value => (0, _utils.wrapToArray)(value.extends)).flatten().value();
const presets = extendsArray.filter(preset => !['eslint:recommended', 'eslint:all'].includes(preset)).map(preset => resolvePresetPackage(preset, rootDir)); // prettier/recommended extends eslint-config-prettier
const presets = extendsArray.filter(preset => !['eslint:recommended', 'eslint:all'].includes(preset)).map(preset => resolvePresetPackage(preset, rootDir));
// prettier/recommended extends eslint-config-prettier
// https://github.com/prettier/eslint-plugin-prettier#recommended-configuration
if (extendsArray.includes('plugin:prettier/recommended')) {
presets.push('eslint-config-prettier');
}
const presetPackages = presets.filter(preset => !_path.default.isAbsolute(preset)).map(_requirePackageName.default);
const presetDeps = (0, _lodash.default)(presets).map(preset => requireConfig(preset, rootDir)).map(([presetConfig, deps]) => checkConfig(presetConfig, rootDir, deps)).flatten().value();
const result = _lodash.default.union(parser, plugins, presetPackages, presetDeps).filter(dep => !includedDeps.includes(dep));
configs.forEach(value => {

@@ -148,3 +121,2 @@ if (value.settings) {

}
Object.keys(value.settings[key]).forEach(resolverName => {

@@ -161,20 +133,13 @@ // node and webpack resolvers are included in `eslint-plugin-import`

}
const configNameRegex = /^\.eslintrc(\.(json|js|cjs|yml|yaml))?$/;
async function parseESLint(filename, deps, rootDir) {
const config = await (0, _cliTools.loadConfig)('eslint', configNameRegex, filename, rootDir);
if (config) {
return checkConfig(config, rootDir);
}
const packageJsonPath = _path.default.resolve(rootDir, 'package.json');
const resolvedFilePath = _path.default.resolve(rootDir, filename);
if (resolvedFilePath === packageJsonPath) {
const content = await (0, _file.getContent)(filename);
const parsed = JSON.parse(content);
if (parsed.eslintConfig) {

@@ -184,6 +149,4 @@ return checkConfig(parsed.eslintConfig, rootDir);

}
return [];
}
module.exports = exports.default;

@@ -7,14 +7,8 @@ "use strict";

exports.default = parseFerossStandard;
var _path = _interopRequireDefault(require("path"));
var _file = require("../utils/file");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
async function parseFerossStandard(filename, deps, rootDir) {
const packageJsonPath = _path.default.resolve(rootDir, 'package.json');
const resolvedFilePath = _path.default.resolve(filename);
if (resolvedFilePath === packageJsonPath && deps.indexOf('standard') !== -1) {

@@ -29,6 +23,4 @@ const content = await (0, _file.getContent)(filename);

}
return [];
}
module.exports = exports.default;

@@ -7,15 +7,8 @@ "use strict";

exports.default = parseGatsbyConfig;
var _path = _interopRequireDefault(require("path"));
var _lodash = _interopRequireDefault(require("lodash"));
var _es = require("../parser/es7");
var _parser = _interopRequireDefault(require("../utils/parser"));
var _file = require("../utils/file");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function findStringPlugins(pluginElementsArray) {

@@ -27,3 +20,2 @@ return pluginElementsArray.filter(e => e.type === 'StringLiteral' || e.type === 'TemplateLiteral').map(e => {

}
function findResolvePlugins(pluginElementsArray) {

@@ -35,8 +27,7 @@ return pluginElementsArray.filter(e => e.type === 'ObjectExpression').map(e => e.properties).reduce((acc, props) => acc.concat(props), []).filter(resolvePropCandidate => (resolvePropCandidate.key.name === 'resolve' || resolvePropCandidate.key.value === 'resolve') && resolvePropCandidate.value && (resolvePropCandidate.value.type === 'StringLiteral' || resolvePropCandidate.value.type === 'TemplateLiteral')).map(resolveProp => {

}
function findNestedPlugins(pluginElementsArray) {
return pluginElementsArray.filter(e => e.type === 'ObjectExpression').map(e => e.properties).reduce((acc, props) => acc.concat(props), []).filter(optionsPropCandidate => optionsPropCandidate && optionsPropCandidate.key && (optionsPropCandidate.key.name === 'options' || optionsPropCandidate.key.value === 'options') && optionsPropCandidate.value && optionsPropCandidate.value.type === 'ObjectExpression') // eslint-disable-next-line no-use-before-define
return pluginElementsArray.filter(e => e.type === 'ObjectExpression').map(e => e.properties).reduce((acc, props) => acc.concat(props), []).filter(optionsPropCandidate => optionsPropCandidate && optionsPropCandidate.key && (optionsPropCandidate.key.name === 'options' || optionsPropCandidate.key.value === 'options') && optionsPropCandidate.value && optionsPropCandidate.value.type === 'ObjectExpression')
// eslint-disable-next-line no-use-before-define
.map(optionsNode => findPluginsInObjectExpression(optionsNode.value)).reduce((deps, dep) => deps.concat(dep), []);
}
function findPluginsInObjectExpression(node) {

@@ -55,2 +46,3 @@ const dependencies = [];

}
/**

@@ -62,4 +54,2 @@ *

*/
function parseConfigModuleExports(node) {

@@ -73,6 +63,4 @@ // node.left must be assigning to module.exports

}
return null;
}
async function parseConfig(content) {

@@ -82,8 +70,5 @@ const ast = (0, _es.parseES7Content)(content);

}
async function parseGatsbyConfig(filename) {
const basename = _path.default.basename(filename);
const GatbyConfig = 'gatsby-config.js';
if (GatbyConfig === basename) {

@@ -94,6 +79,4 @@ const content = await (0, _file.getContent)(filename);

}
return [];
}
module.exports = exports.default;

@@ -7,21 +7,11 @@ "use strict";

exports.default = parseGulpPlugins;
var _path = require("path");
var _lodash = _interopRequireDefault(require("lodash"));
var _minimatch = _interopRequireDefault(require("minimatch"));
var _traverse = _interopRequireDefault(require("@babel/traverse"));
var _es = require("../parser/es7");
var _importDeclaration = _interopRequireDefault(require("../detector/importDeclaration"));
var _requireCallExpression = _interopRequireDefault(require("../detector/requireCallExpression"));
var _file = require("../utils/file");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function getPluginLookup(deps) {

@@ -34,5 +24,3 @@ const patterns = ['gulp-*', 'gulp.*', '@*/gulp{-,.}*'];

const plugin = isScoped ? scopedParts[1] : dep;
const variableName = _lodash.default.camelCase(plugin.substring('gulp-'.length));
const memberName = isScoped ? `.${scope}.${variableName}` : `.${variableName}`;

@@ -43,2 +31,3 @@ return [memberName, dep];

}
/**

@@ -48,4 +37,2 @@ * Get the references to the variable in the path scope.

*/
function getReferences(path, variableName) {

@@ -56,2 +43,3 @@ const bindings = path.scope.getBinding(variableName);

}
/**

@@ -61,4 +49,2 @@ * Get the variable name from the variable assigned declaration.

*/
function getIdentifierVariableName(path) {

@@ -69,5 +55,5 @@ if (path.isIdentifier() && path.parentPath.isCallExpression() && path.parentPath.parentPath.isVariableDeclarator()) {

}
return '';
}
/**

@@ -77,4 +63,2 @@ * Get the identifier references from imported/required load-plugin variable name.

*/
function getIdentifierReferences(path, loadPluginsVariableName) {

@@ -85,2 +69,3 @@ const requireReferences = getReferences(path, loadPluginsVariableName);

}
/**

@@ -90,27 +75,21 @@ * Get the package name from the identifier call path.

*/
function getPackageName(content, pluginLookup, identifierPath) {
let memberPath = identifierPath.parentPath;
while (memberPath.isMemberExpression()) {
const code = content.slice(identifierPath.node.end, memberPath.node.end);
const pluginName = pluginLookup[code];
if (pluginName) {
return pluginName;
}
memberPath = memberPath.parentPath;
}
return '';
}
/**
* Get the gulp packages found from the path. This is the entry for traverse.
*/
function check(content, deps, path) {
if ( // Pattern: import plugins from 'gulp-load-plugins', $ = plugins(), $.jshint()
if (
// Pattern: import plugins from 'gulp-load-plugins', $ = plugins(), $.jshint()
(0, _importDeclaration.default)(path.node)[0] === 'gulp-load-plugins' && path.isImportDeclaration() && path.get('specifiers')[0] && path.get('specifiers')[0].isImportDefaultSpecifier() && path.get('specifiers')[0].get('local').isIdentifier()) {

@@ -122,4 +101,4 @@ const importVariableName = path.get('specifiers')[0].get('local').node.name;

}
if ( // Pattern: plugins = require('gulp-load-plugins'), $ = plugins(), $.jshint()
if (
// Pattern: plugins = require('gulp-load-plugins'), $ = plugins(), $.jshint()
(0, _requireCallExpression.default)(path.node)[0] === 'gulp-load-plugins' && path.isCallExpression() && path.parentPath.isVariableDeclarator() && path.parentPath.get('id').isIdentifier()) {

@@ -131,4 +110,4 @@ const requireVariableName = path.parentPath.get('id').node.name;

}
if ( // Pattern: $ = require('gulp-load-plugins')(), $.jshint()
if (
// Pattern: $ = require('gulp-load-plugins')(), $.jshint()
(0, _requireCallExpression.default)(path.node)[0] === 'gulp-load-plugins' && path.isCallExpression() && path.parentPath.isCallExpression() && path.parentPath.parentPath.isVariableDeclarator() && path.parentPath.parentPath.get('id').isIdentifier()) {

@@ -140,4 +119,4 @@ const requireVariableName = path.parentPath.parentPath.get('id').node.name;

}
if ( // Pattern: require('gulp-load-plugins')().thisPlugin()
if (
// Pattern: require('gulp-load-plugins')().thisPlugin()
(0, _requireCallExpression.default)(path.node)[0] === 'gulp-load-plugins' && path.isCallExpression() && path.parentPath.isCallExpression() && path.parentPath.parentPath.isMemberExpression()) {

@@ -147,13 +126,9 @@ const packageName = getPackageName(content, deps, path.parentPath);

}
return [];
}
async function parseGulpPlugins(filename, deps, rootDir) {
const resolvedPath = (0, _path.resolve)(filename);
if (resolvedPath !== (0, _path.resolve)(rootDir, 'gulpfile.js') && resolvedPath !== (0, _path.resolve)(rootDir, 'gulpfile.babel.js')) {
return [];
}
const pluginLookup = getPluginLookup(deps);

@@ -167,7 +142,5 @@ const content = await (0, _file.getContent)(filename);

}
});
return (0, _lodash.default)(results).filter().uniq().value();
}
module.exports = exports.default;

@@ -7,14 +7,8 @@ "use strict";

exports.default = parseHusky;
var path = _interopRequireWildcard(require("path"));
var _file = require("../utils/file");
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
async function parseHusky(filename) {
const basename = path.basename(filename);
if (basename === 'package.json') {

@@ -25,6 +19,4 @@ const content = await (0, _file.getContent)(filename);

}
return [];
}
module.exports = exports.default;

@@ -7,16 +7,9 @@ "use strict";

exports.default = parseIstanbul;
var _path = _interopRequireDefault(require("path"));
var _cliTools = require("../utils/cli-tools");
var _file = require("../utils/file");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const configNameRegex = /^(\.nycrc(\.(json|yml|yaml))?|nyc.config.js)$/;
function getExtendsDependencies(extendConfig, deps) {
const dependencies = [];
if (Array.isArray(extendConfig)) {

@@ -27,7 +20,5 @@ extendConfig.forEach(extend => dependencies.push(...getExtendsDependencies(extend, deps)));

let depName = extendParts.shift();
if (depName.startsWith('@')) {
depName += `/${extendParts.shift()}`;
}
if (deps.includes(depName)) {

@@ -37,11 +28,7 @@ dependencies.push(depName);

}
return dependencies;
}
async function parseIstanbul(filename, deps) {
const basename = _path.default.basename(filename);
let config;
if (configNameRegex.test(basename)) {

@@ -54,12 +41,8 @@ const content = await (0, _file.getContent)(filename);

}
const requires = [];
if (config && config.extends) {
requires.push(...getExtendsDependencies(config.extends, deps));
}
return requires;
}
module.exports = exports.default;

@@ -7,15 +7,9 @@ "use strict";

exports.default = parseJest;
var _path = _interopRequireDefault(require("path"));
var _lodash = _interopRequireDefault(require("lodash"));
var _file = require("../utils/file");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const _ = _lodash.default;
const jestConfigRegex = /^jest.([^.]+\.)?conf(ig|).js(on|)$/;
const jestConfigRegex = /^jest.([^.]+\.)?conf(ig|)\.(cjs|mjs|js|json|ts)$/;
const supportedProperties = ['dependencyExtractor', 'preset', 'prettierPath', 'reporters', 'runner', 'setupFiles', 'setupFilesAfterEnv', 'snapshotResolver', 'snapshotSerializers', 'testEnvironment', 'testResultsProcessor', 'testRunner', 'transform', 'watchPlugins'];
function parse(content) {

@@ -33,21 +27,16 @@ try {

}
if (typeof array === 'string') {
return contain([array], dep, prefix);
} // extract name if wrapping with options
}
// extract name if wrapping with options
const names = array.map(item => _lodash.default.isString(item) ? item : item[0]);
if (names.indexOf(dep) !== -1) {
return true;
}
if (prefix && dep.indexOf(prefix) === 0) {
return contain(array, dep.substring(prefix.length), false);
}
return false;
}
function removeNodeModuleRelativePaths(filepath) {

@@ -57,6 +46,7 @@ if (Array.isArray(filepath)) {

}
return filepath.replace(/^.*node_modules\//, '').replace(/\/.*/, '');
return filepath.replace(/^.*node_modules\//, '')
// Strip off subdirectories or exports from package name,
// e.g. @foo/bar/baz -> @foo/bar, bar/baz -> baz
.replace(/^((?:@[^/]+\/)?[^@/]+)(?:\/.*)?/, '$1');
}
function filter(deps, options) {

@@ -69,7 +59,5 @@ const runner = deps.filter(dep => contain(options.runner, dep, 'jest-runner-'));

}
if (Array.isArray(value)) {
return value.map(removeNodeModuleRelativePaths);
}
return removeNodeModuleRelativePaths(value);

@@ -79,15 +67,19 @@ }).flatten().intersection(deps).value();

}
function checkOptions(deps, options = {}) {
const pickedOptions = (0, _lodash.default)(options).pick(supportedProperties).value();
return filter(deps, pickedOptions);
const baseFoundDeps = filter(deps, pickedOptions);
if (options.projects) {
const projectDeps = options.projects.map(projectConfig => checkOptions(deps, projectConfig));
return baseFoundDeps.concat(...projectDeps);
}
return baseFoundDeps;
}
async function parseJest(filename, deps, rootDir) {
const basename = _path.default.basename(filename);
if (jestConfigRegex.test(basename)) {
try {
var _require;
// eslint-disable-next-line global-require
const options = require(filename) || {};
const config = (_require = require(filename)) !== null && _require !== void 0 ? _require : {};
const options = _path.default.extname(filename) === '.ts' ? config.default : config;
return checkOptions(deps, options);

@@ -98,7 +90,4 @@ } catch (error) {

}
const packageJsonPath = _path.default.resolve(rootDir, 'package.json');
const resolvedFilePath = _path.default.resolve(rootDir, filename);
if (resolvedFilePath === packageJsonPath) {

@@ -109,6 +98,4 @@ const content = await (0, _file.getContent)(filename);

}
return [];
}
module.exports = exports.default;

@@ -7,25 +7,13 @@ "use strict";

exports.default = parseKarma;
var _fs = _interopRequireDefault(require("fs"));
var _path = _interopRequireDefault(require("path"));
var _resolve = _interopRequireDefault(require("resolve"));
var _lodash = _interopRequireDefault(require("lodash"));
var _es = _interopRequireWildcard(require("../parser/es7"));
var _parser = _interopRequireDefault(require("../utils/parser"));
var _utils = require("../utils");
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const supportedConfNames = ['karma.conf.js', 'karma.conf.ts', '.config/karma.conf.js', '.config/karma.conf.ts'];
function parsePluginModuleExports(node) {

@@ -37,9 +25,7 @@ // node.left must be assigning to module.export and node.right must be an object literal

}
return [];
}
function parseConfigModuleExports(node) {
const supportedConfigProperties = ['frameworks', 'browsers', 'preprocessors', 'reporters', 'plugins']; // node.left must be assigning to module.exports
const supportedConfigProperties = ['frameworks', 'browsers', 'preprocessors', 'reporters', 'plugins'];
// node.left must be assigning to module.exports
if (node && node.type === 'AssignmentExpression' && node.left.type === 'MemberExpression' && node.left.object && node.left.object.type === 'Identifier' && node.left.object.name === 'module' && node.left.property && node.left.property.type === 'Identifier' && node.left.property.name === 'exports') {

@@ -50,8 +36,7 @@ // module.exports = function(config) {...};

const configParam = functionExprNode.params[0].name;
const bodyExprNode = functionExprNode.body.body[0].expression; // config.set(...)
const bodyExprNode = functionExprNode.body.body[0].expression;
// config.set(...)
if (bodyExprNode.type === 'CallExpression' && bodyExprNode.callee.type === 'MemberExpression' && bodyExprNode.callee.object.name === configParam && bodyExprNode.callee.property.name === 'set') {
// assume the call to the function will pass an object literal too
const arg = bodyExprNode.arguments[0];
if (arg.type === 'ObjectExpression') {

@@ -79,6 +64,6 @@ // collect literal keys and values for:

return config;
} // TODO handle other expression types
} // TODO handle CallExpression
}
// TODO handle other expression types
}
// TODO handle CallExpression
}

@@ -89,3 +74,2 @@ }

}
async function parseConfig(filename) {

@@ -95,3 +79,2 @@ const ast = await (0, _es.default)(filename);

}
function collectInstalledPluginInfo(karmaPluginsInstalled, rootDir) {

@@ -103,8 +86,6 @@ const pluginInfo = {};

});
const packageContents = _fs.default.readFileSync(packageMain, {
encoding: 'utf8'
}); // don't evaluate the contents, since it probably has module requirements we can't load
});
// don't evaluate the contents, since it probably has module requirements we can't load
const ast = (0, _es.parseES7Content)(packageContents);

@@ -118,3 +99,2 @@ const p = (0, _lodash.default)((0, _parser.default)(ast)).map(node => parsePluginModuleExports(node)).flatten().uniq().value();

}
function collectInstalledPluginOfType(type, pluginInfo) {

@@ -129,3 +109,2 @@ const pluginMapping = {};

}
function collectFrameworks(config, pluginInfo) {

@@ -135,7 +114,6 @@ // karma-x plugins define frameworks using the structure { 'framework:<name>': ['factory', f] }

const frameworkMapping = collectInstalledPluginOfType('framework', pluginInfo);
const installedFrameworks = Object.keys(frameworkMapping); // config defines a property frameworks: ['<name>',...]
const installedFrameworks = Object.keys(frameworkMapping);
// config defines a property frameworks: ['<name>',...]
return (0, _utils.wrapToArray)(config.frameworks).filter(name => installedFrameworks.includes(name)).map(name => frameworkMapping[name]);
}
function collectBrowsers(config, pluginInfo) {

@@ -146,7 +124,6 @@ // karma-x-launcher plugins define browsers using the structure

const launcherMapping = collectInstalledPluginOfType('launcher', pluginInfo);
const installedBrowsers = Object.keys(launcherMapping); // config defines a property browsers: ['<name>',...]
const installedBrowsers = Object.keys(launcherMapping);
// config defines a property browsers: ['<name>',...]
return [...new Set((0, _utils.wrapToArray)(config.browsers).filter(name => installedBrowsers.includes(name)).map(name => launcherMapping[name]))];
}
function collectReporters(config, pluginInfo) {

@@ -156,7 +133,6 @@ // some reporters are added by frameworks, so don't filter on only '-reporter' plugins

const reporterMapping = collectInstalledPluginOfType('reporter', pluginInfo);
const installedReporters = Object.keys(reporterMapping); // config defines a property reporters: ['<name>', ...]
const installedReporters = Object.keys(reporterMapping);
// config defines a property reporters: ['<name>', ...]
return (0, _utils.wrapToArray)(config.reporters).filter(name => installedReporters.includes(name)).map(name => reporterMapping[name]);
}
function collectPreprocessors(config, pluginInfo) {

@@ -167,8 +143,7 @@ // karma-x plugins define preprocessors using the structure

const preprocessorMapping = collectInstalledPluginOfType('preprocessor', pluginInfo);
const installedPreprocessors = Object.keys(preprocessorMapping); // config defines a property preprocessors: {'<file-glob>': '<name>'}, ... }
const installedPreprocessors = Object.keys(preprocessorMapping);
// config defines a property preprocessors: {'<file-glob>': '<name>'}, ... }
const preprocessors = (0, _utils.wrapToMap)(config.preprocessors);
return [...new Set(Object.keys(preprocessors).map(k => preprocessors[k]).filter(name => installedPreprocessors.includes(name)).map(name => preprocessorMapping[name]))];
}
function collectExplicitPlugins(config) {

@@ -181,23 +156,19 @@ // config defines a property frameworks: [x,...] where x is either

}
function collectUsages(config, karmaPluginsInstalled, rootDir) {
const pluginInfo = collectInstalledPluginInfo(karmaPluginsInstalled, rootDir);
return [].concat(collectFrameworks(config, pluginInfo)).concat(collectBrowsers(config, pluginInfo)) // TODO add support for Express middleware plugins
return [].concat(collectFrameworks(config, pluginInfo)).concat(collectBrowsers(config, pluginInfo))
// TODO add support for Express middleware plugins
// .concat(collectMiddleware(config, pluginInfo))
.concat(collectPreprocessors(config, pluginInfo)).concat(collectReporters(config, pluginInfo));
}
async function parseKarma(filename, deps, rootDir) {
const resolvedConfigPaths = supportedConfNames.map(name => _path.default.resolve(rootDir, name));
if (!resolvedConfigPaths.includes(filename)) {
return [];
}
const config = await parseConfig(filename); // possibly unused plugins
const config = await parseConfig(filename);
// possibly unused plugins
const karmaPluginsInstalled = deps.filter(dep => dep.startsWith('karma-')).concat(collectExplicitPlugins(config));
return collectUsages(config, karmaPluginsInstalled, rootDir);
}
module.exports = exports.default;

@@ -7,14 +7,8 @@ "use strict";

exports.default = parseLintStaged;
var path = _interopRequireWildcard(require("path"));
var _file = require("../utils/file");
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
async function parseLintStaged(filename) {
const basename = path.basename(filename);
if (basename === 'package.json') {

@@ -25,6 +19,4 @@ const content = await (0, _file.getContent)(filename);

}
return [];
}
module.exports = exports.default;

@@ -7,37 +7,23 @@ "use strict";

exports.default = parseMocha;
var _fs = _interopRequireDefault(require("fs"));
var _path = _interopRequireDefault(require("path"));
var _requirePackageName = _interopRequireDefault(require("require-package-name"));
var _cliTools = require("../utils/cli-tools");
var _utils = require("../utils");
var _file = require("../utils/file");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const knownReporters = ['dot', 'doc', 'tap', 'json', 'html', 'list', 'min', 'spec', 'nyan', 'xunit', 'markdown', 'progress', 'landing', 'json-stream'];
const mochaTypescript = '@types/mocha';
function getOptsConfig(root, config, param) {
const argvs = config.split(/\s+/);
const optsIndex = argvs.indexOf(param);
if (optsIndex === -1) {
return null;
}
const optsPath = argvs[optsIndex + 1];
if (!optsPath) {
return null;
}
return _fs.default.readFileSync(_path.default.resolve(root, '..', optsPath), 'utf-8');
}
function getCliDependencies(content, deps) {

@@ -49,3 +35,2 @@ const lines = content.split(/\s+/);

const val = lines[idx + 1];
if (val && !val.startsWith('--')) {

@@ -55,6 +40,4 @@ result.push(val);

}
if (line === '--reporter') {
const val = lines[idx + 1];
if (val && !val.startsWith('--') && !knownReporters.includes(val)) {

@@ -67,27 +50,18 @@ result.push(val);

}
function getParamDependencies(content, deps) {
const result = [];
if (content.require) {
result.push(...(0, _utils.wrapToArray)(content.require));
}
if (content.reporter) {
result.push(...(0, _utils.wrapToArray)(content.reporter).filter(r => !knownReporters.includes(r)));
}
return result.map(_requirePackageName.default).filter((v, k, arr) => arr.indexOf(v) === k).filter(name => deps.includes(name));
}
const configNameRegex = /^\.mocharc\.(json|jsonc|js|yml|yaml)$/;
async function parseMocha(filename, deps, rootDir) {
const defaultOptPath = _path.default.resolve(rootDir, 'test/mocha.opts');
const basename = _path.default.basename(filename);
let cliConfig;
let paramConfig;
if (filename === defaultOptPath) {

@@ -101,7 +75,5 @@ cliConfig = await (0, _file.getContent)(filename);

const mochaScript = scripts.find(s => s.indexOf('mocha') !== -1);
if (mochaScript) {
cliConfig = mochaScript.slice(mochaScript.indexOf('mocha'));
}
if (basename === 'package.json') {

@@ -112,33 +84,23 @@ const content = await (0, _file.getContent)(filename);

}
const requires = [];
if (cliConfig) {
let optsConfig;
optsConfig = getOptsConfig(filename, cliConfig, '--opts');
if (optsConfig) {
requires.push(...getCliDependencies(optsConfig, deps));
}
optsConfig = getOptsConfig(filename, cliConfig, '--config');
if (optsConfig) {
requires.push(...getParamDependencies((0, _cliTools.parse)(optsConfig), deps));
}
requires.push(...getCliDependencies(cliConfig, deps));
}
if (paramConfig) {
requires.push(...getParamDependencies(paramConfig, deps));
}
if ((cliConfig || paramConfig) && deps.includes(mochaTypescript)) {
requires.push(mochaTypescript);
}
return requires;
}
module.exports = exports.default;

@@ -7,13 +7,8 @@ "use strict";

exports.default = parsePrettier;
var _path = _interopRequireDefault(require("path"));
var _utils = require("../utils");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function parsePrettier(filename) {
if (_path.default.basename(filename) === 'package.json') {
const config = (0, _utils.readJSON)(filename);
if (config && config.prettier && typeof config.prettier === 'string') {

@@ -23,6 +18,4 @@ return [config.prettier];

}
return [];
}
module.exports = exports.default;

@@ -7,11 +7,6 @@ "use strict";

exports.default = parseReact17;
var _path = _interopRequireDefault(require("path"));
var _semver = _interopRequireDefault(require("semver"));
var _file = require("../utils/file");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
async function parseReact17(filename) {

@@ -21,6 +16,4 @@ if (_path.default.basename(filename) === 'package.json') {

const metadata = JSON.parse(content);
try {
var _metadata$dependencie;
if (_semver.default.gte(_semver.default.coerce((_metadata$dependencie = metadata.dependencies) === null || _metadata$dependencie === void 0 ? void 0 : _metadata$dependencie.react), '17.0.0')) {

@@ -33,6 +26,4 @@ return ['react'];

}
return [];
}
module.exports = exports.default;

@@ -7,15 +7,8 @@ "use strict";

exports.default = parseServerless;
var path = _interopRequireWildcard(require("path"));
var _jsYaml = _interopRequireDefault(require("js-yaml"));
var _file = require("../utils/file");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
/**

@@ -28,2 +21,3 @@ * Get plugin names from a yaml object.

}
/**

@@ -33,23 +27,15 @@ * Get the dependency names of the given plugins.

*/
function getDependencies(plugins) {
return plugins;
}
async function parseServerless(filename) {
const basename = path.basename(filename);
if (basename === 'serverless.yml') {
const content = await (0, _file.getContent)(filename);
const config = _jsYaml.default.safeLoad(content); // TODO This detects plugins from the main serverless.yml, but you could have plugins in included files like this: "plugins: ${file(./serverless.plugins.yml)}"
const config = _jsYaml.default.safeLoad(content);
// TODO This detects plugins from the main serverless.yml, but you could have plugins in included files like this: "plugins: ${file(./serverless.plugins.yml)}"
return ['serverless', ...getDependencies(getPlugins(config))];
}
return [];
}
module.exports = exports.default;

@@ -7,17 +7,9 @@ "use strict";

exports.default = parseTSLint;
var path = _interopRequireWildcard(require("path"));
var _requirePackageName = _interopRequireDefault(require("require-package-name"));
var _cliTools = require("../utils/cli-tools");
var _index = require("../utils/index");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
function resolvePresetPackage(preset, rootDir) {

@@ -27,20 +19,17 @@ if (preset.startsWith('./') || preset.startsWith('../')) {

}
return preset;
}
function checkConfig(config, rootDir) {
let rules = (0, _index.wrapToArray)(config.rulesDirectory).filter(ruleDir => !path.isAbsolute(ruleDir));
const prettierPlugin = 'tslint-plugin-prettier'; // If tslint-plugin-prettier is in tslint file
const prettierPlugin = 'tslint-plugin-prettier';
// If tslint-plugin-prettier is in tslint file
// then it should also be activated, if not,
// remove it from the list of used dependencies.
if (rules.includes(prettierPlugin) && config.rules.prettier !== true) {
rules = rules.filter(rule => rule !== prettierPlugin);
}
return (0, _index.wrapToArray)(config.extends).filter(preset => !preset.startsWith('tslint:')).map(preset => resolvePresetPackage(preset, rootDir)).filter(preset => !path.isAbsolute(preset)).map(_requirePackageName.default).concat(rules);
}
const configNameRegex = /^tslint\.(json|yaml|yml)$/;
const configNameRegex = /^tslint\.(json|yaml|yml)$/;
/**

@@ -53,13 +42,9 @@ * Parses TSLint configuration for dependencies.

*/
async function parseTSLint(filename, deps, rootDir) {
const config = await (0, _cliTools.loadConfig)('tslint', configNameRegex, filename, rootDir);
if (config) {
return ['tslint', ...checkConfig(config, rootDir)];
}
return [];
}
module.exports = exports.default;

@@ -7,20 +7,12 @@ "use strict";

exports.default = parseTTypeScript;
var _lodash = _interopRequireDefault(require("lodash"));
var _path = _interopRequireDefault(require("path"));
var _utils = require("../utils");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
// Search in all files looking like a TypeScript configuration file.
const tsconfigPattern = /tsconfig(?:\.[^.]+)*\.json/;
function parseTTypeScript(filename, deps) {
const basename = _path.default.basename(filename);
if (tsconfigPattern.test(basename)) {
const content = (0, _utils.readJSON)(filename) || {};
if (content.compilerOptions && content.compilerOptions.plugins) {

@@ -30,6 +22,4 @@ return (0, _lodash.default)(content.compilerOptions.plugins).filter(plugin => plugin.transform).map(plugin => plugin.transform).intersection(deps).uniq().value();

}
return [];
}
module.exports = exports.default;

@@ -7,16 +7,11 @@ "use strict";

exports.default = parseWebpack;
var _path = _interopRequireDefault(require("path"));
var _lodash = _interopRequireDefault(require("lodash"));
var _utils = require("../utils");
var _webpack = require("../utils/webpack");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
const webpackConfigRegex = /webpack(\..+)?\.conf(?:ig|)\.(babel\.)?[jt]s/;
const loaderTemplates = ['*-webpack-loader', '*-web-loader', '*-loader', '*'];
function extractLoaders(item) {

@@ -26,22 +21,16 @@ if (!item) {

}
if (typeof item === 'string') {
return item;
}
if (Array.isArray(item)) {
return item.map(extractLoaders);
}
if (item.loader && typeof item.loader === 'string') {
return item.loader.split('!');
}
if (item.loaders) {
return item.loaders.map(extractLoaders);
}
return [];
}
function stripQueryParameter(loader) {

@@ -51,3 +40,2 @@ const index = loader.indexOf('?');

}
function normalizeLoader(deps, loader) {

@@ -57,11 +45,8 @@ const name = (0, _lodash.default)(loaderTemplates).map(template => template.replace('*', loader)).intersection(deps).first();

}
function getLoaders(deps, loaders) {
return (0, _lodash.default)(loaders || []).map(extractLoaders).flatten().map(loader => stripQueryParameter(loader)).map(loader => normalizeLoader(deps, loader)).filter(loader => loader).uniq().value();
}
function getBabelPresets(deps, loaders) {
return (0, _lodash.default)(loaders || []).filter(item => typeof item !== 'string' && item.loader && item.loader === 'babel-loader' && item.options && item.options.presets && Array.isArray(item.options.presets)).map(item => item.options.presets).flatten().map(preset => Array.isArray(preset) && preset.length > 0 ? preset[0] : preset).filter(preset => typeof preset === 'string').intersection(deps).uniq().value();
}
function parseWebpack1(module, deps) {

@@ -73,13 +58,12 @@ const loaders = getLoaders(deps, module.loaders);

}
function mapRuleUse(module) {
return module.rules // filter use or loader because 'loader' is a shortcut to 'use'
.filter(rule => rule.use || rule.loader) // return coerced array, using the relevant key
return module.rules
// filter use or loader because 'loader' is a shortcut to 'use'
.filter(rule => rule.use || rule.loader)
// return coerced array, using the relevant key
.map(rule => [].concat(rule.use || rule.loader));
}
function mapOneOf(module) {
return module.rules.filter(rule => !!rule.oneOf).map(rule => rule.oneOf.map(r => r.use || r.loader));
}
function parseWebpack2(module, deps) {

@@ -89,9 +73,6 @@ if (!module.rules) {

}
const mappedLoaders = module.rules.filter(rule => rule.loaders);
const mappedUses = mapRuleUse(module);
const oneOf = mapOneOf(module);
const mapped = _lodash.default.flatten([...mappedLoaders, ...mappedUses, ...oneOf]);
const loaders = getLoaders(deps, mapped);

@@ -101,3 +82,2 @@ const presets = getBabelPresets(deps, mapped);

}
function extractEntries(entries) {

@@ -107,14 +87,10 @@ if (typeof entries === 'string') {

}
if (Array.isArray(entries)) {
return entries.filter(entry => typeof entry === 'string');
}
return Object.values(entries).filter(entry => entry).map(extractEntries);
}
function parseEntries(entries, deps) {
return (0, _lodash.default)(extractEntries(entries)).flatten().intersection(deps).uniq().value();
}
function parseWebpackConfig(webpackConfig, deps) {

@@ -128,3 +104,2 @@ if (Array.isArray(webpackConfig)) {

}
const module = webpackConfig.module || {};

@@ -137,4 +112,3 @@ const entry = webpackConfig.entry || [];

}
function loadNextWebpackConfig(filepath) {
async function loadNextWebpackConfig(filepath) {
const fakeConfig = {

@@ -159,9 +133,7 @@ plugins: [],

webpack: _webpack.fakeWebpack,
defaultLoaders: {}
defaultLoaders: {},
dir: 'fakePath'
};
try {
const nextConfig = require(filepath); // eslint-disable-line global-require
const nextConfig = await (specifier => new Promise(r => r(`${specifier}`)).then(s => _interopRequireWildcard(require(s))))(filepath);
if (nextConfig && nextConfig.webpack) {

@@ -174,12 +146,8 @@ return nextConfig.webpack(fakeConfig, fakeContext);

}
return null;
}
function parseWebpack(filename, deps) {
async function parseWebpack(filename, deps) {
const basename = _path.default.basename(filename);
if (webpackConfigRegex.test(basename)) {
const webpackConfig = (0, _utils.tryRequire)(filename);
if (webpackConfig) {

@@ -189,6 +157,4 @@ return parseWebpackConfig(webpackConfig, deps);

}
if (basename === 'styleguide.config.js') {
const styleguideConfig = (0, _utils.tryRequire)(filename);
if (styleguideConfig && styleguideConfig.webpackConfig) {

@@ -198,6 +164,4 @@ return parseWebpackConfig(styleguideConfig.webpackConfig, deps);

}
if (basename === 'next.config.js') {
const webpackConfig = loadNextWebpackConfig(filename);
const webpackConfig = await loadNextWebpackConfig(filename);
if (webpackConfig) {

@@ -207,6 +171,4 @@ return parseWebpackConfig(webpackConfig, deps);

}
return [];
}
module.exports = exports.default;

@@ -6,26 +6,15 @@ "use strict";

});
exports.parse = parse;
exports.getCustomConfig = getCustomConfig;
exports.loadConfig = loadConfig;
exports.parse = parse;
var _jsYaml = _interopRequireDefault(require("js-yaml"));
var path = _interopRequireWildcard(require("path"));
var fs = _interopRequireWildcard(require("fs"));
var JSON5 = _interopRequireWildcard(require("json5"));
var _ = require(".");
var _getScripts = _interopRequireDefault(require("./get-scripts"));
var _file = require("./file");
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const optionKeysForConfig = {

@@ -36,42 +25,38 @@ babel: ['--config-file'],

};
function parse(content) {
try {
return JSON.parse(content);
} catch (error) {// not JSON format
} catch (error) {
// not JSON format
}
try {
return JSON5.parse(content);
} catch (error) {// not JSON5 format
} catch (error) {
// not JSON5 format
}
try {
return _jsYaml.default.safeLoad(content);
} catch (error) {// not YAML format
} catch (error) {
// not YAML format
}
try {
return (0, _.evaluate)(`module.exports = ${content}`);
} catch (error) {// not valid JavaScript code
} catch (error) {
// not valid JavaScript code
}
try {
return (0, _.evaluate)(content);
} catch (error) {// not valid JavaScript code
} // parse fail, return nothing
} catch (error) {
// not valid JavaScript code
}
// parse fail, return nothing
return null;
}
async function getCustomConfig(binName, filename, rootDir) {
const scripts = await (0, _getScripts.default)(filename);
if (scripts.length === 0) {
return null;
}
const script = scripts.find(s => s.split(/\s+/).includes(binName));
if (script) {

@@ -81,7 +66,5 @@ const commands = script.split('&&');

const optionsKeys = optionKeysForConfig[binName];
if (command && optionsKeys) {
const args = command.split(/\s+/);
const configIdx = args.findIndex(arg => optionsKeys.includes(arg));
if (configIdx !== -1 && args[configIdx + 1]) {

@@ -95,16 +78,11 @@ const configFile = args[configIdx + 1];

}
return null;
}
async function loadConfig(binName, filenameRegex, filename, rootDir) {
const basename = path.basename(filename);
if (filenameRegex.test(basename)) {
const requireConfig = (0, _.tryRequire)(filename);
if (requireConfig) {
return requireConfig;
}
const content = await (0, _file.getContent)(filename);

@@ -114,10 +92,7 @@ const config = parse(content);

}
const custom = await getCustomConfig(binName, filename, rootDir);
if (custom) {
return custom;
}
return null;
}

@@ -7,35 +7,24 @@ "use strict";

exports.getCliArgs = getCliArgs;
exports.getConfiguration = getConfiguration;
exports.getRCFileConfiguration = getRCFileConfiguration;
exports.getConfiguration = getConfiguration;
var _yargs = _interopRequireDefault(require("yargs"));
var _cosmiconfig = require("cosmiconfig");
var _camelcase = _interopRequireDefault(require("camelcase"));
var _lodash = _interopRequireDefault(require("lodash"));
var _configurationParsingException = _interopRequireDefault(require("./exceptions/configuration-parsing-exception"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function parseCsvArray(value) {
return (value || '').split(',');
}
function convertObjectToCamelCase(obj) {
return Object.entries(obj).reduce((newObj, [key, value]) => {
newObj[(0, _camelcase.default)(key)] = value; // eslint-disable-line no-param-reassign
return newObj;
}, {});
}
function createParsersObject(parsersFromCli) {
return _lodash.default.isUndefined(parsersFromCli) ? undefined : (0, _lodash.default)(parsersFromCli).map(keyValuePair => keyValuePair.split(':')).fromPairs().mapValues(value => value.split('&')).value();
}
function getCliArgs(args, version) {
return (0, _yargs.default)(args).usage('Usage: $0 [DIRECTORY]').boolean(['ignore-bin-package', 'skip-missing']).describe('config', 'A config file to be parsed').describe('ignore-bin-package', 'Ignore package with bin entry').describe('skip-missing', 'Skip calculation of missing dependencies').describe('json', 'Output results to JSON').describe('oneline', 'Output results as space separated string').describe('ignores', 'Comma separated package list to ignore').describe('ignore-dirs', 'Comma separated folder names to ignore (deprecated)').describe('ignore-path', 'Path to a file with patterns describing files to ignore.').describe('ignore-patterns', 'Comma separated patterns describing files to ignore.').describe('parsers', 'Comma separated glob:parser pair list').describe('detectors', 'Comma separated detector list').describe('specials', 'Comma separated special parser list').version('version', 'Show version number', version).help('help', 'Show this help message').coerce(['ignores', 'ignore-dirs', 'ignore-patterns', 'detectors', 'specials'], parseCsvArray).coerce('parsers', parsersStr => {
return (0, _yargs.default)(args).usage('Usage: $0 [DIRECTORY]').boolean(['ignore-bin-package', 'skip-missing']).describe('config', 'A config file to be parsed').describe('ignore-bin-package', 'Ignore package with bin entry').describe('skip-missing', 'Skip calculation of missing dependencies').describe('json', 'Output results to JSON').describe('oneline', 'Output results as space separated string').describe('ignores', 'Comma separated package list to ignore').describe('ignore-dirs', 'Comma separated folder names to ignore (deprecated)').describe('ignore-path', 'Path to a file with patterns describing files to ignore.').describe('ignore-patterns', 'Comma separated patterns describing files to ignore.').describe('parsers', 'Comma separated glob:parser pair list').describe('quiet', 'Suppress the "No depcheck issue" message').describe('detectors', 'Comma separated detector list').describe('specials', 'Comma separated special parser list').version('version', 'Show version number', version).help('help', 'Show this help message').coerce(['ignores', 'ignore-dirs', 'ignore-patterns', 'detectors', 'specials'], parseCsvArray).coerce('parsers', parsersStr => {
const parsers = parseCsvArray(parsersStr);

@@ -45,9 +34,7 @@ return createParsersObject(parsers);

}
/* istanbul ignore next */
function returnNull() {
return null;
}
async function getRCFileConfiguration(moduleName, filename, dir) {

@@ -70,3 +57,2 @@ try {

}
async function getConfiguration(args, moduleName, version) {

@@ -76,5 +62,6 @@ const dir = args[0] || '.';

const rcConfig = await getRCFileConfiguration(moduleName, cliConfig.argv.config, dir);
return { ...rcConfig,
return {
...rcConfig,
...cliConfig.argv
};
}

@@ -7,3 +7,2 @@ "use strict";

exports.default = void 0;
class ConfigurationParsingException extends Error {

@@ -15,6 +14,4 @@ constructor(filePath, error) {

}
}
exports.default = ConfigurationParsingException;
module.exports = exports.default;

@@ -6,26 +6,24 @@ "use strict";

});
exports.clearContent = clearContent;
exports.getContent = getContent;
exports.setContent = setContent;
var _fs = _interopRequireDefault(require("fs"));
var _util = _interopRequireDefault(require("util"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
// TODO: this can later be refactored once support for node 10 is dropped
const readFileAsync = _util.default.promisify(_fs.default.readFile);
const promises = new Map();
const promises = {}; // eslint-disable-next-line import/prefer-default-export
// eslint-disable-next-line import/prefer-default-export
function getContent(filename) {
if (!promises[filename]) {
promises[filename] = readFileAsync(filename, 'utf8');
if (!promises.has(filename)) {
promises.set(filename, readFileAsync(filename, 'utf8'));
}
return promises[filename];
return promises.get(filename);
}
function setContent(filename, content) {
promises[filename] = Promise.resolve(content);
promises.set(filename, Promise.resolve(content));
}
function clearContent() {
promises.clear();
}

@@ -8,15 +8,8 @@ "use strict";

exports.default = getScripts;
var _path = _interopRequireDefault(require("path"));
var _jsYaml = _interopRequireDefault(require("js-yaml"));
var _lodash = _interopRequireDefault(require("lodash"));
var _file = require("./file");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const scriptCache = {};
function clearCache() {

@@ -27,3 +20,2 @@ Object.keys(scriptCache).forEach(key => {

}
async function getCacheOrFile(key, fn) {

@@ -33,3 +25,2 @@ if (scriptCache[key]) {

}
const value = await fn();

@@ -39,11 +30,10 @@ scriptCache[key] = value;

}
const travisCommands = [// Reference: https://docs.travis-ci.com/user/job-lifecycle
'before_install', 'install', 'before_script', 'script', 'before_cache', 'after_success', 'after_failure', 'before_deploy', // 'deploy', // currently ignored
const travisCommands = [
// Reference: https://docs.travis-ci.com/user/job-lifecycle
'before_install', 'install', 'before_script', 'script', 'before_cache', 'after_success', 'after_failure', 'before_deploy',
// 'deploy', // currently ignored
'after_deploy', 'after_script'];
async function getScripts(filename) {
return getCacheOrFile(filename, async () => {
const basename = _path.default.basename(filename);
if (basename === 'package.json') {

@@ -53,3 +43,2 @@ const content = await (0, _file.getContent)(filename);

}
if (basename === '.travis.yml') {

@@ -60,5 +49,4 @@ const content = await (0, _file.getContent)(filename);

}
return [];
});
}

@@ -6,8 +6,3 @@ "use strict";

});
exports.readJSON = readJSON;
exports.evaluate = evaluate;
exports.loadModuleData = loadModuleData;
exports.tryRequire = tryRequire;
exports.wrapToArray = wrapToArray;
exports.wrapToMap = wrapToMap;
Object.defineProperty(exports, "getScripts", {

@@ -19,11 +14,12 @@ enumerable: true,

});
exports.loadModuleData = loadModuleData;
exports.readJSON = readJSON;
exports.tryRequire = tryRequire;
exports.wrapToArray = wrapToArray;
exports.wrapToMap = wrapToMap;
var _path = _interopRequireDefault(require("path"));
var _vm = _interopRequireDefault(require("vm"));
var _moduleRoot = _interopRequireDefault(require("./module-root"));
var _getScripts = _interopRequireDefault(require("./get-scripts"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function readJSON(filePath) {

@@ -41,14 +37,10 @@ return require(filePath); // eslint-disable-line global-require

};
_vm.default.runInNewContext(code, sandbox);
return sandbox.module.exports;
}
function loadModuleData(moduleName, rootDir) {
try {
const file = require.resolve(`${moduleName}/package.json`, {
paths: [rootDir]
});
const file = _path.default.join((0, _moduleRoot.default)(moduleName, {
cwd: rootDir
}), 'package.json');
return {

@@ -65,3 +57,2 @@ path: _path.default.dirname(file),

}
function tryRequire(module, paths = []) {

@@ -78,3 +69,2 @@ try {

}
function wrapToArray(obj) {

@@ -84,10 +74,7 @@ if (!obj) {

}
if (Array.isArray(obj)) {
return obj;
}
return [obj];
}
function wrapToMap(obj) {

@@ -97,4 +84,3 @@ if (!obj) {

}
return obj;
}

@@ -7,7 +7,4 @@ "use strict";

exports.default = getNodes;
var _lodash = _interopRequireDefault(require("lodash"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
// fix for node.js <= 3, it throws TypeError when value type invalid in weak set

@@ -21,3 +18,2 @@ function hasVisited(ast, visited) {

}
function recursive(ast, visited) {

@@ -27,7 +23,5 @@ if (!ast || hasVisited(ast, visited)) {

}
if (Array.isArray(ast)) {
return (0, _lodash.default)(ast).map(node => recursive(node, visited)).flatten().value();
}
if (ast.type) {

@@ -37,6 +31,4 @@ visited.add(ast);

}
return [];
}
function getNodes(ast) {

@@ -46,3 +38,2 @@ const visited = new WeakSet();

}
module.exports = exports.default;

@@ -7,13 +7,10 @@ "use strict";

exports.getAtTypesName = getAtTypesName;
var _isCoreModule = _interopRequireDefault(require("is-core-module"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/* eslint-disable import/prefer-default-export */
const orgDepRegex = /@(.*?)\/(.*)/; // The name of the DefinitelyTyped package for a given package
const orgDepRegex = /@(.*?)\/(.*)/;
// The name of the DefinitelyTyped package for a given package
function getAtTypesName(dep) {
let pkgName;
if ((0, _isCoreModule.default)(dep)) {

@@ -25,4 +22,3 @@ pkgName = 'node';

}
return `@types/${pkgName}`;
}

@@ -8,4 +8,5 @@ "use strict";

// Based on https://github.com/webpack/webpack/blob/master/lib/index.js
// eslint-disable-next-line import/prefer-default-export
const fakeWebpack = {
const fakeWebpack = exports.fakeWebpack = {
AutomaticPrefetchPlugin: Object,

@@ -102,3 +103,2 @@ BannerPlugin: Object,

}
};
exports.fakeWebpack = fakeWebpack;
};

@@ -7,10 +7,2 @@ /**

/**
* These packages are used as optional peer dependencies
* Because of inconsistenties in npm behavior over time, depcheck
* cannot model the way these deps are required or used.
* For more information: https://github.com/depcheck/depcheck/issues/130
*/
import 'node-sass';
/**
* Recongnize the required module by nyc. See depcheck/depcheck#183

@@ -20,6 +12,5 @@ */

import '@babel/register';
/**
* Typescript is loaded using tryRequire and is therefore not detected.
* TypeScript is loaded using tryRequire and is therefore not detected.
*/
import 'typescript';
{
"name": "depcheck",
"version": "1.4.3",
"version": "1.4.7",
"description": "Check dependencies in your node module",

@@ -52,36 +52,36 @@ "main": "dist/index.js",

"dependencies": {
"@babel/parser": "7.16.4",
"@babel/traverse": "^7.12.5",
"@vue/compiler-sfc": "^3.0.5",
"camelcase": "^6.2.0",
"cosmiconfig": "^7.0.0",
"debug": "^4.2.0",
"deps-regex": "^0.1.4",
"ignore": "^5.1.8",
"is-core-module": "^2.4.0",
"js-yaml": "^3.14.0",
"json5": "^2.1.3",
"lodash": "^4.17.20",
"minimatch": "^3.0.4",
"@babel/parser": "^7.23.0",
"@babel/traverse": "^7.23.2",
"@vue/compiler-sfc": "^3.3.4",
"callsite": "^1.0.0",
"camelcase": "^6.3.0",
"cosmiconfig": "^7.1.0",
"debug": "^4.3.4",
"deps-regex": "^0.2.0",
"findup-sync": "^5.0.0",
"ignore": "^5.2.4",
"is-core-module": "^2.12.0",
"js-yaml": "^3.14.1",
"json5": "^2.2.3",
"lodash": "^4.17.21",
"minimatch": "^7.4.6",
"multimatch": "^5.0.0",
"please-upgrade-node": "^3.2.0",
"query-ast": "^1.0.3",
"readdirp": "^3.5.0",
"readdirp": "^3.6.0",
"require-package-name": "^2.0.1",
"resolve": "^1.18.1",
"sass": "^1.29.0",
"scss-parser": "^1.0.4",
"semver": "^7.3.2",
"yargs": "^16.1.0"
"resolve": "^1.22.3",
"resolve-from": "^5.0.0",
"semver": "^7.5.4",
"yargs": "^16.2.0"
},
"devDependencies": {
"@babel/cli": "^7.12.1",
"@babel/core": "^7.12.3",
"@babel/plugin-transform-object-assign": "^7.12.1",
"@babel/cli": "^7.23.0",
"@babel/core": "^7.23.2",
"@babel/plugin-transform-object-assign": "^7.22.5",
"@babel/polyfill": "^7.12.1",
"@babel/preset-env": "^7.12.1",
"@babel/register": "^7.12.1",
"@babel/preset-env": "^7.23.2",
"@babel/register": "^7.22.15",
"babel-eslint": "^10.1.0",
"babel-plugin-add-module-exports": "^1.0.4",
"babel-plugin-istanbul": "^6.0.0",
"babel-plugin-istanbul": "^6.1.1",
"cross-env": "^7.0.2",

@@ -98,3 +98,2 @@ "eslint": "^7.13.0",

"mocha": "^8.2.1",
"node-sass": "^6.0.0",
"nyc": "^15.1.0",

@@ -101,0 +100,0 @@ "patch-version": "^0.1.1",

@@ -11,4 +11,3 @@ # depcheck

[![dependencies Status](https://david-dm.org/depcheck/depcheck/status.svg)](https://david-dm.org/depcheck/depcheck)
[![devDependencies Status](https://david-dm.org/depcheck/depcheck/dev-status.svg)](https://david-dm.org/depcheck/depcheck?type=dev)
[![Dependencies](https://img.shields.io/librariesio/github/depcheck/depcheck)](https://libraries.io/github/depcheck/depcheck)

@@ -36,7 +35,7 @@ ## Installation

- [CoffeeScript](http://coffeescript.org/)
- [Typescript](http://www.typescriptlang.org/) (with `typescript` dependency)
- [SASS and SCSS](http://sass-lang.com/) (with `node-sass` dependency)
- [TypeScript](http://www.typescriptlang.org/) (with `typescript` dependency)
- [SASS and SCSS](http://sass-lang.com/)
- [Vue.js](https://vuejs.org/) (with `@vue/compiler-sfc` dependency)
To get the syntax support by external dependency, please install the corresponding package explicitly. For example, for Typescript user, install depcheck with `typescript` package:
To get the syntax support by external dependency, please install the corresponding package explicitly. For example, for TypeScript user, install depcheck with `typescript` package:

@@ -98,2 +97,4 @@ ```

`--quiet`: Suppress the "No depcheck issue" log. Useful in a monorepo with multiple packages to focus only on packages with issues.
`--help`: Show the help message.

@@ -107,3 +108,3 @@

Depcheck can be used with an rc configuration file. In order to do so, create a .depcheckrc file in your project's package.json folder, and set the CLI keys in YAML, JSON, and Javascript formats.
Depcheck can be used with an rc configuration file. In order to do so, create a .depcheckrc file in your project's package.json folder, and set the CLI keys in YAML, JSON, and JavaScript formats.
For example, the CLI arguments `--ignores="eslint,babel-*" --skip-missing=true` would turn into:

@@ -110,0 +111,0 @@

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc