playwright-checkpoint 0.1.0-beta.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/LICENSE +21 -0
- package/README.md +665 -0
- package/dist/chunk-DGUM43GV.js +11 -0
- package/dist/chunk-DGUM43GV.js.map +1 -0
- package/dist/chunk-F5A6XGLJ.js +104 -0
- package/dist/chunk-F5A6XGLJ.js.map +1 -0
- package/dist/chunk-K5DX32TO.js +214 -0
- package/dist/chunk-K5DX32TO.js.map +1 -0
- package/dist/chunk-KG37WSYS.js +1549 -0
- package/dist/chunk-KG37WSYS.js.map +1 -0
- package/dist/chunk-X5IPL32H.js +1484 -0
- package/dist/chunk-X5IPL32H.js.map +1 -0
- package/dist/cli/bin.cjs +3972 -0
- package/dist/cli/bin.cjs.map +1 -0
- package/dist/cli/bin.d.cts +1 -0
- package/dist/cli/bin.d.ts +1 -0
- package/dist/cli/bin.js +43 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/index.cjs +1672 -0
- package/dist/cli/index.cjs.map +1 -0
- package/dist/cli/index.d.cts +31 -0
- package/dist/cli/index.d.ts +31 -0
- package/dist/cli/index.js +17 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/mcp-args.cjs +129 -0
- package/dist/cli/mcp-args.cjs.map +1 -0
- package/dist/cli/mcp-args.d.cts +32 -0
- package/dist/cli/mcp-args.d.ts +32 -0
- package/dist/cli/mcp-args.js +10 -0
- package/dist/cli/mcp-args.js.map +1 -0
- package/dist/components.cjs +53 -0
- package/dist/components.cjs.map +1 -0
- package/dist/components.d.cts +27 -0
- package/dist/components.d.ts +27 -0
- package/dist/components.js +26 -0
- package/dist/components.js.map +1 -0
- package/dist/core-CD4jHGgI.d.cts +51 -0
- package/dist/core-CZvnc0rE.d.ts +51 -0
- package/dist/core.cjs +1576 -0
- package/dist/core.cjs.map +1 -0
- package/dist/core.d.cts +3 -0
- package/dist/core.d.ts +3 -0
- package/dist/core.js +32 -0
- package/dist/core.js.map +1 -0
- package/dist/index-BjYQX_hK.d.ts +8 -0
- package/dist/index-Cabk31qi.d.cts +8 -0
- package/dist/index.cjs +3318 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +94 -0
- package/dist/index.d.ts +94 -0
- package/dist/index.js +285 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/index.cjs +3467 -0
- package/dist/mcp/index.cjs.map +1 -0
- package/dist/mcp/index.d.cts +26 -0
- package/dist/mcp/index.d.ts +26 -0
- package/dist/mcp/index.js +586 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/teardown.cjs +1509 -0
- package/dist/teardown.cjs.map +1 -0
- package/dist/teardown.d.cts +5 -0
- package/dist/teardown.d.ts +5 -0
- package/dist/teardown.js +52 -0
- package/dist/teardown.js.map +1 -0
- package/dist/types-G7w4n8kR.d.cts +359 -0
- package/dist/types-G7w4n8kR.d.ts +359 -0
- package/package.json +109 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
// src/cli/mcp-args.ts
|
|
2
|
+
function parseMcpCliArgs(argv) {
|
|
3
|
+
const flags = {};
|
|
4
|
+
const passthroughArgs = [];
|
|
5
|
+
let doubleDashSeen = false;
|
|
6
|
+
for (let i = 0; i < argv.length; i++) {
|
|
7
|
+
const arg = argv[i] ?? "";
|
|
8
|
+
if (doubleDashSeen) {
|
|
9
|
+
passthroughArgs.push(arg);
|
|
10
|
+
continue;
|
|
11
|
+
}
|
|
12
|
+
if (arg === "--") {
|
|
13
|
+
doubleDashSeen = true;
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
if (arg === "--upstream") {
|
|
17
|
+
const value = argv[i + 1];
|
|
18
|
+
if (!value || value.startsWith("-")) {
|
|
19
|
+
throw new Error("--upstream requires a package name argument.");
|
|
20
|
+
}
|
|
21
|
+
flags.upstream = value;
|
|
22
|
+
i += 1;
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
if (arg.startsWith("--upstream=")) {
|
|
26
|
+
flags.upstream = arg.slice("--upstream=".length);
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
if (arg === "--standalone") {
|
|
30
|
+
flags.standalone = true;
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
if (arg === "--cdp-endpoint") {
|
|
34
|
+
const value = argv[i + 1];
|
|
35
|
+
if (!value || value.startsWith("-")) {
|
|
36
|
+
throw new Error("--cdp-endpoint requires a URL argument.");
|
|
37
|
+
}
|
|
38
|
+
flags.cdpEndpoint = value;
|
|
39
|
+
i += 1;
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
if (arg.startsWith("--cdp-endpoint=")) {
|
|
43
|
+
flags.cdpEndpoint = arg.slice("--cdp-endpoint=".length);
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
if (arg === "--output-dir") {
|
|
47
|
+
const value = argv[i + 1];
|
|
48
|
+
if (!value || value.startsWith("-")) {
|
|
49
|
+
throw new Error("--output-dir requires a path argument.");
|
|
50
|
+
}
|
|
51
|
+
flags.outputDir = value;
|
|
52
|
+
i += 1;
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if (arg.startsWith("--output-dir=")) {
|
|
56
|
+
flags.outputDir = arg.slice("--output-dir=".length);
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
if (arg === "--help" || arg === "-h") {
|
|
60
|
+
flags.upstream = "__help__";
|
|
61
|
+
return { flags, passthroughArgs: [] };
|
|
62
|
+
}
|
|
63
|
+
passthroughArgs.push(arg, ...argv.slice(i + 1));
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
return { flags, passthroughArgs };
|
|
67
|
+
}
|
|
68
|
+
function printMcpHelp(log) {
|
|
69
|
+
log(`playwright-checkpoint mcp
|
|
70
|
+
|
|
71
|
+
Start the playwright-checkpoint MCP proxy server.
|
|
72
|
+
|
|
73
|
+
Usage:
|
|
74
|
+
playwright-checkpoint mcp [options] [-- <upstream-args>...]
|
|
75
|
+
|
|
76
|
+
Options:
|
|
77
|
+
--upstream <pkg> Upstream MCP package to proxy (default: auto-detect)
|
|
78
|
+
--standalone Run without an upstream MCP server
|
|
79
|
+
--cdp-endpoint <url> Connect directly to a browser CDP endpoint
|
|
80
|
+
--output-dir <path> Directory for checkpoint output (default: ./checkpoints)
|
|
81
|
+
-h, --help Show this help text
|
|
82
|
+
|
|
83
|
+
All arguments after -- are passed through to the upstream MCP server.
|
|
84
|
+
|
|
85
|
+
Examples:
|
|
86
|
+
# Auto-detect @playwright/mcp from node_modules
|
|
87
|
+
playwright-checkpoint mcp
|
|
88
|
+
|
|
89
|
+
# Explicit upstream package
|
|
90
|
+
playwright-checkpoint mcp --upstream @playwright/mcp
|
|
91
|
+
|
|
92
|
+
# Pass headless args to upstream
|
|
93
|
+
playwright-checkpoint mcp -- --headless --browser chrome
|
|
94
|
+
|
|
95
|
+
# Standalone mode (no upstream, connect to existing browser)
|
|
96
|
+
playwright-checkpoint mcp --standalone --cdp-endpoint http://localhost:9222
|
|
97
|
+
`);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export {
|
|
101
|
+
parseMcpCliArgs,
|
|
102
|
+
printMcpHelp
|
|
103
|
+
};
|
|
104
|
+
//# sourceMappingURL=chunk-F5A6XGLJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/mcp-args.ts"],"sourcesContent":["/**\n * Argument parsing for the `playwright-checkpoint mcp` subcommand.\n *\n * Syntax:\n * playwright-checkpoint mcp [--upstream <pkg>] [--standalone] [--cdp-endpoint <url>]\n * [--output-dir <path>] [--] [<passthrough-args>...]\n *\n * The `--` separator terminates flag parsing; everything after it is passed\n * through to the upstream MCP server unchanged.\n */\n\nexport type McpFlags = {\n upstream?: string;\n standalone?: boolean;\n cdpEndpoint?: string;\n outputDir?: string;\n};\n\nexport type ParsedMcpArgs = {\n flags: McpFlags;\n passthroughArgs: string[];\n};\n\n/**\n * Parse CLI arguments for the `mcp` subcommand.\n *\n * Returns the parsed flags and any remaining positional / passthrough arguments.\n */\nexport function parseMcpCliArgs(argv: string[]): ParsedMcpArgs {\n const flags: McpFlags = {};\n const passthroughArgs: string[] = [];\n let doubleDashSeen = false;\n\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i] ?? '';\n\n if (doubleDashSeen) {\n passthroughArgs.push(arg);\n continue;\n }\n\n if (arg === '--') {\n doubleDashSeen = true;\n continue;\n }\n\n if (arg === '--upstream') {\n const value = argv[i + 1];\n if (!value || value.startsWith('-')) {\n throw new Error('--upstream requires a package name argument.');\n }\n flags.upstream = value;\n i += 1;\n continue;\n }\n\n if (arg.startsWith('--upstream=')) {\n flags.upstream = arg.slice('--upstream='.length);\n continue;\n }\n\n if (arg === '--standalone') {\n flags.standalone = true;\n continue;\n }\n\n if (arg === '--cdp-endpoint') {\n const value = argv[i + 1];\n if (!value || value.startsWith('-')) {\n throw new Error('--cdp-endpoint requires a URL argument.');\n }\n flags.cdpEndpoint = value;\n i += 1;\n continue;\n }\n\n if (arg.startsWith('--cdp-endpoint=')) {\n flags.cdpEndpoint = arg.slice('--cdp-endpoint='.length);\n continue;\n }\n\n if (arg === '--output-dir') {\n const value = argv[i + 1];\n if (!value || value.startsWith('-')) {\n throw new Error('--output-dir requires a path argument.');\n }\n flags.outputDir = value;\n i += 1;\n continue;\n }\n\n if (arg.startsWith('--output-dir=')) {\n flags.outputDir = arg.slice('--output-dir='.length);\n continue;\n }\n\n if (arg === '--help' || arg === '-h') {\n flags.upstream = '__help__'; // signal to bin.ts to print help\n return { flags, passthroughArgs: [] };\n }\n\n // Unknown flag — treat remaining args as passthrough\n passthroughArgs.push(arg, ...argv.slice(i + 1));\n break;\n }\n\n return { flags, passthroughArgs };\n}\n\n/**\n * Print the MCP subcommand help text.\n */\nexport function printMcpHelp(log: (msg: string) => void): void {\n log(`playwright-checkpoint mcp\n\nStart the playwright-checkpoint MCP proxy server.\n\nUsage:\n playwright-checkpoint mcp [options] [-- <upstream-args>...]\n\nOptions:\n --upstream <pkg> Upstream MCP package to proxy (default: auto-detect)\n --standalone Run without an upstream MCP server\n --cdp-endpoint <url> Connect directly to a browser CDP endpoint\n --output-dir <path> Directory for checkpoint output (default: ./checkpoints)\n -h, --help Show this help text\n\nAll arguments after -- are passed through to the upstream MCP server.\n\nExamples:\n # Auto-detect @playwright/mcp from node_modules\n playwright-checkpoint mcp\n\n # Explicit upstream package\n playwright-checkpoint mcp --upstream @playwright/mcp\n\n # Pass headless args to upstream\n playwright-checkpoint mcp -- --headless --browser chrome\n\n # Standalone mode (no upstream, connect to existing browser)\n playwright-checkpoint mcp --standalone --cdp-endpoint http://localhost:9222\n`);\n}\n"],"mappings":";AA4BO,SAAS,gBAAgB,MAA+B;AAC7D,QAAM,QAAkB,CAAC;AACzB,QAAM,kBAA4B,CAAC;AACnC,MAAI,iBAAiB;AAErB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,MAAM,KAAK,CAAC,KAAK;AAEvB,QAAI,gBAAgB;AAClB,sBAAgB,KAAK,GAAG;AACxB;AAAA,IACF;AAEA,QAAI,QAAQ,MAAM;AAChB,uBAAiB;AACjB;AAAA,IACF;AAEA,QAAI,QAAQ,cAAc;AACxB,YAAM,QAAQ,KAAK,IAAI,CAAC;AACxB,UAAI,CAAC,SAAS,MAAM,WAAW,GAAG,GAAG;AACnC,cAAM,IAAI,MAAM,8CAA8C;AAAA,MAChE;AACA,YAAM,WAAW;AACjB,WAAK;AACL;AAAA,IACF;AAEA,QAAI,IAAI,WAAW,aAAa,GAAG;AACjC,YAAM,WAAW,IAAI,MAAM,cAAc,MAAM;AAC/C;AAAA,IACF;AAEA,QAAI,QAAQ,gBAAgB;AAC1B,YAAM,aAAa;AACnB;AAAA,IACF;AAEA,QAAI,QAAQ,kBAAkB;AAC5B,YAAM,QAAQ,KAAK,IAAI,CAAC;AACxB,UAAI,CAAC,SAAS,MAAM,WAAW,GAAG,GAAG;AACnC,cAAM,IAAI,MAAM,yCAAyC;AAAA,MAC3D;AACA,YAAM,cAAc;AACpB,WAAK;AACL;AAAA,IACF;AAEA,QAAI,IAAI,WAAW,iBAAiB,GAAG;AACrC,YAAM,cAAc,IAAI,MAAM,kBAAkB,MAAM;AACtD;AAAA,IACF;AAEA,QAAI,QAAQ,gBAAgB;AAC1B,YAAM,QAAQ,KAAK,IAAI,CAAC;AACxB,UAAI,CAAC,SAAS,MAAM,WAAW,GAAG,GAAG;AACnC,cAAM,IAAI,MAAM,wCAAwC;AAAA,MAC1D;AACA,YAAM,YAAY;AAClB,WAAK;AACL;AAAA,IACF;AAEA,QAAI,IAAI,WAAW,eAAe,GAAG;AACnC,YAAM,YAAY,IAAI,MAAM,gBAAgB,MAAM;AAClD;AAAA,IACF;AAEA,QAAI,QAAQ,YAAY,QAAQ,MAAM;AACpC,YAAM,WAAW;AACjB,aAAO,EAAE,OAAO,iBAAiB,CAAC,EAAE;AAAA,IACtC;AAGA,oBAAgB,KAAK,KAAK,GAAG,KAAK,MAAM,IAAI,CAAC,CAAC;AAC9C;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,gBAAgB;AAClC;AAKO,SAAS,aAAa,KAAkC;AAC7D,MAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CA4BL;AACD;","names":[]}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import {
|
|
2
|
+
runReporters
|
|
3
|
+
} from "./chunk-X5IPL32H.js";
|
|
4
|
+
|
|
5
|
+
// src/cli/index.ts
|
|
6
|
+
import path from "path";
|
|
7
|
+
var DEFAULT_RESULTS_DIR = "test-results";
|
|
8
|
+
var DEFAULT_REPORT_OUTPUT_DIR = "report";
|
|
9
|
+
var DEFAULT_DOCS_OUTPUT_DIR = "docs";
|
|
10
|
+
function printHelp(log) {
|
|
11
|
+
log(`playwright-checkpoint
|
|
12
|
+
|
|
13
|
+
Usage:
|
|
14
|
+
playwright-checkpoint report [--results-dir ./test-results] [--output-dir ./report] [--reporter html,markdown]
|
|
15
|
+
playwright-checkpoint docs [--results-dir ./test-results] [--output-dir ./docs] [--format markdown|mdx] [--filter @user-journey]
|
|
16
|
+
|
|
17
|
+
Commands:
|
|
18
|
+
report Generate reports from checkpoint manifests
|
|
19
|
+
docs Generate Markdown or MDX help articles from checkpoint manifests
|
|
20
|
+
|
|
21
|
+
Options:
|
|
22
|
+
--results-dir <path> Directory containing checkpoint manifests (default: ./${DEFAULT_RESULTS_DIR})
|
|
23
|
+
--output-dir <path> Directory where generated output is written (defaults: ./${DEFAULT_REPORT_OUTPUT_DIR} for report, ./${DEFAULT_DOCS_OUTPUT_DIR} for docs)
|
|
24
|
+
--reporter <names> Comma-separated reporters to run with the report command (default: html)
|
|
25
|
+
--format <name> Docs output format: markdown or mdx (default: markdown)
|
|
26
|
+
--filter <tags> Comma-separated tag filter for docs generation
|
|
27
|
+
-h, --help Show this help text`);
|
|
28
|
+
}
|
|
29
|
+
function takeFlagValue(args, index, flag) {
|
|
30
|
+
const value = args[index + 1];
|
|
31
|
+
if (!value) {
|
|
32
|
+
throw new Error(`Missing value for ${flag}.`);
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
value,
|
|
36
|
+
nextIndex: index + 1
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function parseCommaSeparated(value) {
|
|
40
|
+
return value.split(",").map((entry) => entry.trim()).filter(Boolean);
|
|
41
|
+
}
|
|
42
|
+
function parseCliArgs(argv) {
|
|
43
|
+
if (argv.length === 0 || argv.includes("--help") || argv.includes("-h")) {
|
|
44
|
+
return { command: "help" };
|
|
45
|
+
}
|
|
46
|
+
const [command, ...rest] = argv;
|
|
47
|
+
if (command !== "report" && command !== "docs") {
|
|
48
|
+
throw new Error(`Unknown command "${command}".`);
|
|
49
|
+
}
|
|
50
|
+
let resultsDir = DEFAULT_RESULTS_DIR;
|
|
51
|
+
let outputDir = command === "docs" ? DEFAULT_DOCS_OUTPUT_DIR : DEFAULT_REPORT_OUTPUT_DIR;
|
|
52
|
+
let reporters = null;
|
|
53
|
+
let format = "markdown";
|
|
54
|
+
let filterTags = [];
|
|
55
|
+
for (let index = 0; index < rest.length; index += 1) {
|
|
56
|
+
const argument = rest[index];
|
|
57
|
+
if (!argument) {
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
if (argument === "--results-dir") {
|
|
61
|
+
const { value, nextIndex } = takeFlagValue(rest, index, argument);
|
|
62
|
+
resultsDir = value;
|
|
63
|
+
index = nextIndex;
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
if (argument.startsWith("--results-dir=")) {
|
|
67
|
+
resultsDir = argument.slice("--results-dir=".length);
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
if (argument === "--output-dir") {
|
|
71
|
+
const { value, nextIndex } = takeFlagValue(rest, index, argument);
|
|
72
|
+
outputDir = value;
|
|
73
|
+
index = nextIndex;
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if (argument.startsWith("--output-dir=")) {
|
|
77
|
+
outputDir = argument.slice("--output-dir=".length);
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
if (command === "report") {
|
|
81
|
+
if (argument === "--reporter") {
|
|
82
|
+
const { value, nextIndex } = takeFlagValue(rest, index, argument);
|
|
83
|
+
reporters = parseCommaSeparated(value);
|
|
84
|
+
index = nextIndex;
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
if (argument.startsWith("--reporter=")) {
|
|
88
|
+
reporters = parseCommaSeparated(argument.slice("--reporter=".length));
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (command === "docs") {
|
|
93
|
+
if (argument === "--format") {
|
|
94
|
+
const { value, nextIndex } = takeFlagValue(rest, index, argument);
|
|
95
|
+
if (value !== "markdown" && value !== "mdx") {
|
|
96
|
+
throw new Error(`Unsupported docs format "${value}".`);
|
|
97
|
+
}
|
|
98
|
+
format = value;
|
|
99
|
+
index = nextIndex;
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
if (argument.startsWith("--format=")) {
|
|
103
|
+
const value = argument.slice("--format=".length);
|
|
104
|
+
if (value !== "markdown" && value !== "mdx") {
|
|
105
|
+
throw new Error(`Unsupported docs format "${value}".`);
|
|
106
|
+
}
|
|
107
|
+
format = value;
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
if (argument === "--filter") {
|
|
111
|
+
const { value, nextIndex } = takeFlagValue(rest, index, argument);
|
|
112
|
+
filterTags = parseCommaSeparated(value);
|
|
113
|
+
index = nextIndex;
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
if (argument.startsWith("--filter=")) {
|
|
117
|
+
filterTags = parseCommaSeparated(argument.slice("--filter=".length));
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
throw new Error(`Unknown argument "${argument}".`);
|
|
122
|
+
}
|
|
123
|
+
if (command === "docs") {
|
|
124
|
+
return {
|
|
125
|
+
command,
|
|
126
|
+
resultsDir,
|
|
127
|
+
outputDir,
|
|
128
|
+
format,
|
|
129
|
+
filterTags
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
return {
|
|
133
|
+
command,
|
|
134
|
+
resultsDir,
|
|
135
|
+
outputDir,
|
|
136
|
+
reporters
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
function reporterConfig(reporters) {
|
|
140
|
+
if (!reporters || reporters.length === 0) {
|
|
141
|
+
return {};
|
|
142
|
+
}
|
|
143
|
+
const selected = new Set(reporters);
|
|
144
|
+
return {
|
|
145
|
+
reporters: {
|
|
146
|
+
html: selected.has("html"),
|
|
147
|
+
markdown: selected.has("markdown"),
|
|
148
|
+
mdx: selected.has("mdx"),
|
|
149
|
+
...Object.fromEntries(reporters.map((name) => [name, true]))
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
function docsConfig(format, filterTags) {
|
|
154
|
+
const reporterName = format === "mdx" ? "mdx" : "markdown";
|
|
155
|
+
return {
|
|
156
|
+
reporters: {
|
|
157
|
+
html: false,
|
|
158
|
+
markdown: false,
|
|
159
|
+
mdx: false,
|
|
160
|
+
[reporterName]: {
|
|
161
|
+
...filterTags.length > 0 ? { includeTags: filterTags } : {}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
async function runCli(argv = process.argv.slice(2), deps = {}) {
|
|
167
|
+
const cwd = deps.cwd ?? process.cwd;
|
|
168
|
+
const log = deps.log ?? console.log;
|
|
169
|
+
const error = deps.error ?? console.error;
|
|
170
|
+
const runReportersImpl = deps.runReportersImpl ?? runReporters;
|
|
171
|
+
let parsed;
|
|
172
|
+
try {
|
|
173
|
+
parsed = parseCliArgs(argv);
|
|
174
|
+
} catch (caught) {
|
|
175
|
+
error(`[playwright-checkpoint] ${caught instanceof Error ? caught.message : String(caught)}`);
|
|
176
|
+
error("Run `playwright-checkpoint --help` for usage.");
|
|
177
|
+
return 1;
|
|
178
|
+
}
|
|
179
|
+
if (parsed.command === "help") {
|
|
180
|
+
printHelp(log);
|
|
181
|
+
return 0;
|
|
182
|
+
}
|
|
183
|
+
const resultsDir = path.resolve(cwd(), parsed.resultsDir);
|
|
184
|
+
const outputDir = path.resolve(cwd(), parsed.outputDir);
|
|
185
|
+
try {
|
|
186
|
+
const config = parsed.command === "docs" ? docsConfig(parsed.format, parsed.filterTags) : reporterConfig(parsed.reporters);
|
|
187
|
+
const results = await runReportersImpl(config, resultsDir, outputDir);
|
|
188
|
+
const summaryLines = Object.entries(results).map(([name, result]) => `- ${name}: ${result.summary}`);
|
|
189
|
+
log(
|
|
190
|
+
parsed.command === "docs" ? `[playwright-checkpoint] Generated ${parsed.format.toUpperCase()} docs from ${resultsDir} to ${outputDir}` : `[playwright-checkpoint] Generated reports from ${resultsDir} to ${outputDir}`
|
|
191
|
+
);
|
|
192
|
+
if (summaryLines.length > 0) {
|
|
193
|
+
for (const line of summaryLines) {
|
|
194
|
+
log(line);
|
|
195
|
+
}
|
|
196
|
+
} else {
|
|
197
|
+
log("- No reporters were enabled.");
|
|
198
|
+
}
|
|
199
|
+
return 0;
|
|
200
|
+
} catch (caught) {
|
|
201
|
+
error("[playwright-checkpoint] Failed to generate reports.");
|
|
202
|
+
error(caught instanceof Error ? caught.stack ?? caught.message : String(caught));
|
|
203
|
+
return 1;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
export {
|
|
208
|
+
DEFAULT_RESULTS_DIR,
|
|
209
|
+
DEFAULT_REPORT_OUTPUT_DIR,
|
|
210
|
+
DEFAULT_DOCS_OUTPUT_DIR,
|
|
211
|
+
parseCliArgs,
|
|
212
|
+
runCli
|
|
213
|
+
};
|
|
214
|
+
//# sourceMappingURL=chunk-K5DX32TO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/index.ts"],"sourcesContent":["import path from 'node:path';\nimport { runReporters } from '../report';\nimport type { CheckpointConfig } from '../types';\n\nexport const DEFAULT_RESULTS_DIR = 'test-results';\nexport const DEFAULT_REPORT_OUTPUT_DIR = 'report';\nexport const DEFAULT_DOCS_OUTPUT_DIR = 'docs';\n\ntype CliDeps = {\n cwd?: () => string;\n log?: (message: string) => void;\n error?: (message: string) => void;\n runReportersImpl?: typeof runReporters;\n};\n\ntype ParsedCli =\n | {\n command: 'help';\n }\n | {\n command: 'report';\n resultsDir: string;\n outputDir: string;\n reporters: string[] | null;\n }\n | {\n command: 'docs';\n resultsDir: string;\n outputDir: string;\n format: 'markdown' | 'mdx';\n filterTags: string[];\n };\n\nfunction printHelp(log: (message: string) => void): void {\n log(`playwright-checkpoint\n\nUsage:\n playwright-checkpoint report [--results-dir ./test-results] [--output-dir ./report] [--reporter html,markdown]\n playwright-checkpoint docs [--results-dir ./test-results] [--output-dir ./docs] [--format markdown|mdx] [--filter @user-journey]\n\nCommands:\n report Generate reports from checkpoint manifests\n docs Generate Markdown or MDX help articles from checkpoint manifests\n\nOptions:\n --results-dir <path> Directory containing checkpoint manifests (default: ./${DEFAULT_RESULTS_DIR})\n --output-dir <path> Directory where generated output is written (defaults: ./${DEFAULT_REPORT_OUTPUT_DIR} for report, ./${DEFAULT_DOCS_OUTPUT_DIR} for docs)\n --reporter <names> Comma-separated reporters to run with the report command (default: html)\n --format <name> Docs output format: markdown or mdx (default: markdown)\n --filter <tags> Comma-separated tag filter for docs generation\n -h, --help Show this help text`);\n}\n\nfunction takeFlagValue(args: string[], index: number, flag: string): { value: string; nextIndex: number } {\n const value = args[index + 1];\n if (!value) {\n throw new Error(`Missing value for ${flag}.`);\n }\n\n return {\n value,\n nextIndex: index + 1,\n };\n}\n\nfunction parseCommaSeparated(value: string): string[] {\n return value\n .split(',')\n .map((entry) => entry.trim())\n .filter(Boolean);\n}\n\nexport function parseCliArgs(argv: string[]): ParsedCli {\n if (argv.length === 0 || argv.includes('--help') || argv.includes('-h')) {\n return { command: 'help' };\n }\n\n const [command, ...rest] = argv;\n if (command !== 'report' && command !== 'docs') {\n throw new Error(`Unknown command \"${command}\".`);\n }\n\n let resultsDir = DEFAULT_RESULTS_DIR;\n let outputDir = command === 'docs' ? DEFAULT_DOCS_OUTPUT_DIR : DEFAULT_REPORT_OUTPUT_DIR;\n let reporters: string[] | null = null;\n let format: 'markdown' | 'mdx' = 'markdown';\n let filterTags: string[] = [];\n\n for (let index = 0; index < rest.length; index += 1) {\n const argument = rest[index];\n if (!argument) {\n continue;\n }\n\n if (argument === '--results-dir') {\n const { value, nextIndex } = takeFlagValue(rest, index, argument);\n resultsDir = value;\n index = nextIndex;\n continue;\n }\n\n if (argument.startsWith('--results-dir=')) {\n resultsDir = argument.slice('--results-dir='.length);\n continue;\n }\n\n if (argument === '--output-dir') {\n const { value, nextIndex } = takeFlagValue(rest, index, argument);\n outputDir = value;\n index = nextIndex;\n continue;\n }\n\n if (argument.startsWith('--output-dir=')) {\n outputDir = argument.slice('--output-dir='.length);\n continue;\n }\n\n if (command === 'report') {\n if (argument === '--reporter') {\n const { value, nextIndex } = takeFlagValue(rest, index, argument);\n reporters = parseCommaSeparated(value);\n index = nextIndex;\n continue;\n }\n\n if (argument.startsWith('--reporter=')) {\n reporters = parseCommaSeparated(argument.slice('--reporter='.length));\n continue;\n }\n }\n\n if (command === 'docs') {\n if (argument === '--format') {\n const { value, nextIndex } = takeFlagValue(rest, index, argument);\n if (value !== 'markdown' && value !== 'mdx') {\n throw new Error(`Unsupported docs format \"${value}\".`);\n }\n format = value;\n index = nextIndex;\n continue;\n }\n\n if (argument.startsWith('--format=')) {\n const value = argument.slice('--format='.length);\n if (value !== 'markdown' && value !== 'mdx') {\n throw new Error(`Unsupported docs format \"${value}\".`);\n }\n format = value;\n continue;\n }\n\n if (argument === '--filter') {\n const { value, nextIndex } = takeFlagValue(rest, index, argument);\n filterTags = parseCommaSeparated(value);\n index = nextIndex;\n continue;\n }\n\n if (argument.startsWith('--filter=')) {\n filterTags = parseCommaSeparated(argument.slice('--filter='.length));\n continue;\n }\n }\n\n throw new Error(`Unknown argument \"${argument}\".`);\n }\n\n if (command === 'docs') {\n return {\n command,\n resultsDir,\n outputDir,\n format,\n filterTags,\n };\n }\n\n return {\n command,\n resultsDir,\n outputDir,\n reporters,\n };\n}\n\nfunction reporterConfig(reporters: string[] | null): CheckpointConfig {\n if (!reporters || reporters.length === 0) {\n return {};\n }\n\n const selected = new Set(reporters);\n\n return {\n reporters: {\n html: selected.has('html'),\n markdown: selected.has('markdown'),\n mdx: selected.has('mdx'),\n ...Object.fromEntries(reporters.map((name) => [name, true])),\n },\n };\n}\n\nfunction docsConfig(format: 'markdown' | 'mdx', filterTags: string[]): CheckpointConfig {\n const reporterName = format === 'mdx' ? 'mdx' : 'markdown';\n\n return {\n reporters: {\n html: false,\n markdown: false,\n mdx: false,\n [reporterName]: {\n ...(filterTags.length > 0 ? { includeTags: filterTags } : {}),\n },\n },\n };\n}\n\nexport async function runCli(argv = process.argv.slice(2), deps: CliDeps = {}): Promise<number> {\n const cwd = deps.cwd ?? process.cwd;\n const log = deps.log ?? console.log;\n const error = deps.error ?? console.error;\n const runReportersImpl = deps.runReportersImpl ?? runReporters;\n\n let parsed: ParsedCli;\n try {\n parsed = parseCliArgs(argv);\n } catch (caught) {\n error(`[playwright-checkpoint] ${caught instanceof Error ? caught.message : String(caught)}`);\n error('Run `playwright-checkpoint --help` for usage.');\n return 1;\n }\n\n if (parsed.command === 'help') {\n printHelp(log);\n return 0;\n }\n\n const resultsDir = path.resolve(cwd(), parsed.resultsDir);\n const outputDir = path.resolve(cwd(), parsed.outputDir);\n\n try {\n const config = parsed.command === 'docs' ? docsConfig(parsed.format, parsed.filterTags) : reporterConfig(parsed.reporters);\n const results = await runReportersImpl(config, resultsDir, outputDir);\n const summaryLines = Object.entries(results).map(([name, result]) => `- ${name}: ${result.summary}`);\n\n log(\n parsed.command === 'docs'\n ? `[playwright-checkpoint] Generated ${parsed.format.toUpperCase()} docs from ${resultsDir} to ${outputDir}`\n : `[playwright-checkpoint] Generated reports from ${resultsDir} to ${outputDir}`,\n );\n\n if (summaryLines.length > 0) {\n for (const line of summaryLines) {\n log(line);\n }\n } else {\n log('- No reporters were enabled.');\n }\n\n return 0;\n } catch (caught) {\n error('[playwright-checkpoint] Failed to generate reports.');\n error(caught instanceof Error ? caught.stack ?? caught.message : String(caught));\n return 1;\n }\n}\n"],"mappings":"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","names":[]}
|