@skillsmith/core 0.4.14 → 0.4.16
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 +2 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/analysis/DependencyMerger.d.ts +39 -0
- package/dist/src/analysis/DependencyMerger.d.ts.map +1 -0
- package/dist/src/analysis/DependencyMerger.js +191 -0
- package/dist/src/analysis/DependencyMerger.js.map +1 -0
- package/dist/src/analysis/DependencyMerger.test.d.ts +2 -0
- package/dist/src/analysis/DependencyMerger.test.d.ts.map +1 -0
- package/dist/src/analysis/DependencyMerger.test.js +258 -0
- package/dist/src/analysis/DependencyMerger.test.js.map +1 -0
- package/dist/src/analysis/McpReferenceExtractor.d.ts +42 -0
- package/dist/src/analysis/McpReferenceExtractor.d.ts.map +1 -0
- package/dist/src/analysis/McpReferenceExtractor.js +92 -0
- package/dist/src/analysis/McpReferenceExtractor.js.map +1 -0
- package/dist/src/analysis/McpReferenceExtractor.test.d.ts +2 -0
- package/dist/src/analysis/McpReferenceExtractor.test.d.ts.map +1 -0
- package/dist/src/analysis/McpReferenceExtractor.test.js +262 -0
- package/dist/src/analysis/McpReferenceExtractor.test.js.map +1 -0
- package/dist/src/api/client.d.ts +1 -0
- package/dist/src/api/client.d.ts.map +1 -1
- package/dist/src/api/client.health.d.ts +26 -0
- package/dist/src/api/client.health.d.ts.map +1 -0
- package/dist/src/api/client.health.js +74 -0
- package/dist/src/api/client.health.js.map +1 -0
- package/dist/src/api/client.js +3 -51
- package/dist/src/api/client.js.map +1 -1
- package/dist/src/api/schemas.d.ts +4 -4
- package/dist/src/db/createDatabase.d.ts +9 -1
- package/dist/src/db/createDatabase.d.ts.map +1 -1
- package/dist/src/db/createDatabase.js +9 -1
- package/dist/src/db/createDatabase.js.map +1 -1
- package/dist/src/db/drivers/sqljsDriver.d.ts.map +1 -1
- package/dist/src/db/drivers/sqljsDriver.js +7 -8
- package/dist/src/db/drivers/sqljsDriver.js.map +1 -1
- package/dist/src/db/migrations/v10-dependencies.d.ts +18 -0
- package/dist/src/db/migrations/v10-dependencies.d.ts.map +1 -0
- package/dist/src/db/migrations/v10-dependencies.js +50 -0
- package/dist/src/db/migrations/v10-dependencies.js.map +1 -0
- package/dist/src/db/migrations/v2-phase5-columns.d.ts +7 -0
- package/dist/src/db/migrations/v2-phase5-columns.d.ts.map +1 -0
- package/dist/src/db/migrations/v2-phase5-columns.js +16 -0
- package/dist/src/db/migrations/v2-phase5-columns.js.map +1 -0
- package/dist/src/db/migrations/v3-sync-tables.d.ts +6 -0
- package/dist/src/db/migrations/v3-sync-tables.d.ts.map +1 -0
- package/dist/src/db/migrations/v3-sync-tables.js +41 -0
- package/dist/src/db/migrations/v3-sync-tables.js.map +1 -0
- package/dist/src/db/migrations/v4-security-columns.d.ts +7 -0
- package/dist/src/db/migrations/v4-security-columns.d.ts.map +1 -0
- package/dist/src/db/migrations/v4-security-columns.js +17 -0
- package/dist/src/db/migrations/v4-security-columns.js.map +1 -0
- package/dist/src/db/migrations/v5b-change-type.d.ts +19 -0
- package/dist/src/db/migrations/v5b-change-type.d.ts.map +1 -0
- package/dist/src/db/migrations/v5b-change-type.js +22 -0
- package/dist/src/db/migrations/v5b-change-type.js.map +1 -0
- package/dist/src/db/migrations/v6-advisories.d.ts +32 -0
- package/dist/src/db/migrations/v6-advisories.d.ts.map +1 -0
- package/dist/src/db/migrations/v6-advisories.js +53 -0
- package/dist/src/db/migrations/v6-advisories.js.map +1 -0
- package/dist/src/db/migrations/v7-compatibility.d.ts +21 -0
- package/dist/src/db/migrations/v7-compatibility.d.ts.map +1 -0
- package/dist/src/db/migrations/v7-compatibility.js +23 -0
- package/dist/src/db/migrations/v7-compatibility.js.map +1 -0
- package/dist/src/db/migrations/v8-co-installs.d.ts +21 -0
- package/dist/src/db/migrations/v8-co-installs.d.ts.map +1 -0
- package/dist/src/db/migrations/v8-co-installs.js +33 -0
- package/dist/src/db/migrations/v8-co-installs.js.map +1 -0
- package/dist/src/db/schema.d.ts +5 -16
- package/dist/src/db/schema.d.ts.map +1 -1
- package/dist/src/db/schema.js +50 -79
- package/dist/src/db/schema.js.map +1 -1
- package/dist/src/exports/repositories.d.ts +6 -0
- package/dist/src/exports/repositories.d.ts.map +1 -1
- package/dist/src/exports/repositories.js +21 -0
- package/dist/src/exports/repositories.js.map +1 -1
- package/dist/src/exports/services.d.ts +2 -0
- package/dist/src/exports/services.d.ts.map +1 -1
- package/dist/src/exports/services.js +5 -0
- package/dist/src/exports/services.js.map +1 -1
- package/dist/src/exports/types.d.ts +2 -1
- package/dist/src/exports/types.d.ts.map +1 -1
- package/dist/src/exports/types.js.map +1 -1
- package/dist/src/indexer/GitHubIndexer.d.ts +3 -1
- package/dist/src/indexer/GitHubIndexer.d.ts.map +1 -1
- package/dist/src/indexer/GitHubIndexer.js.map +1 -1
- package/dist/src/indexer/SkillParser.d.ts +22 -9
- package/dist/src/indexer/SkillParser.d.ts.map +1 -1
- package/dist/src/indexer/SkillParser.js +17 -10
- package/dist/src/indexer/SkillParser.js.map +1 -1
- package/dist/src/learning/PatternStore.d.ts +0 -2
- package/dist/src/learning/PatternStore.d.ts.map +1 -1
- package/dist/src/learning/PatternStore.helpers.d.ts +19 -1
- package/dist/src/learning/PatternStore.helpers.d.ts.map +1 -1
- package/dist/src/learning/PatternStore.helpers.js +51 -0
- package/dist/src/learning/PatternStore.helpers.js.map +1 -1
- package/dist/src/learning/PatternStore.js +5 -37
- package/dist/src/learning/PatternStore.js.map +1 -1
- package/dist/src/repositories/AdvisoryRepository.d.ts +80 -0
- package/dist/src/repositories/AdvisoryRepository.d.ts.map +1 -0
- package/dist/src/repositories/AdvisoryRepository.js +128 -0
- package/dist/src/repositories/AdvisoryRepository.js.map +1 -0
- package/dist/src/repositories/AdvisoryRepository.test.d.ts +6 -0
- package/dist/src/repositories/AdvisoryRepository.test.d.ts.map +1 -0
- package/dist/src/repositories/AdvisoryRepository.test.js +149 -0
- package/dist/src/repositories/AdvisoryRepository.test.js.map +1 -0
- package/dist/src/repositories/CoInstallRepository.d.ts +68 -0
- package/dist/src/repositories/CoInstallRepository.d.ts.map +1 -0
- package/dist/src/repositories/CoInstallRepository.js +122 -0
- package/dist/src/repositories/CoInstallRepository.js.map +1 -0
- package/dist/src/repositories/IndexerRepository.d.ts.map +1 -1
- package/dist/src/repositories/IndexerRepository.js +5 -1
- package/dist/src/repositories/IndexerRepository.js.map +1 -1
- package/dist/src/repositories/SkillDependencyRepository.d.ts +73 -0
- package/dist/src/repositories/SkillDependencyRepository.d.ts.map +1 -0
- package/dist/src/repositories/SkillDependencyRepository.js +199 -0
- package/dist/src/repositories/SkillDependencyRepository.js.map +1 -0
- package/dist/src/repositories/SkillRepository.d.ts.map +1 -1
- package/dist/src/repositories/SkillRepository.js +16 -5
- package/dist/src/repositories/SkillRepository.js.map +1 -1
- package/dist/src/scripts/validation/types.d.ts +2 -2
- package/dist/src/services/SearchService.helpers.d.ts.map +1 -1
- package/dist/src/services/SearchService.helpers.js +4 -0
- package/dist/src/services/SearchService.helpers.js.map +1 -1
- package/dist/src/services/SearchService.types.d.ts +1 -0
- package/dist/src/services/SearchService.types.d.ts.map +1 -1
- package/dist/src/services/TaskRunner.d.ts +5 -81
- package/dist/src/services/TaskRunner.d.ts.map +1 -1
- package/dist/src/services/TaskRunner.js +7 -68
- package/dist/src/services/TaskRunner.js.map +1 -1
- package/dist/src/services/TaskRunner.process.d.ts +33 -0
- package/dist/src/services/TaskRunner.process.d.ts.map +1 -0
- package/dist/src/services/TaskRunner.process.js +70 -0
- package/dist/src/services/TaskRunner.process.js.map +1 -0
- package/dist/src/services/TaskRunner.types.d.ts +76 -0
- package/dist/src/services/TaskRunner.types.d.ts.map +1 -0
- package/dist/src/services/TaskRunner.types.js +22 -0
- package/dist/src/services/TaskRunner.types.js.map +1 -0
- package/dist/src/services/__tests__/TaskRunner.process.test.d.ts +13 -0
- package/dist/src/services/__tests__/TaskRunner.process.test.d.ts.map +1 -0
- package/dist/src/services/__tests__/TaskRunner.process.test.js +91 -0
- package/dist/src/services/__tests__/TaskRunner.process.test.js.map +1 -0
- package/dist/src/services/quarantine/QuarantineService.d.ts +3 -24
- package/dist/src/services/quarantine/QuarantineService.d.ts.map +1 -1
- package/dist/src/services/quarantine/QuarantineService.js +8 -205
- package/dist/src/services/quarantine/QuarantineService.js.map +1 -1
- package/dist/src/services/quarantine/QuarantineService.multiapproval.d.ts +57 -0
- package/dist/src/services/quarantine/QuarantineService.multiapproval.d.ts.map +1 -0
- package/dist/src/services/quarantine/QuarantineService.multiapproval.js +211 -0
- package/dist/src/services/quarantine/QuarantineService.multiapproval.js.map +1 -0
- package/dist/src/session/SessionManager.d.ts +2 -33
- package/dist/src/session/SessionManager.d.ts.map +1 -1
- package/dist/src/session/SessionManager.js +14 -238
- package/dist/src/session/SessionManager.js.map +1 -1
- package/dist/src/session/SessionManager.memory.d.ts +67 -0
- package/dist/src/session/SessionManager.memory.d.ts.map +1 -0
- package/dist/src/session/SessionManager.memory.js +262 -0
- package/dist/src/session/SessionManager.memory.js.map +1 -0
- package/dist/src/sources/SourceIndexer.d.ts +3 -1
- package/dist/src/sources/SourceIndexer.d.ts.map +1 -1
- package/dist/src/sources/SourceIndexer.js.map +1 -1
- package/dist/src/sync/SyncEngine.d.ts +13 -1
- package/dist/src/sync/SyncEngine.d.ts.map +1 -1
- package/dist/src/sync/SyncEngine.js +50 -1
- package/dist/src/sync/SyncEngine.js.map +1 -1
- package/dist/src/testing/MultiLLMProvider.d.ts +5 -6
- package/dist/src/testing/MultiLLMProvider.d.ts.map +1 -1
- package/dist/src/testing/MultiLLMProvider.js +18 -130
- package/dist/src/testing/MultiLLMProvider.js.map +1 -1
- package/dist/src/testing/MultiLLMProvider.metrics.d.ts +33 -0
- package/dist/src/testing/MultiLLMProvider.metrics.d.ts.map +1 -0
- package/dist/src/testing/MultiLLMProvider.metrics.js +87 -0
- package/dist/src/testing/MultiLLMProvider.metrics.js.map +1 -0
- package/dist/src/testing/MultiLLMProvider.selection.d.ts +77 -0
- package/dist/src/testing/MultiLLMProvider.selection.d.ts.map +1 -0
- package/dist/src/testing/MultiLLMProvider.selection.js +151 -0
- package/dist/src/testing/MultiLLMProvider.selection.js.map +1 -0
- package/dist/src/types/dependencies.d.ts +85 -0
- package/dist/src/types/dependencies.d.ts.map +1 -0
- package/dist/src/types/dependencies.js +11 -0
- package/dist/src/types/dependencies.js.map +1 -0
- package/dist/src/types/skill.d.ts +13 -0
- package/dist/src/types/skill.d.ts.map +1 -1
- package/dist/src/types/skill.js.map +1 -1
- package/dist/src/types.d.ts +32 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/versioning/change-classifier.d.ts +38 -0
- package/dist/src/versioning/change-classifier.d.ts.map +1 -0
- package/dist/src/versioning/change-classifier.js +187 -0
- package/dist/src/versioning/change-classifier.js.map +1 -0
- package/dist/src/versioning/change-classifier.test.d.ts +6 -0
- package/dist/src/versioning/change-classifier.test.d.ts.map +1 -0
- package/dist/src/versioning/change-classifier.test.js +275 -0
- package/dist/src/versioning/change-classifier.test.js.map +1 -0
- package/dist/src/versioning/update-risk.d.ts +50 -0
- package/dist/src/versioning/update-risk.d.ts.map +1 -0
- package/dist/src/versioning/update-risk.js +80 -0
- package/dist/src/versioning/update-risk.js.map +1 -0
- package/dist/src/versioning/update-risk.test.d.ts +6 -0
- package/dist/src/versioning/update-risk.test.d.ts.map +1 -0
- package/dist/src/versioning/update-risk.test.js +200 -0
- package/dist/src/versioning/update-risk.test.js.map +1 -0
- package/dist/tests/AuditLogger.edge-cases.test.d.ts +10 -0
- package/dist/tests/AuditLogger.edge-cases.test.d.ts.map +1 -0
- package/dist/tests/AuditLogger.edge-cases.test.js +183 -0
- package/dist/tests/AuditLogger.edge-cases.test.js.map +1 -0
- package/dist/tests/CacheManager.test.d.ts +9 -0
- package/dist/tests/CacheManager.test.d.ts.map +1 -0
- package/dist/tests/CacheManager.test.js +163 -0
- package/dist/tests/CacheManager.test.js.map +1 -0
- package/dist/tests/DailyIndexPipeline.test.js +3 -3
- package/dist/tests/DailyIndexPipeline.test.js.map +1 -1
- package/dist/tests/GitHubIndexer.edge-cases.test.d.ts +10 -0
- package/dist/tests/GitHubIndexer.edge-cases.test.d.ts.map +1 -0
- package/dist/tests/GitHubIndexer.edge-cases.test.js +255 -0
- package/dist/tests/GitHubIndexer.edge-cases.test.js.map +1 -0
- package/dist/tests/GitHubIndexer.test.js +4 -2
- package/dist/tests/GitHubIndexer.test.js.map +1 -1
- package/dist/tests/SearchService.test.js +71 -0
- package/dist/tests/SearchService.test.js.map +1 -1
- package/dist/tests/SkillVersionRepository.test.d.ts +0 -11
- package/dist/tests/SkillVersionRepository.test.d.ts.map +1 -1
- package/dist/tests/SkillVersionRepository.test.js +131 -194
- package/dist/tests/SkillVersionRepository.test.js.map +1 -1
- package/dist/tests/api/client.health.test.d.ts +15 -0
- package/dist/tests/api/client.health.test.d.ts.map +1 -0
- package/dist/tests/api/client.health.test.js +111 -0
- package/dist/tests/api/client.health.test.js.map +1 -0
- package/dist/tests/db/betterSqlite3Driver.test.d.ts +8 -0
- package/dist/tests/db/betterSqlite3Driver.test.d.ts.map +1 -0
- package/dist/tests/db/betterSqlite3Driver.test.js +88 -0
- package/dist/tests/db/betterSqlite3Driver.test.js.map +1 -0
- package/dist/tests/db/database-abstraction.test.js +12 -0
- package/dist/tests/db/database-abstraction.test.js.map +1 -1
- package/dist/tests/db/schema-migrations.test.d.ts +10 -0
- package/dist/tests/db/schema-migrations.test.d.ts.map +1 -0
- package/dist/tests/db/schema-migrations.test.js +134 -0
- package/dist/tests/db/schema-migrations.test.js.map +1 -0
- package/dist/tests/db/sqljsDriver.test.d.ts +9 -0
- package/dist/tests/db/sqljsDriver.test.d.ts.map +1 -0
- package/dist/tests/db/sqljsDriver.test.js +75 -0
- package/dist/tests/db/sqljsDriver.test.js.map +1 -0
- package/dist/tests/edge-cases/EdgeCases.test.js +4 -1
- package/dist/tests/edge-cases/EdgeCases.test.js.map +1 -1
- package/dist/tests/helpers/database.d.ts +32 -0
- package/dist/tests/helpers/database.d.ts.map +1 -0
- package/dist/tests/helpers/database.js +54 -0
- package/dist/tests/helpers/database.js.map +1 -0
- package/dist/tests/learning/PatternStore.helpers.test.d.ts +17 -0
- package/dist/tests/learning/PatternStore.helpers.test.d.ts.map +1 -0
- package/dist/tests/learning/PatternStore.helpers.test.js +301 -0
- package/dist/tests/learning/PatternStore.helpers.test.js.map +1 -0
- package/dist/tests/repositories/CoInstallRepository.test.d.ts +9 -0
- package/dist/tests/repositories/CoInstallRepository.test.d.ts.map +1 -0
- package/dist/tests/repositories/CoInstallRepository.test.js +126 -0
- package/dist/tests/repositories/CoInstallRepository.test.js.map +1 -0
- package/dist/tests/repositories/SkillDependencyRepository.test.d.ts +10 -0
- package/dist/tests/repositories/SkillDependencyRepository.test.d.ts.map +1 -0
- package/dist/tests/repositories/SkillDependencyRepository.test.js +336 -0
- package/dist/tests/repositories/SkillDependencyRepository.test.js.map +1 -0
- package/dist/tests/routing/LanguageRouter.test.d.ts +9 -0
- package/dist/tests/routing/LanguageRouter.test.d.ts.map +1 -0
- package/dist/tests/routing/LanguageRouter.test.js +150 -0
- package/dist/tests/routing/LanguageRouter.test.js.map +1 -0
- package/dist/tests/session/SessionManager.memory.test.d.ts +11 -0
- package/dist/tests/session/SessionManager.memory.test.d.ts.map +1 -0
- package/dist/tests/session/SessionManager.memory.test.js +219 -0
- package/dist/tests/session/SessionManager.memory.test.js.map +1 -0
- package/dist/tests/sources.test.js +1 -1
- package/dist/tests/sources.test.js.map +1 -1
- package/dist/tests/sync/SyncEngine.test.js +32 -18
- package/dist/tests/sync/SyncEngine.test.js.map +1 -1
- package/dist/tests/testing/MultiLLMProvider.metrics.test.d.ts +13 -0
- package/dist/tests/testing/MultiLLMProvider.metrics.test.d.ts.map +1 -0
- package/dist/tests/testing/MultiLLMProvider.metrics.test.js +149 -0
- package/dist/tests/testing/MultiLLMProvider.metrics.test.js.map +1 -0
- package/dist/tests/testing/MultiLLMProvider.selection.test.d.ts +15 -0
- package/dist/tests/testing/MultiLLMProvider.selection.test.d.ts.map +1 -0
- package/dist/tests/testing/MultiLLMProvider.selection.test.js +249 -0
- package/dist/tests/testing/MultiLLMProvider.selection.test.js.map +1 -0
- package/dist/tests/unit/migrations/v10-dependencies.test.d.ts +6 -0
- package/dist/tests/unit/migrations/v10-dependencies.test.d.ts.map +1 -0
- package/dist/tests/unit/migrations/v10-dependencies.test.js +166 -0
- package/dist/tests/unit/migrations/v10-dependencies.test.js.map +1 -0
- package/dist/tests/unit/quarantine-query-builder.test.d.ts +10 -0
- package/dist/tests/unit/quarantine-query-builder.test.d.ts.map +1 -0
- package/dist/tests/unit/quarantine-query-builder.test.js +157 -0
- package/dist/tests/unit/quarantine-query-builder.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Tests for SkillDependencyRepository (SMI-3143)
|
|
3
|
+
* @module @skillsmith/core/tests/repositories/SkillDependencyRepository
|
|
4
|
+
*
|
|
5
|
+
* Tests CRUD operations, upsert idempotency, source filtering,
|
|
6
|
+
* reverse lookup, and graceful missing-table handling.
|
|
7
|
+
* Uses createTestDatabase() which runs all migrations including v10.
|
|
8
|
+
*/
|
|
9
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
10
|
+
import { createTestDatabase, closeDatabase } from '../helpers/database.js';
|
|
11
|
+
import { SkillDependencyRepository } from '../../src/repositories/SkillDependencyRepository.js';
|
|
12
|
+
import { createDatabase } from '../../src/db/schema.js';
|
|
13
|
+
// ============================================================================
|
|
14
|
+
// Full-migration tests
|
|
15
|
+
// ============================================================================
|
|
16
|
+
let db;
|
|
17
|
+
let repo;
|
|
18
|
+
beforeEach(() => {
|
|
19
|
+
db = createTestDatabase();
|
|
20
|
+
repo = new SkillDependencyRepository(db);
|
|
21
|
+
});
|
|
22
|
+
afterEach(() => {
|
|
23
|
+
closeDatabase(db);
|
|
24
|
+
});
|
|
25
|
+
describe('SkillDependencyRepository', () => {
|
|
26
|
+
describe('getDependencies — empty table', () => {
|
|
27
|
+
it('returns empty array when no dependencies recorded', () => {
|
|
28
|
+
const results = repo.getDependencies('nonexistent-skill');
|
|
29
|
+
expect(results).toEqual([]);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
describe('setDependencies — insert and upsert', () => {
|
|
33
|
+
it('inserts dependency rows', () => {
|
|
34
|
+
const deps = [
|
|
35
|
+
{
|
|
36
|
+
skill_id: 'author/skill-a',
|
|
37
|
+
dep_type: 'mcp_server',
|
|
38
|
+
dep_target: 'github',
|
|
39
|
+
dep_version: null,
|
|
40
|
+
dep_source: 'declared',
|
|
41
|
+
confidence: null,
|
|
42
|
+
metadata: null,
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
skill_id: 'author/skill-a',
|
|
46
|
+
dep_type: 'skill_hard',
|
|
47
|
+
dep_target: 'author/util',
|
|
48
|
+
dep_version: '>=1.0.0',
|
|
49
|
+
dep_source: 'declared',
|
|
50
|
+
confidence: null,
|
|
51
|
+
metadata: '{"reason":"needed for parsing"}',
|
|
52
|
+
},
|
|
53
|
+
];
|
|
54
|
+
repo.setDependencies('author/skill-a', deps, 'declared');
|
|
55
|
+
const results = repo.getDependencies('author/skill-a');
|
|
56
|
+
expect(results).toHaveLength(2);
|
|
57
|
+
expect(results.map((r) => r.dep_type)).toContain('mcp_server');
|
|
58
|
+
expect(results.map((r) => r.dep_type)).toContain('skill_hard');
|
|
59
|
+
});
|
|
60
|
+
it('upserts on repeated calls (idempotent)', () => {
|
|
61
|
+
const dep = {
|
|
62
|
+
skill_id: 'author/skill-a',
|
|
63
|
+
dep_type: 'mcp_server',
|
|
64
|
+
dep_target: 'github',
|
|
65
|
+
dep_version: null,
|
|
66
|
+
dep_source: 'declared',
|
|
67
|
+
confidence: null,
|
|
68
|
+
metadata: null,
|
|
69
|
+
};
|
|
70
|
+
repo.setDependencies('author/skill-a', [dep], 'declared');
|
|
71
|
+
repo.setDependencies('author/skill-a', [dep], 'declared');
|
|
72
|
+
const results = repo.getDependencies('author/skill-a');
|
|
73
|
+
expect(results).toHaveLength(1);
|
|
74
|
+
});
|
|
75
|
+
it('updates version and metadata on upsert', () => {
|
|
76
|
+
const dep1 = {
|
|
77
|
+
skill_id: 'author/skill-a',
|
|
78
|
+
dep_type: 'skill_hard',
|
|
79
|
+
dep_target: 'author/util',
|
|
80
|
+
dep_version: '>=1.0.0',
|
|
81
|
+
dep_source: 'declared',
|
|
82
|
+
confidence: null,
|
|
83
|
+
metadata: null,
|
|
84
|
+
};
|
|
85
|
+
repo.setDependencies('author/skill-a', [dep1], 'declared');
|
|
86
|
+
const dep2 = {
|
|
87
|
+
...dep1,
|
|
88
|
+
dep_version: '>=2.0.0',
|
|
89
|
+
metadata: '{"updated":true}',
|
|
90
|
+
};
|
|
91
|
+
repo.setDependencies('author/skill-a', [dep2], 'declared');
|
|
92
|
+
const results = repo.getDependencies('author/skill-a');
|
|
93
|
+
expect(results).toHaveLength(1);
|
|
94
|
+
expect(results[0].dep_version).toBe('>=2.0.0');
|
|
95
|
+
expect(results[0].metadata).toBe('{"updated":true}');
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
describe('getDependenciesBySource', () => {
|
|
99
|
+
it('filters by source', () => {
|
|
100
|
+
const declared = {
|
|
101
|
+
skill_id: 'author/skill-a',
|
|
102
|
+
dep_type: 'mcp_server',
|
|
103
|
+
dep_target: 'github',
|
|
104
|
+
dep_version: null,
|
|
105
|
+
dep_source: 'declared',
|
|
106
|
+
confidence: null,
|
|
107
|
+
metadata: null,
|
|
108
|
+
};
|
|
109
|
+
const inferred = {
|
|
110
|
+
skill_id: 'author/skill-a',
|
|
111
|
+
dep_type: 'mcp_server',
|
|
112
|
+
dep_target: 'linear',
|
|
113
|
+
dep_version: null,
|
|
114
|
+
dep_source: 'inferred_static',
|
|
115
|
+
confidence: 0.85,
|
|
116
|
+
metadata: null,
|
|
117
|
+
};
|
|
118
|
+
repo.setDependencies('author/skill-a', [declared], 'declared');
|
|
119
|
+
repo.setDependencies('author/skill-a', [inferred], 'inferred_static');
|
|
120
|
+
const declaredResults = repo.getDependenciesBySource('author/skill-a', 'declared');
|
|
121
|
+
expect(declaredResults).toHaveLength(1);
|
|
122
|
+
expect(declaredResults[0].dep_target).toBe('github');
|
|
123
|
+
const inferredResults = repo.getDependenciesBySource('author/skill-a', 'inferred_static');
|
|
124
|
+
expect(inferredResults).toHaveLength(1);
|
|
125
|
+
expect(inferredResults[0].dep_target).toBe('linear');
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
describe('getDependents — reverse lookup', () => {
|
|
129
|
+
it('finds skills that depend on a target', () => {
|
|
130
|
+
const depA = {
|
|
131
|
+
skill_id: 'author/skill-a',
|
|
132
|
+
dep_type: 'mcp_server',
|
|
133
|
+
dep_target: 'github',
|
|
134
|
+
dep_version: null,
|
|
135
|
+
dep_source: 'declared',
|
|
136
|
+
confidence: null,
|
|
137
|
+
metadata: null,
|
|
138
|
+
};
|
|
139
|
+
const depB = {
|
|
140
|
+
skill_id: 'author/skill-b',
|
|
141
|
+
dep_type: 'mcp_server',
|
|
142
|
+
dep_target: 'github',
|
|
143
|
+
dep_version: null,
|
|
144
|
+
dep_source: 'inferred_static',
|
|
145
|
+
confidence: 0.9,
|
|
146
|
+
metadata: null,
|
|
147
|
+
};
|
|
148
|
+
repo.setDependencies('author/skill-a', [depA], 'declared');
|
|
149
|
+
repo.setDependencies('author/skill-b', [depB], 'inferred_static');
|
|
150
|
+
const dependents = repo.getDependents('github');
|
|
151
|
+
expect(dependents).toHaveLength(2);
|
|
152
|
+
expect(dependents.map((r) => r.skill_id).sort()).toEqual(['author/skill-a', 'author/skill-b']);
|
|
153
|
+
});
|
|
154
|
+
it('filters by depType when provided', () => {
|
|
155
|
+
const mcpDep = {
|
|
156
|
+
skill_id: 'author/skill-a',
|
|
157
|
+
dep_type: 'mcp_server',
|
|
158
|
+
dep_target: 'github',
|
|
159
|
+
dep_version: null,
|
|
160
|
+
dep_source: 'declared',
|
|
161
|
+
confidence: null,
|
|
162
|
+
metadata: null,
|
|
163
|
+
};
|
|
164
|
+
const envDep = {
|
|
165
|
+
skill_id: 'author/skill-b',
|
|
166
|
+
dep_type: 'env_tool',
|
|
167
|
+
dep_target: 'github',
|
|
168
|
+
dep_version: null,
|
|
169
|
+
dep_source: 'declared',
|
|
170
|
+
confidence: null,
|
|
171
|
+
metadata: null,
|
|
172
|
+
};
|
|
173
|
+
repo.setDependencies('author/skill-a', [mcpDep], 'declared');
|
|
174
|
+
repo.setDependencies('author/skill-b', [envDep], 'declared');
|
|
175
|
+
const mcpDependents = repo.getDependents('github', 'mcp_server');
|
|
176
|
+
expect(mcpDependents).toHaveLength(1);
|
|
177
|
+
expect(mcpDependents[0].skill_id).toBe('author/skill-a');
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
describe('clearInferred', () => {
|
|
181
|
+
it('deletes inferred deps but preserves declared', () => {
|
|
182
|
+
const declared = {
|
|
183
|
+
skill_id: 'author/skill-a',
|
|
184
|
+
dep_type: 'mcp_server',
|
|
185
|
+
dep_target: 'github',
|
|
186
|
+
dep_version: null,
|
|
187
|
+
dep_source: 'declared',
|
|
188
|
+
confidence: null,
|
|
189
|
+
metadata: null,
|
|
190
|
+
};
|
|
191
|
+
const inferred = {
|
|
192
|
+
skill_id: 'author/skill-a',
|
|
193
|
+
dep_type: 'mcp_server',
|
|
194
|
+
dep_target: 'linear',
|
|
195
|
+
dep_version: null,
|
|
196
|
+
dep_source: 'inferred_static',
|
|
197
|
+
confidence: 0.85,
|
|
198
|
+
metadata: null,
|
|
199
|
+
};
|
|
200
|
+
repo.setDependencies('author/skill-a', [declared], 'declared');
|
|
201
|
+
repo.setDependencies('author/skill-a', [inferred], 'inferred_static');
|
|
202
|
+
repo.clearInferred('author/skill-a');
|
|
203
|
+
const results = repo.getDependencies('author/skill-a');
|
|
204
|
+
expect(results).toHaveLength(1);
|
|
205
|
+
expect(results[0].dep_source).toBe('declared');
|
|
206
|
+
expect(results[0].dep_target).toBe('github');
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
describe('clearAll', () => {
|
|
210
|
+
it('deletes all deps for a skill', () => {
|
|
211
|
+
const dep = {
|
|
212
|
+
skill_id: 'author/skill-a',
|
|
213
|
+
dep_type: 'mcp_server',
|
|
214
|
+
dep_target: 'github',
|
|
215
|
+
dep_version: null,
|
|
216
|
+
dep_source: 'declared',
|
|
217
|
+
confidence: null,
|
|
218
|
+
metadata: null,
|
|
219
|
+
};
|
|
220
|
+
repo.setDependencies('author/skill-a', [dep], 'declared');
|
|
221
|
+
expect(repo.getDependencies('author/skill-a')).toHaveLength(1);
|
|
222
|
+
repo.clearAll('author/skill-a');
|
|
223
|
+
expect(repo.getDependencies('author/skill-a')).toEqual([]);
|
|
224
|
+
});
|
|
225
|
+
it('does not affect other skills', () => {
|
|
226
|
+
const depA = {
|
|
227
|
+
skill_id: 'author/skill-a',
|
|
228
|
+
dep_type: 'mcp_server',
|
|
229
|
+
dep_target: 'github',
|
|
230
|
+
dep_version: null,
|
|
231
|
+
dep_source: 'declared',
|
|
232
|
+
confidence: null,
|
|
233
|
+
metadata: null,
|
|
234
|
+
};
|
|
235
|
+
const depB = {
|
|
236
|
+
skill_id: 'author/skill-b',
|
|
237
|
+
dep_type: 'mcp_server',
|
|
238
|
+
dep_target: 'linear',
|
|
239
|
+
dep_version: null,
|
|
240
|
+
dep_source: 'declared',
|
|
241
|
+
confidence: null,
|
|
242
|
+
metadata: null,
|
|
243
|
+
};
|
|
244
|
+
repo.setDependencies('author/skill-a', [depA], 'declared');
|
|
245
|
+
repo.setDependencies('author/skill-b', [depB], 'declared');
|
|
246
|
+
repo.clearAll('author/skill-a');
|
|
247
|
+
expect(repo.getDependencies('author/skill-a')).toEqual([]);
|
|
248
|
+
expect(repo.getDependencies('author/skill-b')).toHaveLength(1);
|
|
249
|
+
});
|
|
250
|
+
});
|
|
251
|
+
describe('getDependencies — ordering', () => {
|
|
252
|
+
it('returns results ordered by dep_type', () => {
|
|
253
|
+
const deps = [
|
|
254
|
+
{
|
|
255
|
+
skill_id: 'author/skill-a',
|
|
256
|
+
dep_type: 'skill_hard',
|
|
257
|
+
dep_target: 'author/util',
|
|
258
|
+
dep_version: null,
|
|
259
|
+
dep_source: 'declared',
|
|
260
|
+
confidence: null,
|
|
261
|
+
metadata: null,
|
|
262
|
+
},
|
|
263
|
+
{
|
|
264
|
+
skill_id: 'author/skill-a',
|
|
265
|
+
dep_type: 'env_tool',
|
|
266
|
+
dep_target: 'docker',
|
|
267
|
+
dep_version: null,
|
|
268
|
+
dep_source: 'declared',
|
|
269
|
+
confidence: null,
|
|
270
|
+
metadata: null,
|
|
271
|
+
},
|
|
272
|
+
{
|
|
273
|
+
skill_id: 'author/skill-a',
|
|
274
|
+
dep_type: 'mcp_server',
|
|
275
|
+
dep_target: 'github',
|
|
276
|
+
dep_version: null,
|
|
277
|
+
dep_source: 'declared',
|
|
278
|
+
confidence: null,
|
|
279
|
+
metadata: null,
|
|
280
|
+
},
|
|
281
|
+
];
|
|
282
|
+
repo.setDependencies('author/skill-a', deps, 'declared');
|
|
283
|
+
const results = repo.getDependencies('author/skill-a');
|
|
284
|
+
const types = results.map((r) => r.dep_type);
|
|
285
|
+
// Alphabetical: env_tool, mcp_server, skill_hard
|
|
286
|
+
expect(types).toEqual(['env_tool', 'mcp_server', 'skill_hard']);
|
|
287
|
+
});
|
|
288
|
+
});
|
|
289
|
+
});
|
|
290
|
+
// ============================================================================
|
|
291
|
+
// Graceful missing-table tests (no migrations)
|
|
292
|
+
// ============================================================================
|
|
293
|
+
describe('SkillDependencyRepository — missing table', () => {
|
|
294
|
+
let bareDb;
|
|
295
|
+
beforeEach(() => {
|
|
296
|
+
// createDatabase() without migrations — no skill_dependencies table
|
|
297
|
+
bareDb = createDatabase();
|
|
298
|
+
});
|
|
299
|
+
afterEach(() => {
|
|
300
|
+
closeDatabase(bareDb);
|
|
301
|
+
});
|
|
302
|
+
it('getDependencies returns empty array', () => {
|
|
303
|
+
const bareRepo = new SkillDependencyRepository(bareDb);
|
|
304
|
+
expect(bareRepo.getDependencies('any-skill')).toEqual([]);
|
|
305
|
+
});
|
|
306
|
+
it('getDependenciesBySource returns empty array', () => {
|
|
307
|
+
const bareRepo = new SkillDependencyRepository(bareDb);
|
|
308
|
+
expect(bareRepo.getDependenciesBySource('any-skill', 'declared')).toEqual([]);
|
|
309
|
+
});
|
|
310
|
+
it('getDependents returns empty array', () => {
|
|
311
|
+
const bareRepo = new SkillDependencyRepository(bareDb);
|
|
312
|
+
expect(bareRepo.getDependents('any-target')).toEqual([]);
|
|
313
|
+
});
|
|
314
|
+
it('setDependencies does not throw', () => {
|
|
315
|
+
const bareRepo = new SkillDependencyRepository(bareDb);
|
|
316
|
+
const dep = {
|
|
317
|
+
skill_id: 'x',
|
|
318
|
+
dep_type: 'mcp_server',
|
|
319
|
+
dep_target: 'y',
|
|
320
|
+
dep_version: null,
|
|
321
|
+
dep_source: 'declared',
|
|
322
|
+
confidence: null,
|
|
323
|
+
metadata: null,
|
|
324
|
+
};
|
|
325
|
+
expect(() => bareRepo.setDependencies('x', [dep], 'declared')).not.toThrow();
|
|
326
|
+
});
|
|
327
|
+
it('clearInferred does not throw', () => {
|
|
328
|
+
const bareRepo = new SkillDependencyRepository(bareDb);
|
|
329
|
+
expect(() => bareRepo.clearInferred('any-skill')).not.toThrow();
|
|
330
|
+
});
|
|
331
|
+
it('clearAll does not throw', () => {
|
|
332
|
+
const bareRepo = new SkillDependencyRepository(bareDb);
|
|
333
|
+
expect(() => bareRepo.clearAll('any-skill')).not.toThrow();
|
|
334
|
+
});
|
|
335
|
+
});
|
|
336
|
+
//# sourceMappingURL=SkillDependencyRepository.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SkillDependencyRepository.test.js","sourceRoot":"","sources":["../../../tests/repositories/SkillDependencyRepository.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AACpE,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAE1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,qDAAqD,CAAA;AAE/F,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAEvD,+EAA+E;AAC/E,uBAAuB;AACvB,+EAA+E;AAE/E,IAAI,EAAY,CAAA;AAChB,IAAI,IAA+B,CAAA;AAEnC,UAAU,CAAC,GAAG,EAAE;IACd,EAAE,GAAG,kBAAkB,EAAE,CAAA;IACzB,IAAI,GAAG,IAAI,yBAAyB,CAAC,EAAE,CAAC,CAAA;AAC1C,CAAC,CAAC,CAAA;AAEF,SAAS,CAAC,GAAG,EAAE;IACb,aAAa,CAAC,EAAE,CAAC,CAAA;AACnB,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;QAC7C,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAA;YACzD,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAC7B,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;QACnD,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;YACjC,MAAM,IAAI,GAAyB;gBACjC;oBACE,QAAQ,EAAE,gBAAgB;oBAC1B,QAAQ,EAAE,YAAY;oBACtB,UAAU,EAAE,QAAQ;oBACpB,WAAW,EAAE,IAAI;oBACjB,UAAU,EAAE,UAAU;oBACtB,UAAU,EAAE,IAAI;oBAChB,QAAQ,EAAE,IAAI;iBACf;gBACD;oBACE,QAAQ,EAAE,gBAAgB;oBAC1B,QAAQ,EAAE,YAAY;oBACtB,UAAU,EAAE,aAAa;oBACzB,WAAW,EAAE,SAAS;oBACtB,UAAU,EAAE,UAAU;oBACtB,UAAU,EAAE,IAAI;oBAChB,QAAQ,EAAE,iCAAiC;iBAC5C;aACF,CAAA;YAED,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,IAAI,EAAE,UAAU,CAAC,CAAA;YAExD,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAA;YACtD,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAC/B,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;YAC9D,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;QAChE,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,GAAG,GAAuB;gBAC9B,QAAQ,EAAE,gBAAgB;gBAC1B,QAAQ,EAAE,YAAY;gBACtB,UAAU,EAAE,QAAQ;gBACpB,WAAW,EAAE,IAAI;gBACjB,UAAU,EAAE,UAAU;gBACtB,UAAU,EAAE,IAAI;gBAChB,QAAQ,EAAE,IAAI;aACf,CAAA;YAED,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,CAAA;YACzD,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,CAAA;YAEzD,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAA;YACtD,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QACjC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,IAAI,GAAuB;gBAC/B,QAAQ,EAAE,gBAAgB;gBAC1B,QAAQ,EAAE,YAAY;gBACtB,UAAU,EAAE,aAAa;gBACzB,WAAW,EAAE,SAAS;gBACtB,UAAU,EAAE,UAAU;gBACtB,UAAU,EAAE,IAAI;gBAChB,QAAQ,EAAE,IAAI;aACf,CAAA;YAED,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAA;YAE1D,MAAM,IAAI,GAAuB;gBAC/B,GAAG,IAAI;gBACP,WAAW,EAAE,SAAS;gBACtB,QAAQ,EAAE,kBAAkB;aAC7B,CAAA;YAED,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAA;YAE1D,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAA;YACtD,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAC/B,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YAC9C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;QACtD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACvC,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;YAC3B,MAAM,QAAQ,GAAuB;gBACnC,QAAQ,EAAE,gBAAgB;gBAC1B,QAAQ,EAAE,YAAY;gBACtB,UAAU,EAAE,QAAQ;gBACpB,WAAW,EAAE,IAAI;gBACjB,UAAU,EAAE,UAAU;gBACtB,UAAU,EAAE,IAAI;gBAChB,QAAQ,EAAE,IAAI;aACf,CAAA;YACD,MAAM,QAAQ,GAAuB;gBACnC,QAAQ,EAAE,gBAAgB;gBAC1B,QAAQ,EAAE,YAAY;gBACtB,UAAU,EAAE,QAAQ;gBACpB,WAAW,EAAE,IAAI;gBACjB,UAAU,EAAE,iBAAiB;gBAC7B,UAAU,EAAE,IAAI;gBAChB,QAAQ,EAAE,IAAI;aACf,CAAA;YAED,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC,CAAA;YAC9D,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAC,CAAA;YAErE,MAAM,eAAe,GAAG,IAAI,CAAC,uBAAuB,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAA;YAClF,MAAM,CAAC,eAAe,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YACvC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAEpD,MAAM,eAAe,GAAG,IAAI,CAAC,uBAAuB,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,CAAA;YACzF,MAAM,CAAC,eAAe,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YACvC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACtD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;QAC9C,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,IAAI,GAAuB;gBAC/B,QAAQ,EAAE,gBAAgB;gBAC1B,QAAQ,EAAE,YAAY;gBACtB,UAAU,EAAE,QAAQ;gBACpB,WAAW,EAAE,IAAI;gBACjB,UAAU,EAAE,UAAU;gBACtB,UAAU,EAAE,IAAI;gBAChB,QAAQ,EAAE,IAAI;aACf,CAAA;YACD,MAAM,IAAI,GAAuB;gBAC/B,QAAQ,EAAE,gBAAgB;gBAC1B,QAAQ,EAAE,YAAY;gBACtB,UAAU,EAAE,QAAQ;gBACpB,WAAW,EAAE,IAAI;gBACjB,UAAU,EAAE,iBAAiB;gBAC7B,UAAU,EAAE,GAAG;gBACf,QAAQ,EAAE,IAAI;aACf,CAAA;YAED,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAA;YAC1D,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAAC,EAAE,iBAAiB,CAAC,CAAA;YAEjE,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;YAC/C,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAClC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,CAAA;QAChG,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,MAAM,GAAuB;gBACjC,QAAQ,EAAE,gBAAgB;gBAC1B,QAAQ,EAAE,YAAY;gBACtB,UAAU,EAAE,QAAQ;gBACpB,WAAW,EAAE,IAAI;gBACjB,UAAU,EAAE,UAAU;gBACtB,UAAU,EAAE,IAAI;gBAChB,QAAQ,EAAE,IAAI;aACf,CAAA;YACD,MAAM,MAAM,GAAuB;gBACjC,QAAQ,EAAE,gBAAgB;gBAC1B,QAAQ,EAAE,UAAU;gBACpB,UAAU,EAAE,QAAQ;gBACpB,WAAW,EAAE,IAAI;gBACjB,UAAU,EAAE,UAAU;gBACtB,UAAU,EAAE,IAAI;gBAChB,QAAQ,EAAE,IAAI;aACf,CAAA;YAED,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,CAAA;YAC5D,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,CAAA;YAE5D,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;YAChE,MAAM,CAAC,aAAa,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YACrC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;QAC1D,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,QAAQ,GAAuB;gBACnC,QAAQ,EAAE,gBAAgB;gBAC1B,QAAQ,EAAE,YAAY;gBACtB,UAAU,EAAE,QAAQ;gBACpB,WAAW,EAAE,IAAI;gBACjB,UAAU,EAAE,UAAU;gBACtB,UAAU,EAAE,IAAI;gBAChB,QAAQ,EAAE,IAAI;aACf,CAAA;YACD,MAAM,QAAQ,GAAuB;gBACnC,QAAQ,EAAE,gBAAgB;gBAC1B,QAAQ,EAAE,YAAY;gBACtB,UAAU,EAAE,QAAQ;gBACpB,WAAW,EAAE,IAAI;gBACjB,UAAU,EAAE,iBAAiB;gBAC7B,UAAU,EAAE,IAAI;gBAChB,QAAQ,EAAE,IAAI;aACf,CAAA;YAED,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC,CAAA;YAC9D,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAC,CAAA;YAErE,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAA;YAEpC,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAA;YACtD,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAC/B,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YAC9C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC9C,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;QACxB,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,GAAG,GAAuB;gBAC9B,QAAQ,EAAE,gBAAgB;gBAC1B,QAAQ,EAAE,YAAY;gBACtB,UAAU,EAAE,QAAQ;gBACpB,WAAW,EAAE,IAAI;gBACjB,UAAU,EAAE,UAAU;gBACtB,UAAU,EAAE,IAAI;gBAChB,QAAQ,EAAE,IAAI;aACf,CAAA;YAED,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,CAAA;YACzD,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAE9D,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAA;YAC/B,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAC5D,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,IAAI,GAAuB;gBAC/B,QAAQ,EAAE,gBAAgB;gBAC1B,QAAQ,EAAE,YAAY;gBACtB,UAAU,EAAE,QAAQ;gBACpB,WAAW,EAAE,IAAI;gBACjB,UAAU,EAAE,UAAU;gBACtB,UAAU,EAAE,IAAI;gBAChB,QAAQ,EAAE,IAAI;aACf,CAAA;YACD,MAAM,IAAI,GAAuB;gBAC/B,QAAQ,EAAE,gBAAgB;gBAC1B,QAAQ,EAAE,YAAY;gBACtB,UAAU,EAAE,QAAQ;gBACpB,WAAW,EAAE,IAAI;gBACjB,UAAU,EAAE,UAAU;gBACtB,UAAU,EAAE,IAAI;gBAChB,QAAQ,EAAE,IAAI;aACf,CAAA;YAED,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAA;YAC1D,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAA;YAE1D,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAA;YAE/B,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;YAC1D,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAChE,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAC1C,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,IAAI,GAAyB;gBACjC;oBACE,QAAQ,EAAE,gBAAgB;oBAC1B,QAAQ,EAAE,YAAY;oBACtB,UAAU,EAAE,aAAa;oBACzB,WAAW,EAAE,IAAI;oBACjB,UAAU,EAAE,UAAU;oBACtB,UAAU,EAAE,IAAI;oBAChB,QAAQ,EAAE,IAAI;iBACf;gBACD;oBACE,QAAQ,EAAE,gBAAgB;oBAC1B,QAAQ,EAAE,UAAU;oBACpB,UAAU,EAAE,QAAQ;oBACpB,WAAW,EAAE,IAAI;oBACjB,UAAU,EAAE,UAAU;oBACtB,UAAU,EAAE,IAAI;oBAChB,QAAQ,EAAE,IAAI;iBACf;gBACD;oBACE,QAAQ,EAAE,gBAAgB;oBAC1B,QAAQ,EAAE,YAAY;oBACtB,UAAU,EAAE,QAAQ;oBACpB,WAAW,EAAE,IAAI;oBACjB,UAAU,EAAE,UAAU;oBACtB,UAAU,EAAE,IAAI;oBAChB,QAAQ,EAAE,IAAI;iBACf;aACF,CAAA;YAED,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,IAAI,EAAE,UAAU,CAAC,CAAA;YAExD,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAA;YACtD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;YAC5C,iDAAiD;YACjD,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC,CAAA;QACjE,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,+EAA+E;AAC/E,+CAA+C;AAC/C,+EAA+E;AAE/E,QAAQ,CAAC,2CAA2C,EAAE,GAAG,EAAE;IACzD,IAAI,MAAgB,CAAA;IAEpB,UAAU,CAAC,GAAG,EAAE;QACd,oEAAoE;QACpE,MAAM,GAAG,cAAc,EAAE,CAAA;IAC3B,CAAC,CAAC,CAAA;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,aAAa,CAAC,MAAM,CAAC,CAAA;IACvB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,QAAQ,GAAG,IAAI,yBAAyB,CAAC,MAAM,CAAC,CAAA;QACtD,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAC3D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,QAAQ,GAAG,IAAI,yBAAyB,CAAC,MAAM,CAAC,CAAA;QACtD,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAC/E,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,QAAQ,GAAG,IAAI,yBAAyB,CAAC,MAAM,CAAC,CAAA;QACtD,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAC1D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,QAAQ,GAAG,IAAI,yBAAyB,CAAC,MAAM,CAAC,CAAA;QACtD,MAAM,GAAG,GAAuB;YAC9B,QAAQ,EAAE,GAAG;YACb,QAAQ,EAAE,YAAY;YACtB,UAAU,EAAE,GAAG;YACf,WAAW,EAAE,IAAI;YACjB,UAAU,EAAE,UAAU;YACtB,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE,IAAI;SACf,CAAA;QACD,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAA;IAC9E,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,QAAQ,GAAG,IAAI,yBAAyB,CAAC,MAAM,CAAC,CAAA;QACtD,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAA;IACjE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,QAAQ,GAAG,IAAI,yBAAyB,CAAC,MAAM,CAAC,CAAA;QACtD,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAA;IAC5D,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-2756: Wave 3 — LanguageRouter tests
|
|
3
|
+
*
|
|
4
|
+
* Tests the LanguageRouter dispatch layer: adapter registration,
|
|
5
|
+
* extension-based lookup, tryGetAdapter, canHandle, getLanguage,
|
|
6
|
+
* getSupportedLanguages, framework rules aggregation, and dispose.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=LanguageRouter.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LanguageRouter.test.d.ts","sourceRoot":"","sources":["../../../tests/routing/LanguageRouter.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-2756: Wave 3 — LanguageRouter tests
|
|
3
|
+
*
|
|
4
|
+
* Tests the LanguageRouter dispatch layer: adapter registration,
|
|
5
|
+
* extension-based lookup, tryGetAdapter, canHandle, getLanguage,
|
|
6
|
+
* getSupportedLanguages, framework rules aggregation, and dispose.
|
|
7
|
+
*/
|
|
8
|
+
import { describe, it, expect } from 'vitest';
|
|
9
|
+
import { LanguageRouter } from '../../src/analysis/router.js';
|
|
10
|
+
describe('LanguageRouter', () => {
|
|
11
|
+
// -------------------------------------------------------------------------
|
|
12
|
+
// createWithAllAdapters factory
|
|
13
|
+
// -------------------------------------------------------------------------
|
|
14
|
+
describe('createWithAllAdapters', () => {
|
|
15
|
+
it('creates a router with multiple adapters pre-registered', () => {
|
|
16
|
+
const router = LanguageRouter.createWithAllAdapters();
|
|
17
|
+
expect(router.adapterCount).toBeGreaterThan(0);
|
|
18
|
+
});
|
|
19
|
+
it('creates a router with only specified languages', () => {
|
|
20
|
+
const router = LanguageRouter.createWithAllAdapters({ languages: ['typescript'] });
|
|
21
|
+
expect(router.getSupportedLanguages()).toContain('typescript');
|
|
22
|
+
// Should have fewer adapters than the full set
|
|
23
|
+
const fullRouter = LanguageRouter.createWithAllAdapters();
|
|
24
|
+
expect(router.adapterCount).toBeLessThanOrEqual(fullRouter.adapterCount);
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
// -------------------------------------------------------------------------
|
|
28
|
+
// registerAdapter / unregisterAdapter
|
|
29
|
+
// -------------------------------------------------------------------------
|
|
30
|
+
describe('registerAdapter / unregisterAdapter', () => {
|
|
31
|
+
it('registers an adapter and makes its extension routable', () => {
|
|
32
|
+
const router = LanguageRouter.createWithAllAdapters({ languages: ['typescript'] });
|
|
33
|
+
expect(router.canHandle('main.ts')).toBe(true);
|
|
34
|
+
});
|
|
35
|
+
it('unregisterAdapter removes extension mappings', () => {
|
|
36
|
+
const router = LanguageRouter.createWithAllAdapters({ languages: ['typescript'] });
|
|
37
|
+
expect(router.canHandle('main.ts')).toBe(true);
|
|
38
|
+
const removed = router.unregisterAdapter('typescript');
|
|
39
|
+
expect(removed).toBe(true);
|
|
40
|
+
expect(router.canHandle('main.ts')).toBe(false);
|
|
41
|
+
});
|
|
42
|
+
it('unregisterAdapter returns false for unknown language', () => {
|
|
43
|
+
const router = new LanguageRouter();
|
|
44
|
+
const result = router.unregisterAdapter('typescript');
|
|
45
|
+
expect(result).toBe(false);
|
|
46
|
+
});
|
|
47
|
+
it('re-registering an adapter replaces the old one', () => {
|
|
48
|
+
const router = LanguageRouter.createWithAllAdapters({ languages: ['typescript'] });
|
|
49
|
+
const before = router.adapterCount;
|
|
50
|
+
// Re-register the same language
|
|
51
|
+
const tsAdapter = router.getAdapterByLanguage('typescript');
|
|
52
|
+
router.registerAdapter(tsAdapter);
|
|
53
|
+
// Count should not grow
|
|
54
|
+
expect(router.adapterCount).toBe(before);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
// -------------------------------------------------------------------------
|
|
58
|
+
// getAdapter / tryGetAdapter / canHandle / getLanguage
|
|
59
|
+
// -------------------------------------------------------------------------
|
|
60
|
+
describe('getAdapter', () => {
|
|
61
|
+
it('returns adapter for a known extension', () => {
|
|
62
|
+
const router = LanguageRouter.createWithAllAdapters({ languages: ['typescript'] });
|
|
63
|
+
const adapter = router.tryGetAdapter('main.ts');
|
|
64
|
+
expect(adapter).not.toBeNull();
|
|
65
|
+
expect(adapter?.language).toBe('typescript');
|
|
66
|
+
});
|
|
67
|
+
it('throws for unknown extension', () => {
|
|
68
|
+
const router = new LanguageRouter();
|
|
69
|
+
expect(() => router.getAdapter('unknown.xyz')).toThrow(/No adapter registered/);
|
|
70
|
+
});
|
|
71
|
+
it('tryGetAdapter returns null for unknown extension', () => {
|
|
72
|
+
const router = new LanguageRouter();
|
|
73
|
+
expect(router.tryGetAdapter('unknown.xyz')).toBeNull();
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
describe('canHandle', () => {
|
|
77
|
+
it('returns true for registered extension', () => {
|
|
78
|
+
const router = LanguageRouter.createWithAllAdapters({ languages: ['python'] });
|
|
79
|
+
expect(router.canHandle('app.py')).toBe(true);
|
|
80
|
+
});
|
|
81
|
+
it('returns false for unregistered extension', () => {
|
|
82
|
+
const router = new LanguageRouter();
|
|
83
|
+
expect(router.canHandle('app.cobol')).toBe(false);
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
describe('getLanguage', () => {
|
|
87
|
+
it('returns language for a known file path', () => {
|
|
88
|
+
const router = LanguageRouter.createWithAllAdapters({ languages: ['python'] });
|
|
89
|
+
expect(router.getLanguage('script.py')).toBe('python');
|
|
90
|
+
});
|
|
91
|
+
it('returns null for unsupported extension', () => {
|
|
92
|
+
const router = new LanguageRouter();
|
|
93
|
+
expect(router.getLanguage('file.cobol')).toBeNull();
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
// -------------------------------------------------------------------------
|
|
97
|
+
// getSupportedLanguages / getSupportedExtensions
|
|
98
|
+
// -------------------------------------------------------------------------
|
|
99
|
+
describe('getSupportedLanguages / getSupportedExtensions', () => {
|
|
100
|
+
it('getSupportedLanguages returns registered language keys', () => {
|
|
101
|
+
const router = LanguageRouter.createWithAllAdapters({ languages: ['typescript', 'python'] });
|
|
102
|
+
const langs = router.getSupportedLanguages();
|
|
103
|
+
expect(langs).toContain('typescript');
|
|
104
|
+
expect(langs).toContain('python');
|
|
105
|
+
});
|
|
106
|
+
it('getSupportedExtensions includes dot-prefixed extensions', () => {
|
|
107
|
+
const router = LanguageRouter.createWithAllAdapters({ languages: ['typescript'] });
|
|
108
|
+
const exts = router.getSupportedExtensions();
|
|
109
|
+
expect(exts.some((e) => e.startsWith('.'))).toBe(true);
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
// -------------------------------------------------------------------------
|
|
113
|
+
// getAllFrameworkRules / getFrameworkRules
|
|
114
|
+
// -------------------------------------------------------------------------
|
|
115
|
+
describe('framework rules', () => {
|
|
116
|
+
it('getAllFrameworkRules returns an array', () => {
|
|
117
|
+
const router = LanguageRouter.createWithAllAdapters();
|
|
118
|
+
const rules = router.getAllFrameworkRules();
|
|
119
|
+
expect(Array.isArray(rules)).toBe(true);
|
|
120
|
+
});
|
|
121
|
+
it('getFrameworkRules returns empty array for unregistered language', () => {
|
|
122
|
+
const router = new LanguageRouter();
|
|
123
|
+
const rules = router.getFrameworkRules('typescript');
|
|
124
|
+
expect(rules).toEqual([]);
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
// -------------------------------------------------------------------------
|
|
128
|
+
// dispose
|
|
129
|
+
// -------------------------------------------------------------------------
|
|
130
|
+
describe('dispose', () => {
|
|
131
|
+
it('clears adapter registry after dispose', () => {
|
|
132
|
+
const router = LanguageRouter.createWithAllAdapters();
|
|
133
|
+
expect(router.adapterCount).toBeGreaterThan(0);
|
|
134
|
+
router.dispose();
|
|
135
|
+
expect(router.adapterCount).toBe(0);
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
// -------------------------------------------------------------------------
|
|
139
|
+
// detectLanguageFromContent (disabled)
|
|
140
|
+
// -------------------------------------------------------------------------
|
|
141
|
+
describe('detectLanguageFromContent', () => {
|
|
142
|
+
it('returns language:null and method:none when detection is disabled', () => {
|
|
143
|
+
const router = new LanguageRouter({ enableLanguageDetection: false });
|
|
144
|
+
const result = router.detectLanguageFromContent('#!/usr/bin/env python3\nprint("hello")');
|
|
145
|
+
expect(result.language).toBeNull();
|
|
146
|
+
expect(result.method).toBe('none');
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
//# sourceMappingURL=LanguageRouter.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LanguageRouter.test.js","sourceRoot":"","sources":["../../../tests/routing/LanguageRouter.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-2754: SessionManager Memory Operation Tests
|
|
3
|
+
*
|
|
4
|
+
* Tests for storeMemoryEntry, retrieveMemoryEntry, deleteMemoryEntry,
|
|
5
|
+
* runPreTaskHook, and runPostTaskHook.
|
|
6
|
+
*
|
|
7
|
+
* Since USE_V3_API is evaluated at module load time, we mock the helpers
|
|
8
|
+
* module to control getClaudeFlowMemory / getClaudeFlowMcp / USE_V3_API.
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=SessionManager.memory.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionManager.memory.test.d.ts","sourceRoot":"","sources":["../../../tests/session/SessionManager.memory.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|