@juangadm/pre-post 0.3.0 → 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 +102 -240
- package/dist/bin/cli.js +200 -454
- package/dist/bin/cli.js.map +1 -1
- package/dist/browser.d.ts +42 -27
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +358 -105
- package/dist/browser.js.map +1 -1
- package/dist/capture.d.ts +1 -6
- package/dist/capture.d.ts.map +1 -1
- package/dist/capture.js +12 -36
- package/dist/capture.js.map +1 -1
- package/dist/commands/compare.d.ts +18 -0
- package/dist/commands/compare.d.ts.map +1 -0
- package/dist/commands/compare.js +64 -0
- package/dist/commands/compare.js.map +1 -0
- package/dist/commands/detect.d.ts +20 -0
- package/dist/commands/detect.d.ts.map +1 -0
- package/dist/commands/detect.js +19 -0
- package/dist/commands/detect.js.map +1 -0
- package/dist/commands/doctor.d.ts +10 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +38 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/login.d.ts +6 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +34 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/pr.d.ts +28 -0
- package/dist/commands/pr.d.ts.map +1 -0
- package/dist/commands/pr.js +159 -0
- package/dist/commands/pr.js.map +1 -0
- package/dist/commands/prune.d.ts +10 -0
- package/dist/commands/prune.d.ts.map +1 -0
- package/dist/commands/prune.js +13 -0
- package/dist/commands/prune.js.map +1 -0
- package/dist/config.d.ts +36 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +60 -0
- package/dist/config.js.map +1 -0
- package/dist/diff-pool.d.ts +17 -0
- package/dist/diff-pool.d.ts.map +1 -0
- package/dist/diff-pool.js +89 -0
- package/dist/diff-pool.js.map +1 -0
- package/dist/diff-worker.d.ts +29 -0
- package/dist/diff-worker.d.ts.map +1 -0
- package/dist/diff-worker.js +38 -0
- package/dist/diff-worker.js.map +1 -0
- package/dist/diff.d.ts +37 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +171 -0
- package/dist/diff.js.map +1 -0
- package/dist/doctor.d.ts +38 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +72 -0
- package/dist/doctor.js.map +1 -0
- package/dist/errors.d.ts +38 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +59 -0
- package/dist/errors.js.map +1 -0
- package/dist/git.d.ts +23 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +86 -0
- package/dist/git.js.map +1 -0
- package/dist/github.d.ts +73 -0
- package/dist/github.d.ts.map +1 -0
- package/dist/github.js +240 -0
- package/dist/github.js.map +1 -0
- package/dist/index.d.ts +22 -23
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -67
- package/dist/index.js.map +1 -1
- package/dist/pkg.d.ts +8 -0
- package/dist/pkg.d.ts.map +1 -0
- package/dist/pkg.js +35 -0
- package/dist/pkg.js.map +1 -0
- package/dist/report.d.ts +20 -0
- package/dist/report.d.ts.map +1 -0
- package/dist/report.js +107 -0
- package/dist/report.js.map +1 -0
- package/dist/routes/imports.d.ts +46 -0
- package/dist/routes/imports.d.ts.map +1 -0
- package/dist/routes/imports.js +208 -0
- package/dist/routes/imports.js.map +1 -0
- package/dist/routes/vite.d.ts +15 -0
- package/dist/routes/vite.d.ts.map +1 -0
- package/dist/routes/vite.js +130 -0
- package/dist/routes/vite.js.map +1 -0
- package/dist/routes.d.ts +41 -14
- package/dist/routes.d.ts.map +1 -1
- package/dist/routes.js +271 -141
- package/dist/routes.js.map +1 -1
- package/dist/run.d.ts +36 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +128 -0
- package/dist/run.js.map +1 -0
- package/dist/sessions.d.ts +50 -0
- package/dist/sessions.d.ts.map +1 -0
- package/dist/sessions.js +74 -0
- package/dist/sessions.js.map +1 -0
- package/dist/types.d.ts +118 -69
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -1
- package/dist/viewport.d.ts +6 -1
- package/dist/viewport.d.ts.map +1 -1
- package/dist/viewport.js +13 -7
- package/dist/viewport.js.map +1 -1
- package/package.json +21 -14
- package/skill/SKILL.md +31 -229
- package/dist/clipboard.d.ts +0 -9
- package/dist/clipboard.d.ts.map +0 -1
- package/dist/clipboard.js +0 -26
- package/dist/clipboard.js.map +0 -1
- package/dist/upload.d.ts +0 -39
- package/dist/upload.d.ts.map +0 -1
- package/dist/upload.js +0 -159
- package/dist/upload.js.map +0 -1
- package/dist/video.d.ts +0 -19
- package/dist/video.d.ts.map +0 -1
- package/dist/video.js +0 -263
- package/dist/video.js.map +0 -1
- package/skill/scripts/adapters/0x0st.sh +0 -36
- package/skill/scripts/adapters/blob.sh +0 -55
- package/skill/scripts/adapters/git-native.sh +0 -51
- package/skill/scripts/upload-and-copy.sh +0 -230
package/dist/browser.js
CHANGED
|
@@ -1,55 +1,56 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Browser automation via Playwright.
|
|
3
|
-
*
|
|
2
|
+
* Browser automation via Playwright (playwright-core + Chromium headless shell).
|
|
3
|
+
*
|
|
4
|
+
* One browser per process, one context per viewport/auth combination, and a
|
|
5
|
+
* small page pool. Captures are deterministic: fixed clock, reduced motion,
|
|
6
|
+
* animations finished, caret hidden, fonts and images settled, layout stable.
|
|
4
7
|
*/
|
|
5
|
-
import { chromium } from 'playwright';
|
|
8
|
+
import { chromium } from 'playwright-core';
|
|
6
9
|
import fs from 'fs';
|
|
7
10
|
import path from 'path';
|
|
11
|
+
import { createRequire } from 'module';
|
|
12
|
+
import { spawnSync } from 'child_process';
|
|
13
|
+
import { BrowserNotFoundError, HttpStatusError, NavigationError, isVercelResponse } from './errors.js';
|
|
14
|
+
const require = createRequire(import.meta.url);
|
|
15
|
+
/** Every capture sees the same wall clock, so dates and "x minutes ago" never drift. */
|
|
16
|
+
export const FIXED_TIME = new Date('2026-01-15T12:00:00.000Z');
|
|
17
|
+
const MAX_CONCURRENT_PAGES = Number(process.env.PRE_POST_CONCURRENCY) || 6;
|
|
18
|
+
const NAVIGATION_TIMEOUT = 30_000;
|
|
8
19
|
let browser = null;
|
|
9
|
-
|
|
20
|
+
let browserLabel = '';
|
|
21
|
+
const contexts = new Map();
|
|
10
22
|
let activePages = 0;
|
|
11
23
|
const pageQueue = [];
|
|
12
|
-
|
|
13
|
-
* Get the shared Browser instance (creating it if needed).
|
|
14
|
-
* Used by video.ts to create fresh pages without animation-killing CSS.
|
|
15
|
-
*/
|
|
16
|
-
export async function getBrowser() {
|
|
17
|
-
if (!browser) {
|
|
18
|
-
browser = await launchBrowser();
|
|
19
|
-
}
|
|
20
|
-
return browser;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Acquire a page from the pool. Blocks if MAX_CONCURRENT_PAGES are in use.
|
|
24
|
-
* Each page gets its own viewport and deviceScaleFactor.
|
|
25
|
-
*/
|
|
26
|
-
export async function acquirePage(viewport) {
|
|
24
|
+
async function acquireSlot() {
|
|
27
25
|
if (activePages >= MAX_CONCURRENT_PAGES) {
|
|
28
26
|
await new Promise(resolve => pageQueue.push(resolve));
|
|
29
27
|
}
|
|
30
28
|
activePages++;
|
|
31
|
-
const b = await getBrowser();
|
|
32
|
-
return b.newPage({ viewport, deviceScaleFactor: 2 });
|
|
33
29
|
}
|
|
34
|
-
|
|
35
|
-
* Release a page back to the pool (closes it).
|
|
36
|
-
*/
|
|
37
|
-
export async function releasePage(pg) {
|
|
30
|
+
function releaseSlot() {
|
|
38
31
|
activePages--;
|
|
39
|
-
if (!pg.isClosed())
|
|
40
|
-
await pg.close();
|
|
41
32
|
const next = pageQueue.shift();
|
|
42
33
|
if (next)
|
|
43
34
|
next();
|
|
44
35
|
}
|
|
36
|
+
// ============================================================
|
|
37
|
+
// Launch
|
|
38
|
+
// ============================================================
|
|
39
|
+
/** Directory of the playwright-core package (for its CLI and browsers.json). */
|
|
40
|
+
export function playwrightCoreDir() {
|
|
41
|
+
return path.dirname(require.resolve('playwright-core/package.json'));
|
|
42
|
+
}
|
|
45
43
|
/**
|
|
46
|
-
* Scan Playwright's cache
|
|
47
|
-
* Returns paths to try, in order of preference.
|
|
44
|
+
* Scan Playwright's browser cache for installed Chromium executables.
|
|
48
45
|
*/
|
|
49
46
|
function findCachedChromium() {
|
|
50
47
|
const home = process.env.HOME || process.env.USERPROFILE || '';
|
|
51
48
|
const cacheDir = process.env.PLAYWRIGHT_BROWSERS_PATH
|
|
52
|
-
||
|
|
49
|
+
|| (process.platform === 'darwin'
|
|
50
|
+
? path.join(home, 'Library', 'Caches', 'ms-playwright')
|
|
51
|
+
: process.platform === 'win32'
|
|
52
|
+
? path.join(process.env.LOCALAPPDATA || path.join(home, 'AppData', 'Local'), 'ms-playwright')
|
|
53
|
+
: path.join(home, '.cache', 'ms-playwright'));
|
|
53
54
|
let entries;
|
|
54
55
|
try {
|
|
55
56
|
entries = fs.readdirSync(cacheDir);
|
|
@@ -57,41 +58,57 @@ function findCachedChromium() {
|
|
|
57
58
|
catch {
|
|
58
59
|
return [];
|
|
59
60
|
}
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
61
|
+
const subpaths = process.platform === 'darwin'
|
|
62
|
+
? [
|
|
63
|
+
path.join('chrome-mac', 'headless_shell'),
|
|
64
|
+
path.join('chrome-mac', 'Chromium.app', 'Contents', 'MacOS', 'Chromium'),
|
|
65
|
+
path.join('chrome-mac-arm64', 'headless_shell'),
|
|
66
|
+
path.join('chrome-mac-arm64', 'Chromium.app', 'Contents', 'MacOS', 'Chromium'),
|
|
67
|
+
]
|
|
68
|
+
: process.platform === 'win32'
|
|
69
|
+
? [path.join('chrome-win', 'headless_shell.exe'), path.join('chrome-win', 'chrome.exe')]
|
|
70
|
+
: [
|
|
71
|
+
path.join('chrome-linux', 'headless_shell'),
|
|
72
|
+
path.join('chrome-headless-shell-linux64', 'chrome-headless-shell'),
|
|
73
|
+
path.join('chrome-linux', 'chrome'),
|
|
74
|
+
];
|
|
75
|
+
// Prefer headless shell builds, newest first.
|
|
76
|
+
const sorted = entries
|
|
77
|
+
.filter(e => e.startsWith('chromium'))
|
|
78
|
+
.sort((a, b) => (b.includes('headless') ? 1 : 0) - (a.includes('headless') ? 1 : 0) || b.localeCompare(a));
|
|
70
79
|
const candidates = [];
|
|
71
|
-
for (const entry of
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
if (fs.existsSync(fullPath))
|
|
77
|
-
candidates.push(fullPath);
|
|
80
|
+
for (const entry of sorted) {
|
|
81
|
+
for (const sub of subpaths) {
|
|
82
|
+
const full = path.join(cacheDir, entry, sub);
|
|
83
|
+
if (fs.existsSync(full))
|
|
84
|
+
candidates.push(full);
|
|
78
85
|
}
|
|
79
86
|
}
|
|
80
87
|
return candidates;
|
|
81
88
|
}
|
|
89
|
+
const LAUNCH_ARGS = [
|
|
90
|
+
'--disable-dev-shm-usage',
|
|
91
|
+
'--hide-scrollbars',
|
|
92
|
+
'--disable-background-timer-throttling',
|
|
93
|
+
'--disable-renderer-backgrounding',
|
|
94
|
+
'--force-color-profile=srgb',
|
|
95
|
+
'--font-render-hinting=none',
|
|
96
|
+
];
|
|
82
97
|
/**
|
|
83
98
|
* Launch Chromium with a fallback chain:
|
|
84
|
-
* 1. Explicit custom path (PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH) —
|
|
85
|
-
* 2.
|
|
86
|
-
* 3.
|
|
87
|
-
* 4.
|
|
99
|
+
* 1. Explicit custom path (PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH) — override, fails hard
|
|
100
|
+
* 2. Bundled Playwright Chromium (headless shell when headless)
|
|
101
|
+
* 3. Any Chromium build found in Playwright's cache
|
|
102
|
+
* 4. System Chrome / Edge
|
|
88
103
|
*/
|
|
89
|
-
async function launchBrowser() {
|
|
90
|
-
|
|
104
|
+
export async function launchBrowser(opts = {}) {
|
|
105
|
+
const headless = opts.headless ?? true;
|
|
91
106
|
const customPath = process.env.PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH;
|
|
92
107
|
if (customPath) {
|
|
93
108
|
try {
|
|
94
|
-
|
|
109
|
+
const b = await chromium.launch({ headless, executablePath: customPath, args: LAUNCH_ARGS });
|
|
110
|
+
browserLabel = `custom (${customPath})`;
|
|
111
|
+
return b;
|
|
95
112
|
}
|
|
96
113
|
catch (err) {
|
|
97
114
|
throw new Error(`Failed to launch Chromium at custom path: ${customPath}\n` +
|
|
@@ -99,82 +116,318 @@ async function launchBrowser() {
|
|
|
99
116
|
'Either fix the path or unset PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH to use auto-detection.');
|
|
100
117
|
}
|
|
101
118
|
}
|
|
102
|
-
// Auto-detection: try each strategy in order
|
|
103
119
|
const strategies = [
|
|
104
|
-
{ label: '
|
|
105
|
-
{ label: 'Bundled Playwright Chromium', options: { headless: true } },
|
|
120
|
+
{ label: 'bundled', options: { headless, args: LAUNCH_ARGS } },
|
|
106
121
|
];
|
|
107
|
-
|
|
108
|
-
|
|
122
|
+
if (headless) {
|
|
123
|
+
for (const cachedPath of findCachedChromium()) {
|
|
124
|
+
strategies.push({ label: `cached (${cachedPath})`, options: { headless, executablePath: cachedPath, args: LAUNCH_ARGS } });
|
|
125
|
+
}
|
|
109
126
|
}
|
|
110
|
-
|
|
127
|
+
strategies.push({ label: 'system chrome', options: { headless, channel: 'chrome', args: LAUNCH_ARGS } });
|
|
128
|
+
strategies.push({ label: 'system edge', options: { headless, channel: 'msedge', args: LAUNCH_ARGS } });
|
|
129
|
+
let lastError = null;
|
|
130
|
+
for (const { label, options } of strategies) {
|
|
111
131
|
try {
|
|
112
|
-
|
|
132
|
+
const b = await chromium.launch(options);
|
|
133
|
+
browserLabel = label;
|
|
134
|
+
return b;
|
|
113
135
|
}
|
|
114
|
-
catch {
|
|
136
|
+
catch (err) {
|
|
137
|
+
lastError = err;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
throw new BrowserNotFoundError(lastError);
|
|
141
|
+
}
|
|
142
|
+
/** Install a browser through playwright-core's CLI. Returns true on success. */
|
|
143
|
+
export function installBrowser(kind) {
|
|
144
|
+
const cli = path.join(playwrightCoreDir(), 'cli.js');
|
|
145
|
+
console.error(`Installing ${kind} (one-time, ~${kind === 'chromium' ? '170' : '80'} MB)...`);
|
|
146
|
+
return spawnSync(process.execPath, [cli, 'install', kind], { stdio: 'inherit' }).status === 0;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Launch, installing the right browser first if none is found.
|
|
150
|
+
* Throws BrowserNotFoundError (with `installed` set) when it still cannot launch.
|
|
151
|
+
*/
|
|
152
|
+
export async function launchBrowserOrInstall(opts = {}) {
|
|
153
|
+
try {
|
|
154
|
+
return await launchBrowser(opts);
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
if (!(err instanceof BrowserNotFoundError))
|
|
158
|
+
throw err;
|
|
159
|
+
}
|
|
160
|
+
const installed = installBrowser(opts.headless === false ? 'chromium' : 'chromium-headless-shell');
|
|
161
|
+
if (!installed)
|
|
162
|
+
throw new BrowserNotFoundError(null, false);
|
|
163
|
+
try {
|
|
164
|
+
return await launchBrowser(opts);
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
if (err instanceof BrowserNotFoundError)
|
|
168
|
+
throw new BrowserNotFoundError(err.cause, true);
|
|
169
|
+
throw err;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/** The process-wide headless browser, launched (and installed) on first use. */
|
|
173
|
+
export async function getBrowser() {
|
|
174
|
+
if (!browser) {
|
|
175
|
+
browser = await launchBrowserOrInstall();
|
|
176
|
+
browser.on('disconnected', () => { browser = null; contexts.clear(); });
|
|
177
|
+
}
|
|
178
|
+
return browser;
|
|
179
|
+
}
|
|
180
|
+
export function browserDescription() {
|
|
181
|
+
return browserLabel;
|
|
182
|
+
}
|
|
183
|
+
// ============================================================
|
|
184
|
+
// Contexts
|
|
185
|
+
// ============================================================
|
|
186
|
+
function contextKey(viewport, scale, auth) {
|
|
187
|
+
return `${viewport.width}x${viewport.height}@${scale}|${auth ? JSON.stringify(auth) : ''}`;
|
|
188
|
+
}
|
|
189
|
+
const INIT_SCRIPT = `
|
|
190
|
+
(() => {
|
|
191
|
+
// Deterministic pseudo-random for pages that seed layout from Math.random().
|
|
192
|
+
let seed = 42;
|
|
193
|
+
Math.random = () => { seed = (seed * 16807) % 2147483647; return (seed - 1) / 2147483646; };
|
|
194
|
+
// No smooth scrolling: scrollTo() must land immediately.
|
|
195
|
+
const style = document.createElement('style');
|
|
196
|
+
style.setAttribute('data-pre-post', '');
|
|
197
|
+
style.textContent = 'html, body, * { scroll-behavior: auto !important; } ::-webkit-scrollbar { display: none !important; }';
|
|
198
|
+
const attach = () => { (document.head || document.documentElement).appendChild(style); };
|
|
199
|
+
if (document.head) attach(); else document.addEventListener('DOMContentLoaded', attach, { once: true });
|
|
200
|
+
})();
|
|
201
|
+
`;
|
|
202
|
+
async function getContext(viewport, scale, auth) {
|
|
203
|
+
const key = contextKey(viewport, scale, auth);
|
|
204
|
+
let pending = contexts.get(key);
|
|
205
|
+
if (!pending) {
|
|
206
|
+
pending = (async () => {
|
|
207
|
+
const b = await getBrowser();
|
|
208
|
+
const ctx = await b.newContext({
|
|
209
|
+
viewport,
|
|
210
|
+
deviceScaleFactor: scale,
|
|
211
|
+
reducedMotion: 'reduce',
|
|
212
|
+
colorScheme: 'light',
|
|
213
|
+
locale: 'en-US',
|
|
214
|
+
timezoneId: 'UTC',
|
|
215
|
+
ignoreHTTPSErrors: true,
|
|
216
|
+
serviceWorkers: 'block',
|
|
217
|
+
extraHTTPHeaders: auth?.headers,
|
|
218
|
+
bypassCSP: true,
|
|
219
|
+
});
|
|
220
|
+
await ctx.clock.setFixedTime(FIXED_TIME);
|
|
221
|
+
await ctx.addInitScript(INIT_SCRIPT);
|
|
222
|
+
if (auth?.cookies?.length) {
|
|
223
|
+
await ctx.addCookies(auth.cookies.map(c => ({
|
|
224
|
+
name: c.name,
|
|
225
|
+
value: c.value,
|
|
226
|
+
...(c.url ? { url: c.url } : { domain: c.domain, path: c.path || '/' }),
|
|
227
|
+
})));
|
|
228
|
+
}
|
|
229
|
+
ctx.setDefaultNavigationTimeout(NAVIGATION_TIMEOUT);
|
|
230
|
+
ctx.setDefaultTimeout(10_000);
|
|
231
|
+
return ctx;
|
|
232
|
+
})();
|
|
233
|
+
contexts.set(key, pending);
|
|
115
234
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
235
|
+
return pending;
|
|
236
|
+
}
|
|
237
|
+
// ============================================================
|
|
238
|
+
// Settle
|
|
239
|
+
// ============================================================
|
|
240
|
+
/**
|
|
241
|
+
* In-page settle: fonts loaded, images decoded, and layout stable across
|
|
242
|
+
* consecutive animation frames. Bounded by `timeout` ms.
|
|
243
|
+
*/
|
|
244
|
+
async function settlePage(page, timeout, options = {}) {
|
|
245
|
+
const settled = page.evaluate(async (timeoutMs) => {
|
|
246
|
+
const start = performance.now();
|
|
247
|
+
const remaining = () => Math.max(0, timeoutMs - (performance.now() - start));
|
|
248
|
+
const sleep = (ms) => new Promise(r => setTimeout(r, ms));
|
|
249
|
+
const frame = () => new Promise(r => requestAnimationFrame(() => r()));
|
|
250
|
+
const withCap = (p, ms) => Promise.race([p, sleep(ms)]);
|
|
251
|
+
if (document.fonts?.ready)
|
|
252
|
+
await withCap(document.fonts.ready, Math.min(2500, remaining()));
|
|
253
|
+
const pending = Array.from(document.images).filter(img => !img.complete);
|
|
254
|
+
if (pending.length) {
|
|
255
|
+
await withCap(Promise.allSettled(pending.map(img => img.decode().catch(() => undefined))), Math.min(3000, remaining()));
|
|
256
|
+
}
|
|
257
|
+
const signature = () => {
|
|
258
|
+
const de = document.documentElement;
|
|
259
|
+
return `${de.scrollHeight}:${de.scrollWidth}:${document.body?.childElementCount ?? 0}:${document.getElementsByTagName('*').length}`;
|
|
260
|
+
};
|
|
261
|
+
let last = signature();
|
|
262
|
+
let stable = 0;
|
|
263
|
+
while (stable < 2 && remaining() > 0) {
|
|
264
|
+
await frame();
|
|
265
|
+
await frame();
|
|
266
|
+
const now = signature();
|
|
267
|
+
if (now === last)
|
|
268
|
+
stable++;
|
|
269
|
+
else {
|
|
270
|
+
stable = 0;
|
|
271
|
+
last = now;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}, timeout);
|
|
275
|
+
const quiet = options.network === false ? Promise.resolve() : waitForNetworkQuiet(page, 150, Math.min(timeout, 2500));
|
|
276
|
+
await Promise.all([settled, quiet]);
|
|
120
277
|
}
|
|
121
278
|
/**
|
|
122
|
-
*
|
|
123
|
-
*
|
|
124
|
-
*
|
|
279
|
+
* Resolve once no request has been in flight for `quietMs`, or after `cap` ms.
|
|
280
|
+
* Cheaper than Playwright's networkidle (which insists on a 500 ms window)
|
|
281
|
+
* and tolerant of dev servers that keep sockets open.
|
|
282
|
+
*/
|
|
283
|
+
function waitForNetworkQuiet(page, quietMs, cap) {
|
|
284
|
+
const tracker = inflight.get(page);
|
|
285
|
+
if (!tracker)
|
|
286
|
+
return Promise.resolve();
|
|
287
|
+
return new Promise(resolve => {
|
|
288
|
+
let timer = null;
|
|
289
|
+
const done = () => {
|
|
290
|
+
if (timer)
|
|
291
|
+
clearTimeout(timer);
|
|
292
|
+
clearTimeout(hardStop);
|
|
293
|
+
tracker.listeners.delete(check);
|
|
294
|
+
resolve();
|
|
295
|
+
};
|
|
296
|
+
const check = () => {
|
|
297
|
+
if (timer)
|
|
298
|
+
clearTimeout(timer);
|
|
299
|
+
timer = tracker.count === 0 ? setTimeout(done, quietMs) : null;
|
|
300
|
+
};
|
|
301
|
+
const hardStop = setTimeout(done, cap);
|
|
302
|
+
tracker.listeners.add(check);
|
|
303
|
+
check();
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
const inflight = new WeakMap();
|
|
307
|
+
function trackRequests(page) {
|
|
308
|
+
const tracker = { count: 0, listeners: new Set() };
|
|
309
|
+
inflight.set(page, tracker);
|
|
310
|
+
const notify = () => { for (const l of tracker.listeners)
|
|
311
|
+
l(); };
|
|
312
|
+
page.on('request', req => {
|
|
313
|
+
// WebSocket upgrades and event streams never "finish"; ignore them.
|
|
314
|
+
if (req.resourceType() === 'websocket' || req.resourceType() === 'eventsource')
|
|
315
|
+
return;
|
|
316
|
+
tracker.count++;
|
|
317
|
+
notify();
|
|
318
|
+
});
|
|
319
|
+
const finish = (req) => {
|
|
320
|
+
if (req.resourceType() === 'websocket' || req.resourceType() === 'eventsource')
|
|
321
|
+
return;
|
|
322
|
+
tracker.count = Math.max(0, tracker.count - 1);
|
|
323
|
+
notify();
|
|
324
|
+
};
|
|
325
|
+
page.on('requestfinished', finish);
|
|
326
|
+
page.on('requestfailed', finish);
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Scroll through the page once so lazy-loaded and reveal-on-scroll content is
|
|
330
|
+
* rendered before a full-page capture, then return to the top.
|
|
331
|
+
*/
|
|
332
|
+
async function primeLazyContent(page, maxHeight) {
|
|
333
|
+
await page.evaluate(async (limitPx) => {
|
|
334
|
+
const frame = () => new Promise(r => requestAnimationFrame(() => r()));
|
|
335
|
+
const step = Math.max(200, window.innerHeight);
|
|
336
|
+
const limit = Math.min(document.documentElement.scrollHeight, limitPx);
|
|
337
|
+
for (let y = step; y < limit + step; y += step) {
|
|
338
|
+
window.scrollTo(0, y);
|
|
339
|
+
await frame();
|
|
340
|
+
await frame();
|
|
341
|
+
}
|
|
342
|
+
window.scrollTo(0, 0);
|
|
343
|
+
await frame();
|
|
344
|
+
}, maxHeight);
|
|
345
|
+
}
|
|
346
|
+
// ============================================================
|
|
347
|
+
// Capture
|
|
348
|
+
// ============================================================
|
|
349
|
+
/**
|
|
350
|
+
* Capture a screenshot. Safe to call concurrently — the page pool bounds parallelism.
|
|
351
|
+
* Throws HttpStatusError for 401/403 (auth required); other statuses are returned
|
|
352
|
+
* in the result so callers can decide (a 404 "before" for a new page is legitimate).
|
|
125
353
|
*/
|
|
126
354
|
export async function captureScreenshot(url, options) {
|
|
127
|
-
const
|
|
355
|
+
const started = Date.now();
|
|
356
|
+
const scale = options.scale ?? 2;
|
|
357
|
+
const settleTimeout = options.settleTimeout ?? 8000;
|
|
358
|
+
const maxHeight = options.maxHeight ?? options.viewport.height * 3;
|
|
359
|
+
const ctx = await getContext(options.viewport, scale, options.auth);
|
|
360
|
+
await acquireSlot();
|
|
361
|
+
const page = await ctx.newPage();
|
|
362
|
+
trackRequests(page);
|
|
128
363
|
try {
|
|
129
|
-
await
|
|
130
|
-
|
|
131
|
-
pg.waitForLoadState('networkidle'),
|
|
132
|
-
pg.waitForTimeout(3000),
|
|
133
|
-
]);
|
|
134
|
-
// Disable animations and transitions for consistent captures
|
|
135
|
-
await pg.addStyleTag({
|
|
136
|
-
content: '*, *::before, *::after { animation-duration: 0s !important; transition-duration: 0s !important; }',
|
|
364
|
+
const response = await page.goto(url, { waitUntil: 'domcontentloaded' }).catch(err => {
|
|
365
|
+
throw new NavigationError(classifyNavigationError(err), url, err);
|
|
137
366
|
});
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
367
|
+
const status = response?.status();
|
|
368
|
+
if (status === 401 || status === 403)
|
|
369
|
+
throw new HttpStatusError(status, url, isVercelResponse({ get: n => response.headers()[n] ?? null }));
|
|
370
|
+
await settlePage(page, settleTimeout);
|
|
371
|
+
if (options.fullPage) {
|
|
372
|
+
await primeLazyContent(page, maxHeight);
|
|
373
|
+
await settlePage(page, Math.min(settleTimeout, 2000), { network: false });
|
|
374
|
+
}
|
|
144
375
|
if (options.selector) {
|
|
145
|
-
const locator =
|
|
146
|
-
|
|
147
|
-
if (count === 0) {
|
|
376
|
+
const locator = page.locator(options.selector);
|
|
377
|
+
if ((await locator.count()) === 0)
|
|
148
378
|
throw new Error(`Element not found: ${options.selector}`);
|
|
149
|
-
}
|
|
150
379
|
await locator.first().scrollIntoViewIfNeeded();
|
|
151
380
|
}
|
|
152
|
-
|
|
153
|
-
|
|
381
|
+
if (options.wait)
|
|
382
|
+
await page.waitForTimeout(options.wait);
|
|
383
|
+
let clip;
|
|
384
|
+
if (options.fullPage) {
|
|
385
|
+
const height = await page.evaluate(() => document.documentElement.scrollHeight);
|
|
386
|
+
if (height > maxHeight)
|
|
387
|
+
clip = { x: 0, y: 0, width: options.viewport.width, height: maxHeight };
|
|
388
|
+
}
|
|
389
|
+
const image = await page.screenshot({
|
|
390
|
+
type: 'png',
|
|
391
|
+
fullPage: options.fullPage ?? false,
|
|
392
|
+
animations: 'disabled',
|
|
393
|
+
caret: 'hide',
|
|
394
|
+
clip,
|
|
395
|
+
timeout: 20_000,
|
|
396
|
+
});
|
|
397
|
+
return {
|
|
398
|
+
image,
|
|
399
|
+
viewport: options.viewport,
|
|
400
|
+
url,
|
|
401
|
+
status,
|
|
402
|
+
selector: options.selector,
|
|
403
|
+
durationMs: Date.now() - started,
|
|
404
|
+
};
|
|
154
405
|
}
|
|
155
406
|
finally {
|
|
156
|
-
await
|
|
407
|
+
await page.close().catch(() => undefined);
|
|
408
|
+
releaseSlot();
|
|
157
409
|
}
|
|
158
410
|
}
|
|
411
|
+
function classifyNavigationError(err) {
|
|
412
|
+
const msg = err.message || '';
|
|
413
|
+
if (err.name === 'TimeoutError' || /Timeout .* exceeded/.test(msg))
|
|
414
|
+
return 'timeout';
|
|
415
|
+
if (/ERR_CONNECTION_REFUSED/.test(msg))
|
|
416
|
+
return 'refused';
|
|
417
|
+
if (/ERR_NAME_NOT_RESOLVED|ENOTFOUND/.test(msg))
|
|
418
|
+
return 'dns';
|
|
419
|
+
return 'other';
|
|
420
|
+
}
|
|
159
421
|
/**
|
|
160
422
|
* Close the browser session and clean up resources.
|
|
161
423
|
*/
|
|
162
424
|
export async function closeBrowser() {
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
}
|
|
425
|
+
const b = browser;
|
|
426
|
+
browser = null;
|
|
427
|
+
contexts.clear();
|
|
167
428
|
activePages = 0;
|
|
168
429
|
pageQueue.length = 0;
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
* Read a pre-captured screenshot from disk.
|
|
172
|
-
* Used in MCP mode where Playwright MCP saves files directly.
|
|
173
|
-
*/
|
|
174
|
-
export function readScreenshot(filepath) {
|
|
175
|
-
if (!fs.existsSync(filepath)) {
|
|
176
|
-
throw new Error(`Screenshot not found: ${filepath}`);
|
|
177
|
-
}
|
|
178
|
-
return fs.readFileSync(filepath);
|
|
430
|
+
if (b)
|
|
431
|
+
await b.close().catch(() => undefined);
|
|
179
432
|
}
|
|
180
433
|
//# sourceMappingURL=browser.js.map
|
package/dist/browser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"}
|
package/dist/capture.d.ts
CHANGED
|
@@ -1,9 +1,4 @@
|
|
|
1
|
-
import { CaptureOptions, CaptureResult, BeforeAfterCaptureOptions, BeforeAfterCaptureResult
|
|
1
|
+
import { CaptureOptions, CaptureResult, BeforeAfterCaptureOptions, BeforeAfterCaptureResult } from './types.js';
|
|
2
2
|
export declare function captureScreenshot(options: CaptureOptions): Promise<CaptureResult>;
|
|
3
3
|
export declare function captureBeforeAfter(options: BeforeAfterCaptureOptions): Promise<BeforeAfterCaptureResult>;
|
|
4
|
-
/**
|
|
5
|
-
* Capture a URL at multiple viewports (desktop + mobile by default).
|
|
6
|
-
* Returns a map of viewport label → CaptureResult.
|
|
7
|
-
*/
|
|
8
|
-
export declare function captureResponsive(url: string, viewports?: ViewportConfig[]): Promise<Map<string, CaptureResult>>;
|
|
9
4
|
//# sourceMappingURL=capture.d.ts.map
|
package/dist/capture.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../src/capture.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,aAAa,EACb,yBAAyB,EACzB,wBAAwB,
|
|
1
|
+
{"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../src/capture.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,aAAa,EACb,yBAAyB,EACzB,wBAAwB,EACzB,MAAM,YAAY,CAAC;AAQpB,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAYvF;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAO9G"}
|