@shipsafe/cli 0.1.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 +167 -0
- package/dist/bin/shipsafe.d.ts +3 -0
- package/dist/bin/shipsafe.d.ts.map +1 -0
- package/dist/bin/shipsafe.js +33 -0
- package/dist/bin/shipsafe.js.map +1 -0
- package/dist/src/autofix/pr-generator.d.ts +48 -0
- package/dist/src/autofix/pr-generator.d.ts.map +1 -0
- package/dist/src/autofix/pr-generator.js +359 -0
- package/dist/src/autofix/pr-generator.js.map +1 -0
- package/dist/src/autofix/scaffolding.d.ts +26 -0
- package/dist/src/autofix/scaffolding.d.ts.map +1 -0
- package/dist/src/autofix/scaffolding.js +249 -0
- package/dist/src/autofix/scaffolding.js.map +1 -0
- package/dist/src/autofix/secret-fixer.d.ts +27 -0
- package/dist/src/autofix/secret-fixer.d.ts.map +1 -0
- package/dist/src/autofix/secret-fixer.js +138 -0
- package/dist/src/autofix/secret-fixer.js.map +1 -0
- package/dist/src/claude-md/manager.d.ts +17 -0
- package/dist/src/claude-md/manager.d.ts.map +1 -0
- package/dist/src/claude-md/manager.js +143 -0
- package/dist/src/claude-md/manager.js.map +1 -0
- package/dist/src/cli/activate.d.ts +4 -0
- package/dist/src/cli/activate.d.ts.map +1 -0
- package/dist/src/cli/activate.js +53 -0
- package/dist/src/cli/activate.js.map +1 -0
- package/dist/src/cli/config.d.ts +21 -0
- package/dist/src/cli/config.d.ts.map +1 -0
- package/dist/src/cli/config.js +128 -0
- package/dist/src/cli/config.js.map +1 -0
- package/dist/src/cli/connect.d.ts +36 -0
- package/dist/src/cli/connect.d.ts.map +1 -0
- package/dist/src/cli/connect.js +107 -0
- package/dist/src/cli/connect.js.map +1 -0
- package/dist/src/cli/init.d.ts +12 -0
- package/dist/src/cli/init.d.ts.map +1 -0
- package/dist/src/cli/init.js +45 -0
- package/dist/src/cli/init.js.map +1 -0
- package/dist/src/cli/license-check.d.ts +7 -0
- package/dist/src/cli/license-check.d.ts.map +1 -0
- package/dist/src/cli/license-check.js +69 -0
- package/dist/src/cli/license-check.js.map +1 -0
- package/dist/src/cli/license-gate.d.ts +9 -0
- package/dist/src/cli/license-gate.d.ts.map +1 -0
- package/dist/src/cli/license-gate.js +25 -0
- package/dist/src/cli/license-gate.js.map +1 -0
- package/dist/src/cli/scan.d.ts +9 -0
- package/dist/src/cli/scan.d.ts.map +1 -0
- package/dist/src/cli/scan.js +75 -0
- package/dist/src/cli/scan.js.map +1 -0
- package/dist/src/cli/setup.d.ts +27 -0
- package/dist/src/cli/setup.d.ts.map +1 -0
- package/dist/src/cli/setup.js +134 -0
- package/dist/src/cli/setup.js.map +1 -0
- package/dist/src/cli/status.d.ts +4 -0
- package/dist/src/cli/status.d.ts.map +1 -0
- package/dist/src/cli/status.js +52 -0
- package/dist/src/cli/status.js.map +1 -0
- package/dist/src/cli/upload-sourcemaps.d.ts +13 -0
- package/dist/src/cli/upload-sourcemaps.d.ts.map +1 -0
- package/dist/src/cli/upload-sourcemaps.js +157 -0
- package/dist/src/cli/upload-sourcemaps.js.map +1 -0
- package/dist/src/config/manager.d.ts +37 -0
- package/dist/src/config/manager.d.ts.map +1 -0
- package/dist/src/config/manager.js +131 -0
- package/dist/src/config/manager.js.map +1 -0
- package/dist/src/constants.d.ts +28 -0
- package/dist/src/constants.d.ts.map +1 -0
- package/dist/src/constants.js +34 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/engines/graph/data-flow.d.ts +36 -0
- package/dist/src/engines/graph/data-flow.d.ts.map +1 -0
- package/dist/src/engines/graph/data-flow.js +189 -0
- package/dist/src/engines/graph/data-flow.js.map +1 -0
- package/dist/src/engines/graph/index.d.ts +20 -0
- package/dist/src/engines/graph/index.d.ts.map +1 -0
- package/dist/src/engines/graph/index.js +100 -0
- package/dist/src/engines/graph/index.js.map +1 -0
- package/dist/src/engines/graph/parser.d.ts +13 -0
- package/dist/src/engines/graph/parser.d.ts.map +1 -0
- package/dist/src/engines/graph/parser.js +620 -0
- package/dist/src/engines/graph/parser.js.map +1 -0
- package/dist/src/engines/graph/queries.d.ts +11 -0
- package/dist/src/engines/graph/queries.d.ts.map +1 -0
- package/dist/src/engines/graph/queries.js +196 -0
- package/dist/src/engines/graph/queries.js.map +1 -0
- package/dist/src/engines/graph/store.d.ts +35 -0
- package/dist/src/engines/graph/store.d.ts.map +1 -0
- package/dist/src/engines/graph/store.js +284 -0
- package/dist/src/engines/graph/store.js.map +1 -0
- package/dist/src/engines/pattern/gitleaks.d.ts +4 -0
- package/dist/src/engines/pattern/gitleaks.d.ts.map +1 -0
- package/dist/src/engines/pattern/gitleaks.js +78 -0
- package/dist/src/engines/pattern/gitleaks.js.map +1 -0
- package/dist/src/engines/pattern/index.d.ts +11 -0
- package/dist/src/engines/pattern/index.d.ts.map +1 -0
- package/dist/src/engines/pattern/index.js +111 -0
- package/dist/src/engines/pattern/index.js.map +1 -0
- package/dist/src/engines/pattern/semgrep.d.ts +4 -0
- package/dist/src/engines/pattern/semgrep.d.ts.map +1 -0
- package/dist/src/engines/pattern/semgrep.js +83 -0
- package/dist/src/engines/pattern/semgrep.js.map +1 -0
- package/dist/src/engines/pattern/trivy.d.ts +4 -0
- package/dist/src/engines/pattern/trivy.d.ts.map +1 -0
- package/dist/src/engines/pattern/trivy.js +90 -0
- package/dist/src/engines/pattern/trivy.js.map +1 -0
- package/dist/src/github/api.d.ts +19 -0
- package/dist/src/github/api.d.ts.map +1 -0
- package/dist/src/github/api.js +75 -0
- package/dist/src/github/api.js.map +1 -0
- package/dist/src/github/app-manifest.d.ts +28 -0
- package/dist/src/github/app-manifest.d.ts.map +1 -0
- package/dist/src/github/app-manifest.js +27 -0
- package/dist/src/github/app-manifest.js.map +1 -0
- package/dist/src/github/checks.d.ts +36 -0
- package/dist/src/github/checks.d.ts.map +1 -0
- package/dist/src/github/checks.js +90 -0
- package/dist/src/github/checks.js.map +1 -0
- package/dist/src/github/scanner.d.ts +20 -0
- package/dist/src/github/scanner.d.ts.map +1 -0
- package/dist/src/github/scanner.js +78 -0
- package/dist/src/github/scanner.js.map +1 -0
- package/dist/src/github/webhook.d.ts +39 -0
- package/dist/src/github/webhook.d.ts.map +1 -0
- package/dist/src/github/webhook.js +80 -0
- package/dist/src/github/webhook.js.map +1 -0
- package/dist/src/hooks/installer.d.ts +4 -0
- package/dist/src/hooks/installer.d.ts.map +1 -0
- package/dist/src/hooks/installer.js +146 -0
- package/dist/src/hooks/installer.js.map +1 -0
- package/dist/src/mcp/server.d.ts +2 -0
- package/dist/src/mcp/server.d.ts.map +1 -0
- package/dist/src/mcp/server.js +96 -0
- package/dist/src/mcp/server.js.map +1 -0
- package/dist/src/mcp/tools/check-package.d.ts +30 -0
- package/dist/src/mcp/tools/check-package.d.ts.map +1 -0
- package/dist/src/mcp/tools/check-package.js +196 -0
- package/dist/src/mcp/tools/check-package.js.map +1 -0
- package/dist/src/mcp/tools/fix.d.ts +41 -0
- package/dist/src/mcp/tools/fix.d.ts.map +1 -0
- package/dist/src/mcp/tools/fix.js +98 -0
- package/dist/src/mcp/tools/fix.js.map +1 -0
- package/dist/src/mcp/tools/graph-query.d.ts +7 -0
- package/dist/src/mcp/tools/graph-query.d.ts.map +1 -0
- package/dist/src/mcp/tools/graph-query.js +139 -0
- package/dist/src/mcp/tools/graph-query.js.map +1 -0
- package/dist/src/mcp/tools/production-errors.d.ts +23 -0
- package/dist/src/mcp/tools/production-errors.d.ts.map +1 -0
- package/dist/src/mcp/tools/production-errors.js +46 -0
- package/dist/src/mcp/tools/production-errors.js.map +1 -0
- package/dist/src/mcp/tools/scan.d.ts +7 -0
- package/dist/src/mcp/tools/scan.d.ts.map +1 -0
- package/dist/src/mcp/tools/scan.js +9 -0
- package/dist/src/mcp/tools/scan.js.map +1 -0
- package/dist/src/mcp/tools/status.d.ts +9 -0
- package/dist/src/mcp/tools/status.d.ts.map +1 -0
- package/dist/src/mcp/tools/status.js +18 -0
- package/dist/src/mcp/tools/status.js.map +1 -0
- package/dist/src/mcp/tools/verify-resolution.d.ts +12 -0
- package/dist/src/mcp/tools/verify-resolution.d.ts.map +1 -0
- package/dist/src/mcp/tools/verify-resolution.js +45 -0
- package/dist/src/mcp/tools/verify-resolution.js.map +1 -0
- package/dist/src/types.d.ts +136 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,620 @@
|
|
|
1
|
+
import Parser from 'web-tree-sitter';
|
|
2
|
+
import { createRequire } from 'node:module';
|
|
3
|
+
import { readFile, readdir, stat } from 'node:fs/promises';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
const require = createRequire(import.meta.url);
|
|
6
|
+
// ── Module state ──
|
|
7
|
+
let parserInstance = null;
|
|
8
|
+
const languageCache = new Map();
|
|
9
|
+
// ── Public API ──
|
|
10
|
+
/** Initialize tree-sitter. Must be called once before parsing. */
|
|
11
|
+
export async function initParser() {
|
|
12
|
+
await Parser.init();
|
|
13
|
+
parserInstance = new Parser();
|
|
14
|
+
}
|
|
15
|
+
/** Detect language from file extension. Returns null for unsupported files. */
|
|
16
|
+
export function detectLanguage(filePath) {
|
|
17
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
18
|
+
switch (ext) {
|
|
19
|
+
case '.ts':
|
|
20
|
+
case '.tsx':
|
|
21
|
+
return 'typescript';
|
|
22
|
+
case '.js':
|
|
23
|
+
case '.jsx':
|
|
24
|
+
case '.mjs':
|
|
25
|
+
case '.cjs':
|
|
26
|
+
return 'javascript';
|
|
27
|
+
case '.py':
|
|
28
|
+
return 'python';
|
|
29
|
+
default:
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/** Parse a single file and extract structural nodes. */
|
|
34
|
+
export async function parseFile(filePath, content) {
|
|
35
|
+
if (!parserInstance) {
|
|
36
|
+
throw new Error('Parser not initialized. Call initParser() first.');
|
|
37
|
+
}
|
|
38
|
+
const language = detectLanguage(filePath);
|
|
39
|
+
if (!language) {
|
|
40
|
+
throw new Error(`Unsupported file type: ${filePath}`);
|
|
41
|
+
}
|
|
42
|
+
const lang = await loadLanguage(language);
|
|
43
|
+
parserInstance.setLanguage(lang);
|
|
44
|
+
const tree = parserInstance.parse(content);
|
|
45
|
+
const root = tree.rootNode;
|
|
46
|
+
const result = {
|
|
47
|
+
filePath,
|
|
48
|
+
language,
|
|
49
|
+
functions: [],
|
|
50
|
+
classes: [],
|
|
51
|
+
imports: [],
|
|
52
|
+
exports: [],
|
|
53
|
+
callSites: [],
|
|
54
|
+
};
|
|
55
|
+
if (language === 'python') {
|
|
56
|
+
extractPython(root, filePath, result);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
extractTypeScriptOrJavaScript(root, filePath, result);
|
|
60
|
+
}
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
/** Parse all supported files in a directory. */
|
|
64
|
+
export async function parseProject(projectDir, options) {
|
|
65
|
+
if (!parserInstance) {
|
|
66
|
+
throw new Error('Parser not initialized. Call initParser() first.');
|
|
67
|
+
}
|
|
68
|
+
const defaultExclude = ['node_modules', 'dist', '.git', 'coverage'];
|
|
69
|
+
const excludePatterns = options?.exclude ?? [];
|
|
70
|
+
const includePatterns = options?.include ?? [];
|
|
71
|
+
const files = await collectFiles(projectDir, defaultExclude, excludePatterns, includePatterns);
|
|
72
|
+
const results = [];
|
|
73
|
+
for (const file of files) {
|
|
74
|
+
const lang = detectLanguage(file);
|
|
75
|
+
if (!lang)
|
|
76
|
+
continue;
|
|
77
|
+
try {
|
|
78
|
+
const content = await readFile(file, 'utf-8');
|
|
79
|
+
const parsed = await parseFile(file, content);
|
|
80
|
+
results.push(parsed);
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// Skip files that fail to parse (e.g. binary files with wrong extensions)
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return results;
|
|
87
|
+
}
|
|
88
|
+
// ── Language loading ──
|
|
89
|
+
async function loadLanguage(language) {
|
|
90
|
+
// Map language to WASM filename
|
|
91
|
+
const wasmName = getWasmName(language);
|
|
92
|
+
const cached = languageCache.get(wasmName);
|
|
93
|
+
if (cached)
|
|
94
|
+
return cached;
|
|
95
|
+
const wasmPath = require.resolve(`tree-sitter-wasms/out/${wasmName}`);
|
|
96
|
+
const lang = await Parser.Language.load(wasmPath);
|
|
97
|
+
languageCache.set(wasmName, lang);
|
|
98
|
+
return lang;
|
|
99
|
+
}
|
|
100
|
+
function getWasmName(language) {
|
|
101
|
+
switch (language) {
|
|
102
|
+
case 'typescript':
|
|
103
|
+
return 'tree-sitter-typescript.wasm';
|
|
104
|
+
case 'javascript':
|
|
105
|
+
return 'tree-sitter-javascript.wasm';
|
|
106
|
+
case 'python':
|
|
107
|
+
return 'tree-sitter-python.wasm';
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// ── File collection ──
|
|
111
|
+
async function collectFiles(dir, defaultExclude, excludePatterns, includePatterns) {
|
|
112
|
+
const results = [];
|
|
113
|
+
await walkDir(dir, results, defaultExclude, excludePatterns, includePatterns, dir);
|
|
114
|
+
return results;
|
|
115
|
+
}
|
|
116
|
+
async function walkDir(dir, results, defaultExclude, excludePatterns, includePatterns, rootDir) {
|
|
117
|
+
let entries;
|
|
118
|
+
try {
|
|
119
|
+
entries = await readdir(dir);
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
for (const entry of entries) {
|
|
125
|
+
const fullPath = path.join(dir, entry);
|
|
126
|
+
// Check default exclusions by directory name
|
|
127
|
+
if (defaultExclude.includes(entry))
|
|
128
|
+
continue;
|
|
129
|
+
let stats;
|
|
130
|
+
try {
|
|
131
|
+
stats = await stat(fullPath);
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
if (stats.isDirectory()) {
|
|
137
|
+
await walkDir(fullPath, results, defaultExclude, excludePatterns, includePatterns, rootDir);
|
|
138
|
+
}
|
|
139
|
+
else if (stats.isFile()) {
|
|
140
|
+
const lang = detectLanguage(fullPath);
|
|
141
|
+
if (!lang)
|
|
142
|
+
continue;
|
|
143
|
+
const relativePath = path.relative(rootDir, fullPath);
|
|
144
|
+
// Check exclude patterns (glob-like)
|
|
145
|
+
if (excludePatterns.some((pat) => matchGlob(relativePath, pat)))
|
|
146
|
+
continue;
|
|
147
|
+
// Check include patterns (if specified, file must match at least one)
|
|
148
|
+
if (includePatterns.length > 0) {
|
|
149
|
+
if (!includePatterns.some((pat) => matchGlob(relativePath, pat)))
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
results.push(fullPath);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/** Simple glob matcher supporting ** and * patterns. */
|
|
157
|
+
function matchGlob(filePath, pattern) {
|
|
158
|
+
// Convert glob pattern to regex
|
|
159
|
+
// Handle **/ which should match zero or more path segments
|
|
160
|
+
const regexStr = pattern
|
|
161
|
+
.replace(/\./g, '\\.')
|
|
162
|
+
.replace(/\*\*\//g, '(?:.*/)?')
|
|
163
|
+
.replace(/\*\*/g, '.*')
|
|
164
|
+
.replace(/\*/g, '[^/]*');
|
|
165
|
+
const regex = new RegExp(`^${regexStr}$`);
|
|
166
|
+
return regex.test(filePath);
|
|
167
|
+
}
|
|
168
|
+
// ── TypeScript / JavaScript extraction ──
|
|
169
|
+
function extractTypeScriptOrJavaScript(root, filePath, result) {
|
|
170
|
+
extractTSImports(root, filePath, result);
|
|
171
|
+
extractTSClassesAndMethods(root, filePath, result);
|
|
172
|
+
extractTSFunctions(root, filePath, result);
|
|
173
|
+
extractTSArrowFunctions(root, filePath, result);
|
|
174
|
+
extractTSExports(root, filePath, result);
|
|
175
|
+
extractTSCallSites(root, filePath, result);
|
|
176
|
+
}
|
|
177
|
+
function extractTSImports(root, filePath, result) {
|
|
178
|
+
const importNodes = root.descendantsOfType('import_statement');
|
|
179
|
+
for (const imp of importNodes) {
|
|
180
|
+
const sourceNode = imp.childForFieldName('source');
|
|
181
|
+
if (!sourceNode)
|
|
182
|
+
continue;
|
|
183
|
+
// Extract the string content (strip quotes)
|
|
184
|
+
const source = extractStringContent(sourceNode);
|
|
185
|
+
if (!source)
|
|
186
|
+
continue;
|
|
187
|
+
const specifiers = [];
|
|
188
|
+
const importClause = imp.children.find((c) => c.type === 'import_clause');
|
|
189
|
+
if (importClause) {
|
|
190
|
+
const namedImports = importClause.descendantsOfType('import_specifier');
|
|
191
|
+
for (const spec of namedImports) {
|
|
192
|
+
const nameNode = spec.childForFieldName('name');
|
|
193
|
+
if (nameNode)
|
|
194
|
+
specifiers.push(nameNode.text);
|
|
195
|
+
}
|
|
196
|
+
// Handle default import
|
|
197
|
+
const defaultIdent = importClause.children.find((c) => c.type === 'identifier');
|
|
198
|
+
if (defaultIdent)
|
|
199
|
+
specifiers.push(defaultIdent.text);
|
|
200
|
+
// Handle namespace import: import * as foo from 'bar'
|
|
201
|
+
const nsImport = importClause.descendantsOfType('namespace_import');
|
|
202
|
+
if (nsImport.length > 0) {
|
|
203
|
+
const alias = nsImport[0].children.find((c) => c.type === 'identifier');
|
|
204
|
+
if (alias)
|
|
205
|
+
specifiers.push(alias.text);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
result.imports.push({
|
|
209
|
+
source,
|
|
210
|
+
specifiers,
|
|
211
|
+
filePath,
|
|
212
|
+
line: imp.startPosition.row + 1,
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
function extractTSClassesAndMethods(root, filePath, result) {
|
|
217
|
+
const classDeclNodes = root.descendantsOfType('class_declaration');
|
|
218
|
+
for (const cls of classDeclNodes) {
|
|
219
|
+
const nameNode = cls.childForFieldName('name');
|
|
220
|
+
if (!nameNode)
|
|
221
|
+
continue;
|
|
222
|
+
const className = nameNode.text;
|
|
223
|
+
const isExported = cls.parent?.type === 'export_statement';
|
|
224
|
+
const bodyNode = cls.childForFieldName('body');
|
|
225
|
+
const methodNames = [];
|
|
226
|
+
if (bodyNode) {
|
|
227
|
+
const methods = bodyNode.descendantsOfType('method_definition');
|
|
228
|
+
for (const method of methods) {
|
|
229
|
+
const methodNameNode = method.childForFieldName('name');
|
|
230
|
+
if (!methodNameNode)
|
|
231
|
+
continue;
|
|
232
|
+
const methodName = methodNameNode.text;
|
|
233
|
+
methodNames.push(methodName);
|
|
234
|
+
// Check if method is async
|
|
235
|
+
const isAsync = method.children.some((c) => c.type === 'async');
|
|
236
|
+
// Extract parameters
|
|
237
|
+
const params = extractTSParams(method);
|
|
238
|
+
result.functions.push({
|
|
239
|
+
name: methodName,
|
|
240
|
+
filePath,
|
|
241
|
+
startLine: method.startPosition.row + 1,
|
|
242
|
+
endLine: method.endPosition.row + 1,
|
|
243
|
+
params,
|
|
244
|
+
isAsync,
|
|
245
|
+
isExported,
|
|
246
|
+
className,
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
result.classes.push({
|
|
251
|
+
name: className,
|
|
252
|
+
filePath,
|
|
253
|
+
startLine: cls.startPosition.row + 1,
|
|
254
|
+
endLine: cls.endPosition.row + 1,
|
|
255
|
+
methods: methodNames,
|
|
256
|
+
isExported,
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
function extractTSFunctions(root, filePath, result) {
|
|
261
|
+
const funcNodes = root.descendantsOfType('function_declaration');
|
|
262
|
+
for (const func of funcNodes) {
|
|
263
|
+
const nameNode = func.childForFieldName('name');
|
|
264
|
+
if (!nameNode)
|
|
265
|
+
continue;
|
|
266
|
+
const isExported = func.parent?.type === 'export_statement';
|
|
267
|
+
const isAsync = func.children.some((c) => c.type === 'async');
|
|
268
|
+
const params = extractTSParams(func);
|
|
269
|
+
result.functions.push({
|
|
270
|
+
name: nameNode.text,
|
|
271
|
+
filePath,
|
|
272
|
+
startLine: func.startPosition.row + 1,
|
|
273
|
+
endLine: func.endPosition.row + 1,
|
|
274
|
+
params,
|
|
275
|
+
isAsync,
|
|
276
|
+
isExported,
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
function extractTSArrowFunctions(root, filePath, result) {
|
|
281
|
+
const arrowFns = root.descendantsOfType('arrow_function');
|
|
282
|
+
for (const arrow of arrowFns) {
|
|
283
|
+
// Only capture arrow functions assigned to named variables
|
|
284
|
+
// The parent should be a variable_declarator
|
|
285
|
+
const parent = arrow.parent;
|
|
286
|
+
if (!parent || parent.type !== 'variable_declarator')
|
|
287
|
+
continue;
|
|
288
|
+
const nameNode = parent.childForFieldName('name');
|
|
289
|
+
if (!nameNode || nameNode.type !== 'identifier')
|
|
290
|
+
continue;
|
|
291
|
+
// Check if exported: variable_declarator -> lexical_declaration -> export_statement
|
|
292
|
+
const lexDecl = parent.parent;
|
|
293
|
+
const isExported = lexDecl?.parent?.type === 'export_statement';
|
|
294
|
+
const isAsync = arrow.children.some((c) => c.type === 'async');
|
|
295
|
+
const params = extractTSParams(arrow);
|
|
296
|
+
result.functions.push({
|
|
297
|
+
name: nameNode.text,
|
|
298
|
+
filePath,
|
|
299
|
+
startLine: arrow.startPosition.row + 1,
|
|
300
|
+
endLine: arrow.endPosition.row + 1,
|
|
301
|
+
params,
|
|
302
|
+
isAsync,
|
|
303
|
+
isExported,
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
function extractTSExports(root, filePath, result) {
|
|
308
|
+
const exportStatements = root.descendantsOfType('export_statement');
|
|
309
|
+
for (const exp of exportStatements) {
|
|
310
|
+
const declaration = exp.childForFieldName('declaration');
|
|
311
|
+
if (!declaration)
|
|
312
|
+
continue;
|
|
313
|
+
let name = null;
|
|
314
|
+
let exportType = 'variable';
|
|
315
|
+
switch (declaration.type) {
|
|
316
|
+
case 'function_declaration': {
|
|
317
|
+
name = declaration.childForFieldName('name')?.text ?? null;
|
|
318
|
+
exportType = 'function';
|
|
319
|
+
break;
|
|
320
|
+
}
|
|
321
|
+
case 'class_declaration': {
|
|
322
|
+
name = declaration.childForFieldName('name')?.text ?? null;
|
|
323
|
+
exportType = 'class';
|
|
324
|
+
break;
|
|
325
|
+
}
|
|
326
|
+
case 'lexical_declaration':
|
|
327
|
+
case 'variable_declaration': {
|
|
328
|
+
const declarator = declaration.descendantsOfType('variable_declarator')[0];
|
|
329
|
+
name = declarator?.childForFieldName('name')?.text ?? null;
|
|
330
|
+
exportType = 'variable';
|
|
331
|
+
break;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
if (name) {
|
|
335
|
+
result.exports.push({
|
|
336
|
+
name,
|
|
337
|
+
filePath,
|
|
338
|
+
line: exp.startPosition.row + 1,
|
|
339
|
+
type: exportType,
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
function extractTSCallSites(root, filePath, result) {
|
|
345
|
+
const callExprs = root.descendantsOfType('call_expression');
|
|
346
|
+
for (const call of callExprs) {
|
|
347
|
+
const funcNode = call.childForFieldName('function');
|
|
348
|
+
if (!funcNode)
|
|
349
|
+
continue;
|
|
350
|
+
let calleeName;
|
|
351
|
+
let receiver;
|
|
352
|
+
if (funcNode.type === 'member_expression') {
|
|
353
|
+
const objectNode = funcNode.childForFieldName('object');
|
|
354
|
+
const propertyNode = funcNode.childForFieldName('property');
|
|
355
|
+
calleeName = propertyNode?.text ?? funcNode.text;
|
|
356
|
+
receiver = objectNode?.text;
|
|
357
|
+
}
|
|
358
|
+
else if (funcNode.type === 'identifier') {
|
|
359
|
+
calleeName = funcNode.text;
|
|
360
|
+
}
|
|
361
|
+
else {
|
|
362
|
+
// Skip complex expressions (e.g. IIFE, computed calls)
|
|
363
|
+
continue;
|
|
364
|
+
}
|
|
365
|
+
// Find the enclosing function
|
|
366
|
+
const callerName = findEnclosingFunctionName(call);
|
|
367
|
+
if (!callerName)
|
|
368
|
+
continue; // Skip top-level calls (no enclosing function)
|
|
369
|
+
result.callSites.push({
|
|
370
|
+
callerName,
|
|
371
|
+
calleeName,
|
|
372
|
+
filePath,
|
|
373
|
+
line: call.startPosition.row + 1,
|
|
374
|
+
receiver,
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
function extractTSParams(node) {
|
|
379
|
+
const paramsNode = node.childForFieldName('parameters');
|
|
380
|
+
if (!paramsNode)
|
|
381
|
+
return [];
|
|
382
|
+
const params = [];
|
|
383
|
+
for (let i = 0; i < paramsNode.namedChildCount; i++) {
|
|
384
|
+
const param = paramsNode.namedChild(i);
|
|
385
|
+
if (!param)
|
|
386
|
+
continue;
|
|
387
|
+
if (param.type === 'required_parameter' || param.type === 'optional_parameter') {
|
|
388
|
+
const pattern = param.childForFieldName('pattern');
|
|
389
|
+
if (pattern)
|
|
390
|
+
params.push(pattern.text);
|
|
391
|
+
}
|
|
392
|
+
else if (param.type === 'identifier') {
|
|
393
|
+
params.push(param.text);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
return params;
|
|
397
|
+
}
|
|
398
|
+
// ── Python extraction ──
|
|
399
|
+
function extractPython(root, filePath, result) {
|
|
400
|
+
extractPythonImports(root, filePath, result);
|
|
401
|
+
extractPythonClassesAndMethods(root, filePath, result);
|
|
402
|
+
extractPythonStandaloneFunctions(root, filePath, result);
|
|
403
|
+
extractPythonCallSites(root, filePath, result);
|
|
404
|
+
}
|
|
405
|
+
function extractPythonImports(root, filePath, result) {
|
|
406
|
+
// from X import Y, Z
|
|
407
|
+
const importFromNodes = root.descendantsOfType('import_from_statement');
|
|
408
|
+
for (const imp of importFromNodes) {
|
|
409
|
+
const moduleNode = imp.childForFieldName('module_name');
|
|
410
|
+
if (!moduleNode)
|
|
411
|
+
continue;
|
|
412
|
+
const source = moduleNode.text;
|
|
413
|
+
const nameNodes = imp.childrenForFieldName('name');
|
|
414
|
+
const specifiers = nameNodes.map((n) => n.text);
|
|
415
|
+
result.imports.push({
|
|
416
|
+
source,
|
|
417
|
+
specifiers,
|
|
418
|
+
filePath,
|
|
419
|
+
line: imp.startPosition.row + 1,
|
|
420
|
+
});
|
|
421
|
+
}
|
|
422
|
+
// import X
|
|
423
|
+
const importNodes = root.descendantsOfType('import_statement');
|
|
424
|
+
for (const imp of importNodes) {
|
|
425
|
+
// In Python, 'import_statement' is for bare `import X`
|
|
426
|
+
// Skip import_from_statement which are already handled
|
|
427
|
+
if (imp.type !== 'import_statement')
|
|
428
|
+
continue;
|
|
429
|
+
const nameNodes = imp.childrenForFieldName('name');
|
|
430
|
+
for (const nameNode of nameNodes) {
|
|
431
|
+
result.imports.push({
|
|
432
|
+
source: nameNode.text,
|
|
433
|
+
specifiers: [nameNode.text],
|
|
434
|
+
filePath,
|
|
435
|
+
line: imp.startPosition.row + 1,
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
function extractPythonClassesAndMethods(root, filePath, result) {
|
|
441
|
+
const classNodes = root.descendantsOfType('class_definition');
|
|
442
|
+
for (const cls of classNodes) {
|
|
443
|
+
const nameNode = cls.childForFieldName('name');
|
|
444
|
+
if (!nameNode)
|
|
445
|
+
continue;
|
|
446
|
+
const className = nameNode.text;
|
|
447
|
+
const bodyNode = cls.childForFieldName('body');
|
|
448
|
+
const methodNames = [];
|
|
449
|
+
if (bodyNode) {
|
|
450
|
+
const funcDefs = bodyNode.descendantsOfType('function_definition');
|
|
451
|
+
for (const fn of funcDefs) {
|
|
452
|
+
const fnNameNode = fn.childForFieldName('name');
|
|
453
|
+
if (!fnNameNode)
|
|
454
|
+
continue;
|
|
455
|
+
const fnName = fnNameNode.text;
|
|
456
|
+
methodNames.push(fnName);
|
|
457
|
+
const isAsync = fn.children.some((c) => c.type === 'async');
|
|
458
|
+
const params = extractPythonParams(fn, true);
|
|
459
|
+
result.functions.push({
|
|
460
|
+
name: fnName,
|
|
461
|
+
filePath,
|
|
462
|
+
startLine: fn.startPosition.row + 1,
|
|
463
|
+
endLine: fn.endPosition.row + 1,
|
|
464
|
+
params,
|
|
465
|
+
isAsync,
|
|
466
|
+
isExported: false, // Python doesn't have explicit exports
|
|
467
|
+
className,
|
|
468
|
+
});
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
result.classes.push({
|
|
472
|
+
name: className,
|
|
473
|
+
filePath,
|
|
474
|
+
startLine: cls.startPosition.row + 1,
|
|
475
|
+
endLine: cls.endPosition.row + 1,
|
|
476
|
+
methods: methodNames,
|
|
477
|
+
isExported: false,
|
|
478
|
+
});
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
function extractPythonStandaloneFunctions(root, filePath, result) {
|
|
482
|
+
const funcNodes = root.descendantsOfType('function_definition');
|
|
483
|
+
for (const fn of funcNodes) {
|
|
484
|
+
// Skip methods (functions inside a class body)
|
|
485
|
+
if (isInsidePythonClass(fn))
|
|
486
|
+
continue;
|
|
487
|
+
const nameNode = fn.childForFieldName('name');
|
|
488
|
+
if (!nameNode)
|
|
489
|
+
continue;
|
|
490
|
+
const isAsync = fn.children.some((c) => c.type === 'async');
|
|
491
|
+
const params = extractPythonParams(fn, false);
|
|
492
|
+
// Check if decorated
|
|
493
|
+
const parentIsDecorated = fn.parent?.type === 'decorated_definition';
|
|
494
|
+
const actualNode = parentIsDecorated ? fn.parent : fn;
|
|
495
|
+
result.functions.push({
|
|
496
|
+
name: nameNode.text,
|
|
497
|
+
filePath,
|
|
498
|
+
startLine: actualNode.startPosition.row + 1,
|
|
499
|
+
endLine: actualNode.endPosition.row + 1,
|
|
500
|
+
params,
|
|
501
|
+
isAsync,
|
|
502
|
+
isExported: false,
|
|
503
|
+
});
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
function extractPythonCallSites(root, filePath, result) {
|
|
507
|
+
const callNodes = root.descendantsOfType('call');
|
|
508
|
+
for (const call of callNodes) {
|
|
509
|
+
const funcNode = call.childForFieldName('function');
|
|
510
|
+
if (!funcNode)
|
|
511
|
+
continue;
|
|
512
|
+
let calleeName;
|
|
513
|
+
let receiver;
|
|
514
|
+
if (funcNode.type === 'attribute') {
|
|
515
|
+
const objectNode = funcNode.childForFieldName('object');
|
|
516
|
+
const attrNode = funcNode.childForFieldName('attribute');
|
|
517
|
+
calleeName = attrNode?.text ?? funcNode.text;
|
|
518
|
+
receiver = objectNode?.text;
|
|
519
|
+
}
|
|
520
|
+
else if (funcNode.type === 'identifier') {
|
|
521
|
+
calleeName = funcNode.text;
|
|
522
|
+
}
|
|
523
|
+
else {
|
|
524
|
+
continue;
|
|
525
|
+
}
|
|
526
|
+
const callerName = findEnclosingPythonFunctionName(call);
|
|
527
|
+
if (!callerName)
|
|
528
|
+
continue;
|
|
529
|
+
result.callSites.push({
|
|
530
|
+
callerName,
|
|
531
|
+
calleeName,
|
|
532
|
+
filePath,
|
|
533
|
+
line: call.startPosition.row + 1,
|
|
534
|
+
receiver,
|
|
535
|
+
});
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
function extractPythonParams(node, isMethod) {
|
|
539
|
+
const paramsNode = node.childForFieldName('parameters');
|
|
540
|
+
if (!paramsNode)
|
|
541
|
+
return [];
|
|
542
|
+
const params = [];
|
|
543
|
+
for (let i = 0; i < paramsNode.namedChildCount; i++) {
|
|
544
|
+
const param = paramsNode.namedChild(i);
|
|
545
|
+
if (!param)
|
|
546
|
+
continue;
|
|
547
|
+
const name = param.type === 'identifier'
|
|
548
|
+
? param.text
|
|
549
|
+
: param.type === 'typed_parameter'
|
|
550
|
+
? param.childForFieldName('name')?.text ?? param.children[0]?.text ?? null
|
|
551
|
+
: param.type === 'default_parameter'
|
|
552
|
+
? param.childForFieldName('name')?.text ?? param.children[0]?.text ?? null
|
|
553
|
+
: null;
|
|
554
|
+
if (!name)
|
|
555
|
+
continue;
|
|
556
|
+
// Skip 'self' and 'cls' for methods
|
|
557
|
+
if (isMethod && (name === 'self' || name === 'cls'))
|
|
558
|
+
continue;
|
|
559
|
+
params.push(name);
|
|
560
|
+
}
|
|
561
|
+
return params;
|
|
562
|
+
}
|
|
563
|
+
// ── Shared helpers ──
|
|
564
|
+
function isInsidePythonClass(node) {
|
|
565
|
+
let current = node.parent;
|
|
566
|
+
while (current) {
|
|
567
|
+
if (current.type === 'class_definition')
|
|
568
|
+
return true;
|
|
569
|
+
current = current.parent;
|
|
570
|
+
}
|
|
571
|
+
return false;
|
|
572
|
+
}
|
|
573
|
+
function findEnclosingFunctionName(node) {
|
|
574
|
+
let current = node.parent;
|
|
575
|
+
while (current) {
|
|
576
|
+
switch (current.type) {
|
|
577
|
+
case 'function_declaration': {
|
|
578
|
+
return current.childForFieldName('name')?.text ?? null;
|
|
579
|
+
}
|
|
580
|
+
case 'method_definition': {
|
|
581
|
+
return current.childForFieldName('name')?.text ?? null;
|
|
582
|
+
}
|
|
583
|
+
case 'arrow_function': {
|
|
584
|
+
// Check if assigned to a variable
|
|
585
|
+
const parent = current.parent;
|
|
586
|
+
if (parent?.type === 'variable_declarator') {
|
|
587
|
+
const nameNode = parent.childForFieldName('name');
|
|
588
|
+
if (nameNode?.type === 'identifier')
|
|
589
|
+
return nameNode.text;
|
|
590
|
+
}
|
|
591
|
+
break;
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
current = current.parent;
|
|
595
|
+
}
|
|
596
|
+
return null;
|
|
597
|
+
}
|
|
598
|
+
function findEnclosingPythonFunctionName(node) {
|
|
599
|
+
let current = node.parent;
|
|
600
|
+
while (current) {
|
|
601
|
+
if (current.type === 'function_definition') {
|
|
602
|
+
return current.childForFieldName('name')?.text ?? null;
|
|
603
|
+
}
|
|
604
|
+
current = current.parent;
|
|
605
|
+
}
|
|
606
|
+
return null;
|
|
607
|
+
}
|
|
608
|
+
function extractStringContent(node) {
|
|
609
|
+
// The string node contains: quote, string_fragment, quote
|
|
610
|
+
const fragment = node.descendantsOfType('string_fragment');
|
|
611
|
+
if (fragment.length > 0)
|
|
612
|
+
return fragment[0].text;
|
|
613
|
+
// Fallback: strip surrounding quotes
|
|
614
|
+
const text = node.text;
|
|
615
|
+
if ((text.startsWith("'") && text.endsWith("'")) || (text.startsWith('"') && text.endsWith('"'))) {
|
|
616
|
+
return text.slice(1, -1);
|
|
617
|
+
}
|
|
618
|
+
return null;
|
|
619
|
+
}
|
|
620
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../../src/engines/graph/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { GraphStore } from './store.js';
|
|
2
|
+
import type { Finding, AttackPath, BlastRadiusResult, MissingAuthResult } from '../../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Find paths from entry point functions to dangerous sink functions.
|
|
5
|
+
* Uses BFS via getCallees to trace call chains without native path queries.
|
|
6
|
+
*/
|
|
7
|
+
export declare function findAttackPaths(store: GraphStore): Promise<AttackPath[]>;
|
|
8
|
+
export declare function findBlastRadius(store: GraphStore, functionName: string): Promise<BlastRadiusResult>;
|
|
9
|
+
export declare function findMissingAuth(store: GraphStore): Promise<MissingAuthResult[]>;
|
|
10
|
+
export declare function queryResultsToFindings(attackPaths: AttackPath[], blastRadius: BlastRadiusResult[], missingAuth: MissingAuthResult[]): Finding[];
|
|
11
|
+
//# sourceMappingURL=queries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../../../src/engines/graph/queries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAiB,MAAM,YAAY,CAAC;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAqDhG;;;GAGG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAqE9E;AAID,wBAAsB,eAAe,CACnC,KAAK,EAAE,UAAU,EACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,iBAAiB,CAAC,CAyB5B;AAID,wBAAsB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAiCrF;AAID,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,UAAU,EAAE,EACzB,WAAW,EAAE,iBAAiB,EAAE,EAChC,WAAW,EAAE,iBAAiB,EAAE,GAC/B,OAAO,EAAE,CAuCX"}
|