in doc-architect/doc-architect-core/src/main/java/com/docarchitect/core/scanner/impl/javascript/ExpressScanner.java [122:176]
public ScanResult scan(ScanContext context) {
log.info("Scanning Express.js API endpoints in: {}", context.rootPath());
List<ApiEndpoint> apiEndpoints = new ArrayList<>();
ScanStatistics.Builder statsBuilder = new ScanStatistics.Builder();
// Find all JavaScript and TypeScript files
List<Path> jsFiles = context.findFiles(JS_GLOB).toList();
List<Path> tsFiles = context.findFiles(TS_GLOB).toList();
List<Path> allFiles = new ArrayList<>();
allFiles.addAll(jsFiles);
allFiles.addAll(tsFiles);
statsBuilder.filesDiscovered(allFiles.size());
if (allFiles.isEmpty()) {
log.warn("No JavaScript or TypeScript files found in project");
return emptyResult();
}
for (Path file : allFiles) {
if (!shouldScanFile(file)) {
continue;
}
statsBuilder.incrementFilesScanned();
// Use three-tier parsing with fallback
FileParseResult<ApiEndpoint> result = parseWithFallback(
file,
routes -> extractEndpointsFromAST(file, routes),
createFallbackStrategy(),
statsBuilder
);
if (result.isSuccess()) {
apiEndpoints.addAll(result.getData());
}
}
ScanStatistics statistics = statsBuilder.build();
log.info("Found {} Express.js API endpoints (success rate: {:.1f}%, overall parse rate: {:.1f}%)",
apiEndpoints.size(), statistics.getSuccessRate(), statistics.getOverallParseRate());
return buildSuccessResult(
List.of(), // No components
List.of(), // No dependencies
apiEndpoints,
List.of(), // No message flows
List.of(), // No data entities
List.of(), // No relationships
List.of(), // No warnings
statistics
);
}