@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/base.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 path from 'path';\n\nimport { getPackageManagerExecCommand, parseErrorStack } from 'playwright-core/lib/utils';\nimport { ms as milliseconds } from 'playwright-core/lib/utilsBundle';\nimport { colors as realColors, noColors } from 'playwright-core/lib/utils';\n\nimport { ansiRegex, resolveReporterOutputPath, stripAnsiEscapes } from '../util';\nimport { getEastAsianWidth } from '../utilsBundle';\n\nimport type { ReporterV2 } from './reporterV2';\nimport type { FullConfig, FullResult, Location, Suite, TestCase, TestError, TestResult, TestStep } from '../../types/testReporter';\nimport type { Colors } from '@isomorphic/colors';\n\nexport type TestResultOutput = { chunk: string | Buffer, type: 'stdout' | 'stderr' };\nexport const kOutputSymbol = Symbol('output');\n\ntype ErrorDetails = {\n message: string;\n location?: Location;\n};\n\ntype TestSummary = {\n didNotRun: number;\n skipped: number;\n expected: number;\n interrupted: TestCase[];\n unexpected: TestCase[];\n flaky: TestCase[];\n failuresToPrint: TestCase[];\n fatalErrors: TestError[];\n};\n\nexport type CommonReporterOptions = {\n configDir: string,\n _mode?: 'list' | 'test' | 'merge',\n _isTestServer?: boolean,\n _commandHash?: string,\n};\n\nexport type Screen = {\n resolveFiles: 'cwd' | 'rootDir';\n colors: Colors;\n isTTY: boolean;\n ttyWidth: number;\n ttyHeight: number;\n stdout?: NodeJS.WriteStream;\n stderr?: NodeJS.WriteStream;\n};\n\nexport type TerminalScreen = Screen & {\n stdout: NodeJS.WriteStream;\n stderr: NodeJS.WriteStream;\n};\n\nconst DEFAULT_TTY_WIDTH = 100;\nconst DEFAULT_TTY_HEIGHT = 40;\n\n// eslint-disable-next-line no-restricted-properties\nconst originalProcessStdout = process.stdout;\n// eslint-disable-next-line no-restricted-properties\nconst originalProcessStderr = process.stderr;\n\n// Output goes to terminal.\nexport const terminalScreen: TerminalScreen = (() => {\n let isTTY = !!originalProcessStdout.isTTY;\n let ttyWidth = originalProcessStdout.columns || 0;\n let ttyHeight = originalProcessStdout.rows || 0;\n if (process.env.PLAYWRIGHT_FORCE_TTY === 'false' || process.env.PLAYWRIGHT_FORCE_TTY === '0') {\n isTTY = false;\n ttyWidth = 0;\n ttyHeight = 0;\n } else if (process.env.PLAYWRIGHT_FORCE_TTY === 'true' || process.env.PLAYWRIGHT_FORCE_TTY === '1') {\n isTTY = true;\n ttyWidth = originalProcessStdout.columns || DEFAULT_TTY_WIDTH;\n ttyHeight = originalProcessStdout.rows || DEFAULT_TTY_HEIGHT;\n } else if (process.env.PLAYWRIGHT_FORCE_TTY) {\n isTTY = true;\n const sizeMatch = process.env.PLAYWRIGHT_FORCE_TTY.match(/^(\\d+)x(\\d+)$/);\n if (sizeMatch) {\n ttyWidth = +sizeMatch[1];\n ttyHeight = +sizeMatch[2];\n } else {\n ttyWidth = +process.env.PLAYWRIGHT_FORCE_TTY;\n ttyHeight = DEFAULT_TTY_HEIGHT;\n }\n if (isNaN(ttyWidth))\n ttyWidth = DEFAULT_TTY_WIDTH;\n if (isNaN(ttyHeight))\n ttyHeight = DEFAULT_TTY_HEIGHT;\n }\n\n let useColors = isTTY;\n if (process.env.DEBUG_COLORS === '0' || process.env.DEBUG_COLORS === 'false' ||\n process.env.FORCE_COLOR === '0' || process.env.FORCE_COLOR === 'false')\n useColors = false;\n else if (process.env.DEBUG_COLORS || process.env.FORCE_COLOR)\n useColors = true;\n\n const colors = useColors ? realColors : noColors;\n return {\n resolveFiles: 'cwd',\n isTTY,\n ttyWidth,\n ttyHeight,\n colors,\n stdout: originalProcessStdout,\n stderr: originalProcessStderr,\n };\n})();\n\n// Output does not go to terminal, but colors are controlled with terminal env vars.\nexport const nonTerminalScreen: Screen = {\n colors: terminalScreen.colors,\n isTTY: false,\n ttyWidth: 0,\n ttyHeight: 0,\n resolveFiles: 'rootDir',\n};\n\n// Internal output for post-processing, should always contain real colors.\nexport const internalScreen: Screen = {\n colors: realColors,\n isTTY: false,\n ttyWidth: 0,\n ttyHeight: 0,\n resolveFiles: 'rootDir',\n};\n\nexport type TerminalReporterOptions = {\n screen?: TerminalScreen;\n omitFailures?: boolean;\n includeTestId?: boolean;\n};\n\nexport class TerminalReporter implements ReporterV2 {\n screen: TerminalScreen;\n config!: FullConfig;\n suite!: Suite;\n totalTestCount = 0;\n result!: FullResult;\n private fileDurations = new Map<string, { duration: number, workers: Set<number> }>();\n private _options: TerminalReporterOptions;\n private _fatalErrors: TestError[] = [];\n private _failureCount: number = 0;\n\n constructor(options: TerminalReporterOptions = {}) {\n this.screen = options.screen ?? terminalScreen;\n this._options = options;\n }\n\n version(): 'v2' {\n return 'v2';\n }\n\n onConfigure(config: FullConfig) {\n this.config = config;\n }\n\n onBegin(suite: Suite) {\n this.suite = suite;\n this.totalTestCount = suite.allTests().length;\n }\n\n onStdOut(chunk: string | Buffer, test?: TestCase, result?: TestResult) {\n this._appendOutput({ chunk, type: 'stdout' }, result);\n }\n\n onStdErr(chunk: string | Buffer, test?: TestCase, result?: TestResult) {\n this._appendOutput({ chunk, type: 'stderr' }, result);\n }\n\n private _appendOutput(output: TestResultOutput, result: TestResult | undefined) {\n if (!result)\n return;\n (result as any)[kOutputSymbol] = (result as any)[kOutputSymbol] || [];\n (result as any)[kOutputSymbol].push(output);\n }\n\n onTestEnd(test: TestCase, result: TestResult) {\n if (result.status !== 'skipped' && result.status !== test.expectedStatus)\n ++this._failureCount;\n const projectName = test.titlePath()[1];\n const relativePath = relativeTestPath(this.screen, this.config, test);\n const fileAndProject = (projectName ? `[${projectName}] \u203A ` : '') + relativePath;\n const entry = this.fileDurations.get(fileAndProject) || { duration: 0, workers: new Set() };\n entry.duration += result.duration;\n entry.workers.add(result.workerIndex);\n this.fileDurations.set(fileAndProject, entry);\n }\n\n onError(error: TestError) {\n this._fatalErrors.push(error);\n }\n\n async onEnd(result: FullResult) {\n this.result = result;\n }\n\n protected fitToScreen(line: string, prefix?: string): string {\n if (!this.screen.ttyWidth) {\n // Guard against the case where we cannot determine available width.\n return line;\n }\n return fitToWidth(line, this.screen.ttyWidth, prefix);\n }\n\n protected generateStartingMessage() {\n const jobs = this.config.metadata.actualWorkers ?? this.config.workers;\n const shardDetails = this.config.shard ? `, shard ${this.config.shard.current} of ${this.config.shard.total}` : '';\n if (!this.totalTestCount)\n return '';\n return '\\n' + this.screen.colors.dim('Running ') + this.totalTestCount + this.screen.colors.dim(` test${this.totalTestCount !== 1 ? 's' : ''} using `) + jobs + this.screen.colors.dim(` worker${jobs !== 1 ? 's' : ''}${shardDetails}`);\n }\n\n protected getSlowTests(): [string, number][] {\n if (!this.config.reportSlowTests)\n return [];\n // Only pick durations that were served by single worker.\n const fileDurations = [...this.fileDurations.entries()].filter(([key, value]) => value.workers.size === 1).map(([key, value]) => [key, value.duration]) as [string, number][];\n fileDurations.sort((a, b) => b[1] - a[1]);\n const count = Math.min(fileDurations.length, this.config.reportSlowTests.max || Number.POSITIVE_INFINITY);\n const threshold = this.config.reportSlowTests.threshold;\n return fileDurations.filter(([, duration]) => duration > threshold).slice(0, count);\n }\n\n protected generateSummaryMessage({ didNotRun, skipped, expected, interrupted, unexpected, flaky, fatalErrors }: TestSummary) {\n const tokens: string[] = [];\n if (unexpected.length) {\n tokens.push(this.screen.colors.red(` ${unexpected.length} failed`));\n for (const test of unexpected)\n tokens.push(this.screen.colors.red(this.formatTestHeader(test, { indent: ' ' })));\n }\n if (interrupted.length) {\n tokens.push(this.screen.colors.yellow(` ${interrupted.length} interrupted`));\n for (const test of interrupted)\n tokens.push(this.screen.colors.yellow(this.formatTestHeader(test, { indent: ' ' })));\n }\n if (flaky.length) {\n tokens.push(this.screen.colors.yellow(` ${flaky.length} flaky`));\n for (const test of flaky)\n tokens.push(this.screen.colors.yellow(this.formatTestHeader(test, { indent: ' ' })));\n }\n if (skipped)\n tokens.push(this.screen.colors.yellow(` ${skipped} skipped`));\n if (didNotRun)\n tokens.push(this.screen.colors.yellow(` ${didNotRun} did not run`));\n if (expected)\n tokens.push(this.screen.colors.green(` ${expected} passed`) + this.screen.colors.dim(` (${milliseconds(this.result.duration)})`));\n if (fatalErrors.length && expected + unexpected.length + interrupted.length + flaky.length > 0)\n tokens.push(this.screen.colors.red(` ${fatalErrors.length === 1 ? '1 error was not a part of any test' : fatalErrors.length + ' errors were not a part of any test'}, see above for details`));\n\n return tokens.join('\\n');\n }\n\n protected generateSummary(): TestSummary {\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 const failuresToPrint = [...unexpected, ...flaky, ...interruptedToPrint];\n return {\n didNotRun,\n skipped,\n expected,\n interrupted,\n unexpected,\n flaky,\n failuresToPrint,\n fatalErrors: this._fatalErrors,\n };\n }\n\n epilogue(full: boolean) {\n const summary = this.generateSummary();\n const summaryMessage = this.generateSummaryMessage(summary);\n if (full && summary.failuresToPrint.length && !this._options.omitFailures)\n this._printFailures(summary.failuresToPrint);\n this._printSlowTests();\n this._printSummary(summaryMessage);\n }\n\n private _printFailures(failures: TestCase[]) {\n this.writeLine('');\n failures.forEach((test, index) => {\n this.writeLine(this.formatFailure(test, index + 1));\n });\n }\n\n private _printSlowTests() {\n const slowTests = this.getSlowTests();\n slowTests.forEach(([file, duration]) => {\n this.writeLine(this.screen.colors.yellow(' Slow test file: ') + file + this.screen.colors.yellow(` (${milliseconds(duration)})`));\n });\n if (slowTests.length)\n this.writeLine(this.screen.colors.yellow(' Consider running tests from slow files in parallel. See: https://playwright.dev/docs/test-parallel'));\n }\n\n private _printSummary(summary: string) {\n if (summary.trim())\n this.writeLine(summary);\n }\n\n willRetry(test: TestCase): boolean {\n return test.outcome() === 'unexpected' && test.results.length <= test.retries;\n }\n\n formatTestTitle(test: TestCase, step?: TestStep): string {\n return formatTestTitle(this.screen, this.config, test, step, this._options);\n }\n\n formatTestHeader(test: TestCase, options: { indent?: string, index?: number, mode?: 'default' | 'error' } = {}): string {\n return formatTestHeader(this.screen, this.config, test, { ...options, includeTestId: this._options.includeTestId });\n }\n\n formatFailure(test: TestCase, index?: number): string {\n return formatFailure(this.screen, this.config, test, index, this._options);\n }\n\n formatError(error: TestError): ErrorDetails {\n return formatError(this.screen, error);\n }\n\n writeLine(line?: string) {\n this.screen.stdout?.write(line ? line + '\\n' : '\\n');\n }\n}\n\nexport function formatFailure(screen: Screen, config: FullConfig, test: TestCase, index?: number, options?: TerminalReporterOptions): string {\n const lines: string[] = [];\n const header = formatTestHeader(screen, config, test, { indent: ' ', index, mode: 'error', includeTestId: options?.includeTestId });\n lines.push(screen.colors.red(header));\n for (const result of test.results) {\n const resultLines: string[] = [];\n const errors = formatResultFailure(screen, test, result, ' ');\n if (!errors.length)\n continue;\n if (result.retry) {\n resultLines.push('');\n resultLines.push(screen.colors.gray(separator(screen, ` Retry #${result.retry}`)));\n }\n resultLines.push(...errors.map(error => '\\n' + error.message));\n const attachmentGroups = groupAttachments(result.attachments);\n for (let i = 0; i < attachmentGroups.length; ++i) {\n const attachment = attachmentGroups[i];\n if (attachment.name === 'error-context' && attachment.path) {\n resultLines.push('');\n resultLines.push(screen.colors.dim(` Error Context: ${relativeFilePath(screen, config, attachment.path)}`));\n continue;\n }\n\n if (attachment.name.startsWith('_'))\n continue;\n\n const hasPrintableContent = attachment.contentType.startsWith('text/');\n if (!attachment.path && !hasPrintableContent)\n continue;\n\n resultLines.push('');\n resultLines.push(screen.colors.dim(separator(screen, ` attachment #${i + 1}: ${screen.colors.bold(attachment.name)} (${attachment.contentType})`)));\n\n if (attachment.actual?.path) {\n if (attachment.expected?.path) {\n const expectedPath = relativeFilePath(screen, config, attachment.expected.path);\n resultLines.push(screen.colors.dim(` Expected: ${expectedPath}`));\n }\n const actualPath = relativeFilePath(screen, config, attachment.actual.path);\n resultLines.push(screen.colors.dim(` Received: ${actualPath}`));\n if (attachment.previous?.path) {\n const previousPath = relativeFilePath(screen, config, attachment.previous.path);\n resultLines.push(screen.colors.dim(` Previous: ${previousPath}`));\n }\n if (attachment.diff?.path) {\n const diffPath = relativeFilePath(screen, config, attachment.diff.path);\n resultLines.push(screen.colors.dim(` Diff: ${diffPath}`));\n }\n } else if (attachment.path) {\n const relativePath = relativeFilePath(screen, config, attachment.path);\n resultLines.push(screen.colors.dim(` ${relativePath}`));\n // Make this extensible\n if (attachment.name === 'trace') {\n const packageManagerCommand = getPackageManagerExecCommand();\n resultLines.push(screen.colors.dim(` Usage:`));\n resultLines.push('');\n resultLines.push(screen.colors.dim(` ${packageManagerCommand} playwright show-trace ${quotePathIfNeeded(relativePath)}`));\n resultLines.push('');\n }\n } else {\n if (attachment.contentType.startsWith('text/') && attachment.body) {\n let text = attachment.body.toString();\n if (text.length > 300)\n text = text.slice(0, 300) + '...';\n for (const line of text.split('\\n'))\n resultLines.push(screen.colors.dim(` ${line}`));\n }\n }\n resultLines.push(screen.colors.dim(separator(screen, ' ')));\n }\n lines.push(...resultLines);\n }\n lines.push('');\n return lines.join('\\n');\n}\n\nexport function formatRetry(screen: Screen, result: TestResult) {\n const retryLines = [];\n if (result.retry) {\n retryLines.push('');\n retryLines.push(screen.colors.gray(separator(screen, ` Retry #${result.retry}`)));\n }\n return retryLines;\n}\n\nfunction quotePathIfNeeded(path: string): string {\n if (/\\s/.test(path))\n return `\"${path}\"`;\n return path;\n}\n\nexport function formatResultFailure(screen: Screen, test: TestCase, result: TestResult, initialIndent: string): ErrorDetails[] {\n const errorDetails: ErrorDetails[] = [];\n\n if (result.status === 'passed' && test.expectedStatus === 'failed') {\n errorDetails.push({\n message: indent(screen.colors.red(`Expected to fail, but passed.`), initialIndent),\n });\n }\n if (result.status === 'interrupted') {\n errorDetails.push({\n message: indent(screen.colors.red(`Test was interrupted.`), initialIndent),\n });\n }\n\n for (const error of result.errors) {\n const formattedError = formatError(screen, error);\n errorDetails.push({\n message: indent(formattedError.message, initialIndent),\n location: formattedError.location,\n });\n }\n return errorDetails;\n}\n\nexport function relativeFilePath(screen: Screen, config: FullConfig, file: string): string {\n if (screen.resolveFiles === 'cwd')\n return path.relative(process.cwd(), file);\n return path.relative(config.rootDir, file);\n}\n\nfunction relativeTestPath(screen: Screen, config: FullConfig, test: TestCase): string {\n return relativeFilePath(screen, config, test.location.file);\n}\n\nexport function stepSuffix(step: TestStep | undefined) {\n const stepTitles = step ? step.titlePath() : [];\n return stepTitles.map(t => t.split('\\n')[0]).map(t => ' \u203A ' + t).join('');\n}\n\nfunction formatTestTitle(screen: Screen, config: FullConfig, test: TestCase, step?: TestStep, options: { includeTestId?: boolean } = {}): string {\n // root, project, file, ...describes, test\n const [, projectName, , ...titles] = test.titlePath();\n const location = `${relativeTestPath(screen, config, test)}:${test.location.line}:${test.location.column}`;\n const testId = options.includeTestId ? `[id=${test.id}] ` : '';\n const projectLabel = options.includeTestId ? `project=` : '';\n const projectTitle = projectName ? `[${projectLabel}${projectName}] \u203A ` : '';\n const testTitle = `${testId}${projectTitle}${location} \u203A ${titles.join(' \u203A ')}`;\n const extraTags = test.tags.filter(t => !testTitle.includes(t));\n return `${testTitle}${stepSuffix(step)}${extraTags.length ? ' ' + extraTags.join(' ') : ''}`;\n}\n\nfunction formatTestHeader(screen: Screen, config: FullConfig, test: TestCase, options: { indent?: string, index?: number, mode?: 'default' | 'error', includeTestId?: boolean } = {}): string {\n const title = formatTestTitle(screen, config, test, undefined, options);\n const header = `${options.indent || ''}${options.index ? options.index + ') ' : ''}${title}`;\n let fullHeader = header;\n\n // Render the path to the deepest failing test.step.\n if (options.mode === 'error') {\n const stepPaths = new Set<string>();\n for (const result of test.results.filter(r => !!r.errors.length)) {\n const stepPath: string[] = [];\n const visit = (steps: TestStep[]) => {\n const errors = steps.filter(s => s.error);\n if (errors.length > 1)\n return;\n if (errors.length === 1 && errors[0].category === 'test.step') {\n stepPath.push(errors[0].title);\n visit(errors[0].steps);\n }\n };\n visit(result.steps);\n stepPaths.add(['', ...stepPath].join(' \u203A '));\n }\n fullHeader = header + (stepPaths.size === 1 ? stepPaths.values().next().value : '');\n }\n return separator(screen, fullHeader);\n}\n\nexport function formatError(screen: Screen, error: TestError): ErrorDetails {\n const message = error.message || error.value || '';\n const stack = error.stack;\n if (!stack && !error.location)\n return { message };\n\n const tokens = [];\n\n // Now that we filter out internals from our stack traces, we can safely render\n // the helper / original exception locations.\n const parsedStack = stack ? prepareErrorStack(stack) : undefined;\n tokens.push(parsedStack?.message || message);\n\n if (error.snippet) {\n let snippet = error.snippet;\n if (!screen.colors.enabled)\n snippet = stripAnsiEscapes(snippet);\n tokens.push('');\n tokens.push(snippet);\n }\n\n if (parsedStack && parsedStack.stackLines.length)\n tokens.push(screen.colors.dim(parsedStack.stackLines.join('\\n')));\n\n let location = error.location;\n if (parsedStack && !location)\n location = parsedStack.location;\n\n if (error.cause)\n tokens.push(screen.colors.dim('[cause]: ') + formatError(screen, error.cause).message);\n\n return {\n location,\n message: tokens.join('\\n'),\n };\n}\n\nexport function separator(screen: Screen, text: string = ''): string {\n if (text)\n text += ' ';\n const columns = Math.min(100, screen.ttyWidth || 100);\n return text + screen.colors.dim('\u2500'.repeat(Math.max(0, columns - stripAnsiEscapes(text).length)));\n}\n\nfunction indent(lines: string, tab: string) {\n return lines.replace(/^(?=.+$)/gm, tab);\n}\n\nexport function prepareErrorStack(stack: string): {\n message: string;\n stackLines: string[];\n location?: Location;\n} {\n return parseErrorStack(stack, path.sep, !!process.env.PWDEBUGIMPL);\n}\n\nfunction characterWidth(c: string) {\n return getEastAsianWidth.eastAsianWidth(c.codePointAt(0)!);\n}\n\nfunction stringWidth(v: string) {\n let width = 0;\n for (const { segment } of new Intl.Segmenter(undefined, { granularity: 'grapheme' }).segment(v))\n width += characterWidth(segment);\n return width;\n}\n\nfunction suffixOfWidth(v: string, width: number) {\n const segments = [...new Intl.Segmenter(undefined, { granularity: 'grapheme' }).segment(v)];\n let suffixBegin = v.length;\n for (const { segment, index } of segments.reverse()) {\n const segmentWidth = stringWidth(segment);\n if (segmentWidth > width)\n break;\n width -= segmentWidth;\n suffixBegin = index;\n }\n return v.substring(suffixBegin);\n}\n\n// Leaves enough space for the \"prefix\" to also fit.\nexport function fitToWidth(line: string, width: number, prefix?: string): string {\n const prefixLength = prefix ? stripAnsiEscapes(prefix).length : 0;\n width -= prefixLength;\n if (stringWidth(line) <= width)\n return line;\n\n // Even items are plain text, odd items are control sequences.\n const parts = line.split(ansiRegex);\n const taken: string[] = [];\n for (let i = parts.length - 1; i >= 0; i--) {\n if (i % 2) {\n // Include all control sequences to preserve formatting.\n taken.push(parts[i]);\n } else {\n let part = suffixOfWidth(parts[i], width);\n const wasTruncated = part.length < parts[i].length;\n if (wasTruncated && parts[i].length > 0) {\n // Add ellipsis if we are truncating.\n part = '\\u2026' + suffixOfWidth(parts[i], width - 1);\n }\n taken.push(part);\n width -= stringWidth(part);\n }\n }\n return taken.reverse().join('');\n}\n\nfunction resolveFromEnv(name: string): string | undefined {\n const value = process.env[name];\n if (value)\n return path.resolve(process.cwd(), value);\n return undefined;\n}\n\n// In addition to `outputFile` the function returns `outputDir` which should\n// be cleaned up if present by some reporters contract.\nexport function resolveOutputFile(reporterName: string, options: {\n configDir: string,\n outputDir?: string,\n fileName?: string,\n outputFile?: string,\n default?: {\n fileName: string,\n outputDir: string,\n }\n}): { outputFile: string, outputDir?: string } | undefined {\n const name = reporterName.toUpperCase();\n let outputFile = resolveFromEnv(`PLAYWRIGHT_${name}_OUTPUT_FILE`);\n if (!outputFile && options.outputFile)\n outputFile = path.resolve(options.configDir, options.outputFile);\n if (outputFile)\n return { outputFile };\n\n let outputDir = resolveFromEnv(`PLAYWRIGHT_${name}_OUTPUT_DIR`);\n if (!outputDir && options.outputDir)\n outputDir = path.resolve(options.configDir, options.outputDir);\n if (!outputDir && options.default)\n outputDir = resolveReporterOutputPath(options.default.outputDir, options.configDir, undefined);\n if (!outputDir)\n outputDir = options.configDir;\n\n const reportName = process.env[`PLAYWRIGHT_${name}_OUTPUT_NAME`] ?? options.fileName ?? options.default?.fileName;\n if (!reportName)\n return undefined;\n outputFile = path.resolve(outputDir, reportName);\n\n return { outputFile, outputDir };\n}\n\ntype TestAttachment = TestResult['attachments'][number];\n\ntype TestAttachmentGroup = TestAttachment & {\n expected?: TestAttachment;\n actual?: TestAttachment;\n diff?: TestAttachment;\n previous?: TestAttachment;\n};\n\nfunction groupAttachments(attachments: TestResult['attachments']): TestAttachmentGroup[] {\n const result: TestAttachmentGroup[] = [];\n const attachmentsByPrefix = new Map<string, TestAttachment>();\n for (const attachment of attachments) {\n if (!attachment.path) {\n result.push(attachment);\n continue;\n }\n\n const match = attachment.name.match(/^(.*)-(expected|actual|diff|previous)(\\.[^.]+)?$/);\n if (!match) {\n result.push(attachment);\n continue;\n }\n\n const [, name, category] = match;\n let group: TestAttachmentGroup | undefined = attachmentsByPrefix.get(name);\n if (!group) {\n group = { ...attachment, name };\n attachmentsByPrefix.set(name, group);\n result.push(group);\n }\n if (category === 'expected')\n group.expected = attachment;\n else if (category === 'actual')\n group.actual = attachment;\n else if (category === 'diff')\n group.diff = attachment;\n else if (category === 'previous')\n group.previous = attachment;\n }\n return result;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["import_utils", "import_utilsBundle", "realColors", "milliseconds", "path"]
7
+ }
@@ -0,0 +1,135 @@
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 blob_exports = {};
30
+ __export(blob_exports, {
31
+ BlobReporter: () => BlobReporter,
32
+ currentBlobReportVersion: () => currentBlobReportVersion
33
+ });
34
+ module.exports = __toCommonJS(blob_exports);
35
+ var import_fs = __toESM(require("fs"));
36
+ var import_path = __toESM(require("path"));
37
+ var import_stream = require("stream");
38
+ var import_utils = require("playwright-core/lib/utils");
39
+ var import_utils2 = require("playwright-core/lib/utils");
40
+ var import_utilsBundle = require("playwright-core/lib/utilsBundle");
41
+ var import_zipBundle = require("playwright-core/lib/zipBundle");
42
+ var import_base = require("./base");
43
+ var import_teleEmitter = require("./teleEmitter");
44
+ const currentBlobReportVersion = 2;
45
+ class BlobReporter extends import_teleEmitter.TeleReporterEmitter {
46
+ constructor(options) {
47
+ super((message) => this._messages.push(message));
48
+ this._messages = [];
49
+ this._attachments = [];
50
+ this._options = options;
51
+ if (this._options.fileName && !this._options.fileName.endsWith(".zip"))
52
+ throw new Error(`Blob report file name must end with .zip extension: ${this._options.fileName}`);
53
+ this._salt = (0, import_utils2.createGuid)();
54
+ }
55
+ onConfigure(config) {
56
+ const metadata = {
57
+ version: currentBlobReportVersion,
58
+ userAgent: (0, import_utils2.getUserAgent)(),
59
+ name: process.env.PWTEST_BOT_NAME,
60
+ shard: config.shard ?? void 0,
61
+ pathSeparator: import_path.default.sep
62
+ };
63
+ this._messages.push({
64
+ method: "onBlobReportMetadata",
65
+ params: metadata
66
+ });
67
+ this._config = config;
68
+ super.onConfigure(config);
69
+ }
70
+ async onEnd(result) {
71
+ await super.onEnd(result);
72
+ const zipFileName = await this._prepareOutputFile();
73
+ const zipFile = new import_zipBundle.yazl.ZipFile();
74
+ const zipFinishPromise = new import_utils2.ManualPromise();
75
+ const finishPromise = zipFinishPromise.catch((e) => {
76
+ throw new Error(`Failed to write report ${zipFileName}: ` + e.message);
77
+ });
78
+ zipFile.on("error", (error) => zipFinishPromise.reject(error));
79
+ zipFile.outputStream.pipe(import_fs.default.createWriteStream(zipFileName)).on("close", () => {
80
+ zipFinishPromise.resolve(void 0);
81
+ }).on("error", (error) => zipFinishPromise.reject(error));
82
+ for (const { originalPath, zipEntryPath } of this._attachments) {
83
+ if (!import_fs.default.statSync(originalPath, { throwIfNoEntry: false })?.isFile())
84
+ continue;
85
+ zipFile.addFile(originalPath, zipEntryPath);
86
+ }
87
+ const lines = this._messages.map((m) => JSON.stringify(m) + "\n");
88
+ const content = import_stream.Readable.from(lines);
89
+ zipFile.addReadStream(content, "report.jsonl");
90
+ zipFile.end();
91
+ await finishPromise;
92
+ }
93
+ async _prepareOutputFile() {
94
+ const { outputFile, outputDir } = (0, import_base.resolveOutputFile)("BLOB", {
95
+ ...this._options,
96
+ default: {
97
+ fileName: this._defaultReportName(this._config),
98
+ outputDir: "blob-report"
99
+ }
100
+ });
101
+ if (!process.env.PWTEST_BLOB_DO_NOT_REMOVE)
102
+ await (0, import_utils.removeFolders)([outputDir]);
103
+ await import_fs.default.promises.mkdir(import_path.default.dirname(outputFile), { recursive: true });
104
+ return outputFile;
105
+ }
106
+ _defaultReportName(config) {
107
+ let reportName = "report";
108
+ if (this._options._commandHash)
109
+ reportName += "-" + (0, import_utils.sanitizeForFilePath)(this._options._commandHash);
110
+ if (config.shard) {
111
+ const paddedNumber = `${config.shard.current}`.padStart(`${config.shard.total}`.length, "0");
112
+ reportName = `${reportName}-${paddedNumber}`;
113
+ }
114
+ return `${reportName}.zip`;
115
+ }
116
+ _serializeAttachments(attachments) {
117
+ return super._serializeAttachments(attachments).map((attachment) => {
118
+ if (!attachment.path)
119
+ return attachment;
120
+ const sha1 = (0, import_utils2.calculateSha1)(attachment.path + this._salt);
121
+ const extension = import_utilsBundle.mime.getExtension(attachment.contentType) || "dat";
122
+ const newPath = `resources/${sha1}.${extension}`;
123
+ this._attachments.push({ originalPath: attachment.path, zipEntryPath: newPath });
124
+ return {
125
+ ...attachment,
126
+ path: newPath
127
+ };
128
+ });
129
+ }
130
+ }
131
+ // Annotate the CommonJS export names for ESM import in node:
132
+ 0 && (module.exports = {
133
+ BlobReporter,
134
+ currentBlobReportVersion
135
+ });
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/reporters/blob.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';\nimport { Readable } from 'stream';\n\nimport { removeFolders, sanitizeForFilePath } from 'playwright-core/lib/utils';\nimport { ManualPromise, calculateSha1, createGuid, getUserAgent } from 'playwright-core/lib/utils';\nimport { mime } from 'playwright-core/lib/utilsBundle';\nimport { yazl } from 'playwright-core/lib/zipBundle';\n\nimport { resolveOutputFile, CommonReporterOptions } from './base';\nimport { TeleReporterEmitter } from './teleEmitter';\n\nimport type { BlobReporterOptions } from '../../types/test';\nimport type { FullConfig, FullResult, TestResult } from '../../types/testReporter';\nimport type { BlobReportMetadata, JsonAttachment, JsonEvent } from '../isomorphic/teleReceiver';\nimport type { EventEmitter } from 'events';\n\nexport const currentBlobReportVersion = 2;\n\nexport class BlobReporter extends TeleReporterEmitter {\n private readonly _messages: JsonEvent[] = [];\n private readonly _attachments: { originalPath: string, zipEntryPath: string }[] = [];\n private readonly _options: BlobReporterOptions & CommonReporterOptions;\n private readonly _salt: string;\n private _config!: FullConfig;\n\n constructor(options: BlobReporterOptions & CommonReporterOptions) {\n super(message => this._messages.push(message));\n this._options = options;\n if (this._options.fileName && !this._options.fileName.endsWith('.zip'))\n throw new Error(`Blob report file name must end with .zip extension: ${this._options.fileName}`);\n this._salt = createGuid();\n }\n\n override onConfigure(config: FullConfig) {\n const metadata: BlobReportMetadata = {\n version: currentBlobReportVersion,\n userAgent: getUserAgent(),\n name: process.env.PWTEST_BOT_NAME,\n shard: config.shard ?? undefined,\n pathSeparator: path.sep,\n };\n this._messages.push({\n method: 'onBlobReportMetadata',\n params: metadata\n });\n\n this._config = config;\n super.onConfigure(config);\n }\n\n override async onEnd(result: FullResult): Promise<void> {\n await super.onEnd(result);\n\n const zipFileName = await this._prepareOutputFile();\n\n const zipFile = new yazl.ZipFile();\n const zipFinishPromise = new ManualPromise<undefined>();\n const finishPromise = zipFinishPromise.catch(e => {\n throw new Error(`Failed to write report ${zipFileName}: ` + e.message);\n });\n\n (zipFile as any as EventEmitter).on('error', error => zipFinishPromise.reject(error));\n zipFile.outputStream.pipe(fs.createWriteStream(zipFileName)).on('close', () => {\n zipFinishPromise.resolve(undefined);\n }).on('error', error => zipFinishPromise.reject(error));\n\n for (const { originalPath, zipEntryPath } of this._attachments) {\n if (!fs.statSync(originalPath, { throwIfNoEntry: false })?.isFile())\n continue;\n zipFile.addFile(originalPath, zipEntryPath);\n }\n\n const lines = this._messages.map(m => JSON.stringify(m) + '\\n');\n const content = Readable.from(lines);\n zipFile.addReadStream(content, 'report.jsonl');\n zipFile.end();\n\n await finishPromise;\n }\n\n private async _prepareOutputFile() {\n const { outputFile, outputDir } = resolveOutputFile('BLOB', {\n ...this._options,\n default: {\n fileName: this._defaultReportName(this._config),\n outputDir: 'blob-report',\n }\n })!;\n if (!process.env.PWTEST_BLOB_DO_NOT_REMOVE)\n await removeFolders([outputDir!]);\n await fs.promises.mkdir(path.dirname(outputFile), { recursive: true });\n return outputFile;\n }\n\n private _defaultReportName(config: FullConfig) {\n let reportName = 'report';\n if (this._options._commandHash)\n reportName += '-' + sanitizeForFilePath(this._options._commandHash);\n if (config.shard) {\n const paddedNumber = `${config.shard.current}`.padStart(`${config.shard.total}`.length, '0');\n reportName = `${reportName}-${paddedNumber}`;\n }\n return `${reportName}.zip`;\n }\n\n override _serializeAttachments(attachments: TestResult['attachments']): JsonAttachment[] {\n return super._serializeAttachments(attachments).map(attachment => {\n if (!attachment.path)\n return attachment;\n // Add run guid to avoid clashes between shards.\n const sha1 = calculateSha1(attachment.path + this._salt);\n const extension = mime.getExtension(attachment.contentType) || 'dat';\n const newPath = `resources/${sha1}.${extension}`;\n this._attachments.push({ originalPath: attachment.path, zipEntryPath: newPath });\n return {\n ...attachment,\n path: newPath,\n };\n });\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBA,gBAAe;AACf,kBAAiB;AACjB,oBAAyB;AAEzB,mBAAmD;AACnD,IAAAA,gBAAuE;AACvE,yBAAqB;AACrB,uBAAqB;AAErB,kBAAyD;AACzD,yBAAoC;AAO7B,MAAM,2BAA2B;AAEjC,MAAM,qBAAqB,uCAAoB;AAAA,EAOpD,YAAY,SAAsD;AAChE,UAAM,aAAW,KAAK,UAAU,KAAK,OAAO,CAAC;AAP/C,SAAiB,YAAyB,CAAC;AAC3C,SAAiB,eAAiE,CAAC;AAOjF,SAAK,WAAW;AAChB,QAAI,KAAK,SAAS,YAAY,CAAC,KAAK,SAAS,SAAS,SAAS,MAAM;AACnE,YAAM,IAAI,MAAM,uDAAuD,KAAK,SAAS,QAAQ,EAAE;AACjG,SAAK,YAAQ,0BAAW;AAAA,EAC1B;AAAA,EAES,YAAY,QAAoB;AACvC,UAAM,WAA+B;AAAA,MACnC,SAAS;AAAA,MACT,eAAW,4BAAa;AAAA,MACxB,MAAM,QAAQ,IAAI;AAAA,MAClB,OAAO,OAAO,SAAS;AAAA,MACvB,eAAe,YAAAC,QAAK;AAAA,IACtB;AACA,SAAK,UAAU,KAAK;AAAA,MAClB,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV,CAAC;AAED,SAAK,UAAU;AACf,UAAM,YAAY,MAAM;AAAA,EAC1B;AAAA,EAEA,MAAe,MAAM,QAAmC;AACtD,UAAM,MAAM,MAAM,MAAM;AAExB,UAAM,cAAc,MAAM,KAAK,mBAAmB;AAElD,UAAM,UAAU,IAAI,sBAAK,QAAQ;AACjC,UAAM,mBAAmB,IAAI,4BAAyB;AACtD,UAAM,gBAAgB,iBAAiB,MAAM,OAAK;AAChD,YAAM,IAAI,MAAM,0BAA0B,WAAW,OAAO,EAAE,OAAO;AAAA,IACvE,CAAC;AAED,IAAC,QAAgC,GAAG,SAAS,WAAS,iBAAiB,OAAO,KAAK,CAAC;AACpF,YAAQ,aAAa,KAAK,UAAAC,QAAG,kBAAkB,WAAW,CAAC,EAAE,GAAG,SAAS,MAAM;AAC7E,uBAAiB,QAAQ,MAAS;AAAA,IACpC,CAAC,EAAE,GAAG,SAAS,WAAS,iBAAiB,OAAO,KAAK,CAAC;AAEtD,eAAW,EAAE,cAAc,aAAa,KAAK,KAAK,cAAc;AAC9D,UAAI,CAAC,UAAAA,QAAG,SAAS,cAAc,EAAE,gBAAgB,MAAM,CAAC,GAAG,OAAO;AAChE;AACF,cAAQ,QAAQ,cAAc,YAAY;AAAA,IAC5C;AAEA,UAAM,QAAQ,KAAK,UAAU,IAAI,OAAK,KAAK,UAAU,CAAC,IAAI,IAAI;AAC9D,UAAM,UAAU,uBAAS,KAAK,KAAK;AACnC,YAAQ,cAAc,SAAS,cAAc;AAC7C,YAAQ,IAAI;AAEZ,UAAM;AAAA,EACR;AAAA,EAEA,MAAc,qBAAqB;AACjC,UAAM,EAAE,YAAY,UAAU,QAAI,+BAAkB,QAAQ;AAAA,MAC1D,GAAG,KAAK;AAAA,MACR,SAAS;AAAA,QACP,UAAU,KAAK,mBAAmB,KAAK,OAAO;AAAA,QAC9C,WAAW;AAAA,MACb;AAAA,IACF,CAAC;AACD,QAAI,CAAC,QAAQ,IAAI;AACf,gBAAM,4BAAc,CAAC,SAAU,CAAC;AAClC,UAAM,UAAAA,QAAG,SAAS,MAAM,YAAAD,QAAK,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AACrE,WAAO;AAAA,EACT;AAAA,EAEQ,mBAAmB,QAAoB;AAC7C,QAAI,aAAa;AACjB,QAAI,KAAK,SAAS;AAChB,oBAAc,UAAM,kCAAoB,KAAK,SAAS,YAAY;AACpE,QAAI,OAAO,OAAO;AAChB,YAAM,eAAe,GAAG,OAAO,MAAM,OAAO,GAAG,SAAS,GAAG,OAAO,MAAM,KAAK,GAAG,QAAQ,GAAG;AAC3F,mBAAa,GAAG,UAAU,IAAI,YAAY;AAAA,IAC5C;AACA,WAAO,GAAG,UAAU;AAAA,EACtB;AAAA,EAES,sBAAsB,aAA0D;AACvF,WAAO,MAAM,sBAAsB,WAAW,EAAE,IAAI,gBAAc;AAChE,UAAI,CAAC,WAAW;AACd,eAAO;AAET,YAAM,WAAO,6BAAc,WAAW,OAAO,KAAK,KAAK;AACvD,YAAM,YAAY,wBAAK,aAAa,WAAW,WAAW,KAAK;AAC/D,YAAM,UAAU,aAAa,IAAI,IAAI,SAAS;AAC9C,WAAK,aAAa,KAAK,EAAE,cAAc,WAAW,MAAM,cAAc,QAAQ,CAAC;AAC/E,aAAO;AAAA,QACL,GAAG;AAAA,QACH,MAAM;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AACF;",
6
+ "names": ["import_utils", "path", "fs"]
7
+ }
@@ -0,0 +1,82 @@
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 dot_exports = {};
20
+ __export(dot_exports, {
21
+ default: () => dot_default
22
+ });
23
+ module.exports = __toCommonJS(dot_exports);
24
+ var import_base = require("./base");
25
+ class DotReporter extends import_base.TerminalReporter {
26
+ constructor() {
27
+ super(...arguments);
28
+ this._counter = 0;
29
+ }
30
+ onBegin(suite) {
31
+ super.onBegin(suite);
32
+ this.writeLine(this.generateStartingMessage());
33
+ }
34
+ onStdOut(chunk, test, result) {
35
+ super.onStdOut(chunk, test, result);
36
+ if (!this.config.quiet)
37
+ this.screen.stdout.write(chunk);
38
+ }
39
+ onStdErr(chunk, test, result) {
40
+ super.onStdErr(chunk, test, result);
41
+ if (!this.config.quiet)
42
+ this.screen.stderr.write(chunk);
43
+ }
44
+ onTestEnd(test, result) {
45
+ super.onTestEnd(test, result);
46
+ if (this._counter === 80) {
47
+ this.screen.stdout.write("\n");
48
+ this._counter = 0;
49
+ }
50
+ ++this._counter;
51
+ if (result.status === "skipped") {
52
+ this.screen.stdout.write(this.screen.colors.yellow("\xB0"));
53
+ return;
54
+ }
55
+ if (this.willRetry(test)) {
56
+ this.screen.stdout.write(this.screen.colors.gray("\xD7"));
57
+ return;
58
+ }
59
+ switch (test.outcome()) {
60
+ case "expected":
61
+ this.screen.stdout.write(this.screen.colors.green("\xB7"));
62
+ break;
63
+ case "unexpected":
64
+ this.screen.stdout.write(this.screen.colors.red(result.status === "timedOut" ? "T" : "F"));
65
+ break;
66
+ case "flaky":
67
+ this.screen.stdout.write(this.screen.colors.yellow("\xB1"));
68
+ break;
69
+ }
70
+ }
71
+ onError(error) {
72
+ super.onError(error);
73
+ this.writeLine("\n" + this.formatError(error).message);
74
+ this._counter = 0;
75
+ }
76
+ async onEnd(result) {
77
+ await super.onEnd(result);
78
+ this.screen.stdout.write("\n");
79
+ this.epilogue(true);
80
+ }
81
+ }
82
+ var dot_default = DotReporter;
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/reporters/dot.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 { TerminalReporter } from './base';\n\nimport type { FullResult, Suite, TestCase, TestError, TestResult } from '../../types/testReporter';\n\nclass DotReporter extends TerminalReporter {\n private _counter = 0;\n\n override onBegin(suite: Suite) {\n super.onBegin(suite);\n this.writeLine(this.generateStartingMessage());\n }\n\n override onStdOut(chunk: string | Buffer, test?: TestCase, result?: TestResult) {\n super.onStdOut(chunk, test, result);\n if (!this.config.quiet)\n this.screen.stdout.write(chunk);\n }\n\n override onStdErr(chunk: string | Buffer, test?: TestCase, result?: TestResult) {\n super.onStdErr(chunk, test, result);\n if (!this.config.quiet)\n this.screen.stderr.write(chunk);\n }\n\n override onTestEnd(test: TestCase, result: TestResult) {\n super.onTestEnd(test, result);\n if (this._counter === 80) {\n this.screen.stdout.write('\\n');\n this._counter = 0;\n }\n ++this._counter;\n if (result.status === 'skipped') {\n this.screen.stdout.write(this.screen.colors.yellow('\u00B0'));\n return;\n }\n if (this.willRetry(test)) {\n this.screen.stdout.write(this.screen.colors.gray('\u00D7'));\n return;\n }\n switch (test.outcome()) {\n case 'expected': this.screen.stdout.write(this.screen.colors.green('\u00B7')); break;\n case 'unexpected': this.screen.stdout.write(this.screen.colors.red(result.status === 'timedOut' ? 'T' : 'F')); break;\n case 'flaky': this.screen.stdout.write(this.screen.colors.yellow('\u00B1')); break;\n }\n }\n\n override onError(error: TestError): void {\n super.onError(error);\n this.writeLine('\\n' + this.formatError(error).message);\n this._counter = 0;\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\nexport default DotReporter;\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBA,kBAAiC;AAIjC,MAAM,oBAAoB,6BAAiB;AAAA,EAA3C;AAAA;AACE,SAAQ,WAAW;AAAA;AAAA,EAEV,QAAQ,OAAc;AAC7B,UAAM,QAAQ,KAAK;AACnB,SAAK,UAAU,KAAK,wBAAwB,CAAC;AAAA,EAC/C;AAAA,EAES,SAAS,OAAwB,MAAiB,QAAqB;AAC9E,UAAM,SAAS,OAAO,MAAM,MAAM;AAClC,QAAI,CAAC,KAAK,OAAO;AACf,WAAK,OAAO,OAAO,MAAM,KAAK;AAAA,EAClC;AAAA,EAES,SAAS,OAAwB,MAAiB,QAAqB;AAC9E,UAAM,SAAS,OAAO,MAAM,MAAM;AAClC,QAAI,CAAC,KAAK,OAAO;AACf,WAAK,OAAO,OAAO,MAAM,KAAK;AAAA,EAClC;AAAA,EAES,UAAU,MAAgB,QAAoB;AACrD,UAAM,UAAU,MAAM,MAAM;AAC5B,QAAI,KAAK,aAAa,IAAI;AACxB,WAAK,OAAO,OAAO,MAAM,IAAI;AAC7B,WAAK,WAAW;AAAA,IAClB;AACA,MAAE,KAAK;AACP,QAAI,OAAO,WAAW,WAAW;AAC/B,WAAK,OAAO,OAAO,MAAM,KAAK,OAAO,OAAO,OAAO,MAAG,CAAC;AACvD;AAAA,IACF;AACA,QAAI,KAAK,UAAU,IAAI,GAAG;AACxB,WAAK,OAAO,OAAO,MAAM,KAAK,OAAO,OAAO,KAAK,MAAG,CAAC;AACrD;AAAA,IACF;AACA,YAAQ,KAAK,QAAQ,GAAG;AAAA,MACtB,KAAK;AAAY,aAAK,OAAO,OAAO,MAAM,KAAK,OAAO,OAAO,MAAM,MAAG,CAAC;AAAG;AAAA,MAC1E,KAAK;AAAc,aAAK,OAAO,OAAO,MAAM,KAAK,OAAO,OAAO,IAAI,OAAO,WAAW,aAAa,MAAM,GAAG,CAAC;AAAG;AAAA,MAC/G,KAAK;AAAS,aAAK,OAAO,OAAO,MAAM,KAAK,OAAO,OAAO,OAAO,MAAG,CAAC;AAAG;AAAA,IAC1E;AAAA,EACF;AAAA,EAES,QAAQ,OAAwB;AACvC,UAAM,QAAQ,KAAK;AACnB,SAAK,UAAU,OAAO,KAAK,YAAY,KAAK,EAAE,OAAO;AACrD,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,MAAe,MAAM,QAAoB;AACvC,UAAM,MAAM,MAAM,MAAM;AACxB,SAAK,OAAO,OAAO,MAAM,IAAI;AAC7B,SAAK,SAAS,IAAI;AAAA,EACpB;AACF;AAEA,IAAO,cAAQ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,32 @@
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 empty_exports = {};
20
+ __export(empty_exports, {
21
+ default: () => empty_default
22
+ });
23
+ module.exports = __toCommonJS(empty_exports);
24
+ class EmptyReporter {
25
+ version() {
26
+ return "v2";
27
+ }
28
+ printsToStdio() {
29
+ return false;
30
+ }
31
+ }
32
+ var empty_default = EmptyReporter;
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/reporters/empty.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 type { ReporterV2 } from './reporterV2';\n\nclass EmptyReporter implements ReporterV2 {\n version(): 'v2' {\n return 'v2';\n }\n\n printsToStdio() {\n return false;\n }\n}\n\nexport default EmptyReporter;\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBA,MAAM,cAAoC;AAAA,EACxC,UAAgB;AACd,WAAO;AAAA,EACT;AAAA,EAEA,gBAAgB;AACd,WAAO;AAAA,EACT;AACF;AAEA,IAAO,gBAAQ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,128 @@
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 github_exports = {};
30
+ __export(github_exports, {
31
+ GitHubReporter: () => GitHubReporter,
32
+ default: () => github_default
33
+ });
34
+ module.exports = __toCommonJS(github_exports);
35
+ var import_path = __toESM(require("path"));
36
+ var import_utils = require("playwright-core/lib/utils");
37
+ var import_utilsBundle = require("playwright-core/lib/utilsBundle");
38
+ var import_base = require("./base");
39
+ var import_util = require("../util");
40
+ class GitHubLogger {
41
+ _log(message, type = "notice", options = {}) {
42
+ message = message.replace(/\n/g, "%0A");
43
+ const configs = Object.entries(options).map(([key, option]) => `${key}=${option}`).join(",");
44
+ process.stdout.write((0, import_util.stripAnsiEscapes)(`::${type} ${configs}::${message}
45
+ `));
46
+ }
47
+ debug(message, options) {
48
+ this._log(message, "debug", options);
49
+ }
50
+ error(message, options) {
51
+ this._log(message, "error", options);
52
+ }
53
+ notice(message, options) {
54
+ this._log(message, "notice", options);
55
+ }
56
+ warning(message, options) {
57
+ this._log(message, "warning", options);
58
+ }
59
+ }
60
+ class GitHubReporter extends import_base.TerminalReporter {
61
+ constructor(options = {}) {
62
+ super(options);
63
+ this.githubLogger = new GitHubLogger();
64
+ this.screen = { ...this.screen, colors: import_utils.noColors };
65
+ }
66
+ printsToStdio() {
67
+ return false;
68
+ }
69
+ async onEnd(result) {
70
+ await super.onEnd(result);
71
+ this._printAnnotations();
72
+ }
73
+ onError(error) {
74
+ const errorMessage = this.formatError(error).message;
75
+ this.githubLogger.error(errorMessage);
76
+ }
77
+ _printAnnotations() {
78
+ const summary = this.generateSummary();
79
+ const summaryMessage = this.generateSummaryMessage(summary);
80
+ if (summary.failuresToPrint.length)
81
+ this._printFailureAnnotations(summary.failuresToPrint);
82
+ this._printSlowTestAnnotations();
83
+ this._printSummaryAnnotation(summaryMessage);
84
+ }
85
+ _printSlowTestAnnotations() {
86
+ this.getSlowTests().forEach(([file, duration]) => {
87
+ const filePath = workspaceRelativePath(import_path.default.join(process.cwd(), file));
88
+ this.githubLogger.warning(`${filePath} took ${(0, import_utilsBundle.ms)(duration)}`, {
89
+ title: "Slow Test",
90
+ file: filePath
91
+ });
92
+ });
93
+ }
94
+ _printSummaryAnnotation(summary) {
95
+ this.githubLogger.notice(summary, {
96
+ title: "\u{1F3AD} Playwright Run Summary"
97
+ });
98
+ }
99
+ _printFailureAnnotations(failures) {
100
+ failures.forEach((test, index) => {
101
+ const title = this.formatTestTitle(test);
102
+ const header = this.formatTestHeader(test, { indent: " ", index: index + 1, mode: "error" });
103
+ for (const result of test.results) {
104
+ const errors = (0, import_base.formatResultFailure)(this.screen, test, result, " ");
105
+ for (const error of errors) {
106
+ const options = {
107
+ file: workspaceRelativePath(error.location?.file || test.location.file),
108
+ title
109
+ };
110
+ if (error.location) {
111
+ options.line = error.location.line;
112
+ options.col = error.location.column;
113
+ }
114
+ const message = [header, ...(0, import_base.formatRetry)(this.screen, result), error.message].join("\n");
115
+ this.githubLogger.error(message, options);
116
+ }
117
+ }
118
+ });
119
+ }
120
+ }
121
+ function workspaceRelativePath(filePath) {
122
+ return import_path.default.relative(process.env["GITHUB_WORKSPACE"] ?? "", filePath);
123
+ }
124
+ var github_default = GitHubReporter;
125
+ // Annotate the CommonJS export names for ESM import in node:
126
+ 0 && (module.exports = {
127
+ GitHubReporter
128
+ });
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/reporters/github.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 path from 'path';\n\nimport { noColors } from 'playwright-core/lib/utils';\nimport { ms as milliseconds } from 'playwright-core/lib/utilsBundle';\n\nimport { TerminalReporter, formatResultFailure, formatRetry } from './base';\nimport { stripAnsiEscapes } from '../util';\n\nimport type { FullResult, TestCase, TestError } from '../../types/testReporter';\n\ntype GitHubLogType = 'debug' | 'notice' | 'warning' | 'error';\n\ntype GitHubLogOptions = Partial<{\n title: string;\n file: string;\n col: number;\n endColumn: number;\n line: number;\n endLine: number;\n}>;\n\nclass GitHubLogger {\n private _log(message: string, type: GitHubLogType = 'notice', options: GitHubLogOptions = {}) {\n message = message.replace(/\\n/g, '%0A');\n const configs = Object.entries(options)\n .map(([key, option]) => `${key}=${option}`)\n .join(',');\n // eslint-disable-next-line no-restricted-properties\n process.stdout.write(stripAnsiEscapes(`::${type} ${configs}::${message}\\n`));\n }\n\n debug(message: string, options?: GitHubLogOptions) {\n this._log(message, 'debug', options);\n }\n\n error(message: string, options?: GitHubLogOptions) {\n this._log(message, 'error', options);\n }\n\n notice(message: string, options?: GitHubLogOptions) {\n this._log(message, 'notice', options);\n }\n\n warning(message: string, options?: GitHubLogOptions) {\n this._log(message, 'warning', options);\n }\n}\n\nexport class GitHubReporter extends TerminalReporter {\n githubLogger = new GitHubLogger();\n\n constructor(options: { omitFailures?: boolean } = {}) {\n super(options);\n this.screen = { ...this.screen, colors: noColors };\n }\n\n printsToStdio() {\n return false;\n }\n\n override async onEnd(result: FullResult) {\n await super.onEnd(result);\n this._printAnnotations();\n }\n\n override onError(error: TestError) {\n const errorMessage = this.formatError(error).message;\n this.githubLogger.error(errorMessage);\n }\n\n private _printAnnotations() {\n const summary = this.generateSummary();\n const summaryMessage = this.generateSummaryMessage(summary);\n if (summary.failuresToPrint.length)\n this._printFailureAnnotations(summary.failuresToPrint);\n this._printSlowTestAnnotations();\n this._printSummaryAnnotation(summaryMessage);\n }\n\n private _printSlowTestAnnotations() {\n this.getSlowTests().forEach(([file, duration]) => {\n const filePath = workspaceRelativePath(path.join(process.cwd(), file));\n this.githubLogger.warning(`${filePath} took ${milliseconds(duration)}`, {\n title: 'Slow Test',\n file: filePath,\n });\n });\n }\n\n private _printSummaryAnnotation(summary: string){\n this.githubLogger.notice(summary, {\n title: '\uD83C\uDFAD Playwright Run Summary'\n });\n }\n\n private _printFailureAnnotations(failures: TestCase[]) {\n failures.forEach((test, index) => {\n const title = this.formatTestTitle(test);\n const header = this.formatTestHeader(test, { indent: ' ', index: index + 1, mode: 'error' });\n for (const result of test.results) {\n const errors = formatResultFailure(this.screen, test, result, ' ');\n for (const error of errors) {\n const options: GitHubLogOptions = {\n file: workspaceRelativePath(error.location?.file || test.location.file),\n title,\n };\n if (error.location) {\n options.line = error.location.line;\n options.col = error.location.column;\n }\n const message = [header, ...formatRetry(this.screen, result), error.message].join('\\n');\n this.githubLogger.error(message, options);\n }\n }\n });\n }\n}\n\nfunction workspaceRelativePath(filePath: string): string {\n return path.relative(process.env['GITHUB_WORKSPACE'] ?? '', filePath);\n}\n\nexport default GitHubReporter;\n"],
5
+ "mappings": "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",
6
+ "names": ["path", "milliseconds"]
7
+ }