Skip to content

Commit e95b359

Browse files
committed
JS: Fix project layout detection for Next.js apps
Some parts of the code did not handle case where 'pages' was located at 'app/pages'.
1 parent 613895e commit e95b359

File tree

1 file changed

+21
-3
lines changed
  • javascript/ql/lib/semmle/javascript/frameworks

1 file changed

+21
-3
lines changed

javascript/ql/lib/semmle/javascript/frameworks/Next.qll

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,31 @@ module NextJS {
1313
*/
1414
PackageJson getANextPackage() { result.getDependencies().getADependency("next", _) }
1515

16+
bindingset[base, name]
17+
pragma[inline_late]
18+
private Folder getOptionalFolder(Folder base, string name) {
19+
result = base.getFolder(name)
20+
or
21+
not exists(base.getFolder(name)) and
22+
result = base
23+
}
24+
25+
private Folder packageRoot() { result = getANextPackage().getFile().getParentContainer() }
26+
27+
private Folder srcRoot() { result = getOptionalFolder(packageRoot(), "src") }
28+
29+
private Folder appRoot() { result = srcRoot().getFolder("app") }
30+
31+
private Folder pagesRoot() { result = [srcRoot(), appRoot()].getFolder("pages") }
32+
33+
private Folder apiRoot() { result = [pagesRoot(), appRoot()].getFolder("api") }
34+
1635
/**
1736
* Gets a "pages" folder in a `Next.js` application.
1837
* JavaScript files inside these folders are mapped to routes.
1938
*/
2039
Folder getAPagesFolder() {
21-
result = getANextPackage().getFile().getParentContainer().getFolder("pages")
40+
result = pagesRoot()
2241
or
2342
result = getAPagesFolder().getAFolder()
2443
}
@@ -217,8 +236,7 @@ module NextJS {
217236
* the App Router (`app/api/`) Next.js 13+ structures.
218237
*/
219238
Folder apiFolder() {
220-
result =
221-
getANextPackage().getFile().getParentContainer().getFolder(["pages", "app"]).getFolder("api") or
239+
result = apiRoot() or
222240
result = apiFolder().getAFolder()
223241
}
224242

0 commit comments

Comments
 (0)