@mycodemap/mycodemap 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/CHANGELOG.md +17 -0
- package/LICENSE +21 -0
- package/README.md +559 -0
- package/dist/ai/claude.d.ts +38 -0
- package/dist/ai/claude.d.ts.map +1 -0
- package/dist/ai/claude.js +169 -0
- package/dist/ai/claude.js.map +1 -0
- package/dist/ai/codex.d.ts +38 -0
- package/dist/ai/codex.d.ts.map +1 -0
- package/dist/ai/codex.js +169 -0
- package/dist/ai/codex.js.map +1 -0
- package/dist/ai/factory.d.ts +48 -0
- package/dist/ai/factory.d.ts.map +1 -0
- package/dist/ai/factory.js +95 -0
- package/dist/ai/factory.js.map +1 -0
- package/dist/ai/index.d.ts +12 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +29 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/provider.d.ts +70 -0
- package/dist/ai/provider.d.ts.map +1 -0
- package/dist/ai/provider.js +31 -0
- package/dist/ai/provider.js.map +1 -0
- package/dist/ai/subagent-caller.d.ts +90 -0
- package/dist/ai/subagent-caller.d.ts.map +1 -0
- package/dist/ai/subagent-caller.js +280 -0
- package/dist/ai/subagent-caller.js.map +1 -0
- package/dist/ai/types.d.ts +70 -0
- package/dist/ai/types.d.ts.map +1 -0
- package/dist/ai/types.js +5 -0
- package/dist/ai/types.js.map +1 -0
- package/dist/cache/file-hash-cache.d.ts +76 -0
- package/dist/cache/file-hash-cache.d.ts.map +1 -0
- package/dist/cache/file-hash-cache.js +159 -0
- package/dist/cache/file-hash-cache.js.map +1 -0
- package/dist/cache/index.d.ts +151 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +303 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/lru-cache.d.ts +93 -0
- package/dist/cache/lru-cache.d.ts.map +1 -0
- package/dist/cache/lru-cache.js +194 -0
- package/dist/cache/lru-cache.js.map +1 -0
- package/dist/cache/parse-cache.d.ts +68 -0
- package/dist/cache/parse-cache.d.ts.map +1 -0
- package/dist/cache/parse-cache.js +173 -0
- package/dist/cache/parse-cache.js.map +1 -0
- package/dist/cli/commands/analyze.d.ts +96 -0
- package/dist/cli/commands/analyze.d.ts.map +1 -0
- package/dist/cli/commands/analyze.js +567 -0
- package/dist/cli/commands/analyze.js.map +1 -0
- package/dist/cli/commands/ci.d.ts +25 -0
- package/dist/cli/commands/ci.d.ts.map +1 -0
- package/dist/cli/commands/ci.js +481 -0
- package/dist/cli/commands/ci.js.map +1 -0
- package/dist/cli/commands/complexity.d.ts +70 -0
- package/dist/cli/commands/complexity.d.ts.map +1 -0
- package/dist/cli/commands/complexity.js +479 -0
- package/dist/cli/commands/complexity.js.map +1 -0
- package/dist/cli/commands/cycles.d.ts +10 -0
- package/dist/cli/commands/cycles.d.ts.map +1 -0
- package/dist/cli/commands/cycles.js +202 -0
- package/dist/cli/commands/cycles.js.map +1 -0
- package/dist/cli/commands/deps.d.ts +61 -0
- package/dist/cli/commands/deps.d.ts.map +1 -0
- package/dist/cli/commands/deps.js +340 -0
- package/dist/cli/commands/deps.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +8 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +61 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/cli/commands/impact.d.ts +55 -0
- package/dist/cli/commands/impact.d.ts.map +1 -0
- package/dist/cli/commands/impact.js +455 -0
- package/dist/cli/commands/impact.js.map +1 -0
- package/dist/cli/commands/init.d.ts +4 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +50 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/query.d.ts +22 -0
- package/dist/cli/commands/query.d.ts.map +1 -0
- package/dist/cli/commands/query.js +718 -0
- package/dist/cli/commands/query.js.map +1 -0
- package/dist/cli/commands/watch-foreground.d.ts +9 -0
- package/dist/cli/commands/watch-foreground.d.ts.map +1 -0
- package/dist/cli/commands/watch-foreground.js +67 -0
- package/dist/cli/commands/watch-foreground.js.map +1 -0
- package/dist/cli/commands/watch.d.ts +12 -0
- package/dist/cli/commands/watch.d.ts.map +1 -0
- package/dist/cli/commands/watch.js +114 -0
- package/dist/cli/commands/watch.js.map +1 -0
- package/dist/cli/commands/workflow.d.ts +25 -0
- package/dist/cli/commands/workflow.d.ts.map +1 -0
- package/dist/cli/commands/workflow.js +488 -0
- package/dist/cli/commands/workflow.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +115 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/paths.d.ts +90 -0
- package/dist/cli/paths.d.ts.map +1 -0
- package/dist/cli/paths.js +136 -0
- package/dist/cli/paths.js.map +1 -0
- package/dist/cli/runtime-logger.d.ts +13 -0
- package/dist/cli/runtime-logger.d.ts.map +1 -0
- package/dist/cli/runtime-logger.js +213 -0
- package/dist/cli/runtime-logger.js.map +1 -0
- package/dist/core/analyzer.d.ts +3 -0
- package/dist/core/analyzer.d.ts.map +1 -0
- package/dist/core/analyzer.js +359 -0
- package/dist/core/analyzer.js.map +1 -0
- package/dist/core/ast-complexity-analyzer.d.ts +40 -0
- package/dist/core/ast-complexity-analyzer.d.ts.map +1 -0
- package/dist/core/ast-complexity-analyzer.js +279 -0
- package/dist/core/ast-complexity-analyzer.js.map +1 -0
- package/dist/core/global-index.d.ts +69 -0
- package/dist/core/global-index.d.ts.map +1 -0
- package/dist/core/global-index.js +388 -0
- package/dist/core/global-index.js.map +1 -0
- package/dist/generator/ai-overview.d.ts +51 -0
- package/dist/generator/ai-overview.d.ts.map +1 -0
- package/dist/generator/ai-overview.js +160 -0
- package/dist/generator/ai-overview.js.map +1 -0
- package/dist/generator/context.d.ts +5 -0
- package/dist/generator/context.d.ts.map +1 -0
- package/dist/generator/context.js +514 -0
- package/dist/generator/context.js.map +1 -0
- package/dist/generator/file-describer.d.ts +93 -0
- package/dist/generator/file-describer.d.ts.map +1 -0
- package/dist/generator/file-describer.js +375 -0
- package/dist/generator/file-describer.js.map +1 -0
- package/dist/generator/index.d.ts +8 -0
- package/dist/generator/index.d.ts.map +1 -0
- package/dist/generator/index.js +259 -0
- package/dist/generator/index.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/orchestrator/adapters/ast-grep-adapter.d.ts +75 -0
- package/dist/orchestrator/adapters/ast-grep-adapter.d.ts.map +1 -0
- package/dist/orchestrator/adapters/ast-grep-adapter.js +242 -0
- package/dist/orchestrator/adapters/ast-grep-adapter.js.map +1 -0
- package/dist/orchestrator/adapters/base-adapter.d.ts +24 -0
- package/dist/orchestrator/adapters/base-adapter.d.ts.map +1 -0
- package/dist/orchestrator/adapters/base-adapter.js +2 -0
- package/dist/orchestrator/adapters/base-adapter.js.map +1 -0
- package/dist/orchestrator/adapters/codemap-adapter.d.ts +56 -0
- package/dist/orchestrator/adapters/codemap-adapter.d.ts.map +1 -0
- package/dist/orchestrator/adapters/codemap-adapter.js +163 -0
- package/dist/orchestrator/adapters/codemap-adapter.js.map +1 -0
- package/dist/orchestrator/adapters/index.d.ts +10 -0
- package/dist/orchestrator/adapters/index.d.ts.map +1 -0
- package/dist/orchestrator/adapters/index.js +3 -0
- package/dist/orchestrator/adapters/index.js.map +1 -0
- package/dist/orchestrator/ai-feed-generator.d.ts +210 -0
- package/dist/orchestrator/ai-feed-generator.d.ts.map +1 -0
- package/dist/orchestrator/ai-feed-generator.js +377 -0
- package/dist/orchestrator/ai-feed-generator.js.map +1 -0
- package/dist/orchestrator/commit-validator.d.ts +30 -0
- package/dist/orchestrator/commit-validator.d.ts.map +1 -0
- package/dist/orchestrator/commit-validator.js +87 -0
- package/dist/orchestrator/commit-validator.js.map +1 -0
- package/dist/orchestrator/confidence.d.ts +25 -0
- package/dist/orchestrator/confidence.d.ts.map +1 -0
- package/dist/orchestrator/confidence.js +138 -0
- package/dist/orchestrator/confidence.js.map +1 -0
- package/dist/orchestrator/file-header-scanner.d.ts +48 -0
- package/dist/orchestrator/file-header-scanner.d.ts.map +1 -0
- package/dist/orchestrator/file-header-scanner.js +158 -0
- package/dist/orchestrator/file-header-scanner.js.map +1 -0
- package/dist/orchestrator/git-analyzer.d.ts +192 -0
- package/dist/orchestrator/git-analyzer.d.ts.map +1 -0
- package/dist/orchestrator/git-analyzer.js +539 -0
- package/dist/orchestrator/git-analyzer.js.map +1 -0
- package/dist/orchestrator/index.d.ts +20 -0
- package/dist/orchestrator/index.d.ts.map +1 -0
- package/dist/orchestrator/index.js +16 -0
- package/dist/orchestrator/index.js.map +1 -0
- package/dist/orchestrator/intent-router.d.ts +41 -0
- package/dist/orchestrator/intent-router.d.ts.map +1 -0
- package/dist/orchestrator/intent-router.js +98 -0
- package/dist/orchestrator/intent-router.js.map +1 -0
- package/dist/orchestrator/result-fusion.d.ts +114 -0
- package/dist/orchestrator/result-fusion.d.ts.map +1 -0
- package/dist/orchestrator/result-fusion.js +332 -0
- package/dist/orchestrator/result-fusion.js.map +1 -0
- package/dist/orchestrator/test-linker.d.ts +166 -0
- package/dist/orchestrator/test-linker.d.ts.map +1 -0
- package/dist/orchestrator/test-linker.js +570 -0
- package/dist/orchestrator/test-linker.js.map +1 -0
- package/dist/orchestrator/tool-orchestrator.d.ts +108 -0
- package/dist/orchestrator/tool-orchestrator.d.ts.map +1 -0
- package/dist/orchestrator/tool-orchestrator.js +247 -0
- package/dist/orchestrator/tool-orchestrator.js.map +1 -0
- package/dist/orchestrator/types.d.ts +162 -0
- package/dist/orchestrator/types.d.ts.map +1 -0
- package/dist/orchestrator/types.js +39 -0
- package/dist/orchestrator/types.js.map +1 -0
- package/dist/orchestrator/workflow/ci-executor.d.ts +157 -0
- package/dist/orchestrator/workflow/ci-executor.d.ts.map +1 -0
- package/dist/orchestrator/workflow/ci-executor.js +423 -0
- package/dist/orchestrator/workflow/ci-executor.js.map +1 -0
- package/dist/orchestrator/workflow/config.d.ts +97 -0
- package/dist/orchestrator/workflow/config.d.ts.map +1 -0
- package/dist/orchestrator/workflow/config.js +115 -0
- package/dist/orchestrator/workflow/config.js.map +1 -0
- package/dist/orchestrator/workflow/git-analyzer.d.ts +173 -0
- package/dist/orchestrator/workflow/git-analyzer.d.ts.map +1 -0
- package/dist/orchestrator/workflow/git-analyzer.js +473 -0
- package/dist/orchestrator/workflow/git-analyzer.js.map +1 -0
- package/dist/orchestrator/workflow/index.d.ts +21 -0
- package/dist/orchestrator/workflow/index.d.ts.map +1 -0
- package/dist/orchestrator/workflow/index.js +21 -0
- package/dist/orchestrator/workflow/index.js.map +1 -0
- package/dist/orchestrator/workflow/phase-checkpoint.d.ts +38 -0
- package/dist/orchestrator/workflow/phase-checkpoint.d.ts.map +1 -0
- package/dist/orchestrator/workflow/phase-checkpoint.js +75 -0
- package/dist/orchestrator/workflow/phase-checkpoint.js.map +1 -0
- package/dist/orchestrator/workflow/phase-inheritance.d.ts +128 -0
- package/dist/orchestrator/workflow/phase-inheritance.d.ts.map +1 -0
- package/dist/orchestrator/workflow/phase-inheritance.js +266 -0
- package/dist/orchestrator/workflow/phase-inheritance.js.map +1 -0
- package/dist/orchestrator/workflow/result-fusion.d.ts +117 -0
- package/dist/orchestrator/workflow/result-fusion.d.ts.map +1 -0
- package/dist/orchestrator/workflow/result-fusion.js +246 -0
- package/dist/orchestrator/workflow/result-fusion.js.map +1 -0
- package/dist/orchestrator/workflow/templates.d.ts +116 -0
- package/dist/orchestrator/workflow/templates.d.ts.map +1 -0
- package/dist/orchestrator/workflow/templates.js +546 -0
- package/dist/orchestrator/workflow/templates.js.map +1 -0
- package/dist/orchestrator/workflow/test-linker.d.ts +152 -0
- package/dist/orchestrator/workflow/test-linker.d.ts.map +1 -0
- package/dist/orchestrator/workflow/test-linker.js +342 -0
- package/dist/orchestrator/workflow/test-linker.js.map +1 -0
- package/dist/orchestrator/workflow/types.d.ts +202 -0
- package/dist/orchestrator/workflow/types.d.ts.map +1 -0
- package/dist/orchestrator/workflow/types.js +4 -0
- package/dist/orchestrator/workflow/types.js.map +1 -0
- package/dist/orchestrator/workflow/visualizer.d.ts +56 -0
- package/dist/orchestrator/workflow/visualizer.d.ts.map +1 -0
- package/dist/orchestrator/workflow/visualizer.js +300 -0
- package/dist/orchestrator/workflow/visualizer.js.map +1 -0
- package/dist/orchestrator/workflow/workflow-context.d.ts +50 -0
- package/dist/orchestrator/workflow/workflow-context.d.ts.map +1 -0
- package/dist/orchestrator/workflow/workflow-context.js +105 -0
- package/dist/orchestrator/workflow/workflow-context.js.map +1 -0
- package/dist/orchestrator/workflow/workflow-orchestrator.d.ts +126 -0
- package/dist/orchestrator/workflow/workflow-orchestrator.d.ts.map +1 -0
- package/dist/orchestrator/workflow/workflow-orchestrator.js +489 -0
- package/dist/orchestrator/workflow/workflow-orchestrator.js.map +1 -0
- package/dist/orchestrator/workflow/workflow-persistence.d.ts +38 -0
- package/dist/orchestrator/workflow/workflow-persistence.d.ts.map +1 -0
- package/dist/orchestrator/workflow/workflow-persistence.js +166 -0
- package/dist/orchestrator/workflow/workflow-persistence.js.map +1 -0
- package/dist/parser/implementations/fast-parser.d.ts +65 -0
- package/dist/parser/implementations/fast-parser.d.ts.map +1 -0
- package/dist/parser/implementations/fast-parser.js +299 -0
- package/dist/parser/implementations/fast-parser.js.map +1 -0
- package/dist/parser/implementations/smart-parser.d.ts +220 -0
- package/dist/parser/implementations/smart-parser.d.ts.map +1 -0
- package/dist/parser/implementations/smart-parser.js +1536 -0
- package/dist/parser/implementations/smart-parser.js.map +1 -0
- package/dist/parser/implementations/tree-sitter-parser.d.ts +57 -0
- package/dist/parser/implementations/tree-sitter-parser.d.ts.map +1 -0
- package/dist/parser/implementations/tree-sitter-parser.js +375 -0
- package/dist/parser/implementations/tree-sitter-parser.js.map +1 -0
- package/dist/parser/index.d.ts +19 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +449 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/interfaces/IParser.d.ts +218 -0
- package/dist/parser/interfaces/IParser.d.ts.map +1 -0
- package/dist/parser/interfaces/IParser.js +22 -0
- package/dist/parser/interfaces/IParser.js.map +1 -0
- package/dist/plugins/built-in/call-graph.d.ts +38 -0
- package/dist/plugins/built-in/call-graph.d.ts.map +1 -0
- package/dist/plugins/built-in/call-graph.js +135 -0
- package/dist/plugins/built-in/call-graph.js.map +1 -0
- package/dist/plugins/built-in/complexity-analyzer.d.ts +45 -0
- package/dist/plugins/built-in/complexity-analyzer.d.ts.map +1 -0
- package/dist/plugins/built-in/complexity-analyzer.js +155 -0
- package/dist/plugins/built-in/complexity-analyzer.js.map +1 -0
- package/dist/plugins/index.d.ts +34 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +103 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/plugin-loader.d.ts +22 -0
- package/dist/plugins/plugin-loader.d.ts.map +1 -0
- package/dist/plugins/plugin-loader.js +200 -0
- package/dist/plugins/plugin-loader.js.map +1 -0
- package/dist/plugins/plugin-registry.d.ts +20 -0
- package/dist/plugins/plugin-registry.d.ts.map +1 -0
- package/dist/plugins/plugin-registry.js +143 -0
- package/dist/plugins/plugin-registry.js.map +1 -0
- package/dist/plugins/types.d.ts +72 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +5 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/types/index.d.ts +373 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/watcher/daemon.d.ts +64 -0
- package/dist/watcher/daemon.d.ts.map +1 -0
- package/dist/watcher/daemon.js +189 -0
- package/dist/watcher/daemon.js.map +1 -0
- package/dist/watcher/file-watcher.d.ts +70 -0
- package/dist/watcher/file-watcher.d.ts.map +1 -0
- package/dist/watcher/file-watcher.js +127 -0
- package/dist/watcher/file-watcher.js.map +1 -0
- package/dist/watcher/index.d.ts +5 -0
- package/dist/watcher/index.d.ts.map +1 -0
- package/dist/watcher/index.js +6 -0
- package/dist/watcher/index.js.map +1 -0
- package/dist/watcher/watch-worker.d.ts +2 -0
- package/dist/watcher/watch-worker.d.ts.map +1 -0
- package/dist/watcher/watch-worker.js +57 -0
- package/dist/watcher/watch-worker.js.map +1 -0
- package/dist/worker/index.d.ts +76 -0
- package/dist/worker/index.d.ts.map +1 -0
- package/dist/worker/index.js +155 -0
- package/dist/worker/index.js.map +1 -0
- package/dist/worker/parse-worker.d.ts +2 -0
- package/dist/worker/parse-worker.d.ts.map +1 -0
- package/dist/worker/parse-worker.js +202 -0
- package/dist/worker/parse-worker.js.map +1 -0
- package/mycodemap.config.schema.json +42 -0
- package/package.json +69 -0
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// File Hash Cache - 文件哈希缓存
|
|
3
|
+
// ============================================
|
|
4
|
+
import fs from 'fs/promises';
|
|
5
|
+
import crypto from 'crypto';
|
|
6
|
+
import path from 'path';
|
|
7
|
+
/**
|
|
8
|
+
* 计算文件的 SHA256 哈希值
|
|
9
|
+
* @param filePath 文件路径
|
|
10
|
+
* @returns 文件内容的 SHA256 哈希值(十六进制字符串)
|
|
11
|
+
*/
|
|
12
|
+
export async function computeFileHash(filePath) {
|
|
13
|
+
const content = await fs.readFile(filePath);
|
|
14
|
+
const hash = crypto.createHash('sha256');
|
|
15
|
+
hash.update(content);
|
|
16
|
+
return hash.digest('hex');
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 计算多个文件的哈希
|
|
20
|
+
* @param filePaths 文件路径数组
|
|
21
|
+
* @returns 文件路径到哈希值的映射
|
|
22
|
+
*/
|
|
23
|
+
export async function computeFileHashes(filePaths) {
|
|
24
|
+
const hashMap = new Map();
|
|
25
|
+
await Promise.all(filePaths.map(async (filePath) => {
|
|
26
|
+
try {
|
|
27
|
+
const hash = await computeFileHash(filePath);
|
|
28
|
+
hashMap.set(filePath, hash);
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
console.warn(`Warning: Failed to compute hash for ${filePath}: ${error}`);
|
|
32
|
+
hashMap.set(filePath, '');
|
|
33
|
+
}
|
|
34
|
+
}));
|
|
35
|
+
return hashMap;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 比较两个文件的哈希值
|
|
39
|
+
* @param filePath1 第一个文件路径
|
|
40
|
+
* @param filePath2 第二个文件路径
|
|
41
|
+
* @returns 是否相等
|
|
42
|
+
*/
|
|
43
|
+
export async function compareFileHashes(filePath1, filePath2) {
|
|
44
|
+
const [hash1, hash2] = await Promise.all([
|
|
45
|
+
computeFileHash(filePath1),
|
|
46
|
+
computeFileHash(filePath2)
|
|
47
|
+
]);
|
|
48
|
+
return hash1 === hash2;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 文件哈希缓存类
|
|
52
|
+
* 缓存文件的哈希值,避免重复计算
|
|
53
|
+
*/
|
|
54
|
+
export class FileHashCache {
|
|
55
|
+
hashCache = new Map();
|
|
56
|
+
fsStatCache = new Map();
|
|
57
|
+
/**
|
|
58
|
+
* 获取文件的哈希值
|
|
59
|
+
* 如果文件未修改,返回缓存的哈希值
|
|
60
|
+
* @param filePath 文件路径
|
|
61
|
+
* @returns 文件的 SHA256 哈希值
|
|
62
|
+
*/
|
|
63
|
+
async getHash(filePath) {
|
|
64
|
+
try {
|
|
65
|
+
const stats = await fs.stat(filePath);
|
|
66
|
+
const cached = this.hashCache.get(filePath);
|
|
67
|
+
// 检查是否使用缓存(基于 mtime)
|
|
68
|
+
if (cached && cached.mtime === stats.mtimeMs) {
|
|
69
|
+
return cached.hash;
|
|
70
|
+
}
|
|
71
|
+
// 重新计算哈希
|
|
72
|
+
const hash = await computeFileHash(filePath);
|
|
73
|
+
this.hashCache.set(filePath, { hash, mtime: stats.mtimeMs });
|
|
74
|
+
this.fsStatCache.set(filePath, { mtime: stats.mtimeMs, size: stats.size });
|
|
75
|
+
return hash;
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
console.warn(`Warning: Failed to get hash for ${filePath}: ${error}`);
|
|
79
|
+
return '';
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 获取多个文件的哈希值
|
|
84
|
+
* @param filePaths 文件路径数组
|
|
85
|
+
* @returns 文件路径到哈希值的映射
|
|
86
|
+
*/
|
|
87
|
+
async getHashes(filePaths) {
|
|
88
|
+
const hashMap = new Map();
|
|
89
|
+
await Promise.all(filePaths.map(async (filePath) => {
|
|
90
|
+
const hash = await this.getHash(filePath);
|
|
91
|
+
hashMap.set(filePath, hash);
|
|
92
|
+
}));
|
|
93
|
+
return hashMap;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* 检查文件是否已修改
|
|
97
|
+
* @param filePath 文件路径
|
|
98
|
+
* @returns 文件是否已修改
|
|
99
|
+
*/
|
|
100
|
+
async hasChanged(filePath) {
|
|
101
|
+
try {
|
|
102
|
+
const stats = await fs.stat(filePath);
|
|
103
|
+
const cached = this.fsStatCache.get(filePath);
|
|
104
|
+
// 如果没有缓存,认为文件已修改
|
|
105
|
+
if (!cached) {
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
// 比较 mtime 和 size
|
|
109
|
+
return cached.mtime !== stats.mtimeMs || cached.size !== stats.size;
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
// 文件不存在或无法访问,认为已修改
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* 清除指定文件的缓存
|
|
118
|
+
* @param filePath 文件路径
|
|
119
|
+
*/
|
|
120
|
+
invalidate(filePath) {
|
|
121
|
+
this.hashCache.delete(filePath);
|
|
122
|
+
this.fsStatCache.delete(filePath);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* 清除所有缓存
|
|
126
|
+
*/
|
|
127
|
+
clear() {
|
|
128
|
+
this.hashCache.clear();
|
|
129
|
+
this.fsStatCache.clear();
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* 获取缓存大小
|
|
133
|
+
*/
|
|
134
|
+
get size() {
|
|
135
|
+
return this.hashCache.size;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* 生成缓存键
|
|
140
|
+
* @param filePath 文件路径
|
|
141
|
+
* @param hash 文件哈希值
|
|
142
|
+
* @returns 缓存键
|
|
143
|
+
*/
|
|
144
|
+
export function generateCacheKey(filePath, hash) {
|
|
145
|
+
return `${path.basename(filePath)}:${hash}`;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* 解析缓存键
|
|
149
|
+
* @param cacheKey 缓存键
|
|
150
|
+
* @returns 文件名和哈希值
|
|
151
|
+
*/
|
|
152
|
+
export function parseCacheKey(cacheKey) {
|
|
153
|
+
const colonIndex = cacheKey.lastIndexOf(':');
|
|
154
|
+
return {
|
|
155
|
+
filename: cacheKey.substring(0, colonIndex),
|
|
156
|
+
hash: cacheKey.substring(colonIndex + 1)
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=file-hash-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-hash-cache.js","sourceRoot":"","sources":["../../src/cache/file-hash-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { LRUCacheWithTTL } from './lru-cache.js';
|
|
2
|
+
import { FileHashCache } from './file-hash-cache.js';
|
|
3
|
+
import { ParseCache } from './parse-cache.js';
|
|
4
|
+
import type { ModuleInfo } from '../types/index.js';
|
|
5
|
+
export { LRUCache, LRUCacheWithTTL } from './lru-cache.js';
|
|
6
|
+
export { FileHashCache, computeFileHash, computeFileHashes } from './file-hash-cache.js';
|
|
7
|
+
export { ParseCache } from './parse-cache.js';
|
|
8
|
+
export type { ParseCacheEntry } from './parse-cache.js';
|
|
9
|
+
export interface CacheConfig {
|
|
10
|
+
/** 内存缓存最大大小 */
|
|
11
|
+
maxSize?: number;
|
|
12
|
+
/** 缓存过期时间(毫秒) */
|
|
13
|
+
ttl?: number;
|
|
14
|
+
/** 缓存目录 */
|
|
15
|
+
cacheDir?: string;
|
|
16
|
+
/** 是否启用持久化缓存 */
|
|
17
|
+
persistent?: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 默认缓存配置
|
|
21
|
+
*/
|
|
22
|
+
export declare const DEFAULT_CACHE_CONFIG: Required<CacheConfig>;
|
|
23
|
+
/**
|
|
24
|
+
* 缓存管理器
|
|
25
|
+
* 统一管理所有类型的缓存
|
|
26
|
+
*/
|
|
27
|
+
export declare class CacheManager {
|
|
28
|
+
private lruCache;
|
|
29
|
+
private fileHashCache;
|
|
30
|
+
private parseCache;
|
|
31
|
+
private config;
|
|
32
|
+
private dependencyGraph;
|
|
33
|
+
constructor(config?: CacheConfig);
|
|
34
|
+
/**
|
|
35
|
+
* 初始化缓存目录
|
|
36
|
+
*/
|
|
37
|
+
initialize(): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* 获取通用 LRU 缓存
|
|
40
|
+
*/
|
|
41
|
+
getLRUCache<K, V>(): LRUCacheWithTTL<K, V>;
|
|
42
|
+
/**
|
|
43
|
+
* 获取文件哈希缓存
|
|
44
|
+
*/
|
|
45
|
+
getFileHashCache(): FileHashCache;
|
|
46
|
+
/**
|
|
47
|
+
* 获取解析结果缓存
|
|
48
|
+
*/
|
|
49
|
+
getParseCache(): ParseCache;
|
|
50
|
+
/**
|
|
51
|
+
* 解析文件并使用缓存
|
|
52
|
+
* @param filePath 文件路径
|
|
53
|
+
* @param parseFn 解析函数
|
|
54
|
+
* @returns 解析结果
|
|
55
|
+
*/
|
|
56
|
+
parseWithCache(filePath: string, parseFn: (filePath: string) => Promise<ModuleInfo>): Promise<ModuleInfo>;
|
|
57
|
+
/**
|
|
58
|
+
* 批量解析文件并使用缓存
|
|
59
|
+
* @param filePaths 文件路径数组
|
|
60
|
+
* @param parseFn 解析函数
|
|
61
|
+
* @returns 解析结果数组
|
|
62
|
+
*/
|
|
63
|
+
/**
|
|
64
|
+
* 批量解析文件并使用缓存(并行优化版)
|
|
65
|
+
* @param filePaths 文件路径数组
|
|
66
|
+
* @param parseFn 解析函数
|
|
67
|
+
* @param concurrency 并发数限制(默认 10)
|
|
68
|
+
* @returns 解析结果数组
|
|
69
|
+
*/
|
|
70
|
+
parseBatchWithCache(filePaths: string[], parseFn: (filePath: string) => Promise<ModuleInfo>, concurrency?: number): Promise<ModuleInfo[]>;
|
|
71
|
+
/**
|
|
72
|
+
* 并发控制解析
|
|
73
|
+
* @param filePaths 文件路径数组
|
|
74
|
+
* @param parseFn 解析函数
|
|
75
|
+
* @param concurrency 并发数限制
|
|
76
|
+
* @returns 解析结果数组
|
|
77
|
+
*/
|
|
78
|
+
private parseWithConcurrency;
|
|
79
|
+
/**
|
|
80
|
+
* 检查文件是否需要重新解析
|
|
81
|
+
* @param filePath 文件路径
|
|
82
|
+
* @returns 是否需要重新解析
|
|
83
|
+
*/
|
|
84
|
+
needsReparse(filePath: string): Promise<boolean>;
|
|
85
|
+
/**
|
|
86
|
+
* 使指定文件缓存失效
|
|
87
|
+
* @param filePath 文件路径
|
|
88
|
+
*/
|
|
89
|
+
invalidate(filePath: string): void;
|
|
90
|
+
/**
|
|
91
|
+
* 更新依赖图
|
|
92
|
+
* @param modules 模块信息数组,用于构建依赖关系
|
|
93
|
+
*/
|
|
94
|
+
updateDependencyGraph(modules: ModuleInfo[]): void;
|
|
95
|
+
/**
|
|
96
|
+
* 解析模块路径
|
|
97
|
+
* 将相对依赖路径解析为绝对路径
|
|
98
|
+
*/
|
|
99
|
+
private resolveModulePath;
|
|
100
|
+
/**
|
|
101
|
+
* 规范化路径
|
|
102
|
+
*/
|
|
103
|
+
private normalizePath;
|
|
104
|
+
/**
|
|
105
|
+
* 级联失效 - 当依赖文件变更时,失效所有依赖它的文件
|
|
106
|
+
* @param filePath 变更的文件路径
|
|
107
|
+
* @param cascade 是否级联失效(默认 true)
|
|
108
|
+
* @returns 失效的文件数量
|
|
109
|
+
*/
|
|
110
|
+
invalidateWithCascade(filePath: string, cascade?: boolean): number;
|
|
111
|
+
/**
|
|
112
|
+
* 批量级联失效
|
|
113
|
+
* @param filePaths 变更的文件路径数组
|
|
114
|
+
* @returns 失效的文件数量
|
|
115
|
+
*/
|
|
116
|
+
invalidateBatchWithCascade(filePaths: string[]): number;
|
|
117
|
+
/**
|
|
118
|
+
* 清除所有缓存
|
|
119
|
+
*/
|
|
120
|
+
clear(): void;
|
|
121
|
+
/**
|
|
122
|
+
* 清理过期缓存
|
|
123
|
+
*/
|
|
124
|
+
cleanup(): number;
|
|
125
|
+
/**
|
|
126
|
+
* 获取缓存统计信息
|
|
127
|
+
*/
|
|
128
|
+
getStats(): {
|
|
129
|
+
lruSize: number;
|
|
130
|
+
fileHashSize: number;
|
|
131
|
+
parseCache: {
|
|
132
|
+
memorySize: number;
|
|
133
|
+
ttl: number;
|
|
134
|
+
cacheDir: string;
|
|
135
|
+
};
|
|
136
|
+
config: Required<CacheConfig>;
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* 获取缓存管理器单例
|
|
141
|
+
*/
|
|
142
|
+
export declare function getCacheManager(config?: CacheConfig): CacheManager;
|
|
143
|
+
/**
|
|
144
|
+
* 重置缓存管理器单例
|
|
145
|
+
*/
|
|
146
|
+
export declare function resetCacheManager(): void;
|
|
147
|
+
/**
|
|
148
|
+
* 创建缓存管理器
|
|
149
|
+
*/
|
|
150
|
+
export declare function createCacheManager(config?: CacheConfig): CacheManager;
|
|
151
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// Cache Module - 缓存系统入口
|
|
3
|
+
// ============================================
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import fs from 'fs/promises';
|
|
6
|
+
import { LRUCacheWithTTL } from './lru-cache.js';
|
|
7
|
+
import { FileHashCache } from './file-hash-cache.js';
|
|
8
|
+
import { ParseCache } from './parse-cache.js';
|
|
9
|
+
// 导出类型
|
|
10
|
+
export { LRUCache, LRUCacheWithTTL } from './lru-cache.js';
|
|
11
|
+
export { FileHashCache, computeFileHash, computeFileHashes } from './file-hash-cache.js';
|
|
12
|
+
export { ParseCache } from './parse-cache.js';
|
|
13
|
+
/**
|
|
14
|
+
* 默认缓存配置
|
|
15
|
+
*/
|
|
16
|
+
export const DEFAULT_CACHE_CONFIG = {
|
|
17
|
+
maxSize: 200,
|
|
18
|
+
ttl: 3600000, // 1 小时
|
|
19
|
+
cacheDir: path.join(process.cwd(), '.codemap', 'cache'),
|
|
20
|
+
persistent: true
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* 缓存管理器
|
|
24
|
+
* 统一管理所有类型的缓存
|
|
25
|
+
*/
|
|
26
|
+
export class CacheManager {
|
|
27
|
+
lruCache;
|
|
28
|
+
fileHashCache;
|
|
29
|
+
parseCache;
|
|
30
|
+
config;
|
|
31
|
+
// 依赖图缓存: modulePath -> 依赖该模块的文件列表
|
|
32
|
+
dependencyGraph = new Map();
|
|
33
|
+
constructor(config = {}) {
|
|
34
|
+
this.config = { ...DEFAULT_CACHE_CONFIG, ...config };
|
|
35
|
+
this.lruCache = new LRUCacheWithTTL(this.config.maxSize, this.config.ttl);
|
|
36
|
+
this.fileHashCache = new FileHashCache();
|
|
37
|
+
this.parseCache = new ParseCache(this.config.cacheDir, this.config.ttl);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 初始化缓存目录
|
|
41
|
+
*/
|
|
42
|
+
async initialize() {
|
|
43
|
+
if (this.config.persistent) {
|
|
44
|
+
await fs.mkdir(this.config.cacheDir, { recursive: true });
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* 获取通用 LRU 缓存
|
|
49
|
+
*/
|
|
50
|
+
getLRUCache() {
|
|
51
|
+
return this.lruCache;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* 获取文件哈希缓存
|
|
55
|
+
*/
|
|
56
|
+
getFileHashCache() {
|
|
57
|
+
return this.fileHashCache;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* 获取解析结果缓存
|
|
61
|
+
*/
|
|
62
|
+
getParseCache() {
|
|
63
|
+
return this.parseCache;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 解析文件并使用缓存
|
|
67
|
+
* @param filePath 文件路径
|
|
68
|
+
* @param parseFn 解析函数
|
|
69
|
+
* @returns 解析结果
|
|
70
|
+
*/
|
|
71
|
+
async parseWithCache(filePath, parseFn) {
|
|
72
|
+
// 尝试从缓存获取
|
|
73
|
+
const cached = await this.parseCache.get(filePath);
|
|
74
|
+
if (cached) {
|
|
75
|
+
return cached;
|
|
76
|
+
}
|
|
77
|
+
// 执行解析
|
|
78
|
+
const result = await parseFn(filePath);
|
|
79
|
+
// 存入缓存
|
|
80
|
+
await this.parseCache.set(filePath, result);
|
|
81
|
+
return result;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* 批量解析文件并使用缓存
|
|
85
|
+
* @param filePaths 文件路径数组
|
|
86
|
+
* @param parseFn 解析函数
|
|
87
|
+
* @returns 解析结果数组
|
|
88
|
+
*/
|
|
89
|
+
/**
|
|
90
|
+
* 批量解析文件并使用缓存(并行优化版)
|
|
91
|
+
* @param filePaths 文件路径数组
|
|
92
|
+
* @param parseFn 解析函数
|
|
93
|
+
* @param concurrency 并发数限制(默认 10)
|
|
94
|
+
* @returns 解析结果数组
|
|
95
|
+
*/
|
|
96
|
+
async parseBatchWithCache(filePaths, parseFn, concurrency = 10) {
|
|
97
|
+
// 并行获取所有缓存
|
|
98
|
+
const cacheResults = await Promise.all(filePaths.map(async (filePath) => {
|
|
99
|
+
const cached = await this.parseCache.get(filePath);
|
|
100
|
+
return { filePath, cached };
|
|
101
|
+
}));
|
|
102
|
+
const results = [];
|
|
103
|
+
const uncachedFiles = [];
|
|
104
|
+
// 分类缓存命中和未命中
|
|
105
|
+
for (const result of cacheResults) {
|
|
106
|
+
if (result.cached) {
|
|
107
|
+
results.push(result.cached);
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
uncachedFiles.push(result.filePath);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// 并行解析未缓存的文件(带并发控制)
|
|
114
|
+
if (uncachedFiles.length > 0) {
|
|
115
|
+
const parseResults = await this.parseWithConcurrency(uncachedFiles, parseFn, concurrency);
|
|
116
|
+
// 并行存入缓存
|
|
117
|
+
await Promise.all(uncachedFiles.map((filePath, index) => this.parseCache.set(filePath, parseResults[index])));
|
|
118
|
+
results.push(...parseResults);
|
|
119
|
+
}
|
|
120
|
+
return results;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* 并发控制解析
|
|
124
|
+
* @param filePaths 文件路径数组
|
|
125
|
+
* @param parseFn 解析函数
|
|
126
|
+
* @param concurrency 并发数限制
|
|
127
|
+
* @returns 解析结果数组
|
|
128
|
+
*/
|
|
129
|
+
async parseWithConcurrency(filePaths, parseFn, concurrency) {
|
|
130
|
+
const results = new Array(filePaths.length);
|
|
131
|
+
let currentIndex = 0;
|
|
132
|
+
const workers = Array.from({ length: Math.min(concurrency, filePaths.length) }, async () => {
|
|
133
|
+
while (currentIndex < filePaths.length) {
|
|
134
|
+
const index = currentIndex++;
|
|
135
|
+
const filePath = filePaths[index];
|
|
136
|
+
results[index] = await parseFn(filePath);
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
await Promise.all(workers);
|
|
140
|
+
return results;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* 检查文件是否需要重新解析
|
|
144
|
+
* @param filePath 文件路径
|
|
145
|
+
* @returns 是否需要重新解析
|
|
146
|
+
*/
|
|
147
|
+
async needsReparse(filePath) {
|
|
148
|
+
return this.fileHashCache.hasChanged(filePath);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* 使指定文件缓存失效
|
|
152
|
+
* @param filePath 文件路径
|
|
153
|
+
*/
|
|
154
|
+
invalidate(filePath) {
|
|
155
|
+
this.parseCache.invalidate(filePath);
|
|
156
|
+
this.fileHashCache.invalidate(filePath);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* 更新依赖图
|
|
160
|
+
* @param modules 模块信息数组,用于构建依赖关系
|
|
161
|
+
*/
|
|
162
|
+
updateDependencyGraph(modules) {
|
|
163
|
+
this.dependencyGraph.clear();
|
|
164
|
+
for (const mod of modules) {
|
|
165
|
+
const modPath = mod.path;
|
|
166
|
+
// 遍历该模块的依赖
|
|
167
|
+
for (const dep of mod.dependencies || []) {
|
|
168
|
+
// 获取依赖模块的相对路径
|
|
169
|
+
const depPath = this.resolveModulePath(modPath, dep);
|
|
170
|
+
// 将当前模块添加到依赖者的列表中
|
|
171
|
+
if (!this.dependencyGraph.has(depPath)) {
|
|
172
|
+
this.dependencyGraph.set(depPath, new Set());
|
|
173
|
+
}
|
|
174
|
+
this.dependencyGraph.get(depPath).add(modPath);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* 解析模块路径
|
|
180
|
+
* 将相对依赖路径解析为绝对路径
|
|
181
|
+
*/
|
|
182
|
+
resolveModulePath(fromPath, dep) {
|
|
183
|
+
// 去除 .js 后缀
|
|
184
|
+
let normalizedDep = dep.replace(/\.js$/, '');
|
|
185
|
+
// 如果是相对路径,需要解析
|
|
186
|
+
if (normalizedDep.startsWith('.')) {
|
|
187
|
+
const fromDir = fromPath.substring(0, fromPath.lastIndexOf('/'));
|
|
188
|
+
const resolved = fromDir + '/' + normalizedDep;
|
|
189
|
+
// 解析 .. 和 .
|
|
190
|
+
return this.normalizePath(resolved);
|
|
191
|
+
}
|
|
192
|
+
// 外部模块,返回原路径
|
|
193
|
+
return normalizedDep;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* 规范化路径
|
|
197
|
+
*/
|
|
198
|
+
normalizePath(path) {
|
|
199
|
+
const parts = path.split('/');
|
|
200
|
+
const result = [];
|
|
201
|
+
for (const part of parts) {
|
|
202
|
+
if (part === '..') {
|
|
203
|
+
result.pop();
|
|
204
|
+
}
|
|
205
|
+
else if (part !== '.' && part !== '') {
|
|
206
|
+
result.push(part);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return result.join('/');
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* 级联失效 - 当依赖文件变更时,失效所有依赖它的文件
|
|
213
|
+
* @param filePath 变更的文件路径
|
|
214
|
+
* @param cascade 是否级联失效(默认 true)
|
|
215
|
+
* @returns 失效的文件数量
|
|
216
|
+
*/
|
|
217
|
+
invalidateWithCascade(filePath, cascade = true) {
|
|
218
|
+
let invalidatedCount = 0;
|
|
219
|
+
// 首先失效指定文件
|
|
220
|
+
this.invalidate(filePath);
|
|
221
|
+
invalidatedCount++;
|
|
222
|
+
if (cascade) {
|
|
223
|
+
// 查找所有依赖该文件的模块
|
|
224
|
+
const dependents = this.dependencyGraph.get(filePath);
|
|
225
|
+
if (dependents && dependents.size > 0) {
|
|
226
|
+
// 递归失效所有依赖者
|
|
227
|
+
for (const dependent of dependents) {
|
|
228
|
+
invalidatedCount += this.invalidateWithCascade(dependent, true);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
return invalidatedCount;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* 批量级联失效
|
|
236
|
+
* @param filePaths 变更的文件路径数组
|
|
237
|
+
* @returns 失效的文件数量
|
|
238
|
+
*/
|
|
239
|
+
invalidateBatchWithCascade(filePaths) {
|
|
240
|
+
let totalInvalidated = 0;
|
|
241
|
+
const processed = new Set();
|
|
242
|
+
for (const filePath of filePaths) {
|
|
243
|
+
if (!processed.has(filePath)) {
|
|
244
|
+
const count = this.invalidateWithCascade(filePath, true);
|
|
245
|
+
totalInvalidated += count;
|
|
246
|
+
processed.add(filePath);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
return totalInvalidated;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* 清除所有缓存
|
|
253
|
+
*/
|
|
254
|
+
clear() {
|
|
255
|
+
this.lruCache.clear();
|
|
256
|
+
this.fileHashCache.clear();
|
|
257
|
+
this.parseCache.clear();
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* 清理过期缓存
|
|
261
|
+
*/
|
|
262
|
+
cleanup() {
|
|
263
|
+
return this.parseCache.cleanup();
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* 获取缓存统计信息
|
|
267
|
+
*/
|
|
268
|
+
getStats() {
|
|
269
|
+
return {
|
|
270
|
+
lruSize: this.lruCache.size,
|
|
271
|
+
fileHashSize: this.fileHashCache.size,
|
|
272
|
+
parseCache: this.parseCache.getStats(),
|
|
273
|
+
config: this.config
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
// 单例实例
|
|
278
|
+
let cacheManagerInstance = null;
|
|
279
|
+
/**
|
|
280
|
+
* 获取缓存管理器单例
|
|
281
|
+
*/
|
|
282
|
+
export function getCacheManager(config) {
|
|
283
|
+
if (!cacheManagerInstance) {
|
|
284
|
+
cacheManagerInstance = new CacheManager(config);
|
|
285
|
+
}
|
|
286
|
+
return cacheManagerInstance;
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* 重置缓存管理器单例
|
|
290
|
+
*/
|
|
291
|
+
export function resetCacheManager() {
|
|
292
|
+
if (cacheManagerInstance) {
|
|
293
|
+
cacheManagerInstance.clear();
|
|
294
|
+
cacheManagerInstance = null;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* 创建缓存管理器
|
|
299
|
+
*/
|
|
300
|
+
export function createCacheManager(config) {
|
|
301
|
+
return new CacheManager(config);
|
|
302
|
+
}
|
|
303
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"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"}
|