dependency-cruiser
Version:
Validate and visualize dependencies. With your rules. JavaScript, TypeScript, CoffeeScript. ES6, CommonJS, AMD.
73 lines (69 loc) • 2.37 kB
JavaScript
import { simple as walk_simple, base as walk_base } from "acorn-walk";
import extractCommonJSDependencies from "./extract-cjs-deps.mjs";
import estreeHelpers from "./estree-helpers.mjs";
function extractRegularAMDDependencies(pNode, pDependencies) {
if (estreeHelpers.isLikelyAMDDefineOrRequire(pNode)) {
pNode.expression.arguments
.filter((pArgument) => pArgument.type === "ArrayExpression")
.forEach((pArgument) =>
pArgument.elements.forEach((pElement) => {
if (Boolean(pElement.value) && typeof pElement.value === "string") {
pDependencies.push({
module: pElement.value,
moduleSystem: "amd",
dynamic: false,
exoticallyRequired: false,
});
}
})
);
}
}
function extractCommonJSWrappers(pNode, pDependencies, pExoticRequireStrings) {
if (estreeHelpers.isLikelyAMDDefine(pNode)) {
pNode.expression.arguments
.filter(
(pArgument) =>
pArgument.type === "FunctionExpression" &&
pArgument.params.some(
(pParameter) =>
pParameter.name === "require" ||
pExoticRequireStrings.includes(pParameter.name)
)
)
.forEach((pFunction) =>
extractCommonJSDependencies(
pFunction.body,
pDependencies,
"amd",
pExoticRequireStrings
)
);
}
}
export default function extractAMDDependencies(
pAST,
pDependencies,
pExoticRequireStrings
) {
walk_simple(
pAST,
{
ExpressionStatement: (pNode) => {
// module as a function (define(Array, function))
// module with a name (define(string, Array, function))
// 'root' require module (require(Array, function)
extractRegularAMDDependencies(pNode, pDependencies);
// CommonJS-wrappers:
// (define(function(require, exports, module){
// define(["require", ...], function(require, ...){
// ... every 'require' call is a depencency
// Won't work if someone decides to name the first parameter of
// the function passed to the define something else from "require"
extractCommonJSWrappers(pNode, pDependencies, pExoticRequireStrings);
},
},
// see https://github.com/acornjs/acorn/issues/746
walk_base
);
}