postquant 0.4.2 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +45 -27
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +18 -23
- package/dist/commands/analyze.js.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/output/cbom.d.ts.map +1 -1
- package/dist/output/cbom.js +1 -13
- package/dist/output/cbom.js.map +1 -1
- package/dist/output/json-code.d.ts.map +1 -1
- package/dist/output/json-code.js +2 -13
- package/dist/output/json-code.js.map +1 -1
- package/dist/output/json.d.ts.map +1 -1
- package/dist/output/json.js +2 -13
- package/dist/output/json.js.map +1 -1
- package/dist/output/sarif.d.ts.map +1 -1
- package/dist/output/sarif.js +1 -13
- package/dist/output/sarif.js.map +1 -1
- package/dist/output/terminal-code.d.ts.map +1 -1
- package/dist/output/terminal-code.js +6 -13
- package/dist/output/terminal-code.js.map +1 -1
- package/dist/output/terminal.d.ts.map +1 -1
- package/dist/output/terminal.js +6 -13
- package/dist/output/terminal.js.map +1 -1
- package/dist/scanner/code/ast/analyzer.d.ts +8 -0
- package/dist/scanner/code/ast/analyzer.d.ts.map +1 -0
- package/dist/scanner/code/ast/analyzer.js +117 -0
- package/dist/scanner/code/ast/analyzer.js.map +1 -0
- package/dist/scanner/code/ast/import-resolver.d.ts +13 -0
- package/dist/scanner/code/ast/import-resolver.d.ts.map +1 -0
- package/dist/scanner/code/ast/import-resolver.js +198 -0
- package/dist/scanner/code/ast/import-resolver.js.map +1 -0
- package/dist/scanner/code/ast/merge.d.ts +11 -0
- package/dist/scanner/code/ast/merge.d.ts.map +1 -0
- package/dist/scanner/code/ast/merge.js +50 -0
- package/dist/scanner/code/ast/merge.js.map +1 -0
- package/dist/scanner/code/ast/parser.d.ts +9 -0
- package/dist/scanner/code/ast/parser.d.ts.map +1 -0
- package/dist/scanner/code/ast/parser.js +58 -0
- package/dist/scanner/code/ast/parser.js.map +1 -0
- package/dist/scanner/code/ast/patterns/index.d.ts +5 -0
- package/dist/scanner/code/ast/patterns/index.d.ts.map +1 -0
- package/dist/scanner/code/ast/patterns/index.js +13 -0
- package/dist/scanner/code/ast/patterns/index.js.map +1 -0
- package/dist/scanner/code/ast/patterns/javascript.d.ts +3 -0
- package/dist/scanner/code/ast/patterns/javascript.d.ts.map +1 -0
- package/dist/scanner/code/ast/patterns/javascript.js +113 -0
- package/dist/scanner/code/ast/patterns/javascript.js.map +1 -0
- package/dist/scanner/code/ast/patterns/python.d.ts +3 -0
- package/dist/scanner/code/ast/patterns/python.d.ts.map +1 -0
- package/dist/scanner/code/ast/patterns/python.js +165 -0
- package/dist/scanner/code/ast/patterns/python.js.map +1 -0
- package/dist/scanner/code/ast/patterns/types.d.ts +23 -0
- package/dist/scanner/code/ast/patterns/types.d.ts.map +1 -0
- package/dist/scanner/code/ast/patterns/types.js +2 -0
- package/dist/scanner/code/ast/patterns/types.js.map +1 -0
- package/dist/scanner/code/ast/scope-detector.d.ts +8 -0
- package/dist/scanner/code/ast/scope-detector.d.ts.map +1 -0
- package/dist/scanner/code/ast/scope-detector.js +116 -0
- package/dist/scanner/code/ast/scope-detector.js.map +1 -0
- package/dist/scanner/code/ast/variable-resolver.d.ts +11 -0
- package/dist/scanner/code/ast/variable-resolver.d.ts.map +1 -0
- package/dist/scanner/code/ast/variable-resolver.js +115 -0
- package/dist/scanner/code/ast/variable-resolver.js.map +1 -0
- package/dist/scanner/code/discovery.d.ts +2 -0
- package/dist/scanner/code/discovery.d.ts.map +1 -1
- package/dist/scanner/code/discovery.js +8 -1
- package/dist/scanner/code/discovery.js.map +1 -1
- package/dist/scanner/code/grader.d.ts.map +1 -1
- package/dist/scanner/code/grader.js +2 -0
- package/dist/scanner/code/grader.js.map +1 -1
- package/dist/scanner/code/matcher.js +14 -4
- package/dist/scanner/code/matcher.js.map +1 -1
- package/dist/scanner/code/patterns/c.d.ts +3 -0
- package/dist/scanner/code/patterns/c.d.ts.map +1 -0
- package/dist/scanner/code/patterns/c.js +359 -0
- package/dist/scanner/code/patterns/c.js.map +1 -0
- package/dist/scanner/code/patterns/go.d.ts.map +1 -1
- package/dist/scanner/code/patterns/go.js +54 -0
- package/dist/scanner/code/patterns/go.js.map +1 -1
- package/dist/scanner/code/patterns/index.d.ts +3 -1
- package/dist/scanner/code/patterns/index.d.ts.map +1 -1
- package/dist/scanner/code/patterns/index.js +5 -1
- package/dist/scanner/code/patterns/index.js.map +1 -1
- package/dist/scanner/code/patterns/java.d.ts.map +1 -1
- package/dist/scanner/code/patterns/java.js +46 -0
- package/dist/scanner/code/patterns/java.js.map +1 -1
- package/dist/scanner/code/patterns/javascript.d.ts.map +1 -1
- package/dist/scanner/code/patterns/javascript.js +58 -0
- package/dist/scanner/code/patterns/javascript.js.map +1 -1
- package/dist/scanner/code/patterns/python.d.ts.map +1 -1
- package/dist/scanner/code/patterns/python.js +59 -0
- package/dist/scanner/code/patterns/python.js.map +1 -1
- package/dist/scanner/code/patterns/rust.d.ts +3 -0
- package/dist/scanner/code/patterns/rust.d.ts.map +1 -0
- package/dist/scanner/code/patterns/rust.js +246 -0
- package/dist/scanner/code/patterns/rust.js.map +1 -0
- package/dist/scanner/code/risk-assessor.d.ts.map +1 -1
- package/dist/scanner/code/risk-assessor.js +37 -0
- package/dist/scanner/code/risk-assessor.js.map +1 -1
- package/dist/scanner/grader.d.ts.map +1 -1
- package/dist/scanner/grader.js +2 -0
- package/dist/scanner/grader.js.map +1 -1
- package/dist/types/index.d.ts +22 -4
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/utils/version.d.ts +2 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +19 -0
- package/dist/utils/version.js.map +1 -0
- package/grammars/tree-sitter-python.wasm +0 -0
- package/grammars/tree-sitter-typescript.wasm +0 -0
- package/package.json +4 -2
package/dist/output/terminal.js
CHANGED
|
@@ -1,17 +1,5 @@
|
|
|
1
|
-
import { readFileSync } from 'node:fs';
|
|
2
|
-
import { fileURLToPath } from 'node:url';
|
|
3
|
-
import { dirname, join } from 'node:path';
|
|
4
1
|
import chalk from 'chalk';
|
|
5
|
-
|
|
6
|
-
try {
|
|
7
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
8
|
-
const pkg = JSON.parse(readFileSync(join(__dirname, '..', '..', 'package.json'), 'utf-8'));
|
|
9
|
-
return pkg.version;
|
|
10
|
-
}
|
|
11
|
-
catch {
|
|
12
|
-
return '0.2.0';
|
|
13
|
-
}
|
|
14
|
-
}
|
|
2
|
+
import { getVersion } from '../utils/version.js';
|
|
15
3
|
function riskIcon(risk) {
|
|
16
4
|
switch (risk) {
|
|
17
5
|
case 'critical':
|
|
@@ -50,6 +38,11 @@ export function formatTerminal(result) {
|
|
|
50
38
|
lines.push('');
|
|
51
39
|
lines.push(` Overall Grade: ${gradeColor(result.grade)}`);
|
|
52
40
|
lines.push('');
|
|
41
|
+
const pqcLabel = result.pqcDetected
|
|
42
|
+
? chalk.green('Detected')
|
|
43
|
+
: chalk.dim('Not detected');
|
|
44
|
+
lines.push(` PQC Readiness: ${pqcLabel}`);
|
|
45
|
+
lines.push('');
|
|
53
46
|
const certFinding = result.findings.find((f) => f.component === 'certificate');
|
|
54
47
|
if (certFinding) {
|
|
55
48
|
lines.push(' Certificate');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/output/terminal.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/output/terminal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { CodeFinding, Language } from '../../../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Analyze source code using tree-sitter AST.
|
|
4
|
+
* Returns CodeFinding[] with confidence='verified' and scope info.
|
|
5
|
+
* Returns empty array for unsupported languages or on any error.
|
|
6
|
+
*/
|
|
7
|
+
export declare function astAnalyze(content: string, language: Language, fileName: string): Promise<CodeFinding[]>;
|
|
8
|
+
//# sourceMappingURL=analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../../../../src/scanner/code/ast/analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AASrE;;;;GAIG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,WAAW,EAAE,CAAC,CAwFxB"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { getParser, getLanguage, hasASTSupport } from './parser.js';
|
|
2
|
+
import { resolveImports } from './import-resolver.js';
|
|
3
|
+
import { resolveVariables } from './variable-resolver.js';
|
|
4
|
+
import { detectScope } from './scope-detector.js';
|
|
5
|
+
import { getASTPatterns, hasASTPatterns } from './patterns/index.js';
|
|
6
|
+
import { Query } from 'web-tree-sitter';
|
|
7
|
+
/**
|
|
8
|
+
* Analyze source code using tree-sitter AST.
|
|
9
|
+
* Returns CodeFinding[] with confidence='verified' and scope info.
|
|
10
|
+
* Returns empty array for unsupported languages or on any error.
|
|
11
|
+
*/
|
|
12
|
+
export async function astAnalyze(content, language, fileName) {
|
|
13
|
+
if (!hasASTSupport(language) || !hasASTPatterns(language)) {
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
try {
|
|
17
|
+
const parser = await getParser();
|
|
18
|
+
const lang = await getLanguage(language);
|
|
19
|
+
if (!lang)
|
|
20
|
+
return [];
|
|
21
|
+
parser.setLanguage(lang);
|
|
22
|
+
const tree = parser.parse(content);
|
|
23
|
+
if (!tree)
|
|
24
|
+
return [];
|
|
25
|
+
const astLang = language;
|
|
26
|
+
const imports = resolveImports(tree, astLang);
|
|
27
|
+
const variables = resolveVariables(tree, astLang);
|
|
28
|
+
const patterns = getASTPatterns(language);
|
|
29
|
+
const lines = content.split('\n');
|
|
30
|
+
const findings = [];
|
|
31
|
+
for (const pattern of patterns) {
|
|
32
|
+
let query;
|
|
33
|
+
try {
|
|
34
|
+
query = new Query(lang, pattern.query);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
continue; // Skip patterns with invalid queries
|
|
38
|
+
}
|
|
39
|
+
const matches = query.matches(tree.rootNode);
|
|
40
|
+
for (const match of matches) {
|
|
41
|
+
const captures = new Map();
|
|
42
|
+
for (const capture of match.captures) {
|
|
43
|
+
captures.set(capture.name, capture.node);
|
|
44
|
+
}
|
|
45
|
+
// Check method name constraint
|
|
46
|
+
if (pattern.methodNames) {
|
|
47
|
+
const methodNode = captures.get('method');
|
|
48
|
+
if (!methodNode || !pattern.methodNames.includes(methodNode.text))
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
// Check import constraint
|
|
52
|
+
if (pattern.requiredImports && pattern.requiredImports.length > 0) {
|
|
53
|
+
const objNode = captures.get('obj');
|
|
54
|
+
if (!objNode || !matchesImportConstraint(objNode.text, pattern, imports))
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
// Check first argument pattern
|
|
58
|
+
if (pattern.firstArgPattern) {
|
|
59
|
+
const argsNode = captures.get('args');
|
|
60
|
+
if (!argsNode)
|
|
61
|
+
continue;
|
|
62
|
+
const firstArg = getFirstArgText(argsNode);
|
|
63
|
+
if (!firstArg || !pattern.firstArgPattern.test(firstArg))
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
// Determine line from the call site
|
|
67
|
+
const callNode = captures.get('method') ?? captures.get('obj');
|
|
68
|
+
if (!callNode)
|
|
69
|
+
continue;
|
|
70
|
+
const line = callNode.startPosition.row + 1;
|
|
71
|
+
const scope = detectScope(tree, line, astLang);
|
|
72
|
+
const matchedLine = lines[callNode.startPosition.row]?.trim() ?? '';
|
|
73
|
+
findings.push({
|
|
74
|
+
patternId: pattern.id,
|
|
75
|
+
file: fileName,
|
|
76
|
+
line,
|
|
77
|
+
matchedLine,
|
|
78
|
+
language,
|
|
79
|
+
category: pattern.category,
|
|
80
|
+
algorithm: pattern.algorithm,
|
|
81
|
+
risk: pattern.risk,
|
|
82
|
+
reason: pattern.description,
|
|
83
|
+
migration: pattern.migration,
|
|
84
|
+
confidence: 'verified',
|
|
85
|
+
scopeInfo: scope,
|
|
86
|
+
astEnriched: true,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return findings;
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return [];
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
function matchesImportConstraint(objName, pattern, imports) {
|
|
97
|
+
if (!pattern.requiredImports)
|
|
98
|
+
return true;
|
|
99
|
+
const originalName = imports.getOriginalName(objName);
|
|
100
|
+
return pattern.requiredImports.some((req) => {
|
|
101
|
+
if (req.symbol) {
|
|
102
|
+
// from X import Y — check if objName resolves to Y
|
|
103
|
+
return originalName === req.symbol || objName === req.symbol;
|
|
104
|
+
}
|
|
105
|
+
// import X — check if objName is a known module
|
|
106
|
+
return imports.modules.has(objName) || imports.modules.has(originalName);
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
function getFirstArgText(argsNode) {
|
|
110
|
+
// arguments node: first named child is the first argument
|
|
111
|
+
for (let i = 0; i < argsNode.namedChildCount; i++) {
|
|
112
|
+
const arg = argsNode.namedChild(i);
|
|
113
|
+
return arg.text;
|
|
114
|
+
}
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../../../src/scanner/code/ast/analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Tree } from 'web-tree-sitter';
|
|
2
|
+
export interface ImportMap {
|
|
3
|
+
/** Module-level imports (import X / import X as Y) — key is local name */
|
|
4
|
+
modules: Set<string>;
|
|
5
|
+
/** Symbol-level imports (from X import Y) — key is local name, value is fully-qualified path */
|
|
6
|
+
symbols: Map<string, string>;
|
|
7
|
+
/** Alias map — key is alias, value is original name */
|
|
8
|
+
aliases: Map<string, string>;
|
|
9
|
+
/** Resolve a local name to its original (un-aliased) name */
|
|
10
|
+
getOriginalName(localName: string): string;
|
|
11
|
+
}
|
|
12
|
+
export declare function resolveImports(tree: Tree, language: 'python' | 'javascript'): ImportMap;
|
|
13
|
+
//# sourceMappingURL=import-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-resolver.d.ts","sourceRoot":"","sources":["../../../../src/scanner/code/ast/import-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAQ,MAAM,iBAAiB,CAAC;AAElD,MAAM,WAAW,SAAS;IACxB,0EAA0E;IAC1E,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACrB,gGAAgG;IAChG,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,uDAAuD;IACvD,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,6DAA6D;IAC7D,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;CAC5C;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,GAAG,YAAY,GAAG,SAAS,CAGvF"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
export function resolveImports(tree, language) {
|
|
2
|
+
if (language === 'python')
|
|
3
|
+
return resolvePythonImports(tree);
|
|
4
|
+
return resolveJavaScriptImports(tree);
|
|
5
|
+
}
|
|
6
|
+
function resolvePythonImports(tree) {
|
|
7
|
+
const modules = new Set();
|
|
8
|
+
const symbols = new Map();
|
|
9
|
+
const aliases = new Map();
|
|
10
|
+
const root = tree.rootNode;
|
|
11
|
+
for (let i = 0; i < root.childCount; i++) {
|
|
12
|
+
const node = root.child(i);
|
|
13
|
+
if (node.type === 'import_statement') {
|
|
14
|
+
// import X or import X as Y
|
|
15
|
+
// Field 'name' can appear multiple times
|
|
16
|
+
processImportNames(node, (name, alias) => {
|
|
17
|
+
if (alias) {
|
|
18
|
+
modules.add(alias);
|
|
19
|
+
aliases.set(alias, name);
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
modules.add(name);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
else if (node.type === 'import_from_statement') {
|
|
27
|
+
// from X import Y, Z or from X import Y as Z
|
|
28
|
+
const moduleNode = node.childForFieldName('module_name');
|
|
29
|
+
const moduleName = moduleNode?.text ?? '';
|
|
30
|
+
processImportNames(node, (name, alias) => {
|
|
31
|
+
const localName = alias ?? name;
|
|
32
|
+
symbols.set(localName, `${moduleName}.${name}`);
|
|
33
|
+
if (alias) {
|
|
34
|
+
aliases.set(alias, name);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
modules,
|
|
41
|
+
symbols,
|
|
42
|
+
aliases,
|
|
43
|
+
getOriginalName(localName) {
|
|
44
|
+
return aliases.get(localName) ?? localName;
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/** Walk named children looking for dotted_name and aliased_import nodes used as import names. */
|
|
49
|
+
function processImportNames(node, callback) {
|
|
50
|
+
const moduleNode = node.childForFieldName('module_name');
|
|
51
|
+
for (let j = 0; j < node.namedChildCount; j++) {
|
|
52
|
+
const child = node.namedChild(j);
|
|
53
|
+
// Skip the module_name in from-import statements
|
|
54
|
+
if (child === moduleNode)
|
|
55
|
+
continue;
|
|
56
|
+
if (child.type === 'dotted_name') {
|
|
57
|
+
callback(child.text, null);
|
|
58
|
+
}
|
|
59
|
+
else if (child.type === 'aliased_import') {
|
|
60
|
+
const nameNode = child.childForFieldName('name');
|
|
61
|
+
const aliasNode = child.childForFieldName('alias');
|
|
62
|
+
if (nameNode && aliasNode) {
|
|
63
|
+
callback(nameNode.text, aliasNode.text);
|
|
64
|
+
}
|
|
65
|
+
else if (nameNode) {
|
|
66
|
+
callback(nameNode.text, null);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function resolveJavaScriptImports(tree) {
|
|
72
|
+
const modules = new Set();
|
|
73
|
+
const symbols = new Map();
|
|
74
|
+
const aliases = new Map();
|
|
75
|
+
const root = tree.rootNode;
|
|
76
|
+
for (let i = 0; i < root.childCount; i++) {
|
|
77
|
+
const node = root.child(i);
|
|
78
|
+
if (node.type === 'import_statement') {
|
|
79
|
+
// import X from 'Y' / import { X } from 'Y' / import { X as Z } from 'Y'
|
|
80
|
+
const sourceNode = node.childForFieldName('source');
|
|
81
|
+
const moduleName = extractStringContent(sourceNode);
|
|
82
|
+
if (!moduleName)
|
|
83
|
+
continue;
|
|
84
|
+
// Walk import_clause children
|
|
85
|
+
for (let j = 0; j < node.namedChildCount; j++) {
|
|
86
|
+
const child = node.namedChild(j);
|
|
87
|
+
if (child.type === 'import_clause') {
|
|
88
|
+
processJSImportClause(child, moduleName, modules, symbols, aliases);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
else if (node.type === 'lexical_declaration' || node.type === 'variable_declaration') {
|
|
93
|
+
// const X = require('Y') / const { X } = require('Y')
|
|
94
|
+
for (let j = 0; j < node.namedChildCount; j++) {
|
|
95
|
+
const declarator = node.namedChild(j);
|
|
96
|
+
if (declarator.type !== 'variable_declarator')
|
|
97
|
+
continue;
|
|
98
|
+
const valueNode = declarator.childForFieldName('value');
|
|
99
|
+
if (!valueNode || valueNode.type !== 'call_expression')
|
|
100
|
+
continue;
|
|
101
|
+
const funcNode = valueNode.childForFieldName('function');
|
|
102
|
+
if (!funcNode || funcNode.text !== 'require')
|
|
103
|
+
continue;
|
|
104
|
+
const argsNode = valueNode.childForFieldName('arguments');
|
|
105
|
+
const moduleName = extractFirstArgString(argsNode);
|
|
106
|
+
if (!moduleName)
|
|
107
|
+
continue;
|
|
108
|
+
const nameNode = declarator.childForFieldName('name');
|
|
109
|
+
if (!nameNode)
|
|
110
|
+
continue;
|
|
111
|
+
if (nameNode.type === 'identifier') {
|
|
112
|
+
// const crypto = require('crypto')
|
|
113
|
+
modules.add(nameNode.text);
|
|
114
|
+
}
|
|
115
|
+
else if (nameNode.type === 'object_pattern') {
|
|
116
|
+
// const { createHash, createHmac } = require('crypto')
|
|
117
|
+
for (let k = 0; k < nameNode.namedChildCount; k++) {
|
|
118
|
+
const prop = nameNode.namedChild(k);
|
|
119
|
+
if (prop.type === 'shorthand_property_identifier_pattern') {
|
|
120
|
+
symbols.set(prop.text, `${moduleName}.${prop.text}`);
|
|
121
|
+
}
|
|
122
|
+
else if (prop.type === 'pair_pattern') {
|
|
123
|
+
const key = prop.childForFieldName('key');
|
|
124
|
+
const value = prop.childForFieldName('value');
|
|
125
|
+
if (key && value) {
|
|
126
|
+
symbols.set(value.text, `${moduleName}.${key.text}`);
|
|
127
|
+
aliases.set(value.text, key.text);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
modules,
|
|
137
|
+
symbols,
|
|
138
|
+
aliases,
|
|
139
|
+
getOriginalName(localName) {
|
|
140
|
+
return aliases.get(localName) ?? localName;
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
function processJSImportClause(clause, moduleName, modules, symbols, aliases) {
|
|
145
|
+
for (let i = 0; i < clause.namedChildCount; i++) {
|
|
146
|
+
const child = clause.namedChild(i);
|
|
147
|
+
if (child.type === 'identifier') {
|
|
148
|
+
// Default import: import crypto from 'crypto'
|
|
149
|
+
symbols.set(child.text, moduleName);
|
|
150
|
+
}
|
|
151
|
+
else if (child.type === 'named_imports') {
|
|
152
|
+
// Named imports: import { X, Y as Z } from 'mod'
|
|
153
|
+
for (let j = 0; j < child.namedChildCount; j++) {
|
|
154
|
+
const spec = child.namedChild(j);
|
|
155
|
+
if (spec.type === 'import_specifier') {
|
|
156
|
+
const nameNode = spec.childForFieldName('name');
|
|
157
|
+
const aliasNode = spec.childForFieldName('alias');
|
|
158
|
+
if (nameNode && aliasNode) {
|
|
159
|
+
symbols.set(aliasNode.text, `${moduleName}.${nameNode.text}`);
|
|
160
|
+
aliases.set(aliasNode.text, nameNode.text);
|
|
161
|
+
}
|
|
162
|
+
else if (nameNode) {
|
|
163
|
+
symbols.set(nameNode.text, `${moduleName}.${nameNode.text}`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
else if (child.type === 'namespace_import') {
|
|
169
|
+
// import * as X from 'mod'
|
|
170
|
+
const nameNode = child.namedChild(0);
|
|
171
|
+
if (nameNode) {
|
|
172
|
+
modules.add(nameNode.text);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
function extractStringContent(node) {
|
|
178
|
+
if (!node || node.type !== 'string')
|
|
179
|
+
return null;
|
|
180
|
+
// String node has string_fragment child
|
|
181
|
+
for (let i = 0; i < node.namedChildCount; i++) {
|
|
182
|
+
const child = node.namedChild(i);
|
|
183
|
+
if (child.type === 'string_fragment')
|
|
184
|
+
return child.text;
|
|
185
|
+
}
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
function extractFirstArgString(argsNode) {
|
|
189
|
+
if (!argsNode)
|
|
190
|
+
return null;
|
|
191
|
+
for (let i = 0; i < argsNode.namedChildCount; i++) {
|
|
192
|
+
const arg = argsNode.namedChild(i);
|
|
193
|
+
if (arg.type === 'string')
|
|
194
|
+
return extractStringContent(arg);
|
|
195
|
+
}
|
|
196
|
+
return null;
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=import-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-resolver.js","sourceRoot":"","sources":["../../../../src/scanner/code/ast/import-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { CodeFinding } from '../../../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Merge regex and AST findings with dedup.
|
|
4
|
+
*
|
|
5
|
+
* Dedup key: file + patternId + line (with +/-1 tolerance).
|
|
6
|
+
* When both match: AST version wins (higher confidence, enriched data).
|
|
7
|
+
* Regex-only: pass through.
|
|
8
|
+
* AST-only: append at end.
|
|
9
|
+
*/
|
|
10
|
+
export declare function mergeFindings(regexFindings: CodeFinding[], astFindings: CodeFinding[]): CodeFinding[];
|
|
11
|
+
//# sourceMappingURL=merge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../../../src/scanner/code/ast/merge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,aAAa,EAAE,WAAW,EAAE,EAC5B,WAAW,EAAE,WAAW,EAAE,GACzB,WAAW,EAAE,CAuCf"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Merge regex and AST findings with dedup.
|
|
3
|
+
*
|
|
4
|
+
* Dedup key: file + patternId + line (with +/-1 tolerance).
|
|
5
|
+
* When both match: AST version wins (higher confidence, enriched data).
|
|
6
|
+
* Regex-only: pass through.
|
|
7
|
+
* AST-only: append at end.
|
|
8
|
+
*/
|
|
9
|
+
export function mergeFindings(regexFindings, astFindings) {
|
|
10
|
+
if (astFindings.length === 0)
|
|
11
|
+
return regexFindings;
|
|
12
|
+
if (regexFindings.length === 0)
|
|
13
|
+
return astFindings;
|
|
14
|
+
// Index AST findings by file + patternId + line (and adjacent lines)
|
|
15
|
+
const astIndex = new Map();
|
|
16
|
+
for (const af of astFindings) {
|
|
17
|
+
for (const offset of [0, -1, 1]) {
|
|
18
|
+
const key = dedupKey(af.file, af.patternId, af.line + offset);
|
|
19
|
+
if (!astIndex.has(key) || offset === 0) {
|
|
20
|
+
astIndex.set(key, af);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const merged = [];
|
|
25
|
+
const matchedAstKeys = new Set();
|
|
26
|
+
// Pass 1: Walk regex findings, upgrade where AST has a match
|
|
27
|
+
for (const rf of regexFindings) {
|
|
28
|
+
const key = dedupKey(rf.file, rf.patternId, rf.line);
|
|
29
|
+
const af = astIndex.get(key);
|
|
30
|
+
if (af) {
|
|
31
|
+
merged.push(af);
|
|
32
|
+
matchedAstKeys.add(dedupKey(af.file, af.patternId, af.line));
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
merged.push(rf);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// Pass 2: Add AST-only findings (not matched by any regex finding)
|
|
39
|
+
for (const af of astFindings) {
|
|
40
|
+
const key = dedupKey(af.file, af.patternId, af.line);
|
|
41
|
+
if (!matchedAstKeys.has(key)) {
|
|
42
|
+
merged.push(af);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return merged;
|
|
46
|
+
}
|
|
47
|
+
function dedupKey(file, patternId, line) {
|
|
48
|
+
return `${file}:${patternId}:${line}`;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=merge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.js","sourceRoot":"","sources":["../../../../src/scanner/code/ast/merge.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAC3B,aAA4B,EAC5B,WAA0B;IAE1B,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,aAAa,CAAC;IACnD,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,WAAW,CAAC;IAEnD,qEAAqE;IACrE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC;IAChD,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;QAC7B,KAAK,MAAM,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAChC,MAAM,GAAG,GAAG,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC;YAC9D,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IAEzC,6DAA6D;IAC7D,KAAK,MAAM,EAAE,IAAI,aAAa,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,EAAE,EAAE,CAAC;YACP,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChB,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/D,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,mEAAmE;IACnE,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QACrD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,SAAiB,EAAE,IAAY;IAC7D,OAAO,GAAG,IAAI,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Parser, Language } from 'web-tree-sitter';
|
|
2
|
+
export declare function getParser(): Promise<Parser>;
|
|
3
|
+
export declare function getLanguage(lang: string): Promise<Language | null>;
|
|
4
|
+
/** Check whether a language has AST support. */
|
|
5
|
+
export declare function hasASTSupport(lang: string): boolean;
|
|
6
|
+
/** Reset parser state — for testing only. */
|
|
7
|
+
export declare function resetParser(): void;
|
|
8
|
+
export type { Language };
|
|
9
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../../src/scanner/code/ast/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AA6BnD,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAMjD;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAgBxE;AAED,gDAAgD;AAChD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,6CAA6C;AAC7C,wBAAgB,WAAW,IAAI,IAAI,CAIlC;AAGD,YAAY,EAAE,QAAQ,EAAE,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Parser, Language } from 'web-tree-sitter';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
4
|
+
const GRAMMAR_FILES = {
|
|
5
|
+
python: 'tree-sitter-python.wasm',
|
|
6
|
+
javascript: 'tree-sitter-typescript.wasm',
|
|
7
|
+
};
|
|
8
|
+
let parserInstance = null;
|
|
9
|
+
let initPromise = null;
|
|
10
|
+
const loadedLanguages = new Map();
|
|
11
|
+
function getTreeSitterWasmPath() {
|
|
12
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
13
|
+
return join(__dirname, '..', '..', '..', '..', 'node_modules', 'web-tree-sitter', 'web-tree-sitter.wasm');
|
|
14
|
+
}
|
|
15
|
+
async function ensureInit() {
|
|
16
|
+
if (!initPromise) {
|
|
17
|
+
initPromise = Parser.init({
|
|
18
|
+
locateFile: () => getTreeSitterWasmPath(),
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
await initPromise;
|
|
22
|
+
}
|
|
23
|
+
export async function getParser() {
|
|
24
|
+
await ensureInit();
|
|
25
|
+
if (!parserInstance) {
|
|
26
|
+
parserInstance = new Parser();
|
|
27
|
+
}
|
|
28
|
+
return parserInstance;
|
|
29
|
+
}
|
|
30
|
+
export async function getLanguage(lang) {
|
|
31
|
+
if (loadedLanguages.has(lang))
|
|
32
|
+
return loadedLanguages.get(lang);
|
|
33
|
+
const grammarFile = GRAMMAR_FILES[lang];
|
|
34
|
+
if (!grammarFile)
|
|
35
|
+
return null;
|
|
36
|
+
try {
|
|
37
|
+
await ensureInit();
|
|
38
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
39
|
+
const wasmPath = join(__dirname, '..', '..', '..', '..', 'grammars', grammarFile);
|
|
40
|
+
const language = await Language.load(wasmPath);
|
|
41
|
+
loadedLanguages.set(lang, language);
|
|
42
|
+
return language;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/** Check whether a language has AST support. */
|
|
49
|
+
export function hasASTSupport(lang) {
|
|
50
|
+
return lang in GRAMMAR_FILES;
|
|
51
|
+
}
|
|
52
|
+
/** Reset parser state — for testing only. */
|
|
53
|
+
export function resetParser() {
|
|
54
|
+
parserInstance = null;
|
|
55
|
+
initPromise = null;
|
|
56
|
+
loadedLanguages.clear();
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../../src/scanner/code/ast/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAI1C,MAAM,aAAa,GAAgC;IACjD,MAAM,EAAE,yBAAyB;IACjC,UAAU,EAAE,6BAA6B;CAC1C,CAAC;AAEF,IAAI,cAAc,GAAkB,IAAI,CAAC;AACzC,IAAI,WAAW,GAAyB,IAAI,CAAC;AAC7C,MAAM,eAAe,GAAG,IAAI,GAAG,EAAoB,CAAC;AAEpD,SAAS,qBAAqB;IAC5B,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,OAAO,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,iBAAiB,EAAE,sBAAsB,CAAC,CAAC;AAC5G,CAAC;AAED,KAAK,UAAU,UAAU;IACvB,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC;YACxB,UAAU,EAAE,GAAG,EAAE,CAAC,qBAAqB,EAAE;SAC1C,CAAC,CAAC;IACL,CAAC;IACD,MAAM,WAAW,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,UAAU,EAAE,CAAC;IACnB,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,cAAc,GAAG,IAAI,MAAM,EAAE,CAAC;IAChC,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY;IAC5C,IAAI,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,eAAe,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;IAEjE,MAAM,WAAW,GAAG,aAAa,CAAC,IAAmB,CAAC,CAAC;IACvD,IAAI,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IAE9B,IAAI,CAAC;QACH,MAAM,UAAU,EAAE,CAAC;QACnB,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QAClF,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/C,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACpC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,IAAI,IAAI,aAAa,CAAC;AAC/B,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,WAAW;IACzB,cAAc,GAAG,IAAI,CAAC;IACtB,WAAW,GAAG,IAAI,CAAC;IACnB,eAAe,CAAC,KAAK,EAAE,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Language } from '../../../../types/index.js';
|
|
2
|
+
import type { ASTPattern } from './types.js';
|
|
3
|
+
export declare function getASTPatterns(language: Language): ASTPattern[];
|
|
4
|
+
export declare function hasASTPatterns(language: Language): boolean;
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/scanner/code/ast/patterns/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAS7C,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,UAAU,EAAE,CAE/D;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAE1D"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { pythonASTPatterns } from './python.js';
|
|
2
|
+
import { javascriptASTPatterns } from './javascript.js';
|
|
3
|
+
const patternsByLanguage = {
|
|
4
|
+
python: pythonASTPatterns,
|
|
5
|
+
javascript: javascriptASTPatterns,
|
|
6
|
+
};
|
|
7
|
+
export function getASTPatterns(language) {
|
|
8
|
+
return patternsByLanguage[language] ?? [];
|
|
9
|
+
}
|
|
10
|
+
export function hasASTPatterns(language) {
|
|
11
|
+
return (patternsByLanguage[language]?.length ?? 0) > 0;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/scanner/code/ast/patterns/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAExD,MAAM,kBAAkB,GAA4C;IAClE,MAAM,EAAE,iBAAiB;IACzB,UAAU,EAAE,qBAAqB;CAClC,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,QAAkB;IAC/C,OAAO,kBAAkB,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAAkB;IAC/C,OAAO,CAAC,kBAAkB,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"javascript.d.ts","sourceRoot":"","sources":["../../../../../src/scanner/code/ast/patterns/javascript.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAW7C,eAAO,MAAM,qBAAqB,EAAE,UAAU,EAuG7C,CAAC"}
|