@buoy-design/core 0.1.7 → 0.1.9
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/dist/analysis/analyzers/accessibility-analyzer.d.ts +22 -0
- package/dist/analysis/analyzers/accessibility-analyzer.d.ts.map +1 -0
- package/dist/analysis/analyzers/accessibility-analyzer.js +127 -0
- package/dist/analysis/analyzers/accessibility-analyzer.js.map +1 -0
- package/dist/analysis/analyzers/duplicate-detector.d.ts +44 -0
- package/dist/analysis/analyzers/duplicate-detector.d.ts.map +1 -0
- package/dist/analysis/analyzers/duplicate-detector.js +137 -0
- package/dist/analysis/analyzers/duplicate-detector.js.map +1 -0
- package/dist/analysis/analyzers/index.d.ts +5 -0
- package/dist/analysis/analyzers/index.d.ts.map +1 -0
- package/dist/analysis/analyzers/index.js +5 -0
- package/dist/analysis/analyzers/index.js.map +1 -0
- package/dist/analysis/analyzers/naming-analyzer.d.ts +43 -0
- package/dist/analysis/analyzers/naming-analyzer.d.ts.map +1 -0
- package/dist/analysis/analyzers/naming-analyzer.js +70 -0
- package/dist/analysis/analyzers/naming-analyzer.js.map +1 -0
- package/dist/analysis/analyzers/prop-analyzer.d.ts +60 -0
- package/dist/analysis/analyzers/prop-analyzer.d.ts.map +1 -0
- package/dist/analysis/analyzers/prop-analyzer.js +130 -0
- package/dist/analysis/analyzers/prop-analyzer.js.map +1 -0
- package/dist/analysis/audit.d.ts +10 -0
- package/dist/analysis/audit.d.ts.map +1 -1
- package/dist/analysis/audit.js +22 -15
- package/dist/analysis/audit.js.map +1 -1
- package/dist/analysis/semantic-diff.d.ts +20 -68
- package/dist/analysis/semantic-diff.d.ts.map +1 -1
- package/dist/analysis/semantic-diff.js +213 -767
- package/dist/analysis/semantic-diff.js.map +1 -1
- package/dist/analysis/utils/color-contrast.d.ts +52 -0
- package/dist/analysis/utils/color-contrast.d.ts.map +1 -0
- package/dist/analysis/utils/color-contrast.js +109 -0
- package/dist/analysis/utils/color-contrast.js.map +1 -0
- package/dist/analysis/utils/index.d.ts +2 -0
- package/dist/analysis/utils/index.d.ts.map +1 -0
- package/dist/analysis/utils/index.js +2 -0
- package/dist/analysis/utils/index.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prop Type Analyzer
|
|
3
|
+
*
|
|
4
|
+
* Analyzes prop type consistency and naming conventions across components.
|
|
5
|
+
* Detects inconsistencies where the same prop name uses different types
|
|
6
|
+
* in different components.
|
|
7
|
+
*/
|
|
8
|
+
import { NAMING_CONFIG } from "../config.js";
|
|
9
|
+
/**
|
|
10
|
+
* Build a map of prop names to their types across all components
|
|
11
|
+
*/
|
|
12
|
+
export function buildPropTypeMap(components) {
|
|
13
|
+
const map = new Map();
|
|
14
|
+
for (const comp of components) {
|
|
15
|
+
for (const prop of comp.props) {
|
|
16
|
+
const normalizedName = prop.name.toLowerCase();
|
|
17
|
+
if (!map.has(normalizedName)) {
|
|
18
|
+
map.set(normalizedName, { types: new Map(), total: 0 });
|
|
19
|
+
}
|
|
20
|
+
const usage = map.get(normalizedName);
|
|
21
|
+
const typeCount = usage.types.get(prop.type) || {
|
|
22
|
+
count: 0,
|
|
23
|
+
examples: [],
|
|
24
|
+
};
|
|
25
|
+
typeCount.count++;
|
|
26
|
+
if (typeCount.examples.length < 3) {
|
|
27
|
+
typeCount.examples.push(comp.name);
|
|
28
|
+
}
|
|
29
|
+
usage.types.set(prop.type, typeCount);
|
|
30
|
+
usage.total++;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return map;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Check if a prop's type conflicts with the dominant type for that prop name
|
|
37
|
+
*/
|
|
38
|
+
export function checkPropTypeConsistency(prop, propTypeMap) {
|
|
39
|
+
const usage = propTypeMap.get(prop.name.toLowerCase());
|
|
40
|
+
if (!usage || usage.total < 3)
|
|
41
|
+
return null; // Not enough data
|
|
42
|
+
// Find dominant type
|
|
43
|
+
let dominantType = "";
|
|
44
|
+
let dominantCount = 0;
|
|
45
|
+
for (const [type, data] of usage.types) {
|
|
46
|
+
if (data.count > dominantCount) {
|
|
47
|
+
dominantType = type;
|
|
48
|
+
dominantCount = data.count;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Only flag if this prop's type differs and dominant exceeds threshold
|
|
52
|
+
if (prop.type === dominantType)
|
|
53
|
+
return null;
|
|
54
|
+
if (dominantCount / usage.total <
|
|
55
|
+
NAMING_CONFIG.establishedConventionThreshold) {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
const examples = usage.types.get(dominantType)?.examples || [];
|
|
59
|
+
return { dominantType, examples };
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Build a map of semantic prop purposes to their naming patterns
|
|
63
|
+
*/
|
|
64
|
+
export function buildPropNamingMap(components) {
|
|
65
|
+
const map = new Map();
|
|
66
|
+
// Group props by semantic purpose
|
|
67
|
+
const clickHandlers = [];
|
|
68
|
+
const changeHandlers = [];
|
|
69
|
+
for (const comp of components) {
|
|
70
|
+
for (const prop of comp.props) {
|
|
71
|
+
const lower = prop.name.toLowerCase();
|
|
72
|
+
if (lower.includes("click") || lower.includes("press")) {
|
|
73
|
+
clickHandlers.push(prop.name);
|
|
74
|
+
}
|
|
75
|
+
if (lower.includes("change")) {
|
|
76
|
+
changeHandlers.push(prop.name);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
map.set("click", clickHandlers);
|
|
81
|
+
map.set("change", changeHandlers);
|
|
82
|
+
return map;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Find the dominant prefix pattern in a list of prop names
|
|
86
|
+
*/
|
|
87
|
+
export function findDominantPropPattern(propNames) {
|
|
88
|
+
const prefixes = {};
|
|
89
|
+
for (const name of propNames) {
|
|
90
|
+
if (name.startsWith("on"))
|
|
91
|
+
prefixes["on"] = (prefixes["on"] || 0) + 1;
|
|
92
|
+
else if (name.startsWith("handle"))
|
|
93
|
+
prefixes["handle"] = (prefixes["handle"] || 0) + 1;
|
|
94
|
+
}
|
|
95
|
+
let dominant = null;
|
|
96
|
+
for (const [prefix, count] of Object.entries(prefixes)) {
|
|
97
|
+
if (!dominant || count > dominant.count) {
|
|
98
|
+
dominant = { prefix, count };
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return dominant;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Check prop naming consistency for a component against project patterns
|
|
105
|
+
*/
|
|
106
|
+
export function checkPropNamingConsistency(component, propNamingMap) {
|
|
107
|
+
const issues = [];
|
|
108
|
+
for (const prop of component.props) {
|
|
109
|
+
const lower = prop.name.toLowerCase();
|
|
110
|
+
// Check click handler naming
|
|
111
|
+
if (lower.includes("click") || lower.includes("press")) {
|
|
112
|
+
const allClickHandlers = propNamingMap.get("click") || [];
|
|
113
|
+
if (allClickHandlers.length >= 5) {
|
|
114
|
+
const dominant = findDominantPropPattern(allClickHandlers);
|
|
115
|
+
if (dominant && !prop.name.startsWith(dominant.prefix)) {
|
|
116
|
+
const dominantPct = Math.round((dominant.count / allClickHandlers.length) * 100);
|
|
117
|
+
if (dominantPct >= 70) {
|
|
118
|
+
issues.push({
|
|
119
|
+
propName: prop.name,
|
|
120
|
+
message: `"${prop.name}" in "${component.name}" - ${dominantPct}% of click handlers use "${dominant.prefix}..." pattern`,
|
|
121
|
+
suggestion: `Consider using "${dominant.prefix}${prop.name.replace(/^(on|handle)/i, "")}" for consistency`,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return issues;
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=prop-analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prop-analyzer.js","sourceRoot":"","sources":["../../../src/analysis/analyzers/prop-analyzer.ts"],"names":[],"mappings":"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"}
|
package/dist/analysis/audit.d.ts
CHANGED
|
@@ -42,6 +42,16 @@ export declare function generateAuditReport(values: AuditValue[]): AuditReport;
|
|
|
42
42
|
export declare function findCloseMatches(foundValues: string[], designTokens: string[], category: 'color' | 'spacing' | 'typography' | 'radius'): CloseMatch[];
|
|
43
43
|
/**
|
|
44
44
|
* Calculate health score (0-100) from audit report
|
|
45
|
+
*
|
|
46
|
+
* The score reflects how "clean" the codebase is:
|
|
47
|
+
* - 100 = No hardcoded design values found (using tokens properly)
|
|
48
|
+
* - Lower scores = More hardcoded values that should be tokens
|
|
49
|
+
*
|
|
50
|
+
* Penalties:
|
|
51
|
+
* - Each unique hardcoded value: -3 points
|
|
52
|
+
* - Each file with issues: -1 point
|
|
53
|
+
* - Extra penalty for files with many issues: -0.5 per issue over 5
|
|
54
|
+
* - Close matches (typos): -5 points each
|
|
45
55
|
*/
|
|
46
56
|
export declare function calculateHealthScore(report: AuditReport): number;
|
|
47
57
|
//# sourceMappingURL=audit.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/analysis/audit.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,YAAY,GAAG,QAAQ,CAAC;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC1C,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,MAAM,EAAE;QACN,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,WAAW,CAoErE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EAAE,EACrB,YAAY,EAAE,MAAM,EAAE,EACtB,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,YAAY,GAAG,QAAQ,GACtD,UAAU,EAAE,CAoCd;AA0DD
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/analysis/audit.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,YAAY,GAAG,QAAQ,CAAC;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC1C,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,MAAM,EAAE;QACN,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,WAAW,CAoErE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EAAE,EACrB,YAAY,EAAE,MAAM,EAAE,EACtB,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,YAAY,GAAG,QAAQ,GACtD,UAAU,EAAE,CAoCd;AA0DD;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CA2BhE"}
|
package/dist/analysis/audit.js
CHANGED
|
@@ -139,6 +139,16 @@ function numericDistance(a, b) {
|
|
|
139
139
|
}
|
|
140
140
|
/**
|
|
141
141
|
* Calculate health score (0-100) from audit report
|
|
142
|
+
*
|
|
143
|
+
* The score reflects how "clean" the codebase is:
|
|
144
|
+
* - 100 = No hardcoded design values found (using tokens properly)
|
|
145
|
+
* - Lower scores = More hardcoded values that should be tokens
|
|
146
|
+
*
|
|
147
|
+
* Penalties:
|
|
148
|
+
* - Each unique hardcoded value: -3 points
|
|
149
|
+
* - Each file with issues: -1 point
|
|
150
|
+
* - Extra penalty for files with many issues: -0.5 per issue over 5
|
|
151
|
+
* - Close matches (typos): -5 points each
|
|
142
152
|
*/
|
|
143
153
|
export function calculateHealthScore(report) {
|
|
144
154
|
// Perfect score if no issues
|
|
@@ -146,22 +156,19 @@ export function calculateHealthScore(report) {
|
|
|
146
156
|
return 100;
|
|
147
157
|
}
|
|
148
158
|
let score = 100;
|
|
149
|
-
// Penalize for
|
|
150
|
-
//
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
score -= report.closeMatches.length * 6;
|
|
160
|
-
// Penalize for concentration in worst files
|
|
161
|
-
const worstFile = report.worstFiles[0];
|
|
162
|
-
if (worstFile && worstFile.issueCount > 20) {
|
|
163
|
-
score -= Math.min(20, (worstFile.issueCount - 20) * 0.5);
|
|
159
|
+
// Penalize for each unique hardcoded value
|
|
160
|
+
// 2 values = -6, 10 values = -30, 30 values = -90
|
|
161
|
+
score -= report.totals.uniqueValues * 3;
|
|
162
|
+
// Penalize for each file affected (encourages consolidation)
|
|
163
|
+
score -= report.totals.filesAffected;
|
|
164
|
+
// Extra penalty for files with many hardcoded values
|
|
165
|
+
for (const file of report.worstFiles) {
|
|
166
|
+
if (file.issueCount > 5) {
|
|
167
|
+
score -= (file.issueCount - 5) * 0.5;
|
|
168
|
+
}
|
|
164
169
|
}
|
|
170
|
+
// Penalize for close matches (typos) - these are especially bad
|
|
171
|
+
score -= report.closeMatches.length * 5;
|
|
165
172
|
// Clamp to 0-100
|
|
166
173
|
return Math.max(0, Math.min(100, Math.round(score)));
|
|
167
174
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/analysis/audit.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/analysis/audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Semantic Diff Engine
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates design drift detection by coordinating specialized analyzers.
|
|
5
|
+
* This is the main entry point for comparing components and detecting issues.
|
|
6
|
+
*/
|
|
1
7
|
import type { Component, DesignToken, DriftSignal, Severity } from "../models/index.js";
|
|
2
8
|
import { type TokenSuggestion } from "./token-suggestions.js";
|
|
9
|
+
import { SEMANTIC_COMPONENT_SUFFIXES, VERSION_SUFFIXES_PATTERN } from "./analyzers/duplicate-detector.js";
|
|
3
10
|
export type { TokenSuggestion } from "./token-suggestions.js";
|
|
11
|
+
export { SEMANTIC_COMPONENT_SUFFIXES, VERSION_SUFFIXES_PATTERN };
|
|
4
12
|
export interface ComponentMatch {
|
|
5
13
|
source: Component;
|
|
6
14
|
target: Component;
|
|
@@ -42,7 +50,6 @@ export interface AnalysisOptions {
|
|
|
42
50
|
components?: RegExp;
|
|
43
51
|
tokens?: RegExp;
|
|
44
52
|
};
|
|
45
|
-
/** Available design tokens to suggest as replacements for hardcoded values */
|
|
46
53
|
availableTokens?: DesignToken[];
|
|
47
54
|
}
|
|
48
55
|
export interface FrameworkInfo {
|
|
@@ -53,17 +60,8 @@ export declare class SemanticDiffEngine {
|
|
|
53
60
|
private nameCache;
|
|
54
61
|
private componentMetadataCache;
|
|
55
62
|
private tokenSuggestionService;
|
|
56
|
-
/**
|
|
57
|
-
* Cached version of normalizeComponentName to avoid repeated string operations
|
|
58
|
-
*/
|
|
59
63
|
private cachedNormalizeName;
|
|
60
|
-
/**
|
|
61
|
-
* Get pre-computed component metadata for faster similarity calculations
|
|
62
|
-
*/
|
|
63
64
|
private getComponentMetadata;
|
|
64
|
-
/**
|
|
65
|
-
* Clear caches to prevent memory leaks between operations
|
|
66
|
-
*/
|
|
67
65
|
private clearCaches;
|
|
68
66
|
/**
|
|
69
67
|
* Check for framework sprawl - multiple UI frameworks in one codebase
|
|
@@ -71,7 +69,6 @@ export declare class SemanticDiffEngine {
|
|
|
71
69
|
checkFrameworkSprawl(frameworks: FrameworkInfo[]): DriftSignal | null;
|
|
72
70
|
/**
|
|
73
71
|
* Compare components from different sources (e.g., React vs Figma)
|
|
74
|
-
* Optimized with Map-based indexing for O(n+m) instead of O(n×m)
|
|
75
72
|
*/
|
|
76
73
|
compareComponents(sourceComponents: Component[], targetComponents: Component[], options?: DiffOptions): SemanticDiffResult;
|
|
77
74
|
/**
|
|
@@ -84,78 +81,33 @@ export declare class SemanticDiffEngine {
|
|
|
84
81
|
analyzeComponents(components: Component[], options?: AnalysisOptions): {
|
|
85
82
|
drifts: DriftSignal[];
|
|
86
83
|
};
|
|
87
|
-
/**
|
|
88
|
-
* Detect the dominant naming patterns in the codebase
|
|
89
|
-
*/
|
|
90
|
-
private detectNamingPatterns;
|
|
91
|
-
private identifyNamingPattern;
|
|
92
|
-
private checkNamingConsistency;
|
|
93
|
-
/**
|
|
94
|
-
* Build a map of prop names to their types across all components
|
|
95
|
-
*/
|
|
96
|
-
private buildPropTypeMap;
|
|
97
|
-
private checkPropTypeConsistency;
|
|
98
|
-
/**
|
|
99
|
-
* Build a map of semantic prop purposes to their naming patterns
|
|
100
|
-
*/
|
|
101
|
-
private buildPropNamingMap;
|
|
102
|
-
private checkPropNamingConsistency;
|
|
103
|
-
private findDominantPropPattern;
|
|
104
|
-
/**
|
|
105
|
-
* Detect potential duplicate components based on similar names.
|
|
106
|
-
* Only flags true duplicates like Button vs ButtonNew or Card vs CardLegacy.
|
|
107
|
-
* Does NOT flag compound components like Button vs ButtonGroup or Card vs CardHeader.
|
|
108
|
-
*/
|
|
109
|
-
private detectPotentialDuplicates;
|
|
110
|
-
/**
|
|
111
|
-
* Extract the base name from a component name, stripping version suffixes.
|
|
112
|
-
* Returns whether the name had a version suffix (indicating potential duplicate).
|
|
113
|
-
*/
|
|
114
|
-
private extractBaseName;
|
|
115
|
-
private createMatch;
|
|
116
|
-
private findBestMatch;
|
|
117
|
-
private calculateSimilarity;
|
|
118
|
-
private stringSimilarity;
|
|
119
|
-
private findDifferences;
|
|
120
|
-
private generateComponentDrifts;
|
|
121
|
-
private componentToDriftSource;
|
|
122
|
-
private tokenToDriftSource;
|
|
123
|
-
private getHighestSeverity;
|
|
124
|
-
private checkAccessibility;
|
|
125
|
-
/**
|
|
126
|
-
* Check for color contrast issues in component
|
|
127
|
-
* Detects foreground/background color pairs that fail WCAG contrast ratios
|
|
128
|
-
*/
|
|
129
|
-
private checkColorContrast;
|
|
130
84
|
/**
|
|
131
85
|
* Check for unused components
|
|
132
|
-
* Components that are defined but never imported/used elsewhere
|
|
133
86
|
*/
|
|
134
87
|
checkUnusedComponents(components: Component[], usageMap: Map<string, number>): DriftSignal[];
|
|
135
88
|
/**
|
|
136
89
|
* Check for unused tokens
|
|
137
|
-
* Design tokens that are defined but never referenced
|
|
138
90
|
*/
|
|
139
91
|
checkUnusedTokens(tokens: DesignToken[], usageMap: Map<string, number>): DriftSignal[];
|
|
140
|
-
/**
|
|
141
|
-
* Find token suggestions for a hardcoded color value
|
|
142
|
-
* Delegates to TokenSuggestionService
|
|
143
|
-
*/
|
|
144
92
|
findColorTokenSuggestions(hardcodedValue: string, tokens: DesignToken[], maxSuggestions?: number): TokenSuggestion[];
|
|
145
|
-
/**
|
|
146
|
-
* Find token suggestions for a hardcoded spacing value
|
|
147
|
-
* Delegates to TokenSuggestionService
|
|
148
|
-
*/
|
|
149
93
|
findSpacingTokenSuggestions(hardcodedValue: string, tokens: DesignToken[], maxSuggestions?: number): TokenSuggestion[];
|
|
150
|
-
/**
|
|
151
|
-
* Generate actionable suggestions for hardcoded values
|
|
152
|
-
* Delegates to TokenSuggestionService
|
|
153
|
-
*/
|
|
154
94
|
generateTokenSuggestions(hardcodedValues: Array<{
|
|
155
95
|
type: string;
|
|
156
96
|
value: string;
|
|
157
97
|
property: string;
|
|
158
98
|
location: string;
|
|
159
99
|
}>, tokens: DesignToken[]): Map<string, TokenSuggestion[]>;
|
|
100
|
+
private analyzeHardcodedValues;
|
|
101
|
+
private createDeprecatedDrift;
|
|
102
|
+
private createNamingDrift;
|
|
103
|
+
private createPropTypeDrift;
|
|
104
|
+
private createMatch;
|
|
105
|
+
private findBestMatch;
|
|
106
|
+
private calculateSimilarity;
|
|
107
|
+
private findDifferences;
|
|
108
|
+
private generateComponentDrifts;
|
|
109
|
+
private componentToDriftSource;
|
|
110
|
+
private tokenToDriftSource;
|
|
111
|
+
private getHighestSeverity;
|
|
160
112
|
}
|
|
161
113
|
//# sourceMappingURL=semantic-diff.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"semantic-diff.d.ts","sourceRoot":"","sources":["../../src/analysis/semantic-diff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,WAAW,EACX,WAAW,EACX,QAAQ,EAET,MAAM,oBAAoB,CAAC;AAO5B,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,wBAAwB,CAAC;AAShC,YAAY,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"semantic-diff.d.ts","sourceRoot":"","sources":["../../src/analysis/semantic-diff.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,WAAW,EACX,WAAW,EACX,QAAQ,EAET,MAAM,oBAAoB,CAAC;AAO5B,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,wBAAwB,CAAC;AAShC,OAAO,EAEL,2BAA2B,EAC3B,wBAAwB,EACzB,MAAM,mCAAmC,CAAC;AAa3C,YAAY,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,2BAA2B,EAAE,wBAAwB,EAAE,CAAC;AAEjE,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,EAAE,SAAS,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IAC3C,WAAW,EAAE,mBAAmB,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,cAAc,EAAE,SAAS,EAAE,CAAC;IAC5B,cAAc,EAAE,SAAS,EAAE,CAAC;IAC5B,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE;QAAE,MAAM,EAAE,WAAW,CAAC;QAAC,MAAM,EAAE,WAAW,CAAA;KAAE,EAAE,CAAC;IACxD,cAAc,EAAE,WAAW,EAAE,CAAC;IAC9B,cAAc,EAAE,WAAW,EAAE,CAAC;IAC9B,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,iBAAiB,CAAC,EAAE;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,eAAe,CAAC,EAAE,WAAW,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,kBAAkB;IAE7B,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,sBAAsB,CAO1B;IAGJ,OAAO,CAAC,sBAAsB,CAAgC;IAE9D,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,oBAAoB;IAe5B,OAAO,CAAC,WAAW;IAKnB;;OAEG;IACH,oBAAoB,CAAC,UAAU,EAAE,aAAa,EAAE,GAAG,WAAW,GAAG,IAAI;IAyCrE;;OAEG;IACH,iBAAiB,CACf,gBAAgB,EAAE,SAAS,EAAE,EAC7B,gBAAgB,EAAE,SAAS,EAAE,EAC7B,OAAO,GAAE,WAAgB,GACxB,kBAAkB;IAsDrB;;OAEG;IACH,aAAa,CACX,YAAY,EAAE,WAAW,EAAE,EAC3B,YAAY,EAAE,WAAW,EAAE,GAC1B,eAAe;IAgElB;;OAEG;IACH,iBAAiB,CACf,UAAU,EAAE,SAAS,EAAE,EACvB,OAAO,GAAE,eAAoB,GAC5B;QAAE,MAAM,EAAE,WAAW,EAAE,CAAA;KAAE;IAyF5B;;OAEG;IACH,qBAAqB,CACnB,UAAU,EAAE,SAAS,EAAE,EACvB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,WAAW,EAAE;IA2BhB;;OAEG;IACH,iBAAiB,CACf,MAAM,EAAE,WAAW,EAAE,EACrB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,WAAW,EAAE;IA4BhB,yBAAyB,CACvB,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,WAAW,EAAE,EACrB,cAAc,SAAI,GACjB,eAAe,EAAE;IAIpB,2BAA2B,CACzB,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,WAAW,EAAE,EACrB,cAAc,SAAI,GACjB,eAAe,EAAE;IAIpB,wBAAwB,CACtB,eAAe,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,EAC3F,MAAM,EAAE,WAAW,EAAE,GACpB,GAAG,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC;IAMjC,OAAO,CAAC,sBAAsB;IAkF9B,OAAO,CAAC,qBAAqB;IAc7B,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,mBAAmB;IAqB3B,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,aAAa;IAsBrB,OAAO,CAAC,mBAAmB;IAwB3B,OAAO,CAAC,eAAe;IAuCvB,OAAO,CAAC,uBAAuB;IAwD/B,OAAO,CAAC,sBAAsB;IAkB9B,OAAO,CAAC,kBAAkB;IAgB1B,OAAO,CAAC,kBAAkB;CAK3B"}
|