ilse-design 0.3.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +187 -0
- package/dist/agent/executor.d.ts +20 -0
- package/dist/agent/executor.d.ts.map +1 -0
- package/dist/agent/executor.js +130 -0
- package/dist/agent/executor.js.map +1 -0
- package/dist/ai/provider.d.ts +45 -0
- package/dist/ai/provider.d.ts.map +1 -0
- package/dist/ai/provider.js +374 -0
- package/dist/ai/provider.js.map +1 -0
- package/dist/analysis/classify-element.d.ts +23 -0
- package/dist/analysis/classify-element.d.ts.map +1 -0
- package/dist/analysis/classify-element.js +79 -0
- package/dist/analysis/classify-element.js.map +1 -0
- package/dist/analysis/compare-family.d.ts +22 -0
- package/dist/analysis/compare-family.d.ts.map +1 -0
- package/dist/analysis/compare-family.js +82 -0
- package/dist/analysis/compare-family.js.map +1 -0
- package/dist/analysis/profile-component.d.ts +32 -0
- package/dist/analysis/profile-component.d.ts.map +1 -0
- package/dist/analysis/profile-component.js +119 -0
- package/dist/analysis/profile-component.js.map +1 -0
- package/dist/bridge/augment.d.ts +20 -0
- package/dist/bridge/augment.d.ts.map +1 -0
- package/dist/bridge/augment.js +110 -0
- package/dist/bridge/augment.js.map +1 -0
- package/dist/bridge/store.d.ts +17 -0
- package/dist/bridge/store.d.ts.map +1 -0
- package/dist/bridge/store.js +70 -0
- package/dist/bridge/store.js.map +1 -0
- package/dist/bridge/ws-server.d.ts +12 -0
- package/dist/bridge/ws-server.d.ts.map +1 -0
- package/dist/bridge/ws-server.js +136 -0
- package/dist/bridge/ws-server.js.map +1 -0
- package/dist/cli/check.d.ts +8 -0
- package/dist/cli/check.d.ts.map +1 -0
- package/dist/cli/check.js +303 -0
- package/dist/cli/check.js.map +1 -0
- package/dist/cli/default.d.ts +2 -0
- package/dist/cli/default.d.ts.map +1 -0
- package/dist/cli/default.js +166 -0
- package/dist/cli/default.js.map +1 -0
- package/dist/cli/extract.d.ts +5 -0
- package/dist/cli/extract.d.ts.map +1 -0
- package/dist/cli/extract.js +62 -0
- package/dist/cli/extract.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 +111 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +5 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +190 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/insight.d.ts +5 -0
- package/dist/cli/insight.d.ts.map +1 -0
- package/dist/cli/insight.js +141 -0
- package/dist/cli/insight.js.map +1 -0
- package/dist/cli/listen.d.ts +10 -0
- package/dist/cli/listen.d.ts.map +1 -0
- package/dist/cli/listen.js +94 -0
- package/dist/cli/listen.js.map +1 -0
- package/dist/cli/login.d.ts +15 -0
- package/dist/cli/login.d.ts.map +1 -0
- package/dist/cli/login.js +302 -0
- package/dist/cli/login.js.map +1 -0
- package/dist/config/limits.d.ts +13 -0
- package/dist/config/limits.d.ts.map +1 -0
- package/dist/config/limits.js +26 -0
- package/dist/config/limits.js.map +1 -0
- package/dist/config/mcp-register.d.ts +5 -0
- package/dist/config/mcp-register.d.ts.map +1 -0
- package/dist/config/mcp-register.js +50 -0
- package/dist/config/mcp-register.js.map +1 -0
- package/dist/config/preferences.d.ts +22 -0
- package/dist/config/preferences.d.ts.map +1 -0
- package/dist/config/preferences.js +159 -0
- package/dist/config/preferences.js.map +1 -0
- package/dist/config/user-config.d.ts +10 -0
- package/dist/config/user-config.d.ts.map +1 -0
- package/dist/config/user-config.js +32 -0
- package/dist/config/user-config.js.map +1 -0
- package/dist/constants.d.ts +11 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +49 -0
- package/dist/constants.js.map +1 -0
- package/dist/extraction/find-inconsistencies.d.ts +17 -0
- package/dist/extraction/find-inconsistencies.d.ts.map +1 -0
- package/dist/extraction/find-inconsistencies.js +93 -0
- package/dist/extraction/find-inconsistencies.js.map +1 -0
- package/dist/extraction/find-patterns.d.ts +20 -0
- package/dist/extraction/find-patterns.d.ts.map +1 -0
- package/dist/extraction/find-patterns.js +179 -0
- package/dist/extraction/find-patterns.js.map +1 -0
- package/dist/extraction/index-tokens.d.ts +16 -0
- package/dist/extraction/index-tokens.d.ts.map +1 -0
- package/dist/extraction/index-tokens.js +103 -0
- package/dist/extraction/index-tokens.js.map +1 -0
- package/dist/fixer/autofix.d.ts +11 -0
- package/dist/fixer/autofix.d.ts.map +1 -0
- package/dist/fixer/autofix.js +202 -0
- package/dist/fixer/autofix.js.map +1 -0
- package/dist/mcp/server.d.ts +3 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +271 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/parsers/repo.d.ts +22 -0
- package/dist/parsers/repo.d.ts.map +1 -0
- package/dist/parsers/repo.js +165 -0
- package/dist/parsers/repo.js.map +1 -0
- package/dist/parsers/snapshot.d.ts +15 -0
- package/dist/parsers/snapshot.d.ts.map +1 -0
- package/dist/parsers/snapshot.js +136 -0
- package/dist/parsers/snapshot.js.map +1 -0
- package/dist/parsers/tokens.d.ts +10 -0
- package/dist/parsers/tokens.d.ts.map +1 -0
- package/dist/parsers/tokens.js +119 -0
- package/dist/parsers/tokens.js.map +1 -0
- package/dist/react/annotator.d.ts +64 -0
- package/dist/react/annotator.d.ts.map +1 -0
- package/dist/react/annotator.js +279 -0
- package/dist/react/annotator.js.map +1 -0
- package/dist/react/area-selector.d.ts +14 -0
- package/dist/react/area-selector.d.ts.map +1 -0
- package/dist/react/area-selector.js +76 -0
- package/dist/react/area-selector.js.map +1 -0
- package/dist/react/freeze.d.ts +5 -0
- package/dist/react/freeze.d.ts.map +1 -0
- package/dist/react/freeze.js +109 -0
- package/dist/react/freeze.js.map +1 -0
- package/dist/react/image-input.d.ts +14 -0
- package/dist/react/image-input.d.ts.map +1 -0
- package/dist/react/image-input.js +100 -0
- package/dist/react/image-input.js.map +1 -0
- package/dist/react/index.d.ts +6 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +13 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/toolbar.d.ts +2 -0
- package/dist/react/toolbar.d.ts.map +1 -0
- package/dist/react/toolbar.js +755 -0
- package/dist/react/toolbar.js.map +1 -0
- package/dist/react/ws-client.d.ts +8 -0
- package/dist/react/ws-client.d.ts.map +1 -0
- package/dist/react/ws-client.js +71 -0
- package/dist/react/ws-client.js.map +1 -0
- package/dist/reporters/coverage.d.ts +6 -0
- package/dist/reporters/coverage.d.ts.map +1 -0
- package/dist/reporters/coverage.js +74 -0
- package/dist/reporters/coverage.js.map +1 -0
- package/dist/reporters/ds-report.d.ts +8 -0
- package/dist/reporters/ds-report.d.ts.map +1 -0
- package/dist/reporters/ds-report.js +66 -0
- package/dist/reporters/ds-report.js.map +1 -0
- package/dist/reporters/terminal.d.ts +43 -0
- package/dist/reporters/terminal.d.ts.map +1 -0
- package/dist/reporters/terminal.js +361 -0
- package/dist/reporters/terminal.js.map +1 -0
- package/dist/setup/framework-detect.d.ts +8 -0
- package/dist/setup/framework-detect.d.ts.map +1 -0
- package/dist/setup/framework-detect.js +109 -0
- package/dist/setup/framework-detect.js.map +1 -0
- package/dist/setup/inject-component.d.ts +12 -0
- package/dist/setup/inject-component.d.ts.map +1 -0
- package/dist/setup/inject-component.js +98 -0
- package/dist/setup/inject-component.js.map +1 -0
- package/dist/types.d.ts +170 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/ast.d.ts +18 -0
- package/dist/utils/ast.d.ts.map +1 -0
- package/dist/utils/ast.js +57 -0
- package/dist/utils/ast.js.map +1 -0
- package/dist/utils/files.d.ts +6 -0
- package/dist/utils/files.d.ts.map +1 -0
- package/dist/utils/files.js +25 -0
- package/dist/utils/files.js.map +1 -0
- package/dist/utils/suggest.d.ts +37 -0
- package/dist/utils/suggest.d.ts.map +1 -0
- package/dist/utils/suggest.js +158 -0
- package/dist/utils/suggest.js.map +1 -0
- package/dist/validators/coverage.d.ts +24 -0
- package/dist/validators/coverage.d.ts.map +1 -0
- package/dist/validators/coverage.js +156 -0
- package/dist/validators/coverage.js.map +1 -0
- package/dist/validators/static.d.ts +14 -0
- package/dist/validators/static.d.ts.map +1 -0
- package/dist/validators/static.js +398 -0
- package/dist/validators/static.js.map +1 -0
- package/package.json +64 -0
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core types for Ilse - Design Token Validator
|
|
3
|
+
*/
|
|
4
|
+
export interface Token {
|
|
5
|
+
name: string;
|
|
6
|
+
value: string;
|
|
7
|
+
type: 'color' | 'spacing' | 'typography';
|
|
8
|
+
path: string[];
|
|
9
|
+
}
|
|
10
|
+
export type Severity = 'critical' | 'serious' | 'moderate';
|
|
11
|
+
export interface TokenViolation {
|
|
12
|
+
file: string;
|
|
13
|
+
line: number;
|
|
14
|
+
column: number;
|
|
15
|
+
found: string;
|
|
16
|
+
context: string;
|
|
17
|
+
suggestion: string;
|
|
18
|
+
alternatives?: string[];
|
|
19
|
+
type: 'color' | 'spacing' | 'typography' | 'accessibility';
|
|
20
|
+
severity: Severity;
|
|
21
|
+
source: 'static' | 'ai';
|
|
22
|
+
aiSuggestion?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface FileReport {
|
|
25
|
+
file: string;
|
|
26
|
+
violations: TokenViolation[];
|
|
27
|
+
insights: AIInsight[];
|
|
28
|
+
}
|
|
29
|
+
export interface FixProposal {
|
|
30
|
+
file: string;
|
|
31
|
+
line: number;
|
|
32
|
+
column: number;
|
|
33
|
+
original: string;
|
|
34
|
+
replacement: string;
|
|
35
|
+
description: string;
|
|
36
|
+
}
|
|
37
|
+
export interface DSSource {
|
|
38
|
+
type: 'file' | 'directory' | 'repo' | 'none';
|
|
39
|
+
path?: string;
|
|
40
|
+
}
|
|
41
|
+
export interface IlseConfig {
|
|
42
|
+
dsSource: DSSource;
|
|
43
|
+
include: string[];
|
|
44
|
+
exclude: string[];
|
|
45
|
+
ai: AIConfig;
|
|
46
|
+
preferences: {
|
|
47
|
+
autoFix: 'review' | 'auto' | 'off';
|
|
48
|
+
groupBy: 'type' | 'line' | 'severity';
|
|
49
|
+
verbosity: 'quiet' | 'normal' | 'verbose';
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export interface AIConfig {
|
|
53
|
+
mode: 'ilse' | 'own';
|
|
54
|
+
openRouterKey?: string;
|
|
55
|
+
model?: string;
|
|
56
|
+
}
|
|
57
|
+
export type Result<T> = {
|
|
58
|
+
ok: true;
|
|
59
|
+
value: T;
|
|
60
|
+
} | {
|
|
61
|
+
ok: false;
|
|
62
|
+
error: string;
|
|
63
|
+
};
|
|
64
|
+
export interface AIAnalysisRequest {
|
|
65
|
+
files: Array<{
|
|
66
|
+
path: string;
|
|
67
|
+
code: string;
|
|
68
|
+
}>;
|
|
69
|
+
tokens: Token[];
|
|
70
|
+
staticViolations: TokenViolation[];
|
|
71
|
+
projectContext?: {
|
|
72
|
+
dependencies: string[];
|
|
73
|
+
uiComponents: string[];
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
export interface AIAnalysisResponse {
|
|
77
|
+
violations: TokenViolation[];
|
|
78
|
+
insights: AIInsight[];
|
|
79
|
+
patterns: AIPattern[];
|
|
80
|
+
}
|
|
81
|
+
export interface AIInsight {
|
|
82
|
+
file: string;
|
|
83
|
+
line: number;
|
|
84
|
+
endLine?: number;
|
|
85
|
+
message: string;
|
|
86
|
+
detail?: string;
|
|
87
|
+
suggestion?: string;
|
|
88
|
+
category: 'hierarchy' | 'consistency' | 'accessibility' | 'pattern';
|
|
89
|
+
severity: Severity;
|
|
90
|
+
}
|
|
91
|
+
export interface TokenUsage {
|
|
92
|
+
file: string;
|
|
93
|
+
line: number;
|
|
94
|
+
column: number;
|
|
95
|
+
className: string;
|
|
96
|
+
tokenName: string;
|
|
97
|
+
type: 'color' | 'spacing' | 'typography';
|
|
98
|
+
}
|
|
99
|
+
export interface CoverageReport {
|
|
100
|
+
total: {
|
|
101
|
+
usages: number;
|
|
102
|
+
violations: number;
|
|
103
|
+
coverage: number;
|
|
104
|
+
};
|
|
105
|
+
byType: Record<Token['type'], {
|
|
106
|
+
usages: number;
|
|
107
|
+
violations: number;
|
|
108
|
+
coverage: number;
|
|
109
|
+
}>;
|
|
110
|
+
byFile: Array<{
|
|
111
|
+
file: string;
|
|
112
|
+
usages: number;
|
|
113
|
+
violations: number;
|
|
114
|
+
coverage: number;
|
|
115
|
+
}>;
|
|
116
|
+
unusedTokens: string[];
|
|
117
|
+
}
|
|
118
|
+
export interface TokenSnapshot {
|
|
119
|
+
version: string;
|
|
120
|
+
timestamp: string;
|
|
121
|
+
tokens: Token[];
|
|
122
|
+
}
|
|
123
|
+
export interface TokenChange {
|
|
124
|
+
type: 'removed' | 'changed' | 'renamed' | 'added';
|
|
125
|
+
tokenName: string;
|
|
126
|
+
oldValue?: string;
|
|
127
|
+
newValue?: string;
|
|
128
|
+
newName?: string;
|
|
129
|
+
}
|
|
130
|
+
export interface DSDiffReport {
|
|
131
|
+
changes: TokenChange[];
|
|
132
|
+
hasBreakingChanges: boolean;
|
|
133
|
+
}
|
|
134
|
+
export interface AIPattern {
|
|
135
|
+
count: number;
|
|
136
|
+
label: string;
|
|
137
|
+
detail: string;
|
|
138
|
+
action: string;
|
|
139
|
+
}
|
|
140
|
+
export type AnnotationStatus = 'pending' | 'sent' | 'resolved';
|
|
141
|
+
export interface Annotation {
|
|
142
|
+
id: string;
|
|
143
|
+
note: string;
|
|
144
|
+
element: string;
|
|
145
|
+
component?: string;
|
|
146
|
+
styles: Record<string, string>;
|
|
147
|
+
parent?: string;
|
|
148
|
+
imageRef?: string;
|
|
149
|
+
grepPattern?: string;
|
|
150
|
+
componentStack?: string[];
|
|
151
|
+
domPath?: string;
|
|
152
|
+
nearbyElements?: string[];
|
|
153
|
+
position?: {
|
|
154
|
+
top: number;
|
|
155
|
+
left: number;
|
|
156
|
+
width: number;
|
|
157
|
+
height: number;
|
|
158
|
+
};
|
|
159
|
+
environment?: {
|
|
160
|
+
viewport: string;
|
|
161
|
+
url: string;
|
|
162
|
+
userAgent: string;
|
|
163
|
+
devicePixelRatio: number;
|
|
164
|
+
timestamp: string;
|
|
165
|
+
};
|
|
166
|
+
status: AnnotationStatus;
|
|
167
|
+
resolvedSummary?: string;
|
|
168
|
+
timestamp: string;
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { File } from '@babel/types';
|
|
2
|
+
import type { Result } from '../types.js';
|
|
3
|
+
export type AST = File;
|
|
4
|
+
/**
|
|
5
|
+
* Parse code string into an AST.
|
|
6
|
+
*/
|
|
7
|
+
export declare function parseCode(code: string, filePath?: string): Result<AST>;
|
|
8
|
+
type TraverseVisitor = Record<string, (path: any) => void>;
|
|
9
|
+
/**
|
|
10
|
+
* Walk an AST with visitors.
|
|
11
|
+
*/
|
|
12
|
+
export declare function walkAST(ast: AST, visitors: TraverseVisitor): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Get the source code for a specific location.
|
|
15
|
+
*/
|
|
16
|
+
export declare function getSourceContext(code: string, line: number, column: number, contextLength?: number): string;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=ast.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../../src/utils/ast.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC;AAqBvB;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAwB,GAAG,MAAM,CAAC,GAAG,CAAC,CAmBvF;AAGD,KAAK,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC,CAAC;AAE3D;;GAEG;AACH,wBAAsB,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,aAAa,GAAE,MAAW,GACzB,MAAM,CAWR"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { parse } from '@babel/parser';
|
|
2
|
+
let traverseFn = null;
|
|
3
|
+
/**
|
|
4
|
+
* Get the traverse function, handling ESM/CJS interop.
|
|
5
|
+
*/
|
|
6
|
+
async function getTraverse() {
|
|
7
|
+
if (traverseFn)
|
|
8
|
+
return traverseFn;
|
|
9
|
+
const mod = await import('@babel/traverse');
|
|
10
|
+
// Handle both ESM default export and CJS module.exports
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
12
|
+
const traverse = mod.default?.default || mod.default || mod;
|
|
13
|
+
traverseFn = traverse;
|
|
14
|
+
return traverseFn;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Parse code string into an AST.
|
|
18
|
+
*/
|
|
19
|
+
export function parseCode(code, filePath = 'anonymous.tsx') {
|
|
20
|
+
const isTypeScript = filePath.endsWith('.tsx') || filePath.endsWith('.ts');
|
|
21
|
+
const plugins = ['jsx'];
|
|
22
|
+
if (isTypeScript) {
|
|
23
|
+
plugins.push('typescript');
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
const ast = parse(code, {
|
|
27
|
+
sourceType: 'module',
|
|
28
|
+
plugins,
|
|
29
|
+
errorRecovery: true,
|
|
30
|
+
});
|
|
31
|
+
return { ok: true, value: ast };
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
return { ok: false, error: `Failed to parse file: ${err.message}` };
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Walk an AST with visitors.
|
|
39
|
+
*/
|
|
40
|
+
export async function walkAST(ast, visitors) {
|
|
41
|
+
const traverse = await getTraverse();
|
|
42
|
+
traverse(ast, visitors);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Get the source code for a specific location.
|
|
46
|
+
*/
|
|
47
|
+
export function getSourceContext(code, line, column, contextLength = 50) {
|
|
48
|
+
const lines = code.split('\n');
|
|
49
|
+
if (line < 1 || line > lines.length) {
|
|
50
|
+
return '';
|
|
51
|
+
}
|
|
52
|
+
const targetLine = lines[line - 1];
|
|
53
|
+
const start = Math.max(0, column - contextLength / 2);
|
|
54
|
+
const end = Math.min(targetLine.length, column + contextLength / 2);
|
|
55
|
+
return targetLine.slice(start, end).trim();
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=ast.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast.js","sourceRoot":"","sources":["../../src/utils/ast.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAgB,MAAM,eAAe,CAAC;AASpD,IAAI,UAAU,GAA4B,IAAI,CAAC;AAE/C;;GAEG;AACH,KAAK,UAAU,WAAW;IACxB,IAAI,UAAU;QAAE,OAAO,UAAU,CAAC;IAElC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAC5C,wDAAwD;IACxD,8DAA8D;IAC9D,MAAM,QAAQ,GAAI,GAAW,CAAC,OAAO,EAAE,OAAO,IAAK,GAAW,CAAC,OAAO,IAAI,GAAG,CAAC;IAC9E,UAAU,GAAG,QAA4B,CAAC;IAC1C,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,WAAmB,eAAe;IACxE,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE3E,MAAM,OAAO,GAAmB,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE;YACtB,UAAU,EAAE,QAAQ;YACpB,OAAO;YACP,aAAa,EAAE,IAAI;SACpB,CAAC,CAAC;QAEH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;IAClC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,yBAA0B,GAAa,CAAC,OAAO,EAAE,EAAE,CAAC;IACjF,CAAC;AACH,CAAC;AAKD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAQ,EAAE,QAAyB;IAC/D,MAAM,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAC;IACrC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAAY,EACZ,IAAY,EACZ,MAAc,EACd,gBAAwB,EAAE;IAE1B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QACpC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC;IACtD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC;IAEpE,OAAO,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Result } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Discover files matching include patterns, excluding exclude patterns.
|
|
4
|
+
*/
|
|
5
|
+
export declare function discoverFiles(include: string[], exclude: string[], cwd?: string): Promise<Result<string[]>>;
|
|
6
|
+
//# sourceMappingURL=files.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/utils/files.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,EAAE,MAAM,EAAE,EACjB,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAqB3B"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { glob } from 'glob';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* Discover files matching include patterns, excluding exclude patterns.
|
|
5
|
+
*/
|
|
6
|
+
export async function discoverFiles(include, exclude, cwd) {
|
|
7
|
+
const basePath = cwd || process.cwd();
|
|
8
|
+
try {
|
|
9
|
+
const files = await glob(include, {
|
|
10
|
+
cwd: basePath,
|
|
11
|
+
ignore: exclude,
|
|
12
|
+
absolute: false,
|
|
13
|
+
nodir: true,
|
|
14
|
+
});
|
|
15
|
+
// Sort alphabetically for consistent output
|
|
16
|
+
files.sort();
|
|
17
|
+
// Resolve to full paths
|
|
18
|
+
const resolved = files.map((f) => resolve(basePath, f));
|
|
19
|
+
return { ok: true, value: resolved };
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
return { ok: false, error: `Failed to discover files: ${err.message}` };
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/utils/files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAiB,EACjB,OAAiB,EACjB,GAAY;IAEZ,MAAM,QAAQ,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAEtC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE;YAChC,GAAG,EAAE,QAAQ;YACb,MAAM,EAAE,OAAO;YACf,QAAQ,EAAE,KAAK;YACf,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;QAEH,4CAA4C;QAC5C,KAAK,CAAC,IAAI,EAAE,CAAC;QAEb,wBAAwB;QACxB,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;QAExD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IACvC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,6BAA8B,GAAa,CAAC,OAAO,EAAE,EAAE,CAAC;IACrF,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { Token } from '../types.js';
|
|
2
|
+
type RGB = [number, number, number];
|
|
3
|
+
/**
|
|
4
|
+
* Convert hex color to RGB tuple.
|
|
5
|
+
*/
|
|
6
|
+
export declare function hexToRgb(hex: string): RGB | null;
|
|
7
|
+
/**
|
|
8
|
+
* Calculate Euclidean distance between two RGB colors.
|
|
9
|
+
*/
|
|
10
|
+
export declare function colorDistance(a: RGB, b: RGB): number;
|
|
11
|
+
/**
|
|
12
|
+
* Parse a size value (e.g., "13px", "1rem") into a number in pixels.
|
|
13
|
+
*/
|
|
14
|
+
export declare function parseSize(value: string): number | null;
|
|
15
|
+
/**
|
|
16
|
+
* Calculate numeric distance between two size values.
|
|
17
|
+
*/
|
|
18
|
+
export declare function sizeDistance(a: number, b: number): number;
|
|
19
|
+
export interface SuggestionResult {
|
|
20
|
+
token: Token;
|
|
21
|
+
distance: number;
|
|
22
|
+
alternatives?: Token[];
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Find the closest color token to a given hex/rgb value.
|
|
26
|
+
*/
|
|
27
|
+
export declare function findClosestColor(value: string, tokens: Token[]): SuggestionResult | null;
|
|
28
|
+
/**
|
|
29
|
+
* Find the closest spacing token to a given size value.
|
|
30
|
+
*/
|
|
31
|
+
export declare function findClosestSpacing(value: string, tokens: Token[]): SuggestionResult | null;
|
|
32
|
+
/**
|
|
33
|
+
* Find the closest token to a given value, auto-detecting type.
|
|
34
|
+
*/
|
|
35
|
+
export declare function findClosestToken(value: string, tokens: Token[]): SuggestionResult | null;
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=suggest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suggest.d.ts","sourceRoot":"","sources":["../../src/utils/suggest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,KAAK,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAEpC;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI,CAuBhD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,GAAG,MAAM,CAKpD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkBtD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAEzD;AAQD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,KAAK,EAAE,CAAC;CACxB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,gBAAgB,GAAG,IAAI,CAmDxF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,gBAAgB,GAAG,IAAI,CAuC1F;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,gBAAgB,GAAG,IAAI,CAYxF"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert hex color to RGB tuple.
|
|
3
|
+
*/
|
|
4
|
+
export function hexToRgb(hex) {
|
|
5
|
+
// Remove # if present
|
|
6
|
+
const cleanHex = hex.replace(/^#/, '');
|
|
7
|
+
// Support 3-char and 6-char hex
|
|
8
|
+
let fullHex = cleanHex;
|
|
9
|
+
if (cleanHex.length === 3) {
|
|
10
|
+
fullHex = cleanHex
|
|
11
|
+
.split('')
|
|
12
|
+
.map((c) => c + c)
|
|
13
|
+
.join('');
|
|
14
|
+
}
|
|
15
|
+
if (fullHex.length !== 6) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
const num = parseInt(fullHex, 16);
|
|
19
|
+
if (isNaN(num)) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
return [(num >> 16) & 255, (num >> 8) & 255, num & 255];
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Calculate Euclidean distance between two RGB colors.
|
|
26
|
+
*/
|
|
27
|
+
export function colorDistance(a, b) {
|
|
28
|
+
const dr = a[0] - b[0];
|
|
29
|
+
const dg = a[1] - b[1];
|
|
30
|
+
const db = a[2] - b[2];
|
|
31
|
+
return Math.sqrt(dr * dr + dg * dg + db * db);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Parse a size value (e.g., "13px", "1rem") into a number in pixels.
|
|
35
|
+
*/
|
|
36
|
+
export function parseSize(value) {
|
|
37
|
+
const match = value.match(/^(-?\d+(?:\.\d+)?)(px|rem|em)?$/);
|
|
38
|
+
if (!match) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
const num = parseFloat(match[1]);
|
|
42
|
+
const unit = match[2] || 'px';
|
|
43
|
+
// Convert to pixels (assuming 1rem = 16px)
|
|
44
|
+
switch (unit) {
|
|
45
|
+
case 'rem':
|
|
46
|
+
case 'em':
|
|
47
|
+
return num * 16;
|
|
48
|
+
case 'px':
|
|
49
|
+
default:
|
|
50
|
+
return num;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Calculate numeric distance between two size values.
|
|
55
|
+
*/
|
|
56
|
+
export function sizeDistance(a, b) {
|
|
57
|
+
return Math.abs(a - b);
|
|
58
|
+
}
|
|
59
|
+
// Maximum color distance to consider a valid suggestion (approximately 50 in RGB space)
|
|
60
|
+
const COLOR_DISTANCE_THRESHOLD = 100;
|
|
61
|
+
// Maximum size distance in pixels to consider a valid suggestion
|
|
62
|
+
const SIZE_DISTANCE_THRESHOLD = 16;
|
|
63
|
+
/**
|
|
64
|
+
* Find the closest color token to a given hex/rgb value.
|
|
65
|
+
*/
|
|
66
|
+
export function findClosestColor(value, tokens) {
|
|
67
|
+
// Normalize the input value to hex
|
|
68
|
+
let inputRgb = null;
|
|
69
|
+
if (value.startsWith('#')) {
|
|
70
|
+
inputRgb = hexToRgb(value);
|
|
71
|
+
}
|
|
72
|
+
else if (value.startsWith('rgb')) {
|
|
73
|
+
// Parse rgb(r, g, b) or rgba(r, g, b, a)
|
|
74
|
+
const match = value.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)/);
|
|
75
|
+
if (match) {
|
|
76
|
+
inputRgb = [parseInt(match[1]), parseInt(match[2]), parseInt(match[3])];
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (!inputRgb) {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
const colorTokens = tokens.filter((t) => t.type === 'color');
|
|
83
|
+
let closest = null;
|
|
84
|
+
const alternatives = [];
|
|
85
|
+
for (const token of colorTokens) {
|
|
86
|
+
const tokenRgb = hexToRgb(token.value);
|
|
87
|
+
if (!tokenRgb)
|
|
88
|
+
continue;
|
|
89
|
+
const dist = colorDistance(inputRgb, tokenRgb);
|
|
90
|
+
if (dist <= COLOR_DISTANCE_THRESHOLD) {
|
|
91
|
+
alternatives.push({ token, distance: dist });
|
|
92
|
+
}
|
|
93
|
+
if (!closest || dist < closest.distance) {
|
|
94
|
+
closest = { token, distance: dist };
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (!closest || closest.distance > COLOR_DISTANCE_THRESHOLD) {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
// Sort alternatives by distance and take top 3
|
|
101
|
+
alternatives.sort((a, b) => a.distance - b.distance);
|
|
102
|
+
const topAlternatives = alternatives.slice(1, 4).map((a) => a.token);
|
|
103
|
+
return {
|
|
104
|
+
token: closest.token,
|
|
105
|
+
distance: closest.distance,
|
|
106
|
+
alternatives: topAlternatives.length > 0 ? topAlternatives : undefined,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Find the closest spacing token to a given size value.
|
|
111
|
+
*/
|
|
112
|
+
export function findClosestSpacing(value, tokens) {
|
|
113
|
+
const inputSize = parseSize(value);
|
|
114
|
+
if (inputSize === null) {
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
const spacingTokens = tokens.filter((t) => t.type === 'spacing');
|
|
118
|
+
let closest = null;
|
|
119
|
+
const alternatives = [];
|
|
120
|
+
for (const token of spacingTokens) {
|
|
121
|
+
const tokenSize = parseSize(token.value);
|
|
122
|
+
if (tokenSize === null)
|
|
123
|
+
continue;
|
|
124
|
+
const dist = sizeDistance(inputSize, tokenSize);
|
|
125
|
+
if (dist <= SIZE_DISTANCE_THRESHOLD) {
|
|
126
|
+
alternatives.push({ token, distance: dist });
|
|
127
|
+
}
|
|
128
|
+
if (!closest || dist < closest.distance) {
|
|
129
|
+
closest = { token, distance: dist };
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (!closest || closest.distance > SIZE_DISTANCE_THRESHOLD) {
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
// Sort alternatives by distance and take neighbors
|
|
136
|
+
alternatives.sort((a, b) => a.distance - b.distance);
|
|
137
|
+
const topAlternatives = alternatives.slice(1, 4).map((a) => a.token);
|
|
138
|
+
return {
|
|
139
|
+
token: closest.token,
|
|
140
|
+
distance: closest.distance,
|
|
141
|
+
alternatives: topAlternatives.length > 0 ? topAlternatives : undefined,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Find the closest token to a given value, auto-detecting type.
|
|
146
|
+
*/
|
|
147
|
+
export function findClosestToken(value, tokens) {
|
|
148
|
+
// Try color first
|
|
149
|
+
if (value.startsWith('#') || value.startsWith('rgb') || value.startsWith('hsl')) {
|
|
150
|
+
return findClosestColor(value, tokens);
|
|
151
|
+
}
|
|
152
|
+
// Try spacing
|
|
153
|
+
if (/^-?\d+(\.\d+)?(px|rem|em)?$/.test(value)) {
|
|
154
|
+
return findClosestSpacing(value, tokens);
|
|
155
|
+
}
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=suggest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suggest.js","sourceRoot":"","sources":["../../src/utils/suggest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Token, TokenUsage, Result } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Build a Map<className, tokenName> for fast lookups.
|
|
4
|
+
* Maps Tailwind utility classes to their corresponding token names.
|
|
5
|
+
*
|
|
6
|
+
* E.g. token { name: "color.primary", path: ["color","primary"], type: "color" }
|
|
7
|
+
* → "bg-primary" → "color.primary"
|
|
8
|
+
* → "text-primary" → "color.primary"
|
|
9
|
+
*
|
|
10
|
+
* E.g. token { name: "spacing.md", path: ["spacing","md"], value: "16px", type: "spacing" }
|
|
11
|
+
* → "p-4" → "spacing.md" (via Tailwind scale)
|
|
12
|
+
* → "gap-md" → "spacing.md" (via token name)
|
|
13
|
+
*/
|
|
14
|
+
export declare function buildTokenClassMap(tokens: Token[]): Map<string, string>;
|
|
15
|
+
/**
|
|
16
|
+
* Find token usages in a className string.
|
|
17
|
+
* Returns correct token usages (not violations).
|
|
18
|
+
*/
|
|
19
|
+
export declare function findTokenUsages(className: string, line: number, column: number, filePath: string, classMap: Map<string, string>): TokenUsage[];
|
|
20
|
+
/**
|
|
21
|
+
* Walk AST and collect all correct token usages in a file.
|
|
22
|
+
*/
|
|
23
|
+
export declare function scanFileUsages(code: string, filePath: string, classMap: Map<string, string>): Promise<Result<TokenUsage[]>>;
|
|
24
|
+
//# sourceMappingURL=coverage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage.d.ts","sourceRoot":"","sources":["../../src/validators/coverage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE7D;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CA0DvE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,UAAU,EAAE,CAyCd;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAuD/B"}
|