diff --git a/src/analyze.ts b/src/analyze.ts index edf2b536..1b63ebd6 100644 --- a/src/analyze.ts +++ b/src/analyze.ts @@ -1169,9 +1169,33 @@ export default async function analyze( return; } if (wildcardIndex !== -1 && stats.isFile()) return; + // do not emit assets outside the package boundary if inside node_modules + if (pkgBase) { + const nodeModulesBase = + id.substring(0, id.indexOf(path.sep + 'node_modules')) + + path.sep + + 'node_modules' + + path.sep; + if (!assetPath.startsWith(nodeModulesBase)) { + if (job.log) + console.log( + 'Skipping asset emission of ' + + assetPath + + ' for ' + + id + + ' as it is outside the package base ' + + pkgBase, + ); + return; + } + } if (stats.isFile()) { + // do not emit file assets outside job.base + if (job.ignoreFn(path.relative(job.base, assetPath))) return; assets.add(assetPath); } else if (stats.isDirectory()) { + // do not emit directory assets outside job.base + if (job.ignoreFn(path.relative(job.base, assetPath))) return; if (validWildcard(assetPath)) emitAssetDirectory(assetPath); } } diff --git a/src/utils/ast-helpers.ts b/src/utils/ast-helpers.ts index 895e8224..f28417a2 100644 --- a/src/utils/ast-helpers.ts +++ b/src/utils/ast-helpers.ts @@ -22,7 +22,7 @@ export function isIdentifierRead(node: Node, parent: Node) { return parent.id !== node; // disregard the `bar` in `export { foo as bar }` case 'ExportSpecifier': - return false; + return node.name === parent.exported.name; // disregard the `bar` in `function (bar) {}` case 'FunctionExpression': case 'FunctionDeclaration': diff --git a/test/unit/pkg-dir-outside-base/.gitignore b/test/unit/pkg-dir-outside-base/.gitignore new file mode 100644 index 00000000..34a75639 --- /dev/null +++ b/test/unit/pkg-dir-outside-base/.gitignore @@ -0,0 +1 @@ +!node_modules diff --git a/test/unit/pkg-dir-outside-base/input.js b/test/unit/pkg-dir-outside-base/input.js new file mode 100644 index 00000000..878bb5e0 --- /dev/null +++ b/test/unit/pkg-dir-outside-base/input.js @@ -0,0 +1 @@ +require('some-pkg'); diff --git a/test/unit/pkg-dir-outside-base/node_modules/some-pkg/index.js b/test/unit/pkg-dir-outside-base/node_modules/some-pkg/index.js new file mode 100644 index 00000000..a1fea6bb --- /dev/null +++ b/test/unit/pkg-dir-outside-base/node_modules/some-pkg/index.js @@ -0,0 +1,3 @@ +const s = '/../../secret-dir'; + +export { s }; diff --git a/test/unit/pkg-dir-outside-base/node_modules/some-pkg/package.json b/test/unit/pkg-dir-outside-base/node_modules/some-pkg/package.json new file mode 100644 index 00000000..d234a264 --- /dev/null +++ b/test/unit/pkg-dir-outside-base/node_modules/some-pkg/package.json @@ -0,0 +1,5 @@ +{ + "name": "some-pkg", + "version": "1.0.0", + "main": "index.js" +} diff --git a/test/unit/pkg-dir-outside-base/output.js b/test/unit/pkg-dir-outside-base/output.js new file mode 100644 index 00000000..460f1dbe --- /dev/null +++ b/test/unit/pkg-dir-outside-base/output.js @@ -0,0 +1,6 @@ +[ + "package.json", + "test/unit/pkg-dir-outside-base/input.js", + "test/unit/pkg-dir-outside-base/node_modules/some-pkg/index.js", + "test/unit/pkg-dir-outside-base/node_modules/some-pkg/package.json" +] diff --git a/test/unit/pkg-dir-outside-base/secret-dir/secret.txt b/test/unit/pkg-dir-outside-base/secret-dir/secret.txt new file mode 100644 index 00000000..d97c5ead --- /dev/null +++ b/test/unit/pkg-dir-outside-base/secret-dir/secret.txt @@ -0,0 +1 @@ +secret diff --git a/test/unit/pkg-file-outside-base/.gitignore b/test/unit/pkg-file-outside-base/.gitignore new file mode 100644 index 00000000..34a75639 --- /dev/null +++ b/test/unit/pkg-file-outside-base/.gitignore @@ -0,0 +1 @@ +!node_modules diff --git a/test/unit/pkg-file-outside-base/input.js b/test/unit/pkg-file-outside-base/input.js new file mode 100644 index 00000000..878bb5e0 --- /dev/null +++ b/test/unit/pkg-file-outside-base/input.js @@ -0,0 +1 @@ +require('some-pkg'); diff --git a/test/unit/pkg-file-outside-base/node_modules/some-pkg/index.js b/test/unit/pkg-file-outside-base/node_modules/some-pkg/index.js new file mode 100644 index 00000000..2cb4abc8 --- /dev/null +++ b/test/unit/pkg-file-outside-base/node_modules/some-pkg/index.js @@ -0,0 +1,3 @@ +const s = '/../../secret.txt'; + +export { s }; diff --git a/test/unit/pkg-file-outside-base/node_modules/some-pkg/package.json b/test/unit/pkg-file-outside-base/node_modules/some-pkg/package.json new file mode 100644 index 00000000..d234a264 --- /dev/null +++ b/test/unit/pkg-file-outside-base/node_modules/some-pkg/package.json @@ -0,0 +1,5 @@ +{ + "name": "some-pkg", + "version": "1.0.0", + "main": "index.js" +} diff --git a/test/unit/pkg-file-outside-base/output.js b/test/unit/pkg-file-outside-base/output.js new file mode 100644 index 00000000..f89e6308 --- /dev/null +++ b/test/unit/pkg-file-outside-base/output.js @@ -0,0 +1,6 @@ +[ + "package.json", + "test/unit/pkg-file-outside-base/input.js", + "test/unit/pkg-file-outside-base/node_modules/some-pkg/index.js", + "test/unit/pkg-file-outside-base/node_modules/some-pkg/package.json" +] diff --git a/test/unit/pkg-file-outside-base/secret.txt b/test/unit/pkg-file-outside-base/secret.txt new file mode 100644 index 00000000..4e7e76d9 --- /dev/null +++ b/test/unit/pkg-file-outside-base/secret.txt @@ -0,0 +1 @@ +secret content