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.
Files changed (74) hide show
  1. package/README.md +220 -0
  2. package/dist/browser.d.ts +8 -0
  3. package/dist/browser.d.ts.map +1 -0
  4. package/dist/browser.js +122 -0
  5. package/dist/browser.js.map +1 -0
  6. package/dist/checks/clickability.d.ts +3 -0
  7. package/dist/checks/clickability.d.ts.map +1 -0
  8. package/dist/checks/clickability.js +125 -0
  9. package/dist/checks/clickability.js.map +1 -0
  10. package/dist/checks/index.d.ts +9 -0
  11. package/dist/checks/index.d.ts.map +1 -0
  12. package/dist/checks/index.js +27 -0
  13. package/dist/checks/index.js.map +1 -0
  14. package/dist/checks/overflow.d.ts +3 -0
  15. package/dist/checks/overflow.d.ts.map +1 -0
  16. package/dist/checks/overflow.js +107 -0
  17. package/dist/checks/overflow.js.map +1 -0
  18. package/dist/checks/text-overflow.d.ts +3 -0
  19. package/dist/checks/text-overflow.d.ts.map +1 -0
  20. package/dist/checks/text-overflow.js +136 -0
  21. package/dist/checks/text-overflow.js.map +1 -0
  22. package/dist/checks/touch-targets.d.ts +3 -0
  23. package/dist/checks/touch-targets.d.ts.map +1 -0
  24. package/dist/checks/touch-targets.js +118 -0
  25. package/dist/checks/touch-targets.js.map +1 -0
  26. package/dist/checks/visibility.d.ts +3 -0
  27. package/dist/checks/visibility.d.ts.map +1 -0
  28. package/dist/checks/visibility.js +132 -0
  29. package/dist/checks/visibility.js.map +1 -0
  30. package/dist/cli.d.ts +3 -0
  31. package/dist/cli.d.ts.map +1 -0
  32. package/dist/cli.js +270 -0
  33. package/dist/cli.js.map +1 -0
  34. package/dist/frameworks/detector.d.ts +19 -0
  35. package/dist/frameworks/detector.d.ts.map +1 -0
  36. package/dist/frameworks/detector.js +132 -0
  37. package/dist/frameworks/detector.js.map +1 -0
  38. package/dist/frameworks/index.d.ts +44 -0
  39. package/dist/frameworks/index.d.ts.map +1 -0
  40. package/dist/frameworks/index.js +138 -0
  41. package/dist/frameworks/index.js.map +1 -0
  42. package/dist/frameworks/next.d.ts +34 -0
  43. package/dist/frameworks/next.d.ts.map +1 -0
  44. package/dist/frameworks/next.js +160 -0
  45. package/dist/frameworks/next.js.map +1 -0
  46. package/dist/frameworks/sveltekit.d.ts +34 -0
  47. package/dist/frameworks/sveltekit.d.ts.map +1 -0
  48. package/dist/frameworks/sveltekit.js +150 -0
  49. package/dist/frameworks/sveltekit.js.map +1 -0
  50. package/dist/frameworks/vite.d.ts +40 -0
  51. package/dist/frameworks/vite.d.ts.map +1 -0
  52. package/dist/frameworks/vite.js +211 -0
  53. package/dist/frameworks/vite.js.map +1 -0
  54. package/dist/index.d.ts +18 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +22 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/mcp-server.d.ts +3 -0
  59. package/dist/mcp-server.d.ts.map +1 -0
  60. package/dist/mcp-server.js +402 -0
  61. package/dist/mcp-server.js.map +1 -0
  62. package/dist/reporter.d.ts +4 -0
  63. package/dist/reporter.d.ts.map +1 -0
  64. package/dist/reporter.js +103 -0
  65. package/dist/reporter.js.map +1 -0
  66. package/dist/runner.d.ts +8 -0
  67. package/dist/runner.d.ts.map +1 -0
  68. package/dist/runner.js +63 -0
  69. package/dist/runner.js.map +1 -0
  70. package/dist/types.d.ts +96 -0
  71. package/dist/types.d.ts.map +1 -0
  72. package/dist/types.js +2 -0
  73. package/dist/types.js.map +1 -0
  74. 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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"}
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -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
+ }