@testivai/witness 2.0.0 → 2.0.1

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.
@@ -15,6 +15,18 @@ export interface LaunchedChrome {
15
15
  port: number;
16
16
  kill: () => void;
17
17
  }
18
+ /**
19
+ * Chrome refuses to start as root unless its sandbox is disabled, and root is
20
+ * the default user inside Docker images and CI containers — exactly where
21
+ * `testivai witness <url>` is most useful. Detect that case so the run works
22
+ * instead of timing out with an error that looks like a broken binary.
23
+ *
24
+ * TESTIVAI_CHROME_NO_SANDBOX overrides the detection in both directions, for
25
+ * non-root containers whose seccomp profile still blocks the sandbox.
26
+ */
27
+ export declare function needsNoSandbox(): boolean;
28
+ /** Flags for the throwaway Chrome instance. Exported for testing. */
29
+ export declare function chromeLaunchArgs(port: number, userDataDir: string): string[];
18
30
  /**
19
31
  * Launch a throwaway headless Chrome with remote debugging enabled.
20
32
  * Uses a temp profile so the user's browser state is never touched.
@@ -1 +1 @@
1
- {"version":3,"file":"launcher.d.ts","sourceRoot":"","sources":["../../src/standalone/launcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAoBH,wBAAgB,UAAU,IAAI,MAAM,GAAG,IAAI,CAqB1C;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,IAAI,CAAC;CAClB;AAuBD;;;GAGG;AACH,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CA0C5F"}
1
+ {"version":3,"file":"launcher.d.ts","sourceRoot":"","sources":["../../src/standalone/launcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAoBH,wBAAgB,UAAU,IAAI,MAAM,GAAG,IAAI,CAqB1C;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,IAAI,CAAC;CAClB;AAuBD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAMxC;AAED,qEAAqE;AACrE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAqB5E;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAoC5F"}
@@ -46,6 +46,8 @@ var __importStar = (this && this.__importStar) || (function () {
46
46
  })();
47
47
  Object.defineProperty(exports, "__esModule", { value: true });
48
48
  exports.findChrome = findChrome;
49
+ exports.needsNoSandbox = needsNoSandbox;
50
+ exports.chromeLaunchArgs = chromeLaunchArgs;
49
51
  exports.launchChrome = launchChrome;
50
52
  const child_process_1 = require("child_process");
51
53
  const fs = __importStar(require("fs"));
@@ -108,11 +110,25 @@ async function waitForDevtools(port, timeoutMs) {
108
110
  return false;
109
111
  }
110
112
  /**
111
- * Launch a throwaway headless Chrome with remote debugging enabled.
112
- * Uses a temp profile so the user's browser state is never touched.
113
+ * Chrome refuses to start as root unless its sandbox is disabled, and root is
114
+ * the default user inside Docker images and CI containers — exactly where
115
+ * `testivai witness <url>` is most useful. Detect that case so the run works
116
+ * instead of timing out with an error that looks like a broken binary.
117
+ *
118
+ * TESTIVAI_CHROME_NO_SANDBOX overrides the detection in both directions, for
119
+ * non-root containers whose seccomp profile still blocks the sandbox.
113
120
  */
114
- async function launchChrome(executable, port) {
115
- const userDataDir = fs.mkdtempSync(path.join(os.tmpdir(), 'testivai-chrome-'));
121
+ function needsNoSandbox() {
122
+ const forced = process.env.TESTIVAI_CHROME_NO_SANDBOX;
123
+ if (forced === '1' || forced === 'true')
124
+ return true;
125
+ if (forced === '0' || forced === 'false')
126
+ return false;
127
+ // getuid does not exist on Windows.
128
+ return typeof process.getuid === 'function' && process.getuid() === 0;
129
+ }
130
+ /** Flags for the throwaway Chrome instance. Exported for testing. */
131
+ function chromeLaunchArgs(port, userDataDir) {
116
132
  const args = [
117
133
  `--remote-debugging-port=${port}`,
118
134
  `--user-data-dir=${userDataDir}`,
@@ -123,8 +139,22 @@ async function launchChrome(executable, port) {
123
139
  '--disable-extensions',
124
140
  '--disable-background-networking',
125
141
  '--hide-scrollbars',
126
- 'about:blank',
127
142
  ];
143
+ if (needsNoSandbox()) {
144
+ // Docker gives /dev/shm only 64MB by default, which crashes Chrome on
145
+ // larger pages, so the two container flags travel together.
146
+ args.push('--no-sandbox', '--disable-dev-shm-usage');
147
+ }
148
+ args.push('about:blank');
149
+ return args;
150
+ }
151
+ /**
152
+ * Launch a throwaway headless Chrome with remote debugging enabled.
153
+ * Uses a temp profile so the user's browser state is never touched.
154
+ */
155
+ async function launchChrome(executable, port) {
156
+ const userDataDir = fs.mkdtempSync(path.join(os.tmpdir(), 'testivai-chrome-'));
157
+ const args = chromeLaunchArgs(port, userDataDir);
128
158
  logger_1.logger.debug(`Launching Chrome: ${executable}`);
129
159
  const child = (0, child_process_1.spawn)(executable, args, { stdio: 'ignore' });
130
160
  const kill = () => {
@@ -144,8 +174,13 @@ async function launchChrome(executable, port) {
144
174
  const ready = await waitForDevtools(port, 12000);
145
175
  if (!ready) {
146
176
  kill();
177
+ const sandboxHint = needsNoSandbox()
178
+ ? ''
179
+ : ' If this is a container, Chrome may be refusing to start because its ' +
180
+ 'sandbox is unavailable — set TESTIVAI_CHROME_NO_SANDBOX=1.';
147
181
  throw new Error(`Chrome did not open its debugging endpoint on port ${port} within 12s. ` +
148
- `Set TESTIVAI_CHROME_PATH to a working Chrome/Chromium binary if the auto-detected one is broken.`);
182
+ `Set TESTIVAI_CHROME_PATH to a working Chrome/Chromium binary if the auto-detected one is broken.` +
183
+ sandboxHint);
149
184
  }
150
185
  return { port, kill };
151
186
  }
@@ -1 +1 @@
1
- {"version":3,"file":"launcher.js","sourceRoot":"","sources":["../../src/standalone/launcher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"launcher.js","sourceRoot":"","sources":["../../src/standalone/launcher.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@testivai/witness",
3
- "version": "2.0.0",
3
+ "version": "2.0.1",
4
4
  "description": "Local-first visual regression testing: CLI, diff engine, baselines and self-contained HTML report. No account, nothing uploaded.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -83,9 +83,9 @@
83
83
  "chrome-remote-interface": "^0.34.0",
84
84
  "commander": "^14.0.3",
85
85
  "inquirer": "^8.2.6",
86
- "ora": "^9.4.0",
86
+ "ora": "^9.4.1",
87
87
  "pngjs": "^7.0.0",
88
- "ws": "^8.21.0"
88
+ "ws": "^8.21.3"
89
89
  },
90
90
  "devDependencies": {
91
91
  "@types/inquirer": "^8.2.10",
@@ -94,7 +94,7 @@
94
94
  "@types/pngjs": "^6.0.5",
95
95
  "@types/ws": "^8.0.0",
96
96
  "jest": "^30.4.2",
97
- "ts-jest": "^29.4.11",
97
+ "ts-jest": "^29.4.12",
98
98
  "typescript": "^6.0.3"
99
99
  },
100
100
  "engines": {