From 1402174ce6182f130178a9506f91b0a4c9fa6d21 Mon Sep 17 00:00:00 2001 From: Jacob Klapwijk Date: Fri, 18 Jun 2021 14:02:52 +0200 Subject: [PATCH 1/2] [Tests] add (failing) test for #2120 --- tests/files/node_modules/esm-package/esm-module/index.js | 0 .../files/node_modules/esm-package/esm-module/package.json | 4 ++++ tests/files/node_modules/esm-package/index.js | 0 tests/files/node_modules/esm-package/package.json | 5 +++++ tests/src/rules/no-extraneous-dependencies.js | 7 +++++++ 5 files changed, 16 insertions(+) create mode 100644 tests/files/node_modules/esm-package/esm-module/index.js create mode 100644 tests/files/node_modules/esm-package/esm-module/package.json create mode 100644 tests/files/node_modules/esm-package/index.js create mode 100644 tests/files/node_modules/esm-package/package.json diff --git a/tests/files/node_modules/esm-package/esm-module/index.js b/tests/files/node_modules/esm-package/esm-module/index.js new file mode 100644 index 000000000..e69de29bb diff --git a/tests/files/node_modules/esm-package/esm-module/package.json b/tests/files/node_modules/esm-package/esm-module/package.json new file mode 100644 index 000000000..0c58fec1b --- /dev/null +++ b/tests/files/node_modules/esm-package/esm-module/package.json @@ -0,0 +1,4 @@ +{ + "sideEffects": false, + "module": "./index.js" +} diff --git a/tests/files/node_modules/esm-package/index.js b/tests/files/node_modules/esm-package/index.js new file mode 100644 index 000000000..e69de29bb diff --git a/tests/files/node_modules/esm-package/package.json b/tests/files/node_modules/esm-package/package.json new file mode 100644 index 000000000..ddad1a531 --- /dev/null +++ b/tests/files/node_modules/esm-package/package.json @@ -0,0 +1,5 @@ +{ + "name": "esm-package", + "main": "index.js", + "version": "1.0.0" +} diff --git a/tests/src/rules/no-extraneous-dependencies.js b/tests/src/rules/no-extraneous-dependencies.js index 6bb84358a..d8f43ada6 100644 --- a/tests/src/rules/no-extraneous-dependencies.js +++ b/tests/src/rules/no-extraneous-dependencies.js @@ -154,6 +154,7 @@ ruleTester.run('no-extraneous-dependencies', rule, { test({ code: 'import "rxjs/operators"', }), + ], invalid: [ test({ @@ -358,6 +359,12 @@ ruleTester.run('no-extraneous-dependencies', rule, { message: `'not-a-dependency' should be listed in the project's dependencies. Run 'npm i -S not-a-dependency' to add it`, }], }), + test({ + code: 'import "esm-package/esm-module";', + errors: [{ + message: `'esm-package' should be listed in the project's dependencies. Run 'npm i -S esm-package' to add it`, + }], + }), ], }); From 5dc455848495d936e729487ef37ba5ae91245f34 Mon Sep 17 00:00:00 2001 From: jeromeh Date: Fri, 18 Jun 2021 14:04:09 +0200 Subject: [PATCH 2/2] [Fix] `no-extraneous-dependencies`: avoid crashing when an intermediate package.json lacks a name Fixes #2120. --- src/core/packagePath.js | 8 ++++++-- src/rules/no-extraneous-dependencies.js | 7 +++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/core/packagePath.js b/src/core/packagePath.js index e95b06666..315ec0918 100644 --- a/src/core/packagePath.js +++ b/src/core/packagePath.js @@ -13,6 +13,10 @@ export function getFilePackagePath(filePath) { } export function getFilePackageName(filePath) { - const { pkg } = readPkgUp.sync({ cwd: filePath, normalize: false }); - return pkg && pkg.name; + const { pkg, path } = readPkgUp.sync({ cwd: filePath, normalize: false }); + if (pkg) { + // recursion in case of intermediate esm package.json without name found + return pkg.name || getFilePackageName(dirname(dirname(path))); + } + return null; } diff --git a/src/rules/no-extraneous-dependencies.js b/src/rules/no-extraneous-dependencies.js index 8a6af2f61..1c7b61c6f 100644 --- a/src/rules/no-extraneous-dependencies.js +++ b/src/rules/no-extraneous-dependencies.js @@ -184,8 +184,15 @@ function reportIfMissing(context, deps, depsOptions, node, name) { // test the real name from the resolved package.json // if not aliased imports (alias/react for example), importPackageName can be misinterpreted const realPackageName = getModuleRealName(resolved); + + if(!realPackageName){ + throw new Error(`cant find real package name for import ${name}`); + } + const realPackageNameDeclaration = checkDependencyDeclaration(deps, realPackageName); + + if (realPackageNameDeclaration.isInDeps || (depsOptions.allowDevDeps && realPackageNameDeclaration.isInDevDeps) || (depsOptions.allowPeerDeps && realPackageNameDeclaration.isInPeerDeps) ||