Skip to content

Commit f353af1

Browse files
committed
JS: Move package main-guessing into PackageJsonEx.qll
1 parent 4db697d commit f353af1

2 files changed

Lines changed: 47 additions & 39 deletions

File tree

javascript/ql/lib/semmle/javascript/internal/paths/PackageJsonEx.qll

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,17 @@ class PackageJsonEx extends PackageJson {
5252
)
5353
}
5454

55+
File getMainFileOrBestGuess() {
56+
result = this.getMainFile()
57+
or
58+
not exists(this.getMainFile()) and
59+
(
60+
result = guessPackageJsonMain1(this)
61+
or
62+
result = guessPackageJsonMain2(this)
63+
)
64+
}
65+
5566
string getAPathInFilesArray() {
5667
result = this.getPropValue("files").(JsonArray).getElementStringValue(_)
5768
}
@@ -83,3 +94,35 @@ private module ResolverConfig implements Folder::ResolveSig {
8394
}
8495

8596
private module Resolver = Folder::Resolve<ResolverConfig>;
97+
98+
/**
99+
* Removes the scope from a package name, e.g. `@foo/bar` -> `bar`.
100+
*/
101+
bindingset[name]
102+
private string stripPackageScope(string name) { result = name.regexpReplaceAll("^@[^/]+/", "") }
103+
104+
private File guessPackageJsonMain1(PackageJsonEx pkg) {
105+
not exists(pkg.getMainFile()) and
106+
exists(Folder folder, Folder subfolder |
107+
folder = pkg.getFolder() and
108+
(
109+
subfolder = folder or
110+
subfolder = folder.getChildContainer(getASrcFolderName()) or
111+
subfolder =
112+
folder
113+
.getChildContainer(getASrcFolderName())
114+
.(Folder)
115+
.getChildContainer(getASrcFolderName())
116+
)
117+
|
118+
result = subfolder.getJavaScriptFileOrTypings("index")
119+
or
120+
result = subfolder.getJavaScriptFileOrTypings(stripPackageScope(pkg.getDeclaredPackageName()))
121+
)
122+
}
123+
124+
private File guessPackageJsonMain2(PackageJsonEx pkg) {
125+
not exists(pkg.getMainFile()) and
126+
not exists(guessPackageJsonMain1(pkg)) and
127+
result = pkg.getAFileInFilesArray()
128+
}

javascript/ql/lib/semmle/javascript/internal/paths/PathExprResolver.qll

Lines changed: 4 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -164,49 +164,14 @@ private Container resolvePathExpr1(RelevantPathExpr expr) {
164164
)
165165
}
166166

167-
/**
168-
* Removes the scope from a package name, e.g. `@foo/bar` -> `bar`.
169-
*/
170-
bindingset[name]
171-
private string stripPackageScope(string name) { result = name.regexpReplaceAll("^@[^/]+/", "") }
172-
173-
private File guessPackageJsonMain1(PackageJsonEx pkg) {
174-
not exists(pkg.getMainFile()) and
175-
exists(Folder folder, Folder subfolder |
176-
folder = pkg.getFolder() and
177-
(
178-
subfolder = folder or
179-
subfolder = folder.getChildContainer(getASrcFolderName()) or
180-
subfolder =
181-
folder
182-
.getChildContainer(getASrcFolderName())
183-
.(Folder)
184-
.getChildContainer(getASrcFolderName())
185-
)
186-
|
187-
result = subfolder.getJavaScriptFileOrTypings("index")
188-
or
189-
result = subfolder.getJavaScriptFileOrTypings(stripPackageScope(pkg.getDeclaredPackageName()))
190-
)
191-
}
192-
193-
private File guessPackageJsonMain2(PackageJsonEx pkg) {
194-
not exists(pkg.getMainFile()) and
195-
not exists(guessPackageJsonMain1(pkg)) and
196-
result = pkg.getAFileInFilesArray()
197-
}
198-
199-
private File getFileFromFolderImport(Folder folder) {
167+
File getFileFromFolderImport(Folder folder) {
200168
result = folder.getJavaScriptFileOrTypings("index")
201169
or
202170
// Note that unlike "exports" paths, "main" and "module" also take effect when the package
203171
// is imported via a relative path, e.g. `require("..")` targeting a folder with a package.json file.
204-
exists(PackageJsonEx pkg | pkg.getFolder() = folder |
205-
result = pkg.getMainFile()
206-
or
207-
result = guessPackageJsonMain1(pkg)
208-
or
209-
result = guessPackageJsonMain2(pkg)
172+
exists(PackageJsonEx pkg |
173+
pkg.getFolder() = folder and
174+
result = pkg.getMainFileOrBestGuess()
210175
)
211176
}
212177

0 commit comments

Comments
 (0)