@pedropaulovc/playwright 1.59.0-next

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 (181) hide show
  1. package/ThirdPartyNotices.txt +5042 -0
  2. package/cli.js +19 -0
  3. package/index.d.ts +17 -0
  4. package/index.js +17 -0
  5. package/index.mjs +18 -0
  6. package/jsx-runtime.js +42 -0
  7. package/jsx-runtime.mjs +21 -0
  8. package/lib/agents/agentParser.js +89 -0
  9. package/lib/agents/copilot-setup-steps.yml +34 -0
  10. package/lib/agents/generateAgents.js +348 -0
  11. package/lib/agents/playwright-test-coverage.prompt.md +31 -0
  12. package/lib/agents/playwright-test-generate.prompt.md +8 -0
  13. package/lib/agents/playwright-test-generator.agent.md +88 -0
  14. package/lib/agents/playwright-test-heal.prompt.md +6 -0
  15. package/lib/agents/playwright-test-healer.agent.md +55 -0
  16. package/lib/agents/playwright-test-plan.prompt.md +9 -0
  17. package/lib/agents/playwright-test-planner.agent.md +73 -0
  18. package/lib/common/config.js +282 -0
  19. package/lib/common/configLoader.js +344 -0
  20. package/lib/common/esmLoaderHost.js +104 -0
  21. package/lib/common/expectBundle.js +28 -0
  22. package/lib/common/expectBundleImpl.js +407 -0
  23. package/lib/common/fixtures.js +302 -0
  24. package/lib/common/globals.js +58 -0
  25. package/lib/common/ipc.js +60 -0
  26. package/lib/common/poolBuilder.js +85 -0
  27. package/lib/common/process.js +132 -0
  28. package/lib/common/suiteUtils.js +140 -0
  29. package/lib/common/test.js +321 -0
  30. package/lib/common/testLoader.js +101 -0
  31. package/lib/common/testType.js +298 -0
  32. package/lib/common/validators.js +68 -0
  33. package/lib/fsWatcher.js +67 -0
  34. package/lib/index.js +726 -0
  35. package/lib/internalsForTest.js +42 -0
  36. package/lib/isomorphic/events.js +77 -0
  37. package/lib/isomorphic/folders.js +30 -0
  38. package/lib/isomorphic/stringInternPool.js +69 -0
  39. package/lib/isomorphic/teleReceiver.js +521 -0
  40. package/lib/isomorphic/teleSuiteUpdater.js +157 -0
  41. package/lib/isomorphic/testServerConnection.js +225 -0
  42. package/lib/isomorphic/testServerInterface.js +16 -0
  43. package/lib/isomorphic/testTree.js +329 -0
  44. package/lib/isomorphic/types.d.js +16 -0
  45. package/lib/loader/loaderMain.js +59 -0
  46. package/lib/matchers/expect.js +311 -0
  47. package/lib/matchers/matcherHint.js +44 -0
  48. package/lib/matchers/matchers.js +383 -0
  49. package/lib/matchers/toBeTruthy.js +75 -0
  50. package/lib/matchers/toEqual.js +100 -0
  51. package/lib/matchers/toHaveURL.js +101 -0
  52. package/lib/matchers/toMatchAriaSnapshot.js +159 -0
  53. package/lib/matchers/toMatchSnapshot.js +342 -0
  54. package/lib/matchers/toMatchText.js +99 -0
  55. package/lib/mcp/browser/actions.d.js +16 -0
  56. package/lib/mcp/browser/browserContextFactory.js +329 -0
  57. package/lib/mcp/browser/browserServerBackend.js +84 -0
  58. package/lib/mcp/browser/config.js +421 -0
  59. package/lib/mcp/browser/context.js +244 -0
  60. package/lib/mcp/browser/response.js +278 -0
  61. package/lib/mcp/browser/sessionLog.js +75 -0
  62. package/lib/mcp/browser/tab.js +351 -0
  63. package/lib/mcp/browser/tools/common.js +65 -0
  64. package/lib/mcp/browser/tools/console.js +61 -0
  65. package/lib/mcp/browser/tools/dialogs.js +60 -0
  66. package/lib/mcp/browser/tools/evaluate.js +61 -0
  67. package/lib/mcp/browser/tools/files.js +58 -0
  68. package/lib/mcp/browser/tools/form.js +63 -0
  69. package/lib/mcp/browser/tools/install.js +72 -0
  70. package/lib/mcp/browser/tools/keyboard.js +144 -0
  71. package/lib/mcp/browser/tools/mouse.js +159 -0
  72. package/lib/mcp/browser/tools/navigate.js +136 -0
  73. package/lib/mcp/browser/tools/navigateAndWait.js +66 -0
  74. package/lib/mcp/browser/tools/network.js +78 -0
  75. package/lib/mcp/browser/tools/pdf.js +49 -0
  76. package/lib/mcp/browser/tools/runCode.js +78 -0
  77. package/lib/mcp/browser/tools/screenshot.js +93 -0
  78. package/lib/mcp/browser/tools/snapshot.js +205 -0
  79. package/lib/mcp/browser/tools/snapshotViewport.js +63 -0
  80. package/lib/mcp/browser/tools/tabs.js +67 -0
  81. package/lib/mcp/browser/tools/tool.js +47 -0
  82. package/lib/mcp/browser/tools/tracing.js +74 -0
  83. package/lib/mcp/browser/tools/utils.js +94 -0
  84. package/lib/mcp/browser/tools/verify.js +143 -0
  85. package/lib/mcp/browser/tools/wait.js +63 -0
  86. package/lib/mcp/browser/tools.js +82 -0
  87. package/lib/mcp/browser/watchdog.js +44 -0
  88. package/lib/mcp/config.d.js +16 -0
  89. package/lib/mcp/extension/cdpRelay.js +351 -0
  90. package/lib/mcp/extension/extensionContextFactory.js +76 -0
  91. package/lib/mcp/extension/protocol.js +28 -0
  92. package/lib/mcp/index.js +61 -0
  93. package/lib/mcp/log.js +35 -0
  94. package/lib/mcp/program.js +110 -0
  95. package/lib/mcp/sdk/exports.js +28 -0
  96. package/lib/mcp/sdk/http.js +152 -0
  97. package/lib/mcp/sdk/inProcessTransport.js +71 -0
  98. package/lib/mcp/sdk/server.js +223 -0
  99. package/lib/mcp/sdk/tool.js +47 -0
  100. package/lib/mcp/terminal/cli.js +296 -0
  101. package/lib/mcp/terminal/command.js +56 -0
  102. package/lib/mcp/terminal/commands.js +519 -0
  103. package/lib/mcp/terminal/daemon.js +135 -0
  104. package/lib/mcp/terminal/help.json +47 -0
  105. package/lib/mcp/terminal/helpGenerator.js +115 -0
  106. package/lib/mcp/terminal/socketConnection.js +80 -0
  107. package/lib/mcp/test/browserBackend.js +98 -0
  108. package/lib/mcp/test/generatorTools.js +122 -0
  109. package/lib/mcp/test/plannerTools.js +145 -0
  110. package/lib/mcp/test/seed.js +82 -0
  111. package/lib/mcp/test/streams.js +44 -0
  112. package/lib/mcp/test/testBackend.js +99 -0
  113. package/lib/mcp/test/testContext.js +285 -0
  114. package/lib/mcp/test/testTool.js +30 -0
  115. package/lib/mcp/test/testTools.js +108 -0
  116. package/lib/plugins/gitCommitInfoPlugin.js +198 -0
  117. package/lib/plugins/index.js +28 -0
  118. package/lib/plugins/webServerPlugin.js +237 -0
  119. package/lib/program.js +417 -0
  120. package/lib/reporters/base.js +634 -0
  121. package/lib/reporters/blob.js +138 -0
  122. package/lib/reporters/dot.js +99 -0
  123. package/lib/reporters/empty.js +32 -0
  124. package/lib/reporters/github.js +128 -0
  125. package/lib/reporters/html.js +633 -0
  126. package/lib/reporters/internalReporter.js +138 -0
  127. package/lib/reporters/json.js +254 -0
  128. package/lib/reporters/junit.js +232 -0
  129. package/lib/reporters/line.js +131 -0
  130. package/lib/reporters/list.js +253 -0
  131. package/lib/reporters/listModeReporter.js +69 -0
  132. package/lib/reporters/markdown.js +144 -0
  133. package/lib/reporters/merge.js +558 -0
  134. package/lib/reporters/multiplexer.js +112 -0
  135. package/lib/reporters/reporterV2.js +102 -0
  136. package/lib/reporters/teleEmitter.js +317 -0
  137. package/lib/reporters/versions/blobV1.js +16 -0
  138. package/lib/runner/dispatcher.js +530 -0
  139. package/lib/runner/failureTracker.js +72 -0
  140. package/lib/runner/lastRun.js +77 -0
  141. package/lib/runner/loadUtils.js +334 -0
  142. package/lib/runner/loaderHost.js +89 -0
  143. package/lib/runner/processHost.js +180 -0
  144. package/lib/runner/projectUtils.js +241 -0
  145. package/lib/runner/rebase.js +189 -0
  146. package/lib/runner/reporters.js +138 -0
  147. package/lib/runner/sigIntWatcher.js +96 -0
  148. package/lib/runner/storage.js +91 -0
  149. package/lib/runner/taskRunner.js +127 -0
  150. package/lib/runner/tasks.js +410 -0
  151. package/lib/runner/testGroups.js +125 -0
  152. package/lib/runner/testRunner.js +398 -0
  153. package/lib/runner/testServer.js +269 -0
  154. package/lib/runner/uiModeReporter.js +30 -0
  155. package/lib/runner/vcs.js +72 -0
  156. package/lib/runner/watchMode.js +396 -0
  157. package/lib/runner/workerHost.js +104 -0
  158. package/lib/third_party/pirates.js +62 -0
  159. package/lib/third_party/tsconfig-loader.js +103 -0
  160. package/lib/transform/babelBundle.js +46 -0
  161. package/lib/transform/babelBundleImpl.js +461 -0
  162. package/lib/transform/compilationCache.js +274 -0
  163. package/lib/transform/esmLoader.js +103 -0
  164. package/lib/transform/md.js +221 -0
  165. package/lib/transform/portTransport.js +67 -0
  166. package/lib/transform/transform.js +303 -0
  167. package/lib/util.js +400 -0
  168. package/lib/utilsBundle.js +50 -0
  169. package/lib/utilsBundleImpl.js +103 -0
  170. package/lib/worker/fixtureRunner.js +262 -0
  171. package/lib/worker/testInfo.js +536 -0
  172. package/lib/worker/testTracing.js +345 -0
  173. package/lib/worker/timeoutManager.js +174 -0
  174. package/lib/worker/util.js +31 -0
  175. package/lib/worker/workerMain.js +530 -0
  176. package/package.json +72 -0
  177. package/test.d.ts +18 -0
  178. package/test.js +24 -0
  179. package/test.mjs +34 -0
  180. package/types/test.d.ts +10251 -0
  181. package/types/testReporter.d.ts +822 -0
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var line_exports = {};
20
+ __export(line_exports, {
21
+ default: () => line_default
22
+ });
23
+ module.exports = __toCommonJS(line_exports);
24
+ var import_base = require("./base");
25
+ class LineReporter extends import_base.TerminalReporter {
26
+ constructor() {
27
+ super(...arguments);
28
+ this._current = 0;
29
+ this._failures = 0;
30
+ this._didBegin = false;
31
+ }
32
+ onBegin(suite) {
33
+ super.onBegin(suite);
34
+ const startingMessage = this.generateStartingMessage();
35
+ if (startingMessage) {
36
+ this.writeLine(startingMessage);
37
+ this.writeLine();
38
+ }
39
+ this._didBegin = true;
40
+ }
41
+ onStdOut(chunk, test, result) {
42
+ super.onStdOut(chunk, test, result);
43
+ this._dumpToStdio(test, chunk, this.screen.stdout);
44
+ }
45
+ onStdErr(chunk, test, result) {
46
+ super.onStdErr(chunk, test, result);
47
+ this._dumpToStdio(test, chunk, this.screen.stderr);
48
+ }
49
+ _dumpToStdio(test, chunk, stream) {
50
+ if (this.config.quiet)
51
+ return;
52
+ if (!process.env.PW_TEST_DEBUG_REPORTERS)
53
+ stream.write(`\x1B[1A\x1B[2K`);
54
+ if (test && this._lastTest !== test) {
55
+ const title = this.screen.colors.dim(this.formatTestTitle(test));
56
+ stream.write(this.fitToScreen(title) + `
57
+ `);
58
+ this._lastTest = test;
59
+ }
60
+ stream.write(chunk);
61
+ if (chunk[chunk.length - 1] !== "\n")
62
+ this.writeLine();
63
+ this.writeLine();
64
+ }
65
+ onTestBegin(test, result) {
66
+ ++this._current;
67
+ this._updateLine(test, result, void 0);
68
+ }
69
+ onStepBegin(test, result, step) {
70
+ if (this.screen.isTTY && step.category === "test.step")
71
+ this._updateLine(test, result, step);
72
+ }
73
+ onStepEnd(test, result, step) {
74
+ if (this.screen.isTTY && step.category === "test.step")
75
+ this._updateLine(test, result, step.parent);
76
+ }
77
+ async onTestPaused(test, result) {
78
+ if (!process.stdin.isTTY && !process.env.PW_TEST_DEBUG_REPORTERS)
79
+ return;
80
+ if (!process.env.PW_TEST_DEBUG_REPORTERS)
81
+ this.screen.stdout.write(`\x1B[1A\x1B[2K`);
82
+ if (test.outcome() === "unexpected") {
83
+ this.writeLine(this.screen.colors.red(this.formatTestHeader(test, { indent: " ", index: ++this._failures })));
84
+ this.writeLine(this.formatResultErrors(test, result));
85
+ (0, import_base.markErrorsAsReported)(result);
86
+ this.writeLine(this.screen.colors.yellow(` Paused on error. Press Ctrl+C to end.`) + "\n\n");
87
+ } else {
88
+ this.writeLine(this.screen.colors.yellow(this.formatTestHeader(test, { indent: " " })));
89
+ this.writeLine(this.screen.colors.yellow(` Paused at test end. Press Ctrl+C to end.`) + "\n\n");
90
+ }
91
+ this._updateLine(test, result, void 0);
92
+ await new Promise(() => {
93
+ });
94
+ }
95
+ onTestEnd(test, result) {
96
+ super.onTestEnd(test, result);
97
+ if (!this.willRetry(test) && (test.outcome() === "flaky" || test.outcome() === "unexpected" || result.status === "interrupted")) {
98
+ if (!process.env.PW_TEST_DEBUG_REPORTERS)
99
+ this.screen.stdout.write(`\x1B[1A\x1B[2K`);
100
+ this.writeLine(this.formatFailure(test, ++this._failures));
101
+ this.writeLine();
102
+ }
103
+ }
104
+ _updateLine(test, result, step) {
105
+ const retriesPrefix = this.totalTestCount < this._current ? ` (retries)` : ``;
106
+ const prefix = `[${this._current}/${this.totalTestCount}]${retriesPrefix} `;
107
+ const currentRetrySuffix = result.retry ? this.screen.colors.yellow(` (retry #${result.retry})`) : "";
108
+ const title = this.formatTestTitle(test, step) + currentRetrySuffix;
109
+ if (process.env.PW_TEST_DEBUG_REPORTERS)
110
+ this.screen.stdout.write(`${prefix + title}
111
+ `);
112
+ else
113
+ this.screen.stdout.write(`\x1B[1A\x1B[2K${prefix + this.fitToScreen(title, prefix)}
114
+ `);
115
+ }
116
+ onError(error) {
117
+ super.onError(error);
118
+ const message = this.formatError(error).message + "\n";
119
+ if (!process.env.PW_TEST_DEBUG_REPORTERS && this._didBegin)
120
+ this.screen.stdout.write(`\x1B[1A\x1B[2K`);
121
+ this.screen.stdout.write(message);
122
+ this.writeLine();
123
+ }
124
+ async onEnd(result) {
125
+ if (!process.env.PW_TEST_DEBUG_REPORTERS && this._didBegin)
126
+ this.screen.stdout.write(`\x1B[1A\x1B[2K`);
127
+ await super.onEnd(result);
128
+ this.epilogue(false);
129
+ }
130
+ }
131
+ var line_default = LineReporter;
@@ -0,0 +1,253 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var list_exports = {};
20
+ __export(list_exports, {
21
+ default: () => list_default
22
+ });
23
+ module.exports = __toCommonJS(list_exports);
24
+ var import_utils = require("playwright-core/lib/utils");
25
+ var import_utilsBundle = require("playwright-core/lib/utilsBundle");
26
+ var import_base = require("./base");
27
+ var import_util = require("../util");
28
+ const DOES_NOT_SUPPORT_UTF8_IN_TERMINAL = process.platform === "win32" && process.env.TERM_PROGRAM !== "vscode" && !process.env.WT_SESSION;
29
+ const POSITIVE_STATUS_MARK = DOES_NOT_SUPPORT_UTF8_IN_TERMINAL ? "ok" : "\u2713";
30
+ const NEGATIVE_STATUS_MARK = DOES_NOT_SUPPORT_UTF8_IN_TERMINAL ? "x" : "\u2718";
31
+ class ListReporter extends import_base.TerminalReporter {
32
+ constructor(options) {
33
+ super(options);
34
+ this._lastRow = 0;
35
+ this._lastColumn = 0;
36
+ this._testRows = /* @__PURE__ */ new Map();
37
+ this._stepRows = /* @__PURE__ */ new Map();
38
+ this._resultIndex = /* @__PURE__ */ new Map();
39
+ this._stepIndex = /* @__PURE__ */ new Map();
40
+ this._needNewLine = false;
41
+ this._paused = /* @__PURE__ */ new Set();
42
+ this._printSteps = (0, import_utils.getAsBooleanFromENV)("PLAYWRIGHT_LIST_PRINT_STEPS", options?.printSteps);
43
+ }
44
+ onBegin(suite) {
45
+ super.onBegin(suite);
46
+ const startingMessage = this.generateStartingMessage();
47
+ if (startingMessage) {
48
+ this.writeLine(startingMessage);
49
+ this.writeLine("");
50
+ }
51
+ }
52
+ onTestBegin(test, result) {
53
+ const index = String(this._resultIndex.size + 1);
54
+ this._resultIndex.set(result, index);
55
+ if (!this.screen.isTTY)
56
+ return;
57
+ this._maybeWriteNewLine();
58
+ this._testRows.set(test, this._lastRow);
59
+ const prefix = this._testPrefix(index, "");
60
+ const line = this.screen.colors.dim(this.formatTestTitle(test)) + this._retrySuffix(result);
61
+ this._appendLine(line, prefix);
62
+ }
63
+ onStdOut(chunk, test, result) {
64
+ super.onStdOut(chunk, test, result);
65
+ this._dumpToStdio(test, chunk, this.screen.stdout, "out");
66
+ }
67
+ onStdErr(chunk, test, result) {
68
+ super.onStdErr(chunk, test, result);
69
+ this._dumpToStdio(test, chunk, this.screen.stderr, "err");
70
+ }
71
+ getStepIndex(testIndex, result, step) {
72
+ if (this._stepIndex.has(step))
73
+ return this._stepIndex.get(step);
74
+ const ordinal = (result[lastStepOrdinalSymbol] || 0) + 1;
75
+ result[lastStepOrdinalSymbol] = ordinal;
76
+ const stepIndex = `${testIndex}.${ordinal}`;
77
+ this._stepIndex.set(step, stepIndex);
78
+ return stepIndex;
79
+ }
80
+ onStepBegin(test, result, step) {
81
+ if (step.category !== "test.step")
82
+ return;
83
+ const testIndex = this._resultIndex.get(result) || "";
84
+ if (!this.screen.isTTY)
85
+ return;
86
+ if (this._printSteps) {
87
+ this._maybeWriteNewLine();
88
+ this._stepRows.set(step, this._lastRow);
89
+ const prefix = this._testPrefix(this.getStepIndex(testIndex, result, step), "");
90
+ const line = test.title + this.screen.colors.dim((0, import_base.stepSuffix)(step));
91
+ this._appendLine(line, prefix);
92
+ } else {
93
+ this._updateOrAppendLine(this._testRows, test, this.screen.colors.dim(this.formatTestTitle(test, step)) + this._retrySuffix(result), this._testPrefix(testIndex, ""));
94
+ }
95
+ }
96
+ onStepEnd(test, result, step) {
97
+ if (step.category !== "test.step")
98
+ return;
99
+ const testIndex = this._resultIndex.get(result) || "";
100
+ if (!this._printSteps) {
101
+ if (this.screen.isTTY)
102
+ this._updateOrAppendLine(this._testRows, test, this.screen.colors.dim(this.formatTestTitle(test, step.parent)) + this._retrySuffix(result), this._testPrefix(testIndex, ""));
103
+ return;
104
+ }
105
+ const index = this.getStepIndex(testIndex, result, step);
106
+ const title = this.screen.isTTY ? test.title + this.screen.colors.dim((0, import_base.stepSuffix)(step)) : this.formatTestTitle(test, step);
107
+ const prefix = this._testPrefix(index, "");
108
+ let text = "";
109
+ if (step.error)
110
+ text = this.screen.colors.red(title);
111
+ else
112
+ text = title;
113
+ text += this.screen.colors.dim(` (${(0, import_utilsBundle.ms)(step.duration)})`);
114
+ this._updateOrAppendLine(this._stepRows, step, text, prefix);
115
+ }
116
+ _maybeWriteNewLine() {
117
+ if (this._needNewLine) {
118
+ this._needNewLine = false;
119
+ this.screen.stdout.write("\n");
120
+ ++this._lastRow;
121
+ this._lastColumn = 0;
122
+ }
123
+ }
124
+ _updateLineCountAndNewLineFlagForOutput(text) {
125
+ this._needNewLine = text[text.length - 1] !== "\n";
126
+ if (!this.screen.ttyWidth)
127
+ return;
128
+ for (const ch of text) {
129
+ if (ch === "\n") {
130
+ this._lastColumn = 0;
131
+ ++this._lastRow;
132
+ continue;
133
+ }
134
+ ++this._lastColumn;
135
+ if (this._lastColumn > this.screen.ttyWidth) {
136
+ this._lastColumn = 0;
137
+ ++this._lastRow;
138
+ }
139
+ }
140
+ }
141
+ _dumpToStdio(test, chunk, stream, stdio) {
142
+ if (this.config.quiet)
143
+ return;
144
+ const text = chunk.toString("utf-8");
145
+ this._updateLineCountAndNewLineFlagForOutput(text);
146
+ stream.write(chunk);
147
+ }
148
+ async onTestPaused(test, result) {
149
+ if (!process.stdin.isTTY && !process.env.PW_TEST_DEBUG_REPORTERS)
150
+ return;
151
+ this._paused.add(result);
152
+ this._updateTestLine(test, result);
153
+ this._maybeWriteNewLine();
154
+ if (test.outcome() === "unexpected") {
155
+ const errors = this.formatResultErrors(test, result);
156
+ this.writeLine(errors);
157
+ this._updateLineCountAndNewLineFlagForOutput(errors);
158
+ (0, import_base.markErrorsAsReported)(result);
159
+ }
160
+ this._appendLine(this.screen.colors.yellow(`Paused ${test.outcome() === "unexpected" ? "on error" : "at test end"}. Press Ctrl+C to end.`), this._testPrefix("", ""));
161
+ await new Promise(() => {
162
+ });
163
+ }
164
+ onTestEnd(test, result) {
165
+ super.onTestEnd(test, result);
166
+ const wasPaused = this._paused.delete(result);
167
+ if (!wasPaused)
168
+ this._updateTestLine(test, result);
169
+ }
170
+ _updateTestLine(test, result) {
171
+ const title = this.formatTestTitle(test);
172
+ let prefix = "";
173
+ let text = "";
174
+ let index = this._resultIndex.get(result);
175
+ if (!index) {
176
+ index = String(this._resultIndex.size + 1);
177
+ this._resultIndex.set(result, index);
178
+ }
179
+ if (result.status === "skipped") {
180
+ prefix = this._testPrefix(index, this.screen.colors.green("-"));
181
+ text = this.screen.colors.cyan(title) + this._retrySuffix(result);
182
+ } else {
183
+ const statusMark = result.status === "passed" ? POSITIVE_STATUS_MARK : NEGATIVE_STATUS_MARK;
184
+ if (result.status === test.expectedStatus) {
185
+ prefix = this._testPrefix(index, this.screen.colors.green(statusMark));
186
+ text = title;
187
+ } else {
188
+ prefix = this._testPrefix(index, this.screen.colors.red(statusMark));
189
+ text = this.screen.colors.red(title);
190
+ }
191
+ text += this._retrySuffix(result) + this.screen.colors.dim(` (${(0, import_utilsBundle.ms)(result.duration)})`);
192
+ }
193
+ this._updateOrAppendLine(this._testRows, test, text, prefix);
194
+ }
195
+ _updateOrAppendLine(entityRowNumbers, entity, text, prefix) {
196
+ const row = entityRowNumbers.get(entity);
197
+ if (row !== void 0 && this.screen.isTTY && this._lastRow - row < this.screen.ttyHeight) {
198
+ this._updateLine(row, text, prefix);
199
+ } else {
200
+ this._maybeWriteNewLine();
201
+ entityRowNumbers.set(entity, this._lastRow);
202
+ this._appendLine(text, prefix);
203
+ }
204
+ }
205
+ _appendLine(text, prefix) {
206
+ const line = prefix + this.fitToScreen(text, prefix);
207
+ if (process.env.PW_TEST_DEBUG_REPORTERS) {
208
+ this.screen.stdout.write("#" + this._lastRow + " : " + line + "\n");
209
+ } else {
210
+ this.screen.stdout.write(line);
211
+ this.screen.stdout.write("\n");
212
+ }
213
+ ++this._lastRow;
214
+ this._lastColumn = 0;
215
+ }
216
+ _updateLine(row, text, prefix) {
217
+ const line = prefix + this.fitToScreen(text, prefix);
218
+ if (process.env.PW_TEST_DEBUG_REPORTERS)
219
+ this.screen.stdout.write("#" + row + " : " + line + "\n");
220
+ else
221
+ this._updateLineForTTY(row, line);
222
+ }
223
+ _updateLineForTTY(row, line) {
224
+ if (row !== this._lastRow)
225
+ this.screen.stdout.write(`\x1B[${this._lastRow - row}A`);
226
+ this.screen.stdout.write("\x1B[2K\x1B[0G");
227
+ this.screen.stdout.write(line);
228
+ if (row !== this._lastRow)
229
+ this.screen.stdout.write(`\x1B[${this._lastRow - row}E`);
230
+ }
231
+ _testPrefix(index, statusMark) {
232
+ const statusMarkLength = (0, import_util.stripAnsiEscapes)(statusMark).length;
233
+ const indexLength = Math.ceil(Math.log10(this.totalTestCount + 1));
234
+ return " " + statusMark + " ".repeat(3 - statusMarkLength) + this.screen.colors.dim(index.padStart(indexLength) + " ");
235
+ }
236
+ _retrySuffix(result) {
237
+ return result.retry ? this.screen.colors.yellow(` (retry #${result.retry})`) : "";
238
+ }
239
+ onError(error) {
240
+ super.onError(error);
241
+ this._maybeWriteNewLine();
242
+ const message = this.formatError(error).message + "\n";
243
+ this._updateLineCountAndNewLineFlagForOutput(message);
244
+ this.screen.stdout.write(message);
245
+ }
246
+ async onEnd(result) {
247
+ await super.onEnd(result);
248
+ this.screen.stdout.write("\n");
249
+ this.epilogue(true);
250
+ }
251
+ }
252
+ const lastStepOrdinalSymbol = Symbol("lastStepOrdinal");
253
+ var list_default = ListReporter;
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var listModeReporter_exports = {};
30
+ __export(listModeReporter_exports, {
31
+ default: () => listModeReporter_default
32
+ });
33
+ module.exports = __toCommonJS(listModeReporter_exports);
34
+ var import_path = __toESM(require("path"));
35
+ var import_base = require("./base");
36
+ class ListModeReporter {
37
+ constructor(options = {}) {
38
+ this._options = options;
39
+ this.screen = options?.screen ?? import_base.terminalScreen;
40
+ }
41
+ version() {
42
+ return "v2";
43
+ }
44
+ onConfigure(config) {
45
+ this.config = config;
46
+ }
47
+ onBegin(suite) {
48
+ this._writeLine(`Listing tests:`);
49
+ const tests = suite.allTests();
50
+ const files = /* @__PURE__ */ new Set();
51
+ for (const test of tests) {
52
+ const [, projectName, , ...titles] = test.titlePath();
53
+ const location = `${import_path.default.relative(this.config.rootDir, test.location.file)}:${test.location.line}:${test.location.column}`;
54
+ const testId = this._options.includeTestId ? `[id=${test.id}] ` : "";
55
+ const projectLabel = this._options.includeTestId ? `project=` : "";
56
+ const projectTitle = projectName ? `[${projectLabel}${projectName}] \u203A ` : "";
57
+ this._writeLine(` ${testId}${projectTitle}${location} \u203A ${titles.join(" \u203A ")}`);
58
+ files.add(test.location.file);
59
+ }
60
+ this._writeLine(`Total: ${tests.length} ${tests.length === 1 ? "test" : "tests"} in ${files.size} ${files.size === 1 ? "file" : "files"}`);
61
+ }
62
+ onError(error) {
63
+ this.screen.stderr.write("\n" + (0, import_base.formatError)(import_base.terminalScreen, error).message + "\n");
64
+ }
65
+ _writeLine(line) {
66
+ this.screen.stdout.write(line + "\n");
67
+ }
68
+ }
69
+ var listModeReporter_default = ListModeReporter;
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var markdown_exports = {};
30
+ __export(markdown_exports, {
31
+ default: () => markdown_default
32
+ });
33
+ module.exports = __toCommonJS(markdown_exports);
34
+ var import_fs = __toESM(require("fs"));
35
+ var import_path = __toESM(require("path"));
36
+ class MarkdownReporter {
37
+ constructor(options) {
38
+ this._fatalErrors = [];
39
+ this._options = options;
40
+ }
41
+ printsToStdio() {
42
+ return false;
43
+ }
44
+ onBegin(config, suite) {
45
+ this._config = config;
46
+ this._suite = suite;
47
+ }
48
+ onError(error) {
49
+ this._fatalErrors.push(error);
50
+ }
51
+ async onEnd(result) {
52
+ const summary = this._generateSummary();
53
+ const lines = [];
54
+ if (this._fatalErrors.length)
55
+ lines.push(`**${this._fatalErrors.length} fatal errors, not part of any test**`);
56
+ if (summary.unexpected.length) {
57
+ lines.push(`**${summary.unexpected.length} failed**`);
58
+ this._printTestList(":x:", summary.unexpected, lines);
59
+ }
60
+ if (summary.flaky.length) {
61
+ lines.push(`<details>`);
62
+ lines.push(`<summary><b>${summary.flaky.length} flaky</b></summary>`);
63
+ this._printTestList(":warning:", summary.flaky, lines, " <br/>");
64
+ lines.push(`</details>`);
65
+ lines.push(``);
66
+ }
67
+ if (summary.interrupted.length) {
68
+ lines.push(`<details>`);
69
+ lines.push(`<summary><b>${summary.interrupted.length} interrupted</b></summary>`);
70
+ this._printTestList(":warning:", summary.interrupted, lines, " <br/>");
71
+ lines.push(`</details>`);
72
+ lines.push(``);
73
+ }
74
+ const skipped = summary.skipped ? `, ${summary.skipped} skipped` : "";
75
+ const didNotRun = summary.didNotRun ? `, ${summary.didNotRun} did not run` : "";
76
+ lines.push(`**${summary.expected} passed${skipped}${didNotRun}**`);
77
+ lines.push(``);
78
+ await this.publishReport(lines.join("\n"));
79
+ }
80
+ async publishReport(report) {
81
+ const maybeRelativeFile = this._options.outputFile || "report.md";
82
+ const reportFile = import_path.default.resolve(this._options.configDir, maybeRelativeFile);
83
+ await import_fs.default.promises.mkdir(import_path.default.dirname(reportFile), { recursive: true });
84
+ await import_fs.default.promises.writeFile(reportFile, report);
85
+ }
86
+ _generateSummary() {
87
+ let didNotRun = 0;
88
+ let skipped = 0;
89
+ let expected = 0;
90
+ const interrupted = [];
91
+ const interruptedToPrint = [];
92
+ const unexpected = [];
93
+ const flaky = [];
94
+ this._suite.allTests().forEach((test) => {
95
+ switch (test.outcome()) {
96
+ case "skipped": {
97
+ if (test.results.some((result) => result.status === "interrupted")) {
98
+ if (test.results.some((result) => !!result.error))
99
+ interruptedToPrint.push(test);
100
+ interrupted.push(test);
101
+ } else if (!test.results.length || test.expectedStatus !== "skipped") {
102
+ ++didNotRun;
103
+ } else {
104
+ ++skipped;
105
+ }
106
+ break;
107
+ }
108
+ case "expected":
109
+ ++expected;
110
+ break;
111
+ case "unexpected":
112
+ unexpected.push(test);
113
+ break;
114
+ case "flaky":
115
+ flaky.push(test);
116
+ break;
117
+ }
118
+ });
119
+ return {
120
+ didNotRun,
121
+ skipped,
122
+ expected,
123
+ interrupted,
124
+ unexpected,
125
+ flaky
126
+ };
127
+ }
128
+ _printTestList(prefix, tests, lines, suffix) {
129
+ for (const test of tests)
130
+ lines.push(`${prefix} ${formatTestTitle(this._config.rootDir, test)}${suffix || ""}`);
131
+ lines.push(``);
132
+ }
133
+ }
134
+ function formatTestTitle(rootDir, test) {
135
+ const [, projectName, , ...titles] = test.titlePath();
136
+ const relativeTestPath = import_path.default.relative(rootDir, test.location.file);
137
+ const location = `${relativeTestPath}:${test.location.line}`;
138
+ const projectTitle = projectName ? `[${projectName}] \u203A ` : "";
139
+ const testTitle = `${projectTitle}${location} \u203A ${titles.join(" \u203A ")}`;
140
+ const extraTags = test.tags.filter((t) => !testTitle.includes(t));
141
+ const formattedTags = extraTags.map((t) => `\`${t}\``).join(" ");
142
+ return `${testTitle}${extraTags.length ? " " + formattedTags : ""}`;
143
+ }
144
+ var markdown_default = MarkdownReporter;