codevault 1.8.4 → 1.8.5
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 +3 -2
- package/dist/chunking/token-counter.d.ts.map +1 -1
- package/dist/chunking/token-counter.js +16 -10
- package/dist/chunking/token-counter.js.map +1 -1
- package/dist/cli/commands/index-cmd.d.ts.map +1 -1
- package/dist/cli/commands/index-cmd.js +108 -97
- package/dist/cli/commands/index-cmd.js.map +1 -1
- package/dist/cli/commands/interactive-config.d.ts.map +1 -1
- package/dist/cli/commands/interactive-config.js +40 -3
- package/dist/cli/commands/interactive-config.js.map +1 -1
- package/dist/cli/commands/search-cmd.d.ts.map +1 -1
- package/dist/cli/commands/search-cmd.js +11 -7
- package/dist/cli/commands/search-cmd.js.map +1 -1
- package/dist/cli/commands/search-with-code-cmd.d.ts.map +1 -1
- package/dist/cli/commands/search-with-code-cmd.js +3 -1
- package/dist/cli/commands/search-with-code-cmd.js.map +1 -1
- package/dist/cli/utils.d.ts +56 -0
- package/dist/cli/utils.d.ts.map +1 -0
- package/dist/cli/utils.js +98 -0
- package/dist/cli/utils.js.map +1 -0
- package/dist/config/constants.d.ts +4 -0
- package/dist/config/constants.d.ts.map +1 -1
- package/dist/config/constants.js +2 -0
- package/dist/config/constants.js.map +1 -1
- package/dist/context/packs.d.ts.map +1 -1
- package/dist/context/packs.js +3 -1
- package/dist/context/packs.js.map +1 -1
- package/dist/core/IndexerEngine.d.ts +2 -0
- package/dist/core/IndexerEngine.d.ts.map +1 -1
- package/dist/core/IndexerEngine.js +34 -26
- package/dist/core/IndexerEngine.js.map +1 -1
- package/dist/core/SearchService.d.ts +1 -0
- package/dist/core/SearchService.d.ts.map +1 -1
- package/dist/core/SearchService.js +18 -12
- package/dist/core/SearchService.js.map +1 -1
- package/dist/core/batch-indexer.d.ts.map +1 -1
- package/dist/core/batch-indexer.js +5 -13
- package/dist/core/batch-indexer.js.map +1 -1
- package/dist/core/indexing/IndexFinalizationStage.d.ts.map +1 -1
- package/dist/core/indexing/IndexFinalizationStage.js +21 -2
- package/dist/core/indexing/IndexFinalizationStage.js.map +1 -1
- package/dist/core/indexing/IndexState.d.ts +3 -8
- package/dist/core/indexing/IndexState.d.ts.map +1 -1
- package/dist/core/indexing/IndexState.js.map +1 -1
- package/dist/core/indexing/PersistManager.d.ts +1 -1
- package/dist/core/indexing/PersistManager.d.ts.map +1 -1
- package/dist/core/indexing/PersistManager.js +17 -17
- package/dist/core/indexing/PersistManager.js.map +1 -1
- package/dist/core/search/HybridFusion.d.ts +0 -1
- package/dist/core/search/HybridFusion.d.ts.map +1 -1
- package/dist/core/search/HybridFusion.js +2 -14
- package/dist/core/search/HybridFusion.js.map +1 -1
- package/dist/core/search/ResultMapper.d.ts +0 -1
- package/dist/core/search/ResultMapper.d.ts.map +1 -1
- package/dist/core/search/ResultMapper.js +2 -13
- package/dist/core/search/ResultMapper.js.map +1 -1
- package/dist/core/search/SearchContextManager.d.ts +3 -0
- package/dist/core/search/SearchContextManager.d.ts.map +1 -1
- package/dist/core/search/SearchContextManager.js +15 -2
- package/dist/core/search/SearchContextManager.js.map +1 -1
- package/dist/core/search.d.ts.map +1 -1
- package/dist/core/search.js +9 -4
- package/dist/core/search.js.map +1 -1
- package/dist/languages/rules.d.ts.map +1 -1
- package/dist/languages/rules.js +14 -5
- package/dist/languages/rules.js.map +1 -1
- package/dist/mcp/schemas.d.ts +2 -2
- package/dist/mcp-server.d.ts +1 -0
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +32 -21
- package/dist/mcp-server.js.map +1 -1
- package/dist/providers/base.d.ts +3 -2
- package/dist/providers/base.d.ts.map +1 -1
- package/dist/providers/base.js +3 -1
- package/dist/providers/base.js.map +1 -1
- package/dist/providers/chat-llm.d.ts +2 -2
- package/dist/providers/chat-llm.d.ts.map +1 -1
- package/dist/providers/chat-llm.js +4 -1
- package/dist/providers/chat-llm.js.map +1 -1
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +4 -1
- package/dist/providers/openai.js.map +1 -1
- package/dist/ranking/api-reranker.d.ts.map +1 -1
- package/dist/ranking/api-reranker.js +27 -8
- package/dist/ranking/api-reranker.js.map +1 -1
- package/dist/ranking/symbol-boost.d.ts.map +1 -1
- package/dist/ranking/symbol-boost.js +4 -11
- package/dist/ranking/symbol-boost.js.map +1 -1
- package/dist/search/bm25.d.ts +10 -0
- package/dist/search/bm25.d.ts.map +1 -1
- package/dist/search/bm25.js +16 -0
- package/dist/search/bm25.js.map +1 -1
- package/dist/storage/encrypted-chunks.d.ts +3 -0
- package/dist/storage/encrypted-chunks.d.ts.map +1 -1
- package/dist/storage/encrypted-chunks.js +108 -16
- package/dist/storage/encrypted-chunks.js.map +1 -1
- package/dist/synthesis/conversational-synthesizer.d.ts +2 -1
- package/dist/synthesis/conversational-synthesizer.d.ts.map +1 -1
- package/dist/synthesis/conversational-synthesizer.js +6 -1
- package/dist/synthesis/conversational-synthesizer.js.map +1 -1
- package/dist/synthesis/prompt-builder.d.ts.map +1 -1
- package/dist/synthesis/prompt-builder.js +40 -13
- package/dist/synthesis/prompt-builder.js.map +1 -1
- package/dist/synthesis/synthesizer.d.ts.map +1 -1
- package/dist/synthesis/synthesizer.js +14 -2
- package/dist/synthesis/synthesizer.js.map +1 -1
- package/dist/tests/api-reranker.test.d.ts +2 -0
- package/dist/tests/api-reranker.test.d.ts.map +1 -0
- package/dist/tests/api-reranker.test.js +575 -0
- package/dist/tests/api-reranker.test.js.map +1 -0
- package/dist/tests/bm25.test.d.ts +2 -0
- package/dist/tests/bm25.test.d.ts.map +1 -0
- package/dist/tests/bm25.test.js +340 -0
- package/dist/tests/bm25.test.js.map +1 -0
- package/dist/tests/chunking/file-grouper.test.d.ts +2 -0
- package/dist/tests/chunking/file-grouper.test.d.ts.map +1 -0
- package/dist/tests/chunking/file-grouper.test.js +495 -0
- package/dist/tests/chunking/file-grouper.test.js.map +1 -0
- package/dist/tests/chunking/semantic-chunker.test.d.ts +2 -0
- package/dist/tests/chunking/semantic-chunker.test.d.ts.map +1 -0
- package/dist/tests/chunking/semantic-chunker.test.js +509 -0
- package/dist/tests/chunking/semantic-chunker.test.js.map +1 -0
- package/dist/tests/chunking/token-counter.test.d.ts +2 -0
- package/dist/tests/chunking/token-counter.test.d.ts.map +1 -0
- package/dist/tests/chunking/token-counter.test.js +441 -0
- package/dist/tests/chunking/token-counter.test.js.map +1 -0
- package/dist/tests/cli/ask-cmd.test.d.ts +2 -0
- package/dist/tests/cli/ask-cmd.test.d.ts.map +1 -0
- package/dist/tests/cli/ask-cmd.test.js +152 -0
- package/dist/tests/cli/ask-cmd.test.js.map +1 -0
- package/dist/tests/cli/chat-cmd.test.d.ts +2 -0
- package/dist/tests/cli/chat-cmd.test.d.ts.map +1 -0
- package/dist/tests/cli/chat-cmd.test.js +118 -0
- package/dist/tests/cli/chat-cmd.test.js.map +1 -0
- package/dist/tests/cli/config-cmd.test.d.ts +2 -0
- package/dist/tests/cli/config-cmd.test.d.ts.map +1 -0
- package/dist/tests/cli/config-cmd.test.js +226 -0
- package/dist/tests/cli/config-cmd.test.js.map +1 -0
- package/dist/tests/cli/context.test.d.ts +2 -0
- package/dist/tests/cli/context.test.d.ts.map +1 -0
- package/dist/tests/cli/context.test.js +158 -0
- package/dist/tests/cli/context.test.js.map +1 -0
- package/dist/tests/cli/index-cmd.test.d.ts +2 -0
- package/dist/tests/cli/index-cmd.test.d.ts.map +1 -0
- package/dist/tests/cli/index-cmd.test.js +89 -0
- package/dist/tests/cli/index-cmd.test.js.map +1 -0
- package/dist/tests/cli/index.test.d.ts +2 -0
- package/dist/tests/cli/index.test.d.ts.map +1 -0
- package/dist/tests/cli/index.test.js +167 -0
- package/dist/tests/cli/index.test.js.map +1 -0
- package/dist/tests/cli/info-cmd.test.d.ts +2 -0
- package/dist/tests/cli/info-cmd.test.d.ts.map +1 -0
- package/dist/tests/cli/info-cmd.test.js +47 -0
- package/dist/tests/cli/info-cmd.test.js.map +1 -0
- package/dist/tests/cli/interactive-config.test.d.ts +2 -0
- package/dist/tests/cli/interactive-config.test.d.ts.map +1 -0
- package/dist/tests/cli/interactive-config.test.js +30 -0
- package/dist/tests/cli/interactive-config.test.js.map +1 -0
- package/dist/tests/cli/mcp-cmd.test.d.ts +2 -0
- package/dist/tests/cli/mcp-cmd.test.d.ts.map +1 -0
- package/dist/tests/cli/mcp-cmd.test.js +47 -0
- package/dist/tests/cli/mcp-cmd.test.js.map +1 -0
- package/dist/tests/cli/search-cmd.test.d.ts +2 -0
- package/dist/tests/cli/search-cmd.test.d.ts.map +1 -0
- package/dist/tests/cli/search-cmd.test.js +120 -0
- package/dist/tests/cli/search-cmd.test.js.map +1 -0
- package/dist/tests/cli/search-with-code-cmd.test.d.ts +2 -0
- package/dist/tests/cli/search-with-code-cmd.test.d.ts.map +1 -0
- package/dist/tests/cli/search-with-code-cmd.test.js +140 -0
- package/dist/tests/cli/search-with-code-cmd.test.js.map +1 -0
- package/dist/tests/cli/update-cmd.test.d.ts +2 -0
- package/dist/tests/cli/update-cmd.test.d.ts.map +1 -0
- package/dist/tests/cli/update-cmd.test.js +75 -0
- package/dist/tests/cli/update-cmd.test.js.map +1 -0
- package/dist/tests/cli/utils.test.d.ts +2 -0
- package/dist/tests/cli/utils.test.d.ts.map +1 -0
- package/dist/tests/cli/utils.test.js +119 -0
- package/dist/tests/cli/utils.test.js.map +1 -0
- package/dist/tests/cli/watch-cmd.test.d.ts +2 -0
- package/dist/tests/cli/watch-cmd.test.d.ts.map +1 -0
- package/dist/tests/cli/watch-cmd.test.js +84 -0
- package/dist/tests/cli/watch-cmd.test.js.map +1 -0
- package/dist/tests/cli-ui.test.d.ts +2 -0
- package/dist/tests/cli-ui.test.d.ts.map +1 -0
- package/dist/tests/cli-ui.test.js +608 -0
- package/dist/tests/cli-ui.test.js.map +1 -0
- package/dist/tests/codemap-io.test.d.ts +2 -0
- package/dist/tests/codemap-io.test.d.ts.map +1 -0
- package/dist/tests/codemap-io.test.js +992 -0
- package/dist/tests/codemap-io.test.js.map +1 -0
- package/dist/tests/config/apply-env.test.d.ts +2 -0
- package/dist/tests/config/apply-env.test.d.ts.map +1 -0
- package/dist/tests/config/apply-env.test.js +717 -0
- package/dist/tests/config/apply-env.test.js.map +1 -0
- package/dist/tests/config/constants.test.d.ts +2 -0
- package/dist/tests/config/constants.test.d.ts.map +1 -0
- package/dist/tests/config/constants.test.js +406 -0
- package/dist/tests/config/constants.test.js.map +1 -0
- package/dist/tests/config/loader.test.d.ts +2 -0
- package/dist/tests/config/loader.test.d.ts.map +1 -0
- package/dist/tests/config/loader.test.js +716 -0
- package/dist/tests/config/loader.test.js.map +1 -0
- package/dist/tests/config/resolver.test.d.ts +2 -0
- package/dist/tests/config/resolver.test.d.ts.map +1 -0
- package/dist/tests/config/resolver.test.js +402 -0
- package/dist/tests/config/resolver.test.js.map +1 -0
- package/dist/tests/config/types.test.d.ts +2 -0
- package/dist/tests/config/types.test.d.ts.map +1 -0
- package/dist/tests/config/types.test.js +460 -0
- package/dist/tests/config/types.test.js.map +1 -0
- package/dist/tests/context-packs.test.d.ts +2 -0
- package/dist/tests/context-packs.test.d.ts.map +1 -0
- package/dist/tests/context-packs.test.js +826 -0
- package/dist/tests/context-packs.test.js.map +1 -0
- package/dist/tests/conversational-synthesizer.test.d.ts +2 -0
- package/dist/tests/conversational-synthesizer.test.d.ts.map +1 -0
- package/dist/tests/conversational-synthesizer.test.js +595 -0
- package/dist/tests/conversational-synthesizer.test.js.map +1 -0
- package/dist/tests/database.test.d.ts +2 -0
- package/dist/tests/database.test.d.ts.map +1 -0
- package/dist/tests/database.test.js +965 -0
- package/dist/tests/database.test.js.map +1 -0
- package/dist/tests/encrypted-chunks.test.d.ts +2 -0
- package/dist/tests/encrypted-chunks.test.d.ts.map +1 -0
- package/dist/tests/encrypted-chunks.test.js +1470 -0
- package/dist/tests/encrypted-chunks.test.js.map +1 -0
- package/dist/tests/hybrid.test.d.ts +2 -0
- package/dist/tests/hybrid.test.d.ts.map +1 -0
- package/dist/tests/hybrid.test.js +456 -0
- package/dist/tests/hybrid.test.js.map +1 -0
- package/dist/tests/indexer/ChangeQueue.test.d.ts +12 -0
- package/dist/tests/indexer/ChangeQueue.test.d.ts.map +1 -0
- package/dist/tests/indexer/ChangeQueue.test.js +441 -0
- package/dist/tests/indexer/ChangeQueue.test.js.map +1 -0
- package/dist/tests/indexer/ProviderManager.test.d.ts +12 -0
- package/dist/tests/indexer/ProviderManager.test.d.ts.map +1 -0
- package/dist/tests/indexer/ProviderManager.test.js +290 -0
- package/dist/tests/indexer/ProviderManager.test.js.map +1 -0
- package/dist/tests/indexer/WatchService.test.d.ts +14 -0
- package/dist/tests/indexer/WatchService.test.d.ts.map +1 -0
- package/dist/tests/indexer/WatchService.test.js +667 -0
- package/dist/tests/indexer/WatchService.test.js.map +1 -0
- package/dist/tests/indexer/merkle.test.d.ts +11 -0
- package/dist/tests/indexer/merkle.test.d.ts.map +1 -0
- package/dist/tests/indexer/merkle.test.js +497 -0
- package/dist/tests/indexer/merkle.test.js.map +1 -0
- package/dist/tests/indexer/update.test.d.ts +10 -0
- package/dist/tests/indexer/update.test.d.ts.map +1 -0
- package/dist/tests/indexer/update.test.js +317 -0
- package/dist/tests/indexer/update.test.js.map +1 -0
- package/dist/tests/indexer/watch.test.d.ts +8 -0
- package/dist/tests/indexer/watch.test.d.ts.map +1 -0
- package/dist/tests/indexer/watch.test.js +95 -0
- package/dist/tests/indexer/watch.test.js.map +1 -0
- package/dist/tests/integration/index-search.integration.test.js +1 -0
- package/dist/tests/integration/index-search.integration.test.js.map +1 -1
- package/dist/tests/languages.test.d.ts +2 -0
- package/dist/tests/languages.test.d.ts.map +1 -0
- package/dist/tests/languages.test.js +575 -0
- package/dist/tests/languages.test.js.map +1 -0
- package/dist/tests/logger-redaction.test.d.ts +2 -0
- package/dist/tests/logger-redaction.test.d.ts.map +1 -0
- package/dist/tests/logger-redaction.test.js +48 -0
- package/dist/tests/logger-redaction.test.js.map +1 -0
- package/dist/tests/logger.test.d.ts +2 -0
- package/dist/tests/logger.test.d.ts.map +1 -0
- package/dist/tests/logger.test.js +468 -0
- package/dist/tests/logger.test.js.map +1 -0
- package/dist/tests/markdown-formatter.test.d.ts +2 -0
- package/dist/tests/markdown-formatter.test.d.ts.map +1 -0
- package/dist/tests/markdown-formatter.test.js +453 -0
- package/dist/tests/markdown-formatter.test.js.map +1 -0
- package/dist/tests/mcp/tools/use-context-pack.test.d.ts +7 -0
- package/dist/tests/mcp/tools/use-context-pack.test.d.ts.map +1 -0
- package/dist/tests/mcp/tools/use-context-pack.test.js +505 -0
- package/dist/tests/mcp/tools/use-context-pack.test.js.map +1 -0
- package/dist/tests/mutex.test.d.ts +2 -0
- package/dist/tests/mutex.test.d.ts.map +1 -0
- package/dist/tests/mutex.test.js +489 -0
- package/dist/tests/mutex.test.js.map +1 -0
- package/dist/tests/path-helpers.test.d.ts +2 -0
- package/dist/tests/path-helpers.test.d.ts.map +1 -0
- package/dist/tests/path-helpers.test.js +332 -0
- package/dist/tests/path-helpers.test.js.map +1 -0
- package/dist/tests/prompt-builder.test.d.ts +2 -0
- package/dist/tests/prompt-builder.test.d.ts.map +1 -0
- package/dist/tests/prompt-builder.test.js +417 -0
- package/dist/tests/prompt-builder.test.js.map +1 -0
- package/dist/tests/providers/base.test.d.ts +2 -0
- package/dist/tests/providers/base.test.d.ts.map +1 -0
- package/dist/tests/providers/base.test.js +299 -0
- package/dist/tests/providers/base.test.js.map +1 -0
- package/dist/tests/providers/chat-llm.test.d.ts +2 -0
- package/dist/tests/providers/chat-llm.test.d.ts.map +1 -0
- package/dist/tests/providers/chat-llm.test.js +435 -0
- package/dist/tests/providers/chat-llm.test.js.map +1 -0
- package/dist/tests/providers/index.test.d.ts +2 -0
- package/dist/tests/providers/index.test.d.ts.map +1 -0
- package/dist/tests/providers/index.test.js +204 -0
- package/dist/tests/providers/index.test.js.map +1 -0
- package/dist/tests/providers/mock.test.d.ts +2 -0
- package/dist/tests/providers/mock.test.d.ts.map +1 -0
- package/dist/tests/providers/mock.test.js +225 -0
- package/dist/tests/providers/mock.test.js.map +1 -0
- package/dist/tests/providers/openai.test.d.ts +2 -0
- package/dist/tests/providers/openai.test.d.ts.map +1 -0
- package/dist/tests/providers/openai.test.js +408 -0
- package/dist/tests/providers/openai.test.js.map +1 -0
- package/dist/tests/providers/token-counter.test.d.ts +2 -0
- package/dist/tests/providers/token-counter.test.d.ts.map +1 -0
- package/dist/tests/providers/token-counter.test.js +247 -0
- package/dist/tests/providers/token-counter.test.js.map +1 -0
- package/dist/tests/rate-limiter.test.js +392 -1
- package/dist/tests/rate-limiter.test.js.map +1 -1
- package/dist/tests/scope.test.d.ts +2 -0
- package/dist/tests/scope.test.d.ts.map +1 -0
- package/dist/tests/scope.test.js +529 -0
- package/dist/tests/scope.test.js.map +1 -0
- package/dist/tests/simple-lru.test.js +377 -0
- package/dist/tests/simple-lru.test.js.map +1 -1
- package/dist/tests/symbol-boost.test.js +730 -10
- package/dist/tests/symbol-boost.test.js.map +1 -1
- package/dist/tests/symbols-extract.test.d.ts +2 -0
- package/dist/tests/symbols-extract.test.d.ts.map +1 -0
- package/dist/tests/symbols-extract.test.js +536 -0
- package/dist/tests/symbols-extract.test.js.map +1 -0
- package/dist/tests/symbols-graph.test.d.ts +2 -0
- package/dist/tests/symbols-graph.test.d.ts.map +1 -0
- package/dist/tests/symbols-graph.test.js +656 -0
- package/dist/tests/symbols-graph.test.js.map +1 -0
- package/dist/tests/synthesizer.test.d.ts +2 -0
- package/dist/tests/synthesizer.test.d.ts.map +1 -0
- package/dist/tests/synthesizer.test.js +381 -0
- package/dist/tests/synthesizer.test.js.map +1 -0
- package/dist/types/context-pack.d.ts +3 -3
- package/dist/utils/logger.d.ts +5 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +149 -4
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/mutex.d.ts +7 -2
- package/dist/utils/mutex.d.ts.map +1 -1
- package/dist/utils/mutex.js +31 -7
- package/dist/utils/mutex.js.map +1 -1
- package/dist/utils/path-helpers.d.ts.map +1 -1
- package/dist/utils/path-helpers.js +5 -2
- package/dist/utils/path-helpers.js.map +1 -1
- package/dist/utils/simple-lru.d.ts +6 -0
- package/dist/utils/simple-lru.d.ts.map +1 -1
- package/dist/utils/simple-lru.js +26 -0
- package/dist/utils/simple-lru.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,656 @@
|
|
|
1
|
+
import test from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { attachSymbolGraphToCodemap } from '../symbols/graph.js';
|
|
4
|
+
/**
|
|
5
|
+
* Helper to create a minimal valid CodemapChunk for testing
|
|
6
|
+
*/
|
|
7
|
+
function createChunk(options) {
|
|
8
|
+
return {
|
|
9
|
+
file: options.file,
|
|
10
|
+
symbol: options.symbol,
|
|
11
|
+
sha: options.sha,
|
|
12
|
+
lang: 'typescript',
|
|
13
|
+
symbol_calls: options.symbol_calls ?? []
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
// ============================================================================
|
|
17
|
+
// Tests for attachSymbolGraphToCodemap - Basic functionality
|
|
18
|
+
// ============================================================================
|
|
19
|
+
test('attachSymbolGraphToCodemap returns empty codemap unchanged', () => {
|
|
20
|
+
const codemap = {};
|
|
21
|
+
const result = attachSymbolGraphToCodemap(codemap);
|
|
22
|
+
assert.deepEqual(result, {});
|
|
23
|
+
});
|
|
24
|
+
test('attachSymbolGraphToCodemap handles null input gracefully', () => {
|
|
25
|
+
const result = attachSymbolGraphToCodemap(null);
|
|
26
|
+
assert.equal(result, null);
|
|
27
|
+
});
|
|
28
|
+
test('attachSymbolGraphToCodemap handles undefined input gracefully', () => {
|
|
29
|
+
const result = attachSymbolGraphToCodemap(undefined);
|
|
30
|
+
assert.equal(result, undefined);
|
|
31
|
+
});
|
|
32
|
+
test('attachSymbolGraphToCodemap handles non-object input gracefully', () => {
|
|
33
|
+
const result = attachSymbolGraphToCodemap('not an object');
|
|
34
|
+
assert.equal(result, 'not an object');
|
|
35
|
+
});
|
|
36
|
+
test('attachSymbolGraphToCodemap adds symbol_call_targets for direct calls', () => {
|
|
37
|
+
const codemap = {
|
|
38
|
+
chunk1: createChunk({
|
|
39
|
+
file: 'src/a.ts',
|
|
40
|
+
symbol: 'caller',
|
|
41
|
+
sha: 'sha-caller',
|
|
42
|
+
symbol_calls: ['callee']
|
|
43
|
+
}),
|
|
44
|
+
chunk2: createChunk({
|
|
45
|
+
file: 'src/b.ts',
|
|
46
|
+
symbol: 'callee',
|
|
47
|
+
sha: 'sha-callee',
|
|
48
|
+
symbol_calls: []
|
|
49
|
+
})
|
|
50
|
+
};
|
|
51
|
+
const result = attachSymbolGraphToCodemap(codemap);
|
|
52
|
+
assert.ok(Array.isArray(result.chunk1.symbol_call_targets));
|
|
53
|
+
assert.ok(result.chunk1.symbol_call_targets.includes('sha-callee'));
|
|
54
|
+
});
|
|
55
|
+
test('attachSymbolGraphToCodemap adds symbol_callers for reverse references', () => {
|
|
56
|
+
const codemap = {
|
|
57
|
+
chunk1: createChunk({
|
|
58
|
+
file: 'src/a.ts',
|
|
59
|
+
symbol: 'caller',
|
|
60
|
+
sha: 'sha-caller',
|
|
61
|
+
symbol_calls: ['callee']
|
|
62
|
+
}),
|
|
63
|
+
chunk2: createChunk({
|
|
64
|
+
file: 'src/b.ts',
|
|
65
|
+
symbol: 'callee',
|
|
66
|
+
sha: 'sha-callee',
|
|
67
|
+
symbol_calls: []
|
|
68
|
+
})
|
|
69
|
+
};
|
|
70
|
+
const result = attachSymbolGraphToCodemap(codemap);
|
|
71
|
+
assert.ok(Array.isArray(result.chunk2.symbol_callers));
|
|
72
|
+
assert.ok(result.chunk2.symbol_callers.includes('sha-caller'));
|
|
73
|
+
});
|
|
74
|
+
test('attachSymbolGraphToCodemap adds symbol_neighbors combining both directions', () => {
|
|
75
|
+
const codemap = {
|
|
76
|
+
chunk1: createChunk({
|
|
77
|
+
file: 'src/a.ts',
|
|
78
|
+
symbol: 'caller',
|
|
79
|
+
sha: 'sha-caller',
|
|
80
|
+
symbol_calls: ['callee']
|
|
81
|
+
}),
|
|
82
|
+
chunk2: createChunk({
|
|
83
|
+
file: 'src/b.ts',
|
|
84
|
+
symbol: 'callee',
|
|
85
|
+
sha: 'sha-callee',
|
|
86
|
+
symbol_calls: []
|
|
87
|
+
})
|
|
88
|
+
};
|
|
89
|
+
const result = attachSymbolGraphToCodemap(codemap);
|
|
90
|
+
// caller's neighbors should include callee (outgoing)
|
|
91
|
+
assert.ok(result.chunk1.symbol_neighbors.includes('sha-callee'));
|
|
92
|
+
// callee's neighbors should include caller (incoming)
|
|
93
|
+
assert.ok(result.chunk2.symbol_neighbors.includes('sha-caller'));
|
|
94
|
+
});
|
|
95
|
+
// ============================================================================
|
|
96
|
+
// Tests for symbol resolution
|
|
97
|
+
// ============================================================================
|
|
98
|
+
test('attachSymbolGraphToCodemap resolves symbols case-insensitively', () => {
|
|
99
|
+
// Use unique symbols that don't collide
|
|
100
|
+
const codemap = {
|
|
101
|
+
chunk1: createChunk({
|
|
102
|
+
file: 'src/a.ts',
|
|
103
|
+
symbol: 'callerFunc',
|
|
104
|
+
sha: 'sha-1',
|
|
105
|
+
symbol_calls: ['TARGETFUNC'] // uppercase call to lowercase symbol
|
|
106
|
+
}),
|
|
107
|
+
chunk2: createChunk({
|
|
108
|
+
file: 'src/b.ts',
|
|
109
|
+
symbol: 'targetFunc', // lowercase symbol
|
|
110
|
+
sha: 'sha-2',
|
|
111
|
+
symbol_calls: []
|
|
112
|
+
})
|
|
113
|
+
};
|
|
114
|
+
const result = attachSymbolGraphToCodemap(codemap);
|
|
115
|
+
// 'TARGETFUNC'.toLowerCase() === 'targetfunc' === 'targetFunc'.toLowerCase()
|
|
116
|
+
assert.ok(result.chunk1.symbol_call_targets.includes('sha-2'));
|
|
117
|
+
});
|
|
118
|
+
test('attachSymbolGraphToCodemap handles multiple chunks with same symbol name', () => {
|
|
119
|
+
const codemap = {
|
|
120
|
+
chunk1: createChunk({
|
|
121
|
+
file: 'src/a.ts',
|
|
122
|
+
symbol: 'caller',
|
|
123
|
+
sha: 'sha-caller',
|
|
124
|
+
symbol_calls: ['helper']
|
|
125
|
+
}),
|
|
126
|
+
chunk2: createChunk({
|
|
127
|
+
file: 'src/a.ts', // same file
|
|
128
|
+
symbol: 'helper',
|
|
129
|
+
sha: 'sha-helper-1',
|
|
130
|
+
symbol_calls: []
|
|
131
|
+
}),
|
|
132
|
+
chunk3: createChunk({
|
|
133
|
+
file: 'src/b.ts', // different file
|
|
134
|
+
symbol: 'helper',
|
|
135
|
+
sha: 'sha-helper-2',
|
|
136
|
+
symbol_calls: []
|
|
137
|
+
})
|
|
138
|
+
};
|
|
139
|
+
const result = attachSymbolGraphToCodemap(codemap);
|
|
140
|
+
// Should prefer the helper in the same file
|
|
141
|
+
assert.ok(result.chunk1.symbol_call_targets.includes('sha-helper-1'));
|
|
142
|
+
assert.ok(!result.chunk1.symbol_call_targets.includes('sha-helper-2'));
|
|
143
|
+
});
|
|
144
|
+
test('attachSymbolGraphToCodemap falls back to first candidate when no same-file match', () => {
|
|
145
|
+
const codemap = {
|
|
146
|
+
chunk1: createChunk({
|
|
147
|
+
file: 'src/a.ts',
|
|
148
|
+
symbol: 'caller',
|
|
149
|
+
sha: 'sha-caller',
|
|
150
|
+
symbol_calls: ['helper']
|
|
151
|
+
}),
|
|
152
|
+
chunk2: createChunk({
|
|
153
|
+
file: 'src/b.ts', // different file
|
|
154
|
+
symbol: 'helper',
|
|
155
|
+
sha: 'sha-helper',
|
|
156
|
+
symbol_calls: []
|
|
157
|
+
})
|
|
158
|
+
};
|
|
159
|
+
const result = attachSymbolGraphToCodemap(codemap);
|
|
160
|
+
assert.ok(result.chunk1.symbol_call_targets.includes('sha-helper'));
|
|
161
|
+
});
|
|
162
|
+
test('attachSymbolGraphToCodemap ignores calls to non-existent symbols', () => {
|
|
163
|
+
const codemap = {
|
|
164
|
+
chunk1: createChunk({
|
|
165
|
+
file: 'src/a.ts',
|
|
166
|
+
symbol: 'caller',
|
|
167
|
+
sha: 'sha-caller',
|
|
168
|
+
symbol_calls: ['nonExistentFunction']
|
|
169
|
+
})
|
|
170
|
+
};
|
|
171
|
+
const result = attachSymbolGraphToCodemap(codemap);
|
|
172
|
+
assert.deepEqual(result.chunk1.symbol_call_targets, []);
|
|
173
|
+
});
|
|
174
|
+
test('attachSymbolGraphToCodemap ignores self-references', () => {
|
|
175
|
+
const codemap = {
|
|
176
|
+
chunk1: createChunk({
|
|
177
|
+
file: 'src/a.ts',
|
|
178
|
+
symbol: 'recursive',
|
|
179
|
+
sha: 'sha-recursive',
|
|
180
|
+
symbol_calls: ['recursive'] // calls itself
|
|
181
|
+
})
|
|
182
|
+
};
|
|
183
|
+
const result = attachSymbolGraphToCodemap(codemap);
|
|
184
|
+
// Should not include self in call targets
|
|
185
|
+
assert.ok(!result.chunk1.symbol_call_targets.includes('sha-recursive'));
|
|
186
|
+
});
|
|
187
|
+
// ============================================================================
|
|
188
|
+
// Tests for edge cases and malformed data
|
|
189
|
+
// ============================================================================
|
|
190
|
+
test('attachSymbolGraphToCodemap handles entries with null symbol', () => {
|
|
191
|
+
const codemap = {
|
|
192
|
+
chunk1: createChunk({
|
|
193
|
+
file: 'src/a.ts',
|
|
194
|
+
symbol: null,
|
|
195
|
+
sha: 'sha-1',
|
|
196
|
+
symbol_calls: []
|
|
197
|
+
}),
|
|
198
|
+
chunk2: createChunk({
|
|
199
|
+
file: 'src/b.ts',
|
|
200
|
+
symbol: 'helper',
|
|
201
|
+
sha: 'sha-2',
|
|
202
|
+
symbol_calls: []
|
|
203
|
+
})
|
|
204
|
+
};
|
|
205
|
+
// Should not throw
|
|
206
|
+
const result = attachSymbolGraphToCodemap(codemap);
|
|
207
|
+
assert.ok(result.chunk1 !== undefined);
|
|
208
|
+
});
|
|
209
|
+
test('attachSymbolGraphToCodemap handles entries with empty string symbol', () => {
|
|
210
|
+
const codemap = {
|
|
211
|
+
chunk1: createChunk({
|
|
212
|
+
file: 'src/a.ts',
|
|
213
|
+
symbol: '',
|
|
214
|
+
sha: 'sha-1',
|
|
215
|
+
symbol_calls: []
|
|
216
|
+
})
|
|
217
|
+
};
|
|
218
|
+
// Should not throw
|
|
219
|
+
const result = attachSymbolGraphToCodemap(codemap);
|
|
220
|
+
assert.deepEqual(result.chunk1.symbol_call_targets, []);
|
|
221
|
+
});
|
|
222
|
+
test('attachSymbolGraphToCodemap handles entries with whitespace-only symbol', () => {
|
|
223
|
+
const codemap = {
|
|
224
|
+
chunk1: createChunk({
|
|
225
|
+
file: 'src/a.ts',
|
|
226
|
+
symbol: ' ',
|
|
227
|
+
sha: 'sha-1',
|
|
228
|
+
symbol_calls: []
|
|
229
|
+
})
|
|
230
|
+
};
|
|
231
|
+
const result = attachSymbolGraphToCodemap(codemap);
|
|
232
|
+
assert.deepEqual(result.chunk1.symbol_call_targets, []);
|
|
233
|
+
});
|
|
234
|
+
test('attachSymbolGraphToCodemap handles entries without sha', () => {
|
|
235
|
+
const codemap = {
|
|
236
|
+
chunk1: {
|
|
237
|
+
file: 'src/a.ts',
|
|
238
|
+
symbol: 'test',
|
|
239
|
+
sha: undefined // missing sha
|
|
240
|
+
}
|
|
241
|
+
};
|
|
242
|
+
// Should not throw
|
|
243
|
+
const result = attachSymbolGraphToCodemap(codemap);
|
|
244
|
+
assert.ok(result !== null);
|
|
245
|
+
});
|
|
246
|
+
test('attachSymbolGraphToCodemap handles null entries in codemap', () => {
|
|
247
|
+
const codemap = {
|
|
248
|
+
chunk1: null,
|
|
249
|
+
chunk2: createChunk({
|
|
250
|
+
file: 'src/b.ts',
|
|
251
|
+
symbol: 'valid',
|
|
252
|
+
sha: 'sha-2',
|
|
253
|
+
symbol_calls: []
|
|
254
|
+
})
|
|
255
|
+
};
|
|
256
|
+
// Should not throw
|
|
257
|
+
const result = attachSymbolGraphToCodemap(codemap);
|
|
258
|
+
assert.ok(result.chunk2.symbol_call_targets !== undefined);
|
|
259
|
+
});
|
|
260
|
+
test('attachSymbolGraphToCodemap handles non-object entries', () => {
|
|
261
|
+
const codemap = {
|
|
262
|
+
chunk1: 'not an object',
|
|
263
|
+
chunk2: createChunk({
|
|
264
|
+
file: 'src/b.ts',
|
|
265
|
+
symbol: 'valid',
|
|
266
|
+
sha: 'sha-2',
|
|
267
|
+
symbol_calls: []
|
|
268
|
+
})
|
|
269
|
+
};
|
|
270
|
+
// Should not throw
|
|
271
|
+
const result = attachSymbolGraphToCodemap(codemap);
|
|
272
|
+
assert.ok(result !== null);
|
|
273
|
+
});
|
|
274
|
+
test('attachSymbolGraphToCodemap handles non-array symbol_calls', () => {
|
|
275
|
+
const codemap = {
|
|
276
|
+
chunk1: {
|
|
277
|
+
file: 'src/a.ts',
|
|
278
|
+
symbol: 'caller',
|
|
279
|
+
sha: 'sha-1',
|
|
280
|
+
symbol_calls: 'not an array'
|
|
281
|
+
}
|
|
282
|
+
};
|
|
283
|
+
// Should not throw
|
|
284
|
+
const result = attachSymbolGraphToCodemap(codemap);
|
|
285
|
+
assert.deepEqual(result.chunk1.symbol_call_targets, []);
|
|
286
|
+
});
|
|
287
|
+
test('attachSymbolGraphToCodemap handles null values in symbol_calls array', () => {
|
|
288
|
+
const codemap = {
|
|
289
|
+
chunk1: createChunk({
|
|
290
|
+
file: 'src/a.ts',
|
|
291
|
+
symbol: 'caller',
|
|
292
|
+
sha: 'sha-caller',
|
|
293
|
+
symbol_calls: ['helper', null, undefined]
|
|
294
|
+
}),
|
|
295
|
+
chunk2: createChunk({
|
|
296
|
+
file: 'src/b.ts',
|
|
297
|
+
symbol: 'helper',
|
|
298
|
+
sha: 'sha-helper',
|
|
299
|
+
symbol_calls: []
|
|
300
|
+
})
|
|
301
|
+
};
|
|
302
|
+
// Should not throw and should still resolve 'helper'
|
|
303
|
+
const result = attachSymbolGraphToCodemap(codemap);
|
|
304
|
+
assert.ok(result.chunk1.symbol_call_targets.includes('sha-helper'));
|
|
305
|
+
});
|
|
306
|
+
test('attachSymbolGraphToCodemap handles empty string in symbol_calls array', () => {
|
|
307
|
+
const codemap = {
|
|
308
|
+
chunk1: createChunk({
|
|
309
|
+
file: 'src/a.ts',
|
|
310
|
+
symbol: 'caller',
|
|
311
|
+
sha: 'sha-caller',
|
|
312
|
+
symbol_calls: ['', ' ', 'helper']
|
|
313
|
+
}),
|
|
314
|
+
chunk2: createChunk({
|
|
315
|
+
file: 'src/b.ts',
|
|
316
|
+
symbol: 'helper',
|
|
317
|
+
sha: 'sha-helper',
|
|
318
|
+
symbol_calls: []
|
|
319
|
+
})
|
|
320
|
+
};
|
|
321
|
+
const result = attachSymbolGraphToCodemap(codemap);
|
|
322
|
+
assert.ok(result.chunk1.symbol_call_targets.includes('sha-helper'));
|
|
323
|
+
// Empty strings should not produce invalid entries
|
|
324
|
+
assert.equal(result.chunk1.symbol_call_targets.length, 1);
|
|
325
|
+
});
|
|
326
|
+
// ============================================================================
|
|
327
|
+
// Tests for MAX_NEIGHBORS limit
|
|
328
|
+
// ============================================================================
|
|
329
|
+
test('attachSymbolGraphToCodemap limits symbol_call_targets to MAX_NEIGHBORS', () => {
|
|
330
|
+
// Create a caller that calls many different functions
|
|
331
|
+
const callees = {};
|
|
332
|
+
const calls = [];
|
|
333
|
+
for (let i = 0; i < 20; i++) {
|
|
334
|
+
const name = `helper${i}`;
|
|
335
|
+
calls.push(name);
|
|
336
|
+
callees[`chunk${i + 1}`] = createChunk({
|
|
337
|
+
file: 'src/helpers.ts',
|
|
338
|
+
symbol: name,
|
|
339
|
+
sha: `sha-${i}`,
|
|
340
|
+
symbol_calls: []
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
const codemap = {
|
|
344
|
+
caller: createChunk({
|
|
345
|
+
file: 'src/main.ts',
|
|
346
|
+
symbol: 'main',
|
|
347
|
+
sha: 'sha-main',
|
|
348
|
+
symbol_calls: calls
|
|
349
|
+
}),
|
|
350
|
+
...callees
|
|
351
|
+
};
|
|
352
|
+
const result = attachSymbolGraphToCodemap(codemap);
|
|
353
|
+
// MAX_NEIGHBORS is 12 (from constants)
|
|
354
|
+
assert.ok(result.caller.symbol_call_targets.length <= 12);
|
|
355
|
+
});
|
|
356
|
+
test('attachSymbolGraphToCodemap limits symbol_callers to MAX_NEIGHBORS', () => {
|
|
357
|
+
// Create a callee that is called by many different functions
|
|
358
|
+
const callers = {};
|
|
359
|
+
for (let i = 0; i < 20; i++) {
|
|
360
|
+
callers[`caller${i}`] = createChunk({
|
|
361
|
+
file: 'src/callers.ts',
|
|
362
|
+
symbol: `caller${i}`,
|
|
363
|
+
sha: `sha-caller-${i}`,
|
|
364
|
+
symbol_calls: ['helper']
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
const codemap = {
|
|
368
|
+
...callers,
|
|
369
|
+
helper: createChunk({
|
|
370
|
+
file: 'src/utils.ts',
|
|
371
|
+
symbol: 'helper',
|
|
372
|
+
sha: 'sha-helper',
|
|
373
|
+
symbol_calls: []
|
|
374
|
+
})
|
|
375
|
+
};
|
|
376
|
+
const result = attachSymbolGraphToCodemap(codemap);
|
|
377
|
+
// MAX_NEIGHBORS is 12 (from constants)
|
|
378
|
+
assert.ok(result.helper.symbol_callers.length <= 12);
|
|
379
|
+
});
|
|
380
|
+
test('attachSymbolGraphToCodemap limits symbol_neighbors to MAX_NEIGHBORS * 2', () => {
|
|
381
|
+
// Create a node with many incoming and outgoing edges
|
|
382
|
+
const otherChunks = {};
|
|
383
|
+
const callsOut = [];
|
|
384
|
+
// 15 outgoing
|
|
385
|
+
for (let i = 0; i < 15; i++) {
|
|
386
|
+
const name = `outgoing${i}`;
|
|
387
|
+
callsOut.push(name);
|
|
388
|
+
otherChunks[`out${i}`] = createChunk({
|
|
389
|
+
file: 'src/out.ts',
|
|
390
|
+
symbol: name,
|
|
391
|
+
sha: `sha-out-${i}`,
|
|
392
|
+
symbol_calls: []
|
|
393
|
+
});
|
|
394
|
+
}
|
|
395
|
+
// 15 incoming
|
|
396
|
+
for (let i = 0; i < 15; i++) {
|
|
397
|
+
otherChunks[`in${i}`] = createChunk({
|
|
398
|
+
file: 'src/in.ts',
|
|
399
|
+
symbol: `incoming${i}`,
|
|
400
|
+
sha: `sha-in-${i}`,
|
|
401
|
+
symbol_calls: ['central']
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
const codemap = {
|
|
405
|
+
...otherChunks,
|
|
406
|
+
central: createChunk({
|
|
407
|
+
file: 'src/central.ts',
|
|
408
|
+
symbol: 'central',
|
|
409
|
+
sha: 'sha-central',
|
|
410
|
+
symbol_calls: callsOut
|
|
411
|
+
})
|
|
412
|
+
};
|
|
413
|
+
const result = attachSymbolGraphToCodemap(codemap);
|
|
414
|
+
// MAX_NEIGHBORS * 2 = 24
|
|
415
|
+
assert.ok(result.central.symbol_neighbors.length <= 24);
|
|
416
|
+
});
|
|
417
|
+
// ============================================================================
|
|
418
|
+
// Tests for complex graph structures
|
|
419
|
+
// ============================================================================
|
|
420
|
+
test('attachSymbolGraphToCodemap handles circular dependencies', () => {
|
|
421
|
+
const codemap = {
|
|
422
|
+
a: createChunk({
|
|
423
|
+
file: 'src/a.ts',
|
|
424
|
+
symbol: 'funcA',
|
|
425
|
+
sha: 'sha-a',
|
|
426
|
+
symbol_calls: ['funcB']
|
|
427
|
+
}),
|
|
428
|
+
b: createChunk({
|
|
429
|
+
file: 'src/b.ts',
|
|
430
|
+
symbol: 'funcB',
|
|
431
|
+
sha: 'sha-b',
|
|
432
|
+
symbol_calls: ['funcA']
|
|
433
|
+
})
|
|
434
|
+
};
|
|
435
|
+
const result = attachSymbolGraphToCodemap(codemap);
|
|
436
|
+
// Both should reference each other
|
|
437
|
+
assert.ok(result.a.symbol_call_targets.includes('sha-b'));
|
|
438
|
+
assert.ok(result.b.symbol_call_targets.includes('sha-a'));
|
|
439
|
+
assert.ok(result.a.symbol_callers.includes('sha-b'));
|
|
440
|
+
assert.ok(result.b.symbol_callers.includes('sha-a'));
|
|
441
|
+
});
|
|
442
|
+
test('attachSymbolGraphToCodemap handles transitive call chains', () => {
|
|
443
|
+
const codemap = {
|
|
444
|
+
a: createChunk({
|
|
445
|
+
file: 'src/a.ts',
|
|
446
|
+
symbol: 'funcA',
|
|
447
|
+
sha: 'sha-a',
|
|
448
|
+
symbol_calls: ['funcB']
|
|
449
|
+
}),
|
|
450
|
+
b: createChunk({
|
|
451
|
+
file: 'src/b.ts',
|
|
452
|
+
symbol: 'funcB',
|
|
453
|
+
sha: 'sha-b',
|
|
454
|
+
symbol_calls: ['funcC']
|
|
455
|
+
}),
|
|
456
|
+
c: createChunk({
|
|
457
|
+
file: 'src/c.ts',
|
|
458
|
+
symbol: 'funcC',
|
|
459
|
+
sha: 'sha-c',
|
|
460
|
+
symbol_calls: []
|
|
461
|
+
})
|
|
462
|
+
};
|
|
463
|
+
const result = attachSymbolGraphToCodemap(codemap);
|
|
464
|
+
// A calls B
|
|
465
|
+
assert.ok(result.a.symbol_call_targets.includes('sha-b'));
|
|
466
|
+
// B calls C
|
|
467
|
+
assert.ok(result.b.symbol_call_targets.includes('sha-c'));
|
|
468
|
+
// A does NOT directly call C (no transitive closure)
|
|
469
|
+
assert.ok(!result.a.symbol_call_targets.includes('sha-c'));
|
|
470
|
+
});
|
|
471
|
+
test('attachSymbolGraphToCodemap handles multiple callers to same target', () => {
|
|
472
|
+
const codemap = {
|
|
473
|
+
caller1: createChunk({
|
|
474
|
+
file: 'src/a.ts',
|
|
475
|
+
symbol: 'caller1',
|
|
476
|
+
sha: 'sha-caller1',
|
|
477
|
+
symbol_calls: ['shared']
|
|
478
|
+
}),
|
|
479
|
+
caller2: createChunk({
|
|
480
|
+
file: 'src/b.ts',
|
|
481
|
+
symbol: 'caller2',
|
|
482
|
+
sha: 'sha-caller2',
|
|
483
|
+
symbol_calls: ['shared']
|
|
484
|
+
}),
|
|
485
|
+
shared: createChunk({
|
|
486
|
+
file: 'src/shared.ts',
|
|
487
|
+
symbol: 'shared',
|
|
488
|
+
sha: 'sha-shared',
|
|
489
|
+
symbol_calls: []
|
|
490
|
+
})
|
|
491
|
+
};
|
|
492
|
+
const result = attachSymbolGraphToCodemap(codemap);
|
|
493
|
+
assert.ok(result.shared.symbol_callers.includes('sha-caller1'));
|
|
494
|
+
assert.ok(result.shared.symbol_callers.includes('sha-caller2'));
|
|
495
|
+
assert.equal(result.shared.symbol_callers.length, 2);
|
|
496
|
+
});
|
|
497
|
+
test('attachSymbolGraphToCodemap handles one function calling multiple targets', () => {
|
|
498
|
+
const codemap = {
|
|
499
|
+
orchestrator: createChunk({
|
|
500
|
+
file: 'src/main.ts',
|
|
501
|
+
symbol: 'orchestrator',
|
|
502
|
+
sha: 'sha-orch',
|
|
503
|
+
symbol_calls: ['step1', 'step2', 'step3']
|
|
504
|
+
}),
|
|
505
|
+
step1: createChunk({
|
|
506
|
+
file: 'src/steps.ts',
|
|
507
|
+
symbol: 'step1',
|
|
508
|
+
sha: 'sha-step1',
|
|
509
|
+
symbol_calls: []
|
|
510
|
+
}),
|
|
511
|
+
step2: createChunk({
|
|
512
|
+
file: 'src/steps.ts',
|
|
513
|
+
symbol: 'step2',
|
|
514
|
+
sha: 'sha-step2',
|
|
515
|
+
symbol_calls: []
|
|
516
|
+
}),
|
|
517
|
+
step3: createChunk({
|
|
518
|
+
file: 'src/steps.ts',
|
|
519
|
+
symbol: 'step3',
|
|
520
|
+
sha: 'sha-step3',
|
|
521
|
+
symbol_calls: []
|
|
522
|
+
})
|
|
523
|
+
};
|
|
524
|
+
const result = attachSymbolGraphToCodemap(codemap);
|
|
525
|
+
assert.ok(result.orchestrator.symbol_call_targets.includes('sha-step1'));
|
|
526
|
+
assert.ok(result.orchestrator.symbol_call_targets.includes('sha-step2'));
|
|
527
|
+
assert.ok(result.orchestrator.symbol_call_targets.includes('sha-step3'));
|
|
528
|
+
assert.equal(result.orchestrator.symbol_call_targets.length, 3);
|
|
529
|
+
});
|
|
530
|
+
// ============================================================================
|
|
531
|
+
// Tests for cross-file symbol resolution
|
|
532
|
+
// ============================================================================
|
|
533
|
+
test('attachSymbolGraphToCodemap prefers same-file symbol when duplicates exist', () => {
|
|
534
|
+
const codemap = {
|
|
535
|
+
main: createChunk({
|
|
536
|
+
file: 'src/main.ts',
|
|
537
|
+
symbol: 'main',
|
|
538
|
+
sha: 'sha-main',
|
|
539
|
+
symbol_calls: ['helper']
|
|
540
|
+
}),
|
|
541
|
+
helperLocal: createChunk({
|
|
542
|
+
file: 'src/main.ts', // same file as caller
|
|
543
|
+
symbol: 'helper',
|
|
544
|
+
sha: 'sha-helper-local',
|
|
545
|
+
symbol_calls: []
|
|
546
|
+
}),
|
|
547
|
+
helperRemote: createChunk({
|
|
548
|
+
file: 'src/utils.ts', // different file
|
|
549
|
+
symbol: 'helper',
|
|
550
|
+
sha: 'sha-helper-remote',
|
|
551
|
+
symbol_calls: []
|
|
552
|
+
})
|
|
553
|
+
};
|
|
554
|
+
const result = attachSymbolGraphToCodemap(codemap);
|
|
555
|
+
// Should prefer the local helper
|
|
556
|
+
assert.ok(result.main.symbol_call_targets.includes('sha-helper-local'));
|
|
557
|
+
assert.ok(!result.main.symbol_call_targets.includes('sha-helper-remote'));
|
|
558
|
+
});
|
|
559
|
+
test('attachSymbolGraphToCodemap resolves cross-file references correctly', () => {
|
|
560
|
+
const codemap = {
|
|
561
|
+
serviceA: createChunk({
|
|
562
|
+
file: 'src/services/a.ts',
|
|
563
|
+
symbol: 'ServiceA',
|
|
564
|
+
sha: 'sha-a',
|
|
565
|
+
symbol_calls: ['ServiceB', 'utils']
|
|
566
|
+
}),
|
|
567
|
+
serviceB: createChunk({
|
|
568
|
+
file: 'src/services/b.ts',
|
|
569
|
+
symbol: 'ServiceB',
|
|
570
|
+
sha: 'sha-b',
|
|
571
|
+
symbol_calls: ['utils']
|
|
572
|
+
}),
|
|
573
|
+
utils: createChunk({
|
|
574
|
+
file: 'src/utils/helpers.ts',
|
|
575
|
+
symbol: 'utils',
|
|
576
|
+
sha: 'sha-utils',
|
|
577
|
+
symbol_calls: []
|
|
578
|
+
})
|
|
579
|
+
};
|
|
580
|
+
const result = attachSymbolGraphToCodemap(codemap);
|
|
581
|
+
// ServiceA should call both ServiceB and utils
|
|
582
|
+
assert.ok(result.serviceA.symbol_call_targets.includes('sha-b'));
|
|
583
|
+
assert.ok(result.serviceA.symbol_call_targets.includes('sha-utils'));
|
|
584
|
+
// utils should be called by both ServiceA and ServiceB
|
|
585
|
+
assert.ok(result.utils.symbol_callers.includes('sha-a'));
|
|
586
|
+
assert.ok(result.utils.symbol_callers.includes('sha-b'));
|
|
587
|
+
});
|
|
588
|
+
// ============================================================================
|
|
589
|
+
// Tests for data integrity
|
|
590
|
+
// ============================================================================
|
|
591
|
+
test('attachSymbolGraphToCodemap preserves original chunk properties', () => {
|
|
592
|
+
const codemap = {
|
|
593
|
+
chunk1: {
|
|
594
|
+
file: 'src/test.ts',
|
|
595
|
+
symbol: 'testFunc',
|
|
596
|
+
sha: 'sha-test',
|
|
597
|
+
lang: 'typescript',
|
|
598
|
+
chunkType: 'function',
|
|
599
|
+
provider: 'openai',
|
|
600
|
+
dimensions: 1536,
|
|
601
|
+
hasCodevaultTags: true,
|
|
602
|
+
hasIntent: false,
|
|
603
|
+
hasDocumentation: true,
|
|
604
|
+
variableCount: 5,
|
|
605
|
+
synonyms: ['test', 'check'],
|
|
606
|
+
path_weight: 1.5,
|
|
607
|
+
success_rate: 0.95,
|
|
608
|
+
symbol_calls: []
|
|
609
|
+
}
|
|
610
|
+
};
|
|
611
|
+
const result = attachSymbolGraphToCodemap(codemap);
|
|
612
|
+
assert.equal(result.chunk1.file, 'src/test.ts');
|
|
613
|
+
assert.equal(result.chunk1.symbol, 'testFunc');
|
|
614
|
+
assert.equal(result.chunk1.sha, 'sha-test');
|
|
615
|
+
assert.equal(result.chunk1.lang, 'typescript');
|
|
616
|
+
assert.equal(result.chunk1.chunkType, 'function');
|
|
617
|
+
assert.equal(result.chunk1.provider, 'openai');
|
|
618
|
+
assert.equal(result.chunk1.dimensions, 1536);
|
|
619
|
+
assert.equal(result.chunk1.hasCodevaultTags, true);
|
|
620
|
+
assert.equal(result.chunk1.hasIntent, false);
|
|
621
|
+
assert.equal(result.chunk1.hasDocumentation, true);
|
|
622
|
+
assert.equal(result.chunk1.variableCount, 5);
|
|
623
|
+
assert.deepEqual(result.chunk1.synonyms, ['test', 'check']);
|
|
624
|
+
assert.equal(result.chunk1.path_weight, 1.5);
|
|
625
|
+
assert.equal(result.chunk1.success_rate, 0.95);
|
|
626
|
+
});
|
|
627
|
+
test('attachSymbolGraphToCodemap returns the same object reference (mutates in place)', () => {
|
|
628
|
+
const codemap = {
|
|
629
|
+
chunk1: createChunk({
|
|
630
|
+
file: 'src/a.ts',
|
|
631
|
+
symbol: 'test',
|
|
632
|
+
sha: 'sha-1',
|
|
633
|
+
symbol_calls: []
|
|
634
|
+
})
|
|
635
|
+
};
|
|
636
|
+
const result = attachSymbolGraphToCodemap(codemap);
|
|
637
|
+
assert.strictEqual(result, codemap);
|
|
638
|
+
});
|
|
639
|
+
test('attachSymbolGraphToCodemap initializes empty arrays for isolated nodes', () => {
|
|
640
|
+
const codemap = {
|
|
641
|
+
isolated: createChunk({
|
|
642
|
+
file: 'src/isolated.ts',
|
|
643
|
+
symbol: 'isolated',
|
|
644
|
+
sha: 'sha-isolated',
|
|
645
|
+
symbol_calls: []
|
|
646
|
+
})
|
|
647
|
+
};
|
|
648
|
+
const result = attachSymbolGraphToCodemap(codemap);
|
|
649
|
+
assert.ok(Array.isArray(result.isolated.symbol_call_targets));
|
|
650
|
+
assert.ok(Array.isArray(result.isolated.symbol_callers));
|
|
651
|
+
assert.ok(Array.isArray(result.isolated.symbol_neighbors));
|
|
652
|
+
assert.equal(result.isolated.symbol_call_targets.length, 0);
|
|
653
|
+
assert.equal(result.isolated.symbol_callers.length, 0);
|
|
654
|
+
assert.equal(result.isolated.symbol_neighbors.length, 0);
|
|
655
|
+
});
|
|
656
|
+
//# sourceMappingURL=symbols-graph.test.js.map
|