@grafema/util 0.3.0-beta
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/LICENSE +190 -0
- package/dist/api/GraphAPI.d.ts +87 -0
- package/dist/api/GraphAPI.d.ts.map +1 -0
- package/dist/api/GraphAPI.js +212 -0
- package/dist/api/GraphAPI.js.map +1 -0
- package/dist/api/GuaranteeAPI.d.ts +147 -0
- package/dist/api/GuaranteeAPI.d.ts.map +1 -0
- package/dist/api/GuaranteeAPI.js +290 -0
- package/dist/api/GuaranteeAPI.js.map +1 -0
- package/dist/config/ConfigLoader.d.ts +214 -0
- package/dist/config/ConfigLoader.d.ts.map +1 -0
- package/dist/config/ConfigLoader.js +441 -0
- package/dist/config/ConfigLoader.js.map +1 -0
- package/dist/config/index.d.ts +6 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +5 -0
- package/dist/config/index.js.map +1 -0
- package/dist/core/CoverageAnalyzer.d.ts +65 -0
- package/dist/core/CoverageAnalyzer.d.ts.map +1 -0
- package/dist/core/CoverageAnalyzer.js +199 -0
- package/dist/core/CoverageAnalyzer.js.map +1 -0
- package/dist/core/FileExplainer.d.ts +101 -0
- package/dist/core/FileExplainer.d.ts.map +1 -0
- package/dist/core/FileExplainer.js +140 -0
- package/dist/core/FileExplainer.js.map +1 -0
- package/dist/core/FileOverview.d.ts +124 -0
- package/dist/core/FileOverview.d.ts.map +1 -0
- package/dist/core/FileOverview.js +279 -0
- package/dist/core/FileOverview.js.map +1 -0
- package/dist/core/GrafemaUri.d.ts +66 -0
- package/dist/core/GrafemaUri.d.ts.map +1 -0
- package/dist/core/GrafemaUri.js +191 -0
- package/dist/core/GrafemaUri.js.map +1 -0
- package/dist/core/GraphBackend.d.ts +158 -0
- package/dist/core/GraphBackend.d.ts.map +1 -0
- package/dist/core/GraphBackend.js +85 -0
- package/dist/core/GraphBackend.js.map +1 -0
- package/dist/core/GraphFreshnessChecker.d.ts +33 -0
- package/dist/core/GraphFreshnessChecker.d.ts.map +1 -0
- package/dist/core/GraphFreshnessChecker.js +104 -0
- package/dist/core/GraphFreshnessChecker.js.map +1 -0
- package/dist/core/GuaranteeManager.d.ts +254 -0
- package/dist/core/GuaranteeManager.d.ts.map +1 -0
- package/dist/core/GuaranteeManager.js +447 -0
- package/dist/core/GuaranteeManager.js.map +1 -0
- package/dist/core/HashUtils.d.ts +24 -0
- package/dist/core/HashUtils.d.ts.map +1 -0
- package/dist/core/HashUtils.js +46 -0
- package/dist/core/HashUtils.js.map +1 -0
- package/dist/core/IncrementalReanalyzer.d.ts +33 -0
- package/dist/core/IncrementalReanalyzer.d.ts.map +1 -0
- package/dist/core/IncrementalReanalyzer.js +67 -0
- package/dist/core/IncrementalReanalyzer.js.map +1 -0
- package/dist/core/ResourceRegistry.d.ts +17 -0
- package/dist/core/ResourceRegistry.d.ts.map +1 -0
- package/dist/core/ResourceRegistry.js +32 -0
- package/dist/core/ResourceRegistry.js.map +1 -0
- package/dist/core/SemanticId.d.ts +159 -0
- package/dist/core/SemanticId.d.ts.map +1 -0
- package/dist/core/SemanticId.js +291 -0
- package/dist/core/SemanticId.js.map +1 -0
- package/dist/core/VersionManager.d.ts +166 -0
- package/dist/core/VersionManager.d.ts.map +1 -0
- package/dist/core/VersionManager.js +239 -0
- package/dist/core/VersionManager.js.map +1 -0
- package/dist/core/brandNodeInternal.d.ts +14 -0
- package/dist/core/brandNodeInternal.d.ts.map +1 -0
- package/dist/core/brandNodeInternal.js +4 -0
- package/dist/core/brandNodeInternal.js.map +1 -0
- package/dist/core/nodes/GuaranteeNode.d.ts +76 -0
- package/dist/core/nodes/GuaranteeNode.d.ts.map +1 -0
- package/dist/core/nodes/GuaranteeNode.js +118 -0
- package/dist/core/nodes/GuaranteeNode.js.map +1 -0
- package/dist/core/nodes/IssueNode.d.ts +73 -0
- package/dist/core/nodes/IssueNode.d.ts.map +1 -0
- package/dist/core/nodes/IssueNode.js +130 -0
- package/dist/core/nodes/IssueNode.js.map +1 -0
- package/dist/core/nodes/NodeKind.d.ts +104 -0
- package/dist/core/nodes/NodeKind.d.ts.map +1 -0
- package/dist/core/nodes/NodeKind.js +166 -0
- package/dist/core/nodes/NodeKind.js.map +1 -0
- package/dist/diagnostics/DiagnosticCollector.d.ts +103 -0
- package/dist/diagnostics/DiagnosticCollector.d.ts.map +1 -0
- package/dist/diagnostics/DiagnosticCollector.js +133 -0
- package/dist/diagnostics/DiagnosticCollector.js.map +1 -0
- package/dist/diagnostics/DiagnosticReporter.d.ts +122 -0
- package/dist/diagnostics/DiagnosticReporter.d.ts.map +1 -0
- package/dist/diagnostics/DiagnosticReporter.js +300 -0
- package/dist/diagnostics/DiagnosticReporter.js.map +1 -0
- package/dist/diagnostics/DiagnosticWriter.d.ts +31 -0
- package/dist/diagnostics/DiagnosticWriter.d.ts.map +1 -0
- package/dist/diagnostics/DiagnosticWriter.js +44 -0
- package/dist/diagnostics/DiagnosticWriter.js.map +1 -0
- package/dist/diagnostics/categories.d.ts +57 -0
- package/dist/diagnostics/categories.d.ts.map +1 -0
- package/dist/diagnostics/categories.js +71 -0
- package/dist/diagnostics/categories.js.map +1 -0
- package/dist/diagnostics/index.d.ts +17 -0
- package/dist/diagnostics/index.d.ts.map +1 -0
- package/dist/diagnostics/index.js +15 -0
- package/dist/diagnostics/index.js.map +1 -0
- package/dist/errors/GrafemaError.d.ts +200 -0
- package/dist/errors/GrafemaError.d.ts.map +1 -0
- package/dist/errors/GrafemaError.js +209 -0
- package/dist/errors/GrafemaError.js.map +1 -0
- package/dist/index.d.ts +75 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +76 -0
- package/dist/index.js.map +1 -0
- package/dist/instructions/index.d.ts +8 -0
- package/dist/instructions/index.d.ts.map +1 -0
- package/dist/instructions/index.js +20 -0
- package/dist/instructions/index.js.map +1 -0
- package/dist/instructions/onboarding.md +133 -0
- package/dist/knowledge/KnowledgeBase.d.ts +113 -0
- package/dist/knowledge/KnowledgeBase.d.ts.map +1 -0
- package/dist/knowledge/KnowledgeBase.js +420 -0
- package/dist/knowledge/KnowledgeBase.js.map +1 -0
- package/dist/knowledge/SemanticAddressResolver.d.ts +59 -0
- package/dist/knowledge/SemanticAddressResolver.d.ts.map +1 -0
- package/dist/knowledge/SemanticAddressResolver.js +160 -0
- package/dist/knowledge/SemanticAddressResolver.js.map +1 -0
- package/dist/knowledge/git-ingest.d.ts +58 -0
- package/dist/knowledge/git-ingest.d.ts.map +1 -0
- package/dist/knowledge/git-ingest.js +301 -0
- package/dist/knowledge/git-ingest.js.map +1 -0
- package/dist/knowledge/git-queries.d.ts +86 -0
- package/dist/knowledge/git-queries.d.ts.map +1 -0
- package/dist/knowledge/git-queries.js +177 -0
- package/dist/knowledge/git-queries.js.map +1 -0
- package/dist/knowledge/index.d.ts +14 -0
- package/dist/knowledge/index.d.ts.map +1 -0
- package/dist/knowledge/index.js +10 -0
- package/dist/knowledge/index.js.map +1 -0
- package/dist/knowledge/parser.d.ts +39 -0
- package/dist/knowledge/parser.d.ts.map +1 -0
- package/dist/knowledge/parser.js +292 -0
- package/dist/knowledge/parser.js.map +1 -0
- package/dist/knowledge/types.d.ts +133 -0
- package/dist/knowledge/types.d.ts.map +1 -0
- package/dist/knowledge/types.js +8 -0
- package/dist/knowledge/types.js.map +1 -0
- package/dist/logging/Logger.d.ts +98 -0
- package/dist/logging/Logger.d.ts.map +1 -0
- package/dist/logging/Logger.js +274 -0
- package/dist/logging/Logger.js.map +1 -0
- package/dist/notation/archetypes.d.ts +36 -0
- package/dist/notation/archetypes.d.ts.map +1 -0
- package/dist/notation/archetypes.js +173 -0
- package/dist/notation/archetypes.js.map +1 -0
- package/dist/notation/fold.d.ts +25 -0
- package/dist/notation/fold.d.ts.map +1 -0
- package/dist/notation/fold.js +598 -0
- package/dist/notation/fold.js.map +1 -0
- package/dist/notation/index.d.ts +18 -0
- package/dist/notation/index.d.ts.map +1 -0
- package/dist/notation/index.js +16 -0
- package/dist/notation/index.js.map +1 -0
- package/dist/notation/lodExtractor.d.ts +32 -0
- package/dist/notation/lodExtractor.d.ts.map +1 -0
- package/dist/notation/lodExtractor.js +149 -0
- package/dist/notation/lodExtractor.js.map +1 -0
- package/dist/notation/nameShortener.d.ts +22 -0
- package/dist/notation/nameShortener.d.ts.map +1 -0
- package/dist/notation/nameShortener.js +24 -0
- package/dist/notation/nameShortener.js.map +1 -0
- package/dist/notation/perspectives.d.ts +11 -0
- package/dist/notation/perspectives.d.ts.map +1 -0
- package/dist/notation/perspectives.js +16 -0
- package/dist/notation/perspectives.js.map +1 -0
- package/dist/notation/renderer.d.ts +31 -0
- package/dist/notation/renderer.d.ts.map +1 -0
- package/dist/notation/renderer.js +315 -0
- package/dist/notation/renderer.js.map +1 -0
- package/dist/notation/traceRenderer.d.ts +39 -0
- package/dist/notation/traceRenderer.d.ts.map +1 -0
- package/dist/notation/traceRenderer.js +358 -0
- package/dist/notation/traceRenderer.js.map +1 -0
- package/dist/notation/types.d.ts +66 -0
- package/dist/notation/types.d.ts.map +1 -0
- package/dist/notation/types.js +10 -0
- package/dist/notation/types.js.map +1 -0
- package/dist/queries/NodeContext.d.ts +81 -0
- package/dist/queries/NodeContext.d.ts.map +1 -0
- package/dist/queries/NodeContext.js +196 -0
- package/dist/queries/NodeContext.js.map +1 -0
- package/dist/queries/findCallsInFunction.d.ts +62 -0
- package/dist/queries/findCallsInFunction.d.ts.map +1 -0
- package/dist/queries/findCallsInFunction.js +169 -0
- package/dist/queries/findCallsInFunction.js.map +1 -0
- package/dist/queries/findContainingFunction.d.ts +57 -0
- package/dist/queries/findContainingFunction.d.ts.map +1 -0
- package/dist/queries/findContainingFunction.js +91 -0
- package/dist/queries/findContainingFunction.js.map +1 -0
- package/dist/queries/index.d.ts +18 -0
- package/dist/queries/index.d.ts.map +1 -0
- package/dist/queries/index.js +14 -0
- package/dist/queries/index.js.map +1 -0
- package/dist/queries/traceDataflow.d.ts +65 -0
- package/dist/queries/traceDataflow.d.ts.map +1 -0
- package/dist/queries/traceDataflow.js +754 -0
- package/dist/queries/traceDataflow.js.map +1 -0
- package/dist/queries/traceValues.d.ts +70 -0
- package/dist/queries/traceValues.d.ts.map +1 -0
- package/dist/queries/traceValues.js +373 -0
- package/dist/queries/traceValues.js.map +1 -0
- package/dist/queries/types.d.ts +166 -0
- package/dist/queries/types.d.ts.map +1 -0
- package/dist/queries/types.js +10 -0
- package/dist/queries/types.js.map +1 -0
- package/dist/schema/GraphSchemaExtractor.d.ts +53 -0
- package/dist/schema/GraphSchemaExtractor.d.ts.map +1 -0
- package/dist/schema/GraphSchemaExtractor.js +125 -0
- package/dist/schema/GraphSchemaExtractor.js.map +1 -0
- package/dist/schema/InterfaceSchemaExtractor.d.ts +73 -0
- package/dist/schema/InterfaceSchemaExtractor.d.ts.map +1 -0
- package/dist/schema/InterfaceSchemaExtractor.js +113 -0
- package/dist/schema/InterfaceSchemaExtractor.js.map +1 -0
- package/dist/schema/index.d.ts +5 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +3 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/storage/backends/RFDBServerBackend.d.ts +356 -0
- package/dist/storage/backends/RFDBServerBackend.d.ts.map +1 -0
- package/dist/storage/backends/RFDBServerBackend.js +748 -0
- package/dist/storage/backends/RFDBServerBackend.js.map +1 -0
- package/dist/storage/backends/typeValidation.d.ts +47 -0
- package/dist/storage/backends/typeValidation.d.ts.map +1 -0
- package/dist/storage/backends/typeValidation.js +141 -0
- package/dist/storage/backends/typeValidation.js.map +1 -0
- package/dist/utils/findRfdbBinary.d.ts +67 -0
- package/dist/utils/findRfdbBinary.d.ts.map +1 -0
- package/dist/utils/findRfdbBinary.js +261 -0
- package/dist/utils/findRfdbBinary.js.map +1 -0
- package/dist/utils/lazyDownload.d.ts +43 -0
- package/dist/utils/lazyDownload.d.ts.map +1 -0
- package/dist/utils/lazyDownload.js +175 -0
- package/dist/utils/lazyDownload.js.map +1 -0
- package/dist/utils/moduleResolution.d.ts +134 -0
- package/dist/utils/moduleResolution.d.ts.map +1 -0
- package/dist/utils/moduleResolution.js +189 -0
- package/dist/utils/moduleResolution.js.map +1 -0
- package/dist/utils/resolveNodeFile.d.ts +13 -0
- package/dist/utils/resolveNodeFile.d.ts.map +1 -0
- package/dist/utils/resolveNodeFile.js +18 -0
- package/dist/utils/resolveNodeFile.js.map +1 -0
- package/dist/utils/startRfdbServer.d.ts +63 -0
- package/dist/utils/startRfdbServer.d.ts.map +1 -0
- package/dist/utils/startRfdbServer.js +142 -0
- package/dist/utils/startRfdbServer.js.map +1 -0
- package/dist/validation/PathValidator.d.ts +80 -0
- package/dist/validation/PathValidator.d.ts.map +1 -0
- package/dist/validation/PathValidator.js +252 -0
- package/dist/validation/PathValidator.js.map +1 -0
- package/dist/version.d.ts +11 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +26 -0
- package/dist/version.js.map +1 -0
- package/package.json +50 -0
- package/src/api/GraphAPI.ts +307 -0
- package/src/api/GuaranteeAPI.ts +402 -0
- package/src/config/ConfigLoader.ts +653 -0
- package/src/config/index.ts +13 -0
- package/src/core/CoverageAnalyzer.ts +243 -0
- package/src/core/FileExplainer.ts +179 -0
- package/src/core/FileOverview.ts +397 -0
- package/src/core/GrafemaUri.ts +216 -0
- package/src/core/GraphBackend.ts +266 -0
- package/src/core/GraphFreshnessChecker.ts +145 -0
- package/src/core/GuaranteeManager.ts +684 -0
- package/src/core/HashUtils.ts +48 -0
- package/src/core/IncrementalReanalyzer.ts +106 -0
- package/src/core/ResourceRegistry.ts +39 -0
- package/src/core/SemanticId.ts +423 -0
- package/src/core/VersionManager.ts +405 -0
- package/src/core/brandNodeInternal.ts +16 -0
- package/src/core/nodes/GuaranteeNode.ts +162 -0
- package/src/core/nodes/IssueNode.ts +177 -0
- package/src/core/nodes/NodeKind.ts +192 -0
- package/src/diagnostics/DiagnosticCollector.ts +170 -0
- package/src/diagnostics/DiagnosticReporter.ts +395 -0
- package/src/diagnostics/DiagnosticWriter.ts +50 -0
- package/src/diagnostics/categories.ts +104 -0
- package/src/diagnostics/index.ts +30 -0
- package/src/errors/GrafemaError.ts +297 -0
- package/src/index.ts +261 -0
- package/src/instructions/index.ts +21 -0
- package/src/instructions/onboarding.md +133 -0
- package/src/knowledge/KnowledgeBase.ts +486 -0
- package/src/knowledge/SemanticAddressResolver.ts +191 -0
- package/src/knowledge/git-ingest.ts +402 -0
- package/src/knowledge/git-queries.ts +269 -0
- package/src/knowledge/index.ts +29 -0
- package/src/knowledge/parser.ts +294 -0
- package/src/knowledge/types.ts +146 -0
- package/src/logging/Logger.ts +303 -0
- package/src/notation/archetypes.ts +189 -0
- package/src/notation/fold.ts +696 -0
- package/src/notation/index.ts +27 -0
- package/src/notation/lodExtractor.ts +177 -0
- package/src/notation/nameShortener.ts +24 -0
- package/src/notation/perspectives.ts +18 -0
- package/src/notation/renderer.ts +394 -0
- package/src/notation/traceRenderer.ts +458 -0
- package/src/notation/types.ts +79 -0
- package/src/queries/NodeContext.ts +280 -0
- package/src/queries/findCallsInFunction.ts +249 -0
- package/src/queries/findContainingFunction.ts +124 -0
- package/src/queries/index.ts +44 -0
- package/src/queries/traceDataflow.ts +838 -0
- package/src/queries/traceValues.ts +531 -0
- package/src/queries/types.ts +191 -0
- package/src/schema/GraphSchemaExtractor.ts +177 -0
- package/src/schema/InterfaceSchemaExtractor.ts +173 -0
- package/src/schema/index.ts +5 -0
- package/src/storage/backends/RFDBServerBackend.ts +895 -0
- package/src/storage/backends/typeValidation.ts +154 -0
- package/src/utils/findRfdbBinary.ts +288 -0
- package/src/utils/lazyDownload.ts +206 -0
- package/src/utils/moduleResolution.ts +271 -0
- package/src/utils/resolveNodeFile.ts +18 -0
- package/src/utils/startRfdbServer.ts +197 -0
- package/src/validation/PathValidator.ts +334 -0
- package/src/version.ts +28 -0
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
import { readFileSync, existsSync, statSync } from 'fs';
|
|
2
|
+
import { join, basename } from 'path';
|
|
3
|
+
import { parse as parseYAML } from 'yaml';
|
|
4
|
+
import { GRAFEMA_VERSION, getSchemaVersion } from '../version.js';
|
|
5
|
+
/**
|
|
6
|
+
* Default plugin configuration.
|
|
7
|
+
* Matches current DEFAULT_PLUGINS in analyze.ts and config.ts (MCP).
|
|
8
|
+
*/
|
|
9
|
+
export const DEFAULT_CONFIG = {
|
|
10
|
+
version: getSchemaVersion(GRAFEMA_VERSION),
|
|
11
|
+
plugins: {
|
|
12
|
+
discovery: [],
|
|
13
|
+
indexing: ['JSModuleIndexer'],
|
|
14
|
+
analysis: [
|
|
15
|
+
'CoreV2Analyzer',
|
|
16
|
+
'ExpressRouteAnalyzer',
|
|
17
|
+
'ExpressResponseAnalyzer',
|
|
18
|
+
'NestJSRouteAnalyzer',
|
|
19
|
+
'SocketIOAnalyzer',
|
|
20
|
+
'DatabaseAnalyzer',
|
|
21
|
+
'FetchAnalyzer',
|
|
22
|
+
'ServiceLayerAnalyzer',
|
|
23
|
+
],
|
|
24
|
+
enrichment: [
|
|
25
|
+
'ExportEntityLinker',
|
|
26
|
+
'CallbackCallResolver',
|
|
27
|
+
'RejectionPropagationEnricher',
|
|
28
|
+
'ValueDomainAnalyzer',
|
|
29
|
+
'MountPointResolver',
|
|
30
|
+
'ExpressHandlerLinker',
|
|
31
|
+
'PrefixEvaluator',
|
|
32
|
+
'ConfigRoutingMapBuilder',
|
|
33
|
+
'ServiceConnectionEnricher',
|
|
34
|
+
'RedisEnricher',
|
|
35
|
+
],
|
|
36
|
+
validation: [
|
|
37
|
+
'GraphConnectivityValidator',
|
|
38
|
+
'DataFlowValidator',
|
|
39
|
+
'EvalBanValidator',
|
|
40
|
+
'CallResolverValidator',
|
|
41
|
+
'SQLInjectionValidator',
|
|
42
|
+
'AwaitInLoopValidator',
|
|
43
|
+
'ShadowingDetector',
|
|
44
|
+
'BrokenImportValidator',
|
|
45
|
+
'UnconnectedRouteValidator',
|
|
46
|
+
'PackageCoverageValidator',
|
|
47
|
+
],
|
|
48
|
+
},
|
|
49
|
+
services: [], // Empty by default (uses auto-discovery)
|
|
50
|
+
strict: false, // Graceful degradation by default
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Load Grafema config from project directory.
|
|
54
|
+
*
|
|
55
|
+
* Priority:
|
|
56
|
+
* 1. config.yaml (preferred)
|
|
57
|
+
* 2. config.json (deprecated, fallback)
|
|
58
|
+
* 3. DEFAULT_CONFIG (if neither exists)
|
|
59
|
+
*
|
|
60
|
+
* Warnings:
|
|
61
|
+
* - Logs deprecation warning if config.json is used
|
|
62
|
+
* - Logs parse errors but doesn't throw (returns defaults)
|
|
63
|
+
*
|
|
64
|
+
* @param projectPath - Absolute path to project root
|
|
65
|
+
* @param logger - Optional logger for warnings (defaults to console.warn)
|
|
66
|
+
* @returns Parsed config or defaults
|
|
67
|
+
*/
|
|
68
|
+
export function loadConfig(projectPath, logger = console) {
|
|
69
|
+
const grafemaDir = join(projectPath, '.grafema');
|
|
70
|
+
const yamlPath = join(grafemaDir, 'config.yaml');
|
|
71
|
+
const jsonPath = join(grafemaDir, 'config.json');
|
|
72
|
+
// 1. Try YAML first (preferred)
|
|
73
|
+
if (existsSync(yamlPath)) {
|
|
74
|
+
let parsed;
|
|
75
|
+
try {
|
|
76
|
+
const content = readFileSync(yamlPath, 'utf-8');
|
|
77
|
+
parsed = parseYAML(content);
|
|
78
|
+
// Validate structure - ensure plugins sections are arrays if they exist
|
|
79
|
+
if (parsed.plugins) {
|
|
80
|
+
for (const phase of ['discovery', 'indexing', 'analysis', 'enrichment', 'validation']) {
|
|
81
|
+
const value = parsed.plugins[phase];
|
|
82
|
+
if (value !== undefined && value !== null && !Array.isArray(value)) {
|
|
83
|
+
throw new Error(`plugins.${phase} must be an array, got ${typeof value}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
90
|
+
logger.warn(`Failed to parse config.yaml: ${error.message}`);
|
|
91
|
+
logger.warn('Using default configuration');
|
|
92
|
+
return DEFAULT_CONFIG;
|
|
93
|
+
}
|
|
94
|
+
// Validate version compatibility (THROWS on error) - REG-403
|
|
95
|
+
validateVersion(parsed.version);
|
|
96
|
+
// Validate services array if present (THROWS on error per Linus review)
|
|
97
|
+
// This is OUTSIDE try-catch - config errors MUST throw
|
|
98
|
+
validateServices(parsed.services, projectPath);
|
|
99
|
+
// Validate include/exclude patterns (THROWS on error)
|
|
100
|
+
validatePatterns(parsed.include, parsed.exclude, logger);
|
|
101
|
+
// Validate workspace.roots if present (THROWS on error) - REG-76
|
|
102
|
+
validateWorkspace(parsed.workspace, projectPath);
|
|
103
|
+
// Validate routing rules if present (THROWS on error) - REG-256
|
|
104
|
+
validateRouting(parsed.routing, (parsed.services || []));
|
|
105
|
+
// Merge with defaults (user config may be partial)
|
|
106
|
+
return mergeConfig(DEFAULT_CONFIG, parsed);
|
|
107
|
+
}
|
|
108
|
+
// 2. Fallback to JSON (migration path)
|
|
109
|
+
if (existsSync(jsonPath)) {
|
|
110
|
+
logger.warn('⚠ config.json is deprecated. Run "grafema init --force" to migrate to config.yaml');
|
|
111
|
+
let parsed;
|
|
112
|
+
try {
|
|
113
|
+
const content = readFileSync(jsonPath, 'utf-8');
|
|
114
|
+
parsed = JSON.parse(content);
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
118
|
+
logger.warn(`Failed to parse config.json: ${error.message}`);
|
|
119
|
+
logger.warn('Using default configuration');
|
|
120
|
+
return DEFAULT_CONFIG;
|
|
121
|
+
}
|
|
122
|
+
// Validate version compatibility (THROWS on error) - REG-403
|
|
123
|
+
validateVersion(parsed.version);
|
|
124
|
+
// Validate services array if present (THROWS on error)
|
|
125
|
+
// This is OUTSIDE try-catch - config errors MUST throw
|
|
126
|
+
validateServices(parsed.services, projectPath);
|
|
127
|
+
// Validate include/exclude patterns (THROWS on error)
|
|
128
|
+
validatePatterns(parsed.include, parsed.exclude, logger);
|
|
129
|
+
// Validate workspace.roots if present (THROWS on error) - REG-76
|
|
130
|
+
validateWorkspace(parsed.workspace, projectPath);
|
|
131
|
+
// Validate routing rules if present (THROWS on error) - REG-256
|
|
132
|
+
validateRouting(parsed.routing, (parsed.services || []));
|
|
133
|
+
return mergeConfig(DEFAULT_CONFIG, parsed);
|
|
134
|
+
}
|
|
135
|
+
// 3. No config file - return defaults
|
|
136
|
+
return DEFAULT_CONFIG;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Validate config version compatibility with running Grafema version.
|
|
140
|
+
* THROWS on error (fail loudly per project convention).
|
|
141
|
+
*
|
|
142
|
+
* Compares major.minor.patch (pre-release tags are stripped).
|
|
143
|
+
* If config has no version field, validation passes silently (backward compat).
|
|
144
|
+
*
|
|
145
|
+
* @param configVersion - Version string from config file (may be undefined)
|
|
146
|
+
* @param currentVersion - Override for testing (defaults to GRAFEMA_VERSION)
|
|
147
|
+
*/
|
|
148
|
+
export function validateVersion(configVersion, currentVersion) {
|
|
149
|
+
// No version field = backward compat, accept silently
|
|
150
|
+
if (configVersion === undefined || configVersion === null) {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
if (typeof configVersion !== 'string') {
|
|
154
|
+
throw new Error(`Config error: version must be a string, got ${typeof configVersion}`);
|
|
155
|
+
}
|
|
156
|
+
if (!configVersion.trim()) {
|
|
157
|
+
throw new Error('Config error: version cannot be empty');
|
|
158
|
+
}
|
|
159
|
+
const current = currentVersion ?? GRAFEMA_VERSION;
|
|
160
|
+
const configSchema = getSchemaVersion(configVersion);
|
|
161
|
+
const currentSchema = getSchemaVersion(current);
|
|
162
|
+
if (configSchema !== currentSchema) {
|
|
163
|
+
throw new Error(`Config error: config version "${configVersion}" is not compatible with ` +
|
|
164
|
+
`Grafema ${current}. Expected "${currentSchema}".\n` +
|
|
165
|
+
` Run: grafema init --force (to regenerate config for current version)`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Validate services array structure.
|
|
170
|
+
* THROWS on error (fail loudly per Linus review).
|
|
171
|
+
*
|
|
172
|
+
* @param services - Parsed services array (may be undefined)
|
|
173
|
+
* @param projectPath - Project root for path validation
|
|
174
|
+
*/
|
|
175
|
+
export function validateServices(services, projectPath) {
|
|
176
|
+
// undefined/null is valid (means use defaults)
|
|
177
|
+
if (services === undefined || services === null) {
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
// Must be an array
|
|
181
|
+
if (!Array.isArray(services)) {
|
|
182
|
+
throw new Error(`Config error: services must be an array, got ${typeof services}`);
|
|
183
|
+
}
|
|
184
|
+
// Validate each service
|
|
185
|
+
for (let i = 0; i < services.length; i++) {
|
|
186
|
+
const svc = services[i];
|
|
187
|
+
// Must be an object
|
|
188
|
+
if (typeof svc !== 'object' || svc === null) {
|
|
189
|
+
throw new Error(`Config error: services[${i}] must be an object`);
|
|
190
|
+
}
|
|
191
|
+
// Name validation - required, non-empty string
|
|
192
|
+
if (typeof svc.name !== 'string') {
|
|
193
|
+
throw new Error(`Config error: services[${i}].name must be a string, got ${typeof svc.name}`);
|
|
194
|
+
}
|
|
195
|
+
if (!svc.name.trim()) {
|
|
196
|
+
throw new Error(`Config error: services[${i}].name cannot be empty or whitespace-only`);
|
|
197
|
+
}
|
|
198
|
+
// Path validation - required, non-empty string
|
|
199
|
+
if (typeof svc.path !== 'string') {
|
|
200
|
+
throw new Error(`Config error: services[${i}].path must be a string, got ${typeof svc.path}`);
|
|
201
|
+
}
|
|
202
|
+
if (!svc.path.trim()) {
|
|
203
|
+
throw new Error(`Config error: services[${i}].path cannot be empty or whitespace-only`);
|
|
204
|
+
}
|
|
205
|
+
// Path validation - must be relative (reject absolute paths per Linus review)
|
|
206
|
+
if (svc.path.startsWith('/') || svc.path.startsWith('~')) {
|
|
207
|
+
throw new Error(`Config error: services[${i}].path must be relative to project root, got "${svc.path}"`);
|
|
208
|
+
}
|
|
209
|
+
// Path validation - must exist
|
|
210
|
+
const absolutePath = join(projectPath, svc.path);
|
|
211
|
+
if (!existsSync(absolutePath)) {
|
|
212
|
+
throw new Error(`Config error: services[${i}].path "${svc.path}" does not exist`);
|
|
213
|
+
}
|
|
214
|
+
// Path validation - must be directory
|
|
215
|
+
if (!statSync(absolutePath).isDirectory()) {
|
|
216
|
+
throw new Error(`Config error: services[${i}].path "${svc.path}" must be a directory`);
|
|
217
|
+
}
|
|
218
|
+
// entryPoint validation (optional field) - must be non-empty string if provided
|
|
219
|
+
if (svc.entryPoint !== undefined) {
|
|
220
|
+
if (typeof svc.entryPoint !== 'string') {
|
|
221
|
+
throw new Error(`Config error: services[${i}].entryPoint must be a string, got ${typeof svc.entryPoint}`);
|
|
222
|
+
}
|
|
223
|
+
if (!svc.entryPoint.trim()) {
|
|
224
|
+
throw new Error(`Config error: services[${i}].entryPoint cannot be empty or whitespace-only`);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
// customerFacing validation (optional field) - must be boolean if provided (REG-256)
|
|
228
|
+
if (svc.customerFacing !== undefined) {
|
|
229
|
+
if (typeof svc.customerFacing !== 'boolean') {
|
|
230
|
+
throw new Error(`Config error: services[${i}].customerFacing must be a boolean, got ${typeof svc.customerFacing}`);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Validate workspace configuration (REG-76).
|
|
237
|
+
* THROWS on error (fail loudly per project convention).
|
|
238
|
+
*
|
|
239
|
+
* Validation rules:
|
|
240
|
+
* 1. workspace.roots must be an array if provided
|
|
241
|
+
* 2. Each root must be a non-empty string
|
|
242
|
+
* 3. Each root path must exist and be a directory
|
|
243
|
+
* 4. Root basenames must be unique (to prevent semantic ID collisions)
|
|
244
|
+
*
|
|
245
|
+
* @param workspace - Parsed workspace config (may be undefined)
|
|
246
|
+
* @param projectPath - Project root for path validation
|
|
247
|
+
*/
|
|
248
|
+
export function validateWorkspace(workspace, projectPath) {
|
|
249
|
+
// undefined/null is valid (means single-root mode)
|
|
250
|
+
if (workspace === undefined || workspace === null) {
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
// Must be an object
|
|
254
|
+
if (typeof workspace !== 'object') {
|
|
255
|
+
throw new Error(`Config error: workspace must be an object, got ${typeof workspace}`);
|
|
256
|
+
}
|
|
257
|
+
const ws = workspace;
|
|
258
|
+
// roots is optional, but if provided must be valid
|
|
259
|
+
if (ws.roots === undefined || ws.roots === null) {
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
// roots must be an array
|
|
263
|
+
if (!Array.isArray(ws.roots)) {
|
|
264
|
+
throw new Error(`Config error: workspace.roots must be an array, got ${typeof ws.roots}`);
|
|
265
|
+
}
|
|
266
|
+
// Track root names for duplicate detection
|
|
267
|
+
const seenNames = new Set();
|
|
268
|
+
// Validate each root
|
|
269
|
+
for (let i = 0; i < ws.roots.length; i++) {
|
|
270
|
+
const root = ws.roots[i];
|
|
271
|
+
// Must be a string
|
|
272
|
+
if (typeof root !== 'string') {
|
|
273
|
+
throw new Error(`Config error: workspace.roots[${i}] must be a string, got ${typeof root}`);
|
|
274
|
+
}
|
|
275
|
+
// Must not be empty
|
|
276
|
+
if (!root.trim()) {
|
|
277
|
+
throw new Error(`Config error: workspace.roots[${i}] cannot be empty or whitespace-only`);
|
|
278
|
+
}
|
|
279
|
+
// Must be relative path
|
|
280
|
+
if (root.startsWith('/') || root.startsWith('~')) {
|
|
281
|
+
throw new Error(`Config error: workspace.roots[${i}] must be relative to project root, got "${root}"`);
|
|
282
|
+
}
|
|
283
|
+
// Path must exist
|
|
284
|
+
const absolutePath = join(projectPath, root);
|
|
285
|
+
if (!existsSync(absolutePath)) {
|
|
286
|
+
throw new Error(`Config error: workspace.roots[${i}] "${root}" does not exist`);
|
|
287
|
+
}
|
|
288
|
+
// Path must be a directory
|
|
289
|
+
if (!statSync(absolutePath).isDirectory()) {
|
|
290
|
+
throw new Error(`Config error: workspace.roots[${i}] "${root}" must be a directory`);
|
|
291
|
+
}
|
|
292
|
+
// Check for duplicate root names (basename)
|
|
293
|
+
const rootName = basename(root);
|
|
294
|
+
if (seenNames.has(rootName)) {
|
|
295
|
+
throw new Error(`Config error: Duplicate workspace root name "${rootName}" - root names (basenames) must be unique`);
|
|
296
|
+
}
|
|
297
|
+
seenNames.add(rootName);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Validate routing rules structure (REG-256).
|
|
302
|
+
* THROWS on error (fail loudly per project convention).
|
|
303
|
+
*
|
|
304
|
+
* Validation rules:
|
|
305
|
+
* 1. Must be an array if provided
|
|
306
|
+
* 2. Each rule must have 'from' and 'to' as non-empty strings
|
|
307
|
+
* 3. 'stripPrefix' must start with '/' if provided
|
|
308
|
+
* 4. 'addPrefix' must start with '/' if provided
|
|
309
|
+
* 5. 'from' and 'to' must reference services defined in the services array
|
|
310
|
+
*
|
|
311
|
+
* @param routing - Parsed routing rules (may be undefined)
|
|
312
|
+
* @param services - Parsed services array (for cross-validation)
|
|
313
|
+
*/
|
|
314
|
+
export function validateRouting(routing, services) {
|
|
315
|
+
if (routing === undefined || routing === null)
|
|
316
|
+
return;
|
|
317
|
+
if (!Array.isArray(routing)) {
|
|
318
|
+
throw new Error(`Config error: routing must be an array, got ${typeof routing}`);
|
|
319
|
+
}
|
|
320
|
+
const serviceNames = new Set(services.map(s => s.name));
|
|
321
|
+
for (let i = 0; i < routing.length; i++) {
|
|
322
|
+
const rule = routing[i];
|
|
323
|
+
if (typeof rule !== 'object' || rule === null) {
|
|
324
|
+
throw new Error(`Config error: routing[${i}] must be an object`);
|
|
325
|
+
}
|
|
326
|
+
// from — required
|
|
327
|
+
if (typeof rule.from !== 'string' || !rule.from.trim()) {
|
|
328
|
+
throw new Error(`Config error: routing[${i}].from must be a non-empty string`);
|
|
329
|
+
}
|
|
330
|
+
// to — required
|
|
331
|
+
if (typeof rule.to !== 'string' || !rule.to.trim()) {
|
|
332
|
+
throw new Error(`Config error: routing[${i}].to must be a non-empty string`);
|
|
333
|
+
}
|
|
334
|
+
// Cross-validate against services (only if services are defined)
|
|
335
|
+
if (serviceNames.size > 0) {
|
|
336
|
+
if (!serviceNames.has(rule.from)) {
|
|
337
|
+
throw new Error(`Config error: routing[${i}].from "${rule.from}" does not match any service name. ` +
|
|
338
|
+
`Available: ${[...serviceNames].join(', ')}`);
|
|
339
|
+
}
|
|
340
|
+
if (!serviceNames.has(rule.to)) {
|
|
341
|
+
throw new Error(`Config error: routing[${i}].to "${rule.to}" does not match any service name. ` +
|
|
342
|
+
`Available: ${[...serviceNames].join(', ')}`);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
// stripPrefix — optional, must start with /
|
|
346
|
+
if (rule.stripPrefix !== undefined) {
|
|
347
|
+
if (typeof rule.stripPrefix !== 'string') {
|
|
348
|
+
throw new Error(`Config error: routing[${i}].stripPrefix must be a string`);
|
|
349
|
+
}
|
|
350
|
+
if (!rule.stripPrefix.startsWith('/')) {
|
|
351
|
+
throw new Error(`Config error: routing[${i}].stripPrefix must start with '/'`);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
// addPrefix — optional, must start with /
|
|
355
|
+
if (rule.addPrefix !== undefined) {
|
|
356
|
+
if (typeof rule.addPrefix !== 'string') {
|
|
357
|
+
throw new Error(`Config error: routing[${i}].addPrefix must be a string`);
|
|
358
|
+
}
|
|
359
|
+
if (!rule.addPrefix.startsWith('/')) {
|
|
360
|
+
throw new Error(`Config error: routing[${i}].addPrefix must start with '/'`);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Validate include/exclude patterns.
|
|
367
|
+
* THROWS on error (fail loudly per project convention).
|
|
368
|
+
*
|
|
369
|
+
* Validation rules:
|
|
370
|
+
* 1. Must be arrays if provided
|
|
371
|
+
* 2. Array elements must be non-empty strings
|
|
372
|
+
* 3. Warn (don't error) if include array is empty (would exclude everything)
|
|
373
|
+
*
|
|
374
|
+
* @param include - Parsed include patterns (may be undefined)
|
|
375
|
+
* @param exclude - Parsed exclude patterns (may be undefined)
|
|
376
|
+
* @param logger - Logger for warnings
|
|
377
|
+
*/
|
|
378
|
+
export function validatePatterns(include, exclude, logger) {
|
|
379
|
+
// Validate include
|
|
380
|
+
if (include !== undefined && include !== null) {
|
|
381
|
+
if (!Array.isArray(include)) {
|
|
382
|
+
throw new Error(`Config error: include must be an array, got ${typeof include}`);
|
|
383
|
+
}
|
|
384
|
+
for (let i = 0; i < include.length; i++) {
|
|
385
|
+
if (typeof include[i] !== 'string') {
|
|
386
|
+
throw new Error(`Config error: include[${i}] must be a string, got ${typeof include[i]}`);
|
|
387
|
+
}
|
|
388
|
+
if (!include[i].trim()) {
|
|
389
|
+
throw new Error(`Config error: include[${i}] cannot be empty or whitespace-only`);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
// Warn if empty array (would exclude everything)
|
|
393
|
+
if (include.length === 0) {
|
|
394
|
+
logger.warn('Warning: include is an empty array - no files will be processed');
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
// Validate exclude
|
|
398
|
+
if (exclude !== undefined && exclude !== null) {
|
|
399
|
+
if (!Array.isArray(exclude)) {
|
|
400
|
+
throw new Error(`Config error: exclude must be an array, got ${typeof exclude}`);
|
|
401
|
+
}
|
|
402
|
+
for (let i = 0; i < exclude.length; i++) {
|
|
403
|
+
if (typeof exclude[i] !== 'string') {
|
|
404
|
+
throw new Error(`Config error: exclude[${i}] must be a string, got ${typeof exclude[i]}`);
|
|
405
|
+
}
|
|
406
|
+
if (!exclude[i].trim()) {
|
|
407
|
+
throw new Error(`Config error: exclude[${i}] cannot be empty or whitespace-only`);
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* Merge user config with defaults.
|
|
414
|
+
* User config takes precedence, but missing sections use defaults.
|
|
415
|
+
*/
|
|
416
|
+
function mergeConfig(defaults, user) {
|
|
417
|
+
return {
|
|
418
|
+
version: user.version ?? defaults.version,
|
|
419
|
+
plugins: {
|
|
420
|
+
discovery: user.plugins?.discovery ?? defaults.plugins.discovery,
|
|
421
|
+
indexing: user.plugins?.indexing ?? defaults.plugins.indexing,
|
|
422
|
+
analysis: user.plugins?.analysis ?? defaults.plugins.analysis,
|
|
423
|
+
enrichment: user.plugins?.enrichment ?? defaults.plugins.enrichment,
|
|
424
|
+
validation: user.plugins?.validation ?? defaults.plugins.validation,
|
|
425
|
+
},
|
|
426
|
+
services: user.services ?? defaults.services,
|
|
427
|
+
// Include/exclude patterns: pass through if specified, otherwise undefined
|
|
428
|
+
// (don't merge with defaults - undefined means "no filtering")
|
|
429
|
+
// Note: YAML null becomes undefined here (null ?? undefined = undefined)
|
|
430
|
+
include: user.include ?? undefined,
|
|
431
|
+
exclude: user.exclude ?? undefined,
|
|
432
|
+
strict: user.strict ?? defaults.strict,
|
|
433
|
+
// Routing rules: pass through if specified (REG-256)
|
|
434
|
+
routing: user.routing ?? undefined,
|
|
435
|
+
// Workspace config: pass through if specified (REG-76)
|
|
436
|
+
workspace: user.workspace ?? undefined,
|
|
437
|
+
// URI config: pass through if specified (REG-666)
|
|
438
|
+
uri: user.uri ?? undefined,
|
|
439
|
+
};
|
|
440
|
+
}
|
|
441
|
+
//# sourceMappingURL=ConfigLoader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfigLoader.js","sourceRoot":"","sources":["../../src/config/ConfigLoader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration loading utilities
|
|
3
|
+
*/
|
|
4
|
+
export { loadConfig, DEFAULT_CONFIG, validateVersion, validateServices, validatePatterns, validateWorkspace, validateRouting, } from './ConfigLoader.js';
|
|
5
|
+
export type { GrafemaConfig } from './ConfigLoader.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EACL,UAAU,EACV,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EACL,UAAU,EACV,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,GAChB,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CoverageAnalyzer - Calculates analysis coverage for a project
|
|
3
|
+
*
|
|
4
|
+
* Determines which files in a project have been analyzed and categorizes
|
|
5
|
+
* files into three groups:
|
|
6
|
+
* - Analyzed: Files that appear as MODULE nodes in the graph
|
|
7
|
+
* - Unsupported: Files with extensions that no indexer can handle
|
|
8
|
+
* - Unreachable: Files with supported extensions but not in the graph
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* const analyzer = new CoverageAnalyzer(graphBackend, '/path/to/project');
|
|
12
|
+
* const result = await analyzer.analyze();
|
|
13
|
+
*/
|
|
14
|
+
import type { GraphBackend } from '@grafema/types';
|
|
15
|
+
/**
|
|
16
|
+
* Coverage analysis result
|
|
17
|
+
*/
|
|
18
|
+
export interface CoverageResult {
|
|
19
|
+
projectPath: string;
|
|
20
|
+
total: number;
|
|
21
|
+
analyzed: {
|
|
22
|
+
count: number;
|
|
23
|
+
files: string[];
|
|
24
|
+
};
|
|
25
|
+
unsupported: {
|
|
26
|
+
count: number;
|
|
27
|
+
byExtension: Record<string, string[]>;
|
|
28
|
+
};
|
|
29
|
+
unreachable: {
|
|
30
|
+
count: number;
|
|
31
|
+
files: string[];
|
|
32
|
+
byExtension: Record<string, string[]>;
|
|
33
|
+
};
|
|
34
|
+
percentages: {
|
|
35
|
+
analyzed: number;
|
|
36
|
+
unsupported: number;
|
|
37
|
+
unreachable: number;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* CoverageAnalyzer calculates what percentage of a codebase has been analyzed.
|
|
42
|
+
*/
|
|
43
|
+
export declare class CoverageAnalyzer {
|
|
44
|
+
private graph;
|
|
45
|
+
private projectPath;
|
|
46
|
+
constructor(graph: GraphBackend, projectPath: string);
|
|
47
|
+
/**
|
|
48
|
+
* Analyze the project and return coverage statistics
|
|
49
|
+
*/
|
|
50
|
+
analyze(): Promise<CoverageResult>;
|
|
51
|
+
/**
|
|
52
|
+
* Get list of analyzed files from the graph (MODULE nodes)
|
|
53
|
+
*/
|
|
54
|
+
private getAnalyzedFiles;
|
|
55
|
+
/**
|
|
56
|
+
* Scan project directory for all code files
|
|
57
|
+
* Respects common ignore patterns (node_modules, .git, etc.)
|
|
58
|
+
*/
|
|
59
|
+
private scanProjectFiles;
|
|
60
|
+
/**
|
|
61
|
+
* Recursively walk directory and collect code files
|
|
62
|
+
*/
|
|
63
|
+
private walkDirectory;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=CoverageAnalyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CoverageAnalyzer.d.ts","sourceRoot":"","sources":["../../src/core/CoverageAnalyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAwCnD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE;QACR,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC;IACF,WAAW,EAAE;QACX,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;KACvC,CAAC;IACF,WAAW,EAAE;QACX,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;KACvC,CAAC;IACF,WAAW,EAAE;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,WAAW,CAAS;gBAEhB,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM;IAKpD;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,cAAc,CAAC;IAsExC;;OAEG;YACW,gBAAgB;IAiB9B;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;IACH,OAAO,CAAC,aAAa;CA0CtB"}
|