@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/CHANGELOG.md +81 -0
- package/README.md +41 -7
- package/dist/chunk-JGS2VWQP.js +500 -0
- package/dist/{chunk-BRFA7JCQ.js → chunk-OMDYTNWY.js} +266 -65
- package/dist/cli.js +2 -2
- package/dist/index.css +55 -0
- package/dist/index.js +691 -550
- package/dist/report-state.d.ts +6 -1
- package/dist/report-state.d.ts.map +1 -1
- package/dist/report-utils.d.ts +6 -1
- package/dist/report-utils.d.ts.map +1 -1
- package/dist/reporter-utils.d.ts +20 -1
- package/dist/reporter-utils.d.ts.map +1 -1
- package/dist/reporter.cjs +474 -156
- package/dist/reporter.d.ts +13 -1
- package/dist/reporter.d.ts.map +1 -1
- package/dist/reporter.js +224 -141
- package/dist/schemas.d.ts +217 -22
- 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/report-watch.d.ts +9 -0
- package/dist/server/report-watch.d.ts.map +1 -0
- package/dist/server/routes.d.ts +7 -0
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server.cjs +520 -82
- package/dist/server.js +2 -2
- package/dist/snapshot-path-resolver.d.ts +30 -0
- package/dist/snapshot-path-resolver.d.ts.map +1 -0
- package/dist/types.d.ts +9 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-IEYNAB6M.js +0 -263
package/dist/server.js
CHANGED
|
@@ -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
|
|
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:
|
|
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
|
};
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/dist/chunk-IEYNAB6M.js
DELETED
|
@@ -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
|
-
};
|