@buoy-design/core 0.1.8 → 0.1.10

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.
Files changed (41) hide show
  1. package/dist/analysis/analyzers/accessibility-analyzer.d.ts +22 -0
  2. package/dist/analysis/analyzers/accessibility-analyzer.d.ts.map +1 -0
  3. package/dist/analysis/analyzers/accessibility-analyzer.js +127 -0
  4. package/dist/analysis/analyzers/accessibility-analyzer.js.map +1 -0
  5. package/dist/analysis/analyzers/duplicate-detector.d.ts +44 -0
  6. package/dist/analysis/analyzers/duplicate-detector.d.ts.map +1 -0
  7. package/dist/analysis/analyzers/duplicate-detector.js +137 -0
  8. package/dist/analysis/analyzers/duplicate-detector.js.map +1 -0
  9. package/dist/analysis/analyzers/index.d.ts +5 -0
  10. package/dist/analysis/analyzers/index.d.ts.map +1 -0
  11. package/dist/analysis/analyzers/index.js +5 -0
  12. package/dist/analysis/analyzers/index.js.map +1 -0
  13. package/dist/analysis/analyzers/naming-analyzer.d.ts +43 -0
  14. package/dist/analysis/analyzers/naming-analyzer.d.ts.map +1 -0
  15. package/dist/analysis/analyzers/naming-analyzer.js +70 -0
  16. package/dist/analysis/analyzers/naming-analyzer.js.map +1 -0
  17. package/dist/analysis/analyzers/prop-analyzer.d.ts +60 -0
  18. package/dist/analysis/analyzers/prop-analyzer.d.ts.map +1 -0
  19. package/dist/analysis/analyzers/prop-analyzer.js +130 -0
  20. package/dist/analysis/analyzers/prop-analyzer.js.map +1 -0
  21. package/dist/analysis/drift-aggregator.d.ts +82 -0
  22. package/dist/analysis/drift-aggregator.d.ts.map +1 -0
  23. package/dist/analysis/drift-aggregator.js +241 -0
  24. package/dist/analysis/drift-aggregator.js.map +1 -0
  25. package/dist/analysis/index.d.ts +1 -0
  26. package/dist/analysis/index.d.ts.map +1 -1
  27. package/dist/analysis/index.js +2 -0
  28. package/dist/analysis/index.js.map +1 -1
  29. package/dist/analysis/semantic-diff.d.ts +20 -68
  30. package/dist/analysis/semantic-diff.d.ts.map +1 -1
  31. package/dist/analysis/semantic-diff.js +213 -767
  32. package/dist/analysis/semantic-diff.js.map +1 -1
  33. package/dist/analysis/utils/color-contrast.d.ts +52 -0
  34. package/dist/analysis/utils/color-contrast.d.ts.map +1 -0
  35. package/dist/analysis/utils/color-contrast.js +109 -0
  36. package/dist/analysis/utils/color-contrast.js.map +1 -0
  37. package/dist/analysis/utils/index.d.ts +2 -0
  38. package/dist/analysis/utils/index.d.ts.map +1 -0
  39. package/dist/analysis/utils/index.js +2 -0
  40. package/dist/analysis/utils/index.js.map +1 -0
  41. 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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"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Drift Aggregator
3
+ *
4
+ * Post-processing layer that groups raw drift signals for actionability
5
+ * while preserving total counts for severity scoring.
6
+ */
7
+ import type { DriftSignal } from "../models/index.js";
8
+ export interface DriftGroup {
9
+ /** Unique ID for this group */
10
+ id: string;
11
+ /** What grouped these signals together */
12
+ groupingKey: {
13
+ strategy: string;
14
+ value: string;
15
+ };
16
+ /** Human-readable summary */
17
+ summary: string;
18
+ /** All individual signals (preserved for scoring) */
19
+ signals: DriftSignal[];
20
+ /** Quick access counts */
21
+ totalCount: number;
22
+ bySeverity: {
23
+ critical: number;
24
+ warning: number;
25
+ info: number;
26
+ };
27
+ /** Unified suggestion if all signals share one */
28
+ commonSuggestion?: string;
29
+ /** Representative signal for display */
30
+ representative: DriftSignal;
31
+ }
32
+ export interface AggregationResult {
33
+ groups: DriftGroup[];
34
+ ungrouped: DriftSignal[];
35
+ totalSignals: number;
36
+ totalGroups: number;
37
+ /** Noise reduction metric: 100 signals → 5 groups = 20x */
38
+ reductionRatio: number;
39
+ }
40
+ export interface GroupingStrategy {
41
+ /** Unique identifier for this strategy */
42
+ type: string;
43
+ /**
44
+ * Extract a grouping key from a signal.
45
+ * @returns Grouping key string, or null if strategy doesn't apply
46
+ */
47
+ getKey(signal: DriftSignal): string | null;
48
+ /**
49
+ * Generate human-readable summary for a group.
50
+ */
51
+ summarize(signals: DriftSignal[], key: string): string;
52
+ }
53
+ export type BuiltInStrategyType = "value" | "suggestion" | "path" | "entity";
54
+ export interface AggregatorOptions {
55
+ /** Strategies to apply, in priority order. First match wins. */
56
+ strategies?: Array<BuiltInStrategyType | GroupingStrategy>;
57
+ /** Minimum signals to form a group (default: 2) */
58
+ minGroupSize?: number;
59
+ /** Path patterns for path-based grouping */
60
+ pathPatterns?: string[];
61
+ }
62
+ export declare class DriftAggregator {
63
+ private strategies;
64
+ private options;
65
+ constructor(options?: AggregatorOptions);
66
+ private resolveStrategy;
67
+ /**
68
+ * Aggregate signals into groups.
69
+ * Returns both grouped and ungrouped for flexible consumption.
70
+ */
71
+ aggregate(signals: DriftSignal[]): AggregationResult;
72
+ private applyStrategy;
73
+ private createGroup;
74
+ }
75
+ export declare const builtInStrategies: {
76
+ readonly value: GroupingStrategy;
77
+ readonly suggestion: GroupingStrategy;
78
+ readonly path: GroupingStrategy;
79
+ readonly entity: GroupingStrategy;
80
+ };
81
+ export declare function createStrategy(config: GroupingStrategy): GroupingStrategy;
82
+ //# sourceMappingURL=drift-aggregator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drift-aggregator.d.ts","sourceRoot":"","sources":["../../src/analysis/drift-aggregator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAMtD,MAAM,WAAW,UAAU;IACzB,+BAA+B;IAC/B,EAAE,EAAE,MAAM,CAAC;IAEX,0CAA0C;IAC1C,WAAW,EAAE;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IAEF,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAEhB,qDAAqD;IACrD,OAAO,EAAE,WAAW,EAAE,CAAC;IAEvB,0BAA0B;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAEhE,kDAAkD;IAClD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,wCAAwC;IACxC,cAAc,EAAE,WAAW,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,CAAC;IAE3C;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACxD;AAED,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,YAAY,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE7E,MAAM,WAAW,iBAAiB;IAChC,gEAAgE;IAChE,UAAU,CAAC,EAAE,KAAK,CAAC,mBAAmB,GAAG,gBAAgB,CAAC,CAAC;IAE3D,mDAAmD;IACnD,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,4CAA4C;IAC5C,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAgJD,qBAAa,eAAe;IAC1B,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,OAAO,CAAkD;gBAErD,OAAO,GAAE,iBAAsB;IAgB3C,OAAO,CAAC,eAAe;IAqBvB;;;OAGG;IACH,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,iBAAiB;IAgCpD,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,WAAW;CAoBpB;AAMD,eAAO,MAAM,iBAAiB;;;;;CAKpB,CAAC;AAEX,wBAAgB,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,gBAAgB,CAEzE"}
@@ -0,0 +1,241 @@
1
+ /**
2
+ * Drift Aggregator
3
+ *
4
+ * Post-processing layer that groups raw drift signals for actionability
5
+ * while preserving total counts for severity scoring.
6
+ */
7
+ // ============================================================================
8
+ // Built-in Strategies
9
+ // ============================================================================
10
+ const valueStrategy = {
11
+ type: "value",
12
+ getKey(signal) {
13
+ if (signal.type !== "hardcoded-value")
14
+ return null;
15
+ const actual = signal.details.actual;
16
+ if (typeof actual !== "string")
17
+ return null;
18
+ return `value:${actual}`;
19
+ },
20
+ summarize(signals, key) {
21
+ const value = key.replace("value:", "");
22
+ return `${signals.length} components use hardcoded value "${value}"`;
23
+ },
24
+ };
25
+ const suggestionStrategy = {
26
+ type: "suggestion",
27
+ getKey(signal) {
28
+ const suggestions = signal.details.tokenSuggestions;
29
+ if (!suggestions?.length)
30
+ return null;
31
+ // Parse: "value → tokenName (confidence)"
32
+ const first = suggestions[0];
33
+ if (!first)
34
+ return null;
35
+ const match = first.match(/→\s*([^\s(]+)/);
36
+ if (!match)
37
+ return null;
38
+ return `suggestion:${match[1]}`;
39
+ },
40
+ summarize(signals, key) {
41
+ const token = key.replace("suggestion:", "");
42
+ return `${signals.length} issues fixable by using ${token}`;
43
+ },
44
+ };
45
+ function createPathStrategy(patterns) {
46
+ return {
47
+ type: "path",
48
+ getKey(signal) {
49
+ const location = signal.source.location;
50
+ if (!location || !location.includes("/"))
51
+ return null;
52
+ // Check configured patterns first
53
+ for (const pattern of patterns) {
54
+ if (matchGlob(location, pattern)) {
55
+ return `path:${pattern}`;
56
+ }
57
+ }
58
+ // Fallback: group by directory
59
+ const parts = location.split("/");
60
+ if (parts.length >= 2) {
61
+ const dir = parts.slice(0, -1).join("/");
62
+ return `path:${dir}`;
63
+ }
64
+ return null;
65
+ },
66
+ summarize(signals, key) {
67
+ const path = key.replace("path:", "");
68
+ const types = [...new Set(signals.map((s) => s.type))];
69
+ return `${signals.length} issues in ${path}/ (${types.join(", ")})`;
70
+ },
71
+ };
72
+ }
73
+ const entityStrategy = {
74
+ type: "entity",
75
+ getKey(signal) {
76
+ return `entity:${signal.source.entityId}`;
77
+ },
78
+ summarize(signals, _key) {
79
+ const entityName = signals[0]?.source.entityName ?? "Unknown";
80
+ const types = [...new Set(signals.map((s) => s.type))];
81
+ if (types.length === 1) {
82
+ return `${signals.length} ${types[0]} issues in ${entityName}`;
83
+ }
84
+ return `${signals.length} issues in ${entityName} (${types.join(", ")})`;
85
+ },
86
+ };
87
+ // ============================================================================
88
+ // Helpers
89
+ // ============================================================================
90
+ function matchGlob(path, pattern) {
91
+ // Convert glob to regex
92
+ // Use placeholder for ** to avoid single-star replacement affecting it
93
+ const regex = new RegExp("^" +
94
+ pattern
95
+ .replace(/\*\*/g, "<<<GLOBSTAR>>>")
96
+ .replace(/\*/g, "[^/]*")
97
+ .replace(/<<<GLOBSTAR>>>/g, ".*") +
98
+ "$");
99
+ return regex.test(path);
100
+ }
101
+ function countBySeverity(signals) {
102
+ const counts = { critical: 0, warning: 0, info: 0 };
103
+ for (const signal of signals) {
104
+ counts[signal.severity]++;
105
+ }
106
+ return counts;
107
+ }
108
+ function generateGroupId(strategy, key) {
109
+ // Simple hash for stable IDs
110
+ const content = `${strategy}:${key}`;
111
+ let hash = 0;
112
+ for (let i = 0; i < content.length; i++) {
113
+ const char = content.charCodeAt(i);
114
+ hash = (hash << 5) - hash + char;
115
+ hash = hash & hash;
116
+ }
117
+ return `group:${strategy}:${Math.abs(hash).toString(16)}`;
118
+ }
119
+ // ============================================================================
120
+ // DriftAggregator
121
+ // ============================================================================
122
+ export class DriftAggregator {
123
+ strategies;
124
+ options;
125
+ constructor(options = {}) {
126
+ this.options = {
127
+ minGroupSize: options.minGroupSize ?? 2,
128
+ pathPatterns: options.pathPatterns ?? [],
129
+ };
130
+ // Build strategy list
131
+ const strategyDefs = options.strategies ?? [
132
+ "value",
133
+ "suggestion",
134
+ "path",
135
+ "entity",
136
+ ];
137
+ this.strategies = strategyDefs.map((s) => this.resolveStrategy(s));
138
+ }
139
+ resolveStrategy(strategy) {
140
+ if (typeof strategy === "object") {
141
+ return strategy;
142
+ }
143
+ switch (strategy) {
144
+ case "value":
145
+ return valueStrategy;
146
+ case "suggestion":
147
+ return suggestionStrategy;
148
+ case "path":
149
+ return createPathStrategy(this.options.pathPatterns);
150
+ case "entity":
151
+ return entityStrategy;
152
+ default:
153
+ throw new Error(`Unknown strategy: ${strategy}`);
154
+ }
155
+ }
156
+ /**
157
+ * Aggregate signals into groups.
158
+ * Returns both grouped and ungrouped for flexible consumption.
159
+ */
160
+ aggregate(signals) {
161
+ if (signals.length === 0) {
162
+ return {
163
+ groups: [],
164
+ ungrouped: [],
165
+ totalSignals: 0,
166
+ totalGroups: 0,
167
+ reductionRatio: 1,
168
+ };
169
+ }
170
+ const groups = [];
171
+ let remaining = [...signals];
172
+ // Multi-pass: each strategy gets a shot at remaining signals
173
+ for (const strategy of this.strategies) {
174
+ const { formed, leftover } = this.applyStrategy(strategy, remaining);
175
+ groups.push(...formed);
176
+ remaining = leftover;
177
+ }
178
+ const outputCount = groups.length + remaining.length;
179
+ return {
180
+ groups,
181
+ ungrouped: remaining,
182
+ totalSignals: signals.length,
183
+ totalGroups: groups.length,
184
+ reductionRatio: outputCount > 0 ? signals.length / outputCount : 1,
185
+ };
186
+ }
187
+ applyStrategy(strategy, signals) {
188
+ const buckets = new Map();
189
+ const noKey = [];
190
+ for (const signal of signals) {
191
+ const key = strategy.getKey(signal);
192
+ if (key) {
193
+ const bucket = buckets.get(key) ?? [];
194
+ bucket.push(signal);
195
+ buckets.set(key, bucket);
196
+ }
197
+ else {
198
+ noKey.push(signal);
199
+ }
200
+ }
201
+ const formed = [];
202
+ const leftover = [...noKey];
203
+ for (const [key, bucket] of buckets) {
204
+ if (bucket.length >= this.options.minGroupSize) {
205
+ formed.push(this.createGroup(strategy, key, bucket));
206
+ }
207
+ else {
208
+ leftover.push(...bucket);
209
+ }
210
+ }
211
+ return { formed, leftover };
212
+ }
213
+ createGroup(strategy, key, signals) {
214
+ const keyValue = key.includes(":") ? key.split(":").slice(1).join(":") : key;
215
+ return {
216
+ id: generateGroupId(strategy.type, key),
217
+ groupingKey: {
218
+ strategy: strategy.type,
219
+ value: keyValue,
220
+ },
221
+ summary: strategy.summarize(signals, key),
222
+ signals,
223
+ totalCount: signals.length,
224
+ bySeverity: countBySeverity(signals),
225
+ representative: signals[0],
226
+ };
227
+ }
228
+ }
229
+ // ============================================================================
230
+ // Exports for extensibility
231
+ // ============================================================================
232
+ export const builtInStrategies = {
233
+ value: valueStrategy,
234
+ suggestion: suggestionStrategy,
235
+ path: createPathStrategy([]),
236
+ entity: entityStrategy,
237
+ };
238
+ export function createStrategy(config) {
239
+ return config;
240
+ }
241
+ //# sourceMappingURL=drift-aggregator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drift-aggregator.js","sourceRoot":"","sources":["../../src/analysis/drift-aggregator.ts"],"names":[],"mappings":"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"}
@@ -3,4 +3,5 @@ export { TokenSuggestionService, type TokenSuggestion, } from "./token-suggestio
3
3
  export { stringSimilarity, levenshteinDistance, normalizeForComparison, } from "./string-utils.js";
4
4
  export { MATCHING_CONFIG, NAMING_CONFIG, TOKEN_SUGGESTION_CONFIG, SCANNER_CONFIG, getOutlierThreshold, } from "./config.js";
5
5
  export { generateAuditReport, findCloseMatches, calculateHealthScore, type AuditValue, type AuditReport, type CategoryStats, type FileIssue, type CloseMatch, } from "./audit.js";
6
+ export { DriftAggregator, createStrategy, builtInStrategies, type DriftGroup, type AggregationResult, type GroupingStrategy, type AggregatorOptions, type BuiltInStrategyType, } from "./drift-aggregator.js";
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analysis/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,eAAe,GACrB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,sBAAsB,EACtB,KAAK,eAAe,GACrB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,eAAe,EACf,aAAa,EACb,uBAAuB,EACvB,cAAc,EACd,mBAAmB,GACpB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACpB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,UAAU,GAChB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analysis/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,eAAe,GACrB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,sBAAsB,EACtB,KAAK,eAAe,GACrB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,eAAe,EACf,aAAa,EACb,uBAAuB,EACvB,cAAc,EACd,mBAAmB,GACpB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACpB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,UAAU,GAChB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,GACzB,MAAM,uBAAuB,CAAC"}
@@ -7,4 +7,6 @@ export { stringSimilarity, levenshteinDistance, normalizeForComparison, } from "
7
7
  export { MATCHING_CONFIG, NAMING_CONFIG, TOKEN_SUGGESTION_CONFIG, SCANNER_CONFIG, getOutlierThreshold, } from "./config.js";
8
8
  // Audit report
9
9
  export { generateAuditReport, findCloseMatches, calculateHealthScore, } from "./audit.js";
10
+ // Drift aggregation
11
+ export { DriftAggregator, createStrategy, builtInStrategies, } from "./drift-aggregator.js";
10
12
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analysis/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,GAOnB,MAAM,oBAAoB,CAAC;AAE5B,6BAA6B;AAC7B,OAAO,EACL,sBAAsB,GAEvB,MAAM,wBAAwB,CAAC;AAEhC,mBAAmB;AACnB,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAE3B,yBAAyB;AACzB,OAAO,EACL,eAAe,EACf,aAAa,EACb,uBAAuB,EACvB,cAAc,EACd,mBAAmB,GACpB,MAAM,aAAa,CAAC;AAErB,eAAe;AACf,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,GAMrB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analysis/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,GAOnB,MAAM,oBAAoB,CAAC;AAE5B,6BAA6B;AAC7B,OAAO,EACL,sBAAsB,GAEvB,MAAM,wBAAwB,CAAC;AAEhC,mBAAmB;AACnB,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAE3B,yBAAyB;AACzB,OAAO,EACL,eAAe,EACf,aAAa,EACb,uBAAuB,EACvB,cAAc,EACd,mBAAmB,GACpB,MAAM,aAAa,CAAC;AAErB,eAAe;AACf,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,GAMrB,MAAM,YAAY,CAAC;AAEpB,oBAAoB;AACpB,OAAO,EACL,eAAe,EACf,cAAc,EACd,iBAAiB,GAMlB,MAAM,uBAAuB,CAAC"}
@@ -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":"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"}
1
+ {"version":3,"file":"semantic-diff.d.ts","sourceRoot":"","sources":["../../src/analysis/semantic-diff.ts"],"names":[],"mappings":"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"}