java-class-analyzer-mcp-server 1.0.1

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.
@@ -0,0 +1,238 @@
1
+ import { exec } from 'child_process';
2
+ import { promisify } from 'util';
3
+ import * as fs from 'fs-extra';
4
+ import { readFile, readdir } from 'fs/promises';
5
+ import * as path from 'path';
6
+ import * as yauzl from 'yauzl';
7
+ import { fileURLToPath } from 'url';
8
+ import { createWriteStream } from 'fs';
9
+ import { DependencyScanner } from '../scanner/DependencyScanner.js';
10
+ const __filename = fileURLToPath(import.meta.url);
11
+ const __dirname = path.dirname(__filename);
12
+ const execAsync = promisify(exec);
13
+ export class DecompilerService {
14
+ scanner;
15
+ cfrPath;
16
+ constructor() {
17
+ this.scanner = new DependencyScanner();
18
+ this.cfrPath = '';
19
+ }
20
+ async initializeCfrPath() {
21
+ if (!this.cfrPath) {
22
+ this.cfrPath = await this.findCfrJar();
23
+ if (!this.cfrPath) {
24
+ throw new Error('未找到CFR反编译工具。请下载CFR jar包到lib目录或设置CFR_PATH环境变量');
25
+ }
26
+ console.error(`CFR工具路径: ${this.cfrPath}`);
27
+ }
28
+ }
29
+ /**
30
+ * 反编译指定的Java类文件
31
+ */
32
+ async decompileClass(className, projectPath, useCache = true, cfrPath) {
33
+ try {
34
+ // 如果外部指定了CFR路径,则使用外部路径
35
+ if (cfrPath) {
36
+ this.cfrPath = cfrPath;
37
+ console.error(`使用外部指定的CFR工具路径: ${this.cfrPath}`);
38
+ }
39
+ else {
40
+ await this.initializeCfrPath();
41
+ }
42
+ // 1. 检查缓存
43
+ const cachePath = this.getCachePath(className, projectPath);
44
+ if (useCache && await fs.pathExists(cachePath)) {
45
+ console.error(`使用缓存的反编译结果: ${cachePath}`);
46
+ return await readFile(cachePath, 'utf-8');
47
+ }
48
+ // 2. 查找类对应的JAR包
49
+ console.error(`查找类 ${className} 对应的JAR包...`);
50
+ // 添加超时处理
51
+ const jarPath = await Promise.race([
52
+ this.scanner.findJarForClass(className, projectPath),
53
+ new Promise((_, reject) => setTimeout(() => reject(new Error('查找JAR包超时')), 10000))
54
+ ]);
55
+ if (!jarPath) {
56
+ throw new Error(`未找到类 ${className} 对应的JAR包,请先运行 scan_dependencies 建立类索引`);
57
+ }
58
+ console.error(`找到JAR包: ${jarPath}`);
59
+ // 3. 从JAR包中提取.class文件
60
+ const classFilePath = await this.extractClassFile(jarPath, className);
61
+ // 4. 使用CFR反编译
62
+ const sourceCode = await this.decompileWithCfr(classFilePath);
63
+ // 5. 保存到缓存
64
+ if (useCache) {
65
+ await fs.ensureDir(path.dirname(cachePath));
66
+ await fs.outputFile(cachePath, sourceCode, 'utf-8');
67
+ console.error(`反编译结果已缓存: ${cachePath}`);
68
+ }
69
+ // 6. 清理临时文件(只有在不使用缓存时才清理)
70
+ if (!useCache) {
71
+ try {
72
+ await fs.remove(classFilePath);
73
+ console.error(`清理临时文件: ${classFilePath}`);
74
+ }
75
+ catch (cleanupError) {
76
+ console.warn(`清理临时文件失败: ${cleanupError}`);
77
+ }
78
+ }
79
+ return sourceCode;
80
+ }
81
+ catch (error) {
82
+ console.error(`反编译类 ${className} 失败:`, error);
83
+ throw error; // 重新抛出错误,让上层处理
84
+ }
85
+ }
86
+ /**
87
+ * 获取缓存文件路径
88
+ */
89
+ getCachePath(className, projectPath) {
90
+ const packagePath = className.substring(0, className.lastIndexOf('.'));
91
+ const simpleName = className.substring(className.lastIndexOf('.') + 1);
92
+ const cacheDir = path.join(projectPath, '.mcp-decompile-cache');
93
+ const packageDir = path.join(cacheDir, packagePath.replace(/\./g, path.sep));
94
+ return path.join(packageDir, `${simpleName}.java`);
95
+ }
96
+ /**
97
+ * 从JAR包中提取指定的.class文件
98
+ */
99
+ async extractClassFile(jarPath, className) {
100
+ const classFileName = className.replace(/\./g, '/') + '.class';
101
+ const tempDir = path.join(process.cwd(), '.mcp-class-temp');
102
+ // 按包名全路径创建目录结构
103
+ const packagePath = className.substring(0, className.lastIndexOf('.'));
104
+ const packageDir = path.join(tempDir, packagePath.replace(/\./g, path.sep));
105
+ const classFilePath = path.join(packageDir, `${className.substring(className.lastIndexOf('.') + 1)}.class`);
106
+ await fs.ensureDir(packageDir);
107
+ console.error(`从JAR包提取类文件: ${jarPath} -> ${classFileName}`);
108
+ return new Promise((resolve, reject) => {
109
+ yauzl.open(jarPath, { lazyEntries: true }, (err, zipfile) => {
110
+ if (err) {
111
+ reject(new Error(`无法打开JAR包 ${jarPath}: ${err.message}`));
112
+ return;
113
+ }
114
+ let found = false;
115
+ zipfile.readEntry();
116
+ zipfile.on('entry', (entry) => {
117
+ if (entry.fileName === classFileName) {
118
+ found = true;
119
+ zipfile.openReadStream(entry, (err, readStream) => {
120
+ if (err) {
121
+ reject(new Error(`无法读取JAR包中的类文件 ${classFileName}: ${err.message}`));
122
+ return;
123
+ }
124
+ const writeStream = createWriteStream(classFilePath);
125
+ readStream.pipe(writeStream);
126
+ writeStream.on('close', () => {
127
+ console.error(`类文件提取成功: ${classFilePath}`);
128
+ resolve(classFilePath);
129
+ });
130
+ writeStream.on('error', (err) => {
131
+ reject(new Error(`写入临时文件失败: ${err.message}`));
132
+ });
133
+ });
134
+ }
135
+ else {
136
+ zipfile.readEntry();
137
+ }
138
+ });
139
+ zipfile.on('end', () => {
140
+ if (!found) {
141
+ reject(new Error(`在JAR包 ${jarPath} 中未找到类文件: ${classFileName}`));
142
+ }
143
+ });
144
+ zipfile.on('error', (err) => {
145
+ reject(new Error(`读取JAR包失败: ${err.message}`));
146
+ });
147
+ });
148
+ });
149
+ }
150
+ /**
151
+ * 使用CFR反编译.class文件
152
+ */
153
+ async decompileWithCfr(classFilePath) {
154
+ if (!this.cfrPath) {
155
+ throw new Error('未找到CFR反编译工具,请确保CFR jar包在classpath中');
156
+ }
157
+ try {
158
+ const javaCmd = this.getJavaCommand();
159
+ // 如果Java路径包含空格,需要用引号包围
160
+ const quotedJavaCmd = javaCmd.includes(' ') ? `"${javaCmd}"` : javaCmd;
161
+ console.error(`执行CFR反编译: ${quotedJavaCmd} -jar "${this.cfrPath}" "${classFilePath}"`);
162
+ const { stdout, stderr } = await execAsync(`${quotedJavaCmd} -jar "${this.cfrPath}" "${classFilePath}" --silent true`, { timeout: 30000 });
163
+ if (stderr && stderr.trim()) {
164
+ console.warn('CFR警告:', stderr);
165
+ }
166
+ if (!stdout || stdout.trim() === '') {
167
+ throw new Error('CFR反编译返回空结果,可能是类文件损坏或CFR版本不兼容');
168
+ }
169
+ return stdout;
170
+ }
171
+ catch (error) {
172
+ console.error('CFR反编译执行失败:', error);
173
+ if (error instanceof Error && error.message.includes('timeout')) {
174
+ throw new Error('CFR反编译超时,请检查Java环境和CFR工具');
175
+ }
176
+ throw new Error(`CFR反编译失败: ${error instanceof Error ? error.message : String(error)}`);
177
+ }
178
+ }
179
+ /**
180
+ * 查找CFR jar包路径
181
+ */
182
+ async findCfrJar() {
183
+ // 尝试从多个可能的位置查找CFR
184
+ const searchPaths = [
185
+ path.join(process.cwd(), 'lib'),
186
+ process.cwd(),
187
+ path.join(__dirname, '..', '..', 'lib'),
188
+ path.join(__dirname, '..', '..'),
189
+ ];
190
+ for (const searchPath of searchPaths) {
191
+ if (await fs.pathExists(searchPath)) {
192
+ const files = await readdir(searchPath);
193
+ const cfrJar = files.find(file => /^cfr-.*\.jar$/.test(file));
194
+ if (cfrJar) {
195
+ return path.join(searchPath, cfrJar);
196
+ }
197
+ }
198
+ }
199
+ // 如果没找到,尝试从classpath中查找
200
+ const classpath = process.env.CLASSPATH || '';
201
+ const classpathEntries = classpath.split(path.delimiter);
202
+ for (const entry of classpathEntries) {
203
+ if (entry.includes('cfr') && entry.endsWith('.jar')) {
204
+ return entry;
205
+ }
206
+ }
207
+ return '';
208
+ }
209
+ /**
210
+ * 批量反编译多个类
211
+ */
212
+ async decompileClasses(classNames, projectPath, useCache = true, cfrPath) {
213
+ const results = new Map();
214
+ for (const className of classNames) {
215
+ try {
216
+ const sourceCode = await this.decompileClass(className, projectPath, useCache, cfrPath);
217
+ results.set(className, sourceCode);
218
+ }
219
+ catch (error) {
220
+ console.warn(`反编译类 ${className} 失败: ${error}`);
221
+ results.set(className, `// 反编译失败: ${error}`);
222
+ }
223
+ }
224
+ return results;
225
+ }
226
+ /**
227
+ * 获取Java命令路径
228
+ */
229
+ getJavaCommand() {
230
+ const javaHome = process.env.JAVA_HOME;
231
+ if (javaHome) {
232
+ const javaCmd = process.platform === 'win32' ? 'java.exe' : 'java';
233
+ return path.join(javaHome, 'bin', javaCmd);
234
+ }
235
+ return 'java'; // 回退到PATH中的java
236
+ }
237
+ }
238
+ //# sourceMappingURL=DecompilerService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DecompilerService.js","sourceRoot":"","sources":["../../src/decompiler/DecompilerService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env node
2
+ export declare class JavaClassAnalyzerMCPServer {
3
+ private server;
4
+ private analyzer;
5
+ private scanner;
6
+ private decompiler;
7
+ constructor();
8
+ private setupHandlers;
9
+ private handleScanDependencies;
10
+ private handleDecompileClass;
11
+ private handleAnalyzeClass;
12
+ /**
13
+ * 确保索引文件存在,如果不存在则自动创建
14
+ */
15
+ private ensureIndexExists;
16
+ run(): Promise<void>;
17
+ }
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAYA,qBAAa,0BAA0B;IACnC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,UAAU,CAAoB;;IA8BtC,OAAO,CAAC,aAAa;YAoGP,sBAAsB;YAmBtB,oBAAoB;YA2CpB,kBAAkB;IAyChC;;OAEG;YACW,iBAAiB;IAkBzB,GAAG;CAWZ"}
package/dist/index.js ADDED
@@ -0,0 +1,267 @@
1
+ #!/usr/bin/env node
2
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
3
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
5
+ import { JavaClassAnalyzer } from './analyzer/JavaClassAnalyzer.js';
6
+ import { DependencyScanner } from './scanner/DependencyScanner.js';
7
+ import { DecompilerService } from './decompiler/DecompilerService.js';
8
+ export class JavaClassAnalyzerMCPServer {
9
+ server;
10
+ analyzer;
11
+ scanner;
12
+ decompiler;
13
+ constructor() {
14
+ this.server = new Server({
15
+ name: 'java-class-analyzer',
16
+ version: '1.0.0',
17
+ capabilities: {
18
+ tools: {
19
+ scan_dependencies: {
20
+ description: '扫描Maven项目的所有依赖,建立类名到JAR包的映射索引',
21
+ },
22
+ decompile_class: {
23
+ description: '反编译指定的Java类文件,返回Java源码',
24
+ },
25
+ analyze_class: {
26
+ description: '分析Java类的结构、方法、字段等信息',
27
+ },
28
+ },
29
+ },
30
+ });
31
+ this.analyzer = new JavaClassAnalyzer();
32
+ this.scanner = new DependencyScanner();
33
+ this.decompiler = new DecompilerService();
34
+ this.setupHandlers();
35
+ }
36
+ setupHandlers() {
37
+ this.server.setRequestHandler(ListToolsRequestSchema, async () => {
38
+ return {
39
+ tools: [
40
+ {
41
+ name: 'scan_dependencies',
42
+ description: '扫描Maven项目的所有依赖,建立类名到JAR包的映射索引',
43
+ inputSchema: {
44
+ type: 'object',
45
+ properties: {
46
+ projectPath: {
47
+ type: 'string',
48
+ description: 'Maven项目根目录路径',
49
+ },
50
+ forceRefresh: {
51
+ type: 'boolean',
52
+ description: '是否强制刷新索引',
53
+ default: false,
54
+ },
55
+ },
56
+ required: ['projectPath'],
57
+ },
58
+ },
59
+ {
60
+ name: 'decompile_class',
61
+ description: '反编译指定的Java类文件,返回Java源码',
62
+ inputSchema: {
63
+ type: 'object',
64
+ properties: {
65
+ className: {
66
+ type: 'string',
67
+ description: '要反编译的Java类全名,如:com.example.QueryBizOrderDO',
68
+ },
69
+ projectPath: {
70
+ type: 'string',
71
+ description: 'Maven项目根目录路径',
72
+ },
73
+ useCache: {
74
+ type: 'boolean',
75
+ description: '是否使用缓存,默认true',
76
+ default: true,
77
+ },
78
+ cfrPath: {
79
+ type: 'string',
80
+ description: 'CFR反编译工具的jar包路径,可选',
81
+ },
82
+ },
83
+ required: ['className', 'projectPath'],
84
+ },
85
+ },
86
+ {
87
+ name: 'analyze_class',
88
+ description: '分析Java类的结构、方法、字段等信息',
89
+ inputSchema: {
90
+ type: 'object',
91
+ properties: {
92
+ className: {
93
+ type: 'string',
94
+ description: '要分析的Java类全名',
95
+ },
96
+ projectPath: {
97
+ type: 'string',
98
+ description: 'Maven项目根目录路径',
99
+ },
100
+ },
101
+ required: ['className', 'projectPath'],
102
+ },
103
+ },
104
+ ],
105
+ };
106
+ });
107
+ this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
108
+ const { name, arguments: args } = request.params;
109
+ try {
110
+ switch (name) {
111
+ case 'scan_dependencies':
112
+ return await this.handleScanDependencies(args);
113
+ case 'decompile_class':
114
+ return await this.handleDecompileClass(args);
115
+ case 'analyze_class':
116
+ return await this.handleAnalyzeClass(args);
117
+ default:
118
+ throw new Error(`Unknown tool: ${name}`);
119
+ }
120
+ }
121
+ catch (error) {
122
+ console.error(`工具调用异常 [${name}]:`, error);
123
+ return {
124
+ content: [
125
+ {
126
+ type: 'text',
127
+ text: `工具调用失败: ${error instanceof Error ? error.message : String(error)}\n\n建议:\n1. 检查输入参数是否正确\n2. 确保已运行必要的准备工作\n3. 查看服务器日志获取详细信息`,
128
+ },
129
+ ],
130
+ };
131
+ }
132
+ });
133
+ }
134
+ async handleScanDependencies(args) {
135
+ const { projectPath, forceRefresh = false } = args;
136
+ const result = await this.scanner.scanProject(projectPath, forceRefresh);
137
+ return {
138
+ content: [
139
+ {
140
+ type: 'text',
141
+ text: `依赖扫描完成!\n\n` +
142
+ `扫描的JAR包数量: ${result.jarCount}\n` +
143
+ `索引的类数量: ${result.classCount}\n` +
144
+ `索引文件路径: ${result.indexPath}\n\n` +
145
+ `示例索引条目:\n${result.sampleEntries.slice(0, 5).join('\n')}`,
146
+ },
147
+ ],
148
+ };
149
+ }
150
+ async handleDecompileClass(args) {
151
+ const { className, projectPath, useCache = true, cfrPath } = args;
152
+ try {
153
+ console.error(`开始反编译类: ${className}, 项目路径: ${projectPath}, 使用缓存: ${useCache}, CFR路径: ${cfrPath || '自动查找'}`);
154
+ // 检查索引是否存在,如果不存在则先创建
155
+ await this.ensureIndexExists(projectPath);
156
+ const sourceCode = await this.decompiler.decompileClass(className, projectPath, useCache, cfrPath);
157
+ if (!sourceCode || sourceCode.trim() === '') {
158
+ return {
159
+ content: [
160
+ {
161
+ type: 'text',
162
+ text: `警告: 类 ${className} 的反编译结果为空,可能是CFR工具问题或类文件损坏`,
163
+ },
164
+ ],
165
+ };
166
+ }
167
+ return {
168
+ content: [
169
+ {
170
+ type: 'text',
171
+ text: `类 ${className} 的反编译源码:\n\n\`\`\`java\n${sourceCode}\n\`\`\``,
172
+ },
173
+ ],
174
+ };
175
+ }
176
+ catch (error) {
177
+ console.error(`反编译类 ${className} 失败:`, error);
178
+ return {
179
+ content: [
180
+ {
181
+ type: 'text',
182
+ text: `反编译失败: ${error instanceof Error ? error.message : String(error)}\n\n建议:\n1. 确保已运行 scan_dependencies 建立类索引\n2. 检查CFR工具是否正确安装\n3. 验证类名是否正确`,
183
+ },
184
+ ],
185
+ };
186
+ }
187
+ }
188
+ async handleAnalyzeClass(args) {
189
+ const { className, projectPath } = args;
190
+ // 检查索引是否存在,如果不存在则先创建
191
+ await this.ensureIndexExists(projectPath);
192
+ const analysis = await this.analyzer.analyzeClass(className, projectPath);
193
+ let result = `类 ${className} 的分析结果:\n\n`;
194
+ result += `包名: ${analysis.packageName}\n`;
195
+ result += `类名: ${analysis.className}\n`;
196
+ result += `修饰符: ${analysis.modifiers.join(' ')}\n`;
197
+ result += `父类: ${analysis.superClass || '无'}\n`;
198
+ result += `实现的接口: ${analysis.interfaces.join(', ') || '无'}\n\n`;
199
+ if (analysis.fields.length > 0) {
200
+ result += `字段 (${analysis.fields.length}个):\n`;
201
+ analysis.fields.forEach(field => {
202
+ result += ` - ${field.modifiers.join(' ')} ${field.type} ${field.name}\n`;
203
+ });
204
+ result += '\n';
205
+ }
206
+ if (analysis.methods.length > 0) {
207
+ result += `方法 (${analysis.methods.length}个):\n`;
208
+ analysis.methods.forEach(method => {
209
+ result += ` - ${method.modifiers.join(' ')} ${method.returnType} ${method.name}(${method.parameters.join(', ')})\n`;
210
+ });
211
+ result += '\n';
212
+ }
213
+ return {
214
+ content: [
215
+ {
216
+ type: 'text',
217
+ text: result,
218
+ },
219
+ ],
220
+ };
221
+ }
222
+ /**
223
+ * 确保索引文件存在,如果不存在则自动创建
224
+ */
225
+ async ensureIndexExists(projectPath) {
226
+ const fs = await import('fs-extra');
227
+ const path = await import('path');
228
+ const indexPath = path.join(projectPath, '.mcp-class-index.json');
229
+ if (!(await fs.pathExists(indexPath))) {
230
+ console.error('索引文件不存在,正在自动创建...');
231
+ try {
232
+ await this.scanner.scanProject(projectPath, false);
233
+ console.error('索引文件创建完成');
234
+ }
235
+ catch (error) {
236
+ console.error('自动创建索引失败:', error);
237
+ throw new Error(`无法创建类索引文件: ${error instanceof Error ? error.message : String(error)}`);
238
+ }
239
+ }
240
+ }
241
+ async run() {
242
+ const transport = new StdioServerTransport();
243
+ await this.server.connect(transport);
244
+ const env = process.env.NODE_ENV || 'development';
245
+ if (env === 'development') {
246
+ console.error('Java Class Analyzer MCP Server running on stdio (DEBUG MODE)');
247
+ }
248
+ else {
249
+ console.error('Java Class Analyzer MCP Server running on stdio');
250
+ }
251
+ }
252
+ }
253
+ const mcpServer = new JavaClassAnalyzerMCPServer();
254
+ // 添加全局异常处理,防止服务器崩溃
255
+ process.on('uncaughtException', (error) => {
256
+ console.error('未捕获的异常:', error);
257
+ // 不退出进程,继续运行
258
+ });
259
+ process.on('unhandledRejection', (reason, promise) => {
260
+ console.error('未处理的Promise拒绝:', reason);
261
+ // 不退出进程,继续运行
262
+ });
263
+ mcpServer.run().catch((error) => {
264
+ console.error('服务器启动失败:', error);
265
+ process.exit(1);
266
+ });
267
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ export interface ClassIndexEntry {
2
+ className: string;
3
+ jarPath: string;
4
+ packageName: string;
5
+ simpleName: string;
6
+ }
7
+ export interface ScanResult {
8
+ jarCount: number;
9
+ classCount: number;
10
+ indexPath: string;
11
+ sampleEntries: string[];
12
+ }
13
+ export declare class DependencyScanner {
14
+ private indexCache;
15
+ /**
16
+ * 扫描Maven项目的所有依赖,建立类名到JAR包的映射索引
17
+ */
18
+ scanProject(projectPath: string, forceRefresh?: boolean): Promise<ScanResult>;
19
+ /**
20
+ * 获取Maven依赖树中的所有JAR包路径
21
+ */
22
+ private getMavenDependencies;
23
+ /**
24
+ * 从本地Maven仓库扫描JAR包
25
+ */
26
+ private scanLocalMavenRepo;
27
+ /**
28
+ * 解析依赖坐标,获取JAR包路径
29
+ */
30
+ private resolveJarPath;
31
+ /**
32
+ * 从JAR包中提取所有类文件信息
33
+ */
34
+ private extractClassesFromJar;
35
+ /**
36
+ * 根据类名查找对应的JAR包路径
37
+ */
38
+ findJarForClass(className: string, projectPath: string): Promise<string | null>;
39
+ /**
40
+ * 获取所有已索引的类名
41
+ */
42
+ getAllClassNames(projectPath: string): Promise<string[]>;
43
+ /**
44
+ * 获取Maven命令路径
45
+ */
46
+ private getMavenCommand;
47
+ /**
48
+ * 获取Maven本地仓库路径
49
+ */
50
+ private getMavenRepositoryPath;
51
+ }
52
+ //# sourceMappingURL=DependencyScanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DependencyScanner.d.ts","sourceRoot":"","sources":["../../src/scanner/DependencyScanner.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,eAAe;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,qBAAa,iBAAiB;IAC1B,OAAO,CAAC,UAAU,CAA6C;IAE/D;;OAEG;IACG,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,GAAE,OAAe,GAAG,OAAO,CAAC,UAAU,CAAC;IAyE1F;;OAEG;YACW,oBAAoB;IAoClC;;OAEG;YACW,kBAAkB;IA2BhC;;OAEG;YACW,cAAc;IAqB5B;;OAEG;YACW,qBAAqB;IA4CnC;;OAEG;IACG,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAcrF;;OAEG;IACG,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAa9D;;OAEG;IACH,OAAO,CAAC,eAAe;IASvB;;OAEG;IACH,OAAO,CAAC,sBAAsB;CAWjC"}