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.
Files changed (113) hide show
  1. package/README.md +45 -27
  2. package/dist/commands/analyze.d.ts.map +1 -1
  3. package/dist/commands/analyze.js +18 -23
  4. package/dist/commands/analyze.js.map +1 -1
  5. package/dist/index.js +4 -2
  6. package/dist/index.js.map +1 -1
  7. package/dist/output/cbom.d.ts.map +1 -1
  8. package/dist/output/cbom.js +1 -13
  9. package/dist/output/cbom.js.map +1 -1
  10. package/dist/output/json-code.d.ts.map +1 -1
  11. package/dist/output/json-code.js +2 -13
  12. package/dist/output/json-code.js.map +1 -1
  13. package/dist/output/json.d.ts.map +1 -1
  14. package/dist/output/json.js +2 -13
  15. package/dist/output/json.js.map +1 -1
  16. package/dist/output/sarif.d.ts.map +1 -1
  17. package/dist/output/sarif.js +1 -13
  18. package/dist/output/sarif.js.map +1 -1
  19. package/dist/output/terminal-code.d.ts.map +1 -1
  20. package/dist/output/terminal-code.js +6 -13
  21. package/dist/output/terminal-code.js.map +1 -1
  22. package/dist/output/terminal.d.ts.map +1 -1
  23. package/dist/output/terminal.js +6 -13
  24. package/dist/output/terminal.js.map +1 -1
  25. package/dist/scanner/code/ast/analyzer.d.ts +8 -0
  26. package/dist/scanner/code/ast/analyzer.d.ts.map +1 -0
  27. package/dist/scanner/code/ast/analyzer.js +117 -0
  28. package/dist/scanner/code/ast/analyzer.js.map +1 -0
  29. package/dist/scanner/code/ast/import-resolver.d.ts +13 -0
  30. package/dist/scanner/code/ast/import-resolver.d.ts.map +1 -0
  31. package/dist/scanner/code/ast/import-resolver.js +198 -0
  32. package/dist/scanner/code/ast/import-resolver.js.map +1 -0
  33. package/dist/scanner/code/ast/merge.d.ts +11 -0
  34. package/dist/scanner/code/ast/merge.d.ts.map +1 -0
  35. package/dist/scanner/code/ast/merge.js +50 -0
  36. package/dist/scanner/code/ast/merge.js.map +1 -0
  37. package/dist/scanner/code/ast/parser.d.ts +9 -0
  38. package/dist/scanner/code/ast/parser.d.ts.map +1 -0
  39. package/dist/scanner/code/ast/parser.js +58 -0
  40. package/dist/scanner/code/ast/parser.js.map +1 -0
  41. package/dist/scanner/code/ast/patterns/index.d.ts +5 -0
  42. package/dist/scanner/code/ast/patterns/index.d.ts.map +1 -0
  43. package/dist/scanner/code/ast/patterns/index.js +13 -0
  44. package/dist/scanner/code/ast/patterns/index.js.map +1 -0
  45. package/dist/scanner/code/ast/patterns/javascript.d.ts +3 -0
  46. package/dist/scanner/code/ast/patterns/javascript.d.ts.map +1 -0
  47. package/dist/scanner/code/ast/patterns/javascript.js +113 -0
  48. package/dist/scanner/code/ast/patterns/javascript.js.map +1 -0
  49. package/dist/scanner/code/ast/patterns/python.d.ts +3 -0
  50. package/dist/scanner/code/ast/patterns/python.d.ts.map +1 -0
  51. package/dist/scanner/code/ast/patterns/python.js +165 -0
  52. package/dist/scanner/code/ast/patterns/python.js.map +1 -0
  53. package/dist/scanner/code/ast/patterns/types.d.ts +23 -0
  54. package/dist/scanner/code/ast/patterns/types.d.ts.map +1 -0
  55. package/dist/scanner/code/ast/patterns/types.js +2 -0
  56. package/dist/scanner/code/ast/patterns/types.js.map +1 -0
  57. package/dist/scanner/code/ast/scope-detector.d.ts +8 -0
  58. package/dist/scanner/code/ast/scope-detector.d.ts.map +1 -0
  59. package/dist/scanner/code/ast/scope-detector.js +116 -0
  60. package/dist/scanner/code/ast/scope-detector.js.map +1 -0
  61. package/dist/scanner/code/ast/variable-resolver.d.ts +11 -0
  62. package/dist/scanner/code/ast/variable-resolver.d.ts.map +1 -0
  63. package/dist/scanner/code/ast/variable-resolver.js +115 -0
  64. package/dist/scanner/code/ast/variable-resolver.js.map +1 -0
  65. package/dist/scanner/code/discovery.d.ts +2 -0
  66. package/dist/scanner/code/discovery.d.ts.map +1 -1
  67. package/dist/scanner/code/discovery.js +8 -1
  68. package/dist/scanner/code/discovery.js.map +1 -1
  69. package/dist/scanner/code/grader.d.ts.map +1 -1
  70. package/dist/scanner/code/grader.js +2 -0
  71. package/dist/scanner/code/grader.js.map +1 -1
  72. package/dist/scanner/code/matcher.js +14 -4
  73. package/dist/scanner/code/matcher.js.map +1 -1
  74. package/dist/scanner/code/patterns/c.d.ts +3 -0
  75. package/dist/scanner/code/patterns/c.d.ts.map +1 -0
  76. package/dist/scanner/code/patterns/c.js +359 -0
  77. package/dist/scanner/code/patterns/c.js.map +1 -0
  78. package/dist/scanner/code/patterns/go.d.ts.map +1 -1
  79. package/dist/scanner/code/patterns/go.js +54 -0
  80. package/dist/scanner/code/patterns/go.js.map +1 -1
  81. package/dist/scanner/code/patterns/index.d.ts +3 -1
  82. package/dist/scanner/code/patterns/index.d.ts.map +1 -1
  83. package/dist/scanner/code/patterns/index.js +5 -1
  84. package/dist/scanner/code/patterns/index.js.map +1 -1
  85. package/dist/scanner/code/patterns/java.d.ts.map +1 -1
  86. package/dist/scanner/code/patterns/java.js +46 -0
  87. package/dist/scanner/code/patterns/java.js.map +1 -1
  88. package/dist/scanner/code/patterns/javascript.d.ts.map +1 -1
  89. package/dist/scanner/code/patterns/javascript.js +58 -0
  90. package/dist/scanner/code/patterns/javascript.js.map +1 -1
  91. package/dist/scanner/code/patterns/python.d.ts.map +1 -1
  92. package/dist/scanner/code/patterns/python.js +59 -0
  93. package/dist/scanner/code/patterns/python.js.map +1 -1
  94. package/dist/scanner/code/patterns/rust.d.ts +3 -0
  95. package/dist/scanner/code/patterns/rust.d.ts.map +1 -0
  96. package/dist/scanner/code/patterns/rust.js +246 -0
  97. package/dist/scanner/code/patterns/rust.js.map +1 -0
  98. package/dist/scanner/code/risk-assessor.d.ts.map +1 -1
  99. package/dist/scanner/code/risk-assessor.js +37 -0
  100. package/dist/scanner/code/risk-assessor.js.map +1 -1
  101. package/dist/scanner/grader.d.ts.map +1 -1
  102. package/dist/scanner/grader.js +2 -0
  103. package/dist/scanner/grader.js.map +1 -1
  104. package/dist/types/index.d.ts +22 -4
  105. package/dist/types/index.d.ts.map +1 -1
  106. package/dist/types/index.js.map +1 -1
  107. package/dist/utils/version.d.ts +2 -0
  108. package/dist/utils/version.d.ts.map +1 -0
  109. package/dist/utils/version.js +19 -0
  110. package/dist/utils/version.js.map +1 -0
  111. package/grammars/tree-sitter-python.wasm +0 -0
  112. package/grammars/tree-sitter-typescript.wasm +0 -0
  113. package/package.json +4 -2
@@ -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
- function getVersion() {
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":"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"}
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,3 @@
1
+ import type { ASTPattern } from './types.js';
2
+ export declare const javascriptASTPatterns: ASTPattern[];
3
+ //# sourceMappingURL=javascript.d.ts.map
@@ -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"}