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'.
This commit is contained in:
Asger F
2025-11-25 15:54:45 +01:00
parent 613895e0c0
commit e95b3590f0

View File

@@ -13,12 +13,31 @@ module NextJS {
*/ */
PackageJson getANextPackage() { result.getDependencies().getADependency("next", _) } PackageJson getANextPackage() { result.getDependencies().getADependency("next", _) }
bindingset[base, name]
pragma[inline_late]
private Folder getOptionalFolder(Folder base, string name) {
result = base.getFolder(name)
or
not exists(base.getFolder(name)) and
result = base
}
private Folder packageRoot() { result = getANextPackage().getFile().getParentContainer() }
private Folder srcRoot() { result = getOptionalFolder(packageRoot(), "src") }
private Folder appRoot() { result = srcRoot().getFolder("app") }
private Folder pagesRoot() { result = [srcRoot(), appRoot()].getFolder("pages") }
private Folder apiRoot() { result = [pagesRoot(), appRoot()].getFolder("api") }
/** /**
* Gets a "pages" folder in a `Next.js` application. * Gets a "pages" folder in a `Next.js` application.
* JavaScript files inside these folders are mapped to routes. * JavaScript files inside these folders are mapped to routes.
*/ */
Folder getAPagesFolder() { Folder getAPagesFolder() {
result = getANextPackage().getFile().getParentContainer().getFolder("pages") result = pagesRoot()
or or
result = getAPagesFolder().getAFolder() result = getAPagesFolder().getAFolder()
} }
@@ -217,8 +236,7 @@ module NextJS {
* the App Router (`app/api/`) Next.js 13+ structures. * the App Router (`app/api/`) Next.js 13+ structures.
*/ */
Folder apiFolder() { Folder apiFolder() {
result = result = apiRoot() or
getANextPackage().getFile().getParentContainer().getFolder(["pages", "app"]).getFolder("api") or
result = apiFolder().getAFolder() result = apiFolder().getAFolder()
} }