creevey 0.10.0-beta.43 → 0.10.0-beta.45

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 (137) hide show
  1. package/CHANGELOG.md +282 -0
  2. package/dist/client/addon/controller.js +1 -1
  3. package/dist/client/addon/controller.js.map +1 -1
  4. package/dist/client/addon/withCreevey.js +1 -18
  5. package/dist/client/addon/withCreevey.js.map +1 -1
  6. package/dist/client/shared/components/PageHeader/PageHeader.js +13 -4
  7. package/dist/client/shared/components/PageHeader/PageHeader.js.map +1 -1
  8. package/dist/client/shared/creeveyClientApi.js +10 -0
  9. package/dist/client/shared/creeveyClientApi.js.map +1 -1
  10. package/dist/client/web/CreeveyApp.d.ts +1 -0
  11. package/dist/client/web/CreeveyApp.js +1 -0
  12. package/dist/client/web/CreeveyApp.js.map +1 -1
  13. package/dist/client/web/CreeveyContext.d.ts +1 -0
  14. package/dist/client/web/CreeveyContext.js +1 -0
  15. package/dist/client/web/CreeveyContext.js.map +1 -1
  16. package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js +9 -8
  17. package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js.map +1 -1
  18. package/dist/client/web/CreeveyView/SideBar/SideBarHeader.js +13 -3
  19. package/dist/client/web/CreeveyView/SideBar/SideBarHeader.js.map +1 -1
  20. package/dist/client/web/CreeveyView/SideBar/SuiteLink.js +2 -3
  21. package/dist/client/web/CreeveyView/SideBar/SuiteLink.js.map +1 -1
  22. package/dist/client/web/CreeveyView/SideBar/TestLink.js +2 -3
  23. package/dist/client/web/CreeveyView/SideBar/TestLink.js.map +1 -1
  24. package/dist/client/web/CreeveyView/SideBar/TestsStatus.js +1 -0
  25. package/dist/client/web/CreeveyView/SideBar/TestsStatus.js.map +1 -1
  26. package/dist/client/web/assets/{index-C47njyZV.js → index-BU4jjKVC.js} +68 -68
  27. package/dist/client/web/index.html +1 -1
  28. package/dist/client/web/index.js +8 -3
  29. package/dist/client/web/index.js.map +1 -1
  30. package/dist/creevey.d.ts +1 -1
  31. package/dist/creevey.js +1 -22
  32. package/dist/creevey.js.map +1 -1
  33. package/dist/playwright-reporter.d.ts +2 -0
  34. package/dist/playwright-reporter.js +5 -0
  35. package/dist/playwright-reporter.js.map +1 -0
  36. package/dist/playwright.d.ts +1 -1
  37. package/dist/server/config.js +8 -1
  38. package/dist/server/config.js.map +1 -1
  39. package/dist/server/index.js +12 -5
  40. package/dist/server/index.js.map +1 -1
  41. package/dist/server/master/api.d.ts +11 -6
  42. package/dist/server/master/api.js +88 -25
  43. package/dist/server/master/api.js.map +1 -1
  44. package/dist/server/master/handlers/capture-handler.d.ts +5 -0
  45. package/dist/server/master/handlers/capture-handler.js +25 -0
  46. package/dist/server/master/handlers/capture-handler.js.map +1 -0
  47. package/dist/server/master/handlers/index.d.ts +4 -0
  48. package/dist/server/master/handlers/index.js +21 -0
  49. package/dist/server/master/handlers/index.js.map +1 -0
  50. package/dist/server/master/handlers/ping-handler.d.ts +2 -0
  51. package/dist/server/master/handlers/ping-handler.js +8 -0
  52. package/dist/server/master/handlers/ping-handler.js.map +1 -0
  53. package/dist/server/master/handlers/static-handler.d.ts +1 -0
  54. package/dist/server/master/handlers/static-handler.js +22 -0
  55. package/dist/server/master/handlers/static-handler.js.map +1 -0
  56. package/dist/server/master/handlers/stories-handler.d.ts +4 -0
  57. package/dist/server/master/handlers/stories-handler.js +24 -0
  58. package/dist/server/master/handlers/stories-handler.js.map +1 -0
  59. package/dist/server/master/master.js +7 -24
  60. package/dist/server/master/master.js.map +1 -1
  61. package/dist/server/master/runner.d.ts +4 -6
  62. package/dist/server/master/runner.js +30 -127
  63. package/dist/server/master/runner.js.map +1 -1
  64. package/dist/server/master/server.js +191 -89
  65. package/dist/server/master/server.js.map +1 -1
  66. package/dist/server/master/start.d.ts +1 -2
  67. package/dist/server/master/start.js +11 -29
  68. package/dist/server/master/start.js.map +1 -1
  69. package/dist/server/master/testsManager.d.ts +81 -0
  70. package/dist/server/master/testsManager.js +281 -0
  71. package/dist/server/master/testsManager.js.map +1 -0
  72. package/dist/server/playwright/docker-file.js +2 -2
  73. package/dist/server/playwright/docker-file.js.map +1 -1
  74. package/dist/server/playwright/reporter.d.ts +87 -0
  75. package/dist/server/playwright/reporter.js +351 -0
  76. package/dist/server/playwright/reporter.js.map +1 -0
  77. package/dist/server/selenium/internal.js +20 -2
  78. package/dist/server/selenium/internal.js.map +1 -1
  79. package/dist/server/selenium/selenoid.js +4 -0
  80. package/dist/server/selenium/selenoid.js.map +1 -1
  81. package/dist/server/shutdown.d.ts +1 -0
  82. package/dist/server/shutdown.js +23 -0
  83. package/dist/server/shutdown.js.map +1 -0
  84. package/dist/server/stories.d.ts +0 -1
  85. package/dist/server/stories.js +0 -12
  86. package/dist/server/stories.js.map +1 -1
  87. package/dist/server/ui-update.d.ts +10 -0
  88. package/dist/server/ui-update.js +39 -0
  89. package/dist/server/ui-update.js.map +1 -0
  90. package/dist/server/utils.d.ts +6 -0
  91. package/dist/server/utils.js +39 -8
  92. package/dist/server/utils.js.map +1 -1
  93. package/dist/server/worker/start.js +1 -1
  94. package/dist/server/worker/start.js.map +1 -1
  95. package/dist/types.d.ts +14 -8
  96. package/dist/types.js.map +1 -1
  97. package/docs/examples/playwright-reporter-example.ts +202 -0
  98. package/docs/migration-0.9-to-0.10.md +144 -0
  99. package/docs/playwright-reporter.md +357 -0
  100. package/package.json +10 -14
  101. package/src/client/addon/controller.ts +1 -1
  102. package/src/client/addon/withCreevey.ts +2 -16
  103. package/src/client/shared/components/PageHeader/PageHeader.tsx +18 -4
  104. package/src/client/shared/creeveyClientApi.ts +10 -0
  105. package/src/client/web/CreeveyApp.tsx +2 -0
  106. package/src/client/web/CreeveyContext.tsx +2 -0
  107. package/src/client/web/CreeveyView/SideBar/SideBarFooter.tsx +19 -17
  108. package/src/client/web/CreeveyView/SideBar/SideBarHeader.tsx +18 -3
  109. package/src/client/web/CreeveyView/SideBar/SuiteLink.tsx +9 -7
  110. package/src/client/web/CreeveyView/SideBar/TestLink.tsx +8 -6
  111. package/src/client/web/CreeveyView/SideBar/TestsStatus.tsx +1 -0
  112. package/src/client/web/index.tsx +8 -3
  113. package/src/creevey.ts +1 -24
  114. package/src/playwright-reporter.ts +3 -0
  115. package/src/server/config.ts +9 -1
  116. package/src/server/index.ts +13 -6
  117. package/src/server/master/api.ts +94 -28
  118. package/src/server/master/handlers/capture-handler.ts +20 -0
  119. package/src/server/master/handlers/index.ts +4 -0
  120. package/src/server/master/handlers/ping-handler.ts +6 -0
  121. package/src/server/master/handlers/static-handler.ts +18 -0
  122. package/src/server/master/handlers/stories-handler.ts +20 -0
  123. package/src/server/master/master.ts +10 -27
  124. package/src/server/master/runner.ts +38 -132
  125. package/src/server/master/server.ts +210 -98
  126. package/src/server/master/start.ts +17 -41
  127. package/src/server/master/testsManager.ts +315 -0
  128. package/src/server/playwright/docker-file.ts +2 -2
  129. package/src/server/playwright/reporter.ts +386 -0
  130. package/src/server/selenium/internal.ts +23 -3
  131. package/src/server/selenium/selenoid.ts +5 -0
  132. package/src/server/shutdown.ts +19 -0
  133. package/src/server/stories.ts +1 -12
  134. package/src/server/ui-update.ts +46 -0
  135. package/src/server/utils.ts +40 -9
  136. package/src/server/worker/start.ts +1 -1
  137. package/src/types.ts +14 -8
@@ -0,0 +1,281 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TestsManager = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const fs_1 = require("fs");
9
+ const events_1 = __importDefault(require("events"));
10
+ const types_js_1 = require("../../types.js");
11
+ const utils_js_1 = require("../utils.js");
12
+ const promises_1 = require("fs/promises");
13
+ /**
14
+ * TestsManager is responsible for all operations related to test data management
15
+ * including loading, saving, merging, and updating test data.
16
+ * It extends EventEmitter to emit update events that can be subscribed to.
17
+ */
18
+ class TestsManager extends events_1.default {
19
+ tests = {};
20
+ screenDir;
21
+ reportDir;
22
+ /**
23
+ * Creates a new TestsManager instance
24
+ * @param screenDir Directory for storing reference images
25
+ * @param reportDir Directory for storing reports and screenshots
26
+ */
27
+ constructor(screenDir, reportDir) {
28
+ super();
29
+ this.screenDir = screenDir;
30
+ this.reportDir = reportDir;
31
+ }
32
+ /**
33
+ * Get a copy of all tests
34
+ * @returns all tests
35
+ */
36
+ getTests() {
37
+ return this.tests;
38
+ }
39
+ /**
40
+ * Get a test by ID
41
+ * @param id Test ID
42
+ * @returns Test data
43
+ */
44
+ getTest(id) {
45
+ return this.tests[id];
46
+ }
47
+ /**
48
+ * Get test data in a format suitable for status reporting
49
+ * @returns Test data in the format needed for status
50
+ */
51
+ getTestsData() {
52
+ const testsData = {};
53
+ Object.entries(this.tests).forEach(([id, test]) => {
54
+ if (!test)
55
+ return;
56
+ const { story: _, fn: __, ...testData } = test;
57
+ testsData[id] = testData;
58
+ });
59
+ return testsData;
60
+ }
61
+ /**
62
+ * Load tests from a report file
63
+ */
64
+ loadTestsFromReport() {
65
+ const reportDataPath = path_1.default.join(this.reportDir, 'data.js');
66
+ const testsFromReport = (0, utils_js_1.tryToLoadTestsData)(reportDataPath) ?? {};
67
+ return testsFromReport;
68
+ }
69
+ /**
70
+ * Merge tests from report with tests from stories
71
+ */
72
+ mergeTests(testsWithReports, testsFromStories) {
73
+ Object.values(testsFromStories)
74
+ .filter(types_js_1.isDefined)
75
+ .forEach((test) => {
76
+ const testWithReport = testsWithReports[test.id];
77
+ if (!testWithReport)
78
+ return;
79
+ test.retries = testWithReport.retries;
80
+ if (testWithReport.status === 'success' || testWithReport.status === 'failed') {
81
+ test.status = testWithReport.status;
82
+ }
83
+ test.results = testWithReport.results;
84
+ test.approved = testWithReport.approved;
85
+ });
86
+ return testsFromStories;
87
+ }
88
+ loadAndMergeTests(testsFromStories) {
89
+ const testsFromReport = this.loadTestsFromReport();
90
+ return this.mergeTests(testsFromReport, testsFromStories);
91
+ }
92
+ /**
93
+ * Update tests with incremental changes
94
+ * @param testsDiff Tests to update or remove
95
+ */
96
+ updateTests(testsDiff) {
97
+ const tests = {};
98
+ const removedTests = [];
99
+ Object.entries(testsDiff).forEach(([id, newTest]) => {
100
+ if (newTest) {
101
+ if (this.tests[id]) {
102
+ this.tests[id] = {
103
+ ...newTest,
104
+ retries: this.tests[id].retries,
105
+ results: this.tests[id].results,
106
+ approved: this.tests[id].approved,
107
+ };
108
+ }
109
+ else {
110
+ this.tests[id] = newTest;
111
+ }
112
+ const { story: _, fn: __, ...restTest } = newTest;
113
+ tests[id] = { ...restTest, status: 'unknown' };
114
+ }
115
+ else if (this.tests[id]) {
116
+ const { id: testId, browser, testName, storyPath, storyId } = this.tests[id];
117
+ removedTests.push({ id: testId, browser, testName, storyPath, storyId });
118
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
119
+ delete this.tests[id];
120
+ }
121
+ });
122
+ this.saveTestsToJson();
123
+ const update = { tests, removedTests };
124
+ this.emit('update', update);
125
+ return update;
126
+ }
127
+ /**
128
+ * Update test result
129
+ * @param id Test ID
130
+ * @param status New test status
131
+ * @param result Optional test result
132
+ */
133
+ updateTestStatus(id, status, result) {
134
+ // TODO Handle 'retrying' status
135
+ const test = this.tests[id];
136
+ if (!test)
137
+ return null;
138
+ const { browser, testName, storyPath, storyId } = test;
139
+ test.status = status === 'retrying' ? 'failed' : status;
140
+ if (!result) {
141
+ // NOTE: Running status
142
+ const update = { tests: { [id]: { id, browser, testName, storyPath, status, storyId } } };
143
+ this.emit('update', update);
144
+ return update;
145
+ }
146
+ test.results ??= [];
147
+ test.results.push(result);
148
+ if (status === 'failed') {
149
+ test.approved = null;
150
+ }
151
+ const update = {
152
+ tests: {
153
+ [id]: {
154
+ id,
155
+ browser,
156
+ testName,
157
+ storyPath,
158
+ status,
159
+ approved: test.approved,
160
+ results: [result],
161
+ storyId,
162
+ },
163
+ },
164
+ };
165
+ this.emit('update', update);
166
+ return update;
167
+ }
168
+ /**
169
+ * Save tests to JSON file
170
+ * @param reportDir Directory to save the JSON file
171
+ */
172
+ saveTestsToJson() {
173
+ (0, fs_1.mkdirSync)(this.reportDir, { recursive: true });
174
+ (0, fs_1.writeFileSync)(path_1.default.join(this.reportDir, 'tests.json'),
175
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
176
+ JSON.stringify(this.tests, (_, value) => ((0, types_js_1.isFunction)(value) ? value.toString() : value), 2));
177
+ }
178
+ /**
179
+ * Save test data to a module
180
+ * @param data Test data to include in the module
181
+ */
182
+ async saveTestData(data = this.getTestsData()) {
183
+ const dataModule = `
184
+ (function (root, factory) {
185
+ if (typeof module === 'object' && module.exports) {
186
+ module.exports = factory();
187
+ } else {
188
+ root.__CREEVEY_DATA__ = factory();
189
+ }
190
+ }(this, function () { return ${JSON.stringify(data)} }));
191
+ `;
192
+ await (0, promises_1.writeFile)(path_1.default.join(this.reportDir, 'data.js'), dataModule);
193
+ }
194
+ /**
195
+ * Copy image for approval
196
+ * @param test Test data
197
+ * @param image Image name
198
+ * @param actual Actual image path
199
+ */
200
+ async copyImage(test, image, actual) {
201
+ const { browser, testName, storyPath } = test;
202
+ const restPath = [...storyPath, testName].filter(types_js_1.isDefined);
203
+ const testPath = path_1.default.join(...restPath, image == browser ? '' : browser);
204
+ const srcImagePath = path_1.default.join(this.reportDir, testPath, actual);
205
+ const dstImagePath = path_1.default.join(this.screenDir, testPath, `${image}.png`);
206
+ await (0, promises_1.mkdir)(path_1.default.join(this.screenDir, testPath), { recursive: true });
207
+ await (0, promises_1.copyFile)(srcImagePath, dstImagePath);
208
+ }
209
+ /**
210
+ * Approve a specific test
211
+ * @param payload Approval payload with test ID, retry index, and image name
212
+ */
213
+ async approve({ id, retry, image }) {
214
+ const test = this.tests[id];
215
+ if (!test?.results)
216
+ return null;
217
+ const result = test.results[retry];
218
+ if (!result.images)
219
+ return null;
220
+ const images = result.images[image];
221
+ if (!images)
222
+ return null;
223
+ test.approved ??= {};
224
+ const { browser, testName, storyPath, storyId } = test;
225
+ await this.copyImage(test, image, images.actual);
226
+ test.approved[image] = retry;
227
+ if (Object.keys(result.images).every((name) => typeof test.approved?.[name] == 'number')) {
228
+ test.status = 'approved';
229
+ }
230
+ const update = {
231
+ tests: {
232
+ [id]: {
233
+ id,
234
+ browser,
235
+ testName,
236
+ storyPath,
237
+ status: test.status,
238
+ approved: test.approved,
239
+ storyId,
240
+ },
241
+ },
242
+ };
243
+ this.emit('update', update);
244
+ return update;
245
+ }
246
+ /**
247
+ * Approve all failed tests
248
+ */
249
+ async approveAll() {
250
+ const updatedTests = {};
251
+ for (const test of Object.values(this.tests)) {
252
+ if (!test?.results)
253
+ continue;
254
+ const retry = test.results.length - 1;
255
+ const { images, status } = test.results.at(retry) ?? {};
256
+ if (!images || status != 'failed')
257
+ continue;
258
+ for (const [name, image] of Object.entries(images)) {
259
+ if (!image)
260
+ continue;
261
+ await this.copyImage(test, name, image.actual);
262
+ test.approved ??= {};
263
+ test.approved[name] = retry;
264
+ test.status = 'approved';
265
+ updatedTests[test.id] = {
266
+ id: test.id,
267
+ browser: test.browser,
268
+ storyPath: test.storyPath,
269
+ storyId: test.storyId,
270
+ status: test.status,
271
+ approved: { [name]: retry },
272
+ };
273
+ }
274
+ }
275
+ const result = { tests: updatedTests };
276
+ this.emit('update', result);
277
+ return result;
278
+ }
279
+ }
280
+ exports.TestsManager = TestsManager;
281
+ //# sourceMappingURL=testsManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testsManager.js","sourceRoot":"","sources":["../../../src/server/master/testsManager.ts"],"names":[],"mappings":"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"}
@@ -7,14 +7,14 @@ exports.playwrightDockerFile = playwrightDockerFile;
7
7
  const promises_1 = require("fs/promises");
8
8
  const url_1 = require("url");
9
9
  const semver_1 = __importDefault(require("semver"));
10
- const shelljs_1 = require("shelljs");
10
+ const shelljs_1 = __importDefault(require("shelljs"));
11
11
  const importMetaUrl = (0, url_1.pathToFileURL)(__filename).href;
12
12
  // TODO Support custom docker images
13
13
  async function playwrightDockerFile(browser, version) {
14
14
  const sv = semver_1.default.coerce(version);
15
15
  let npmRegistry;
16
16
  try {
17
- npmRegistry = (0, shelljs_1.exec)('npm config get registry', { silent: true }).stdout.trim();
17
+ npmRegistry = shelljs_1.default.exec('npm config get registry', { silent: true }).stdout.trim();
18
18
  }
19
19
  catch {
20
20
  /* noop */
@@ -1 +1 @@
1
- {"version":3,"file":"docker-file.js","sourceRoot":"","sources":["../../../src/server/playwright/docker-file.ts"],"names":[],"mappings":";;;;;AAQA,oDAqCC;AA7CD,0CAAuC;AACvC,6BAAoC;AACpC,oDAA4B;AAC5B,qCAA+B;AAE/B,MAAM,aAAa,GAAG,IAAA,mBAAa,EAAC,UAAU,CAAC,CAAC,IAAI,CAAC;AAErD,oCAAoC;AAC7B,KAAK,UAAU,oBAAoB,CAAC,OAAe,EAAE,OAAe;IACzE,MAAM,EAAE,GAAG,gBAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAElC,IAAI,WAAW,CAAC;IAChB,IAAI,CAAC;QACH,WAAW,GAAG,IAAA,cAAI,EAAC,yBAAyB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAChF,CAAC;IAAC,MAAM,CAAC;QACP,UAAU;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,IAAA,mBAAQ,EAAC,IAAI,GAAG,CAAC,oBAAoB,EAAE,aAAa,CAAC,EAAE,OAAO,CAAC,CAAC;IAEtF,MAAM,UAAU,GAAG;;;;;;EAMnB,OAAO;SACN,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,qBAAqB,CAAC;SAC1E,IAAI,CAAC,IAAI,CAAC;MAEP,WAAW;QACT,CAAC,CAAC;qBACW,WAAW,kBAAkB;QAC1C,CAAC,CAAC,EACN;2BACuB,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE;uBAC/B,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,wBAAwB,OAAO;;;;;CAKhF,CAAC;IAEA,OAAO,UAAU,CAAC,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;AACrD,CAAC"}
1
+ {"version":3,"file":"docker-file.js","sourceRoot":"","sources":["../../../src/server/playwright/docker-file.ts"],"names":[],"mappings":";;;;;AAQA,oDAqCC;AA7CD,0CAAuC;AACvC,6BAAoC;AACpC,oDAA4B;AAC5B,sDAAyB;AAEzB,MAAM,aAAa,GAAG,IAAA,mBAAa,EAAC,UAAU,CAAC,CAAC,IAAI,CAAC;AAErD,oCAAoC;AAC7B,KAAK,UAAU,oBAAoB,CAAC,OAAe,EAAE,OAAe;IACzE,MAAM,EAAE,GAAG,gBAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAElC,IAAI,WAAW,CAAC;IAChB,IAAI,CAAC;QACH,WAAW,GAAG,iBAAE,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACnF,CAAC;IAAC,MAAM,CAAC;QACP,UAAU;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,IAAA,mBAAQ,EAAC,IAAI,GAAG,CAAC,oBAAoB,EAAE,aAAa,CAAC,EAAE,OAAO,CAAC,CAAC;IAEtF,MAAM,UAAU,GAAG;;;;;;EAMnB,OAAO;SACN,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,qBAAqB,CAAC;SAC1E,IAAI,CAAC,IAAI,CAAC;MAEP,WAAW;QACT,CAAC,CAAC;qBACW,WAAW,kBAAkB;QAC1C,CAAC,CAAC,EACN;2BACuB,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE;uBAC/B,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,wBAAwB,OAAO;;;;;CAKhF,CAAC;IAEA,OAAO,UAAU,CAAC,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;AACrD,CAAC"}
@@ -0,0 +1,87 @@
1
+ import type { Reporter, FullConfig, Suite, TestCase, TestResult, TestStep } from '@playwright/test/reporter';
2
+ /**
3
+ * CreeveyPlaywrightReporter is a Playwright reporter that integrates with Creevey
4
+ * to provide visual testing capabilities and use Creevey's UI for reviewing and approving screenshots.
5
+ */
6
+ export declare class CreeveyPlaywrightReporter implements Reporter {
7
+ private testsManager;
8
+ private api;
9
+ private reportDir;
10
+ private screenDir;
11
+ private port;
12
+ private debug;
13
+ private startServer;
14
+ private testIdMap;
15
+ private asyncQueue;
16
+ /**
17
+ * Creates a new instance of the CreeveyPlaywrightReporter
18
+ * @param options Configuration options for the reporter
19
+ */
20
+ constructor(options?: {
21
+ reportDir?: string;
22
+ screenDir?: string;
23
+ port?: number;
24
+ debug?: boolean;
25
+ });
26
+ /**
27
+ * Called when the test run starts
28
+ * @param config Playwright configuration
29
+ * @param suite Test suite information
30
+ */
31
+ onBegin(_config: FullConfig, _suite: Suite): void;
32
+ /**
33
+ * Called when a test begins
34
+ * @param test Test case information
35
+ * @param result Test result (initially empty)
36
+ */
37
+ onTestBegin(test: TestCase, _result: TestResult): void;
38
+ /**
39
+ * Called when a test step begins
40
+ * @param test Test case information
41
+ * @param result Test result
42
+ * @param step Test step information
43
+ */
44
+ onStepBegin(test: TestCase, _result: TestResult, step: TestStep): void;
45
+ /**
46
+ * Called when a test step ends
47
+ * @param test Test case information
48
+ * @param result Test result
49
+ * @param step Test step information
50
+ */
51
+ onStepEnd(_test: TestCase, _result: TestResult, step: TestStep): void;
52
+ /**
53
+ * Called when a test ends
54
+ * @param test Test case information
55
+ * @param result Test result
56
+ */
57
+ onTestEnd(test: TestCase, result: TestResult): void;
58
+ /**
59
+ * Called when the test run ends
60
+ * @param result The overall test run result
61
+ */
62
+ onEnd(result: {
63
+ status: 'passed' | 'failed' | 'timedout' | 'interrupted';
64
+ }): void;
65
+ /**
66
+ * Maps a Playwright test to a Creevey test format
67
+ * @param test Playwright test case
68
+ * @returns Creevey test object or null if mapping fails
69
+ */
70
+ private mapToCreeveyTest;
71
+ /**
72
+ * Process a test result and any attachments
73
+ * @param test Playwright test case
74
+ * @param result Playwright test result
75
+ */
76
+ private processTestResult;
77
+ /**
78
+ * Logs a debug message if debug mode is enabled
79
+ * @param message Message to log
80
+ */
81
+ private logDebug;
82
+ /**
83
+ * Logs an error message
84
+ * @param message Error message to log
85
+ */
86
+ private logError;
87
+ }