@stablyai/internal-playwright 0.1.0

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 (297) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +5 -0
  3. package/README.md +168 -0
  4. package/ThirdPartyNotices.txt +6277 -0
  5. package/cli.js +19 -0
  6. package/index.d.ts +17 -0
  7. package/index.js +17 -0
  8. package/index.mjs +18 -0
  9. package/jsx-runtime.js +42 -0
  10. package/jsx-runtime.mjs +21 -0
  11. package/lib/agents/generateAgents.js +265 -0
  12. package/lib/agents/generator.md +102 -0
  13. package/lib/agents/healer.md +78 -0
  14. package/lib/agents/planner.md +135 -0
  15. package/lib/cli.js +274 -0
  16. package/lib/common/config.js +274 -0
  17. package/lib/common/config.js.map +7 -0
  18. package/lib/common/configLoader.js +377 -0
  19. package/lib/common/configLoader.js.map +7 -0
  20. package/lib/common/esmLoaderHost.js +102 -0
  21. package/lib/common/esmLoaderHost.js.map +7 -0
  22. package/lib/common/expectBundle.js +52 -0
  23. package/lib/common/expectBundle.js.map +7 -0
  24. package/lib/common/expectBundleImpl.js +389 -0
  25. package/lib/common/expectBundleImpl.js.map +7 -0
  26. package/lib/common/fixtures.js +302 -0
  27. package/lib/common/fixtures.js.map +7 -0
  28. package/lib/common/globals.js +58 -0
  29. package/lib/common/globals.js.map +7 -0
  30. package/lib/common/ipc.js +60 -0
  31. package/lib/common/ipc.js.map +7 -0
  32. package/lib/common/poolBuilder.js +85 -0
  33. package/lib/common/poolBuilder.js.map +7 -0
  34. package/lib/common/process.js +104 -0
  35. package/lib/common/process.js.map +7 -0
  36. package/lib/common/suiteUtils.js +140 -0
  37. package/lib/common/suiteUtils.js.map +7 -0
  38. package/lib/common/test.js +321 -0
  39. package/lib/common/test.js.map +7 -0
  40. package/lib/common/testLoader.js +100 -0
  41. package/lib/common/testLoader.js.map +7 -0
  42. package/lib/common/testType.js +310 -0
  43. package/lib/common/testType.js.map +7 -0
  44. package/lib/fsWatcher.js +67 -0
  45. package/lib/fsWatcher.js.map +7 -0
  46. package/lib/index.js +696 -0
  47. package/lib/index.js.map +7 -0
  48. package/lib/internalsForTest.js +42 -0
  49. package/lib/internalsForTest.js.map +7 -0
  50. package/lib/isomorphic/events.js +77 -0
  51. package/lib/isomorphic/events.js.map +7 -0
  52. package/lib/isomorphic/folders.js +30 -0
  53. package/lib/isomorphic/folders.js.map +7 -0
  54. package/lib/isomorphic/stringInternPool.js +69 -0
  55. package/lib/isomorphic/stringInternPool.js.map +7 -0
  56. package/lib/isomorphic/teleReceiver.js +507 -0
  57. package/lib/isomorphic/teleReceiver.js.map +7 -0
  58. package/lib/isomorphic/teleSuiteUpdater.js +137 -0
  59. package/lib/isomorphic/teleSuiteUpdater.js.map +7 -0
  60. package/lib/isomorphic/testServerConnection.js +211 -0
  61. package/lib/isomorphic/testServerConnection.js.map +7 -0
  62. package/lib/isomorphic/testServerInterface.js +16 -0
  63. package/lib/isomorphic/testServerInterface.js.map +7 -0
  64. package/lib/isomorphic/testTree.js +334 -0
  65. package/lib/isomorphic/testTree.js.map +7 -0
  66. package/lib/isomorphic/types.d.js +16 -0
  67. package/lib/isomorphic/types.d.js.map +7 -0
  68. package/lib/loader/loaderMain.js +59 -0
  69. package/lib/loader/loaderMain.js.map +7 -0
  70. package/lib/matchers/expect.js +325 -0
  71. package/lib/matchers/expect.js.map +7 -0
  72. package/lib/matchers/matcherHint.js +87 -0
  73. package/lib/matchers/matcherHint.js.map +7 -0
  74. package/lib/matchers/matchers.js +366 -0
  75. package/lib/matchers/matchers.js.map +7 -0
  76. package/lib/matchers/toBeTruthy.js +73 -0
  77. package/lib/matchers/toBeTruthy.js.map +7 -0
  78. package/lib/matchers/toEqual.js +99 -0
  79. package/lib/matchers/toEqual.js.map +7 -0
  80. package/lib/matchers/toHaveURL.js +102 -0
  81. package/lib/matchers/toHaveURL.js.map +7 -0
  82. package/lib/matchers/toMatchAriaSnapshot.js +159 -0
  83. package/lib/matchers/toMatchAriaSnapshot.js.map +7 -0
  84. package/lib/matchers/toMatchSnapshot.js +359 -0
  85. package/lib/matchers/toMatchSnapshot.js.map +7 -0
  86. package/lib/matchers/toMatchText.js +99 -0
  87. package/lib/matchers/toMatchText.js.map +7 -0
  88. package/lib/mcp/browser/actions.d.js +16 -0
  89. package/lib/mcp/browser/backend.js +93 -0
  90. package/lib/mcp/browser/backend.js.map +7 -0
  91. package/lib/mcp/browser/browserContextFactory.js +296 -0
  92. package/lib/mcp/browser/browserServerBackend.js +76 -0
  93. package/lib/mcp/browser/codegen.js +66 -0
  94. package/lib/mcp/browser/config.js +385 -0
  95. package/lib/mcp/browser/context.js +287 -0
  96. package/lib/mcp/browser/response.js +228 -0
  97. package/lib/mcp/browser/sessionLog.js +160 -0
  98. package/lib/mcp/browser/tab.js +277 -0
  99. package/lib/mcp/browser/tool.js +30 -0
  100. package/lib/mcp/browser/tool.js.map +7 -0
  101. package/lib/mcp/browser/tools/common.js +63 -0
  102. package/lib/mcp/browser/tools/console.js +44 -0
  103. package/lib/mcp/browser/tools/dialogs.js +60 -0
  104. package/lib/mcp/browser/tools/evaluate.js +70 -0
  105. package/lib/mcp/browser/tools/files.js +58 -0
  106. package/lib/mcp/browser/tools/form.js +74 -0
  107. package/lib/mcp/browser/tools/install.js +69 -0
  108. package/lib/mcp/browser/tools/keyboard.js +85 -0
  109. package/lib/mcp/browser/tools/mouse.js +107 -0
  110. package/lib/mcp/browser/tools/navigate.js +62 -0
  111. package/lib/mcp/browser/tools/network.js +54 -0
  112. package/lib/mcp/browser/tools/pdf.js +59 -0
  113. package/lib/mcp/browser/tools/screenshot.js +88 -0
  114. package/lib/mcp/browser/tools/snapshot.js +182 -0
  115. package/lib/mcp/browser/tools/tabs.js +67 -0
  116. package/lib/mcp/browser/tools/tool.js +49 -0
  117. package/lib/mcp/browser/tools/tracing.js +74 -0
  118. package/lib/mcp/browser/tools/utils.js +100 -0
  119. package/lib/mcp/browser/tools/verify.js +154 -0
  120. package/lib/mcp/browser/tools/wait.js +63 -0
  121. package/lib/mcp/browser/tools.js +80 -0
  122. package/lib/mcp/browser/tools.js.map +7 -0
  123. package/lib/mcp/browser/watchdog.js +44 -0
  124. package/lib/mcp/config.d.js +16 -0
  125. package/lib/mcp/extension/cdpRelay.js +351 -0
  126. package/lib/mcp/extension/extensionContextFactory.js +75 -0
  127. package/lib/mcp/extension/protocol.js +28 -0
  128. package/lib/mcp/index.js +61 -0
  129. package/lib/mcp/log.js +35 -0
  130. package/lib/mcp/program.js +96 -0
  131. package/lib/mcp/sdk/bundle.js +81 -0
  132. package/lib/mcp/sdk/bundle.js.map +7 -0
  133. package/lib/mcp/sdk/call.js +49 -0
  134. package/lib/mcp/sdk/call.js.map +7 -0
  135. package/lib/mcp/sdk/exports.js +32 -0
  136. package/lib/mcp/sdk/exports.js.map +7 -0
  137. package/lib/mcp/sdk/http.js +187 -0
  138. package/lib/mcp/sdk/http.js.map +7 -0
  139. package/lib/mcp/sdk/inProcessTransport.js +71 -0
  140. package/lib/mcp/sdk/inProcessTransport.js.map +7 -0
  141. package/lib/mcp/sdk/mdb.js +206 -0
  142. package/lib/mcp/sdk/mdb.js.map +7 -0
  143. package/lib/mcp/sdk/proxyBackend.js +128 -0
  144. package/lib/mcp/sdk/proxyBackend.js.map +7 -0
  145. package/lib/mcp/sdk/server.js +189 -0
  146. package/lib/mcp/sdk/server.js.map +7 -0
  147. package/lib/mcp/sdk/tool.js +51 -0
  148. package/lib/mcp/sdk/tool.js.map +7 -0
  149. package/lib/mcp/test/backend.js +67 -0
  150. package/lib/mcp/test/backend.js.map +7 -0
  151. package/lib/mcp/test/browserBackend.js +98 -0
  152. package/lib/mcp/test/context.js +48 -0
  153. package/lib/mcp/test/context.js.map +7 -0
  154. package/lib/mcp/test/generatorTools.js +122 -0
  155. package/lib/mcp/test/plannerTools.js +46 -0
  156. package/lib/mcp/test/seed.js +72 -0
  157. package/lib/mcp/test/streams.js +39 -0
  158. package/lib/mcp/test/streams.js.map +7 -0
  159. package/lib/mcp/test/testBackend.js +97 -0
  160. package/lib/mcp/test/testContext.js +176 -0
  161. package/lib/mcp/test/testTool.js +30 -0
  162. package/lib/mcp/test/testTools.js +115 -0
  163. package/lib/mcp/test/tool.js +30 -0
  164. package/lib/mcp/test/tool.js.map +7 -0
  165. package/lib/mcp/test/tools.js +150 -0
  166. package/lib/mcp/test/tools.js.map +7 -0
  167. package/lib/mcp/vscode/host.js +187 -0
  168. package/lib/mcp/vscode/main.js +77 -0
  169. package/lib/mcpBundleImpl.js +41 -0
  170. package/lib/mcpBundleImpl.js.map +7 -0
  171. package/lib/plugins/gitCommitInfoPlugin.js +198 -0
  172. package/lib/plugins/gitCommitInfoPlugin.js.map +7 -0
  173. package/lib/plugins/index.js +28 -0
  174. package/lib/plugins/index.js.map +7 -0
  175. package/lib/plugins/webServerPlugin.js +209 -0
  176. package/lib/plugins/webServerPlugin.js.map +7 -0
  177. package/lib/program.js +412 -0
  178. package/lib/program.js.map +7 -0
  179. package/lib/reporters/base.js +609 -0
  180. package/lib/reporters/base.js.map +7 -0
  181. package/lib/reporters/blob.js +135 -0
  182. package/lib/reporters/blob.js.map +7 -0
  183. package/lib/reporters/dot.js +82 -0
  184. package/lib/reporters/dot.js.map +7 -0
  185. package/lib/reporters/empty.js +32 -0
  186. package/lib/reporters/empty.js.map +7 -0
  187. package/lib/reporters/github.js +128 -0
  188. package/lib/reporters/github.js.map +7 -0
  189. package/lib/reporters/html.js +644 -0
  190. package/lib/reporters/html.js.map +7 -0
  191. package/lib/reporters/internalReporter.js +130 -0
  192. package/lib/reporters/internalReporter.js.map +7 -0
  193. package/lib/reporters/json.js +254 -0
  194. package/lib/reporters/json.js.map +7 -0
  195. package/lib/reporters/junit.js +230 -0
  196. package/lib/reporters/junit.js.map +7 -0
  197. package/lib/reporters/line.js +113 -0
  198. package/lib/reporters/line.js.map +7 -0
  199. package/lib/reporters/list.js +235 -0
  200. package/lib/reporters/list.js.map +7 -0
  201. package/lib/reporters/listModeReporter.js +69 -0
  202. package/lib/reporters/listModeReporter.js.map +7 -0
  203. package/lib/reporters/markdown.js +144 -0
  204. package/lib/reporters/markdown.js.map +7 -0
  205. package/lib/reporters/merge.js +535 -0
  206. package/lib/reporters/merge.js.map +7 -0
  207. package/lib/reporters/multiplexer.js +104 -0
  208. package/lib/reporters/multiplexer.js.map +7 -0
  209. package/lib/reporters/reporterV2.js +102 -0
  210. package/lib/reporters/reporterV2.js.map +7 -0
  211. package/lib/reporters/teleEmitter.js +297 -0
  212. package/lib/reporters/teleEmitter.js.map +7 -0
  213. package/lib/reporters/versions/blobV1.js +16 -0
  214. package/lib/reporters/versions/blobV1.js.map +7 -0
  215. package/lib/runner/dispatcher.js +491 -0
  216. package/lib/runner/dispatcher.js.map +7 -0
  217. package/lib/runner/failureTracker.js +72 -0
  218. package/lib/runner/failureTracker.js.map +7 -0
  219. package/lib/runner/lastRun.js +77 -0
  220. package/lib/runner/lastRun.js.map +7 -0
  221. package/lib/runner/loadUtils.js +333 -0
  222. package/lib/runner/loadUtils.js.map +7 -0
  223. package/lib/runner/loaderHost.js +89 -0
  224. package/lib/runner/loaderHost.js.map +7 -0
  225. package/lib/runner/processHost.js +161 -0
  226. package/lib/runner/processHost.js.map +7 -0
  227. package/lib/runner/projectUtils.js +241 -0
  228. package/lib/runner/projectUtils.js.map +7 -0
  229. package/lib/runner/rebase.js +189 -0
  230. package/lib/runner/rebase.js.map +7 -0
  231. package/lib/runner/reporters.js +137 -0
  232. package/lib/runner/reporters.js.map +7 -0
  233. package/lib/runner/runner.js +173 -0
  234. package/lib/runner/sigIntWatcher.js +96 -0
  235. package/lib/runner/sigIntWatcher.js.map +7 -0
  236. package/lib/runner/taskRunner.js +127 -0
  237. package/lib/runner/taskRunner.js.map +7 -0
  238. package/lib/runner/tasks.js +410 -0
  239. package/lib/runner/tasks.js.map +7 -0
  240. package/lib/runner/testGroups.js +117 -0
  241. package/lib/runner/testGroups.js.map +7 -0
  242. package/lib/runner/testRunner.js +390 -0
  243. package/lib/runner/testRunner.js.map +7 -0
  244. package/lib/runner/testServer.js +264 -0
  245. package/lib/runner/testServer.js.map +7 -0
  246. package/lib/runner/uiMode.js +271 -0
  247. package/lib/runner/uiModeReporter.js +30 -0
  248. package/lib/runner/uiModeReporter.js.map +7 -0
  249. package/lib/runner/vcs.js +72 -0
  250. package/lib/runner/vcs.js.map +7 -0
  251. package/lib/runner/watchMode.js +395 -0
  252. package/lib/runner/watchMode.js.map +7 -0
  253. package/lib/runner/workerHost.js +95 -0
  254. package/lib/runner/workerHost.js.map +7 -0
  255. package/lib/store.js +98 -0
  256. package/lib/third_party/pirates.js +62 -0
  257. package/lib/third_party/pirates.js.map +7 -0
  258. package/lib/third_party/tsconfig-loader.js +103 -0
  259. package/lib/third_party/tsconfig-loader.js.map +7 -0
  260. package/lib/transform/babelBundle.js +43 -0
  261. package/lib/transform/babelBundle.js.map +7 -0
  262. package/lib/transform/babelBundleImpl.js +461 -0
  263. package/lib/transform/babelBundleImpl.js.map +7 -0
  264. package/lib/transform/compilationCache.js +272 -0
  265. package/lib/transform/compilationCache.js.map +7 -0
  266. package/lib/transform/esmLoader.js +104 -0
  267. package/lib/transform/esmLoader.js.map +7 -0
  268. package/lib/transform/esmUtils.js +32 -0
  269. package/lib/transform/portTransport.js +67 -0
  270. package/lib/transform/portTransport.js.map +7 -0
  271. package/lib/transform/transform.js +293 -0
  272. package/lib/transform/transform.js.map +7 -0
  273. package/lib/util.js +403 -0
  274. package/lib/util.js.map +7 -0
  275. package/lib/utilsBundle.js +43 -0
  276. package/lib/utilsBundle.js.map +7 -0
  277. package/lib/utilsBundleImpl.js +100 -0
  278. package/lib/utilsBundleImpl.js.map +7 -0
  279. package/lib/worker/fixtureRunner.js +258 -0
  280. package/lib/worker/fixtureRunner.js.map +7 -0
  281. package/lib/worker/stepContext.js +34 -0
  282. package/lib/worker/testInfo.js +508 -0
  283. package/lib/worker/testInfo.js.map +7 -0
  284. package/lib/worker/testTracing.js +344 -0
  285. package/lib/worker/testTracing.js.map +7 -0
  286. package/lib/worker/timeoutManager.js +174 -0
  287. package/lib/worker/timeoutManager.js.map +7 -0
  288. package/lib/worker/util.js +31 -0
  289. package/lib/worker/util.js.map +7 -0
  290. package/lib/worker/workerMain.js +520 -0
  291. package/lib/worker/workerMain.js.map +7 -0
  292. package/package.json +74 -0
  293. package/test.d.ts +18 -0
  294. package/test.js +24 -0
  295. package/test.mjs +33 -0
  296. package/types/test.d.ts +10217 -0
  297. package/types/testReporter.d.ts +816 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/reporters/list.ts"],
4
+ "sourcesContent": ["/**\n * Copyright (c) Microsoft Corporation.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getAsBooleanFromENV } from 'playwright-core/lib/utils';\nimport { ms as milliseconds } from 'playwright-core/lib/utilsBundle';\n\nimport { TerminalReporter, stepSuffix } from './base';\nimport { stripAnsiEscapes } from '../util';\n\nimport type { ListReporterOptions } from '../../types/test';\nimport type { FullResult, Suite, TestCase, TestError, TestResult, TestStep } from '../../types/testReporter';\nimport type { CommonReporterOptions, TerminalReporterOptions } from './base';\n\n// Allow it in the Visual Studio Code Terminal and the new Windows Terminal\nconst DOES_NOT_SUPPORT_UTF8_IN_TERMINAL = process.platform === 'win32' && process.env.TERM_PROGRAM !== 'vscode' && !process.env.WT_SESSION;\nconst POSITIVE_STATUS_MARK = DOES_NOT_SUPPORT_UTF8_IN_TERMINAL ? 'ok' : '\u2713';\nconst NEGATIVE_STATUS_MARK = DOES_NOT_SUPPORT_UTF8_IN_TERMINAL ? 'x' : '\u2718';\n\nclass ListReporter extends TerminalReporter {\n private _lastRow = 0;\n private _lastColumn = 0;\n private _testRows = new Map<TestCase, number>();\n private _stepRows = new Map<TestStep, number>();\n private _resultIndex = new Map<TestResult, string>();\n private _stepIndex = new Map<TestStep, string>();\n private _needNewLine = false;\n private _printSteps: boolean;\n\n constructor(options?: ListReporterOptions & CommonReporterOptions & TerminalReporterOptions) {\n super(options);\n this._printSteps = getAsBooleanFromENV('PLAYWRIGHT_LIST_PRINT_STEPS', options?.printSteps);\n }\n\n override onBegin(suite: Suite) {\n super.onBegin(suite);\n const startingMessage = this.generateStartingMessage();\n if (startingMessage) {\n this.writeLine(startingMessage);\n this.writeLine('');\n }\n }\n\n onTestBegin(test: TestCase, result: TestResult) {\n const index = String(this._resultIndex.size + 1);\n this._resultIndex.set(result, index);\n\n if (!this.screen.isTTY)\n return;\n this._maybeWriteNewLine();\n this._testRows.set(test, this._lastRow);\n const prefix = this._testPrefix(index, '');\n const line = this.screen.colors.dim(this.formatTestTitle(test)) + this._retrySuffix(result);\n this._appendLine(line, prefix);\n }\n\n override onStdOut(chunk: string | Buffer, test?: TestCase, result?: TestResult) {\n super.onStdOut(chunk, test, result);\n this._dumpToStdio(test, chunk, this.screen.stdout);\n }\n\n override onStdErr(chunk: string | Buffer, test?: TestCase, result?: TestResult) {\n super.onStdErr(chunk, test, result);\n this._dumpToStdio(test, chunk, this.screen.stderr);\n }\n\n private getStepIndex(testIndex: string, result: TestResult, step: TestStep): string {\n if (this._stepIndex.has(step))\n return this._stepIndex.get(step)!;\n\n const ordinal = ((result as any)[lastStepOrdinalSymbol] || 0) + 1;\n (result as any)[lastStepOrdinalSymbol] = ordinal;\n const stepIndex = `${testIndex}.${ordinal}`;\n this._stepIndex.set(step, stepIndex);\n return stepIndex;\n }\n\n onStepBegin(test: TestCase, result: TestResult, step: TestStep) {\n if (step.category !== 'test.step')\n return;\n const testIndex = this._resultIndex.get(result) || '';\n\n if (!this.screen.isTTY)\n return;\n\n if (this._printSteps) {\n this._maybeWriteNewLine();\n this._stepRows.set(step, this._lastRow);\n const prefix = this._testPrefix(this.getStepIndex(testIndex, result, step), '');\n const line = test.title + this.screen.colors.dim(stepSuffix(step));\n this._appendLine(line, prefix);\n } else {\n this._updateOrAppendLine(this._testRows, test, this.screen.colors.dim(this.formatTestTitle(test, step)) + this._retrySuffix(result), this._testPrefix(testIndex, ''));\n }\n }\n\n onStepEnd(test: TestCase, result: TestResult, step: TestStep) {\n if (step.category !== 'test.step')\n return;\n\n const testIndex = this._resultIndex.get(result) || '';\n if (!this._printSteps) {\n if (this.screen.isTTY)\n this._updateOrAppendLine(this._testRows, test, this.screen.colors.dim(this.formatTestTitle(test, step.parent)) + this._retrySuffix(result), this._testPrefix(testIndex, ''));\n return;\n }\n\n const index = this.getStepIndex(testIndex, result, step);\n const title = this.screen.isTTY ? test.title + this.screen.colors.dim(stepSuffix(step)) : this.formatTestTitle(test, step);\n const prefix = this._testPrefix(index, '');\n let text = '';\n if (step.error)\n text = this.screen.colors.red(title);\n else\n text = title;\n text += this.screen.colors.dim(` (${milliseconds(step.duration)})`);\n\n this._updateOrAppendLine(this._stepRows, step, text, prefix);\n }\n\n private _maybeWriteNewLine() {\n if (this._needNewLine) {\n this._needNewLine = false;\n this.screen.stdout.write('\\n');\n ++this._lastRow;\n this._lastColumn = 0;\n }\n }\n\n private _updateLineCountAndNewLineFlagForOutput(text: string) {\n this._needNewLine = text[text.length - 1] !== '\\n';\n if (!this.screen.ttyWidth)\n return;\n for (const ch of text) {\n if (ch === '\\n') {\n this._lastColumn = 0;\n ++this._lastRow;\n continue;\n }\n ++this._lastColumn;\n if (this._lastColumn > this.screen.ttyWidth) {\n this._lastColumn = 0;\n ++this._lastRow;\n }\n }\n }\n\n private _dumpToStdio(test: TestCase | undefined, chunk: string | Buffer, stream: NodeJS.WriteStream) {\n if (this.config.quiet)\n return;\n const text = chunk.toString('utf-8');\n this._updateLineCountAndNewLineFlagForOutput(text);\n stream.write(chunk);\n }\n\n override onTestEnd(test: TestCase, result: TestResult) {\n super.onTestEnd(test, result);\n\n const title = this.formatTestTitle(test);\n let prefix = '';\n let text = '';\n\n // In TTY mode test index is incremented in onTestStart\n // and in non-TTY mode it is incremented onTestEnd.\n let index = this._resultIndex.get(result);\n if (!index) {\n index = String(this._resultIndex.size + 1);\n this._resultIndex.set(result, index);\n }\n\n if (result.status === 'skipped') {\n prefix = this._testPrefix(index, this.screen.colors.green('-'));\n // Do not show duration for skipped.\n text = this.screen.colors.cyan(title) + this._retrySuffix(result);\n } else {\n const statusMark = result.status === 'passed' ? POSITIVE_STATUS_MARK : NEGATIVE_STATUS_MARK;\n if (result.status === test.expectedStatus) {\n prefix = this._testPrefix(index, this.screen.colors.green(statusMark));\n text = title;\n } else {\n prefix = this._testPrefix(index, this.screen.colors.red(statusMark));\n text = this.screen.colors.red(title);\n }\n text += this._retrySuffix(result) + this.screen.colors.dim(` (${milliseconds(result.duration)})`);\n }\n\n this._updateOrAppendLine(this._testRows, test, text, prefix);\n }\n\n private _updateOrAppendLine<T>(entityRowNumbers: Map<T, number>, entity: T, text: string, prefix: string) {\n const row = entityRowNumbers.get(entity);\n // Only update the line if we assume that the line is still on the screen\n if (row !== undefined && this.screen.isTTY && this._lastRow - row < this.screen.ttyHeight) {\n this._updateLine(row, text, prefix);\n } else {\n this._maybeWriteNewLine();\n entityRowNumbers.set(entity, this._lastRow);\n this._appendLine(text, prefix);\n }\n }\n\n private _appendLine(text: string, prefix: string) {\n const line = prefix + this.fitToScreen(text, prefix);\n if (process.env.PW_TEST_DEBUG_REPORTERS) {\n this.screen.stdout.write('#' + this._lastRow + ' : ' + line + '\\n');\n } else {\n this.screen.stdout.write(line);\n this.screen.stdout.write('\\n');\n }\n ++this._lastRow;\n this._lastColumn = 0;\n }\n\n private _updateLine(row: number, text: string, prefix: string) {\n const line = prefix + this.fitToScreen(text, prefix);\n if (process.env.PW_TEST_DEBUG_REPORTERS)\n this.screen.stdout.write('#' + row + ' : ' + line + '\\n');\n else\n this._updateLineForTTY(row, line);\n }\n\n private _updateLineForTTY(row: number, line: string) {\n // Go up if needed\n if (row !== this._lastRow)\n this.screen.stdout.write(`\\u001B[${this._lastRow - row}A`);\n // Erase line, go to the start\n this.screen.stdout.write('\\u001B[2K\\u001B[0G');\n this.screen.stdout.write(line);\n // Go down if needed.\n if (row !== this._lastRow)\n this.screen.stdout.write(`\\u001B[${this._lastRow - row}E`);\n }\n\n private _testPrefix(index: string, statusMark: string) {\n const statusMarkLength = stripAnsiEscapes(statusMark).length;\n const indexLength = Math.ceil(Math.log10(this.totalTestCount + 1));\n return ' ' + statusMark + ' '.repeat(3 - statusMarkLength) + this.screen.colors.dim(index.padStart(indexLength) + ' ');\n }\n\n private _retrySuffix(result: TestResult) {\n return (result.retry ? this.screen.colors.yellow(` (retry #${result.retry})`) : '');\n }\n\n override onError(error: TestError): void {\n super.onError(error);\n this._maybeWriteNewLine();\n const message = this.formatError(error).message + '\\n';\n this._updateLineCountAndNewLineFlagForOutput(message);\n this.screen.stdout.write(message);\n }\n\n override async onEnd(result: FullResult) {\n await super.onEnd(result);\n this.screen.stdout.write('\\n');\n this.epilogue(true);\n }\n}\n\nconst lastStepOrdinalSymbol = Symbol('lastStepOrdinal');\n\nexport default ListReporter;\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBA,mBAAoC;AACpC,yBAAmC;AAEnC,kBAA6C;AAC7C,kBAAiC;AAOjC,MAAM,oCAAoC,QAAQ,aAAa,WAAW,QAAQ,IAAI,iBAAiB,YAAY,CAAC,QAAQ,IAAI;AAChI,MAAM,uBAAuB,oCAAoC,OAAO;AACxE,MAAM,uBAAuB,oCAAoC,MAAM;AAEvE,MAAM,qBAAqB,6BAAiB;AAAA,EAU1C,YAAY,SAAiF;AAC3F,UAAM,OAAO;AAVf,SAAQ,WAAW;AACnB,SAAQ,cAAc;AACtB,SAAQ,YAAY,oBAAI,IAAsB;AAC9C,SAAQ,YAAY,oBAAI,IAAsB;AAC9C,SAAQ,eAAe,oBAAI,IAAwB;AACnD,SAAQ,aAAa,oBAAI,IAAsB;AAC/C,SAAQ,eAAe;AAKrB,SAAK,kBAAc,kCAAoB,+BAA+B,SAAS,UAAU;AAAA,EAC3F;AAAA,EAES,QAAQ,OAAc;AAC7B,UAAM,QAAQ,KAAK;AACnB,UAAM,kBAAkB,KAAK,wBAAwB;AACrD,QAAI,iBAAiB;AACnB,WAAK,UAAU,eAAe;AAC9B,WAAK,UAAU,EAAE;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,YAAY,MAAgB,QAAoB;AAC9C,UAAM,QAAQ,OAAO,KAAK,aAAa,OAAO,CAAC;AAC/C,SAAK,aAAa,IAAI,QAAQ,KAAK;AAEnC,QAAI,CAAC,KAAK,OAAO;AACf;AACF,SAAK,mBAAmB;AACxB,SAAK,UAAU,IAAI,MAAM,KAAK,QAAQ;AACtC,UAAM,SAAS,KAAK,YAAY,OAAO,EAAE;AACzC,UAAM,OAAO,KAAK,OAAO,OAAO,IAAI,KAAK,gBAAgB,IAAI,CAAC,IAAI,KAAK,aAAa,MAAM;AAC1F,SAAK,YAAY,MAAM,MAAM;AAAA,EAC/B;AAAA,EAES,SAAS,OAAwB,MAAiB,QAAqB;AAC9E,UAAM,SAAS,OAAO,MAAM,MAAM;AAClC,SAAK,aAAa,MAAM,OAAO,KAAK,OAAO,MAAM;AAAA,EACnD;AAAA,EAES,SAAS,OAAwB,MAAiB,QAAqB;AAC9E,UAAM,SAAS,OAAO,MAAM,MAAM;AAClC,SAAK,aAAa,MAAM,OAAO,KAAK,OAAO,MAAM;AAAA,EACnD;AAAA,EAEQ,aAAa,WAAmB,QAAoB,MAAwB;AAClF,QAAI,KAAK,WAAW,IAAI,IAAI;AAC1B,aAAO,KAAK,WAAW,IAAI,IAAI;AAEjC,UAAM,WAAY,OAAe,qBAAqB,KAAK,KAAK;AAChE,IAAC,OAAe,qBAAqB,IAAI;AACzC,UAAM,YAAY,GAAG,SAAS,IAAI,OAAO;AACzC,SAAK,WAAW,IAAI,MAAM,SAAS;AACnC,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,MAAgB,QAAoB,MAAgB;AAC9D,QAAI,KAAK,aAAa;AACpB;AACF,UAAM,YAAY,KAAK,aAAa,IAAI,MAAM,KAAK;AAEnD,QAAI,CAAC,KAAK,OAAO;AACf;AAEF,QAAI,KAAK,aAAa;AACpB,WAAK,mBAAmB;AACxB,WAAK,UAAU,IAAI,MAAM,KAAK,QAAQ;AACtC,YAAM,SAAS,KAAK,YAAY,KAAK,aAAa,WAAW,QAAQ,IAAI,GAAG,EAAE;AAC9E,YAAM,OAAO,KAAK,QAAQ,KAAK,OAAO,OAAO,QAAI,wBAAW,IAAI,CAAC;AACjE,WAAK,YAAY,MAAM,MAAM;AAAA,IAC/B,OAAO;AACL,WAAK,oBAAoB,KAAK,WAAW,MAAM,KAAK,OAAO,OAAO,IAAI,KAAK,gBAAgB,MAAM,IAAI,CAAC,IAAI,KAAK,aAAa,MAAM,GAAG,KAAK,YAAY,WAAW,EAAE,CAAC;AAAA,IACtK;AAAA,EACF;AAAA,EAEA,UAAU,MAAgB,QAAoB,MAAgB;AAC5D,QAAI,KAAK,aAAa;AACpB;AAEF,UAAM,YAAY,KAAK,aAAa,IAAI,MAAM,KAAK;AACnD,QAAI,CAAC,KAAK,aAAa;AACrB,UAAI,KAAK,OAAO;AACd,aAAK,oBAAoB,KAAK,WAAW,MAAM,KAAK,OAAO,OAAO,IAAI,KAAK,gBAAgB,MAAM,KAAK,MAAM,CAAC,IAAI,KAAK,aAAa,MAAM,GAAG,KAAK,YAAY,WAAW,EAAE,CAAC;AAC7K;AAAA,IACF;AAEA,UAAM,QAAQ,KAAK,aAAa,WAAW,QAAQ,IAAI;AACvD,UAAM,QAAQ,KAAK,OAAO,QAAQ,KAAK,QAAQ,KAAK,OAAO,OAAO,QAAI,wBAAW,IAAI,CAAC,IAAI,KAAK,gBAAgB,MAAM,IAAI;AACzH,UAAM,SAAS,KAAK,YAAY,OAAO,EAAE;AACzC,QAAI,OAAO;AACX,QAAI,KAAK;AACP,aAAO,KAAK,OAAO,OAAO,IAAI,KAAK;AAAA;AAEnC,aAAO;AACT,YAAQ,KAAK,OAAO,OAAO,IAAI,SAAK,mBAAAA,IAAa,KAAK,QAAQ,CAAC,GAAG;AAElE,SAAK,oBAAoB,KAAK,WAAW,MAAM,MAAM,MAAM;AAAA,EAC7D;AAAA,EAEQ,qBAAqB;AAC3B,QAAI,KAAK,cAAc;AACrB,WAAK,eAAe;AACpB,WAAK,OAAO,OAAO,MAAM,IAAI;AAC7B,QAAE,KAAK;AACP,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA,EAEQ,wCAAwC,MAAc;AAC5D,SAAK,eAAe,KAAK,KAAK,SAAS,CAAC,MAAM;AAC9C,QAAI,CAAC,KAAK,OAAO;AACf;AACF,eAAW,MAAM,MAAM;AACrB,UAAI,OAAO,MAAM;AACf,aAAK,cAAc;AACnB,UAAE,KAAK;AACP;AAAA,MACF;AACA,QAAE,KAAK;AACP,UAAI,KAAK,cAAc,KAAK,OAAO,UAAU;AAC3C,aAAK,cAAc;AACnB,UAAE,KAAK;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,aAAa,MAA4B,OAAwB,QAA4B;AACnG,QAAI,KAAK,OAAO;AACd;AACF,UAAM,OAAO,MAAM,SAAS,OAAO;AACnC,SAAK,wCAAwC,IAAI;AACjD,WAAO,MAAM,KAAK;AAAA,EACpB;AAAA,EAES,UAAU,MAAgB,QAAoB;AACrD,UAAM,UAAU,MAAM,MAAM;AAE5B,UAAM,QAAQ,KAAK,gBAAgB,IAAI;AACvC,QAAI,SAAS;AACb,QAAI,OAAO;AAIX,QAAI,QAAQ,KAAK,aAAa,IAAI,MAAM;AACxC,QAAI,CAAC,OAAO;AACV,cAAQ,OAAO,KAAK,aAAa,OAAO,CAAC;AACzC,WAAK,aAAa,IAAI,QAAQ,KAAK;AAAA,IACrC;AAEA,QAAI,OAAO,WAAW,WAAW;AAC/B,eAAS,KAAK,YAAY,OAAO,KAAK,OAAO,OAAO,MAAM,GAAG,CAAC;AAE9D,aAAO,KAAK,OAAO,OAAO,KAAK,KAAK,IAAI,KAAK,aAAa,MAAM;AAAA,IAClE,OAAO;AACL,YAAM,aAAa,OAAO,WAAW,WAAW,uBAAuB;AACvE,UAAI,OAAO,WAAW,KAAK,gBAAgB;AACzC,iBAAS,KAAK,YAAY,OAAO,KAAK,OAAO,OAAO,MAAM,UAAU,CAAC;AACrE,eAAO;AAAA,MACT,OAAO;AACL,iBAAS,KAAK,YAAY,OAAO,KAAK,OAAO,OAAO,IAAI,UAAU,CAAC;AACnE,eAAO,KAAK,OAAO,OAAO,IAAI,KAAK;AAAA,MACrC;AACA,cAAQ,KAAK,aAAa,MAAM,IAAI,KAAK,OAAO,OAAO,IAAI,SAAK,mBAAAA,IAAa,OAAO,QAAQ,CAAC,GAAG;AAAA,IAClG;AAEA,SAAK,oBAAoB,KAAK,WAAW,MAAM,MAAM,MAAM;AAAA,EAC7D;AAAA,EAEQ,oBAAuB,kBAAkC,QAAW,MAAc,QAAgB;AACxG,UAAM,MAAM,iBAAiB,IAAI,MAAM;AAEvC,QAAI,QAAQ,UAAa,KAAK,OAAO,SAAS,KAAK,WAAW,MAAM,KAAK,OAAO,WAAW;AACzF,WAAK,YAAY,KAAK,MAAM,MAAM;AAAA,IACpC,OAAO;AACL,WAAK,mBAAmB;AACxB,uBAAiB,IAAI,QAAQ,KAAK,QAAQ;AAC1C,WAAK,YAAY,MAAM,MAAM;AAAA,IAC/B;AAAA,EACF;AAAA,EAEQ,YAAY,MAAc,QAAgB;AAChD,UAAM,OAAO,SAAS,KAAK,YAAY,MAAM,MAAM;AACnD,QAAI,QAAQ,IAAI,yBAAyB;AACvC,WAAK,OAAO,OAAO,MAAM,MAAM,KAAK,WAAW,QAAQ,OAAO,IAAI;AAAA,IACpE,OAAO;AACL,WAAK,OAAO,OAAO,MAAM,IAAI;AAC7B,WAAK,OAAO,OAAO,MAAM,IAAI;AAAA,IAC/B;AACA,MAAE,KAAK;AACP,SAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,YAAY,KAAa,MAAc,QAAgB;AAC7D,UAAM,OAAO,SAAS,KAAK,YAAY,MAAM,MAAM;AACnD,QAAI,QAAQ,IAAI;AACd,WAAK,OAAO,OAAO,MAAM,MAAM,MAAM,QAAQ,OAAO,IAAI;AAAA;AAExD,WAAK,kBAAkB,KAAK,IAAI;AAAA,EACpC;AAAA,EAEQ,kBAAkB,KAAa,MAAc;AAEnD,QAAI,QAAQ,KAAK;AACf,WAAK,OAAO,OAAO,MAAM,QAAU,KAAK,WAAW,GAAG,GAAG;AAE3D,SAAK,OAAO,OAAO,MAAM,gBAAoB;AAC7C,SAAK,OAAO,OAAO,MAAM,IAAI;AAE7B,QAAI,QAAQ,KAAK;AACf,WAAK,OAAO,OAAO,MAAM,QAAU,KAAK,WAAW,GAAG,GAAG;AAAA,EAC7D;AAAA,EAEQ,YAAY,OAAe,YAAoB;AACrD,UAAM,uBAAmB,8BAAiB,UAAU,EAAE;AACtD,UAAM,cAAc,KAAK,KAAK,KAAK,MAAM,KAAK,iBAAiB,CAAC,CAAC;AACjE,WAAO,OAAO,aAAa,IAAI,OAAO,IAAI,gBAAgB,IAAI,KAAK,OAAO,OAAO,IAAI,MAAM,SAAS,WAAW,IAAI,GAAG;AAAA,EACxH;AAAA,EAEQ,aAAa,QAAoB;AACvC,WAAQ,OAAO,QAAQ,KAAK,OAAO,OAAO,OAAO,YAAY,OAAO,KAAK,GAAG,IAAI;AAAA,EAClF;AAAA,EAES,QAAQ,OAAwB;AACvC,UAAM,QAAQ,KAAK;AACnB,SAAK,mBAAmB;AACxB,UAAM,UAAU,KAAK,YAAY,KAAK,EAAE,UAAU;AAClD,SAAK,wCAAwC,OAAO;AACpD,SAAK,OAAO,OAAO,MAAM,OAAO;AAAA,EAClC;AAAA,EAEA,MAAe,MAAM,QAAoB;AACvC,UAAM,MAAM,MAAM,MAAM;AACxB,SAAK,OAAO,OAAO,MAAM,IAAI;AAC7B,SAAK,SAAS,IAAI;AAAA,EACpB;AACF;AAEA,MAAM,wBAAwB,OAAO,iBAAiB;AAEtD,IAAO,eAAQ;",
6
+ "names": ["milliseconds"]
7
+ }
@@ -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,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/reporters/listModeReporter.ts"],
4
+ "sourcesContent": ["/**\n * Copyright Microsoft Corporation. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport path from 'path';\n\nimport { formatError, terminalScreen } from './base';\n\nimport type { FullConfig, TestError } from '../../types/testReporter';\nimport type { Suite } from '../common/test';\nimport type { TerminalScreen } from './base';\nimport type { ReporterV2 } from './reporterV2';\n\nclass ListModeReporter implements ReporterV2 {\n private config!: FullConfig;\n private screen: TerminalScreen;\n private _options: { screen?: TerminalScreen, includeTestId?: boolean };\n\n constructor(options: { screen?: TerminalScreen, includeTestId?: boolean } = {}) {\n this._options = options;\n this.screen = options?.screen ?? terminalScreen;\n }\n\n version(): 'v2' {\n return 'v2';\n }\n\n onConfigure(config: FullConfig) {\n this.config = config;\n }\n\n onBegin(suite: Suite): void {\n this._writeLine(`Listing tests:`);\n const tests = suite.allTests();\n const files = new Set<string>();\n for (const test of tests) {\n // root, project, file, ...describes, test\n const [, projectName, , ...titles] = test.titlePath();\n const location = `${path.relative(this.config.rootDir, test.location.file)}:${test.location.line}:${test.location.column}`;\n const testId = this._options.includeTestId ? `[id=${test.id}] ` : '';\n const projectLabel = this._options.includeTestId ? `project=` : '';\n const projectTitle = projectName ? `[${projectLabel}${projectName}] \u203A ` : '';\n this._writeLine(` ${testId}${projectTitle}${location} \u203A ${titles.join(' \u203A ')}`);\n files.add(test.location.file);\n }\n this._writeLine(`Total: ${tests.length} ${tests.length === 1 ? 'test' : 'tests'} in ${files.size} ${files.size === 1 ? 'file' : 'files'}`);\n }\n\n onError(error: TestError) {\n this.screen.stderr.write('\\n' + formatError(terminalScreen, error).message + '\\n');\n }\n\n private _writeLine(line: string) {\n this.screen.stdout.write(line + '\\n');\n }\n}\n\nexport default ListModeReporter;\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBA,kBAAiB;AAEjB,kBAA4C;AAO5C,MAAM,iBAAuC;AAAA,EAK3C,YAAY,UAAgE,CAAC,GAAG;AAC9E,SAAK,WAAW;AAChB,SAAK,SAAS,SAAS,UAAU;AAAA,EACnC;AAAA,EAEA,UAAgB;AACd,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,QAAoB;AAC9B,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,QAAQ,OAAoB;AAC1B,SAAK,WAAW,gBAAgB;AAChC,UAAM,QAAQ,MAAM,SAAS;AAC7B,UAAM,QAAQ,oBAAI,IAAY;AAC9B,eAAW,QAAQ,OAAO;AAExB,YAAM,CAAC,EAAE,aAAa,EAAE,GAAG,MAAM,IAAI,KAAK,UAAU;AACpD,YAAM,WAAW,GAAG,YAAAA,QAAK,SAAS,KAAK,OAAO,SAAS,KAAK,SAAS,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,MAAM;AACxH,YAAM,SAAS,KAAK,SAAS,gBAAgB,OAAO,KAAK,EAAE,OAAO;AAClE,YAAM,eAAe,KAAK,SAAS,gBAAgB,aAAa;AAChE,YAAM,eAAe,cAAc,IAAI,YAAY,GAAG,WAAW,cAAS;AAC1E,WAAK,WAAW,KAAK,MAAM,GAAG,YAAY,GAAG,QAAQ,WAAM,OAAO,KAAK,UAAK,CAAC,EAAE;AAC/E,YAAM,IAAI,KAAK,SAAS,IAAI;AAAA,IAC9B;AACA,SAAK,WAAW,UAAU,MAAM,MAAM,IAAI,MAAM,WAAW,IAAI,SAAS,OAAO,OAAO,MAAM,IAAI,IAAI,MAAM,SAAS,IAAI,SAAS,OAAO,EAAE;AAAA,EAC3I;AAAA,EAEA,QAAQ,OAAkB;AACxB,SAAK,OAAO,OAAO,MAAM,WAAO,yBAAY,4BAAgB,KAAK,EAAE,UAAU,IAAI;AAAA,EACnF;AAAA,EAEQ,WAAW,MAAc;AAC/B,SAAK,OAAO,OAAO,MAAM,OAAO,IAAI;AAAA,EACtC;AACF;AAEA,IAAO,2BAAQ;",
6
+ "names": ["path"]
7
+ }
@@ -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;
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/reporters/markdown.ts"],
4
+ "sourcesContent": ["/**\n * Copyright (c) Microsoft Corporation.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport fs from 'fs';\nimport path from 'path';\n\nimport type { FullConfig, FullResult, Reporter, Suite, TestCase, TestError } from '@playwright/test/reporter';\n\ntype MarkdownReporterOptions = {\n configDir: string, // TODO: make it public?\n outputFile?: string;\n};\n\nclass MarkdownReporter implements Reporter {\n private _options: MarkdownReporterOptions;\n private _fatalErrors: TestError[] = [];\n protected _config!: FullConfig;\n private _suite!: Suite;\n\n constructor(options: MarkdownReporterOptions) {\n this._options = options;\n }\n\n printsToStdio() {\n return false;\n }\n\n onBegin(config: FullConfig, suite: Suite) {\n this._config = config;\n this._suite = suite;\n }\n\n onError(error: TestError) {\n this._fatalErrors.push(error);\n }\n\n async onEnd(result: FullResult) {\n const summary = this._generateSummary();\n const lines: string[] = [];\n if (this._fatalErrors.length)\n lines.push(`**${this._fatalErrors.length} fatal errors, not part of any test**`);\n if (summary.unexpected.length) {\n lines.push(`**${summary.unexpected.length} failed**`);\n this._printTestList(':x:', summary.unexpected, lines);\n }\n if (summary.flaky.length) {\n lines.push(`<details>`);\n lines.push(`<summary><b>${summary.flaky.length} flaky</b></summary>`);\n this._printTestList(':warning:', summary.flaky, lines, ' <br/>');\n lines.push(`</details>`);\n lines.push(``);\n }\n if (summary.interrupted.length) {\n lines.push(`<details>`);\n lines.push(`<summary><b>${summary.interrupted.length} interrupted</b></summary>`);\n this._printTestList(':warning:', summary.interrupted, lines, ' <br/>');\n lines.push(`</details>`);\n lines.push(``);\n }\n const skipped = summary.skipped ? `, ${summary.skipped} skipped` : '';\n const didNotRun = summary.didNotRun ? `, ${summary.didNotRun} did not run` : '';\n lines.push(`**${summary.expected} passed${skipped}${didNotRun}**`);\n lines.push(``);\n\n await this.publishReport(lines.join('\\n'));\n }\n\n protected async publishReport(report: string): Promise<void> {\n const maybeRelativeFile = this._options.outputFile || 'report.md';\n const reportFile = path.resolve(this._options.configDir, maybeRelativeFile);\n await fs.promises.mkdir(path.dirname(reportFile), { recursive: true });\n await fs.promises.writeFile(reportFile, report);\n }\n\n protected _generateSummary() {\n let didNotRun = 0;\n let skipped = 0;\n let expected = 0;\n const interrupted: TestCase[] = [];\n const interruptedToPrint: TestCase[] = [];\n const unexpected: TestCase[] = [];\n const flaky: TestCase[] = [];\n\n this._suite.allTests().forEach(test => {\n switch (test.outcome()) {\n case 'skipped': {\n if (test.results.some(result => result.status === 'interrupted')) {\n if (test.results.some(result => !!result.error))\n interruptedToPrint.push(test);\n interrupted.push(test);\n } else if (!test.results.length || test.expectedStatus !== 'skipped') {\n ++didNotRun;\n } else {\n ++skipped;\n }\n break;\n }\n case 'expected': ++expected; break;\n case 'unexpected': unexpected.push(test); break;\n case 'flaky': flaky.push(test); break;\n }\n });\n\n return {\n didNotRun,\n skipped,\n expected,\n interrupted,\n unexpected,\n flaky,\n };\n }\n\n private _printTestList(prefix: string, tests: TestCase[], lines: string[], suffix?: string) {\n for (const test of tests)\n lines.push(`${prefix} ${formatTestTitle(this._config.rootDir, test)}${suffix || ''}`);\n lines.push(``);\n }\n}\n\nfunction formatTestTitle(rootDir: string, test: TestCase): string {\n // root, project, file, ...describes, test\n const [, projectName, , ...titles] = test.titlePath();\n const relativeTestPath = path.relative(rootDir, test.location.file);\n // intentionally leave out column to prevent writing test.spec.ts:100:5 - GitHub turns that into \uD83D\uDCAF\n const location = `${relativeTestPath}:${test.location.line}`;\n const projectTitle = projectName ? `[${projectName}] \u203A ` : '';\n const testTitle = `${projectTitle}${location} \u203A ${titles.join(' \u203A ')}`;\n const extraTags = test.tags.filter(t => !testTitle.includes(t));\n const formattedTags = extraTags.map(t => `\\`${t}\\``).join(' ');\n return `${testTitle}${extraTags.length ? ' ' + formattedTags : ''}`;\n}\n\nexport default MarkdownReporter;\n"],
5
+ "mappings": "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",
6
+ "names": ["path", "fs"]
7
+ }