rlint 0.4.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/README.md +220 -0
- package/dist/browser.d.ts +8 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +122 -0
- package/dist/browser.js.map +1 -0
- package/dist/checks/clickability.d.ts +3 -0
- package/dist/checks/clickability.d.ts.map +1 -0
- package/dist/checks/clickability.js +125 -0
- package/dist/checks/clickability.js.map +1 -0
- package/dist/checks/index.d.ts +9 -0
- package/dist/checks/index.d.ts.map +1 -0
- package/dist/checks/index.js +27 -0
- package/dist/checks/index.js.map +1 -0
- package/dist/checks/overflow.d.ts +3 -0
- package/dist/checks/overflow.d.ts.map +1 -0
- package/dist/checks/overflow.js +107 -0
- package/dist/checks/overflow.js.map +1 -0
- package/dist/checks/text-overflow.d.ts +3 -0
- package/dist/checks/text-overflow.d.ts.map +1 -0
- package/dist/checks/text-overflow.js +136 -0
- package/dist/checks/text-overflow.js.map +1 -0
- package/dist/checks/touch-targets.d.ts +3 -0
- package/dist/checks/touch-targets.d.ts.map +1 -0
- package/dist/checks/touch-targets.js +118 -0
- package/dist/checks/touch-targets.js.map +1 -0
- package/dist/checks/visibility.d.ts +3 -0
- package/dist/checks/visibility.d.ts.map +1 -0
- package/dist/checks/visibility.js +132 -0
- package/dist/checks/visibility.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +270 -0
- package/dist/cli.js.map +1 -0
- package/dist/frameworks/detector.d.ts +19 -0
- package/dist/frameworks/detector.d.ts.map +1 -0
- package/dist/frameworks/detector.js +132 -0
- package/dist/frameworks/detector.js.map +1 -0
- package/dist/frameworks/index.d.ts +44 -0
- package/dist/frameworks/index.d.ts.map +1 -0
- package/dist/frameworks/index.js +138 -0
- package/dist/frameworks/index.js.map +1 -0
- package/dist/frameworks/next.d.ts +34 -0
- package/dist/frameworks/next.d.ts.map +1 -0
- package/dist/frameworks/next.js +160 -0
- package/dist/frameworks/next.js.map +1 -0
- package/dist/frameworks/sveltekit.d.ts +34 -0
- package/dist/frameworks/sveltekit.d.ts.map +1 -0
- package/dist/frameworks/sveltekit.js +150 -0
- package/dist/frameworks/sveltekit.js.map +1 -0
- package/dist/frameworks/vite.d.ts +40 -0
- package/dist/frameworks/vite.d.ts.map +1 -0
- package/dist/frameworks/vite.js +211 -0
- package/dist/frameworks/vite.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.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 +402 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/reporter.d.ts +4 -0
- package/dist/reporter.d.ts.map +1 -0
- package/dist/reporter.js +103 -0
- package/dist/reporter.js.map +1 -0
- package/dist/runner.d.ts +8 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +63 -0
- package/dist/runner.js.map +1 -0
- package/dist/types.d.ts +96 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +69 -0
package/dist/runner.js
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { allChecks, checksByName } from './checks/index.js';
|
|
2
|
+
export async function runChecks(page, options = {}) {
|
|
3
|
+
const config = options.config || {};
|
|
4
|
+
const url = page.url();
|
|
5
|
+
const viewport = page.viewport() || { width: 1280, height: 720 };
|
|
6
|
+
// Determine which checks to run
|
|
7
|
+
let checksToRun;
|
|
8
|
+
if (options.checks && options.checks.length > 0) {
|
|
9
|
+
// Run specific checks
|
|
10
|
+
checksToRun = options.checks
|
|
11
|
+
.map(name => checksByName[name])
|
|
12
|
+
.filter((c) => c !== undefined);
|
|
13
|
+
}
|
|
14
|
+
else if (config.checks) {
|
|
15
|
+
// Run checks based on config (skip disabled ones)
|
|
16
|
+
checksToRun = allChecks.filter(check => {
|
|
17
|
+
const checkName = check.name;
|
|
18
|
+
const checkConfig = config.checks?.[checkName];
|
|
19
|
+
return checkConfig !== false;
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
// Run all checks
|
|
24
|
+
checksToRun = allChecks;
|
|
25
|
+
}
|
|
26
|
+
// Run all checks
|
|
27
|
+
const allIssues = [];
|
|
28
|
+
let totalPassed = 0;
|
|
29
|
+
for (const check of checksToRun) {
|
|
30
|
+
try {
|
|
31
|
+
const result = await check.run({ page, config });
|
|
32
|
+
allIssues.push(...result.issues);
|
|
33
|
+
totalPassed += result.passed;
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
console.error(`Error running check "${check.name}":`, error);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Apply severity from config
|
|
40
|
+
if (config.severity) {
|
|
41
|
+
for (const issue of allIssues) {
|
|
42
|
+
const checkName = issue.check;
|
|
43
|
+
if (config.severity[checkName]) {
|
|
44
|
+
issue.severity = config.severity[checkName];
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Count by severity
|
|
49
|
+
const errors = allIssues.filter(i => i.severity === 'error').length;
|
|
50
|
+
const warnings = allIssues.filter(i => i.severity === 'warning').length;
|
|
51
|
+
return {
|
|
52
|
+
url,
|
|
53
|
+
viewport,
|
|
54
|
+
timestamp: new Date().toISOString(),
|
|
55
|
+
summary: {
|
|
56
|
+
passed: totalPassed,
|
|
57
|
+
errors,
|
|
58
|
+
warnings,
|
|
59
|
+
},
|
|
60
|
+
issues: allIssues,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import type { Page } from 'puppeteer-core';
|
|
2
|
+
export type Severity = 'error' | 'warning' | 'info';
|
|
3
|
+
export interface ElementInfo {
|
|
4
|
+
selector: string;
|
|
5
|
+
tagName: string;
|
|
6
|
+
className: string;
|
|
7
|
+
id: string | null;
|
|
8
|
+
textContent: string | null;
|
|
9
|
+
rect: {
|
|
10
|
+
width: number;
|
|
11
|
+
height: number;
|
|
12
|
+
left: number;
|
|
13
|
+
top: number;
|
|
14
|
+
right: number;
|
|
15
|
+
bottom: number;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export interface Issue {
|
|
19
|
+
check: string;
|
|
20
|
+
severity: Severity;
|
|
21
|
+
message: string;
|
|
22
|
+
element: ElementInfo;
|
|
23
|
+
details: Record<string, unknown>;
|
|
24
|
+
fixHint?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface CheckResult {
|
|
27
|
+
check: string;
|
|
28
|
+
passed: number;
|
|
29
|
+
issues: Issue[];
|
|
30
|
+
}
|
|
31
|
+
export interface CheckContext {
|
|
32
|
+
page: Page;
|
|
33
|
+
config: CheckConfig;
|
|
34
|
+
}
|
|
35
|
+
export interface Check {
|
|
36
|
+
name: string;
|
|
37
|
+
description: string;
|
|
38
|
+
run: (ctx: CheckContext) => Promise<CheckResult>;
|
|
39
|
+
}
|
|
40
|
+
export interface OverflowConfig {
|
|
41
|
+
horizontal?: boolean;
|
|
42
|
+
vertical?: boolean;
|
|
43
|
+
ignore?: string[];
|
|
44
|
+
}
|
|
45
|
+
export interface ClickabilityConfig {
|
|
46
|
+
selectors?: string[];
|
|
47
|
+
checkCorners?: boolean;
|
|
48
|
+
ignore?: string[];
|
|
49
|
+
}
|
|
50
|
+
export interface TouchTargetsConfig {
|
|
51
|
+
minWidth?: number;
|
|
52
|
+
minHeight?: number;
|
|
53
|
+
selectors?: string[];
|
|
54
|
+
ignore?: string[];
|
|
55
|
+
}
|
|
56
|
+
export interface TextOverflowConfig {
|
|
57
|
+
allowEllipsis?: boolean;
|
|
58
|
+
ignore?: string[];
|
|
59
|
+
}
|
|
60
|
+
export interface VisibilityConfig {
|
|
61
|
+
selectors?: string[];
|
|
62
|
+
ignore?: string[];
|
|
63
|
+
}
|
|
64
|
+
export interface ZIndexConfig {
|
|
65
|
+
maxAllowed?: number;
|
|
66
|
+
allowNegative?: boolean;
|
|
67
|
+
ignore?: string[];
|
|
68
|
+
}
|
|
69
|
+
export interface ChecksConfig {
|
|
70
|
+
overflow?: boolean | OverflowConfig;
|
|
71
|
+
clickability?: boolean | ClickabilityConfig;
|
|
72
|
+
touchTargets?: boolean | TouchTargetsConfig;
|
|
73
|
+
textOverflow?: boolean | TextOverflowConfig;
|
|
74
|
+
visibility?: boolean | VisibilityConfig;
|
|
75
|
+
zIndex?: boolean | ZIndexConfig;
|
|
76
|
+
}
|
|
77
|
+
export interface CheckConfig {
|
|
78
|
+
checks?: ChecksConfig;
|
|
79
|
+
ignore?: string[];
|
|
80
|
+
severity?: Partial<Record<keyof ChecksConfig, Severity>>;
|
|
81
|
+
}
|
|
82
|
+
export interface HealthResults {
|
|
83
|
+
url: string;
|
|
84
|
+
viewport: {
|
|
85
|
+
width: number;
|
|
86
|
+
height: number;
|
|
87
|
+
};
|
|
88
|
+
timestamp: string;
|
|
89
|
+
summary: {
|
|
90
|
+
passed: number;
|
|
91
|
+
errors: number;
|
|
92
|
+
warnings: number;
|
|
93
|
+
};
|
|
94
|
+
issues: Issue[];
|
|
95
|
+
}
|
|
96
|
+
//# 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":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "rlint",
|
|
3
|
+
"version": "0.4.0",
|
|
4
|
+
"author": "yail259",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/yail259/rlint.git"
|
|
8
|
+
},
|
|
9
|
+
"main": "./dist/index.js",
|
|
10
|
+
"dependencies": {
|
|
11
|
+
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
12
|
+
"chalk": "^5.3.0",
|
|
13
|
+
"chrome-launcher": "1.2.1",
|
|
14
|
+
"commander": "^12.0.0",
|
|
15
|
+
"puppeteer-core": "24.36.1"
|
|
16
|
+
},
|
|
17
|
+
"devDependencies": {
|
|
18
|
+
"@types/bun": "^1.1.0",
|
|
19
|
+
"@types/node": "^20.11.0",
|
|
20
|
+
"typescript": "^5.3.3"
|
|
21
|
+
},
|
|
22
|
+
"exports": {
|
|
23
|
+
".": {
|
|
24
|
+
"types": "./dist/index.d.ts",
|
|
25
|
+
"import": "./dist/index.js"
|
|
26
|
+
},
|
|
27
|
+
"./package.json": "./package.json"
|
|
28
|
+
},
|
|
29
|
+
"bin": {
|
|
30
|
+
"rlint": "./dist/cli.js",
|
|
31
|
+
"rlint-mcp": "./dist/mcp-server.js"
|
|
32
|
+
},
|
|
33
|
+
"bugs": {
|
|
34
|
+
"url": "https://github.com/yail259/rlint/issues"
|
|
35
|
+
},
|
|
36
|
+
"description": "Catch rendered layout bugs automatically - no screenshots needed. Like ESLint for your rendered UI.",
|
|
37
|
+
"engines": {
|
|
38
|
+
"node": ">=18",
|
|
39
|
+
"bun": ">=1.0.0"
|
|
40
|
+
},
|
|
41
|
+
"files": [
|
|
42
|
+
"dist"
|
|
43
|
+
],
|
|
44
|
+
"homepage": "https://github.com/yail259/rlint#readme",
|
|
45
|
+
"keywords": [
|
|
46
|
+
"css",
|
|
47
|
+
"testing",
|
|
48
|
+
"layout",
|
|
49
|
+
"overflow",
|
|
50
|
+
"accessibility",
|
|
51
|
+
"puppeteer",
|
|
52
|
+
"automation",
|
|
53
|
+
"visual-testing",
|
|
54
|
+
"lint",
|
|
55
|
+
"rlint",
|
|
56
|
+
"bun"
|
|
57
|
+
],
|
|
58
|
+
"license": "MIT",
|
|
59
|
+
"scripts": {
|
|
60
|
+
"build": "tsc",
|
|
61
|
+
"dev": "tsc --watch",
|
|
62
|
+
"test": "bun test --timeout 30000",
|
|
63
|
+
"check": "bun src/cli.ts",
|
|
64
|
+
"mcp": "bun src/mcp-server.ts",
|
|
65
|
+
"prepublishOnly": "tsc"
|
|
66
|
+
},
|
|
67
|
+
"type": "module",
|
|
68
|
+
"types": "./dist/index.d.ts"
|
|
69
|
+
}
|