@wp-tester/results 0.0.1 → 0.0.2

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.
@@ -0,0 +1,236 @@
1
+ /**
2
+ * Vitest Streaming Reporter
3
+ *
4
+ * A custom Vitest reporter that outputs test results in real-time
5
+ * using the StreamingReporter for uniform output formatting.
6
+ */
7
+ import { StreamingReporter } from "./streaming.js";
8
+ /**
9
+ * Get the test state from a TestCase
10
+ */
11
+ function getTestState(testCase) {
12
+ const result = testCase.result();
13
+ if (result.state === "passed")
14
+ return "passed";
15
+ if (result.state === "failed")
16
+ return "failed";
17
+ if (result.state === "skipped")
18
+ return "skipped";
19
+ return "pending";
20
+ }
21
+ /**
22
+ * Get the test duration from a TestCase
23
+ */
24
+ function getTestDuration(testCase) {
25
+ const diagnostic = testCase.diagnostic();
26
+ return diagnostic?.duration || 0;
27
+ }
28
+ /**
29
+ * Get error message from a TestCase
30
+ */
31
+ function getErrorInfo(testCase) {
32
+ const result = testCase.result();
33
+ if (result.state === "failed" && result.errors && result.errors.length > 0) {
34
+ const error = result.errors[0];
35
+ return {
36
+ message: error.message || String(error),
37
+ trace: error.stack,
38
+ };
39
+ }
40
+ return {};
41
+ }
42
+ /**
43
+ * Get the parent suite name
44
+ */
45
+ function getSuiteName(testCase) {
46
+ const parent = testCase.parent;
47
+ if ("name" in parent && parent.name) {
48
+ return parent.name;
49
+ }
50
+ return undefined;
51
+ }
52
+ /**
53
+ * Get the file ID from a test module
54
+ */
55
+ function getFileId(testModule) {
56
+ return testModule.moduleId;
57
+ }
58
+ /**
59
+ * Get the file name from a test module
60
+ */
61
+ function getFileName(testModule) {
62
+ // Extract filename from the module path using platform-independent path separator
63
+ const parts = testModule.moduleId.split(/[/\\]/);
64
+ return parts[parts.length - 1] || testModule.moduleId;
65
+ }
66
+ /**
67
+ * Get the file ID from a test case by traversing to parent module
68
+ */
69
+ function getFileIdFromTestCase(testCase) {
70
+ let current = testCase;
71
+ while (current && 'parent' in current) {
72
+ current = current.parent;
73
+ }
74
+ // At this point, current should be a TestModule
75
+ return current.moduleId;
76
+ }
77
+ /**
78
+ * Get the file ID from a test suite by traversing to parent module
79
+ */
80
+ function getFileIdFromTestSuite(testSuite) {
81
+ let current = testSuite;
82
+ while (current && 'parent' in current) {
83
+ current = current.parent;
84
+ }
85
+ // At this point, current should be a TestModule
86
+ return current.moduleId;
87
+ }
88
+ /**
89
+ * Custom Vitest reporter that streams test results in real-time
90
+ */
91
+ export class VitestStreamingReporter {
92
+ constructor(toolName = "vitest", streamingReporter) {
93
+ this.vitest = null;
94
+ this.streaming = streamingReporter || new StreamingReporter();
95
+ this.toolName = toolName;
96
+ }
97
+ /**
98
+ * Get the underlying StreamingReporter for access to results
99
+ */
100
+ getStreamingReporter() {
101
+ return this.streaming;
102
+ }
103
+ /**
104
+ * Called when vitest is initialized
105
+ */
106
+ onInit(vitest) {
107
+ this.vitest = vitest;
108
+ }
109
+ /**
110
+ * Called when the test run starts
111
+ */
112
+ onTestRunStart() {
113
+ this.streaming.onRunStart(this.toolName);
114
+ }
115
+ /**
116
+ * Called when the test run ends
117
+ */
118
+ onTestRunEnd() {
119
+ this.streaming.onRunEnd();
120
+ }
121
+ /**
122
+ * Called when a test module is collected (file loaded)
123
+ * Emit file:start event to begin buffering for this file
124
+ */
125
+ onTestModuleCollected(testModule) {
126
+ const fileId = getFileId(testModule);
127
+ const fileName = getFileName(testModule);
128
+ this.streaming.onEvent({
129
+ type: "file:start",
130
+ fileId,
131
+ fileName,
132
+ });
133
+ }
134
+ /**
135
+ * Called when a test module finishes
136
+ * Emit file:end event to flush the buffer for this file
137
+ */
138
+ onTestModuleResult(testModule) {
139
+ const fileId = getFileId(testModule);
140
+ this.streaming.onEvent({
141
+ type: "file:end",
142
+ fileId,
143
+ });
144
+ }
145
+ /**
146
+ * Called when a test suite starts
147
+ */
148
+ onTestSuiteReady(testSuite) {
149
+ const fileId = getFileIdFromTestSuite(testSuite);
150
+ this.streaming.onEvent({
151
+ type: "suite:start",
152
+ name: testSuite.name,
153
+ fileId,
154
+ });
155
+ }
156
+ /**
157
+ * Called when a test suite ends
158
+ */
159
+ onTestSuiteResult(testSuite) {
160
+ const fileId = getFileIdFromTestSuite(testSuite);
161
+ this.streaming.onEvent({
162
+ type: "suite:end",
163
+ name: testSuite.name,
164
+ fileId,
165
+ });
166
+ }
167
+ /**
168
+ * Called when a test case is ready to run
169
+ */
170
+ onTestCaseReady(testCase) {
171
+ const suiteName = getSuiteName(testCase);
172
+ const fileId = getFileIdFromTestCase(testCase);
173
+ this.streaming.onEvent({
174
+ type: "test:start",
175
+ name: testCase.name,
176
+ suiteName,
177
+ fileId,
178
+ });
179
+ }
180
+ /**
181
+ * Called when a test case finishes
182
+ */
183
+ onTestCaseResult(testCase) {
184
+ const state = getTestState(testCase);
185
+ const duration = getTestDuration(testCase);
186
+ const suiteName = getSuiteName(testCase);
187
+ const fileId = getFileIdFromTestCase(testCase);
188
+ const { message, trace } = getErrorInfo(testCase);
189
+ switch (state) {
190
+ case "passed":
191
+ this.streaming.onEvent({
192
+ type: "test:pass",
193
+ name: testCase.name,
194
+ suiteName,
195
+ duration,
196
+ fileId,
197
+ });
198
+ break;
199
+ case "failed":
200
+ this.streaming.onEvent({
201
+ type: "test:fail",
202
+ name: testCase.name,
203
+ suiteName,
204
+ duration,
205
+ message,
206
+ trace,
207
+ fileId,
208
+ });
209
+ break;
210
+ case "skipped":
211
+ this.streaming.onEvent({
212
+ type: "test:skip",
213
+ name: testCase.name,
214
+ suiteName,
215
+ fileId,
216
+ });
217
+ break;
218
+ default:
219
+ this.streaming.onEvent({
220
+ type: "test:pending",
221
+ name: testCase.name,
222
+ suiteName,
223
+ fileId,
224
+ });
225
+ }
226
+ }
227
+ }
228
+ /**
229
+ * Create a streaming reporter factory function for use in Vitest config
230
+ * @param toolName - Name of the tool for the report
231
+ * @returns Reporter instance
232
+ */
233
+ export function createVitestStreamingReporter(toolName = "vitest") {
234
+ return new VitestStreamingReporter(toolName);
235
+ }
236
+ //# sourceMappingURL=vitest-streaming-reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitest-streaming-reporter.js","sourceRoot":"","sources":["../src/vitest-streaming-reporter.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wp-tester/results",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "description": "Test result types and formatting for wp-tester",
5
5
  "type": "module",
6
6
  "private": false,
@@ -25,7 +25,8 @@
25
25
  "type-check": "tsc --noEmit"
26
26
  },
27
27
  "dependencies": {
28
- "ctrf": "^0.0.17"
28
+ "ctrf": "^0.0.17",
29
+ "picocolors": "^1.1.1"
29
30
  },
30
31
  "devDependencies": {
31
32
  "@types/node": "^24.10.1",