Skip to content

Commit 9202a1b

Browse files
authored
Merge pull request #19516 from asgerf/js/npm-package-name-join
JS: More efficient nested package naming
2 parents cb59795 + 317e61d commit 9202a1b

File tree

3 files changed

+17
-15
lines changed

3 files changed

+17
-15
lines changed

javascript/ql/lib/semmle/javascript/NPM.qll

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,25 +22,27 @@ class PackageJson extends JsonObject {
2222
pragma[nomagic]
2323
string getDeclaredPackageName() { result = this.getPropStringValue("name") }
2424

25+
/**
26+
* Gets the nearest `package.json` file found in the parent directories, if any.
27+
*/
28+
PackageJson getEnclosingPackage() {
29+
result.getFolder() = packageInternalParent*(this.getFolder().getParentContainer())
30+
}
31+
2532
/**
2633
* Gets the name of this package.
2734
* If the package is located under the package `pkg1` and its relative path is `foo/bar`, then the resulting package name will be `pkg1/foo/bar`.
2835
*/
2936
string getPackageName() {
3037
result = this.getDeclaredPackageName()
3138
or
32-
exists(
33-
PackageJson parentPkg, Container currentDir, Container parentDir, string parentPkgName,
34-
string pkgNameDiff
35-
|
36-
currentDir = this.getJsonFile().getParentContainer() and
37-
parentDir = parentPkg.getJsonFile().getParentContainer() and
38-
parentPkgName = parentPkg.getPropStringValue("name") and
39-
parentDir.getAChildContainer+() = currentDir and
40-
pkgNameDiff = currentDir.getAbsolutePath().suffix(parentDir.getAbsolutePath().length()) and
41-
not exists(pkgNameDiff.indexOf("/node_modules/")) and
42-
result = parentPkgName + pkgNameDiff and
43-
not parentPkg.isPrivate()
39+
not exists(this.getDeclaredPackageName()) and
40+
exists(PackageJson parent |
41+
parent = this.getEnclosingPackage() and
42+
not parent.isPrivate() and
43+
result =
44+
parent.getDeclaredPackageName() +
45+
this.getFolder().getRelativePath().suffix(parent.getFolder().getRelativePath().length())
4446
)
4547
}
4648

@@ -405,5 +407,6 @@ class NpmPackage extends @folder {
405407
*/
406408
private Folder packageInternalParent(Container c) {
407409
result = c.getParentContainer() and
408-
not c.(Folder).getBaseName() = "node_modules"
410+
not c.(Folder).getBaseName() = "node_modules" and
411+
not c = any(PackageJson pkg).getFolder()
409412
}

javascript/ql/src/NodeJS/UnresolvableImport.ql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ where
3636
not exists(r.getImportedModule()) and
3737
// no enclosing NPM package declares a dependency on `mod`
3838
forex(NpmPackage pkg, PackageJson pkgJson |
39-
pkg.getAModule() = r.getTopLevel() and pkgJson = pkg.getPackageJson()
39+
pkg.getAModule() = r.getTopLevel() and pkgJson = pkg.getPackageJson().getEnclosingPackage*()
4040
|
4141
not pkgJson.declaresDependency(mod, _) and
4242
not pkgJson.getPeerDependencies().getADependency(mod, _) and

javascript/ql/test/library-tests/NPM/tests.expected

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ modules
3939
| src/node_modules/nested | nested | src/node_modules/nested/tst3.js:1:1:2:13 | <toplevel> |
4040
| src/node_modules/nested/node_modules/a | a | src/node_modules/nested/node_modules/a/index.js:1:1:1:25 | <toplevel> |
4141
| src/node_modules/parent-module | parent-module | src/node_modules/parent-module/main.js:1:1:2:0 | <toplevel> |
42-
| src/node_modules/parent-module | parent-module | src/node_modules/parent-module/sub-module/main.js:1:1:2:0 | <toplevel> |
4342
| src/node_modules/parent-module/sub-module | parent-module/sub-module | src/node_modules/parent-module/sub-module/main.js:1:1:2:0 | <toplevel> |
4443
| src/node_modules/third-party-module | third-party-module | src/node_modules/third-party-module/fancy.js:1:1:4:0 | <toplevel> |
4544
npm

0 commit comments

Comments
 (0)