@crvy/rprtr 0.2.4 → 0.3.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.
- package/CHANGELOG.md +55 -0
- package/README.md +41 -0
- package/dist/{chunk-473CWZ4V.js → chunk-4CVHIHAJ.js} +746 -281
- package/dist/{chunk-HAFWYUNO.js → chunk-4YJL655E.js} +16 -4
- package/dist/cli.d.ts +5 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +24 -4
- package/dist/index.css +35 -0
- package/dist/index.js +152 -105
- package/dist/reporter-artifact-ops.d.ts +0 -2
- package/dist/reporter-artifact-ops.d.ts.map +1 -1
- package/dist/reporter.cjs +32 -38
- package/dist/reporter.d.ts +2 -1
- package/dist/reporter.d.ts.map +1 -1
- package/dist/reporter.js +27 -43
- package/dist/schemas/http.d.ts +2 -0
- package/dist/schemas/http.d.ts.map +1 -1
- package/dist/schemas.d.ts +14 -0
- package/dist/schemas.d.ts.map +1 -1
- package/dist/server/app.d.ts +6 -0
- package/dist/server/app.d.ts.map +1 -1
- package/dist/server/artifact-routes.d.ts.map +1 -1
- package/dist/server/docker-launcher.d.ts +27 -0
- package/dist/server/docker-launcher.d.ts.map +1 -0
- package/dist/server/docker-support.d.ts +88 -0
- package/dist/server/docker-support.d.ts.map +1 -0
- package/dist/server/handlers.d.ts +1 -1
- package/dist/server/handlers.d.ts.map +1 -1
- package/dist/server/launcher-resolver.d.ts +23 -0
- package/dist/server/launcher-resolver.d.ts.map +1 -0
- package/dist/server/playwright-config.d.ts +6 -0
- package/dist/server/playwright-config.d.ts.map +1 -1
- package/dist/server/routes-context.d.ts +6 -1
- package/dist/server/routes-context.d.ts.map +1 -1
- package/dist/server/routes.d.ts +7 -0
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/run-controller.d.ts +19 -19
- package/dist/server/run-controller.d.ts.map +1 -1
- package/dist/server/run-launcher.d.ts +45 -0
- package/dist/server/run-launcher.d.ts.map +1 -0
- package/dist/server/run-mode.d.ts +15 -0
- package/dist/server/run-mode.d.ts.map +1 -0
- package/dist/server/server-factories.d.ts +21 -0
- package/dist/server/server-factories.d.ts.map +1 -0
- package/dist/server.cjs +921 -446
- package/dist/server.js +2 -2
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
// src/ci.ts
|
|
2
|
+
function isCI(env = process.env) {
|
|
3
|
+
const ci = env.CI;
|
|
4
|
+
return ci !== void 0 && ci !== "" && ci !== "false" && ci !== "0";
|
|
5
|
+
}
|
|
6
|
+
|
|
1
7
|
// src/snapshot-path-resolver.ts
|
|
2
8
|
import { createHash } from "crypto";
|
|
3
9
|
import { basename, dirname, extname, join, parse, relative, resolve } from "path";
|
|
@@ -187,13 +193,14 @@ var RunTestDescriptorSchema = z.object({
|
|
|
187
193
|
titlePath: z.array(z.string())
|
|
188
194
|
});
|
|
189
195
|
var RunRequestBodySchema = z.object({
|
|
190
|
-
tests: z.array(RunTestDescriptorSchema).optional()
|
|
196
|
+
tests: z.array(RunTestDescriptorSchema).optional(),
|
|
197
|
+
update: z.boolean().optional()
|
|
191
198
|
});
|
|
192
199
|
var RunResponseSchema = z.discriminatedUnion("ok", [
|
|
193
200
|
z.object({ ok: z.literal(true) }),
|
|
194
201
|
z.object({
|
|
195
202
|
ok: z.literal(false),
|
|
196
|
-
reason: z.enum(["no-config", "already-running", "no-tests"])
|
|
203
|
+
reason: z.enum(["no-config", "already-running", "no-tests", "docker-unavailable"])
|
|
197
204
|
})
|
|
198
205
|
]);
|
|
199
206
|
var StopResponseSchema = z.discriminatedUnion("ok", [
|
|
@@ -300,7 +307,9 @@ var WebSocketMessageSchema = z2.discriminatedUnion("type", [
|
|
|
300
307
|
z2.object({
|
|
301
308
|
type: z2.literal("run-status"),
|
|
302
309
|
data: z2.object({
|
|
303
|
-
running: z2.boolean()
|
|
310
|
+
running: z2.boolean(),
|
|
311
|
+
mode: z2.enum(["local", "docker"]).optional(),
|
|
312
|
+
phase: z2.string().optional()
|
|
304
313
|
})
|
|
305
314
|
})
|
|
306
315
|
]);
|
|
@@ -330,6 +339,7 @@ var RunEndDataSchema = z2.object({
|
|
|
330
339
|
var RegisterDataSchema = z2.object({
|
|
331
340
|
playwrightSnapshotDir: z2.string().optional(),
|
|
332
341
|
playwrightTestDir: z2.string().optional(),
|
|
342
|
+
playwrightRootDir: z2.string().optional(),
|
|
333
343
|
playwrightSnapshotPathTemplate: z2.string().optional(),
|
|
334
344
|
playwrightToHaveScreenshotPathTemplate: z2.string().optional(),
|
|
335
345
|
configFile: z2.string().optional(),
|
|
@@ -362,7 +372,8 @@ var ReportApiResponseSchema = z2.object({
|
|
|
362
372
|
tests: z2.record(z2.string(), TestDataSchema),
|
|
363
373
|
isUpdateMode: z2.boolean().optional(),
|
|
364
374
|
isRunning: z2.boolean().optional(),
|
|
365
|
-
runEnabled: z2.boolean().optional()
|
|
375
|
+
runEnabled: z2.boolean().optional(),
|
|
376
|
+
runMode: z2.enum(["local", "docker"]).optional()
|
|
366
377
|
});
|
|
367
378
|
var ClientBootstrapDataSchema = z2.object({
|
|
368
379
|
report: ReportApiResponseSchema.extend({
|
|
@@ -599,6 +610,7 @@ function finalizeRunEvent(state, options = {}) {
|
|
|
599
610
|
}
|
|
600
611
|
|
|
601
612
|
export {
|
|
613
|
+
isCI,
|
|
602
614
|
isForeignAbsolutePath,
|
|
603
615
|
createMutableReportState,
|
|
604
616
|
applyTestBeginEvent,
|
package/dist/cli.d.ts
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { type ServerOptions } from './server.ts';
|
|
3
|
+
import type { DockerOptions } from './server/docker-launcher.ts';
|
|
4
|
+
import type { RunMode } from './server/run-mode.ts';
|
|
3
5
|
interface ResolvedCliOptions extends ServerOptions {
|
|
4
6
|
port: number;
|
|
5
7
|
screenshotDir: string;
|
|
6
8
|
reportPath: string;
|
|
7
9
|
outputDir: string;
|
|
10
|
+
runMode?: RunMode;
|
|
11
|
+
docker?: DockerOptions;
|
|
8
12
|
}
|
|
9
|
-
export declare const HELP_TEXT = "Usage: crvy-rprtr [artifact-dir] [options]\n\nStart the @crvy/rprtr visual regression report UI server.\n\nArguments:\n artifact-dir Directory of downloaded CI test artifacts. When set,\n --report-path defaults to <dir>/report.json and\n --screenshot-dir defaults to <dir>/screenshots.\n\nOptions:\n -p, --port <number> Server port (default: 3000)\n -s, --screenshot-dir <dir> Screenshot artifact directory (default: ./screenshots)\n -r, --report-path <path> Path to report.json (default: ./report.json)\n -o, --output-dir <dir> Playwright test output directory (default: ./test-results)\n -c, --config <path> Path to playwright.config.ts, used for approval routing\n -h, --help Show this help message\n";
|
|
13
|
+
export declare const HELP_TEXT = "Usage: crvy-rprtr [artifact-dir] [options]\n\nStart the @crvy/rprtr visual regression report UI server.\n\nArguments:\n artifact-dir Directory of downloaded CI test artifacts. When set,\n --report-path defaults to <dir>/report.json and\n --screenshot-dir defaults to <dir>/screenshots.\n\nOptions:\n -p, --port <number> Server port (default: 3000)\n -s, --screenshot-dir <dir> Screenshot artifact directory (default: ./screenshots)\n -r, --report-path <path> Path to report.json (default: ./report.json)\n -o, --output-dir <dir> Playwright test output directory (default: ./test-results)\n -c, --config <path> Path to playwright.config.ts, used for approval routing\n --run-mode <mode> Test run backend: local, docker, or auto (default: auto)\n --docker-image <image> Docker image for docker mode (default: official Playwright image matching the installed @playwright/test version)\n --docker-platform <platform> Container platform: linux/amd64 or linux/arm64 (default: host architecture)\n -h, --help Show this help message\n";
|
|
10
14
|
export declare function printHelp(): void;
|
|
11
15
|
export declare function wantsHelp(args: string[]): boolean;
|
|
12
16
|
export declare function resolveCliOptions(args: string[]): ResolvedCliOptions;
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAKA,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAKA,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,aAAa,CAAA;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAChE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAOnD,UAAU,kBAAmB,SAAQ,aAAa;IAChD,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,MAAM,CAAC,EAAE,aAAa,CAAA;CACvB;AAED,eAAO,MAAM,SAAS,oqCAmBrB,CAAA;AAED,wBAAgB,SAAS,IAAI,IAAI,CAEhC;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAEjD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,kBAAkB,CAgDpE"}
|
package/dist/cli.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
startServer
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-4CVHIHAJ.js";
|
|
5
|
+
import "./chunk-4YJL655E.js";
|
|
6
6
|
|
|
7
7
|
// src/cli.ts
|
|
8
8
|
import { join } from "path";
|
|
@@ -47,6 +47,9 @@ Options:
|
|
|
47
47
|
-r, --report-path <path> Path to report.json (default: ./report.json)
|
|
48
48
|
-o, --output-dir <dir> Playwright test output directory (default: ./test-results)
|
|
49
49
|
-c, --config <path> Path to playwright.config.ts, used for approval routing
|
|
50
|
+
--run-mode <mode> Test run backend: local, docker, or auto (default: auto)
|
|
51
|
+
--docker-image <image> Docker image for docker mode (default: official Playwright image matching the installed @playwright/test version)
|
|
52
|
+
--docker-platform <platform> Container platform: linux/amd64 or linux/arm64 (default: host architecture)
|
|
50
53
|
-h, --help Show this help message
|
|
51
54
|
`;
|
|
52
55
|
function printHelp() {
|
|
@@ -64,7 +67,10 @@ function resolveCliOptions(args) {
|
|
|
64
67
|
"screenshot-dir": { type: "string", short: "s" },
|
|
65
68
|
"report-path": { type: "string", short: "r" },
|
|
66
69
|
"output-dir": { type: "string", short: "o" },
|
|
67
|
-
config: { type: "string", short: "c" }
|
|
70
|
+
config: { type: "string", short: "c" },
|
|
71
|
+
"run-mode": { type: "string" },
|
|
72
|
+
"docker-image": { type: "string" },
|
|
73
|
+
"docker-platform": { type: "string" }
|
|
68
74
|
}
|
|
69
75
|
});
|
|
70
76
|
if (positionals.length > 1) {
|
|
@@ -73,12 +79,26 @@ function resolveCliOptions(args) {
|
|
|
73
79
|
const artifactDir = positionals[0];
|
|
74
80
|
const reportPath = values["report-path"] ?? (artifactDir === void 0 ? DEFAULT_REPORT_PATH : join(artifactDir, "report.json"));
|
|
75
81
|
const screenshotDir = values["screenshot-dir"] ?? (artifactDir === void 0 ? DEFAULT_SCREENSHOT_DIR : join(artifactDir, "screenshots"));
|
|
82
|
+
const runMode = values["run-mode"];
|
|
83
|
+
if (runMode !== void 0 && runMode !== "local" && runMode !== "docker" && runMode !== "auto") {
|
|
84
|
+
throw new TypeError(`Invalid --run-mode: ${runMode} (expected local, docker, or auto)`);
|
|
85
|
+
}
|
|
86
|
+
const dockerPlatform = values["docker-platform"];
|
|
87
|
+
if (dockerPlatform !== void 0 && dockerPlatform !== "linux/amd64" && dockerPlatform !== "linux/arm64") {
|
|
88
|
+
throw new TypeError(`Invalid --docker-platform: ${dockerPlatform} (expected linux/amd64 or linux/arm64)`);
|
|
89
|
+
}
|
|
90
|
+
const docker = {};
|
|
91
|
+
if (values["docker-image"] !== void 0) docker.image = values["docker-image"];
|
|
92
|
+
if (dockerPlatform !== void 0) docker.platform = dockerPlatform;
|
|
93
|
+
const hasDockerOptions = values["docker-image"] !== void 0 || dockerPlatform !== void 0;
|
|
76
94
|
return {
|
|
77
95
|
port: parseInt(values.port ?? `${DEFAULT_PORT}`, 10),
|
|
78
96
|
screenshotDir,
|
|
79
97
|
reportPath,
|
|
80
98
|
outputDir: values["output-dir"] ?? DEFAULT_OUTPUT_DIR,
|
|
81
|
-
playwrightConfig: values.config
|
|
99
|
+
playwrightConfig: values.config,
|
|
100
|
+
...runMode === void 0 ? {} : { runMode },
|
|
101
|
+
...hasDockerOptions ? { docker } : {}
|
|
82
102
|
};
|
|
83
103
|
}
|
|
84
104
|
if (isDirectExecution(import.meta.url)) {
|
package/dist/index.css
CHANGED
|
@@ -305,6 +305,9 @@
|
|
|
305
305
|
.mr-3 {
|
|
306
306
|
margin-right: calc(var(--spacing) * 3);
|
|
307
307
|
}
|
|
308
|
+
.mb-1 {
|
|
309
|
+
margin-bottom: calc(var(--spacing) * 1);
|
|
310
|
+
}
|
|
308
311
|
.mb-2 {
|
|
309
312
|
margin-bottom: calc(var(--spacing) * 2);
|
|
310
313
|
}
|
|
@@ -427,6 +430,9 @@
|
|
|
427
430
|
.rotate-90 {
|
|
428
431
|
rotate: 90deg;
|
|
429
432
|
}
|
|
433
|
+
.transform {
|
|
434
|
+
transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);
|
|
435
|
+
}
|
|
430
436
|
.animate-pulse-dot {
|
|
431
437
|
animation: var(--animate-pulse-dot);
|
|
432
438
|
}
|
|
@@ -841,6 +847,10 @@
|
|
|
841
847
|
.outline-accent {
|
|
842
848
|
outline-color: var(--color-accent);
|
|
843
849
|
}
|
|
850
|
+
.grayscale {
|
|
851
|
+
--tw-grayscale: grayscale(100%);
|
|
852
|
+
filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
|
|
853
|
+
}
|
|
844
854
|
.invert {
|
|
845
855
|
--tw-invert: invert(100%);
|
|
846
856
|
filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
|
|
@@ -1180,6 +1190,26 @@
|
|
|
1180
1190
|
inherits: false;
|
|
1181
1191
|
initial-value: 0;
|
|
1182
1192
|
}
|
|
1193
|
+
@property --tw-rotate-x {
|
|
1194
|
+
syntax: "*";
|
|
1195
|
+
inherits: false;
|
|
1196
|
+
}
|
|
1197
|
+
@property --tw-rotate-y {
|
|
1198
|
+
syntax: "*";
|
|
1199
|
+
inherits: false;
|
|
1200
|
+
}
|
|
1201
|
+
@property --tw-rotate-z {
|
|
1202
|
+
syntax: "*";
|
|
1203
|
+
inherits: false;
|
|
1204
|
+
}
|
|
1205
|
+
@property --tw-skew-x {
|
|
1206
|
+
syntax: "*";
|
|
1207
|
+
inherits: false;
|
|
1208
|
+
}
|
|
1209
|
+
@property --tw-skew-y {
|
|
1210
|
+
syntax: "*";
|
|
1211
|
+
inherits: false;
|
|
1212
|
+
}
|
|
1183
1213
|
@property --tw-border-style {
|
|
1184
1214
|
syntax: "*";
|
|
1185
1215
|
inherits: false;
|
|
@@ -1355,6 +1385,11 @@
|
|
|
1355
1385
|
--tw-translate-x: 0;
|
|
1356
1386
|
--tw-translate-y: 0;
|
|
1357
1387
|
--tw-translate-z: 0;
|
|
1388
|
+
--tw-rotate-x: initial;
|
|
1389
|
+
--tw-rotate-y: initial;
|
|
1390
|
+
--tw-rotate-z: initial;
|
|
1391
|
+
--tw-skew-x: initial;
|
|
1392
|
+
--tw-skew-y: initial;
|
|
1358
1393
|
--tw-border-style: solid;
|
|
1359
1394
|
--tw-leading: initial;
|
|
1360
1395
|
--tw-font-weight: initial;
|