@crvy/rprtr 0.0.4 → 0.0.7

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/dist/server.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  startServer
3
- } from "./chunk-BRFA7JCQ.js";
4
- import "./chunk-IEYNAB6M.js";
3
+ } from "./chunk-OMDYTNWY.js";
4
+ import "./chunk-JGS2VWQP.js";
5
5
  export {
6
6
  startServer
7
7
  };
@@ -0,0 +1,30 @@
1
+ import type { ScreenshotDeclaration } from './reporter-utils.ts';
2
+ export interface SnapshotResolverConfig {
3
+ readonly configDir: string;
4
+ readonly testDir: string;
5
+ readonly snapshotDir: string;
6
+ readonly projectName: string;
7
+ readonly snapshotSuffix: string;
8
+ readonly snapshotPathTemplate?: string;
9
+ readonly toHaveScreenshotPathTemplate?: string;
10
+ }
11
+ export interface SnapshotResolverInput {
12
+ readonly testFile: string;
13
+ readonly reporterTitlePath: readonly string[];
14
+ readonly declarations: readonly ScreenshotDeclaration[];
15
+ readonly config: SnapshotResolverConfig;
16
+ readonly snapshotPathExists?: (snapshotPath: string) => boolean;
17
+ }
18
+ export interface ResolvedBaselineTarget {
19
+ readonly visualName: string;
20
+ readonly attachmentBaseName: string;
21
+ readonly artifactBaseName: string;
22
+ readonly snapshotPath: string;
23
+ }
24
+ declare function sanitizeForFilePath(value: string): string;
25
+ declare function trimLongString(value: string, length?: number): string;
26
+ declare function sanitizeFilePathBeforeExtension(filePath: string, extension?: string): string;
27
+ declare function addSuffixToFilePath(filePath: string, suffix: string): string;
28
+ export declare function resolveBaselineTargets(input: SnapshotResolverInput): ResolvedBaselineTarget[];
29
+ export { sanitizeForFilePath, trimLongString, sanitizeFilePathBeforeExtension, addSuffixToFilePath };
30
+ //# sourceMappingURL=snapshot-path-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-path-resolver.d.ts","sourceRoot":"","sources":["../src/snapshot-path-resolver.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAA8B,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAM5F,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAA;IACtC,QAAQ,CAAC,4BAA4B,CAAC,EAAE,MAAM,CAAA;CAC/C;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAA;IAC7C,QAAQ,CAAC,YAAY,EAAE,SAAS,qBAAqB,EAAE,CAAA;IACvD,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAA;IACvC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAA;CAChE;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAA;IACnC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;IACjC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;CAC9B;AAeD,iBAAS,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAsBlD;AAED,iBAAS,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,SAAqC,GAAG,MAAM,CAW1F;AAED,iBAAS,+BAA+B,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,SAAoB,GAAG,MAAM,CAGhG;AAED,iBAAS,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAGrE;AAsJD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,qBAAqB,GAAG,sBAAsB,EAAE,CAK7F;AAED,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,+BAA+B,EAAE,mBAAmB,EAAE,CAAA"}
package/dist/types.d.ts CHANGED
@@ -1,8 +1,11 @@
1
+ import type { ScreenshotDeclaration } from './reporter-utils.ts';
2
+ export type VisualSource = 'comparison' | 'baseline-only' | 'declared-only';
1
3
  export interface Images {
2
- actual: string;
4
+ actual?: string;
3
5
  expect?: string;
4
6
  diff?: string;
5
7
  error?: string;
8
+ source?: VisualSource;
6
9
  }
7
10
  export interface Attachment {
8
11
  name: string;
@@ -14,10 +17,12 @@ export interface Location {
14
17
  line: number;
15
18
  }
16
19
  export type TestStatus = 'unknown' | 'pending' | 'running' | 'failed' | 'approved' | 'success' | 'retrying';
20
+ export type TestResultStatus = 'failed' | 'success' | 'pending';
17
21
  export interface TestResult {
18
- status: 'failed' | 'success';
22
+ status: TestResultStatus;
19
23
  retries: number;
20
24
  images?: Partial<Record<string, Images>>;
25
+ visualDeclarations?: readonly ScreenshotDeclaration[];
21
26
  error?: string;
22
27
  duration?: number;
23
28
  }
@@ -67,6 +72,8 @@ export interface TestEndMessage {
67
72
  id: string;
68
73
  status: 'passed' | 'failed' | 'skipped';
69
74
  attachments: Attachment[];
75
+ visualNames: string[];
76
+ visualDeclarations?: readonly ScreenshotDeclaration[];
70
77
  error?: string;
71
78
  duration?: number;
72
79
  };
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crvy/rprtr",
3
- "version": "0.0.4",
3
+ "version": "0.0.7",
4
4
  "description": "Playwright reporter with visual regression UI for comparing and approving screenshot tests",
5
5
  "keywords": [
6
6
  "crvy",
@@ -1,263 +0,0 @@
1
- // src/report-utils.ts
2
- function normalizeScreenshotsBaseUrl(baseUrl) {
3
- return baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
4
- }
5
- function attachmentsToImages(attachments, screenshotsBaseUrl = "/screenshots/") {
6
- const images = {};
7
- const baseUrl = normalizeScreenshotsBaseUrl(screenshotsBaseUrl);
8
- for (const attachment of attachments) {
9
- if (attachment.contentType !== "image/png") continue;
10
- const match = attachment.name.match(/^(.+?)-(actual|expected|diff)(?:\.png)?$/);
11
- if (match === null) continue;
12
- const baseName = match[1];
13
- const role = match[2];
14
- if (baseName === null || baseName === void 0 || role === null || role === void 0) continue;
15
- images[baseName] ??= { actual: "" };
16
- const url = `${baseUrl}${attachment.path}`;
17
- const img = images[baseName];
18
- if (img !== null && img !== void 0) {
19
- if (role === "actual") img.actual = url;
20
- else if (role === "expected") img.expect = url;
21
- else if (role === "diff") img.diff = url;
22
- }
23
- }
24
- for (const key of Object.keys(images)) {
25
- const img = images[key];
26
- if (img?.actual !== null && img?.actual !== void 0 && img?.expect !== null && img?.expect !== void 0 && img?.diff === void 0)
27
- delete img.expect;
28
- }
29
- return images;
30
- }
31
- function mapStatus(status) {
32
- switch (status) {
33
- case "passed":
34
- return "success";
35
- case "failed":
36
- return "failed";
37
- case "skipped":
38
- return "pending";
39
- default:
40
- return "unknown";
41
- }
42
- }
43
-
44
- // src/report-state.ts
45
- function hasReviewablePassingImages(images) {
46
- return Object.values(images).some(
47
- (img) => img !== null && img !== void 0 && img.actual !== null && img.actual !== void 0 && img.diff === void 0
48
- );
49
- }
50
- function preservePreviousPassingImages(test, status, images) {
51
- if (status !== "passed" || Object.keys(images).length > 0) {
52
- return images;
53
- }
54
- const previousImages = test.results?.[0]?.images ?? {};
55
- return hasReviewablePassingImages(previousImages) ? previousImages : images;
56
- }
57
- function countDiffImages(images) {
58
- return Object.values(images).filter((img) => img?.diff !== null && img?.diff !== void 0).length;
59
- }
60
- function createMutableReportState(screenshotDir = "./screenshots") {
61
- return {
62
- reportData: {
63
- isRunning: false,
64
- tests: {},
65
- browsers: ["chromium"],
66
- isUpdateMode: false,
67
- screenshotDir
68
- },
69
- currentRunIds: /* @__PURE__ */ new Set()
70
- };
71
- }
72
- function applyTestBeginEvent(state, data) {
73
- const { id, title, titlePath, browser, location } = data;
74
- state.currentRunIds.add(id);
75
- state.reportData.tests[id] ??= {
76
- id,
77
- titlePath: titlePath ?? [],
78
- browser: browser ?? "",
79
- title: title ?? "",
80
- location,
81
- status: "running"
82
- };
83
- return state.reportData.tests[id];
84
- }
85
- function applyTestEndEvent(state, data, options = {}) {
86
- const test = state.reportData.tests[data.id];
87
- if (test === void 0) {
88
- return null;
89
- }
90
- test.status = mapStatus(data.status);
91
- const images = preservePreviousPassingImages(
92
- test,
93
- data.status,
94
- attachmentsToImages(data.attachments, options.screenshotsBaseUrl)
95
- );
96
- const diffCount = countDiffImages(images);
97
- const hasDiffs = diffCount > 0;
98
- if (hasDiffs) {
99
- test.approved = null;
100
- }
101
- test.results = [
102
- {
103
- status: data.status === "passed" ? "success" : "failed",
104
- retries: 0,
105
- images,
106
- error: data.error,
107
- duration: data.duration
108
- }
109
- ];
110
- return {
111
- test,
112
- diffCount
113
- };
114
- }
115
- function finalizeRunEvent(state) {
116
- state.reportData.isRunning = false;
117
- state.reportData.tests = Object.fromEntries(
118
- Object.entries(state.reportData.tests).filter(([id]) => state.currentRunIds.has(id))
119
- );
120
- state.currentRunIds.clear();
121
- const runTests = Object.values(state.reportData.tests).filter((test) => test !== void 0);
122
- return {
123
- passed: runTests.filter((test) => test.status === "success").length,
124
- failed: runTests.filter((test) => test.status === "failed").length,
125
- pending: runTests.filter((test) => test.status === "pending").length
126
- };
127
- }
128
-
129
- // src/schemas.ts
130
- import { z } from "zod";
131
- var LocationSchema = z.object({
132
- file: z.string(),
133
- line: z.number()
134
- });
135
- var ImagesSchema = z.object({
136
- actual: z.string(),
137
- expect: z.string().optional(),
138
- diff: z.string().optional(),
139
- error: z.string().optional()
140
- });
141
- var AttachmentSchema = z.object({
142
- name: z.string(),
143
- path: z.string(),
144
- contentType: z.string()
145
- });
146
- var TestStatusSchema = z.enum(["unknown", "pending", "running", "failed", "approved", "success", "retrying"]);
147
- var TestResultSchema = z.object({
148
- status: z.enum(["failed", "success"]),
149
- retries: z.number(),
150
- // eslint-disable-next-line typescript/no-unsafe-type-assertion
151
- images: z.record(z.string(), ImagesSchema).optional(),
152
- error: z.string().optional(),
153
- duration: z.number().optional()
154
- });
155
- var TestDataSchema = z.object({
156
- id: z.string(),
157
- titlePath: z.array(z.string()),
158
- browser: z.string(),
159
- title: z.string(),
160
- skip: z.union([z.boolean(), z.string()]).optional(),
161
- retries: z.number().optional(),
162
- status: TestStatusSchema.optional(),
163
- results: z.array(TestResultSchema).optional(),
164
- approved: z.record(z.string(), z.number()).nullable().optional(),
165
- attachments: z.array(AttachmentSchema).optional(),
166
- location: LocationSchema.optional()
167
- });
168
- var CrvyRprtrTestSchema = TestDataSchema.extend({
169
- checked: z.boolean()
170
- });
171
- var CrvyRprtrSuiteSchema = z.lazy(
172
- () => z.object({
173
- path: z.array(z.string()),
174
- skip: z.boolean(),
175
- status: TestStatusSchema.optional(),
176
- opened: z.boolean(),
177
- checked: z.boolean(),
178
- indeterminate: z.boolean(),
179
- // eslint-disable-next-line typescript/no-unsafe-type-assertion
180
- children: z.record(z.string(), z.union([CrvyRprtrSuiteSchema, CrvyRprtrTestSchema])).optional()
181
- })
182
- );
183
- var WebSocketMessageSchema = z.object({
184
- type: z.enum(["test-begin", "test-end", "run-end", "approve", "sync"]),
185
- data: z.unknown()
186
- });
187
- var TestBeginDataSchema = z.object({
188
- id: z.string(),
189
- title: z.string(),
190
- titlePath: z.array(z.string()),
191
- browser: z.string(),
192
- location: LocationSchema
193
- });
194
- var TestEndDataSchema = z.object({
195
- id: z.string(),
196
- status: z.enum(["passed", "failed", "skipped"]),
197
- attachments: z.array(AttachmentSchema),
198
- error: z.string().optional(),
199
- duration: z.number().optional()
200
- });
201
- var ReportDataSchema = z.object({
202
- isRunning: z.boolean(),
203
- tests: z.record(z.string(), TestDataSchema),
204
- browsers: z.array(z.string()),
205
- isUpdateMode: z.boolean(),
206
- screenshotDir: z.string()
207
- });
208
- var LoadedReportDataSchema = z.object({
209
- tests: z.record(z.string(), TestDataSchema).optional(),
210
- isUpdateMode: z.boolean().optional()
211
- });
212
- var OfflineEventSchema = z.object({
213
- type: z.enum(["test-begin", "test-end", "run-end"]),
214
- data: z.unknown(),
215
- timestamp: z.number(),
216
- workerIndex: z.number()
217
- });
218
- var OfflineReportSchema = z.object({
219
- version: z.number(),
220
- generatedAt: z.string(),
221
- workers: z.number(),
222
- events: z.array(OfflineEventSchema)
223
- });
224
- var ApproveRequestBodySchema = z.object({
225
- id: z.string(),
226
- retry: z.number(),
227
- image: z.string()
228
- });
229
- var ReportApiResponseSchema = z.object({
230
- tests: z.record(z.string(), TestDataSchema),
231
- isUpdateMode: z.boolean().optional()
232
- });
233
- var ClientBootstrapDataSchema = z.object({
234
- report: ReportApiResponseSchema.extend({
235
- isUpdateMode: z.boolean()
236
- }),
237
- liveUpdates: z.boolean(),
238
- approvalEnabled: z.boolean(),
239
- approvalMessage: z.string().optional()
240
- });
241
- var ImagesViewModeSchema = z.enum(["side-by-side", "swap", "slide", "blend"]);
242
- function safeParse(schema, data) {
243
- const result = schema.safeParse(data);
244
- if (result.success) {
245
- return result.data;
246
- }
247
- return null;
248
- }
249
-
250
- export {
251
- createMutableReportState,
252
- applyTestBeginEvent,
253
- applyTestEndEvent,
254
- finalizeRunEvent,
255
- WebSocketMessageSchema,
256
- TestBeginDataSchema,
257
- TestEndDataSchema,
258
- LoadedReportDataSchema,
259
- OfflineReportSchema,
260
- ApproveRequestBodySchema,
261
- ClientBootstrapDataSchema,
262
- safeParse
263
- };