cbrowser 19.6.0 → 20.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 +292 -232
- package/THIRD_PARTY_LICENSES.md +416 -7
- package/dist/analysis/accessibility-empathy.d.ts.map +1 -1
- package/dist/analysis/accessibility-empathy.js +2 -0
- package/dist/analysis/accessibility-empathy.js.map +1 -1
- package/dist/analysis/competitive-benchmark.d.ts.map +1 -1
- package/dist/analysis/competitive-benchmark.js +70 -558
- package/dist/analysis/competitive-benchmark.js.map +1 -1
- package/dist/analysis/natural-language.d.ts.map +1 -1
- package/dist/analysis/natural-language.js +43 -0
- package/dist/analysis/natural-language.js.map +1 -1
- package/dist/analysis/persona-comparison.d.ts +7 -0
- package/dist/analysis/persona-comparison.d.ts.map +1 -1
- package/dist/analysis/persona-comparison.js +8 -1
- package/dist/analysis/persona-comparison.js.map +1 -1
- package/dist/browser-options.d.ts +23 -0
- package/dist/browser-options.d.ts.map +1 -0
- package/dist/browser-options.js +24 -0
- package/dist/browser-options.js.map +1 -0
- package/dist/browser.d.ts +36 -14
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +139 -196
- package/dist/browser.js.map +1 -1
- package/dist/cli-args.d.ts +9 -1
- package/dist/cli-args.d.ts.map +1 -1
- package/dist/cli-args.js +35 -7
- package/dist/cli-args.js.map +1 -1
- package/dist/cli-browser-flags.d.ts +33 -0
- package/dist/cli-browser-flags.d.ts.map +1 -0
- package/dist/cli-browser-flags.js +89 -0
- package/dist/cli-browser-flags.js.map +1 -0
- package/dist/cli.js +979 -401
- package/dist/cli.js.map +1 -1
- package/dist/cognitive/index.d.ts +0 -13
- package/dist/cognitive/index.d.ts.map +1 -1
- package/dist/cognitive/index.js +39 -15
- package/dist/cognitive/index.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +16 -6
- package/dist/config.js.map +1 -1
- package/dist/daemon.d.ts +5 -4
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +87 -29
- package/dist/daemon.js.map +1 -1
- package/dist/devices.d.ts +20 -0
- package/dist/devices.d.ts.map +1 -1
- package/dist/devices.js +18 -0
- package/dist/devices.js.map +1 -1
- package/dist/help-client.d.ts +48 -0
- package/dist/help-client.d.ts.map +1 -0
- package/dist/help-client.js +96 -0
- package/dist/help-client.js.map +1 -0
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +165 -2281
- package/dist/mcp-server.js.map +1 -1
- package/dist/mcp-tools/base/advanced-interaction-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/advanced-interaction-tools.js +21 -21
- package/dist/mcp-tools/base/advanced-interaction-tools.js.map +1 -1
- package/dist/mcp-tools/base/assertion-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/assertion-tools.js +6 -3
- package/dist/mcp-tools/base/assertion-tools.js.map +1 -1
- package/dist/mcp-tools/base/audit-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/audit-tools.js +15 -4
- package/dist/mcp-tools/base/audit-tools.js.map +1 -1
- package/dist/mcp-tools/base/browser-state-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/browser-state-tools.js +33 -27
- package/dist/mcp-tools/base/browser-state-tools.js.map +1 -1
- package/dist/mcp-tools/base/bug-analysis-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/bug-analysis-tools.js +9 -2
- package/dist/mcp-tools/base/bug-analysis-tools.js.map +1 -1
- package/dist/mcp-tools/base/capture-tools.d.ts +60 -4
- package/dist/mcp-tools/base/capture-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/capture-tools.js +118 -14
- package/dist/mcp-tools/base/capture-tools.js.map +1 -1
- package/dist/mcp-tools/base/index.d.ts +6 -5
- package/dist/mcp-tools/base/index.d.ts.map +1 -1
- package/dist/mcp-tools/base/index.js +7 -6
- package/dist/mcp-tools/base/index.js.map +1 -1
- package/dist/mcp-tools/base/interaction-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/interaction-tools.js +20 -6
- package/dist/mcp-tools/base/interaction-tools.js.map +1 -1
- package/dist/mcp-tools/base/navigation-tools.d.ts +1 -1
- package/dist/mcp-tools/base/navigation-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/navigation-tools.js +83 -3
- package/dist/mcp-tools/base/navigation-tools.js.map +1 -1
- package/dist/mcp-tools/base/site-knowledge-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/site-knowledge-tools.js +11 -23
- package/dist/mcp-tools/base/site-knowledge-tools.js.map +1 -1
- package/dist/mcp-tools/base/visual-testing-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/visual-testing-tools.js +13 -3
- package/dist/mcp-tools/base/visual-testing-tools.js.map +1 -1
- package/dist/mcp-tools/enterprise-stubs.d.ts +2 -2
- package/dist/mcp-tools/enterprise-stubs.d.ts.map +1 -1
- package/dist/mcp-tools/enterprise-stubs.js +29 -16
- package/dist/mcp-tools/enterprise-stubs.js.map +1 -1
- package/dist/mcp-tools/index.d.ts +19 -14
- package/dist/mcp-tools/index.d.ts.map +1 -1
- package/dist/mcp-tools/index.js +2 -2
- package/dist/mcp-tools/index.js.map +1 -1
- package/dist/mcp-tools/red-zone-refusal.d.ts +33 -0
- package/dist/mcp-tools/red-zone-refusal.d.ts.map +1 -0
- package/dist/mcp-tools/red-zone-refusal.js +43 -0
- package/dist/mcp-tools/red-zone-refusal.js.map +1 -0
- package/dist/mcp-tools/tier-gate.js +1 -1
- package/dist/mcp-tools/tier-gate.js.map +1 -1
- package/dist/mcp-tools/tool-categories.d.ts.map +1 -1
- package/dist/mcp-tools/tool-categories.js +2 -0
- package/dist/mcp-tools/tool-categories.js.map +1 -1
- package/dist/output.d.ts.map +1 -1
- package/dist/output.js +18 -2
- package/dist/output.js.map +1 -1
- package/dist/performance/metrics.d.ts +8 -3
- package/dist/performance/metrics.d.ts.map +1 -1
- package/dist/performance/metrics.js +16 -5
- package/dist/performance/metrics.js.map +1 -1
- package/dist/recording/contact-sheet.js.map +1 -1
- package/dist/security/tool-permissions.d.ts.map +1 -1
- package/dist/security/tool-permissions.js +1 -0
- package/dist/security/tool-permissions.js.map +1 -1
- package/dist/testing/coverage.d.ts +2 -2
- package/dist/testing/coverage.d.ts.map +1 -1
- package/dist/testing/coverage.js +6 -2
- package/dist/testing/coverage.js.map +1 -1
- package/dist/testing/flaky-detection.d.ts +2 -2
- package/dist/testing/flaky-detection.d.ts.map +1 -1
- package/dist/testing/flaky-detection.js +11 -3
- package/dist/testing/flaky-detection.js.map +1 -1
- package/dist/testing/nl-test-suite.d.ts +13 -0
- package/dist/testing/nl-test-suite.d.ts.map +1 -1
- package/dist/testing/nl-test-suite.js +5 -1
- package/dist/testing/nl-test-suite.js.map +1 -1
- package/dist/testing/suite-results.d.ts +27 -0
- package/dist/testing/suite-results.d.ts.map +1 -0
- package/dist/testing/suite-results.js +54 -0
- package/dist/testing/suite-results.js.map +1 -0
- package/dist/testing/test-repair.d.ts +2 -2
- package/dist/testing/test-repair.d.ts.map +1 -1
- package/dist/testing/test-repair.js +6 -2
- package/dist/testing/test-repair.js.map +1 -1
- package/dist/types.d.ts +61 -7
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +17 -4
- package/dist/types.js.map +1 -1
- package/dist/visual/ab-comparison.d.ts.map +1 -1
- package/dist/visual/ab-comparison.js +7 -2
- package/dist/visual/ab-comparison.js.map +1 -1
- package/dist/visual/cross-browser.d.ts +7 -2
- package/dist/visual/cross-browser.d.ts.map +1 -1
- package/dist/visual/cross-browser.js +33 -5
- package/dist/visual/cross-browser.js.map +1 -1
- package/dist/visual/distance-metrics.d.ts +7 -0
- package/dist/visual/distance-metrics.d.ts.map +1 -1
- package/dist/visual/distance-metrics.js.map +1 -1
- package/dist/visual/heatmap-overlay.js.map +1 -1
- package/dist/visual/llm-relevance.d.ts.map +1 -1
- package/dist/visual/llm-relevance.js.map +1 -1
- package/dist/visual/regression.d.ts +17 -7
- package/dist/visual/regression.d.ts.map +1 -1
- package/dist/visual/regression.js +77 -38
- package/dist/visual/regression.js.map +1 -1
- package/dist/visual/responsive.d.ts +22 -0
- package/dist/visual/responsive.d.ts.map +1 -1
- package/dist/visual/responsive.js +44 -7
- package/dist/visual/responsive.js.map +1 -1
- package/dist/visual/visual-overlays.js.map +1 -1
- package/dist/webhooks.d.ts +67 -0
- package/dist/webhooks.d.ts.map +1 -0
- package/dist/webhooks.js +128 -0
- package/dist/webhooks.js.map +1 -0
- package/package.json +23 -24
package/dist/cli-args.d.ts
CHANGED
|
@@ -29,5 +29,13 @@ export interface ParsedArgs {
|
|
|
29
29
|
* persistent profile. Writing both keys fixes those two without disturbing the
|
|
30
30
|
* two that already worked.
|
|
31
31
|
*/
|
|
32
|
-
export declare function parseArgs(args: string[]): ParsedArgs;
|
|
32
|
+
export declare function parseArgs(args: string[], booleanFlags?: ReadonlySet<string>): ParsedArgs;
|
|
33
|
+
/**
|
|
34
|
+
* Flags that never take a value. Each was checked against how the CLI reads
|
|
35
|
+
* it (2026-10-21): every one is tested as a boolean and none is read as a
|
|
36
|
+
* string. `--no-*` flags are always boolean and need no entry. A flag missing
|
|
37
|
+
* from this list still works; it just takes the next word as its value, which
|
|
38
|
+
* is what every flag did before.
|
|
39
|
+
*/
|
|
40
|
+
export declare const BOOLEAN_FLAGS: ReadonlySet<string>;
|
|
33
41
|
//# sourceMappingURL=cli-args.d.ts.map
|
package/dist/cli-args.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-args.d.ts","sourceRoot":"","sources":["../src/cli-args.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC;CAC3C;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,
|
|
1
|
+
{"version":3,"file":"cli-args.d.ts","sourceRoot":"","sources":["../src/cli-args.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC;CAC3C;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,YAAY,GAAE,WAAW,CAAC,MAAM,CAAiB,GAAG,UAAU,CA0CvG;AAED;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,EAAE,WAAW,CAAC,MAAM,CAQ5C,CAAC"}
|
package/dist/cli-args.js
CHANGED
|
@@ -24,24 +24,36 @@
|
|
|
24
24
|
* persistent profile. Writing both keys fixes those two without disturbing the
|
|
25
25
|
* two that already worked.
|
|
26
26
|
*/
|
|
27
|
-
export function parseArgs(args) {
|
|
27
|
+
export function parseArgs(args, booleanFlags = BOOLEAN_FLAGS) {
|
|
28
28
|
const command = args[0] || "help";
|
|
29
29
|
const restArgs = [];
|
|
30
30
|
const options = {};
|
|
31
31
|
for (let i = 1; i < args.length; i++) {
|
|
32
|
-
if (args[i].startsWith("--")) {
|
|
33
|
-
const
|
|
32
|
+
if (args[i].startsWith("--") && args[i].length > 2) {
|
|
33
|
+
const body = args[i].slice(2);
|
|
34
|
+
const eq = body.indexOf("=");
|
|
35
|
+
if (eq > 0) {
|
|
36
|
+
// `--max-pages=50`: before 2026-10-21 this became a flag literally
|
|
37
|
+
// named "max-pages=50", and the command ran with its default.
|
|
38
|
+
const key = body.slice(0, eq);
|
|
39
|
+
const value = body.slice(eq + 1);
|
|
40
|
+
options[key] = booleanFlags.has(key) && (value === "true" || value === "false") ? value === "true" : value;
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
const key = body;
|
|
34
44
|
const next = args[i + 1];
|
|
35
|
-
|
|
45
|
+
// A flag that never takes a value must not swallow the next word:
|
|
46
|
+
// `screenshot --no-restore out.png` took "out.png" as the flag's value,
|
|
47
|
+
// so restore stayed on and the path was lost (audit, 2026-10-21).
|
|
48
|
+
const takesNoValue = booleanFlags.has(key) || key.startsWith("no-");
|
|
49
|
+
if (!takesNoValue && next && !next.startsWith("--")) {
|
|
36
50
|
options[key] = next;
|
|
37
51
|
i++;
|
|
38
52
|
}
|
|
39
53
|
else {
|
|
40
54
|
options[key] = true;
|
|
41
55
|
}
|
|
42
|
-
|
|
43
|
-
// and inverting that would be wrong.
|
|
44
|
-
if (key.startsWith("no-") && key.length > 3 && options[key] === true) {
|
|
56
|
+
if (key.startsWith("no-") && key.length > 3) {
|
|
45
57
|
options[key.slice(3)] = false;
|
|
46
58
|
}
|
|
47
59
|
}
|
|
@@ -51,4 +63,20 @@ export function parseArgs(args) {
|
|
|
51
63
|
}
|
|
52
64
|
return { command, args: restArgs, options };
|
|
53
65
|
}
|
|
66
|
+
/**
|
|
67
|
+
* Flags that never take a value. Each was checked against how the CLI reads
|
|
68
|
+
* it (2026-10-21): every one is tested as a boolean and none is read as a
|
|
69
|
+
* string. `--no-*` flags are always boolean and need no entry. A flag missing
|
|
70
|
+
* from this list still works; it just takes the next word as its value, which
|
|
71
|
+
* is what every flag did before.
|
|
72
|
+
*/
|
|
73
|
+
export const BOOLEAN_FLAGS = new Set([
|
|
74
|
+
"attention-overlay", "auto-apply", "capture", "clear", "comprehensive",
|
|
75
|
+
"contact-sheet", "continue-on-failure", "dismiss-overlays", "dry-run",
|
|
76
|
+
"expect-truthy", "force", "full-page", "fuzzy-match", "headless", "help",
|
|
77
|
+
"html", "json", "json-output", "keep-config", "lightpanda", "offline",
|
|
78
|
+
"persistent", "plain", "quiet", "raw", "record-video", "restore",
|
|
79
|
+
"screenshot-on-failure", "stateful", "step-through", "text", "trace",
|
|
80
|
+
"verbose", "verify", "version", "vision", "yes",
|
|
81
|
+
]);
|
|
54
82
|
//# sourceMappingURL=cli-args.js.map
|
package/dist/cli-args.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-args.js","sourceRoot":"","sources":["../src/cli-args.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,SAAS,CAAC,IAAc;
|
|
1
|
+
{"version":3,"file":"cli-args.js","sourceRoot":"","sources":["../src/cli-args.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CBrowser - Cognitive Browser Automation
|
|
3
|
+
* Copyright 2026 Alexandria Eden alexandria.shai.eden@gmail.com
|
|
4
|
+
* Learn more at https://cbrowser.ai - MIT License
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* The global browser flags, for CLI commands that hand off to a library
|
|
8
|
+
* function which launches its own browser (ai-visual, cross-browser, diff,
|
|
9
|
+
* responsive, ab, coverage, parallel, repair-tests, flaky-check, perf-baseline,
|
|
10
|
+
* compare-personas).
|
|
11
|
+
*
|
|
12
|
+
* None of those commands passed --browser, --device or --viewport on, and some
|
|
13
|
+
* not --headless, and none checks its flags, so each was accepted and did
|
|
14
|
+
* nothing (audit D20/F20, 2026-10-21). A command now passes what it can and
|
|
15
|
+
* refuses, by name and with the reason, what it cannot.
|
|
16
|
+
*/
|
|
17
|
+
import type { BrowserLaunchOptions } from "./browser-options.js";
|
|
18
|
+
export type BrowserFlag = keyof BrowserLaunchOptions;
|
|
19
|
+
/**
|
|
20
|
+
* Parse --headless, --browser, --device and --viewport WxH. --width and
|
|
21
|
+
* --height are aliases of --viewport (the visual commands' own flags); one
|
|
22
|
+
* given alone keeps the other at its old default, 1920 or 1080. Throws on a
|
|
23
|
+
* bad value, an unknown device or engine, or --viewport with --width/--height.
|
|
24
|
+
*/
|
|
25
|
+
export declare function parseBrowserFlags(options: Record<string, string | boolean>): BrowserLaunchOptions;
|
|
26
|
+
/** parseBrowserFlags, printing the error and exiting 1 on a bad flag. */
|
|
27
|
+
export declare function browserFlagsOrExit(command: string, options: Record<string, string | boolean>): BrowserLaunchOptions;
|
|
28
|
+
/**
|
|
29
|
+
* Refuse the flags a command cannot honour, naming each and why, and exit 1.
|
|
30
|
+
* A refused flag would otherwise run the command without it and exit 0.
|
|
31
|
+
*/
|
|
32
|
+
export declare function refuseBrowserFlags(command: string, flags: BrowserLaunchOptions, cannot: Partial<Record<BrowserFlag, string>>): void;
|
|
33
|
+
//# sourceMappingURL=cli-browser-flags.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-browser-flags.d.ts","sourceRoot":"","sources":["../src/cli-browser-flags.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAIjE,MAAM,MAAM,WAAW,GAAG,MAAM,oBAAoB,CAAC;AAWrD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,oBAAoB,CA0CjG;AAED,yEAAyE;AACzE,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,oBAAoB,CAOnH;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,oBAAoB,EAC3B,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,GAC3C,IAAI,CAQN"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CBrowser - Cognitive Browser Automation
|
|
3
|
+
* Copyright 2026 Alexandria Eden alexandria.shai.eden@gmail.com
|
|
4
|
+
* Learn more at https://cbrowser.ai - MIT License
|
|
5
|
+
*/
|
|
6
|
+
import { DEVICE_PRESETS, resolveDevice } from "./devices.js";
|
|
7
|
+
import { VIEWPORT_PRESETS } from "./types.js";
|
|
8
|
+
const ENGINES = ["chromium", "firefox", "webkit"];
|
|
9
|
+
/** A positive whole number of pixels, or an error naming the flag. */
|
|
10
|
+
function pixels(flag, value) {
|
|
11
|
+
const n = typeof value === "string" && /^\d+$/.test(value.trim()) ? parseInt(value, 10) : NaN;
|
|
12
|
+
if (!(n > 0))
|
|
13
|
+
throw new Error(`--${flag} must be a positive whole number of pixels, got "${String(value)}"`);
|
|
14
|
+
return n;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Parse --headless, --browser, --device and --viewport WxH. --width and
|
|
18
|
+
* --height are aliases of --viewport (the visual commands' own flags); one
|
|
19
|
+
* given alone keeps the other at its old default, 1920 or 1080. Throws on a
|
|
20
|
+
* bad value, an unknown device or engine, or --viewport with --width/--height.
|
|
21
|
+
*/
|
|
22
|
+
export function parseBrowserFlags(options) {
|
|
23
|
+
const flags = {};
|
|
24
|
+
if (options.headless !== undefined)
|
|
25
|
+
flags.headless = options.headless !== false && options.headless !== "false";
|
|
26
|
+
if (options.browser !== undefined) {
|
|
27
|
+
const engine = String(options.browser);
|
|
28
|
+
if (!ENGINES.includes(engine)) {
|
|
29
|
+
throw new Error(`--browser must be ${ENGINES.join(", ")}, got "${engine}"`);
|
|
30
|
+
}
|
|
31
|
+
flags.browser = engine;
|
|
32
|
+
}
|
|
33
|
+
if (options.device !== undefined) {
|
|
34
|
+
const resolved = resolveDevice(String(options.device));
|
|
35
|
+
if ("error" in resolved) {
|
|
36
|
+
const closest = resolved.suggestions.length > 0 ? ` Did you mean: ${resolved.suggestions.join(", ")}?` : "";
|
|
37
|
+
throw new Error(`unknown --device "${String(options.device)}".${closest} 'cbrowser device list' shows all ${Object.keys(DEVICE_PRESETS).length} presets.`);
|
|
38
|
+
}
|
|
39
|
+
flags.device = resolved.key;
|
|
40
|
+
}
|
|
41
|
+
const sized = options.width !== undefined || options.height !== undefined;
|
|
42
|
+
if (options.viewport !== undefined) {
|
|
43
|
+
if (sized)
|
|
44
|
+
throw new Error("give --viewport WIDTHxHEIGHT or --width/--height, not both");
|
|
45
|
+
// Size names (mobile, tablet, desktop-md...) work as on every other command.
|
|
46
|
+
const preset = VIEWPORT_PRESETS.find((p) => p.name === String(options.viewport).trim().toLowerCase());
|
|
47
|
+
const match = /^(\d+)x(\d+)$/i.exec(String(options.viewport).trim());
|
|
48
|
+
if (preset) {
|
|
49
|
+
flags.viewport = { width: preset.width, height: preset.height };
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
if (!match)
|
|
53
|
+
throw new Error(`--viewport takes one WIDTHxHEIGHT, e.g. 1280x720, or a size name, got "${String(options.viewport)}"`);
|
|
54
|
+
flags.viewport = { width: pixels("viewport", match[1]), height: pixels("viewport", match[2]) };
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
else if (sized) {
|
|
58
|
+
flags.viewport = {
|
|
59
|
+
width: options.width !== undefined ? pixels("width", options.width) : 1920,
|
|
60
|
+
height: options.height !== undefined ? pixels("height", options.height) : 1080,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
return flags;
|
|
64
|
+
}
|
|
65
|
+
/** parseBrowserFlags, printing the error and exiting 1 on a bad flag. */
|
|
66
|
+
export function browserFlagsOrExit(command, options) {
|
|
67
|
+
try {
|
|
68
|
+
return parseBrowserFlags(options);
|
|
69
|
+
}
|
|
70
|
+
catch (e) {
|
|
71
|
+
console.error(`Error: ${command}: ${e.message}`);
|
|
72
|
+
process.exit(1);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Refuse the flags a command cannot honour, naming each and why, and exit 1.
|
|
77
|
+
* A refused flag would otherwise run the command without it and exit 0.
|
|
78
|
+
*/
|
|
79
|
+
export function refuseBrowserFlags(command, flags, cannot) {
|
|
80
|
+
const refused = Object.keys(cannot).filter((flag) => flags[flag] !== undefined);
|
|
81
|
+
if (refused.length === 0)
|
|
82
|
+
return;
|
|
83
|
+
for (const flag of refused) {
|
|
84
|
+
const name = flag === "viewport" ? "--viewport (or --width/--height)" : `--${flag}`;
|
|
85
|
+
console.error(`Error: '${command}' cannot take ${name}: ${cannot[flag]}`);
|
|
86
|
+
}
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=cli-browser-flags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-browser-flags.js","sourceRoot":"","sources":["../src/cli-browser-flags.ts"],"names":[],"mappings":"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"}
|