Skip to content

Commit

Permalink
fix: skip exports of local variables / constants
Browse files Browse the repository at this point in the history
  • Loading branch information
adrians5j committed Oct 13, 2019
1 parent 9f8e9c1 commit d7e8ca5
Show file tree
Hide file tree
Showing 7 changed files with 66 additions and 58 deletions.
3 changes: 1 addition & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@
"dependencies": {
"@babel/parser": "^7.6.4",
"cosmiconfig": "^5.2.0",
"lodash.get": "^4.4.2",
"relative-require-regex": "^1.0.1",
"require-package-name": "^2.0.1",
"yargs": "^14.0.0"
Expand Down
2 changes: 1 addition & 1 deletion src/Adio.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ const cosmiconfig = require("cosmiconfig");
const fs = require("fs");
const explorer = cosmiconfig("adio");
const { extractDepsFromPackageJson, isIgnoredDep } = require("./utils/testPackage");
const { extractSrcDeps } = require("./utils/extractSrcDeps");
const extractSrcDeps = require("./utils/extractSrcDeps");

class Adio {
constructor(config) {
Expand Down
1 change: 1 addition & 0 deletions src/__tests__/mocks/multiple.imports.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,5 @@ export default `
import withId from "@commodo/fields-storage/utils/withId";
export * from "repropose";
export { default as testDefaultExport } from "testing-default-exports-pckg";
export const resolveGetSettings = () => {};
`;
6 changes: 3 additions & 3 deletions src/__tests__/parser.test.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { extractImportsRequires } from "adio/utils/extractSrcDeps";
import parse from "adio/utils/parse";
import mockImports from "./mocks/multiple.imports";
import mockRequires from "./mocks/multiple.requires";

test("must correctly return all imported packages", () => {
const packages = extractImportsRequires(mockImports);
const packages = parse({ src: mockImports });

expect(packages).toEqual([
"react",
Expand All @@ -18,7 +18,7 @@ test("must correctly return all imported packages", () => {
});

test("must correctly return all required packages", () => {
const packages = extractImportsRequires(mockRequires);
const packages = parse({ src: mockRequires });

expect(packages).toEqual([
"react",
Expand Down
71 changes: 19 additions & 52 deletions src/utils/extractSrcDeps.js
Original file line number Diff line number Diff line change
@@ -1,66 +1,29 @@
const glob = require("glob");
const fs = require("fs");
const parser = require("@babel/parser");
const { default: traverse } = require("@babel/traverse");
const name = require("require-package-name");
const relative = require("relative-require-regex");
const isRelative = value => relative().test(value);

const STD_NODE_TYPES = ["ImportDeclaration", "ExportNamedDeclaration", "ExportAllDeclaration"];

const extractImportsRequires = source => {
const ast = parser.parse(source, {
sourceType: "module"
});

const imports = {};
traverse(ast, {
enter(path) {
const { node } = path;
if (STD_NODE_TYPES.includes(node.type)) {
let { value } = node.source;
if (!isRelative(value)) {
imports[name(value)] = true;
}
}

if (node.type === "CallExpression") {
if (node.callee.name === "require") {
let { value } = node.arguments[0];
if (!isRelative(value)) {
imports[name(value)] = true;
}
}
}
}
});

return Object.keys(imports);
};
const get = require("lodash.get");
const parse = require("./parse");

const isIgnoredPath = ({ path, instance, adioRc }) => {
let dirs = instance.config.ignoreDirs || [];
let dirs = get(instance, "config.ignoreDirs") || [];
for (let i = 0; i < dirs.length; i++) {
let dir = dirs[i];
if (path.includes(dir)) {
return true;
}
}

if (adioRc) {
dirs = adioRc.ignoreDirs || [];
for (let i = 0; i < dirs.length; i++) {
let dir = dirs[i];
if (path.includes(dir)) {
return true;
}
dirs = get(adioRc, "ignoreDirs") || [];
for (let i = 0; i < dirs.length; i++) {
let dir = dirs[i];
if (path.includes(dir)) {
return true;
}
}

return false;
};

const extractSrcDeps = ({ dir, instance, adioRc }) => {
module.exports = ({ dir, instance, adioRc }) => {
const paths = glob.sync(dir + "/**/*.js");
const deps = [];
paths.forEach(path => {
Expand All @@ -69,7 +32,16 @@ const extractSrcDeps = ({ dir, instance, adioRc }) => {
}

const src = fs.readFileSync(path, "utf8");
const importsRequires = extractImportsRequires(src);
const importsRequires = parse({
src,
config: {
parser: {
...get(instance, "config.parser", {}),
...get(adioRc, "parser", {})
}
}
});

importsRequires.forEach(name => {
// is relative import?
if (!name || name.startsWith(".")) {
Expand All @@ -87,8 +59,3 @@ const extractSrcDeps = ({ dir, instance, adioRc }) => {

return deps;
};

module.exports = {
extractSrcDeps,
extractImportsRequires
};
40 changes: 40 additions & 0 deletions src/utils/parse.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
const parser = require("@babel/parser");
const { default: traverse } = require("@babel/traverse");
const name = require("require-package-name");
const relative = require("relative-require-regex");
const isRelative = value => relative().test(value);
const get = require("lodash.get");

const STD_NODE_TYPES = ["ImportDeclaration", "ExportNamedDeclaration", "ExportAllDeclaration"];

module.exports = ({ src, config = {} }) => {
const ast = parser.parse(src, {
sourceType: "module",
...config.parser
});

const imports = {};
traverse(ast, {
enter(path) {
const { node } = path;
if (STD_NODE_TYPES.includes(node.type)) {
const value = get(node, "source.value");
if (value && !isRelative(value)) {
imports[name(value)] = true;
}
return;
}

if (node.type === "CallExpression") {
if (get(node, "callee.name") === "require") {
let value = get(node, "arguments.0.value");
if (value && !isRelative(value)) {
imports[name(value)] = true;
}
}
}
}
});

return Object.keys(imports);
};

0 comments on commit d7e8ca5

Please sign in to comment.