@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.
Files changed (49) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/README.md +41 -0
  3. package/dist/{chunk-473CWZ4V.js → chunk-4CVHIHAJ.js} +746 -281
  4. package/dist/{chunk-HAFWYUNO.js → chunk-4YJL655E.js} +16 -4
  5. package/dist/cli.d.ts +5 -1
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cli.js +24 -4
  8. package/dist/index.css +35 -0
  9. package/dist/index.js +152 -105
  10. package/dist/reporter-artifact-ops.d.ts +0 -2
  11. package/dist/reporter-artifact-ops.d.ts.map +1 -1
  12. package/dist/reporter.cjs +32 -38
  13. package/dist/reporter.d.ts +2 -1
  14. package/dist/reporter.d.ts.map +1 -1
  15. package/dist/reporter.js +27 -43
  16. package/dist/schemas/http.d.ts +2 -0
  17. package/dist/schemas/http.d.ts.map +1 -1
  18. package/dist/schemas.d.ts +14 -0
  19. package/dist/schemas.d.ts.map +1 -1
  20. package/dist/server/app.d.ts +6 -0
  21. package/dist/server/app.d.ts.map +1 -1
  22. package/dist/server/artifact-routes.d.ts.map +1 -1
  23. package/dist/server/docker-launcher.d.ts +27 -0
  24. package/dist/server/docker-launcher.d.ts.map +1 -0
  25. package/dist/server/docker-support.d.ts +88 -0
  26. package/dist/server/docker-support.d.ts.map +1 -0
  27. package/dist/server/handlers.d.ts +1 -1
  28. package/dist/server/handlers.d.ts.map +1 -1
  29. package/dist/server/launcher-resolver.d.ts +23 -0
  30. package/dist/server/launcher-resolver.d.ts.map +1 -0
  31. package/dist/server/playwright-config.d.ts +6 -0
  32. package/dist/server/playwright-config.d.ts.map +1 -1
  33. package/dist/server/routes-context.d.ts +6 -1
  34. package/dist/server/routes-context.d.ts.map +1 -1
  35. package/dist/server/routes.d.ts +7 -0
  36. package/dist/server/routes.d.ts.map +1 -1
  37. package/dist/server/run-controller.d.ts +19 -19
  38. package/dist/server/run-controller.d.ts.map +1 -1
  39. package/dist/server/run-launcher.d.ts +45 -0
  40. package/dist/server/run-launcher.d.ts.map +1 -0
  41. package/dist/server/run-mode.d.ts +15 -0
  42. package/dist/server/run-mode.d.ts.map +1 -0
  43. package/dist/server/server-factories.d.ts +21 -0
  44. package/dist/server/server-factories.d.ts.map +1 -0
  45. package/dist/server.cjs +921 -446
  46. package/dist/server.js +2 -2
  47. package/dist/types.d.ts +2 -0
  48. package/dist/types.d.ts.map +1 -1
  49. 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;AAO7D,UAAU,kBAAmB,SAAQ,aAAa;IAChD,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,eAAO,MAAM,SAAS,00BAgBrB,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,CA8BpE"}
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-473CWZ4V.js";
5
- import "./chunk-HAFWYUNO.js";
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;