@mseep/dembrandt 0.19.5
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/LICENSE +21 -0
- package/README.md +408 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +532 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/browser.d.ts +16 -0
- package/dist/lib/browser.js +27 -0
- package/dist/lib/browser.js.map +1 -0
- package/dist/lib/colors.d.ts +101 -0
- package/dist/lib/colors.js +405 -0
- package/dist/lib/colors.js.map +1 -0
- package/dist/lib/compare.d.ts +31 -0
- package/dist/lib/compare.js +46 -0
- package/dist/lib/compare.js.map +1 -0
- package/dist/lib/discovery.d.ts +31 -0
- package/dist/lib/discovery.js +243 -0
- package/dist/lib/discovery.js.map +1 -0
- package/dist/lib/drift.d.ts +64 -0
- package/dist/lib/drift.js +383 -0
- package/dist/lib/drift.js.map +1 -0
- package/dist/lib/dtcg/validate.d.ts +51 -0
- package/dist/lib/dtcg/validate.js +1403 -0
- package/dist/lib/dtcg/validate.js.map +1 -0
- package/dist/lib/exit-codes.d.ts +29 -0
- package/dist/lib/exit-codes.js +26 -0
- package/dist/lib/exit-codes.js.map +1 -0
- package/dist/lib/extractors/breakpoints.d.ts +5 -0
- package/dist/lib/extractors/breakpoints.js +450 -0
- package/dist/lib/extractors/breakpoints.js.map +1 -0
- package/dist/lib/extractors/colors.d.ts +2 -0
- package/dist/lib/extractors/colors.js +657 -0
- package/dist/lib/extractors/colors.js.map +1 -0
- package/dist/lib/extractors/components.d.ts +4 -0
- package/dist/lib/extractors/components.js +370 -0
- package/dist/lib/extractors/components.js.map +1 -0
- package/dist/lib/extractors/index.d.ts +9 -0
- package/dist/lib/extractors/index.js +1257 -0
- package/dist/lib/extractors/index.js.map +1 -0
- package/dist/lib/extractors/logo.d.ts +2 -0
- package/dist/lib/extractors/logo.js +626 -0
- package/dist/lib/extractors/logo.js.map +1 -0
- package/dist/lib/extractors/spacing.d.ts +4 -0
- package/dist/lib/extractors/spacing.js +163 -0
- package/dist/lib/extractors/spacing.js.map +1 -0
- package/dist/lib/extractors/teach.d.ts +1 -0
- package/dist/lib/extractors/teach.js +66 -0
- package/dist/lib/extractors/teach.js.map +1 -0
- package/dist/lib/extractors/typography.d.ts +1 -0
- package/dist/lib/extractors/typography.js +163 -0
- package/dist/lib/extractors/typography.js.map +1 -0
- package/dist/lib/findings.d.ts +34 -0
- package/dist/lib/findings.js +166 -0
- package/dist/lib/findings.js.map +1 -0
- package/dist/lib/formatters/dtcg.d.ts +10 -0
- package/dist/lib/formatters/dtcg.js +416 -0
- package/dist/lib/formatters/dtcg.js.map +1 -0
- package/dist/lib/formatters/html.d.ts +25 -0
- package/dist/lib/formatters/html.js +479 -0
- package/dist/lib/formatters/html.js.map +1 -0
- package/dist/lib/formatters/markdown.d.ts +5 -0
- package/dist/lib/formatters/markdown.js +568 -0
- package/dist/lib/formatters/markdown.js.map +1 -0
- package/dist/lib/formatters/pdf.d.ts +12 -0
- package/dist/lib/formatters/pdf.js +1121 -0
- package/dist/lib/formatters/pdf.js.map +1 -0
- package/dist/lib/formatters/terminal.d.ts +6 -0
- package/dist/lib/formatters/terminal.js +954 -0
- package/dist/lib/formatters/terminal.js.map +1 -0
- package/dist/lib/formatters/theme.d.ts +35 -0
- package/dist/lib/formatters/theme.js +37 -0
- package/dist/lib/formatters/theme.js.map +1 -0
- package/dist/lib/merger.d.ts +14 -0
- package/dist/lib/merger.js +362 -0
- package/dist/lib/merger.js.map +1 -0
- package/dist/lib/normalize.d.ts +29 -0
- package/dist/lib/normalize.js +59 -0
- package/dist/lib/normalize.js.map +1 -0
- package/dist/lib/robots.d.ts +12 -0
- package/dist/lib/robots.js +110 -0
- package/dist/lib/robots.js.map +1 -0
- package/dist/lib/run-summary.d.ts +40 -0
- package/dist/lib/run-summary.js +64 -0
- package/dist/lib/run-summary.js.map +1 -0
- package/dist/lib/types.d.ts +329 -0
- package/dist/lib/types.js +7 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/lib/version.d.ts +134 -0
- package/dist/lib/version.js +153 -0
- package/dist/lib/version.js.map +1 -0
- package/dist/mcp-server.d.ts +11 -0
- package/dist/mcp-server.js +311 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/package.json +106 -0
- package/dist/test/_vitest-shim.d.ts +13 -0
- package/dist/test/_vitest-shim.js +23 -0
- package/dist/test/_vitest-shim.js.map +1 -0
- package/dist/test/cli.test.d.ts +1 -0
- package/dist/test/cli.test.js +24 -0
- package/dist/test/cli.test.js.map +1 -0
- package/dist/test/colors.test.d.ts +1 -0
- package/dist/test/colors.test.js +64 -0
- package/dist/test/colors.test.js.map +1 -0
- package/dist/test/compare.test.d.ts +1 -0
- package/dist/test/compare.test.js +57 -0
- package/dist/test/compare.test.js.map +1 -0
- package/dist/test/drift.test.d.ts +1 -0
- package/dist/test/drift.test.js +53 -0
- package/dist/test/drift.test.js.map +1 -0
- package/dist/test/dtcg-formatter.test.d.ts +1 -0
- package/dist/test/dtcg-formatter.test.js +48 -0
- package/dist/test/dtcg-formatter.test.js.map +1 -0
- package/dist/test/dtcg-validate.test.d.ts +1 -0
- package/dist/test/dtcg-validate.test.js +2129 -0
- package/dist/test/dtcg-validate.test.js.map +1 -0
- package/dist/test/exit-codes.test.d.ts +1 -0
- package/dist/test/exit-codes.test.js +53 -0
- package/dist/test/exit-codes.test.js.map +1 -0
- package/dist/test/findings.test.d.ts +1 -0
- package/dist/test/findings.test.js +77 -0
- package/dist/test/findings.test.js.map +1 -0
- package/dist/test/html.test.d.ts +1 -0
- package/dist/test/html.test.js +95 -0
- package/dist/test/html.test.js.map +1 -0
- package/dist/test/markdown.test.d.ts +1 -0
- package/dist/test/markdown.test.js +145 -0
- package/dist/test/markdown.test.js.map +1 -0
- package/dist/test/merger.test.d.ts +1 -0
- package/dist/test/merger.test.js +98 -0
- package/dist/test/merger.test.js.map +1 -0
- package/dist/test/normalize.test.d.ts +1 -0
- package/dist/test/normalize.test.js +47 -0
- package/dist/test/normalize.test.js.map +1 -0
- package/dist/test/run-summary.test.d.ts +1 -0
- package/dist/test/run-summary.test.js +45 -0
- package/dist/test/run-summary.test.js.map +1 -0
- package/dist/test/version.test.d.ts +1 -0
- package/dist/test/version.test.js +73 -0
- package/dist/test/version.test.js.map +1 -0
- package/package.json +106 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Color Conversion Utilities
|
|
3
|
+
*
|
|
4
|
+
* Converts colors between RGB, LCH, and OKLCH color spaces.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Convert RGB to LCH
|
|
8
|
+
* @param {number} r - Red (0-255)
|
|
9
|
+
* @param {number} g - Green (0-255)
|
|
10
|
+
* @param {number} b - Blue (0-255)
|
|
11
|
+
* @returns {{ l: number, c: number, h: number }}
|
|
12
|
+
*/
|
|
13
|
+
export declare function rgbToLch(r: any, g: any, b: any): {
|
|
14
|
+
l: any;
|
|
15
|
+
c: number;
|
|
16
|
+
h: number;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Convert RGB to OKLCH
|
|
20
|
+
* @param {number} r - Red (0-255)
|
|
21
|
+
* @param {number} g - Green (0-255)
|
|
22
|
+
* @param {number} b - Blue (0-255)
|
|
23
|
+
* @returns {{ l: number, c: number, h: number }}
|
|
24
|
+
*/
|
|
25
|
+
export declare function rgbToOklch(r: any, g: any, b: any): {
|
|
26
|
+
l: any;
|
|
27
|
+
c: number;
|
|
28
|
+
h: number;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Format LCH values as CSS lch() string
|
|
32
|
+
* @param {{ l: number, c: number, h: number }} lch
|
|
33
|
+
* @param {number} [alpha] - Optional alpha value (0-1)
|
|
34
|
+
* @returns {string}
|
|
35
|
+
*/
|
|
36
|
+
export declare function formatLch(lch: any, alpha: any): string;
|
|
37
|
+
/**
|
|
38
|
+
* Format OKLCH values as CSS oklch() string
|
|
39
|
+
* @param {{ l: number, c: number, h: number }} oklch
|
|
40
|
+
* @param {number} [alpha] - Optional alpha value (0-1)
|
|
41
|
+
* @returns {string}
|
|
42
|
+
*/
|
|
43
|
+
export declare function formatOklch(oklch: any, alpha: any): string;
|
|
44
|
+
/**
|
|
45
|
+
* Compute CIE76 delta-E perceptual distance between two hex colors.
|
|
46
|
+
* Returns 0 for identical colors, ~100 for maximally different.
|
|
47
|
+
* @param {string} hex1 - Hex color string (e.g. "#ff0000")
|
|
48
|
+
* @param {string} hex2 - Hex color string
|
|
49
|
+
* @returns {number}
|
|
50
|
+
*/
|
|
51
|
+
export declare function deltaE(hex1: any, hex2: any): number;
|
|
52
|
+
/**
|
|
53
|
+
* Perceptual color distance using CIEDE2000 — the accurate successor to the
|
|
54
|
+
* CIE76 Euclidean distance in deltaE(). Accepts hex or rgb()/rgba() strings.
|
|
55
|
+
* Returns 0 for identical inputs and 100 when either color cannot be parsed.
|
|
56
|
+
* A just-noticeable difference is ~2.3.
|
|
57
|
+
* @param {string} c1
|
|
58
|
+
* @param {string} c2
|
|
59
|
+
* @returns {number}
|
|
60
|
+
*/
|
|
61
|
+
export declare function deltaE2000(c1: any, c2: any): number;
|
|
62
|
+
/**
|
|
63
|
+
* Parse a hex color string and return RGB values
|
|
64
|
+
* @param {string} hex - Hex color (#fff, #ffffff, #ffffffaa)
|
|
65
|
+
* @returns {{ r: number, g: number, b: number, a?: number } | null}
|
|
66
|
+
*/
|
|
67
|
+
export declare function hexToRgb(hex: any): {
|
|
68
|
+
r: number;
|
|
69
|
+
g: number;
|
|
70
|
+
b: number;
|
|
71
|
+
a?: undefined;
|
|
72
|
+
} | {
|
|
73
|
+
r: number;
|
|
74
|
+
g: number;
|
|
75
|
+
b: number;
|
|
76
|
+
a: number;
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Compute WCAG 2.1 relative luminance for a hex color.
|
|
80
|
+
* @param {string} hex
|
|
81
|
+
* @returns {number|null}
|
|
82
|
+
*/
|
|
83
|
+
export declare function relativeLuminance(hex: any): number;
|
|
84
|
+
/**
|
|
85
|
+
* Compute WCAG contrast ratios for all pairs in a color palette.
|
|
86
|
+
* @param {Array<{color: string, normalized: string, confidence: string}>} palette
|
|
87
|
+
* @returns {Array<{fg: string, bg: string, ratio: number, aa: boolean, aaLarge: boolean, aaa: boolean}>}
|
|
88
|
+
*/
|
|
89
|
+
export declare function computeWcag(palette: any): any[];
|
|
90
|
+
/**
|
|
91
|
+
* Convert any supported color format to all formats
|
|
92
|
+
* @param {string} colorString - Color in hex, rgb(), or rgba() format
|
|
93
|
+
* @returns {{ hex: string, rgb: string, lch: string, oklch: string, hasAlpha: boolean } | null}
|
|
94
|
+
*/
|
|
95
|
+
export declare function convertColor(colorString: any): {
|
|
96
|
+
hex: string;
|
|
97
|
+
rgb: string;
|
|
98
|
+
lch: string;
|
|
99
|
+
oklch: string;
|
|
100
|
+
hasAlpha: boolean;
|
|
101
|
+
};
|
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Color Conversion Utilities
|
|
3
|
+
*
|
|
4
|
+
* Converts colors between RGB, LCH, and OKLCH color spaces.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Convert sRGB to linear RGB
|
|
8
|
+
*/
|
|
9
|
+
function srgbToLinear(c) {
|
|
10
|
+
c = c / 255;
|
|
11
|
+
return c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Convert linear RGB to XYZ (D65 illuminant)
|
|
15
|
+
*/
|
|
16
|
+
function linearRgbToXyz(r, g, b) {
|
|
17
|
+
return {
|
|
18
|
+
x: 0.4124564 * r + 0.3575761 * g + 0.1804375 * b,
|
|
19
|
+
y: 0.2126729 * r + 0.7151522 * g + 0.0721750 * b,
|
|
20
|
+
z: 0.0193339 * r + 0.1191920 * g + 0.9503041 * b
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Convert XYZ to Lab (D65 reference white)
|
|
25
|
+
*/
|
|
26
|
+
function xyzToLab(x, y, z) {
|
|
27
|
+
// D65 reference white
|
|
28
|
+
const xn = 0.95047;
|
|
29
|
+
const yn = 1.00000;
|
|
30
|
+
const zn = 1.08883;
|
|
31
|
+
const f = (t) => t > 0.008856 ? Math.cbrt(t) : (903.3 * t + 16) / 116;
|
|
32
|
+
const fx = f(x / xn);
|
|
33
|
+
const fy = f(y / yn);
|
|
34
|
+
const fz = f(z / zn);
|
|
35
|
+
return {
|
|
36
|
+
l: 116 * fy - 16,
|
|
37
|
+
a: 500 * (fx - fy),
|
|
38
|
+
b: 200 * (fy - fz)
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Convert Lab to LCH
|
|
43
|
+
*/
|
|
44
|
+
function labToLch(l, a, b) {
|
|
45
|
+
const c = Math.sqrt(a * a + b * b);
|
|
46
|
+
let h = Math.atan2(b, a) * (180 / Math.PI);
|
|
47
|
+
if (h < 0)
|
|
48
|
+
h += 360;
|
|
49
|
+
return {
|
|
50
|
+
l: l,
|
|
51
|
+
c: c,
|
|
52
|
+
h: h
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Convert RGB to LCH
|
|
57
|
+
* @param {number} r - Red (0-255)
|
|
58
|
+
* @param {number} g - Green (0-255)
|
|
59
|
+
* @param {number} b - Blue (0-255)
|
|
60
|
+
* @returns {{ l: number, c: number, h: number }}
|
|
61
|
+
*/
|
|
62
|
+
export function rgbToLch(r, g, b) {
|
|
63
|
+
const lr = srgbToLinear(r);
|
|
64
|
+
const lg = srgbToLinear(g);
|
|
65
|
+
const lb = srgbToLinear(b);
|
|
66
|
+
const xyz = linearRgbToXyz(lr, lg, lb);
|
|
67
|
+
const lab = xyzToLab(xyz.x, xyz.y, xyz.z);
|
|
68
|
+
return labToLch(lab.l, lab.a, lab.b);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Convert linear RGB to OKLab
|
|
72
|
+
* Uses the OKLab color space for perceptual uniformity
|
|
73
|
+
*/
|
|
74
|
+
function linearRgbToOklab(r, g, b) {
|
|
75
|
+
const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b);
|
|
76
|
+
const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b);
|
|
77
|
+
const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b);
|
|
78
|
+
return {
|
|
79
|
+
L: 0.2104542553 * l + 0.7936177850 * m - 0.0040720468 * s,
|
|
80
|
+
a: 1.9779984951 * l - 2.4285922050 * m + 0.4505937099 * s,
|
|
81
|
+
b: 0.0259040371 * l + 0.7827717662 * m - 0.8086757660 * s
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Convert OKLab to OKLCH
|
|
86
|
+
*/
|
|
87
|
+
function oklabToOklch(L, a, b) {
|
|
88
|
+
const c = Math.sqrt(a * a + b * b);
|
|
89
|
+
let h = Math.atan2(b, a) * (180 / Math.PI);
|
|
90
|
+
if (h < 0)
|
|
91
|
+
h += 360;
|
|
92
|
+
return {
|
|
93
|
+
l: L,
|
|
94
|
+
c: c,
|
|
95
|
+
h: h
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Convert RGB to OKLCH
|
|
100
|
+
* @param {number} r - Red (0-255)
|
|
101
|
+
* @param {number} g - Green (0-255)
|
|
102
|
+
* @param {number} b - Blue (0-255)
|
|
103
|
+
* @returns {{ l: number, c: number, h: number }}
|
|
104
|
+
*/
|
|
105
|
+
export function rgbToOklch(r, g, b) {
|
|
106
|
+
const lr = srgbToLinear(r);
|
|
107
|
+
const lg = srgbToLinear(g);
|
|
108
|
+
const lb = srgbToLinear(b);
|
|
109
|
+
const oklab = linearRgbToOklab(lr, lg, lb);
|
|
110
|
+
return oklabToOklch(oklab.L, oklab.a, oklab.b);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Format LCH values as CSS lch() string
|
|
114
|
+
* @param {{ l: number, c: number, h: number }} lch
|
|
115
|
+
* @param {number} [alpha] - Optional alpha value (0-1)
|
|
116
|
+
* @returns {string}
|
|
117
|
+
*/
|
|
118
|
+
export function formatLch(lch, alpha) {
|
|
119
|
+
const l = Math.round(lch.l * 100) / 100;
|
|
120
|
+
const c = Math.round(lch.c * 100) / 100;
|
|
121
|
+
const h = Math.round(lch.h * 100) / 100;
|
|
122
|
+
if (alpha !== undefined && alpha < 1) {
|
|
123
|
+
return `lch(${l}% ${c} ${h} / ${alpha})`;
|
|
124
|
+
}
|
|
125
|
+
return `lch(${l}% ${c} ${h})`;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Format OKLCH values as CSS oklch() string
|
|
129
|
+
* @param {{ l: number, c: number, h: number }} oklch
|
|
130
|
+
* @param {number} [alpha] - Optional alpha value (0-1)
|
|
131
|
+
* @returns {string}
|
|
132
|
+
*/
|
|
133
|
+
export function formatOklch(oklch, alpha) {
|
|
134
|
+
// OKLCH lightness is 0-1, displayed as percentage
|
|
135
|
+
const l = Math.round(oklch.l * 10000) / 100;
|
|
136
|
+
const c = Math.round(oklch.c * 1000) / 1000;
|
|
137
|
+
const h = Math.round(oklch.h * 100) / 100;
|
|
138
|
+
if (alpha !== undefined && alpha < 1) {
|
|
139
|
+
return `oklch(${l}% ${c} ${h} / ${alpha})`;
|
|
140
|
+
}
|
|
141
|
+
return `oklch(${l}% ${c} ${h})`;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Compute CIE76 delta-E perceptual distance between two hex colors.
|
|
145
|
+
* Returns 0 for identical colors, ~100 for maximally different.
|
|
146
|
+
* @param {string} hex1 - Hex color string (e.g. "#ff0000")
|
|
147
|
+
* @param {string} hex2 - Hex color string
|
|
148
|
+
* @returns {number}
|
|
149
|
+
*/
|
|
150
|
+
export function deltaE(hex1, hex2) {
|
|
151
|
+
function toLab(hex) {
|
|
152
|
+
const rgb = hexToRgb(hex);
|
|
153
|
+
if (!rgb)
|
|
154
|
+
return null;
|
|
155
|
+
const lr = srgbToLinear(rgb.r);
|
|
156
|
+
const lg = srgbToLinear(rgb.g);
|
|
157
|
+
const lb = srgbToLinear(rgb.b);
|
|
158
|
+
const xyz = linearRgbToXyz(lr, lg, lb);
|
|
159
|
+
return xyzToLab(xyz.x, xyz.y, xyz.z);
|
|
160
|
+
}
|
|
161
|
+
const lab1 = toLab(hex1);
|
|
162
|
+
const lab2 = toLab(hex2);
|
|
163
|
+
if (!lab1 || !lab2)
|
|
164
|
+
return 999;
|
|
165
|
+
return Math.sqrt(Math.pow(lab1.l - lab2.l, 2) +
|
|
166
|
+
Math.pow(lab1.a - lab2.a, 2) +
|
|
167
|
+
Math.pow(lab1.b - lab2.b, 2));
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Perceptual color distance using CIEDE2000 — the accurate successor to the
|
|
171
|
+
* CIE76 Euclidean distance in deltaE(). Accepts hex or rgb()/rgba() strings.
|
|
172
|
+
* Returns 0 for identical inputs and 100 when either color cannot be parsed.
|
|
173
|
+
* A just-noticeable difference is ~2.3.
|
|
174
|
+
* @param {string} c1
|
|
175
|
+
* @param {string} c2
|
|
176
|
+
* @returns {number}
|
|
177
|
+
*/
|
|
178
|
+
export function deltaE2000(c1, c2) {
|
|
179
|
+
if (c1 === c2)
|
|
180
|
+
return 0;
|
|
181
|
+
const lab1 = toLabFlexible(c1);
|
|
182
|
+
const lab2 = toLabFlexible(c2);
|
|
183
|
+
if (!lab1 || !lab2)
|
|
184
|
+
return 100;
|
|
185
|
+
return ciede2000(lab1, lab2);
|
|
186
|
+
}
|
|
187
|
+
function toLabFlexible(input) {
|
|
188
|
+
let rgb = hexToRgb(input);
|
|
189
|
+
if (!rgb) {
|
|
190
|
+
const m = String(input).match(/rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/i);
|
|
191
|
+
if (m)
|
|
192
|
+
rgb = { r: Number(m[1]), g: Number(m[2]), b: Number(m[3]) };
|
|
193
|
+
}
|
|
194
|
+
if (!rgb)
|
|
195
|
+
return null;
|
|
196
|
+
const xyz = linearRgbToXyz(srgbToLinear(rgb.r), srgbToLinear(rgb.g), srgbToLinear(rgb.b));
|
|
197
|
+
return xyzToLab(xyz.x, xyz.y, xyz.z); // { l, a, b }
|
|
198
|
+
}
|
|
199
|
+
function ciede2000(lab1, lab2) {
|
|
200
|
+
const rad = (deg) => (deg * Math.PI) / 180;
|
|
201
|
+
const deg = (r) => (r * 180) / Math.PI;
|
|
202
|
+
const { l: L1, a: a1, b: b1 } = lab1;
|
|
203
|
+
const { l: L2, a: a2, b: b2 } = lab2;
|
|
204
|
+
const C1 = Math.sqrt(a1 ** 2 + b1 ** 2);
|
|
205
|
+
const C2 = Math.sqrt(a2 ** 2 + b2 ** 2);
|
|
206
|
+
const Cab = (C1 + C2) / 2;
|
|
207
|
+
const Cab7 = Cab ** 7;
|
|
208
|
+
const G = 0.5 * (1 - Math.sqrt(Cab7 / (Cab7 + 25 ** 7)));
|
|
209
|
+
const a1p = a1 * (1 + G);
|
|
210
|
+
const a2p = a2 * (1 + G);
|
|
211
|
+
const C1p = Math.sqrt(a1p ** 2 + b1 ** 2);
|
|
212
|
+
const C2p = Math.sqrt(a2p ** 2 + b2 ** 2);
|
|
213
|
+
let h1p = deg(Math.atan2(b1, a1p));
|
|
214
|
+
if (h1p < 0)
|
|
215
|
+
h1p += 360;
|
|
216
|
+
let h2p = deg(Math.atan2(b2, a2p));
|
|
217
|
+
if (h2p < 0)
|
|
218
|
+
h2p += 360;
|
|
219
|
+
const dLp = L2 - L1;
|
|
220
|
+
const dCp = C2p - C1p;
|
|
221
|
+
let dhp;
|
|
222
|
+
if (C1p * C2p === 0)
|
|
223
|
+
dhp = 0;
|
|
224
|
+
else if (Math.abs(h2p - h1p) <= 180)
|
|
225
|
+
dhp = h2p - h1p;
|
|
226
|
+
else if (h2p - h1p > 180)
|
|
227
|
+
dhp = h2p - h1p - 360;
|
|
228
|
+
else
|
|
229
|
+
dhp = h2p - h1p + 360;
|
|
230
|
+
const dHp = 2 * Math.sqrt(C1p * C2p) * Math.sin(rad(dhp / 2));
|
|
231
|
+
const Lpm = (L1 + L2) / 2;
|
|
232
|
+
const Cpm = (C1p + C2p) / 2;
|
|
233
|
+
let hpm;
|
|
234
|
+
if (C1p * C2p === 0)
|
|
235
|
+
hpm = h1p + h2p;
|
|
236
|
+
else if (Math.abs(h1p - h2p) <= 180)
|
|
237
|
+
hpm = (h1p + h2p) / 2;
|
|
238
|
+
else if (h1p + h2p < 360)
|
|
239
|
+
hpm = (h1p + h2p + 360) / 2;
|
|
240
|
+
else
|
|
241
|
+
hpm = (h1p + h2p - 360) / 2;
|
|
242
|
+
const T = 1
|
|
243
|
+
- 0.17 * Math.cos(rad(hpm - 30))
|
|
244
|
+
+ 0.24 * Math.cos(rad(2 * hpm))
|
|
245
|
+
+ 0.32 * Math.cos(rad(3 * hpm + 6))
|
|
246
|
+
- 0.20 * Math.cos(rad(4 * hpm - 63));
|
|
247
|
+
const SL = 1 + 0.015 * (Lpm - 50) ** 2 / Math.sqrt(20 + (Lpm - 50) ** 2);
|
|
248
|
+
const SC = 1 + 0.045 * Cpm;
|
|
249
|
+
const SH = 1 + 0.015 * Cpm * T;
|
|
250
|
+
const Cpm7 = Cpm ** 7;
|
|
251
|
+
const RC = 2 * Math.sqrt(Cpm7 / (Cpm7 + 25 ** 7));
|
|
252
|
+
const dTheta = 30 * Math.exp(-(((hpm - 275) / 25) ** 2));
|
|
253
|
+
const RT = -Math.sin(rad(2 * dTheta)) * RC;
|
|
254
|
+
return Math.sqrt((dLp / SL) ** 2 +
|
|
255
|
+
(dCp / SC) ** 2 +
|
|
256
|
+
(dHp / SH) ** 2 +
|
|
257
|
+
RT * (dCp / SC) * (dHp / SH));
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Parse a hex color string and return RGB values
|
|
261
|
+
* @param {string} hex - Hex color (#fff, #ffffff, #ffffffaa)
|
|
262
|
+
* @returns {{ r: number, g: number, b: number, a?: number } | null}
|
|
263
|
+
*/
|
|
264
|
+
export function hexToRgb(hex) {
|
|
265
|
+
if (!hex || !hex.startsWith('#'))
|
|
266
|
+
return null;
|
|
267
|
+
// Remove #
|
|
268
|
+
hex = hex.slice(1);
|
|
269
|
+
// Handle 3-digit hex
|
|
270
|
+
if (hex.length === 3) {
|
|
271
|
+
return {
|
|
272
|
+
r: parseInt(hex[0] + hex[0], 16),
|
|
273
|
+
g: parseInt(hex[1] + hex[1], 16),
|
|
274
|
+
b: parseInt(hex[2] + hex[2], 16)
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
// Handle 6-digit hex
|
|
278
|
+
if (hex.length === 6) {
|
|
279
|
+
return {
|
|
280
|
+
r: parseInt(hex.slice(0, 2), 16),
|
|
281
|
+
g: parseInt(hex.slice(2, 4), 16),
|
|
282
|
+
b: parseInt(hex.slice(4, 6), 16)
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
// Handle 8-digit hex (with alpha)
|
|
286
|
+
if (hex.length === 8) {
|
|
287
|
+
return {
|
|
288
|
+
r: parseInt(hex.slice(0, 2), 16),
|
|
289
|
+
g: parseInt(hex.slice(2, 4), 16),
|
|
290
|
+
b: parseInt(hex.slice(4, 6), 16),
|
|
291
|
+
a: parseInt(hex.slice(6, 8), 16) / 255
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
return null;
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Compute WCAG 2.1 relative luminance for a hex color.
|
|
298
|
+
* @param {string} hex
|
|
299
|
+
* @returns {number|null}
|
|
300
|
+
*/
|
|
301
|
+
export function relativeLuminance(hex) {
|
|
302
|
+
const rgb = hexToRgb(hex);
|
|
303
|
+
if (!rgb)
|
|
304
|
+
return null;
|
|
305
|
+
return 0.2126 * srgbToLinear(rgb.r) + 0.7152 * srgbToLinear(rgb.g) + 0.0722 * srgbToLinear(rgb.b);
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Compute WCAG contrast ratios for all pairs in a color palette.
|
|
309
|
+
* @param {Array<{color: string, normalized: string, confidence: string}>} palette
|
|
310
|
+
* @returns {Array<{fg: string, bg: string, ratio: number, aa: boolean, aaLarge: boolean, aaa: boolean}>}
|
|
311
|
+
*/
|
|
312
|
+
export function computeWcag(palette) {
|
|
313
|
+
const colors = palette
|
|
314
|
+
.filter(c => c.normalized && c.normalized.startsWith('#'))
|
|
315
|
+
.slice(0, 10);
|
|
316
|
+
const pairs = [];
|
|
317
|
+
for (let i = 0; i < colors.length; i++) {
|
|
318
|
+
for (let j = i + 1; j < colors.length; j++) {
|
|
319
|
+
const l1 = relativeLuminance(colors[i].normalized);
|
|
320
|
+
const l2 = relativeLuminance(colors[j].normalized);
|
|
321
|
+
if (l1 === null || l2 === null)
|
|
322
|
+
continue;
|
|
323
|
+
const lighter = Math.max(l1, l2);
|
|
324
|
+
const darker = Math.min(l1, l2);
|
|
325
|
+
const ratio = (lighter + 0.05) / (darker + 0.05);
|
|
326
|
+
const fg = l1 >= l2 ? colors[i].normalized : colors[j].normalized;
|
|
327
|
+
const bg = l1 >= l2 ? colors[j].normalized : colors[i].normalized;
|
|
328
|
+
pairs.push({
|
|
329
|
+
fg,
|
|
330
|
+
bg,
|
|
331
|
+
ratio: Math.round(ratio * 100) / 100,
|
|
332
|
+
aa: ratio >= 4.5,
|
|
333
|
+
aaLarge: ratio >= 3,
|
|
334
|
+
aaa: ratio >= 7,
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
return pairs.sort((a, b) => b.ratio - a.ratio);
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Convert any supported color format to all formats
|
|
342
|
+
* @param {string} colorString - Color in hex, rgb(), or rgba() format
|
|
343
|
+
* @returns {{ hex: string, rgb: string, lch: string, oklch: string, hasAlpha: boolean } | null}
|
|
344
|
+
*/
|
|
345
|
+
export function convertColor(colorString) {
|
|
346
|
+
let r, g, b, a;
|
|
347
|
+
// Parse rgba/rgb
|
|
348
|
+
const rgbaMatch = colorString.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*([\d.]+))?\)/);
|
|
349
|
+
if (rgbaMatch) {
|
|
350
|
+
r = parseInt(rgbaMatch[1]);
|
|
351
|
+
g = parseInt(rgbaMatch[2]);
|
|
352
|
+
b = parseInt(rgbaMatch[3]);
|
|
353
|
+
a = rgbaMatch[4] ? parseFloat(rgbaMatch[4]) : undefined;
|
|
354
|
+
}
|
|
355
|
+
else if (/^hsla?\(/.test(colorString)) {
|
|
356
|
+
// Parse hsl/hsla
|
|
357
|
+
const hslMatch = colorString.match(/hsla?\(([\d.]+),\s*([\d.]+)%?,\s*([\d.]+)%?(?:,\s*([\d.]+))?\)/);
|
|
358
|
+
if (!hslMatch)
|
|
359
|
+
return null;
|
|
360
|
+
const h = parseFloat(hslMatch[1]) / 360;
|
|
361
|
+
const s = parseFloat(hslMatch[2]) / 100;
|
|
362
|
+
const l = parseFloat(hslMatch[3]) / 100;
|
|
363
|
+
a = hslMatch[4] ? parseFloat(hslMatch[4]) : undefined;
|
|
364
|
+
const q = l < 0.5 ? l * (1 + s) : l + s - l * s;
|
|
365
|
+
const p = 2 * l - q;
|
|
366
|
+
const hue2rgb = (p, q, t) => {
|
|
367
|
+
if (t < 0)
|
|
368
|
+
t += 1;
|
|
369
|
+
if (t > 1)
|
|
370
|
+
t -= 1;
|
|
371
|
+
if (t < 1 / 6)
|
|
372
|
+
return p + (q - p) * 6 * t;
|
|
373
|
+
if (t < 1 / 2)
|
|
374
|
+
return q;
|
|
375
|
+
if (t < 2 / 3)
|
|
376
|
+
return p + (q - p) * (2 / 3 - t) * 6;
|
|
377
|
+
return p;
|
|
378
|
+
};
|
|
379
|
+
r = Math.round(hue2rgb(p, q, h + 1 / 3) * 255);
|
|
380
|
+
g = Math.round(hue2rgb(p, q, h) * 255);
|
|
381
|
+
b = Math.round(hue2rgb(p, q, h - 1 / 3) * 255);
|
|
382
|
+
}
|
|
383
|
+
else {
|
|
384
|
+
// Try hex
|
|
385
|
+
const rgb = hexToRgb(colorString);
|
|
386
|
+
if (!rgb)
|
|
387
|
+
return null;
|
|
388
|
+
r = rgb.r;
|
|
389
|
+
g = rgb.g;
|
|
390
|
+
b = rgb.b;
|
|
391
|
+
a = rgb.a;
|
|
392
|
+
}
|
|
393
|
+
const hex = `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;
|
|
394
|
+
const rgbStr = a !== undefined ? `rgba(${r}, ${g}, ${b}, ${a})` : `rgb(${r}, ${g}, ${b})`;
|
|
395
|
+
const lchValues = rgbToLch(r, g, b);
|
|
396
|
+
const oklchValues = rgbToOklch(r, g, b);
|
|
397
|
+
return {
|
|
398
|
+
hex: hex.toLowerCase(),
|
|
399
|
+
rgb: rgbStr,
|
|
400
|
+
lch: formatLch(lchValues, a),
|
|
401
|
+
oklch: formatOklch(oklchValues, a),
|
|
402
|
+
hasAlpha: a !== undefined && a < 1
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
//# sourceMappingURL=colors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colors.js","sourceRoot":"","sources":["../../lib/colors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* --compare dispatch. The argument is either:
|
|
3
|
+
* - a local file → diff against it here (free, offline, deterministic)
|
|
4
|
+
* - a baseline id → POST the candidate to the Dembrandt App, which stores
|
|
5
|
+
* baselines and runs the same engine server-side
|
|
6
|
+
*
|
|
7
|
+
* Same flag, two backends — the local path is the free wedge; the id path is the
|
|
8
|
+
* App platform (dembrandt-next/app). Both call the one canonical drift engine.
|
|
9
|
+
*
|
|
10
|
+
* Dependencies are injectable so the dispatch is unit-testable without a real
|
|
11
|
+
* filesystem or network.
|
|
12
|
+
*/
|
|
13
|
+
import type { BrandingResult } from "./types.js";
|
|
14
|
+
import type { DriftReport } from "./drift.js";
|
|
15
|
+
export interface CompareResult {
|
|
16
|
+
report: DriftReport;
|
|
17
|
+
/** Human label for where the baseline came from (file path or "<api> #<id>"). */
|
|
18
|
+
source: string;
|
|
19
|
+
/** "local" file diff or "platform" App diff. */
|
|
20
|
+
mode: "local" | "platform";
|
|
21
|
+
}
|
|
22
|
+
export interface CompareDeps {
|
|
23
|
+
isFile?: (p: string) => boolean;
|
|
24
|
+
readFile?: (p: string, enc: "utf-8") => string;
|
|
25
|
+
fetchFn?: typeof fetch;
|
|
26
|
+
/** App base URL. Caller passes the `.dembrandtrc` `endpoint`; default is the
|
|
27
|
+
* production App at https://dembrandt.com. */
|
|
28
|
+
api?: string;
|
|
29
|
+
}
|
|
30
|
+
/** Resolve a `--compare <arg>` into a drift report, dispatching on file vs id. */
|
|
31
|
+
export declare function resolveCompare(arg: string, candidate: BrandingResult, deps?: CompareDeps): Promise<CompareResult>;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* --compare dispatch. The argument is either:
|
|
3
|
+
* - a local file → diff against it here (free, offline, deterministic)
|
|
4
|
+
* - a baseline id → POST the candidate to the Dembrandt App, which stores
|
|
5
|
+
* baselines and runs the same engine server-side
|
|
6
|
+
*
|
|
7
|
+
* Same flag, two backends — the local path is the free wedge; the id path is the
|
|
8
|
+
* App platform (dembrandt-next/app). Both call the one canonical drift engine.
|
|
9
|
+
*
|
|
10
|
+
* Dependencies are injectable so the dispatch is unit-testable without a real
|
|
11
|
+
* filesystem or network.
|
|
12
|
+
*/
|
|
13
|
+
import { existsSync, readFileSync } from "fs";
|
|
14
|
+
import { computeDrift } from "./drift.js";
|
|
15
|
+
/** Resolve a `--compare <arg>` into a drift report, dispatching on file vs id. */
|
|
16
|
+
export async function resolveCompare(arg, candidate, deps = {}) {
|
|
17
|
+
const isFile = deps.isFile ?? existsSync;
|
|
18
|
+
const readFile = deps.readFile ?? readFileSync;
|
|
19
|
+
if (isFile(arg)) {
|
|
20
|
+
const baseline = JSON.parse(readFile(arg, "utf-8"));
|
|
21
|
+
return { report: computeDrift(baseline, candidate), source: arg, mode: "local" };
|
|
22
|
+
}
|
|
23
|
+
// Not a local file → treat as a platform baseline id.
|
|
24
|
+
const fetchFn = deps.fetchFn ?? fetch;
|
|
25
|
+
const api = (deps.api ?? "https://dembrandt.com").replace(/\/$/, "");
|
|
26
|
+
const res = await fetchFn(`${api}/api/app/drift`, {
|
|
27
|
+
method: "POST",
|
|
28
|
+
headers: { "content-type": "application/json" },
|
|
29
|
+
body: JSON.stringify({ baselineId: arg, candidate }),
|
|
30
|
+
});
|
|
31
|
+
if (!res.ok) {
|
|
32
|
+
let detail = res.statusText;
|
|
33
|
+
try {
|
|
34
|
+
const e = (await res.json());
|
|
35
|
+
if (e?.error)
|
|
36
|
+
detail = e.error;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
/* non-JSON error body */
|
|
40
|
+
}
|
|
41
|
+
throw new Error(`platform compare failed (${res.status}): ${detail}`);
|
|
42
|
+
}
|
|
43
|
+
const data = (await res.json());
|
|
44
|
+
return { report: data.drift, source: `${api} #${arg}`, mode: "platform" };
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=compare.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compare.js","sourceRoot":"","sources":["../../lib/compare.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAqB1C,kFAAkF;AAClF,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,GAAW,EACX,SAAyB,EACzB,OAAoB,EAAE;IAEtB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC;IACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAK,YAAoD,CAAC;IAExF,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAmB,CAAC;QACtE,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IACnF,CAAC;IAED,sDAAsD;IACtD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC;IACtC,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,uBAAuB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACrE,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,GAAG,gBAAgB,EAAE;QAChD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;KACrD,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,IAAI,MAAM,GAAG,GAAG,CAAC,UAAU,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAuB,CAAC;YACnD,IAAI,CAAC,EAAE,KAAK;gBAAE,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,yBAAyB;QAC3B,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,CAAC,MAAM,MAAM,MAAM,EAAE,CAAC,CAAC;IACxE,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA2B,CAAC;IAC1D,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,GAAG,KAAK,GAAG,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;AAC5E,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Page Discovery
|
|
3
|
+
*
|
|
4
|
+
* Discovers internal pages from a starting URL via DOM link extraction
|
|
5
|
+
* or sitemap.xml parsing.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Score a URL path for importance (higher = more important).
|
|
9
|
+
* Prioritizes shallow, navigational paths over blog posts / legal pages.
|
|
10
|
+
*/
|
|
11
|
+
export declare function scoreUrl(pathname: any): number;
|
|
12
|
+
/**
|
|
13
|
+
* Discover internal links from an already-loaded Playwright page.
|
|
14
|
+
* Call after extractBranding() has loaded and scrolled the page.
|
|
15
|
+
*
|
|
16
|
+
* @param {import('playwright-core').Page} page
|
|
17
|
+
* @param {string} baseUrl - The starting URL (used to determine same-origin)
|
|
18
|
+
* @param {number} maxPages - Maximum number of URLs to return
|
|
19
|
+
* @returns {Promise<string[]>} Ordered list of URLs to crawl (excluding homepage)
|
|
20
|
+
*/
|
|
21
|
+
export declare function discoverLinks(page: any, baseUrl: any, maxPages: any): Promise<any>;
|
|
22
|
+
/**
|
|
23
|
+
* Discover pages from a site's sitemap.xml.
|
|
24
|
+
* Checks robots.txt for Sitemap directives, then tries common paths.
|
|
25
|
+
* Follows sitemapindex references one level deep.
|
|
26
|
+
*
|
|
27
|
+
* @param {string} baseUrl - The starting URL (should be post-redirect)
|
|
28
|
+
* @param {number} maxPages - Maximum number of URLs to return
|
|
29
|
+
* @returns {Promise<string[]>} List of URLs from sitemap (excluding homepage)
|
|
30
|
+
*/
|
|
31
|
+
export declare function parseSitemap(baseUrl: any, maxPages: any): Promise<any[]>;
|