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,489 @@
|
|
|
1
|
+
import test from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { setTimeout as delay } from 'timers/promises';
|
|
4
|
+
import { Mutex, MutexTimeoutError, Semaphore } from '../utils/mutex.js';
|
|
5
|
+
// ============================================================================
|
|
6
|
+
// MutexTimeoutError Tests
|
|
7
|
+
// ============================================================================
|
|
8
|
+
test('MutexTimeoutError has correct message', () => {
|
|
9
|
+
const error = new MutexTimeoutError(5000);
|
|
10
|
+
assert.equal(error.message, 'Mutex acquire timed out after 5000ms');
|
|
11
|
+
assert.equal(error.name, 'MutexTimeoutError');
|
|
12
|
+
assert.ok(error instanceof Error);
|
|
13
|
+
assert.ok(error instanceof MutexTimeoutError);
|
|
14
|
+
});
|
|
15
|
+
// ============================================================================
|
|
16
|
+
// Mutex Basic Tests
|
|
17
|
+
// ============================================================================
|
|
18
|
+
test('Mutex is initially unlocked', () => {
|
|
19
|
+
const mutex = new Mutex();
|
|
20
|
+
assert.equal(mutex.isLocked(), false);
|
|
21
|
+
});
|
|
22
|
+
test('Mutex acquire locks the mutex', async () => {
|
|
23
|
+
const mutex = new Mutex();
|
|
24
|
+
await mutex.acquire();
|
|
25
|
+
assert.equal(mutex.isLocked(), true);
|
|
26
|
+
});
|
|
27
|
+
test('Mutex release unlocks the mutex', async () => {
|
|
28
|
+
const mutex = new Mutex();
|
|
29
|
+
await mutex.acquire();
|
|
30
|
+
mutex.release();
|
|
31
|
+
assert.equal(mutex.isLocked(), false);
|
|
32
|
+
});
|
|
33
|
+
test('Mutex acquire waits when already locked', async () => {
|
|
34
|
+
const mutex = new Mutex();
|
|
35
|
+
const order = [];
|
|
36
|
+
await mutex.acquire();
|
|
37
|
+
order.push(1);
|
|
38
|
+
const waitingAcquire = (async () => {
|
|
39
|
+
await mutex.acquire();
|
|
40
|
+
order.push(3);
|
|
41
|
+
mutex.release();
|
|
42
|
+
})();
|
|
43
|
+
// Small delay to ensure the waiting acquire is queued
|
|
44
|
+
await delay(10);
|
|
45
|
+
order.push(2);
|
|
46
|
+
mutex.release();
|
|
47
|
+
await waitingAcquire;
|
|
48
|
+
assert.deepEqual(order, [1, 2, 3]);
|
|
49
|
+
});
|
|
50
|
+
test('Mutex multiple waiters are processed in order', async () => {
|
|
51
|
+
const mutex = new Mutex();
|
|
52
|
+
const order = [];
|
|
53
|
+
await mutex.acquire();
|
|
54
|
+
const waiter1 = (async () => {
|
|
55
|
+
await mutex.acquire();
|
|
56
|
+
order.push(1);
|
|
57
|
+
mutex.release();
|
|
58
|
+
})();
|
|
59
|
+
const waiter2 = (async () => {
|
|
60
|
+
await delay(5); // Ensure waiter1 is queued first
|
|
61
|
+
await mutex.acquire();
|
|
62
|
+
order.push(2);
|
|
63
|
+
mutex.release();
|
|
64
|
+
})();
|
|
65
|
+
const waiter3 = (async () => {
|
|
66
|
+
await delay(10); // Ensure waiter2 is queued second
|
|
67
|
+
await mutex.acquire();
|
|
68
|
+
order.push(3);
|
|
69
|
+
mutex.release();
|
|
70
|
+
})();
|
|
71
|
+
await delay(20); // Allow all waiters to queue
|
|
72
|
+
mutex.release(); // Release initial lock
|
|
73
|
+
await Promise.all([waiter1, waiter2, waiter3]);
|
|
74
|
+
assert.deepEqual(order, [1, 2, 3]);
|
|
75
|
+
});
|
|
76
|
+
// ============================================================================
|
|
77
|
+
// Mutex Timeout Tests
|
|
78
|
+
// ============================================================================
|
|
79
|
+
test('Mutex acquire with timeout succeeds when available', async () => {
|
|
80
|
+
const mutex = new Mutex();
|
|
81
|
+
await mutex.acquire(1000);
|
|
82
|
+
assert.equal(mutex.isLocked(), true);
|
|
83
|
+
mutex.release();
|
|
84
|
+
});
|
|
85
|
+
test('Mutex acquire throws MutexTimeoutError on timeout', async () => {
|
|
86
|
+
const mutex = new Mutex();
|
|
87
|
+
await mutex.acquire();
|
|
88
|
+
await assert.rejects(mutex.acquire(50), (error) => {
|
|
89
|
+
return error instanceof MutexTimeoutError &&
|
|
90
|
+
error.message === 'Mutex acquire timed out after 50ms';
|
|
91
|
+
});
|
|
92
|
+
mutex.release();
|
|
93
|
+
});
|
|
94
|
+
test('Mutex timeout removes waiter from queue', async () => {
|
|
95
|
+
const mutex = new Mutex();
|
|
96
|
+
await mutex.acquire();
|
|
97
|
+
assert.equal(mutex.getQueueLength(), 0);
|
|
98
|
+
// Start a waiter that will timeout
|
|
99
|
+
const timeoutPromise = mutex.acquire(20);
|
|
100
|
+
// Wait a bit for the waiter to be queued
|
|
101
|
+
await delay(5);
|
|
102
|
+
assert.equal(mutex.getQueueLength(), 1);
|
|
103
|
+
// Wait for timeout
|
|
104
|
+
await assert.rejects(timeoutPromise, MutexTimeoutError);
|
|
105
|
+
// Queue should be empty after timeout
|
|
106
|
+
assert.equal(mutex.getQueueLength(), 0);
|
|
107
|
+
mutex.release();
|
|
108
|
+
});
|
|
109
|
+
test('Mutex timeout does not affect subsequent acquires', async () => {
|
|
110
|
+
const mutex = new Mutex();
|
|
111
|
+
await mutex.acquire();
|
|
112
|
+
// First acquire times out
|
|
113
|
+
const timeout1 = mutex.acquire(20);
|
|
114
|
+
await assert.rejects(timeout1, MutexTimeoutError);
|
|
115
|
+
// Second acquire should still work once released
|
|
116
|
+
const acquire2 = mutex.acquire();
|
|
117
|
+
mutex.release();
|
|
118
|
+
await acquire2;
|
|
119
|
+
assert.equal(mutex.isLocked(), true);
|
|
120
|
+
mutex.release();
|
|
121
|
+
});
|
|
122
|
+
test('Mutex acquire clears timeout on successful acquire', async () => {
|
|
123
|
+
const mutex = new Mutex();
|
|
124
|
+
const order = [];
|
|
125
|
+
await mutex.acquire();
|
|
126
|
+
const waiter = (async () => {
|
|
127
|
+
await mutex.acquire(1000); // Long timeout
|
|
128
|
+
order.push('acquired');
|
|
129
|
+
mutex.release();
|
|
130
|
+
})();
|
|
131
|
+
await delay(10);
|
|
132
|
+
order.push('releasing');
|
|
133
|
+
mutex.release();
|
|
134
|
+
await waiter;
|
|
135
|
+
assert.deepEqual(order, ['releasing', 'acquired']);
|
|
136
|
+
});
|
|
137
|
+
test('Mutex acquire with zero timeout does not timeout', async () => {
|
|
138
|
+
const mutex = new Mutex();
|
|
139
|
+
await mutex.acquire();
|
|
140
|
+
// timeout = 0 should not set up a timeout
|
|
141
|
+
const acquirePromise = mutex.acquire(0);
|
|
142
|
+
await delay(50);
|
|
143
|
+
mutex.release();
|
|
144
|
+
await acquirePromise;
|
|
145
|
+
assert.equal(mutex.isLocked(), true);
|
|
146
|
+
mutex.release();
|
|
147
|
+
});
|
|
148
|
+
test('Mutex acquire with negative timeout does not timeout', async () => {
|
|
149
|
+
const mutex = new Mutex();
|
|
150
|
+
await mutex.acquire();
|
|
151
|
+
// timeout = -1 should not set up a timeout
|
|
152
|
+
const acquirePromise = mutex.acquire(-1);
|
|
153
|
+
await delay(50);
|
|
154
|
+
mutex.release();
|
|
155
|
+
await acquirePromise;
|
|
156
|
+
assert.equal(mutex.isLocked(), true);
|
|
157
|
+
mutex.release();
|
|
158
|
+
});
|
|
159
|
+
// ============================================================================
|
|
160
|
+
// Mutex runExclusive Tests
|
|
161
|
+
// ============================================================================
|
|
162
|
+
test('Mutex runExclusive acquires and releases automatically', async () => {
|
|
163
|
+
const mutex = new Mutex();
|
|
164
|
+
const result = await mutex.runExclusive(async () => {
|
|
165
|
+
assert.equal(mutex.isLocked(), true);
|
|
166
|
+
return 42;
|
|
167
|
+
});
|
|
168
|
+
assert.equal(result, 42);
|
|
169
|
+
assert.equal(mutex.isLocked(), false);
|
|
170
|
+
});
|
|
171
|
+
test('Mutex runExclusive releases on error', async () => {
|
|
172
|
+
const mutex = new Mutex();
|
|
173
|
+
await assert.rejects(mutex.runExclusive(async () => {
|
|
174
|
+
throw new Error('Function error');
|
|
175
|
+
}), { message: 'Function error' });
|
|
176
|
+
assert.equal(mutex.isLocked(), false);
|
|
177
|
+
});
|
|
178
|
+
test('Mutex runExclusive serializes concurrent calls', async () => {
|
|
179
|
+
const mutex = new Mutex();
|
|
180
|
+
const order = [];
|
|
181
|
+
const results = await Promise.all([
|
|
182
|
+
mutex.runExclusive(async () => {
|
|
183
|
+
order.push(1);
|
|
184
|
+
await delay(30);
|
|
185
|
+
order.push(2);
|
|
186
|
+
return 'first';
|
|
187
|
+
}),
|
|
188
|
+
mutex.runExclusive(async () => {
|
|
189
|
+
order.push(3);
|
|
190
|
+
await delay(10);
|
|
191
|
+
order.push(4);
|
|
192
|
+
return 'second';
|
|
193
|
+
}),
|
|
194
|
+
]);
|
|
195
|
+
assert.deepEqual(order, [1, 2, 3, 4]);
|
|
196
|
+
assert.deepEqual(results, ['first', 'second']);
|
|
197
|
+
});
|
|
198
|
+
test('Mutex runExclusive returns correct value type', async () => {
|
|
199
|
+
const mutex = new Mutex();
|
|
200
|
+
const numResult = await mutex.runExclusive(async () => 42);
|
|
201
|
+
const strResult = await mutex.runExclusive(async () => 'hello');
|
|
202
|
+
const objResult = await mutex.runExclusive(async () => ({ key: 'value' }));
|
|
203
|
+
assert.equal(numResult, 42);
|
|
204
|
+
assert.equal(strResult, 'hello');
|
|
205
|
+
assert.deepEqual(objResult, { key: 'value' });
|
|
206
|
+
});
|
|
207
|
+
// ============================================================================
|
|
208
|
+
// Mutex Queue Length Tests
|
|
209
|
+
// ============================================================================
|
|
210
|
+
test('Mutex getQueueLength returns 0 when no waiters', () => {
|
|
211
|
+
const mutex = new Mutex();
|
|
212
|
+
assert.equal(mutex.getQueueLength(), 0);
|
|
213
|
+
});
|
|
214
|
+
test('Mutex getQueueLength tracks waiting acquires', async () => {
|
|
215
|
+
const mutex = new Mutex();
|
|
216
|
+
await mutex.acquire();
|
|
217
|
+
const waiter1 = mutex.acquire();
|
|
218
|
+
await delay(5);
|
|
219
|
+
assert.equal(mutex.getQueueLength(), 1);
|
|
220
|
+
const waiter2 = mutex.acquire();
|
|
221
|
+
await delay(5);
|
|
222
|
+
assert.equal(mutex.getQueueLength(), 2);
|
|
223
|
+
mutex.release();
|
|
224
|
+
await delay(5);
|
|
225
|
+
assert.equal(mutex.getQueueLength(), 1);
|
|
226
|
+
mutex.release();
|
|
227
|
+
await waiter1;
|
|
228
|
+
await waiter2;
|
|
229
|
+
assert.equal(mutex.getQueueLength(), 0);
|
|
230
|
+
});
|
|
231
|
+
// ============================================================================
|
|
232
|
+
// Mutex Edge Cases
|
|
233
|
+
// ============================================================================
|
|
234
|
+
test('Mutex release when not locked has no effect', () => {
|
|
235
|
+
const mutex = new Mutex();
|
|
236
|
+
mutex.release();
|
|
237
|
+
assert.equal(mutex.isLocked(), false);
|
|
238
|
+
});
|
|
239
|
+
test('Mutex double release after single acquire', async () => {
|
|
240
|
+
const mutex = new Mutex();
|
|
241
|
+
await mutex.acquire();
|
|
242
|
+
mutex.release();
|
|
243
|
+
mutex.release(); // Should not throw
|
|
244
|
+
assert.equal(mutex.isLocked(), false);
|
|
245
|
+
});
|
|
246
|
+
test('Mutex handles rapid acquire/release cycles', async () => {
|
|
247
|
+
const mutex = new Mutex();
|
|
248
|
+
for (let i = 0; i < 100; i++) {
|
|
249
|
+
await mutex.acquire();
|
|
250
|
+
assert.equal(mutex.isLocked(), true);
|
|
251
|
+
mutex.release();
|
|
252
|
+
assert.equal(mutex.isLocked(), false);
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
// ============================================================================
|
|
256
|
+
// Semaphore Basic Tests
|
|
257
|
+
// ============================================================================
|
|
258
|
+
test('Semaphore is initialized with correct permits', () => {
|
|
259
|
+
const sem = new Semaphore(3);
|
|
260
|
+
assert.equal(sem.getAvailablePermits(), 3);
|
|
261
|
+
assert.equal(sem.getQueueLength(), 0);
|
|
262
|
+
});
|
|
263
|
+
test('Semaphore acquire decrements permits', async () => {
|
|
264
|
+
const sem = new Semaphore(3);
|
|
265
|
+
await sem.acquire();
|
|
266
|
+
assert.equal(sem.getAvailablePermits(), 2);
|
|
267
|
+
await sem.acquire();
|
|
268
|
+
assert.equal(sem.getAvailablePermits(), 1);
|
|
269
|
+
await sem.acquire();
|
|
270
|
+
assert.equal(sem.getAvailablePermits(), 0);
|
|
271
|
+
});
|
|
272
|
+
test('Semaphore release increments permits', async () => {
|
|
273
|
+
const sem = new Semaphore(3);
|
|
274
|
+
await sem.acquire();
|
|
275
|
+
await sem.acquire();
|
|
276
|
+
assert.equal(sem.getAvailablePermits(), 1);
|
|
277
|
+
sem.release();
|
|
278
|
+
assert.equal(sem.getAvailablePermits(), 2);
|
|
279
|
+
sem.release();
|
|
280
|
+
assert.equal(sem.getAvailablePermits(), 3);
|
|
281
|
+
});
|
|
282
|
+
test('Semaphore acquire waits when no permits available', async () => {
|
|
283
|
+
const sem = new Semaphore(1);
|
|
284
|
+
const order = [];
|
|
285
|
+
await sem.acquire();
|
|
286
|
+
order.push(1);
|
|
287
|
+
const waitingAcquire = (async () => {
|
|
288
|
+
await sem.acquire();
|
|
289
|
+
order.push(3);
|
|
290
|
+
sem.release();
|
|
291
|
+
})();
|
|
292
|
+
await delay(10);
|
|
293
|
+
order.push(2);
|
|
294
|
+
sem.release();
|
|
295
|
+
await waitingAcquire;
|
|
296
|
+
assert.deepEqual(order, [1, 2, 3]);
|
|
297
|
+
});
|
|
298
|
+
// ============================================================================
|
|
299
|
+
// Semaphore Concurrency Tests
|
|
300
|
+
// ============================================================================
|
|
301
|
+
test('Semaphore allows multiple concurrent acquires up to limit', async () => {
|
|
302
|
+
const sem = new Semaphore(3);
|
|
303
|
+
let concurrent = 0;
|
|
304
|
+
let maxConcurrent = 0;
|
|
305
|
+
const task = async () => {
|
|
306
|
+
await sem.acquire();
|
|
307
|
+
concurrent++;
|
|
308
|
+
maxConcurrent = Math.max(maxConcurrent, concurrent);
|
|
309
|
+
await delay(50);
|
|
310
|
+
concurrent--;
|
|
311
|
+
sem.release();
|
|
312
|
+
};
|
|
313
|
+
// Start 5 tasks, but only 3 should run concurrently
|
|
314
|
+
await Promise.all([
|
|
315
|
+
task(), task(), task(), task(), task()
|
|
316
|
+
]);
|
|
317
|
+
assert.equal(maxConcurrent, 3);
|
|
318
|
+
assert.equal(concurrent, 0);
|
|
319
|
+
});
|
|
320
|
+
test('Semaphore processes queue in order', async () => {
|
|
321
|
+
const sem = new Semaphore(1);
|
|
322
|
+
const order = [];
|
|
323
|
+
await sem.acquire();
|
|
324
|
+
const waiter1 = (async () => {
|
|
325
|
+
await sem.acquire();
|
|
326
|
+
order.push(1);
|
|
327
|
+
sem.release();
|
|
328
|
+
})();
|
|
329
|
+
await delay(5);
|
|
330
|
+
const waiter2 = (async () => {
|
|
331
|
+
await sem.acquire();
|
|
332
|
+
order.push(2);
|
|
333
|
+
sem.release();
|
|
334
|
+
})();
|
|
335
|
+
await delay(5);
|
|
336
|
+
const waiter3 = (async () => {
|
|
337
|
+
await sem.acquire();
|
|
338
|
+
order.push(3);
|
|
339
|
+
sem.release();
|
|
340
|
+
})();
|
|
341
|
+
await delay(10);
|
|
342
|
+
sem.release();
|
|
343
|
+
await Promise.all([waiter1, waiter2, waiter3]);
|
|
344
|
+
assert.deepEqual(order, [1, 2, 3]);
|
|
345
|
+
});
|
|
346
|
+
// ============================================================================
|
|
347
|
+
// Semaphore runExclusive Tests
|
|
348
|
+
// ============================================================================
|
|
349
|
+
test('Semaphore runExclusive acquires and releases automatically', async () => {
|
|
350
|
+
const sem = new Semaphore(2);
|
|
351
|
+
const result = await sem.runExclusive(async () => {
|
|
352
|
+
assert.equal(sem.getAvailablePermits(), 1);
|
|
353
|
+
return 'result';
|
|
354
|
+
});
|
|
355
|
+
assert.equal(result, 'result');
|
|
356
|
+
assert.equal(sem.getAvailablePermits(), 2);
|
|
357
|
+
});
|
|
358
|
+
test('Semaphore runExclusive releases on error', async () => {
|
|
359
|
+
const sem = new Semaphore(1);
|
|
360
|
+
await assert.rejects(sem.runExclusive(async () => {
|
|
361
|
+
throw new Error('Task error');
|
|
362
|
+
}), { message: 'Task error' });
|
|
363
|
+
assert.equal(sem.getAvailablePermits(), 1);
|
|
364
|
+
});
|
|
365
|
+
test('Semaphore runExclusive allows parallel execution up to limit', async () => {
|
|
366
|
+
const sem = new Semaphore(2);
|
|
367
|
+
let concurrent = 0;
|
|
368
|
+
let maxConcurrent = 0;
|
|
369
|
+
const task = async () => {
|
|
370
|
+
return sem.runExclusive(async () => {
|
|
371
|
+
concurrent++;
|
|
372
|
+
maxConcurrent = Math.max(maxConcurrent, concurrent);
|
|
373
|
+
await delay(30);
|
|
374
|
+
concurrent--;
|
|
375
|
+
return maxConcurrent;
|
|
376
|
+
});
|
|
377
|
+
};
|
|
378
|
+
await Promise.all([task(), task(), task(), task()]);
|
|
379
|
+
assert.equal(maxConcurrent, 2);
|
|
380
|
+
assert.equal(concurrent, 0);
|
|
381
|
+
});
|
|
382
|
+
// ============================================================================
|
|
383
|
+
// Semaphore Edge Cases
|
|
384
|
+
// ============================================================================
|
|
385
|
+
test('Semaphore release does not exceed max permits', async () => {
|
|
386
|
+
const sem = new Semaphore(2);
|
|
387
|
+
sem.release(); // Extra release
|
|
388
|
+
sem.release(); // Extra release
|
|
389
|
+
sem.release(); // Extra release
|
|
390
|
+
// Should still be capped at maxPermits
|
|
391
|
+
assert.equal(sem.getAvailablePermits(), 2);
|
|
392
|
+
});
|
|
393
|
+
test('Semaphore with single permit acts like mutex', async () => {
|
|
394
|
+
const sem = new Semaphore(1);
|
|
395
|
+
const order = [];
|
|
396
|
+
const results = await Promise.all([
|
|
397
|
+
sem.runExclusive(async () => {
|
|
398
|
+
order.push(1);
|
|
399
|
+
await delay(20);
|
|
400
|
+
order.push(2);
|
|
401
|
+
return 'first';
|
|
402
|
+
}),
|
|
403
|
+
sem.runExclusive(async () => {
|
|
404
|
+
order.push(3);
|
|
405
|
+
await delay(10);
|
|
406
|
+
order.push(4);
|
|
407
|
+
return 'second';
|
|
408
|
+
}),
|
|
409
|
+
]);
|
|
410
|
+
assert.deepEqual(order, [1, 2, 3, 4]);
|
|
411
|
+
assert.deepEqual(results, ['first', 'second']);
|
|
412
|
+
});
|
|
413
|
+
test('Semaphore getQueueLength reflects waiting tasks', async () => {
|
|
414
|
+
const sem = new Semaphore(1);
|
|
415
|
+
await sem.acquire();
|
|
416
|
+
const waiter1 = sem.acquire();
|
|
417
|
+
await delay(5);
|
|
418
|
+
assert.equal(sem.getQueueLength(), 1);
|
|
419
|
+
const waiter2 = sem.acquire();
|
|
420
|
+
await delay(5);
|
|
421
|
+
assert.equal(sem.getQueueLength(), 2);
|
|
422
|
+
sem.release();
|
|
423
|
+
await delay(5);
|
|
424
|
+
sem.release();
|
|
425
|
+
await waiter1;
|
|
426
|
+
await waiter2;
|
|
427
|
+
assert.equal(sem.getQueueLength(), 0);
|
|
428
|
+
});
|
|
429
|
+
test('Semaphore handles rapid acquire/release cycles', async () => {
|
|
430
|
+
const sem = new Semaphore(3);
|
|
431
|
+
for (let i = 0; i < 50; i++) {
|
|
432
|
+
await sem.acquire();
|
|
433
|
+
sem.release();
|
|
434
|
+
}
|
|
435
|
+
assert.equal(sem.getAvailablePermits(), 3);
|
|
436
|
+
});
|
|
437
|
+
test('Semaphore with zero permits blocks all acquires', async () => {
|
|
438
|
+
const sem = new Semaphore(1);
|
|
439
|
+
await sem.acquire(); // Now 0 permits
|
|
440
|
+
let acquired = false;
|
|
441
|
+
const acquire = (async () => {
|
|
442
|
+
await sem.acquire();
|
|
443
|
+
acquired = true;
|
|
444
|
+
sem.release();
|
|
445
|
+
})();
|
|
446
|
+
await delay(30);
|
|
447
|
+
assert.equal(acquired, false);
|
|
448
|
+
sem.release();
|
|
449
|
+
await acquire;
|
|
450
|
+
assert.equal(acquired, true);
|
|
451
|
+
});
|
|
452
|
+
// ============================================================================
|
|
453
|
+
// Integration Tests
|
|
454
|
+
// ============================================================================
|
|
455
|
+
test('Mutex protects shared state correctly', async () => {
|
|
456
|
+
const mutex = new Mutex();
|
|
457
|
+
let counter = 0;
|
|
458
|
+
const increment = async () => {
|
|
459
|
+
await mutex.runExclusive(async () => {
|
|
460
|
+
const current = counter;
|
|
461
|
+
await delay(Math.random() * 10);
|
|
462
|
+
counter = current + 1;
|
|
463
|
+
});
|
|
464
|
+
};
|
|
465
|
+
// Run 10 concurrent increments
|
|
466
|
+
await Promise.all(Array(10).fill(null).map(() => increment()));
|
|
467
|
+
assert.equal(counter, 10);
|
|
468
|
+
});
|
|
469
|
+
test('Semaphore limits concurrent operations', async () => {
|
|
470
|
+
const sem = new Semaphore(3);
|
|
471
|
+
const activeTasks = [];
|
|
472
|
+
const completedTasks = [];
|
|
473
|
+
const task = async (id) => {
|
|
474
|
+
await sem.runExclusive(async () => {
|
|
475
|
+
activeTasks.push(id);
|
|
476
|
+
assert.ok(activeTasks.length <= 3, `Too many concurrent tasks: ${activeTasks.length}`);
|
|
477
|
+
await delay(20 + Math.random() * 20);
|
|
478
|
+
activeTasks.splice(activeTasks.indexOf(id), 1);
|
|
479
|
+
completedTasks.push(id);
|
|
480
|
+
});
|
|
481
|
+
};
|
|
482
|
+
await Promise.all([
|
|
483
|
+
task(1), task(2), task(3), task(4), task(5),
|
|
484
|
+
task(6), task(7), task(8), task(9), task(10)
|
|
485
|
+
]);
|
|
486
|
+
assert.equal(completedTasks.length, 10);
|
|
487
|
+
assert.equal(activeTasks.length, 0);
|
|
488
|
+
});
|
|
489
|
+
//# sourceMappingURL=mutex.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutex.test.js","sourceRoot":"","sources":["../../src/tests/mutex.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-helpers.test.d.ts","sourceRoot":"","sources":["../../src/tests/path-helpers.test.ts"],"names":[],"mappings":""}
|