Skip to content

Commit 08fa158

Browse files
authored
feat(scanner): add node dependencies extractor probe (#446)
1 parent 53df5b6 commit 08fa158

File tree

5 files changed

+70
-0
lines changed

5 files changed

+70
-0
lines changed

.changeset/large-tools-peel.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@nodesecure/scanner": minor
3+
---
4+
5+
feat(extractors): add node dependencies extractor

workspaces/scanner/docs/extractors.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ Available probes include:
3838
| Vulnerabilities | packument |
3939
| Warnings | manifest |
4040
| Extentions | manifest |
41+
| NodeDependencies | manifest |
4142

4243
All probes follow the same `ProbeExtractor` interface, which acts as an iterator-like contract:
4344

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
2+
// Import Internal Dependencies
3+
import type {
4+
ManifestProbeExtractor
5+
} from "../payload.js";
6+
import type { DependencyVersion } from "../../types.js";
7+
8+
export type NodeDependenciesResult = {
9+
nodeDeps: string[];
10+
};
11+
12+
export class NodeDependencies implements ManifestProbeExtractor<NodeDependenciesResult> {
13+
level = "manifest" as const;
14+
15+
#nodeDeps = new Set<string>();
16+
17+
next(
18+
_: string,
19+
version: DependencyVersion
20+
) {
21+
const { composition } = version;
22+
23+
composition.required_nodejs.forEach((dep) => {
24+
this.#nodeDeps.add(dep);
25+
});
26+
}
27+
28+
done() {
29+
return {
30+
nodeDeps: [...this.#nodeDeps]
31+
};
32+
}
33+
}

workspaces/scanner/src/extractors/probes/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ export * from "./WarningsExtractor.class.js";
55
export * from "./VulnerabilitiesExtractor.class.js";
66
export * from "./FlagsExtractor.class.js";
77
export * from "./ExtensionsExtractor.class.js";
8+
export * from "./NodeDependenciesExtractor.class.js";

workspaces/scanner/test/extractors/payload.spec.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,4 +416,34 @@ describe("Extractors.Callbacks", () => {
416416
});
417417
});
418418
});
419+
420+
describe("NodeDependencies", () => {
421+
const extractor = new Extractors.Payload(
422+
expressNodesecurePayload,
423+
[
424+
new Extractors.Probes.NodeDependencies()
425+
]
426+
);
427+
428+
const { nodeDeps } = extractor.extractAndMerge();
429+
430+
assert.deepEqual(nodeDeps.sort(), [
431+
"stream",
432+
"tty",
433+
"util",
434+
"fs",
435+
"net",
436+
"crypto",
437+
"assert",
438+
"http",
439+
"path",
440+
"buffer",
441+
"url",
442+
"async_hooks",
443+
"events",
444+
"zlib",
445+
"string_decoder",
446+
"querystring"
447+
].sort());
448+
});
419449
});

0 commit comments

Comments
 (0)