doc-detective 4.15.2 → 4.16.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/dist/common/src/schemas/schemas.json +280 -0
- package/dist/common/src/types/generated/config_v3.d.ts +16 -0
- package/dist/common/src/types/generated/config_v3.d.ts.map +1 -1
- package/dist/common/src/types/generated/context_v3.d.ts +12 -0
- package/dist/common/src/types/generated/context_v3.d.ts.map +1 -1
- package/dist/common/src/types/generated/report_v3.d.ts +12 -0
- package/dist/common/src/types/generated/report_v3.d.ts.map +1 -1
- package/dist/common/src/types/generated/resolvedTests_v3.d.ts +28 -0
- package/dist/common/src/types/generated/resolvedTests_v3.d.ts.map +1 -1
- package/dist/common/src/types/generated/spec_v3.d.ts +12 -0
- package/dist/common/src/types/generated/spec_v3.d.ts.map +1 -1
- package/dist/common/src/types/generated/test_v3.d.ts +16 -0
- package/dist/common/src/types/generated/test_v3.d.ts.map +1 -1
- package/dist/core/config.d.ts +28 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +90 -13
- package/dist/core/config.js.map +1 -1
- package/dist/core/resolveTests.d.ts.map +1 -1
- package/dist/core/resolveTests.js +5 -0
- package/dist/core/resolveTests.js.map +1 -1
- package/dist/core/tests.d.ts +65 -2
- package/dist/core/tests.d.ts.map +1 -1
- package/dist/core/tests.js +312 -77
- package/dist/core/tests.js.map +1 -1
- package/dist/hints/hints.js +1 -1
- package/dist/hints/hints.js.map +1 -1
- package/dist/index.cjs +1190 -569
- package/dist/runtime/browsers.d.ts +39 -0
- package/dist/runtime/browsers.d.ts.map +1 -1
- package/dist/runtime/browsers.js +269 -39
- package/dist/runtime/browsers.js.map +1 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +18 -0
- package/dist/utils.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,34 @@
|
|
|
1
1
|
import { type CacheDirContext } from "./cacheDir.js";
|
|
2
2
|
import { type Logger } from "./loader.js";
|
|
3
3
|
export type BrowserAssetName = "chrome" | "firefox" | "chromedriver" | "geckodriver";
|
|
4
|
+
/** Outcome of executing a driver binary to confirm it actually works. */
|
|
5
|
+
export interface DriverVerifyResult {
|
|
6
|
+
ok: boolean;
|
|
7
|
+
version?: string;
|
|
8
|
+
error?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Injectable executor for `verifyDriverBinary`. Resolves with the child's
|
|
12
|
+
* exit code (null when the process couldn't be spawned) plus its captured
|
|
13
|
+
* output. Tests inject a fake; production uses {@link defaultDriverExec}.
|
|
14
|
+
*/
|
|
15
|
+
export type DriverExec = (binaryPath: string, args: string[], timeoutMs: number) => Promise<{
|
|
16
|
+
code: number | null;
|
|
17
|
+
stdout: string;
|
|
18
|
+
stderr: string;
|
|
19
|
+
}>;
|
|
20
|
+
/**
|
|
21
|
+
* Execute a driver binary and confirm it is functional — i.e. it runs and
|
|
22
|
+
* reports a parseable version. This is the single guard that stops a
|
|
23
|
+
* present-but-broken driver (e.g. a partially downloaded geckodriver on
|
|
24
|
+
* Windows that exists on disk but doesn't run) from being trusted as
|
|
25
|
+
* installed. Driver-agnostic: works for geckodriver, chromedriver, and
|
|
26
|
+
* safaridriver.
|
|
27
|
+
*/
|
|
28
|
+
export declare function verifyDriverBinary(driverName: string, binaryPath: string, options?: {
|
|
29
|
+
exec?: DriverExec;
|
|
30
|
+
timeoutMs?: number;
|
|
31
|
+
}): Promise<DriverVerifyResult>;
|
|
4
32
|
/**
|
|
5
33
|
* Map a browser name to the installable asset(s) it needs to drive — the
|
|
6
34
|
* browser binary plus its WebDriver. This is the single source of truth the
|
|
@@ -44,6 +72,8 @@ export interface BrowserDeps {
|
|
|
44
72
|
browsersModule?: any;
|
|
45
73
|
/** Injected `geckodriver` namespace for tests. */
|
|
46
74
|
geckodriverModule?: any;
|
|
75
|
+
/** Injected driver executor for `verifyDriverBinary` (tests stub it). */
|
|
76
|
+
verifyExec?: DriverExec;
|
|
47
77
|
/** Wall-clock for freshness gating — tests inject a fixed time. */
|
|
48
78
|
now?: () => Date;
|
|
49
79
|
}
|
|
@@ -64,6 +94,15 @@ export interface EnsureBrowserOptions {
|
|
|
64
94
|
* in-flight promise so parallel installs can't corrupt each other.
|
|
65
95
|
*/
|
|
66
96
|
export declare function ensureBrowserInstalled(name: BrowserAssetName, options?: EnsureBrowserOptions): Promise<EnsureBrowserResult>;
|
|
97
|
+
/**
|
|
98
|
+
* Probe a browsers cache dir for the geckodriver binary a download wrote.
|
|
99
|
+
* Returns its path if found at the cache root or one level deep (some layouts
|
|
100
|
+
* nest under a version dir), else undefined. Exported so the availability probe
|
|
101
|
+
* (Layer 2 in core/config) can resolve the same binary the install path uses
|
|
102
|
+
* when the geckodriver module exposes no `.path` — otherwise the functional
|
|
103
|
+
* driver gate would silently not run for a present-but-broken geckodriver.
|
|
104
|
+
*/
|
|
105
|
+
export declare function geckodriverBinaryInCache(cacheDir: string): string | undefined;
|
|
67
106
|
/**
|
|
68
107
|
* Read the installed-browsers record without resolving or installing
|
|
69
108
|
* anything. Mirrors @puppeteer/browsers.getInstalledBrowsers() but reads
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browsers.d.ts","sourceRoot":"","sources":["../../src/runtime/browsers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"browsers.d.ts","sourceRoot":"","sources":["../../src/runtime/browsers.ts"],"names":[],"mappings":"AAGA,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,SAAS,GAAG,cAAc,GAAG,aAAa,CAAC;AAErF,yEAAyE;AACzE,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,CACvB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EAAE,EACd,SAAS,EAAE,MAAM,KACd,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AA8DtE;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,UAAU,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACtD,OAAO,CAAC,kBAAkB,CAAC,CAiD7B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,gBAAgB,EAAE,CASlF;AAED;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB;;;;;CAKnB,CAAC;AAKX,MAAM,WAAW,mBAAmB;IAClC,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,OAAO,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,cAAc,CAAC,EAAE,GAAG,CAAC;IACrB,kDAAkD;IAClD,iBAAiB,CAAC,EAAE,GAAG,CAAC;IACxB,yEAAyE;IACzE,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,mEAAmE;IACnE,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AA2ED,MAAM,WAAW,oBAAoB;IACnC,GAAG,CAAC,EAAE,eAAe,CAAC;IACtB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAWD;;;;;;;;;;GAUG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,gBAAgB,EACtB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,mBAAmB,CAAC,CAU9B;AAyQD;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAmB7E;AA4HD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,GAAE,eAAoB,GAAG,KAAK,CAAC;IACrE,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC,CAQD"}
|
package/dist/runtime/browsers.js
CHANGED
|
@@ -1,5 +1,113 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
1
4
|
import { getBrowsersDir, readInstalledRecord, writeInstalledRecord, } from "./cacheDir.js";
|
|
2
5
|
import { loadHeavyDep } from "./loader.js";
|
|
6
|
+
// Every WebDriver we manage answers `--version`. Kept as a table so adding
|
|
7
|
+
// an engine later is a one-line change rather than a new code branch.
|
|
8
|
+
const DRIVER_VERSION_ARGS = {
|
|
9
|
+
geckodriver: ["--version"],
|
|
10
|
+
chromedriver: ["--version"],
|
|
11
|
+
safaridriver: ["--version"],
|
|
12
|
+
};
|
|
13
|
+
const DRIVER_VERIFY_TIMEOUT_MS = 10_000;
|
|
14
|
+
// The only executables `verifyDriverBinary` is ever allowed to run. The path it
|
|
15
|
+
// receives is derived from the (user-configurable) cache dir, so before it
|
|
16
|
+
// reaches a child-process call we constrain the value itself: it must be an
|
|
17
|
+
// absolute path ending in a recognized WebDriver filename (a path separator
|
|
18
|
+
// immediately precedes the name, so it's the final segment). Testing the whole
|
|
19
|
+
// path with a single anchored regex — rather than a derived basename — both
|
|
20
|
+
// refuses an arbitrarily-named binary and gives static analysis a barrier on
|
|
21
|
+
// the exact value that reaches the child process.
|
|
22
|
+
const ALLOWED_DRIVER_PATH = /[\\/](?:geckodriver|chromedriver|safaridriver)(?:\.exe)?$/i;
|
|
23
|
+
function isAllowedDriverPath(binaryPath) {
|
|
24
|
+
return (typeof binaryPath === "string" &&
|
|
25
|
+
path.isAbsolute(binaryPath) &&
|
|
26
|
+
ALLOWED_DRIVER_PATH.test(binaryPath));
|
|
27
|
+
}
|
|
28
|
+
// A version is any dotted numeric run in the output ("geckodriver 0.36.0",
|
|
29
|
+
// "ChromeDriver 124.0.6367.207", "Included with Safari 17.4 ..."). A binary
|
|
30
|
+
// that runs but emits nothing version-shaped is treated as broken — that is
|
|
31
|
+
// exactly the partial-download symptom this guards against.
|
|
32
|
+
function parseDriverVersion(output) {
|
|
33
|
+
const m = output.match(/(\d+\.\d+(?:\.\d+)*)/);
|
|
34
|
+
return m ? m[1] : undefined;
|
|
35
|
+
}
|
|
36
|
+
const defaultDriverExec = (binaryPath, args, timeoutMs) => new Promise((resolve) => {
|
|
37
|
+
execFile(binaryPath, args, { timeout: timeoutMs, windowsHide: true }, (err, stdout, stderr) => {
|
|
38
|
+
const out = typeof stdout === "string" ? stdout : String(stdout ?? "");
|
|
39
|
+
const errOut = typeof stderr === "string" ? stderr : String(stderr ?? "");
|
|
40
|
+
if (err && typeof err.code === "number") {
|
|
41
|
+
// Real process exit with a non-zero status.
|
|
42
|
+
resolve({ code: err.code, stdout: out, stderr: errOut });
|
|
43
|
+
}
|
|
44
|
+
else if (err) {
|
|
45
|
+
// Spawn failure (ENOENT, EACCES, timeout, …) — no exit code.
|
|
46
|
+
resolve({ code: null, stdout: out, stderr: `${errOut}${String(err)}` });
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
resolve({ code: 0, stdout: out, stderr: errOut });
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
/**
|
|
54
|
+
* Execute a driver binary and confirm it is functional — i.e. it runs and
|
|
55
|
+
* reports a parseable version. This is the single guard that stops a
|
|
56
|
+
* present-but-broken driver (e.g. a partially downloaded geckodriver on
|
|
57
|
+
* Windows that exists on disk but doesn't run) from being trusted as
|
|
58
|
+
* installed. Driver-agnostic: works for geckodriver, chromedriver, and
|
|
59
|
+
* safaridriver.
|
|
60
|
+
*/
|
|
61
|
+
export async function verifyDriverBinary(driverName, binaryPath, options = {}) {
|
|
62
|
+
if (!binaryPath || typeof binaryPath !== "string") {
|
|
63
|
+
return { ok: false, error: "No driver binary path to verify." };
|
|
64
|
+
}
|
|
65
|
+
// Constrain the executable to a known WebDriver at an absolute path before it
|
|
66
|
+
// reaches a child process. The path derives from the user-configurable cache
|
|
67
|
+
// dir, so refuse anything that isn't a recognized driver binary.
|
|
68
|
+
if (!isAllowedDriverPath(binaryPath)) {
|
|
69
|
+
return {
|
|
70
|
+
ok: false,
|
|
71
|
+
error: `Refusing to execute '${binaryPath}': not a recognized driver binary path.`,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
const key = String(driverName ?? "").toLowerCase();
|
|
75
|
+
const args = DRIVER_VERSION_ARGS[key] ?? ["--version"];
|
|
76
|
+
const exec = options.exec ?? defaultDriverExec;
|
|
77
|
+
const timeoutMs = options.timeoutMs ?? DRIVER_VERIFY_TIMEOUT_MS;
|
|
78
|
+
let res;
|
|
79
|
+
try {
|
|
80
|
+
res = await exec(binaryPath, args, timeoutMs);
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
return { ok: false, error: `Failed to execute ${driverName}: ${String(err)}` };
|
|
84
|
+
}
|
|
85
|
+
if (res.code === null) {
|
|
86
|
+
// No exit code means the process never ran (ENOENT, EACCES, timeout, …) —
|
|
87
|
+
// report it as a spawn failure rather than the misleading "exited with
|
|
88
|
+
// code null".
|
|
89
|
+
const detail = (res.stderr || res.stdout || "").trim();
|
|
90
|
+
return {
|
|
91
|
+
ok: false,
|
|
92
|
+
error: `${driverName} could not be executed (spawn failed)${detail ? `: ${detail}` : ""}`,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
if (res.code !== 0) {
|
|
96
|
+
const detail = (res.stderr || res.stdout || "").trim();
|
|
97
|
+
return {
|
|
98
|
+
ok: false,
|
|
99
|
+
error: `${driverName} exited with code ${res.code}${detail ? `: ${detail}` : ""}`,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
const version = parseDriverVersion(`${res.stdout}\n${res.stderr}`);
|
|
103
|
+
if (!version) {
|
|
104
|
+
return {
|
|
105
|
+
ok: false,
|
|
106
|
+
error: `${driverName} ran but did not report a parseable version (likely a partial or corrupt download).`,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
return { ok: true, version };
|
|
110
|
+
}
|
|
3
111
|
/**
|
|
4
112
|
* Map a browser name to the installable asset(s) it needs to drive — the
|
|
5
113
|
* browser binary plus its WebDriver. This is the single source of truth the
|
|
@@ -202,8 +310,40 @@ async function ensureBrowserInstalledImpl(name, options = {}) {
|
|
|
202
310
|
buildId: latest,
|
|
203
311
|
cacheDir,
|
|
204
312
|
});
|
|
205
|
-
|
|
206
|
-
//
|
|
313
|
+
let path = await locateExecutable(browsersModule, name, latest, cacheDir, platform);
|
|
314
|
+
// Validate chromedriver by execution before recording the install (this
|
|
315
|
+
// branch only handles @puppeteer/browsers assets; geckodriver validation
|
|
316
|
+
// lives in ensureGeckodriver, and Safari's driver ships with macOS). A
|
|
317
|
+
// browser binary (chrome/firefox) is launched by the driver and self-checks
|
|
318
|
+
// at session start, but the driver itself is the thing that, when partially
|
|
319
|
+
// downloaded, runs and fails — so confirm it actually reports a version. On
|
|
320
|
+
// failure, reinstall exactly once (force a clean extract), then give up.
|
|
321
|
+
//
|
|
322
|
+
// Only when we actually located a chromedriver executable: locateExecutable
|
|
323
|
+
// falls back to the bare cacheDir when computeExecutablePath is unavailable
|
|
324
|
+
// (older/alternate @puppeteer/browsers), and validating a directory path
|
|
325
|
+
// would always fail and turn a best-effort install into a hard failure.
|
|
326
|
+
if (name === "chromedriver" && isAllowedDriverPath(path)) {
|
|
327
|
+
let verify = await verifyDriverBinary(name, path, { exec: deps.verifyExec });
|
|
328
|
+
if (!verify.ok) {
|
|
329
|
+
logger(`Installed ${name} ${latest} failed validation (${verify.error}); reinstalling once.`, "warn");
|
|
330
|
+
try {
|
|
331
|
+
await browsersModule.uninstall({ browser: name, buildId: latest, cacheDir });
|
|
332
|
+
}
|
|
333
|
+
catch (err) {
|
|
334
|
+
logger(`Failed to prune broken ${name} ${latest}: ${String(err)}`, "debug");
|
|
335
|
+
}
|
|
336
|
+
await browsersModule.install({ browser: name, buildId: latest, cacheDir });
|
|
337
|
+
path = await locateExecutable(browsersModule, name, latest, cacheDir, platform);
|
|
338
|
+
verify = await verifyDriverBinary(name, path, { exec: deps.verifyExec });
|
|
339
|
+
}
|
|
340
|
+
if (!verify.ok) {
|
|
341
|
+
throw new Error(`${name} ${latest} is present but non-functional after a reinstall (${verify.error}). It may be a partial or corrupt download; delete ${path} or reinstall.`);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
// Prune the previous buildId only after the replacement is known-good, so a
|
|
345
|
+
// failed validation (above) leaves the old build intact as a rollback rather
|
|
346
|
+
// than deleting it for a corrupt download.
|
|
207
347
|
if (existing && existing.installedVersion !== latest) {
|
|
208
348
|
try {
|
|
209
349
|
await browsersModule.uninstall({
|
|
@@ -223,7 +363,6 @@ async function ensureBrowserInstalledImpl(name, options = {}) {
|
|
|
223
363
|
latestCheckedAt: now.toISOString(),
|
|
224
364
|
};
|
|
225
365
|
writeInstalledRecord(record, ctx);
|
|
226
|
-
const path = await locateExecutable(browsersModule, name, latest, cacheDir, platform);
|
|
227
366
|
return { path, version: latest, outdated: false };
|
|
228
367
|
}
|
|
229
368
|
async function locateExecutable(browsersModule, name, buildId, cacheDir, platform) {
|
|
@@ -238,29 +377,106 @@ async function locateExecutable(browsersModule, name, buildId, cacheDir, platfor
|
|
|
238
377
|
// Fallback: report the cache dir; consumer can probe further.
|
|
239
378
|
return cacheDir;
|
|
240
379
|
}
|
|
380
|
+
// GECKODRIVER_CACHE_DIR is a process-wide env var that the geckodriver module
|
|
381
|
+
// reads at load and download time. ensureGeckodriver sets it and then `await`s
|
|
382
|
+
// async work, so two geckodriver operations targeting *different* cache dirs
|
|
383
|
+
// (e.g. concurrent runs in one process) could interleave and restore/resolve
|
|
384
|
+
// the wrong path. Serialize every GECKODRIVER_CACHE_DIR mutation through a
|
|
385
|
+
// single promise queue so only one is active at a time. (Same-cacheDir installs
|
|
386
|
+
// already dedupe on the inFlightInstalls promise in ensureBrowserInstalled.)
|
|
387
|
+
let geckodriverEnvQueue = Promise.resolve();
|
|
388
|
+
async function withGeckodriverCacheDir(cacheDir, fn) {
|
|
389
|
+
const previous = geckodriverEnvQueue;
|
|
390
|
+
let release;
|
|
391
|
+
geckodriverEnvQueue = new Promise((resolve) => {
|
|
392
|
+
release = resolve;
|
|
393
|
+
});
|
|
394
|
+
await previous;
|
|
395
|
+
const prevEnv = process.env.GECKODRIVER_CACHE_DIR;
|
|
396
|
+
process.env.GECKODRIVER_CACHE_DIR = cacheDir;
|
|
397
|
+
try {
|
|
398
|
+
return await fn();
|
|
399
|
+
}
|
|
400
|
+
finally {
|
|
401
|
+
if (prevEnv === undefined)
|
|
402
|
+
delete process.env.GECKODRIVER_CACHE_DIR;
|
|
403
|
+
else
|
|
404
|
+
process.env.GECKODRIVER_CACHE_DIR = prevEnv;
|
|
405
|
+
release();
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
// True when `child` resolves to `dir` itself or a path nested under it. Used to
|
|
409
|
+
// confirm a (possibly import-cached) geckodriver `.path` belongs to the current
|
|
410
|
+
// cache dir before trusting it.
|
|
411
|
+
function isPathInside(child, dir) {
|
|
412
|
+
const resolvedDir = path.resolve(dir);
|
|
413
|
+
const resolvedChild = path.resolve(child);
|
|
414
|
+
return (resolvedChild === resolvedDir ||
|
|
415
|
+
resolvedChild.startsWith(resolvedDir + path.sep));
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* Probe a browsers cache dir for the geckodriver binary a download wrote.
|
|
419
|
+
* Returns its path if found at the cache root or one level deep (some layouts
|
|
420
|
+
* nest under a version dir), else undefined. Exported so the availability probe
|
|
421
|
+
* (Layer 2 in core/config) can resolve the same binary the install path uses
|
|
422
|
+
* when the geckodriver module exposes no `.path` — otherwise the functional
|
|
423
|
+
* driver gate would silently not run for a present-but-broken geckodriver.
|
|
424
|
+
*/
|
|
425
|
+
export function geckodriverBinaryInCache(cacheDir) {
|
|
426
|
+
const binName = process.platform === "win32" ? "geckodriver.exe" : "geckodriver";
|
|
427
|
+
const rootCandidate = path.join(cacheDir, binName);
|
|
428
|
+
try {
|
|
429
|
+
if (fs.existsSync(rootCandidate))
|
|
430
|
+
return rootCandidate;
|
|
431
|
+
}
|
|
432
|
+
catch {
|
|
433
|
+
// ignore and fall through to the shallow scan
|
|
434
|
+
}
|
|
435
|
+
try {
|
|
436
|
+
for (const entry of fs.readdirSync(cacheDir, { withFileTypes: true })) {
|
|
437
|
+
if (!entry.isDirectory())
|
|
438
|
+
continue;
|
|
439
|
+
const nested = path.join(cacheDir, entry.name, binName);
|
|
440
|
+
if (fs.existsSync(nested))
|
|
441
|
+
return nested;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
catch {
|
|
445
|
+
// cacheDir unreadable/missing — caller falls back appropriately.
|
|
446
|
+
}
|
|
447
|
+
return undefined;
|
|
448
|
+
}
|
|
241
449
|
// Geckodriver lives in its own npm package (not under @puppeteer/browsers).
|
|
242
450
|
// Channel resolution is "always latest stable from Mozilla" via
|
|
243
451
|
// geckodriver.download(); the package's GECKODRIVER_VERSION env var would
|
|
244
452
|
// pin a specific version, but we leave it unset to track latest.
|
|
245
453
|
async function ensureGeckodriver(ctxBag, record, existing, logger) {
|
|
246
454
|
const cacheDir = getBrowsersDir(ctxBag.ctx);
|
|
247
|
-
// Resolve the actual geckodriver binary path. The npm package exports
|
|
248
|
-
//
|
|
249
|
-
//
|
|
250
|
-
// cache
|
|
455
|
+
// Resolve the actual geckodriver binary path. The npm package exports a
|
|
456
|
+
// `.path` field computed at module load from GECKODRIVER_CACHE_DIR — but the
|
|
457
|
+
// module is import-cached, so a non-empty `.path` can point at a *different*
|
|
458
|
+
// cache dir than this call's. Only trust it when it resolves inside the
|
|
459
|
+
// current cacheDir; otherwise probe the cache for the real binary, then fall
|
|
460
|
+
// back to the bare cache directory.
|
|
251
461
|
const resolveBinaryPath = (gecko) => {
|
|
252
|
-
const fromModule = gecko &&
|
|
462
|
+
const fromModule = gecko &&
|
|
463
|
+
typeof gecko.path === "string" &&
|
|
464
|
+
gecko.path.length > 0 &&
|
|
465
|
+
isPathInside(gecko.path, cacheDir)
|
|
253
466
|
? gecko.path
|
|
254
467
|
: null;
|
|
255
|
-
return fromModule ?? cacheDir;
|
|
468
|
+
return fromModule ?? geckodriverBinaryInCache(cacheDir) ?? cacheDir;
|
|
256
469
|
};
|
|
257
470
|
if (!ctxBag.force && existing && isStillFresh(existing.latestCheckedAt, ctxBag.now)) {
|
|
258
471
|
// Load the geckodriver module so the returned `path` is the actual
|
|
259
472
|
// binary path, not just the cache directory — matches the contract
|
|
260
473
|
// EnsureBrowserResult documents. Tests can inject `geckodriverModule`
|
|
261
474
|
// via deps to skip the real loader; in production we lazy-resolve.
|
|
475
|
+
// geckodriver resolves `.path` from GECKODRIVER_CACHE_DIR at module load,
|
|
476
|
+
// so point it at our cache before loading, serialized so concurrent
|
|
477
|
+
// installs for other cache dirs can't clobber the env.
|
|
262
478
|
const gecko = ctxBag.deps.geckodriverModule ??
|
|
263
|
-
(await loadGeckodriver(ctxBag.deps, ctxBag.ctx));
|
|
479
|
+
(await withGeckodriverCacheDir(cacheDir, () => loadGeckodriver(ctxBag.deps, ctxBag.ctx)));
|
|
264
480
|
return {
|
|
265
481
|
path: resolveBinaryPath(gecko),
|
|
266
482
|
version: existing.installedVersion,
|
|
@@ -275,47 +491,61 @@ async function ensureGeckodriver(ctxBag, record, existing, logger) {
|
|
|
275
491
|
existing.latestKnownVersion !== existing.installedVersion,
|
|
276
492
|
};
|
|
277
493
|
}
|
|
278
|
-
|
|
279
|
-
//
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
494
|
+
// geckodriver writes binaries into — and resolves `.path`/version from — the
|
|
495
|
+
// env-var-pointed dir at module load, so alias it to our cache BEFORE loading
|
|
496
|
+
// the module (otherwise resolveBinaryPath(gecko) can point at the wrong path).
|
|
497
|
+
// Serialized so two installs for different cache dirs can't clobber the
|
|
498
|
+
// process-wide env across the awaits below.
|
|
499
|
+
return await withGeckodriverCacheDir(cacheDir, async () => {
|
|
500
|
+
const gecko = await loadGeckodriver(ctxBag.deps, ctxBag.ctx);
|
|
283
501
|
logger(`Installing geckodriver into ${cacheDir}`, "info");
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
502
|
+
await gecko.download();
|
|
503
|
+
// Validate by execution, not just presence: a partial download (seen on
|
|
504
|
+
// Windows) leaves a binary on disk that doesn't actually run. If the
|
|
505
|
+
// first download fails validation, quarantine the artifact and
|
|
506
|
+
// re-download exactly once before giving up.
|
|
507
|
+
let binaryPath = resolveBinaryPath(gecko);
|
|
508
|
+
let verify = await verifyDriverBinary("geckodriver", binaryPath, {
|
|
509
|
+
exec: ctxBag.deps.verifyExec,
|
|
510
|
+
});
|
|
511
|
+
if (!verify.ok) {
|
|
512
|
+
logger(`Downloaded geckodriver failed validation (${verify.error}); re-downloading once.`, "warn");
|
|
513
|
+
try {
|
|
514
|
+
if (binaryPath && binaryPath !== cacheDir && fs.existsSync(binaryPath)) {
|
|
515
|
+
fs.rmSync(binaryPath, { force: true });
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
catch {
|
|
519
|
+
// Best-effort quarantine; re-download will overwrite regardless.
|
|
520
|
+
}
|
|
521
|
+
await gecko.download();
|
|
522
|
+
binaryPath = resolveBinaryPath(gecko);
|
|
523
|
+
verify = await verifyDriverBinary("geckodriver", binaryPath, {
|
|
524
|
+
exec: ctxBag.deps.verifyExec,
|
|
525
|
+
});
|
|
298
526
|
}
|
|
299
|
-
|
|
527
|
+
if (!verify.ok) {
|
|
528
|
+
// Don't launder a broken binary into a "valid" record. Throwing lets
|
|
529
|
+
// the install-gate caller record this asset as failed, and the runner
|
|
530
|
+
// surface a diagnostic skip / fall back to another browser.
|
|
531
|
+
throw new Error(`geckodriver is present but non-functional after a re-download (${verify.error}). It may be a partial or corrupt download; delete ${binaryPath} or reinstall.`);
|
|
532
|
+
}
|
|
533
|
+
// The validated binary's own --version output is the source of truth —
|
|
534
|
+
// never record "unknown".
|
|
535
|
+
const installedVersion = verify.version;
|
|
300
536
|
record.browsers.geckodriver = {
|
|
301
537
|
installedVersion,
|
|
302
538
|
installedAt: ctxBag.now.toISOString(),
|
|
303
|
-
latestKnownVersion:
|
|
539
|
+
latestKnownVersion: installedVersion,
|
|
304
540
|
latestCheckedAt: ctxBag.now.toISOString(),
|
|
305
541
|
};
|
|
306
542
|
writeInstalledRecord(record, ctxBag.ctx);
|
|
307
543
|
return {
|
|
308
|
-
path:
|
|
544
|
+
path: binaryPath,
|
|
309
545
|
version: installedVersion,
|
|
310
546
|
outdated: false,
|
|
311
547
|
};
|
|
312
|
-
}
|
|
313
|
-
finally {
|
|
314
|
-
if (prevEnv === undefined)
|
|
315
|
-
delete process.env.GECKODRIVER_CACHE_DIR;
|
|
316
|
-
else
|
|
317
|
-
process.env.GECKODRIVER_CACHE_DIR = prevEnv;
|
|
318
|
-
}
|
|
548
|
+
});
|
|
319
549
|
}
|
|
320
550
|
/**
|
|
321
551
|
* Read the installed-browsers record without resolving or installing
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browsers.js","sourceRoot":"","sources":["../../src/runtime/browsers.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"browsers.js","sourceRoot":"","sources":["../../src/runtime/browsers.ts"],"names":[],"mappings":"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"}
|
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAcA,OAAO,EACL,UAAU,EACV,OAAO,EACP,SAAS,EACT,aAAa,EACb,YAAY,EACZ,OAAO,EACP,cAAc,EACd,GAAG,EACH,uBAAuB,EACvB,aAAa,EACb,SAAS,EACT,gBAAgB,EAChB,gBAAgB,GACjB,CAAC;AASF,iBAAS,gBAAgB,IAAI,OAAO,CAKnC;AAGD,iBAAS,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,GAAE,MAAe,EAAE,MAAM,GAAE,GAAQ,QAclE;AAMD,iBAAS,UAAU,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAcA,OAAO,EACL,UAAU,EACV,OAAO,EACP,SAAS,EACT,aAAa,EACb,YAAY,EACZ,OAAO,EACP,cAAc,EACd,GAAG,EACH,uBAAuB,EACvB,aAAa,EACb,SAAS,EACT,gBAAgB,EAChB,gBAAgB,GACjB,CAAC;AASF,iBAAS,gBAAgB,IAAI,OAAO,CAKnC;AAGD,iBAAS,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,GAAE,MAAe,EAAE,MAAM,GAAE,GAAQ,QAclE;AAMD,iBAAS,UAAU,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,CA4FlC;AAGD,iBAAS,OAAO,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,CAG/B;AAGD,iBAAe,uBAAuB,CAAC,MAAM,GAAE,GAAQ;;;UAyEtD;AA8CD,iBAAe,SAAS,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE;IAAE,UAAU,CAAC,EAAE,GAAG,CAAC;IAAC,IAAI,EAAE,GAAG,CAAA;CAAE,gBAwL7E;AAgCD,QAAA,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CA8kBzG,CAAC;AAGF,iBAAS,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,WAM5D;AAED,iBAAe,aAAa,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE;IAAE,SAAS,EAAE,GAAG,CAAC;IAAC,OAAO,EAAE,GAAG,CAAA;CAAE,iBA8DpF;AAED,iBAAe,aAAa,CAAC,MAAM,EAAE,GAAG,YAAK,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,GAAE,GAAQ,kBA0D9F;AAGD,iBAAe,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE;;;;GAwCvD;AAED,iBAAS,OAAO,SAuBf;AAGD,iBAAS,cAAc,QA+GtB"}
|
package/dist/utils.js
CHANGED
|
@@ -114,6 +114,10 @@ function buildYargs(args) {
|
|
|
114
114
|
.option("concurrent-runners", {
|
|
115
115
|
description: "Number of test contexts to run concurrently (default 1). Pass a number (for example, --concurrent-runners 4), or pass the flag with no value to use the CPU core count (capped at 4). With more than 1 runner, log lines from different contexts interleave and cross-context variable dependencies are unsupported.",
|
|
116
116
|
type: "string",
|
|
117
|
+
})
|
|
118
|
+
.option("browser-fallback", {
|
|
119
|
+
description: "How to handle a context whose browser cannot start a driver session. auto (default): fall back to any other available browser (a fallback away from an explicitly requested browser reports WARNING). explicit: fall back only for auto-selected browsers; a broken explicitly-requested browser is skipped with a diagnostic reason. off: never fall back across browsers. Drivers are validated by execution, so a present-but-broken driver (e.g. a partially downloaded geckodriver) no longer silently skips coverage.",
|
|
120
|
+
type: "string",
|
|
117
121
|
})
|
|
118
122
|
.version(require("../package.json").version)
|
|
119
123
|
.help()
|
|
@@ -337,6 +341,20 @@ async function setConfig({ configPath, args }) {
|
|
|
337
341
|
// `--cache-dir " "` override is neutralized at the consumption site.
|
|
338
342
|
config.cacheDir = args.cacheDir;
|
|
339
343
|
}
|
|
344
|
+
if (typeof args.browserFallback === "string" && args.browserFallback.length > 0) {
|
|
345
|
+
// Only accept a known mode. Unlike most overrides, the schema validation
|
|
346
|
+
// above can't catch a bad CLI value (it runs before this block), and a
|
|
347
|
+
// garbage mode would reach the runner unvalidated on the pre-resolved-tests
|
|
348
|
+
// API path — so drop unknown values and keep the validated config value
|
|
349
|
+
// (which defaults to "auto").
|
|
350
|
+
const mode = args.browserFallback.trim().toLowerCase();
|
|
351
|
+
if (mode === "auto" || mode === "explicit" || mode === "off") {
|
|
352
|
+
config.browserFallback = mode;
|
|
353
|
+
}
|
|
354
|
+
else {
|
|
355
|
+
log(`Ignoring invalid --browser-fallback value '${args.browserFallback}'. Expected one of: auto, explicit, off.`, "warning", config);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
340
358
|
if (typeof args.concurrentRunners === "string") {
|
|
341
359
|
// The bare flag ("" after yargs string parsing) and an explicit "true"
|
|
342
360
|
// select CPU-count mode; anything else must parse as a positive integer.
|