@ash-technologia/fathom 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +62 -0
- package/LICENSE +21 -0
- package/README.md +725 -0
- package/dist/analyzers/architecture/graph.d.ts +29 -0
- package/dist/analyzers/architecture/graph.d.ts.map +1 -0
- package/dist/analyzers/architecture/graph.js +347 -0
- package/dist/analyzers/architecture/graph.js.map +1 -0
- package/dist/analyzers/architecture/imports.d.ts +24 -0
- package/dist/analyzers/architecture/imports.d.ts.map +1 -0
- package/dist/analyzers/architecture/imports.js +155 -0
- package/dist/analyzers/architecture/imports.js.map +1 -0
- package/dist/analyzers/architecture/index.d.ts +13 -0
- package/dist/analyzers/architecture/index.d.ts.map +1 -0
- package/dist/analyzers/architecture/index.js +217 -0
- package/dist/analyzers/architecture/index.js.map +1 -0
- package/dist/analyzers/architecture/types.d.ts +65 -0
- package/dist/analyzers/architecture/types.d.ts.map +1 -0
- package/dist/analyzers/architecture/types.js +2 -0
- package/dist/analyzers/architecture/types.js.map +1 -0
- package/dist/analyzers/cicd/index.d.ts +11 -0
- package/dist/analyzers/cicd/index.d.ts.map +1 -0
- package/dist/analyzers/cicd/index.js +157 -0
- package/dist/analyzers/cicd/index.js.map +1 -0
- package/dist/analyzers/dependencies/index.d.ts +11 -0
- package/dist/analyzers/dependencies/index.d.ts.map +1 -0
- package/dist/analyzers/dependencies/index.js +403 -0
- package/dist/analyzers/dependencies/index.js.map +1 -0
- package/dist/analyzers/dependencies/lockfiles.d.ts +19 -0
- package/dist/analyzers/dependencies/lockfiles.d.ts.map +1 -0
- package/dist/analyzers/dependencies/lockfiles.js +172 -0
- package/dist/analyzers/dependencies/lockfiles.js.map +1 -0
- package/dist/analyzers/dependencies/online.d.ts +19 -0
- package/dist/analyzers/dependencies/online.d.ts.map +1 -0
- package/dist/analyzers/dependencies/online.js +116 -0
- package/dist/analyzers/dependencies/online.js.map +1 -0
- package/dist/analyzers/dependencies/types.d.ts +49 -0
- package/dist/analyzers/dependencies/types.d.ts.map +1 -0
- package/dist/analyzers/dependencies/types.js +2 -0
- package/dist/analyzers/dependencies/types.js.map +1 -0
- package/dist/analyzers/documentation/index.d.ts +11 -0
- package/dist/analyzers/documentation/index.d.ts.map +1 -0
- package/dist/analyzers/documentation/index.js +166 -0
- package/dist/analyzers/documentation/index.js.map +1 -0
- package/dist/analyzers/git/index.d.ts +11 -0
- package/dist/analyzers/git/index.d.ts.map +1 -0
- package/dist/analyzers/git/index.js +180 -0
- package/dist/analyzers/git/index.js.map +1 -0
- package/dist/analyzers/project/index.d.ts +11 -0
- package/dist/analyzers/project/index.d.ts.map +1 -0
- package/dist/analyzers/project/index.js +95 -0
- package/dist/analyzers/project/index.js.map +1 -0
- package/dist/analyzers/quality/index.d.ts +11 -0
- package/dist/analyzers/quality/index.d.ts.map +1 -0
- package/dist/analyzers/quality/index.js +198 -0
- package/dist/analyzers/quality/index.js.map +1 -0
- package/dist/analyzers/security/index.d.ts +11 -0
- package/dist/analyzers/security/index.d.ts.map +1 -0
- package/dist/analyzers/security/index.js +236 -0
- package/dist/analyzers/security/index.js.map +1 -0
- package/dist/analyzers/testing/index.d.ts +11 -0
- package/dist/analyzers/testing/index.d.ts.map +1 -0
- package/dist/analyzers/testing/index.js +134 -0
- package/dist/analyzers/testing/index.js.map +1 -0
- package/dist/baseline/baseline.d.ts +20 -0
- package/dist/baseline/baseline.d.ts.map +1 -0
- package/dist/baseline/baseline.js +134 -0
- package/dist/baseline/baseline.js.map +1 -0
- package/dist/baseline/compare.d.ts +14 -0
- package/dist/baseline/compare.d.ts.map +1 -0
- package/dist/baseline/compare.js +113 -0
- package/dist/baseline/compare.js.map +1 -0
- package/dist/baseline/types.d.ts +25 -0
- package/dist/baseline/types.d.ts.map +1 -0
- package/dist/baseline/types.js +2 -0
- package/dist/baseline/types.js.map +1 -0
- package/dist/cli/commands.d.ts +39 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +277 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +29 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/options.d.ts +55 -0
- package/dist/cli/options.d.ts.map +1 -0
- package/dist/cli/options.js +258 -0
- package/dist/cli/options.js.map +1 -0
- package/dist/core/analyzer.d.ts +33 -0
- package/dist/core/analyzer.d.ts.map +1 -0
- package/dist/core/analyzer.js +19 -0
- package/dist/core/analyzer.js.map +1 -0
- package/dist/core/context.d.ts +90 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +159 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/errors.d.ts +74 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +109 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/findings.d.ts +59 -0
- package/dist/core/findings.d.ts.map +1 -0
- package/dist/core/findings.js +34 -0
- package/dist/core/findings.js.map +1 -0
- package/dist/core/orchestrator.d.ts +44 -0
- package/dist/core/orchestrator.d.ts.map +1 -0
- package/dist/core/orchestrator.js +160 -0
- package/dist/core/orchestrator.js.map +1 -0
- package/dist/core/result.d.ts +169 -0
- package/dist/core/result.d.ts.map +1 -0
- package/dist/core/result.js +2 -0
- package/dist/core/result.js.map +1 -0
- package/dist/detectors/framework.d.ts +22 -0
- package/dist/detectors/framework.d.ts.map +1 -0
- package/dist/detectors/framework.js +147 -0
- package/dist/detectors/framework.js.map +1 -0
- package/dist/detectors/language.d.ts +13 -0
- package/dist/detectors/language.d.ts.map +1 -0
- package/dist/detectors/language.js +100 -0
- package/dist/detectors/language.js.map +1 -0
- package/dist/detectors/package-manager.d.ts +17 -0
- package/dist/detectors/package-manager.d.ts.map +1 -0
- package/dist/detectors/package-manager.js +67 -0
- package/dist/detectors/package-manager.js.map +1 -0
- package/dist/detectors/project-type.d.ts +20 -0
- package/dist/detectors/project-type.d.ts.map +1 -0
- package/dist/detectors/project-type.js +48 -0
- package/dist/detectors/project-type.js.map +1 -0
- package/dist/diff/analyzer.d.ts +16 -0
- package/dist/diff/analyzer.d.ts.map +1 -0
- package/dist/diff/analyzer.js +296 -0
- package/dist/diff/analyzer.js.map +1 -0
- package/dist/diff/git-diff.d.ts +44 -0
- package/dist/diff/git-diff.d.ts.map +1 -0
- package/dist/diff/git-diff.js +256 -0
- package/dist/diff/git-diff.js.map +1 -0
- package/dist/diff/types.d.ts +75 -0
- package/dist/diff/types.d.ts.map +1 -0
- package/dist/diff/types.js +2 -0
- package/dist/diff/types.js.map +1 -0
- package/dist/integrations/github/context.d.ts +22 -0
- package/dist/integrations/github/context.d.ts.map +1 -0
- package/dist/integrations/github/context.js +115 -0
- package/dist/integrations/github/context.js.map +1 -0
- package/dist/integrations/github/types.d.ts +30 -0
- package/dist/integrations/github/types.d.ts.map +1 -0
- package/dist/integrations/github/types.js +2 -0
- package/dist/integrations/github/types.js.map +1 -0
- package/dist/plugins/context.d.ts +13 -0
- package/dist/plugins/context.d.ts.map +1 -0
- package/dist/plugins/context.js +102 -0
- package/dist/plugins/context.js.map +1 -0
- package/dist/plugins/examples/react.d.ts +8 -0
- package/dist/plugins/examples/react.d.ts.map +1 -0
- package/dist/plugins/examples/react.js +129 -0
- package/dist/plugins/examples/react.js.map +1 -0
- package/dist/plugins/index.d.ts +5 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +4 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/registry.d.ts +45 -0
- package/dist/plugins/registry.d.ts.map +1 -0
- package/dist/plugins/registry.js +236 -0
- package/dist/plugins/registry.js.map +1 -0
- package/dist/plugins/types.d.ts +148 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +2 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/reporters/html.d.ts +11 -0
- package/dist/reporters/html.d.ts.map +1 -0
- package/dist/reporters/html.js +1352 -0
- package/dist/reporters/html.js.map +1 -0
- package/dist/reporters/json.d.ts +10 -0
- package/dist/reporters/json.d.ts.map +1 -0
- package/dist/reporters/json.js +11 -0
- package/dist/reporters/json.js.map +1 -0
- package/dist/reporters/markdown.d.ts +7 -0
- package/dist/reporters/markdown.d.ts.map +1 -0
- package/dist/reporters/markdown.js +74 -0
- package/dist/reporters/markdown.js.map +1 -0
- package/dist/reporters/sarif.d.ts +133 -0
- package/dist/reporters/sarif.d.ts.map +1 -0
- package/dist/reporters/sarif.js +268 -0
- package/dist/reporters/sarif.js.map +1 -0
- package/dist/reporters/terminal.d.ts +17 -0
- package/dist/reporters/terminal.d.ts.map +1 -0
- package/dist/reporters/terminal.js +423 -0
- package/dist/reporters/terminal.js.map +1 -0
- package/dist/rules/categories.d.ts +8 -0
- package/dist/rules/categories.d.ts.map +1 -0
- package/dist/rules/categories.js +23 -0
- package/dist/rules/categories.js.map +1 -0
- package/dist/rules/definitions.d.ts +25 -0
- package/dist/rules/definitions.d.ts.map +1 -0
- package/dist/rules/definitions.js +429 -0
- package/dist/rules/definitions.js.map +1 -0
- package/dist/rules/registry.d.ts +36 -0
- package/dist/rules/registry.d.ts.map +1 -0
- package/dist/rules/registry.js +64 -0
- package/dist/rules/registry.js.map +1 -0
- package/dist/rules/severity.d.ts +13 -0
- package/dist/rules/severity.d.ts.map +1 -0
- package/dist/rules/severity.js +15 -0
- package/dist/rules/severity.js.map +1 -0
- package/dist/scoring/confidence.d.ts +12 -0
- package/dist/scoring/confidence.d.ts.map +1 -0
- package/dist/scoring/confidence.js +22 -0
- package/dist/scoring/confidence.js.map +1 -0
- package/dist/scoring/score.d.ts +27 -0
- package/dist/scoring/score.d.ts.map +1 -0
- package/dist/scoring/score.js +81 -0
- package/dist/scoring/score.js.map +1 -0
- package/dist/scoring/weights.d.ts +11 -0
- package/dist/scoring/weights.d.ts.map +1 -0
- package/dist/scoring/weights.js +26 -0
- package/dist/scoring/weights.js.map +1 -0
- package/dist/utils/filesystem.d.ts +65 -0
- package/dist/utils/filesystem.d.ts.map +1 -0
- package/dist/utils/filesystem.js +299 -0
- package/dist/utils/filesystem.js.map +1 -0
- package/dist/utils/git.d.ts +47 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +125 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/logger.d.ts +14 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +25 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/paths.d.ts +30 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +48 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/timing.d.ts +12 -0
- package/dist/utils/timing.d.ts.map +1 -0
- package/dist/utils/timing.js +19 -0
- package/dist/utils/timing.js.map +1 -0
- package/package.json +73 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { CATEGORIES } from '../rules/categories.js';
|
|
2
|
+
import { CATEGORY_WEIGHTS, SEVERITY_PENALTIES } from './weights.js';
|
|
3
|
+
/**
|
|
4
|
+
* Calculate a category score from its findings.
|
|
5
|
+
*
|
|
6
|
+
* - Starts at 100
|
|
7
|
+
* - Each finding deducts penalty points based on severity
|
|
8
|
+
* - Score is clamped to [0, 100]
|
|
9
|
+
* - The category weight is stored for weighted average calculation
|
|
10
|
+
*
|
|
11
|
+
* The scoring is deterministic: same findings → same score.
|
|
12
|
+
*/
|
|
13
|
+
export function calculateCategoryScore(category, findings) {
|
|
14
|
+
const categoryFindings = findings.filter((f) => f.category === category);
|
|
15
|
+
let score = 100;
|
|
16
|
+
for (const finding of categoryFindings) {
|
|
17
|
+
const basePenalty = SEVERITY_PENALTIES[finding.severity] ?? 0;
|
|
18
|
+
// Weight penalty by confidence so heuristic findings (confidence < 1) have
|
|
19
|
+
// proportionally less impact than fully deterministic findings (confidence ~1).
|
|
20
|
+
const penalty = basePenalty * finding.confidence;
|
|
21
|
+
score -= penalty;
|
|
22
|
+
}
|
|
23
|
+
score = Math.max(0, Math.min(100, score));
|
|
24
|
+
return {
|
|
25
|
+
category,
|
|
26
|
+
score: Math.round(score),
|
|
27
|
+
maxScore: 100,
|
|
28
|
+
weight: CATEGORY_WEIGHTS[category] ?? 0,
|
|
29
|
+
findingCount: categoryFindings.length,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Classify a score into a health band.
|
|
34
|
+
*/
|
|
35
|
+
export function classifyScore(score) {
|
|
36
|
+
if (score >= 90)
|
|
37
|
+
return 'excellent';
|
|
38
|
+
if (score >= 75)
|
|
39
|
+
return 'healthy';
|
|
40
|
+
if (score >= 60)
|
|
41
|
+
return 'fair';
|
|
42
|
+
if (score >= 40)
|
|
43
|
+
return 'needs-attention';
|
|
44
|
+
return 'critical';
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Calculate the full health score from all findings and analyzer results.
|
|
48
|
+
*/
|
|
49
|
+
export function calculateHealthScore(findings, _analyzerResults) {
|
|
50
|
+
const categoryScores = CATEGORIES.map((cat) => calculateCategoryScore(cat, findings));
|
|
51
|
+
// Weighted average (only include categories with non-zero weight)
|
|
52
|
+
let weightedSum = 0;
|
|
53
|
+
let totalWeight = 0;
|
|
54
|
+
for (const cs of categoryScores) {
|
|
55
|
+
if (cs.weight > 0) {
|
|
56
|
+
weightedSum += cs.score * cs.weight;
|
|
57
|
+
totalWeight += cs.weight;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const overall = totalWeight > 0 ? Math.round(weightedSum / totalWeight) : 100;
|
|
61
|
+
const clampedOverall = Math.max(0, Math.min(100, overall));
|
|
62
|
+
return {
|
|
63
|
+
overall: clampedOverall,
|
|
64
|
+
band: classifyScore(clampedOverall),
|
|
65
|
+
categories: categoryScores,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get the human-readable label for a health band.
|
|
70
|
+
*/
|
|
71
|
+
export function bandLabel(band) {
|
|
72
|
+
const labels = {
|
|
73
|
+
critical: 'Critical',
|
|
74
|
+
'needs-attention': 'Needs Attention',
|
|
75
|
+
fair: 'Fair',
|
|
76
|
+
healthy: 'Healthy',
|
|
77
|
+
excellent: 'Excellent',
|
|
78
|
+
};
|
|
79
|
+
return labels[band];
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=score.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"score.js","sourceRoot":"","sources":["../../src/scoring/score.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGpD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEpE;;;;;;;;;GASG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAAkB,EAAE,QAAmB;IAC5E,MAAM,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IACzE,IAAI,KAAK,GAAG,GAAG,CAAC;IAEhB,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;QACvC,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC9D,2EAA2E;QAC3E,gFAAgF;QAChF,MAAM,OAAO,GAAG,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;QACjD,KAAK,IAAI,OAAO,CAAC;IACnB,CAAC;IAED,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;IAE1C,OAAO;QACL,QAAQ;QACR,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QACxB,QAAQ,EAAE,GAAG;QACb,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC;QACvC,YAAY,EAAE,gBAAgB,CAAC,MAAM;KACtC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,WAAW,CAAC;IACpC,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,SAAS,CAAC;IAClC,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,MAAM,CAAC;IAC/B,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,iBAAiB,CAAC;IAC1C,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAAmB,EACnB,gBAAkC;IAElC,MAAM,cAAc,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,sBAAsB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEtF,kEAAkE;IAClE,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,KAAK,MAAM,EAAE,IAAI,cAAc,EAAE,CAAC;QAChC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClB,WAAW,IAAI,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,MAAM,CAAC;YACpC,WAAW,IAAI,EAAE,CAAC,MAAM,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC9E,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;IAE3D,OAAO;QACL,OAAO,EAAE,cAAc;QACvB,IAAI,EAAE,aAAa,CAAC,cAAc,CAAC;QACnC,UAAU,EAAE,cAAc;KAC3B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,IAAyB;IACjD,MAAM,MAAM,GAAwC;QAClD,QAAQ,EAAE,UAAU;QACpB,iBAAiB,EAAE,iBAAiB;QACpC,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,SAAS;QAClB,SAAS,EAAE,WAAW;KACvB,CAAC;IACF,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Category } from '../rules/categories.js';
|
|
2
|
+
/**
|
|
3
|
+
* Scoring weights for each category.
|
|
4
|
+
* Must sum to 1.0 (100%).
|
|
5
|
+
*/
|
|
6
|
+
export declare const CATEGORY_WEIGHTS: Record<Category, number>;
|
|
7
|
+
/**
|
|
8
|
+
* Penalty points deducted from a category score per finding severity.
|
|
9
|
+
*/
|
|
10
|
+
export declare const SEVERITY_PENALTIES: Record<string, number>;
|
|
11
|
+
//# sourceMappingURL=weights.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"weights.d.ts","sourceRoot":"","sources":["../../src/scoring/weights.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAEvD;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAUrD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAMrD,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scoring weights for each category.
|
|
3
|
+
* Must sum to 1.0 (100%).
|
|
4
|
+
*/
|
|
5
|
+
export const CATEGORY_WEIGHTS = {
|
|
6
|
+
security: 0.2,
|
|
7
|
+
git: 0.15,
|
|
8
|
+
project: 0.15,
|
|
9
|
+
dependencies: 0.1,
|
|
10
|
+
testing: 0.15,
|
|
11
|
+
documentation: 0.1,
|
|
12
|
+
quality: 0.1,
|
|
13
|
+
cicd: 0.05,
|
|
14
|
+
architecture: 0.0, // Architecture is observational in v0.1; doesn't affect score
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Penalty points deducted from a category score per finding severity.
|
|
18
|
+
*/
|
|
19
|
+
export const SEVERITY_PENALTIES = {
|
|
20
|
+
critical: 30,
|
|
21
|
+
high: 15,
|
|
22
|
+
medium: 8,
|
|
23
|
+
low: 3,
|
|
24
|
+
info: 0,
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=weights.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"weights.js","sourceRoot":"","sources":["../../src/scoring/weights.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAA6B;IACxD,QAAQ,EAAE,GAAG;IACb,GAAG,EAAE,IAAI;IACT,OAAO,EAAE,IAAI;IACb,YAAY,EAAE,GAAG;IACjB,OAAO,EAAE,IAAI;IACb,aAAa,EAAE,GAAG;IAClB,OAAO,EAAE,GAAG;IACZ,IAAI,EAAE,IAAI;IACV,YAAY,EAAE,GAAG,EAAE,8DAA8D;CAClF,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAA2B;IACxD,QAAQ,EAAE,EAAE;IACZ,IAAI,EAAE,EAAE;IACR,MAAM,EAAE,CAAC;IACT,GAAG,EAAE,CAAC;IACN,IAAI,EAAE,CAAC;CACR,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extensions considered as source code files.
|
|
3
|
+
*/
|
|
4
|
+
export declare const SOURCE_EXTENSIONS: Set<string>;
|
|
5
|
+
/**
|
|
6
|
+
* Extensions considered as config files.
|
|
7
|
+
*/
|
|
8
|
+
export declare const CONFIG_EXTENSIONS: Set<string>;
|
|
9
|
+
/**
|
|
10
|
+
* Binary file extensions to skip during text analysis.
|
|
11
|
+
*/
|
|
12
|
+
export declare const BINARY_EXTENSIONS: Set<string>;
|
|
13
|
+
/**
|
|
14
|
+
* Directories to always ignore during scanning.
|
|
15
|
+
*/
|
|
16
|
+
export declare const IGNORED_DIRECTORIES: string[];
|
|
17
|
+
/**
|
|
18
|
+
* Glob patterns for ignored directories used with fast-glob.
|
|
19
|
+
*/
|
|
20
|
+
export declare const IGNORE_GLOB_PATTERNS: string[];
|
|
21
|
+
/**
|
|
22
|
+
* Check whether a file path is binary based on its extension.
|
|
23
|
+
*/
|
|
24
|
+
export declare function isBinaryExtension(filePath: string): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Check whether a file path is a source file.
|
|
27
|
+
*/
|
|
28
|
+
export declare function isSourceExtension(filePath: string): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Check whether a file path is a config file.
|
|
31
|
+
*/
|
|
32
|
+
export declare function isConfigExtension(filePath: string): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Safely check if a path exists (file or directory).
|
|
35
|
+
*/
|
|
36
|
+
export declare function pathExists(p: string): Promise<boolean>;
|
|
37
|
+
/**
|
|
38
|
+
* Safely read a file as text. Returns null on any error.
|
|
39
|
+
* Skips binary files.
|
|
40
|
+
* Enforces a max size limit to prevent memory issues.
|
|
41
|
+
*/
|
|
42
|
+
export declare function readFileSafe(filePath: string, maxBytes?: number): Promise<string | null>;
|
|
43
|
+
/**
|
|
44
|
+
* Safely read a file as JSON. Returns null on any error.
|
|
45
|
+
*/
|
|
46
|
+
export declare function readJsonSafe<T>(filePath: string): Promise<T | null>;
|
|
47
|
+
/**
|
|
48
|
+
* Get file size in bytes. Returns 0 on error.
|
|
49
|
+
*/
|
|
50
|
+
export declare function getFileSize(filePath: string): Promise<number>;
|
|
51
|
+
/**
|
|
52
|
+
* Count the number of lines in a file without loading the whole thing.
|
|
53
|
+
* Uses a stream for large files. Returns 0 on error.
|
|
54
|
+
*/
|
|
55
|
+
export declare function countLines(filePath: string): Promise<number>;
|
|
56
|
+
/**
|
|
57
|
+
* Resolve and normalize a path relative to a root, protecting against traversal.
|
|
58
|
+
* Returns null if the resolved path escapes the root.
|
|
59
|
+
*/
|
|
60
|
+
export declare function resolveRepositoryPath(root: string, relativePath: string): string | null;
|
|
61
|
+
/**
|
|
62
|
+
* Compute the depth of a relative path (number of directory separators).
|
|
63
|
+
*/
|
|
64
|
+
export declare function pathDepth(relativePath: string): number;
|
|
65
|
+
//# sourceMappingURL=filesystem.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem.d.ts","sourceRoot":"","sources":["../../src/utils/filesystem.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,eAAO,MAAM,iBAAiB,aA8B5B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,iBAAiB,aAa5B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,iBAAiB,aAgE5B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,mBAAmB,UA4B/B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,UAqBhC,CAAC;AAEF;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAG3D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAG3D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAG3D;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO5D;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,QAAQ,SAAc,GACrB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAYxB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAQzE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAOnE;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiBlE;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAIvF;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAEtD"}
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import fs from 'node:fs/promises';
|
|
3
|
+
import { createReadStream } from 'node:fs';
|
|
4
|
+
/**
|
|
5
|
+
* Extensions considered as source code files.
|
|
6
|
+
*/
|
|
7
|
+
export const SOURCE_EXTENSIONS = new Set([
|
|
8
|
+
'.ts',
|
|
9
|
+
'.tsx',
|
|
10
|
+
'.js',
|
|
11
|
+
'.jsx',
|
|
12
|
+
'.mjs',
|
|
13
|
+
'.cjs',
|
|
14
|
+
'.py',
|
|
15
|
+
'.pyw',
|
|
16
|
+
'.go',
|
|
17
|
+
'.rs',
|
|
18
|
+
'.java',
|
|
19
|
+
'.kt',
|
|
20
|
+
'.groovy',
|
|
21
|
+
'.rb',
|
|
22
|
+
'.php',
|
|
23
|
+
'.cs',
|
|
24
|
+
'.c',
|
|
25
|
+
'.cpp',
|
|
26
|
+
'.cc',
|
|
27
|
+
'.h',
|
|
28
|
+
'.hpp',
|
|
29
|
+
'.swift',
|
|
30
|
+
'.dart',
|
|
31
|
+
'.scala',
|
|
32
|
+
'.r',
|
|
33
|
+
'.R',
|
|
34
|
+
'.sh',
|
|
35
|
+
'.bash',
|
|
36
|
+
'.zsh',
|
|
37
|
+
]);
|
|
38
|
+
/**
|
|
39
|
+
* Extensions considered as config files.
|
|
40
|
+
*/
|
|
41
|
+
export const CONFIG_EXTENSIONS = new Set([
|
|
42
|
+
'.json',
|
|
43
|
+
'.yaml',
|
|
44
|
+
'.yml',
|
|
45
|
+
'.toml',
|
|
46
|
+
'.ini',
|
|
47
|
+
'.cfg',
|
|
48
|
+
'.env',
|
|
49
|
+
'.env.local',
|
|
50
|
+
'.env.example',
|
|
51
|
+
'.env.sample',
|
|
52
|
+
'.xml',
|
|
53
|
+
'.properties',
|
|
54
|
+
]);
|
|
55
|
+
/**
|
|
56
|
+
* Binary file extensions to skip during text analysis.
|
|
57
|
+
*/
|
|
58
|
+
export const BINARY_EXTENSIONS = new Set([
|
|
59
|
+
// Images
|
|
60
|
+
'.png',
|
|
61
|
+
'.jpg',
|
|
62
|
+
'.jpeg',
|
|
63
|
+
'.gif',
|
|
64
|
+
'.bmp',
|
|
65
|
+
'.ico',
|
|
66
|
+
'.webp',
|
|
67
|
+
'.svg',
|
|
68
|
+
'.avif',
|
|
69
|
+
// Video
|
|
70
|
+
'.mp4',
|
|
71
|
+
'.mov',
|
|
72
|
+
'.avi',
|
|
73
|
+
'.mkv',
|
|
74
|
+
'.webm',
|
|
75
|
+
// Audio
|
|
76
|
+
'.mp3',
|
|
77
|
+
'.wav',
|
|
78
|
+
'.flac',
|
|
79
|
+
'.ogg',
|
|
80
|
+
// Archives
|
|
81
|
+
'.zip',
|
|
82
|
+
'.tar',
|
|
83
|
+
'.gz',
|
|
84
|
+
'.bz2',
|
|
85
|
+
'.xz',
|
|
86
|
+
'.7z',
|
|
87
|
+
'.rar',
|
|
88
|
+
// Executables / compiled
|
|
89
|
+
'.exe',
|
|
90
|
+
'.dll',
|
|
91
|
+
'.so',
|
|
92
|
+
'.dylib',
|
|
93
|
+
'.bin',
|
|
94
|
+
'.wasm',
|
|
95
|
+
// Fonts
|
|
96
|
+
'.ttf',
|
|
97
|
+
'.otf',
|
|
98
|
+
'.woff',
|
|
99
|
+
'.woff2',
|
|
100
|
+
'.eot',
|
|
101
|
+
// Documents
|
|
102
|
+
'.pdf',
|
|
103
|
+
'.doc',
|
|
104
|
+
'.docx',
|
|
105
|
+
'.xls',
|
|
106
|
+
'.xlsx',
|
|
107
|
+
'.ppt',
|
|
108
|
+
'.pptx',
|
|
109
|
+
// Keys and certs (handle separately in security)
|
|
110
|
+
'.pem',
|
|
111
|
+
'.crt',
|
|
112
|
+
'.cer',
|
|
113
|
+
'.p12',
|
|
114
|
+
'.pfx',
|
|
115
|
+
// Other
|
|
116
|
+
'.lock', // lockfiles are text but not analyzed as source
|
|
117
|
+
'.map',
|
|
118
|
+
'.min.js',
|
|
119
|
+
'.pyc',
|
|
120
|
+
'.class',
|
|
121
|
+
'.jar',
|
|
122
|
+
]);
|
|
123
|
+
/**
|
|
124
|
+
* Directories to always ignore during scanning.
|
|
125
|
+
*/
|
|
126
|
+
export const IGNORED_DIRECTORIES = [
|
|
127
|
+
'.git',
|
|
128
|
+
'.fathom',
|
|
129
|
+
'node_modules',
|
|
130
|
+
'dist',
|
|
131
|
+
'build',
|
|
132
|
+
'coverage',
|
|
133
|
+
'.next',
|
|
134
|
+
'.nuxt',
|
|
135
|
+
'target',
|
|
136
|
+
'vendor',
|
|
137
|
+
'.cache',
|
|
138
|
+
'__pycache__',
|
|
139
|
+
'.mypy_cache',
|
|
140
|
+
'.pytest_cache',
|
|
141
|
+
'.tox',
|
|
142
|
+
'venv',
|
|
143
|
+
'.venv',
|
|
144
|
+
'env',
|
|
145
|
+
'.env',
|
|
146
|
+
'.eggs',
|
|
147
|
+
'*.egg-info',
|
|
148
|
+
'.gradle',
|
|
149
|
+
'.mvn',
|
|
150
|
+
'out',
|
|
151
|
+
'.idea',
|
|
152
|
+
'.vscode',
|
|
153
|
+
'.DS_Store',
|
|
154
|
+
];
|
|
155
|
+
/**
|
|
156
|
+
* Glob patterns for ignored directories used with fast-glob.
|
|
157
|
+
*/
|
|
158
|
+
export const IGNORE_GLOB_PATTERNS = [
|
|
159
|
+
'**/.git/**',
|
|
160
|
+
'**/.fathom/**',
|
|
161
|
+
'**/node_modules/**',
|
|
162
|
+
'**/dist/**',
|
|
163
|
+
'**/build/**',
|
|
164
|
+
'**/coverage/**',
|
|
165
|
+
'**/.next/**',
|
|
166
|
+
'**/.nuxt/**',
|
|
167
|
+
'**/target/**',
|
|
168
|
+
'**/vendor/**',
|
|
169
|
+
'**/.cache/**',
|
|
170
|
+
'**/__pycache__/**',
|
|
171
|
+
'**/.mypy_cache/**',
|
|
172
|
+
'**/.pytest_cache/**',
|
|
173
|
+
'**/.tox/**',
|
|
174
|
+
'**/venv/**',
|
|
175
|
+
'**/.venv/**',
|
|
176
|
+
'**/.eggs/**',
|
|
177
|
+
'**/.gradle/**',
|
|
178
|
+
'**/out/**',
|
|
179
|
+
];
|
|
180
|
+
/**
|
|
181
|
+
* Check whether a file path is binary based on its extension.
|
|
182
|
+
*/
|
|
183
|
+
export function isBinaryExtension(filePath) {
|
|
184
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
185
|
+
return BINARY_EXTENSIONS.has(ext);
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Check whether a file path is a source file.
|
|
189
|
+
*/
|
|
190
|
+
export function isSourceExtension(filePath) {
|
|
191
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
192
|
+
return SOURCE_EXTENSIONS.has(ext);
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Check whether a file path is a config file.
|
|
196
|
+
*/
|
|
197
|
+
export function isConfigExtension(filePath) {
|
|
198
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
199
|
+
return CONFIG_EXTENSIONS.has(ext);
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Safely check if a path exists (file or directory).
|
|
203
|
+
*/
|
|
204
|
+
export async function pathExists(p) {
|
|
205
|
+
try {
|
|
206
|
+
await fs.access(p);
|
|
207
|
+
return true;
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Safely read a file as text. Returns null on any error.
|
|
215
|
+
* Skips binary files.
|
|
216
|
+
* Enforces a max size limit to prevent memory issues.
|
|
217
|
+
*/
|
|
218
|
+
export async function readFileSafe(filePath, maxBytes = 1024 * 1024) {
|
|
219
|
+
try {
|
|
220
|
+
if (isBinaryExtension(filePath))
|
|
221
|
+
return null;
|
|
222
|
+
const stat = await fs.stat(filePath);
|
|
223
|
+
if (!stat.isFile())
|
|
224
|
+
return null;
|
|
225
|
+
if (stat.size > maxBytes)
|
|
226
|
+
return null;
|
|
227
|
+
return await fs.readFile(filePath, 'utf8');
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
return null;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Safely read a file as JSON. Returns null on any error.
|
|
235
|
+
*/
|
|
236
|
+
export async function readJsonSafe(filePath) {
|
|
237
|
+
const content = await readFileSafe(filePath, 512 * 1024);
|
|
238
|
+
if (!content)
|
|
239
|
+
return null;
|
|
240
|
+
try {
|
|
241
|
+
return JSON.parse(content);
|
|
242
|
+
}
|
|
243
|
+
catch {
|
|
244
|
+
return null;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Get file size in bytes. Returns 0 on error.
|
|
249
|
+
*/
|
|
250
|
+
export async function getFileSize(filePath) {
|
|
251
|
+
try {
|
|
252
|
+
const stat = await fs.stat(filePath);
|
|
253
|
+
return stat.size;
|
|
254
|
+
}
|
|
255
|
+
catch {
|
|
256
|
+
return 0;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Count the number of lines in a file without loading the whole thing.
|
|
261
|
+
* Uses a stream for large files. Returns 0 on error.
|
|
262
|
+
*/
|
|
263
|
+
export async function countLines(filePath) {
|
|
264
|
+
return new Promise((resolve) => {
|
|
265
|
+
let count = 0;
|
|
266
|
+
try {
|
|
267
|
+
const stream = createReadStream(filePath, { encoding: 'utf8' });
|
|
268
|
+
stream.on('data', (chunk) => {
|
|
269
|
+
const text = typeof chunk === 'string' ? chunk : chunk.toString('utf8');
|
|
270
|
+
for (const c of text) {
|
|
271
|
+
if (c === '\n')
|
|
272
|
+
count++;
|
|
273
|
+
}
|
|
274
|
+
});
|
|
275
|
+
stream.on('end', () => resolve(count + 1));
|
|
276
|
+
stream.on('error', () => resolve(0));
|
|
277
|
+
}
|
|
278
|
+
catch {
|
|
279
|
+
resolve(0);
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Resolve and normalize a path relative to a root, protecting against traversal.
|
|
285
|
+
* Returns null if the resolved path escapes the root.
|
|
286
|
+
*/
|
|
287
|
+
export function resolveRepositoryPath(root, relativePath) {
|
|
288
|
+
const resolved = path.resolve(root, relativePath);
|
|
289
|
+
if (!resolved.startsWith(path.resolve(root)))
|
|
290
|
+
return null;
|
|
291
|
+
return resolved;
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Compute the depth of a relative path (number of directory separators).
|
|
295
|
+
*/
|
|
296
|
+
export function pathDepth(relativePath) {
|
|
297
|
+
return relativePath.split(path.sep).length - 1;
|
|
298
|
+
}
|
|
299
|
+
//# sourceMappingURL=filesystem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../src/utils/filesystem.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Result of a Git command execution.
|
|
3
|
+
*/
|
|
4
|
+
export interface GitCommandResult {
|
|
5
|
+
stdout: string;
|
|
6
|
+
stderr: string;
|
|
7
|
+
exitCode: number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Check whether the directory is a Git repository.
|
|
11
|
+
*
|
|
12
|
+
* We use `--absolute-git-dir` and verify the returned path is within
|
|
13
|
+
* `root` so that subdirectories nested inside a parent repo are not
|
|
14
|
+
* mistakenly reported as repos (e.g. test fixtures living inside Fathom).
|
|
15
|
+
*/
|
|
16
|
+
export declare function isGitRepository(root: string): Promise<boolean>;
|
|
17
|
+
/**
|
|
18
|
+
* Check whether the repository has any commits.
|
|
19
|
+
*/
|
|
20
|
+
export declare function hasCommits(root: string): Promise<boolean>;
|
|
21
|
+
/**
|
|
22
|
+
* Get the list of files tracked by Git.
|
|
23
|
+
* Returns an empty array if not a Git repository.
|
|
24
|
+
*/
|
|
25
|
+
export declare function getTrackedFiles(root: string): Promise<string[]>;
|
|
26
|
+
/**
|
|
27
|
+
* Check whether the working directory has uncommitted changes.
|
|
28
|
+
*/
|
|
29
|
+
export declare function hasUncommittedChanges(root: string): Promise<boolean>;
|
|
30
|
+
/**
|
|
31
|
+
* Get the list of large tracked files above a size threshold (bytes).
|
|
32
|
+
* Uses git cat-file to check sizes of tracked blobs.
|
|
33
|
+
*/
|
|
34
|
+
export declare function getLargeTrackedFiles(root: string, thresholdBytes: number): Promise<{
|
|
35
|
+
file: string;
|
|
36
|
+
sizeBytes: number;
|
|
37
|
+
}[]>;
|
|
38
|
+
/**
|
|
39
|
+
* Read the raw content of .gitignore. Returns null if not found.
|
|
40
|
+
*/
|
|
41
|
+
export declare function readGitignoreContent(root: string): Promise<string | null>;
|
|
42
|
+
/**
|
|
43
|
+
* Check whether a given path pattern is mentioned in .gitignore content.
|
|
44
|
+
* This is a simplified heuristic — not a full gitignore pattern parser.
|
|
45
|
+
*/
|
|
46
|
+
export declare function isPathMentionedInGitignore(gitignoreContent: string, targetPattern: string): boolean;
|
|
47
|
+
//# sourceMappingURL=git.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AA8BD;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOpE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAG/D;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAIrE;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAG1E;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CA0BhD;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAG/E;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,gBAAgB,EAAE,MAAM,EACxB,aAAa,EAAE,MAAM,GACpB,OAAO,CAYT"}
|