@juangadm/pre-post 0.2.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.
Files changed (125) hide show
  1. package/README.md +102 -222
  2. package/dist/bin/cli.js +199 -347
  3. package/dist/bin/cli.js.map +1 -1
  4. package/dist/browser.d.ts +42 -11
  5. package/dist/browser.d.ts.map +1 -1
  6. package/dist/browser.js +371 -94
  7. package/dist/browser.js.map +1 -1
  8. package/dist/capture.d.ts +1 -6
  9. package/dist/capture.d.ts.map +1 -1
  10. package/dist/capture.js +12 -35
  11. package/dist/capture.js.map +1 -1
  12. package/dist/commands/compare.d.ts +18 -0
  13. package/dist/commands/compare.d.ts.map +1 -0
  14. package/dist/commands/compare.js +64 -0
  15. package/dist/commands/compare.js.map +1 -0
  16. package/dist/commands/detect.d.ts +20 -0
  17. package/dist/commands/detect.d.ts.map +1 -0
  18. package/dist/commands/detect.js +19 -0
  19. package/dist/commands/detect.js.map +1 -0
  20. package/dist/commands/doctor.d.ts +10 -0
  21. package/dist/commands/doctor.d.ts.map +1 -0
  22. package/dist/commands/doctor.js +38 -0
  23. package/dist/commands/doctor.js.map +1 -0
  24. package/dist/commands/login.d.ts +6 -0
  25. package/dist/commands/login.d.ts.map +1 -0
  26. package/dist/commands/login.js +34 -0
  27. package/dist/commands/login.js.map +1 -0
  28. package/dist/commands/pr.d.ts +28 -0
  29. package/dist/commands/pr.d.ts.map +1 -0
  30. package/dist/commands/pr.js +159 -0
  31. package/dist/commands/pr.js.map +1 -0
  32. package/dist/commands/prune.d.ts +10 -0
  33. package/dist/commands/prune.d.ts.map +1 -0
  34. package/dist/commands/prune.js +13 -0
  35. package/dist/commands/prune.js.map +1 -0
  36. package/dist/config.d.ts +36 -0
  37. package/dist/config.d.ts.map +1 -0
  38. package/dist/config.js +60 -0
  39. package/dist/config.js.map +1 -0
  40. package/dist/diff-pool.d.ts +17 -0
  41. package/dist/diff-pool.d.ts.map +1 -0
  42. package/dist/diff-pool.js +89 -0
  43. package/dist/diff-pool.js.map +1 -0
  44. package/dist/diff-worker.d.ts +29 -0
  45. package/dist/diff-worker.d.ts.map +1 -0
  46. package/dist/diff-worker.js +38 -0
  47. package/dist/diff-worker.js.map +1 -0
  48. package/dist/diff.d.ts +37 -0
  49. package/dist/diff.d.ts.map +1 -0
  50. package/dist/diff.js +171 -0
  51. package/dist/diff.js.map +1 -0
  52. package/dist/doctor.d.ts +38 -0
  53. package/dist/doctor.d.ts.map +1 -0
  54. package/dist/doctor.js +72 -0
  55. package/dist/doctor.js.map +1 -0
  56. package/dist/errors.d.ts +38 -0
  57. package/dist/errors.d.ts.map +1 -0
  58. package/dist/errors.js +59 -0
  59. package/dist/errors.js.map +1 -0
  60. package/dist/filename.d.ts +2 -0
  61. package/dist/filename.d.ts.map +1 -1
  62. package/dist/filename.js +2 -1
  63. package/dist/filename.js.map +1 -1
  64. package/dist/git.d.ts +23 -0
  65. package/dist/git.d.ts.map +1 -0
  66. package/dist/git.js +86 -0
  67. package/dist/git.js.map +1 -0
  68. package/dist/github.d.ts +73 -0
  69. package/dist/github.d.ts.map +1 -0
  70. package/dist/github.js +240 -0
  71. package/dist/github.js.map +1 -0
  72. package/dist/index.d.ts +22 -22
  73. package/dist/index.d.ts.map +1 -1
  74. package/dist/index.js +17 -66
  75. package/dist/index.js.map +1 -1
  76. package/dist/pkg.d.ts +8 -0
  77. package/dist/pkg.d.ts.map +1 -0
  78. package/dist/pkg.js +35 -0
  79. package/dist/pkg.js.map +1 -0
  80. package/dist/report.d.ts +20 -0
  81. package/dist/report.d.ts.map +1 -0
  82. package/dist/report.js +107 -0
  83. package/dist/report.js.map +1 -0
  84. package/dist/routes/imports.d.ts +46 -0
  85. package/dist/routes/imports.d.ts.map +1 -0
  86. package/dist/routes/imports.js +208 -0
  87. package/dist/routes/imports.js.map +1 -0
  88. package/dist/routes/vite.d.ts +15 -0
  89. package/dist/routes/vite.d.ts.map +1 -0
  90. package/dist/routes/vite.js +130 -0
  91. package/dist/routes/vite.js.map +1 -0
  92. package/dist/routes.d.ts +41 -14
  93. package/dist/routes.d.ts.map +1 -1
  94. package/dist/routes.js +271 -141
  95. package/dist/routes.js.map +1 -1
  96. package/dist/run.d.ts +36 -0
  97. package/dist/run.d.ts.map +1 -0
  98. package/dist/run.js +128 -0
  99. package/dist/run.js.map +1 -0
  100. package/dist/sessions.d.ts +50 -0
  101. package/dist/sessions.d.ts.map +1 -0
  102. package/dist/sessions.js +74 -0
  103. package/dist/sessions.js.map +1 -0
  104. package/dist/types.d.ts +118 -41
  105. package/dist/types.d.ts.map +1 -1
  106. package/dist/types.js +1 -0
  107. package/dist/types.js.map +1 -1
  108. package/dist/viewport.d.ts +6 -1
  109. package/dist/viewport.d.ts.map +1 -1
  110. package/dist/viewport.js +13 -7
  111. package/dist/viewport.js.map +1 -1
  112. package/package.json +21 -13
  113. package/skill/SKILL.md +31 -229
  114. package/dist/clipboard.d.ts +0 -9
  115. package/dist/clipboard.d.ts.map +0 -1
  116. package/dist/clipboard.js +0 -26
  117. package/dist/clipboard.js.map +0 -1
  118. package/dist/upload.d.ts +0 -39
  119. package/dist/upload.d.ts.map +0 -1
  120. package/dist/upload.js +0 -149
  121. package/dist/upload.js.map +0 -1
  122. package/skill/scripts/adapters/0x0st.sh +0 -36
  123. package/skill/scripts/adapters/blob.sh +0 -55
  124. package/skill/scripts/adapters/git-native.sh +0 -51
  125. package/skill/scripts/upload-and-copy.sh +0 -230
package/dist/browser.d.ts CHANGED
@@ -1,25 +1,56 @@
1
1
  /**
2
- * Browser automation via Playwright.
3
- * Launches headless Chromium for screenshot capture.
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 { ViewportSize } from './types.js';
8
+ import { Browser } from 'playwright-core';
9
+ import { AuthOptions, CaptureResult, ViewportSize } from './types.js';
10
+ /** Every capture sees the same wall clock, so dates and "x minutes ago" never drift. */
11
+ export declare const FIXED_TIME: Date;
6
12
  export interface ScreenshotOptions {
7
13
  viewport: ViewportSize;
8
14
  fullPage?: boolean;
15
+ maxHeight?: number;
16
+ scale?: number;
9
17
  selector?: string;
18
+ settleTimeout?: number;
19
+ wait?: number;
20
+ auth?: AuthOptions;
21
+ }
22
+ /** Directory of the playwright-core package (for its CLI and browsers.json). */
23
+ export declare function playwrightCoreDir(): string;
24
+ export interface LaunchOptions {
25
+ headless?: boolean;
10
26
  }
11
27
  /**
12
- * Capture a screenshot using Playwright.
13
- * Returns the screenshot as a Buffer.
28
+ * Launch Chromium with a fallback chain:
29
+ * 1. Explicit custom path (PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH) — override, fails hard
30
+ * 2. Bundled Playwright Chromium (headless shell when headless)
31
+ * 3. Any Chromium build found in Playwright's cache
32
+ * 4. System Chrome / Edge
14
33
  */
15
- export declare function captureScreenshot(url: string, options: ScreenshotOptions): Promise<Buffer>;
34
+ export declare function launchBrowser(opts?: LaunchOptions): Promise<Browser>;
35
+ export type BrowserKind = 'chromium-headless-shell' | 'chromium';
36
+ /** Install a browser through playwright-core's CLI. Returns true on success. */
37
+ export declare function installBrowser(kind: BrowserKind): boolean;
16
38
  /**
17
- * Close the browser session and clean up resources.
39
+ * Launch, installing the right browser first if none is found.
40
+ * Throws BrowserNotFoundError (with `installed` set) when it still cannot launch.
18
41
  */
19
- export declare function closeBrowser(): Promise<void>;
42
+ export declare function launchBrowserOrInstall(opts?: LaunchOptions): Promise<Browser>;
43
+ /** The process-wide headless browser, launched (and installed) on first use. */
44
+ export declare function getBrowser(): Promise<Browser>;
45
+ export declare function browserDescription(): string;
20
46
  /**
21
- * Read a pre-captured screenshot from disk.
22
- * Used in MCP mode where Playwright MCP saves files directly.
47
+ * Capture a screenshot. Safe to call concurrently — the page pool bounds parallelism.
48
+ * Throws HttpStatusError for 401/403 (auth required); other statuses are returned
49
+ * in the result so callers can decide (a 404 "before" for a new page is legitimate).
23
50
  */
24
- export declare function readScreenshot(filepath: string): Buffer;
51
+ export declare function captureScreenshot(url: string, options: ScreenshotOptions): Promise<CaptureResult>;
52
+ /**
53
+ * Close the browser session and clean up resources.
54
+ */
55
+ export declare function closeBrowser(): Promise<void>;
25
56
  //# sourceMappingURL=browser.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAO1C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,YAAY,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA8GD;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,MAAM,CAAC,CA0BjB;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CASlD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKvD"}
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAY,OAAO,EAAwB,MAAM,iBAAiB,CAAC;AAK1E,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAKtE,wFAAwF;AACxF,eAAO,MAAM,UAAU,MAAuC,CAAC;AAyB/D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,YAAY,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAMD,gFAAgF;AAChF,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AA4DD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,CAwC9E;AAED,MAAM,MAAM,WAAW,GAAG,yBAAyB,GAAG,UAAU,CAAC;AAEjE,gFAAgF;AAChF,wBAAgB,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAIzD;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,CAcvF;AAED,gFAAgF;AAChF,wBAAsB,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAMnD;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAoLD;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,CAAC,CA2DvG;AAUD;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAOlD"}
package/dist/browser.js CHANGED
@@ -1,22 +1,56 @@
1
1
  /**
2
- * Browser automation via Playwright.
3
- * Launches headless Chromium for screenshot capture.
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
- let page = null;
20
+ let browserLabel = '';
21
+ const contexts = new Map();
22
+ let activePages = 0;
23
+ const pageQueue = [];
24
+ async function acquireSlot() {
25
+ if (activePages >= MAX_CONCURRENT_PAGES) {
26
+ await new Promise(resolve => pageQueue.push(resolve));
27
+ }
28
+ activePages++;
29
+ }
30
+ function releaseSlot() {
31
+ activePages--;
32
+ const next = pageQueue.shift();
33
+ if (next)
34
+ next();
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
+ }
10
43
  /**
11
- * Scan Playwright's cache directory for any installed Chromium executables.
12
- * Returns paths to try, in order of preference.
44
+ * Scan Playwright's browser cache for installed Chromium executables.
13
45
  */
14
46
  function findCachedChromium() {
15
47
  const home = process.env.HOME || process.env.USERPROFILE || '';
16
48
  const cacheDir = process.env.PLAYWRIGHT_BROWSERS_PATH
17
- || path.join(home, '.cache', 'ms-playwright');
18
- if (!fs.existsSync(cacheDir))
19
- return [];
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'));
20
54
  let entries;
21
55
  try {
22
56
  entries = fs.readdirSync(cacheDir);
@@ -24,41 +58,57 @@ function findCachedChromium() {
24
58
  catch {
25
59
  return [];
26
60
  }
27
- const knownSubpaths = [];
28
- if (process.platform === 'darwin') {
29
- knownSubpaths.push(path.join('chrome-mac', 'Chromium.app', 'Contents', 'MacOS', 'Chromium'));
30
- }
31
- else if (process.platform === 'win32') {
32
- knownSubpaths.push(path.join('chrome-win', 'chrome.exe'));
33
- }
34
- else {
35
- knownSubpaths.push(path.join('chrome-linux', 'chrome'), path.join('chrome-headless-shell-linux64', 'chrome-headless-shell'));
36
- }
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));
37
79
  const candidates = [];
38
- for (const entry of entries) {
39
- if (!entry.startsWith('chromium'))
40
- continue;
41
- for (const sub of knownSubpaths) {
42
- const fullPath = path.join(cacheDir, entry, sub);
43
- if (fs.existsSync(fullPath))
44
- 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);
45
85
  }
46
86
  }
47
87
  return candidates;
48
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
+ ];
49
97
  /**
50
98
  * Launch Chromium with a fallback chain:
51
- * 1. Explicit custom path (PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH) — treated as override, fails hard
52
- * 2. System Chrome
53
- * 3. Bundled Playwright Chromium
54
- * 4. Any Chromium build found in Playwright's cache
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
55
103
  */
56
- async function launchBrowser() {
57
- // If user explicitly set a custom path, treat it as an override — don't fallback
104
+ export async function launchBrowser(opts = {}) {
105
+ const headless = opts.headless ?? true;
58
106
  const customPath = process.env.PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH;
59
107
  if (customPath) {
60
108
  try {
61
- return await chromium.launch({ headless: true, executablePath: customPath });
109
+ const b = await chromium.launch({ headless, executablePath: customPath, args: LAUNCH_ARGS });
110
+ browserLabel = `custom (${customPath})`;
111
+ return b;
62
112
  }
63
113
  catch (err) {
64
114
  throw new Error(`Failed to launch Chromium at custom path: ${customPath}\n` +
@@ -66,91 +116,318 @@ async function launchBrowser() {
66
116
  'Either fix the path or unset PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH to use auto-detection.');
67
117
  }
68
118
  }
69
- // Auto-detection: try each strategy in order
70
119
  const strategies = [
71
- { label: 'System Chrome', options: { headless: true, channel: 'chrome' } },
72
- { label: 'Bundled Playwright Chromium', options: { headless: true } },
120
+ { label: 'bundled', options: { headless, args: LAUNCH_ARGS } },
73
121
  ];
74
- for (const cachedPath of findCachedChromium()) {
75
- strategies.push({ label: `Cached (${cachedPath})`, options: { headless: true, executablePath: cachedPath } });
122
+ if (headless) {
123
+ for (const cachedPath of findCachedChromium()) {
124
+ strategies.push({ label: `cached (${cachedPath})`, options: { headless, executablePath: cachedPath, args: LAUNCH_ARGS } });
125
+ }
76
126
  }
77
- for (const { options } of strategies) {
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) {
78
131
  try {
79
- return await chromium.launch(options);
132
+ const b = await chromium.launch(options);
133
+ browserLabel = label;
134
+ return b;
135
+ }
136
+ catch (err) {
137
+ lastError = err;
80
138
  }
81
- catch { /* try next */ }
82
139
  }
83
- throw new Error('No usable Chromium found.\n' +
84
- ' 1. Set PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH=/path/to/chrome\n' +
85
- ' 2. Or run: npx playwright install chromium\n' +
86
- ' 3. For pre-captured images: pre-post before.png after.png --markdown');
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;
87
147
  }
88
148
  /**
89
- * Get or create a Playwright page with the given viewport.
90
- * Reuses the browser instance across calls for performance.
149
+ * Launch, installing the right browser first if none is found.
150
+ * Throws BrowserNotFoundError (with `installed` set) when it still cannot launch.
91
151
  */
92
- async function getPage(viewport) {
93
- if (!browser) {
94
- browser = await launchBrowser();
152
+ export async function launchBrowserOrInstall(opts = {}) {
153
+ try {
154
+ return await launchBrowser(opts);
95
155
  }
96
- if (!page) {
97
- page = await browser.newPage({
98
- viewport,
99
- deviceScaleFactor: 2,
100
- });
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(); });
101
177
  }
102
- else {
103
- await page.setViewportSize(viewport);
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);
104
234
  }
105
- return page;
235
+ return pending;
106
236
  }
237
+ // ============================================================
238
+ // Settle
239
+ // ============================================================
107
240
  /**
108
- * Capture a screenshot using Playwright.
109
- * Returns the screenshot as a Buffer.
241
+ * In-page settle: fonts loaded, images decoded, and layout stable across
242
+ * consecutive animation frames. Bounded by `timeout` ms.
110
243
  */
111
- export async function captureScreenshot(url, options) {
112
- const pg = await getPage(options.viewport);
113
- await pg.goto(url, { waitUntil: 'networkidle' });
114
- // Disable animations and transitions for consistent captures
115
- await pg.addStyleTag({
116
- content: '*, *::before, *::after { animation-duration: 0s !important; transition-duration: 0s !important; }',
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]);
277
+ }
278
+ /**
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();
117
318
  });
118
- // Wait for web fonts to finish loading
119
- await pg.evaluate(() => document.fonts.ready);
120
- // If selector specified, scroll it into view
121
- if (options.selector) {
122
- const locator = pg.locator(options.selector);
123
- const count = await locator.count();
124
- if (count === 0) {
125
- throw new Error(`Element not found: ${options.selector}`);
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();
126
341
  }
127
- await locator.first().scrollIntoViewIfNeeded();
128
- await pg.waitForTimeout(200);
129
- }
130
- const screenshot = await pg.screenshot({ fullPage: options.fullPage ?? false });
131
- return Buffer.from(screenshot);
342
+ window.scrollTo(0, 0);
343
+ await frame();
344
+ }, maxHeight);
132
345
  }
346
+ // ============================================================
347
+ // Capture
348
+ // ============================================================
133
349
  /**
134
- * Close the browser session and clean up resources.
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).
135
353
  */
136
- export async function closeBrowser() {
137
- if (page) {
138
- await page.close();
139
- page = null;
354
+ export async function captureScreenshot(url, options) {
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);
363
+ try {
364
+ const response = await page.goto(url, { waitUntil: 'domcontentloaded' }).catch(err => {
365
+ throw new NavigationError(classifyNavigationError(err), url, err);
366
+ });
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
+ }
375
+ if (options.selector) {
376
+ const locator = page.locator(options.selector);
377
+ if ((await locator.count()) === 0)
378
+ throw new Error(`Element not found: ${options.selector}`);
379
+ await locator.first().scrollIntoViewIfNeeded();
380
+ }
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
+ };
140
405
  }
141
- if (browser) {
142
- await browser.close();
143
- browser = null;
406
+ finally {
407
+ await page.close().catch(() => undefined);
408
+ releaseSlot();
144
409
  }
145
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
+ }
146
421
  /**
147
- * Read a pre-captured screenshot from disk.
148
- * Used in MCP mode where Playwright MCP saves files directly.
422
+ * Close the browser session and clean up resources.
149
423
  */
150
- export function readScreenshot(filepath) {
151
- if (!fs.existsSync(filepath)) {
152
- throw new Error(`Screenshot not found: ${filepath}`);
153
- }
154
- return fs.readFileSync(filepath);
424
+ export async function closeBrowser() {
425
+ const b = browser;
426
+ browser = null;
427
+ contexts.clear();
428
+ activePages = 0;
429
+ pageQueue.length = 0;
430
+ if (b)
431
+ await b.close().catch(() => undefined);
155
432
  }
156
433
  //# sourceMappingURL=browser.js.map
@@ -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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"}