difflens-cli 1.0.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 +171 -0
- package/dist/differ.d.ts +2 -0
- package/dist/differ.js +293 -0
- package/dist/differ.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +432 -0
- package/dist/index.js.map +1 -0
- package/dist/layout-analyzer.d.ts +4 -0
- package/dist/layout-analyzer.js +140 -0
- package/dist/layout-analyzer.js.map +1 -0
- package/dist/report-builder.d.ts +6 -0
- package/dist/report-builder.js +66 -0
- package/dist/report-builder.js.map +1 -0
- package/dist/screenshotter.d.ts +4 -0
- package/dist/screenshotter.js +142 -0
- package/dist/screenshotter.js.map +1 -0
- package/dist/storage.d.ts +11 -0
- package/dist/storage.js +142 -0
- package/dist/storage.js.map +1 -0
- package/dist/types.d.ts +98 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/package.json +55 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,432 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
6
|
+
import { join } from 'node:path';
|
|
7
|
+
import { createRequire } from 'node:module';
|
|
8
|
+
import { ensureStorageDirs, generateSnapshotId, saveSnapshot, loadSnapshotMetadata, loadSnapshotImage, findLatestSnapshot, listSnapshots, cleanupSnapshots, } from './storage.js';
|
|
9
|
+
import { takeScreenshot, takeElementScreenshot, closeBrowser } from './screenshotter.js';
|
|
10
|
+
import { computeDiff } from './differ.js';
|
|
11
|
+
import { buildReport, buildResponsiveReport } from './report-builder.js';
|
|
12
|
+
import { DiffLensError } from './types.js';
|
|
13
|
+
const require = createRequire(import.meta.url);
|
|
14
|
+
const pkg = require('../package.json');
|
|
15
|
+
const log = (msg) => process.stderr.write(`[difflens] ${msg}\n`);
|
|
16
|
+
function printHelp() {
|
|
17
|
+
const message = `DiffLens v${pkg.version} — visual diff MCP server for AI coding agents
|
|
18
|
+
|
|
19
|
+
Usage:
|
|
20
|
+
difflens Start MCP server (called automatically by Claude Code)
|
|
21
|
+
difflens setup Add DiffLens to .mcp.json in the current directory
|
|
22
|
+
|
|
23
|
+
Quick start:
|
|
24
|
+
1. Run: difflens setup
|
|
25
|
+
2. Restart Claude Code
|
|
26
|
+
3. Ask Claude: "take a snapshot of http://localhost:3000"
|
|
27
|
+
|
|
28
|
+
Or use without installing (add to .mcp.json):
|
|
29
|
+
{ "mcpServers": { "difflens": { "command": "npx", "args": ["-y", "difflens"] } } }
|
|
30
|
+
`;
|
|
31
|
+
process.stdout.write(message);
|
|
32
|
+
}
|
|
33
|
+
async function setupCommand() {
|
|
34
|
+
const mcpPath = join(process.cwd(), '.mcp.json');
|
|
35
|
+
let config = {};
|
|
36
|
+
try {
|
|
37
|
+
const existing = await readFile(mcpPath, 'utf-8');
|
|
38
|
+
const parsed = JSON.parse(existing);
|
|
39
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
40
|
+
config = parsed;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// File doesn't exist or is invalid — start fresh
|
|
45
|
+
}
|
|
46
|
+
if (!config.mcpServers || typeof config.mcpServers !== 'object') {
|
|
47
|
+
config.mcpServers = {};
|
|
48
|
+
}
|
|
49
|
+
config.mcpServers.difflens = {
|
|
50
|
+
command: 'difflens',
|
|
51
|
+
args: [],
|
|
52
|
+
};
|
|
53
|
+
await writeFile(mcpPath, JSON.stringify(config, null, 2) + '\n');
|
|
54
|
+
process.stdout.write(`✓ Added DiffLens to ${mcpPath}\n`);
|
|
55
|
+
process.stdout.write(` Restart Claude Code to pick up the new MCP server.\n`);
|
|
56
|
+
}
|
|
57
|
+
// --- CLI dispatch ---
|
|
58
|
+
const subcommand = process.argv[2];
|
|
59
|
+
if (subcommand === 'setup') {
|
|
60
|
+
setupCommand().catch((err) => {
|
|
61
|
+
process.stderr.write(`[difflens] Setup failed: ${err}\n`);
|
|
62
|
+
process.exit(1);
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
else if (!subcommand && process.stdin.isTTY) {
|
|
66
|
+
printHelp();
|
|
67
|
+
process.exit(0);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
// Non-TTY stdin (MCP mode) or unknown subcommand → start server
|
|
71
|
+
startServer();
|
|
72
|
+
}
|
|
73
|
+
function errorResponse(err) {
|
|
74
|
+
if (err instanceof DiffLensError) {
|
|
75
|
+
return {
|
|
76
|
+
content: [{
|
|
77
|
+
type: 'text',
|
|
78
|
+
text: JSON.stringify({ error: true, code: err.code, message: err.message }),
|
|
79
|
+
}],
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
83
|
+
return {
|
|
84
|
+
content: [{
|
|
85
|
+
type: 'text',
|
|
86
|
+
text: JSON.stringify({ error: true, code: 'UNKNOWN', message }),
|
|
87
|
+
}],
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
async function startMcpServer() {
|
|
91
|
+
await ensureStorageDirs();
|
|
92
|
+
const server = new McpServer({
|
|
93
|
+
name: 'difflens',
|
|
94
|
+
version: '1.0.0',
|
|
95
|
+
});
|
|
96
|
+
// Tool 1: snapshot
|
|
97
|
+
server.tool('snapshot', 'Take a screenshot of a URL and save it as a baseline snapshot', {
|
|
98
|
+
url: z.string().url().describe('The URL to screenshot (e.g. http://localhost:3000)'),
|
|
99
|
+
width: z.number().optional().default(1280).describe('Viewport width in pixels'),
|
|
100
|
+
height: z.number().optional().default(720).describe('Viewport height in pixels'),
|
|
101
|
+
fullPage: z.boolean().optional().default(true).describe('Capture full scrollable page'),
|
|
102
|
+
waitForSelector: z.string().optional().describe('CSS selector to wait for before capturing'),
|
|
103
|
+
waitForTimeout: z.number().optional().describe('Additional wait time in ms after page load'),
|
|
104
|
+
}, async (params) => {
|
|
105
|
+
try {
|
|
106
|
+
const viewport = { width: params.width, height: params.height };
|
|
107
|
+
const id = generateSnapshotId();
|
|
108
|
+
const imageBuffer = await takeScreenshot({
|
|
109
|
+
url: params.url,
|
|
110
|
+
viewport,
|
|
111
|
+
fullPage: params.fullPage,
|
|
112
|
+
waitForSelector: params.waitForSelector,
|
|
113
|
+
waitForTimeout: params.waitForTimeout,
|
|
114
|
+
});
|
|
115
|
+
const metadata = await saveSnapshot(id, imageBuffer, {
|
|
116
|
+
id,
|
|
117
|
+
url: params.url,
|
|
118
|
+
viewport,
|
|
119
|
+
fullPage: params.fullPage,
|
|
120
|
+
timestamp: Date.now(),
|
|
121
|
+
});
|
|
122
|
+
return {
|
|
123
|
+
content: [{
|
|
124
|
+
type: 'text',
|
|
125
|
+
text: JSON.stringify({
|
|
126
|
+
success: true,
|
|
127
|
+
snapshot: {
|
|
128
|
+
id: metadata.id,
|
|
129
|
+
url: metadata.url,
|
|
130
|
+
viewport: metadata.viewport,
|
|
131
|
+
timestamp: new Date(metadata.timestamp).toISOString(),
|
|
132
|
+
imagePath: metadata.imagePath,
|
|
133
|
+
},
|
|
134
|
+
}, null, 2),
|
|
135
|
+
}],
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
catch (err) {
|
|
139
|
+
return errorResponse(err);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
// Tool 2: check
|
|
143
|
+
server.tool('check', 'Take a new screenshot and compare it against the latest baseline (or a specific snapshot). Returns a diff report with change regions and an overlay image.', {
|
|
144
|
+
url: z.string().url().describe('The URL to check for visual changes'),
|
|
145
|
+
baselineId: z.string().optional().describe('Specific snapshot ID to compare against (uses latest if omitted)'),
|
|
146
|
+
width: z.number().optional().default(1280).describe('Viewport width in pixels'),
|
|
147
|
+
height: z.number().optional().default(720).describe('Viewport height in pixels'),
|
|
148
|
+
fullPage: z.boolean().optional().default(true).describe('Capture full scrollable page'),
|
|
149
|
+
waitForSelector: z.string().optional().describe('CSS selector to wait for before capturing'),
|
|
150
|
+
waitForTimeout: z.number().optional().describe('Additional wait time in ms after page load'),
|
|
151
|
+
}, async (params) => {
|
|
152
|
+
try {
|
|
153
|
+
const viewport = { width: params.width, height: params.height };
|
|
154
|
+
// Find baseline
|
|
155
|
+
let baselineId = params.baselineId;
|
|
156
|
+
if (!baselineId) {
|
|
157
|
+
const latest = await findLatestSnapshot(params.url);
|
|
158
|
+
if (!latest) {
|
|
159
|
+
throw new DiffLensError('NO_BASELINE', `No baseline snapshot found for ${params.url}. Run 'snapshot' first.`);
|
|
160
|
+
}
|
|
161
|
+
baselineId = latest.id;
|
|
162
|
+
}
|
|
163
|
+
const baselineMetadata = await loadSnapshotMetadata(baselineId);
|
|
164
|
+
const baselineImage = await loadSnapshotImage(baselineId);
|
|
165
|
+
// Take new screenshot
|
|
166
|
+
const currentImage = await takeScreenshot({
|
|
167
|
+
url: params.url,
|
|
168
|
+
viewport,
|
|
169
|
+
fullPage: params.fullPage,
|
|
170
|
+
waitForSelector: params.waitForSelector,
|
|
171
|
+
waitForTimeout: params.waitForTimeout,
|
|
172
|
+
});
|
|
173
|
+
// Save the current screenshot too
|
|
174
|
+
const currentId = generateSnapshotId();
|
|
175
|
+
await saveSnapshot(currentId, currentImage, {
|
|
176
|
+
id: currentId,
|
|
177
|
+
url: params.url,
|
|
178
|
+
viewport,
|
|
179
|
+
fullPage: params.fullPage,
|
|
180
|
+
timestamp: Date.now(),
|
|
181
|
+
});
|
|
182
|
+
// Compute diff
|
|
183
|
+
const diffId = `${baselineId}_vs_${currentId}`;
|
|
184
|
+
const diffResult = await computeDiff(baselineImage, currentImage, diffId);
|
|
185
|
+
const report = buildReport(diffResult);
|
|
186
|
+
// Read overlay image and return inline
|
|
187
|
+
const overlayBuffer = await readFile(report.overlayImagePath);
|
|
188
|
+
const overlayBase64 = overlayBuffer.toString('base64');
|
|
189
|
+
return {
|
|
190
|
+
content: [
|
|
191
|
+
{
|
|
192
|
+
type: 'text',
|
|
193
|
+
text: JSON.stringify({
|
|
194
|
+
success: true,
|
|
195
|
+
baselineId,
|
|
196
|
+
currentId,
|
|
197
|
+
report: {
|
|
198
|
+
status: report.status,
|
|
199
|
+
summary: report.summary,
|
|
200
|
+
percentChanged: report.percentChanged,
|
|
201
|
+
dimensions: report.dimensions,
|
|
202
|
+
regions: report.regions,
|
|
203
|
+
diffImagePath: report.diffImagePath,
|
|
204
|
+
overlayImagePath: report.overlayImagePath,
|
|
205
|
+
},
|
|
206
|
+
}, null, 2),
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
type: 'image',
|
|
210
|
+
data: overlayBase64,
|
|
211
|
+
mimeType: 'image/png',
|
|
212
|
+
},
|
|
213
|
+
],
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
catch (err) {
|
|
217
|
+
return errorResponse(err);
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
// Tool 3: check_responsive
|
|
221
|
+
server.tool('check_responsive', 'Run visual diff checks at multiple viewport widths to detect responsive design issues', {
|
|
222
|
+
url: z.string().url().describe('The URL to check'),
|
|
223
|
+
widths: z.array(z.number()).optional().default([375, 768, 1024, 1440]).describe('Viewport widths to test'),
|
|
224
|
+
height: z.number().optional().default(720).describe('Viewport height'),
|
|
225
|
+
fullPage: z.boolean().optional().default(true).describe('Capture full scrollable page'),
|
|
226
|
+
waitForSelector: z.string().optional().describe('CSS selector to wait for'),
|
|
227
|
+
waitForTimeout: z.number().optional().describe('Additional wait time in ms'),
|
|
228
|
+
}, async (params) => {
|
|
229
|
+
try {
|
|
230
|
+
const viewportResults = [];
|
|
231
|
+
for (const width of params.widths) {
|
|
232
|
+
const viewport = { width, height: params.height };
|
|
233
|
+
// Find baseline for this viewport+url combo
|
|
234
|
+
const allSnapshots = await listSnapshots({ url: params.url });
|
|
235
|
+
const baseline = allSnapshots.find(s => s.viewport.width === width && s.viewport.height === params.height);
|
|
236
|
+
if (!baseline) {
|
|
237
|
+
// Take baseline snapshot first
|
|
238
|
+
const id = generateSnapshotId();
|
|
239
|
+
const imageBuffer = await takeScreenshot({
|
|
240
|
+
url: params.url,
|
|
241
|
+
viewport,
|
|
242
|
+
fullPage: params.fullPage,
|
|
243
|
+
waitForSelector: params.waitForSelector,
|
|
244
|
+
waitForTimeout: params.waitForTimeout,
|
|
245
|
+
});
|
|
246
|
+
await saveSnapshot(id, imageBuffer, {
|
|
247
|
+
id,
|
|
248
|
+
url: params.url,
|
|
249
|
+
viewport,
|
|
250
|
+
fullPage: params.fullPage,
|
|
251
|
+
timestamp: Date.now(),
|
|
252
|
+
});
|
|
253
|
+
viewportResults.push({
|
|
254
|
+
viewport,
|
|
255
|
+
report: buildReport({
|
|
256
|
+
totalPixels: 0,
|
|
257
|
+
changedPixels: 0,
|
|
258
|
+
percentChanged: 0,
|
|
259
|
+
dimensions: { before: viewport, after: viewport, resized: false },
|
|
260
|
+
regions: [],
|
|
261
|
+
diffImagePath: '',
|
|
262
|
+
overlayImagePath: '',
|
|
263
|
+
}),
|
|
264
|
+
});
|
|
265
|
+
continue;
|
|
266
|
+
}
|
|
267
|
+
const baselineImage = await loadSnapshotImage(baseline.id);
|
|
268
|
+
const currentImage = await takeScreenshot({
|
|
269
|
+
url: params.url,
|
|
270
|
+
viewport,
|
|
271
|
+
fullPage: params.fullPage,
|
|
272
|
+
waitForSelector: params.waitForSelector,
|
|
273
|
+
waitForTimeout: params.waitForTimeout,
|
|
274
|
+
});
|
|
275
|
+
const currentId = generateSnapshotId();
|
|
276
|
+
await saveSnapshot(currentId, currentImage, {
|
|
277
|
+
id: currentId,
|
|
278
|
+
url: params.url,
|
|
279
|
+
viewport,
|
|
280
|
+
fullPage: params.fullPage,
|
|
281
|
+
timestamp: Date.now(),
|
|
282
|
+
});
|
|
283
|
+
const diffId = `${baseline.id}_vs_${currentId}`;
|
|
284
|
+
const diffResult = await computeDiff(baselineImage, currentImage, diffId);
|
|
285
|
+
viewportResults.push({ viewport, report: buildReport(diffResult) });
|
|
286
|
+
}
|
|
287
|
+
const responsiveReport = buildResponsiveReport(params.url, viewportResults);
|
|
288
|
+
return {
|
|
289
|
+
content: [{
|
|
290
|
+
type: 'text',
|
|
291
|
+
text: JSON.stringify({
|
|
292
|
+
success: true,
|
|
293
|
+
...responsiveReport,
|
|
294
|
+
}, null, 2),
|
|
295
|
+
}],
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
catch (err) {
|
|
299
|
+
return errorResponse(err);
|
|
300
|
+
}
|
|
301
|
+
});
|
|
302
|
+
// Tool 4: snapshot_element
|
|
303
|
+
server.tool('snapshot_element', 'Screenshot a specific DOM element by CSS selector and return the image inline', {
|
|
304
|
+
url: z.string().url().describe('The URL containing the element'),
|
|
305
|
+
selector: z.string().describe('CSS selector of the element to capture'),
|
|
306
|
+
width: z.number().optional().default(1280).describe('Viewport width'),
|
|
307
|
+
height: z.number().optional().default(720).describe('Viewport height'),
|
|
308
|
+
waitForSelector: z.string().optional().describe('CSS selector to wait for before capturing'),
|
|
309
|
+
waitForTimeout: z.number().optional().describe('Additional wait time in ms'),
|
|
310
|
+
}, async (params) => {
|
|
311
|
+
try {
|
|
312
|
+
const viewport = { width: params.width, height: params.height };
|
|
313
|
+
const imageBuffer = await takeElementScreenshot(params.url, params.selector, viewport, params.waitForSelector, params.waitForTimeout);
|
|
314
|
+
// Save as snapshot
|
|
315
|
+
const id = generateSnapshotId();
|
|
316
|
+
const metadata = await saveSnapshot(id, imageBuffer, {
|
|
317
|
+
id,
|
|
318
|
+
url: params.url,
|
|
319
|
+
viewport,
|
|
320
|
+
fullPage: false,
|
|
321
|
+
selector: params.selector,
|
|
322
|
+
timestamp: Date.now(),
|
|
323
|
+
});
|
|
324
|
+
const imageBase64 = imageBuffer.toString('base64');
|
|
325
|
+
return {
|
|
326
|
+
content: [
|
|
327
|
+
{
|
|
328
|
+
type: 'text',
|
|
329
|
+
text: JSON.stringify({
|
|
330
|
+
success: true,
|
|
331
|
+
snapshot: {
|
|
332
|
+
id: metadata.id,
|
|
333
|
+
url: metadata.url,
|
|
334
|
+
selector: params.selector,
|
|
335
|
+
viewport: metadata.viewport,
|
|
336
|
+
timestamp: new Date(metadata.timestamp).toISOString(),
|
|
337
|
+
imagePath: metadata.imagePath,
|
|
338
|
+
},
|
|
339
|
+
}, null, 2),
|
|
340
|
+
},
|
|
341
|
+
{
|
|
342
|
+
type: 'image',
|
|
343
|
+
data: imageBase64,
|
|
344
|
+
mimeType: 'image/png',
|
|
345
|
+
},
|
|
346
|
+
],
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
catch (err) {
|
|
350
|
+
return errorResponse(err);
|
|
351
|
+
}
|
|
352
|
+
});
|
|
353
|
+
// Tool 5: list_snapshots
|
|
354
|
+
server.tool('list_snapshots', 'List stored snapshots with optional URL filter', {
|
|
355
|
+
url: z.string().optional().describe('Filter by URL'),
|
|
356
|
+
limit: z.number().optional().default(20).describe('Maximum number of snapshots to return'),
|
|
357
|
+
}, async (params) => {
|
|
358
|
+
try {
|
|
359
|
+
const snapshots = await listSnapshots({
|
|
360
|
+
url: params.url,
|
|
361
|
+
limit: params.limit,
|
|
362
|
+
});
|
|
363
|
+
return {
|
|
364
|
+
content: [{
|
|
365
|
+
type: 'text',
|
|
366
|
+
text: JSON.stringify({
|
|
367
|
+
success: true,
|
|
368
|
+
count: snapshots.length,
|
|
369
|
+
snapshots: snapshots.map(s => ({
|
|
370
|
+
id: s.id,
|
|
371
|
+
url: s.url,
|
|
372
|
+
viewport: s.viewport,
|
|
373
|
+
selector: s.selector,
|
|
374
|
+
timestamp: new Date(s.timestamp).toISOString(),
|
|
375
|
+
})),
|
|
376
|
+
}, null, 2),
|
|
377
|
+
}],
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
catch (err) {
|
|
381
|
+
return errorResponse(err);
|
|
382
|
+
}
|
|
383
|
+
});
|
|
384
|
+
// Tool 6: cleanup
|
|
385
|
+
server.tool('cleanup', 'Delete old snapshots by age or count. Supports dry run to preview what would be deleted.', {
|
|
386
|
+
maxAgeHours: z.number().optional().describe('Delete snapshots older than this many hours'),
|
|
387
|
+
maxCount: z.number().optional().describe('Keep at most this many snapshots (newest first)'),
|
|
388
|
+
dryRun: z.boolean().optional().default(false).describe('Preview what would be deleted without actually deleting'),
|
|
389
|
+
}, async (params) => {
|
|
390
|
+
try {
|
|
391
|
+
const result = await cleanupSnapshots({
|
|
392
|
+
maxAge: params.maxAgeHours ? params.maxAgeHours * 60 * 60 * 1000 : undefined,
|
|
393
|
+
maxCount: params.maxCount,
|
|
394
|
+
dryRun: params.dryRun,
|
|
395
|
+
});
|
|
396
|
+
return {
|
|
397
|
+
content: [{
|
|
398
|
+
type: 'text',
|
|
399
|
+
text: JSON.stringify({
|
|
400
|
+
success: true,
|
|
401
|
+
dryRun: result.dryRun,
|
|
402
|
+
deletedCount: result.deleted.length,
|
|
403
|
+
deletedIds: result.deleted,
|
|
404
|
+
keptCount: result.kept,
|
|
405
|
+
}, null, 2),
|
|
406
|
+
}],
|
|
407
|
+
};
|
|
408
|
+
}
|
|
409
|
+
catch (err) {
|
|
410
|
+
return errorResponse(err);
|
|
411
|
+
}
|
|
412
|
+
});
|
|
413
|
+
// Graceful shutdown
|
|
414
|
+
const shutdown = async () => {
|
|
415
|
+
log('Shutting down...');
|
|
416
|
+
await closeBrowser();
|
|
417
|
+
process.exit(0);
|
|
418
|
+
};
|
|
419
|
+
process.on('SIGINT', shutdown);
|
|
420
|
+
process.on('SIGTERM', shutdown);
|
|
421
|
+
// Start server
|
|
422
|
+
const transport = new StdioServerTransport();
|
|
423
|
+
await server.connect(transport);
|
|
424
|
+
log('DiffLens MCP server running on stdio');
|
|
425
|
+
}
|
|
426
|
+
function startServer() {
|
|
427
|
+
startMcpServer().catch((err) => {
|
|
428
|
+
process.stderr.write(`[difflens] Fatal error: ${err}\n`);
|
|
429
|
+
process.exit(1);
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Page } from 'playwright';
|
|
2
|
+
import type { LayoutElement, LayoutChange } from './types.js';
|
|
3
|
+
export declare function extractLayoutInfo(page: Page, selectors?: string[]): Promise<LayoutElement[]>;
|
|
4
|
+
export declare function compareLayouts(before: LayoutElement[], after: LayoutElement[]): LayoutChange[];
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
export async function extractLayoutInfo(page, selectors) {
|
|
2
|
+
return page.evaluate((sels) => {
|
|
3
|
+
const elements = [];
|
|
4
|
+
function getSelector(el) {
|
|
5
|
+
if (el.id)
|
|
6
|
+
return `#${el.id}`;
|
|
7
|
+
const testId = el.getAttribute('data-testid');
|
|
8
|
+
if (testId)
|
|
9
|
+
return `[data-testid="${testId}"]`;
|
|
10
|
+
const role = el.getAttribute('role');
|
|
11
|
+
if (role)
|
|
12
|
+
return `[role="${role}"]`;
|
|
13
|
+
const tag = el.tagName.toLowerCase();
|
|
14
|
+
const parent = el.parentElement;
|
|
15
|
+
if (!parent)
|
|
16
|
+
return tag;
|
|
17
|
+
const siblings = Array.from(parent.children).filter(c => c.tagName === el.tagName);
|
|
18
|
+
if (siblings.length === 1)
|
|
19
|
+
return `${getSelector(parent)} > ${tag}`;
|
|
20
|
+
const index = siblings.indexOf(el) + 1;
|
|
21
|
+
return `${getSelector(parent)} > ${tag}:nth-child(${index})`;
|
|
22
|
+
}
|
|
23
|
+
function processElement(el) {
|
|
24
|
+
const rect = el.getBoundingClientRect();
|
|
25
|
+
if (rect.width === 0 && rect.height === 0)
|
|
26
|
+
return;
|
|
27
|
+
const computed = window.getComputedStyle(el);
|
|
28
|
+
elements.push({
|
|
29
|
+
selector: getSelector(el),
|
|
30
|
+
tagName: el.tagName.toLowerCase(),
|
|
31
|
+
id: el.id || undefined,
|
|
32
|
+
boundingBox: {
|
|
33
|
+
x: Math.round(rect.x),
|
|
34
|
+
y: Math.round(rect.y),
|
|
35
|
+
width: Math.round(rect.width),
|
|
36
|
+
height: Math.round(rect.height),
|
|
37
|
+
},
|
|
38
|
+
styles: {
|
|
39
|
+
display: computed.display,
|
|
40
|
+
position: computed.position,
|
|
41
|
+
fontSize: computed.fontSize,
|
|
42
|
+
color: computed.color,
|
|
43
|
+
backgroundColor: computed.backgroundColor,
|
|
44
|
+
margin: computed.margin,
|
|
45
|
+
padding: computed.padding,
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
if (sels && sels.length > 0) {
|
|
50
|
+
for (const sel of sels) {
|
|
51
|
+
const el = document.querySelector(sel);
|
|
52
|
+
if (el)
|
|
53
|
+
processElement(el);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
// Auto-discover key elements
|
|
58
|
+
const semantic = 'header,nav,main,footer,section,article,aside,h1,h2,h3,button,a,img,form,input,table';
|
|
59
|
+
const discovered = new Set();
|
|
60
|
+
document.querySelectorAll(semantic).forEach(el => discovered.add(el));
|
|
61
|
+
document.querySelectorAll('[id]').forEach(el => discovered.add(el));
|
|
62
|
+
document.querySelectorAll('[data-testid]').forEach(el => discovered.add(el));
|
|
63
|
+
document.querySelectorAll('[role]').forEach(el => discovered.add(el));
|
|
64
|
+
discovered.forEach(el => processElement(el));
|
|
65
|
+
}
|
|
66
|
+
return elements;
|
|
67
|
+
}, selectors ?? null);
|
|
68
|
+
}
|
|
69
|
+
export function compareLayouts(before, after) {
|
|
70
|
+
const changes = [];
|
|
71
|
+
const beforeMap = new Map(before.map(el => [el.selector, el]));
|
|
72
|
+
const afterMap = new Map(after.map(el => [el.selector, el]));
|
|
73
|
+
// Check for removed elements
|
|
74
|
+
for (const [selector, el] of beforeMap) {
|
|
75
|
+
if (!afterMap.has(selector)) {
|
|
76
|
+
changes.push({
|
|
77
|
+
selector,
|
|
78
|
+
type: 'removed',
|
|
79
|
+
description: `Element ${selector} (${el.tagName}) was removed`,
|
|
80
|
+
before: el,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// Check for added elements
|
|
85
|
+
for (const [selector, el] of afterMap) {
|
|
86
|
+
if (!beforeMap.has(selector)) {
|
|
87
|
+
changes.push({
|
|
88
|
+
selector,
|
|
89
|
+
type: 'added',
|
|
90
|
+
description: `Element ${selector} (${el.tagName}) was added`,
|
|
91
|
+
after: el,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// Check for moved/resized/styled elements
|
|
96
|
+
for (const [selector, afterEl] of afterMap) {
|
|
97
|
+
const beforeEl = beforeMap.get(selector);
|
|
98
|
+
if (!beforeEl)
|
|
99
|
+
continue;
|
|
100
|
+
const bb = beforeEl.boundingBox;
|
|
101
|
+
const ab = afterEl.boundingBox;
|
|
102
|
+
if (bb.x !== ab.x || bb.y !== ab.y) {
|
|
103
|
+
changes.push({
|
|
104
|
+
selector,
|
|
105
|
+
type: 'moved',
|
|
106
|
+
description: `${selector} moved from (${bb.x},${bb.y}) to (${ab.x},${ab.y})`,
|
|
107
|
+
before: beforeEl,
|
|
108
|
+
after: afterEl,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
if (bb.width !== ab.width || bb.height !== ab.height) {
|
|
112
|
+
changes.push({
|
|
113
|
+
selector,
|
|
114
|
+
type: 'resized',
|
|
115
|
+
description: `${selector} resized from ${bb.width}x${bb.height} to ${ab.width}x${ab.height}`,
|
|
116
|
+
before: beforeEl,
|
|
117
|
+
after: afterEl,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
// Check style changes
|
|
121
|
+
const styleChanges = [];
|
|
122
|
+
for (const [prop, beforeVal] of Object.entries(beforeEl.styles)) {
|
|
123
|
+
const afterVal = afterEl.styles[prop];
|
|
124
|
+
if (beforeVal !== afterVal) {
|
|
125
|
+
styleChanges.push(`${prop}: "${beforeVal}" → "${afterVal}"`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
if (styleChanges.length > 0) {
|
|
129
|
+
changes.push({
|
|
130
|
+
selector,
|
|
131
|
+
type: 'style_changed',
|
|
132
|
+
description: `${selector} style changes: ${styleChanges.join(', ')}`,
|
|
133
|
+
before: beforeEl,
|
|
134
|
+
after: afterEl,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return changes;
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=layout-analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout-analyzer.js","sourceRoot":"","sources":["../src/layout-analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { DiffResult, DiffReport, ResponsiveCheckResult, Viewport } from './types.js';
|
|
2
|
+
export declare function buildReport(diff: DiffResult): DiffReport;
|
|
3
|
+
export declare function buildResponsiveReport(url: string, viewportResults: Array<{
|
|
4
|
+
viewport: Viewport;
|
|
5
|
+
report: DiffReport;
|
|
6
|
+
}>): ResponsiveCheckResult;
|