testplane 9.1.0 → 9.2.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 (275) hide show
  1. package/build/package.json +3 -3
  2. package/build/src/base-testplane.d.ts +17 -1
  3. package/build/src/base-testplane.js +43 -9
  4. package/build/src/base-testplane.js.map +1 -1
  5. package/build/src/browser/browser.d.ts +3 -0
  6. package/build/src/browser/browser.js +4 -2
  7. package/build/src/browser/browser.js.map +1 -1
  8. package/build/src/browser/cdp/selectivity/click-command-guard.d.ts +10 -0
  9. package/build/src/browser/cdp/selectivity/click-command-guard.js +57 -0
  10. package/build/src/browser/cdp/selectivity/click-command-guard.js.map +1 -0
  11. package/build/src/browser/cdp/selectivity/coverage-hooks.d.ts +13 -0
  12. package/build/src/browser/cdp/selectivity/coverage-hooks.js +43 -0
  13. package/build/src/browser/cdp/selectivity/coverage-hooks.js.map +1 -0
  14. package/build/src/browser/cdp/selectivity/index.js +61 -33
  15. package/build/src/browser/cdp/selectivity/index.js.map +1 -1
  16. package/build/src/browser/cdp/selectivity/js-selectivity.d.ts +1 -0
  17. package/build/src/browser/cdp/selectivity/js-selectivity.js +26 -18
  18. package/build/src/browser/cdp/selectivity/js-selectivity.js.map +1 -1
  19. package/build/src/browser/cdp/selectivity/navigation-guard.d.ts +18 -0
  20. package/build/src/browser/cdp/selectivity/navigation-guard.js +234 -0
  21. package/build/src/browser/cdp/selectivity/navigation-guard.js.map +1 -0
  22. package/build/src/browser/cdp/selectivity/testplane-selectivity.js +19 -19
  23. package/build/src/browser/cdp/selectivity/testplane-selectivity.js.map +1 -1
  24. package/build/src/browser/client-scripts/screen-shooter/build/bundle.compat.js +2 -2
  25. package/build/src/browser/client-scripts/screen-shooter/build/bundle.native.js +2 -2
  26. package/build/src/browser/client-scripts/screen-shooter/tsc-out/client-scripts/screen-shooter/implementation.js +52 -84
  27. package/build/src/browser/client-scripts/screen-shooter/tsc-out/client-scripts/screen-shooter/operations.js +4 -1
  28. package/build/src/browser/commands/assert-view/index.js +25 -2
  29. package/build/src/browser/commands/assert-view/index.js.map +1 -1
  30. package/build/src/browser/existing-browser.js +8 -1
  31. package/build/src/browser/existing-browser.js.map +1 -1
  32. package/build/src/browser/history/index.d.ts +4 -2
  33. package/build/src/browser/history/index.js +146 -67
  34. package/build/src/browser/history/index.js.map +1 -1
  35. package/build/src/browser/new-browser.js +1 -1
  36. package/build/src/browser/new-browser.js.map +1 -1
  37. package/build/src/browser/screen-shooter/elements-screen-shooter.d.ts +5 -0
  38. package/build/src/browser/screen-shooter/elements-screen-shooter.js +102 -55
  39. package/build/src/browser/screen-shooter/elements-screen-shooter.js.map +1 -1
  40. package/build/src/browser/screen-shooter/viewport-screen-shooter.d.ts +4 -0
  41. package/build/src/browser/screen-shooter/viewport-screen-shooter.js +29 -7
  42. package/build/src/browser/screen-shooter/viewport-screen-shooter.js.map +1 -1
  43. package/build/src/browser-pool/basic-pool.d.ts +4 -3
  44. package/build/src/browser-pool/basic-pool.js +39 -7
  45. package/build/src/browser-pool/basic-pool.js.map +1 -1
  46. package/build/src/browser-pool/caching-pool.d.ts +3 -2
  47. package/build/src/browser-pool/caching-pool.js +19 -7
  48. package/build/src/browser-pool/caching-pool.js.map +1 -1
  49. package/build/src/browser-pool/index.d.ts +2 -1
  50. package/build/src/browser-pool/index.js +8 -4
  51. package/build/src/browser-pool/index.js.map +1 -1
  52. package/build/src/browser-pool/limited-pool.d.ts +5 -1
  53. package/build/src/browser-pool/limited-pool.js +42 -4
  54. package/build/src/browser-pool/limited-pool.js.map +1 -1
  55. package/build/src/browser-pool/per-browser-limited-pool.d.ts +2 -2
  56. package/build/src/browser-pool/per-browser-limited-pool.js +2 -1
  57. package/build/src/browser-pool/per-browser-limited-pool.js.map +1 -1
  58. package/build/src/browser-pool/types.d.ts +8 -0
  59. package/build/src/cli/commands/config/index.js +7 -3
  60. package/build/src/cli/commands/config/index.js.map +1 -1
  61. package/build/src/cli/commands/install-deps/index.js +46 -38
  62. package/build/src/cli/commands/install-deps/index.js.map +1 -1
  63. package/build/src/cli/commands/list-browsers/index.js +15 -11
  64. package/build/src/cli/commands/list-browsers/index.js.map +1 -1
  65. package/build/src/cli/commands/list-tests/index.js +25 -21
  66. package/build/src/cli/commands/list-tests/index.js.map +1 -1
  67. package/build/src/cli/commands/selectivity-merge-dumps/index.js +12 -5
  68. package/build/src/cli/commands/selectivity-merge-dumps/index.js.map +1 -1
  69. package/build/src/cli/index.js +10 -6
  70. package/build/src/cli/index.js.map +1 -1
  71. package/build/src/config/defaults.d.ts +5 -0
  72. package/build/src/config/defaults.js +4 -0
  73. package/build/src/config/defaults.js.map +1 -1
  74. package/build/src/config/index.d.ts +6 -4
  75. package/build/src/config/index.js +60 -19
  76. package/build/src/config/index.js.map +1 -1
  77. package/build/src/config/options.js +26 -0
  78. package/build/src/config/options.js.map +1 -1
  79. package/build/src/config/types.d.ts +19 -0
  80. package/build/src/constants/process-messages.d.ts +3 -0
  81. package/build/src/constants/process-messages.js +4 -1
  82. package/build/src/constants/process-messages.js.map +1 -1
  83. package/build/src/events/async-emitter/index.d.ts +38 -0
  84. package/build/src/events/async-emitter/index.js +248 -5
  85. package/build/src/events/async-emitter/index.js.map +1 -1
  86. package/build/src/events/index.d.ts +3 -0
  87. package/build/src/events/index.js +1 -0
  88. package/build/src/events/index.js.map +1 -1
  89. package/build/src/index.d.ts +2 -1
  90. package/build/src/profiler/analysis/aggregator.d.ts +19 -0
  91. package/build/src/profiler/analysis/aggregator.js +229 -0
  92. package/build/src/profiler/analysis/aggregator.js.map +1 -0
  93. package/build/src/profiler/analysis/analyzers.d.ts +10 -0
  94. package/build/src/profiler/analysis/analyzers.js +1228 -0
  95. package/build/src/profiler/analysis/analyzers.js.map +1 -0
  96. package/build/src/profiler/analysis/compact.d.ts +5 -0
  97. package/build/src/profiler/analysis/compact.js +46 -0
  98. package/build/src/profiler/analysis/compact.js.map +1 -0
  99. package/build/src/profiler/analysis/finding-order.d.ts +4 -0
  100. package/build/src/profiler/analysis/finding-order.js +28 -0
  101. package/build/src/profiler/analysis/finding-order.js.map +1 -0
  102. package/build/src/profiler/analysis/outliers.d.ts +6 -0
  103. package/build/src/profiler/analysis/outliers.js +49 -0
  104. package/build/src/profiler/analysis/outliers.js.map +1 -0
  105. package/build/src/profiler/analysis/policy-v1.d.ts +71 -0
  106. package/build/src/profiler/analysis/policy-v1.js +43 -0
  107. package/build/src/profiler/analysis/policy-v1.js.map +1 -0
  108. package/build/src/profiler/collectors/module-graph.d.ts +14 -0
  109. package/build/src/profiler/collectors/module-graph.js +99 -0
  110. package/build/src/profiler/collectors/module-graph.js.map +1 -0
  111. package/build/src/profiler/collectors/pool-observer.d.ts +9 -0
  112. package/build/src/profiler/collectors/pool-observer.js +40 -0
  113. package/build/src/profiler/collectors/pool-observer.js.map +1 -0
  114. package/build/src/profiler/manager.d.ts +55 -0
  115. package/build/src/profiler/manager.js +343 -0
  116. package/build/src/profiler/manager.js.map +1 -0
  117. package/build/src/profiler/output/console.d.ts +6 -0
  118. package/build/src/profiler/output/console.js +443 -0
  119. package/build/src/profiler/output/console.js.map +1 -0
  120. package/build/src/profiler/output/json.d.ts +2 -0
  121. package/build/src/profiler/output/json.js +24 -0
  122. package/build/src/profiler/output/json.js.map +1 -0
  123. package/build/src/profiler/retention/operation-store.d.ts +22 -0
  124. package/build/src/profiler/retention/operation-store.js +110 -0
  125. package/build/src/profiler/retention/operation-store.js.map +1 -0
  126. package/build/src/profiler/retention/policy-v1.d.ts +22 -0
  127. package/build/src/profiler/retention/policy-v1.js +49 -0
  128. package/build/src/profiler/retention/policy-v1.js.map +1 -0
  129. package/build/src/profiler/retention/result-budget.d.ts +2 -0
  130. package/build/src/profiler/retention/result-budget.js +117 -0
  131. package/build/src/profiler/retention/result-budget.js.map +1 -0
  132. package/build/src/profiler/retention/serialized-budget.d.ts +5 -0
  133. package/build/src/profiler/retention/serialized-budget.js +58 -0
  134. package/build/src/profiler/retention/serialized-budget.js.map +1 -0
  135. package/build/src/profiler/retention/streaming-statistics.d.ts +38 -0
  136. package/build/src/profiler/retention/streaming-statistics.js +191 -0
  137. package/build/src/profiler/retention/streaming-statistics.js.map +1 -0
  138. package/build/src/profiler/retention/top-k.d.ts +13 -0
  139. package/build/src/profiler/retention/top-k.js +57 -0
  140. package/build/src/profiler/retention/top-k.js.map +1 -0
  141. package/build/src/profiler/runtime/async-activity.d.ts +19 -0
  142. package/build/src/profiler/runtime/async-activity.js +113 -0
  143. package/build/src/profiler/runtime/async-activity.js.map +1 -0
  144. package/build/src/profiler/runtime/bootstrap-probe.d.ts +42 -0
  145. package/build/src/profiler/runtime/bootstrap-probe.js +91 -0
  146. package/build/src/profiler/runtime/bootstrap-probe.js.map +1 -0
  147. package/build/src/profiler/runtime/clock.d.ts +22 -0
  148. package/build/src/profiler/runtime/clock.js +15 -0
  149. package/build/src/profiler/runtime/clock.js.map +1 -0
  150. package/build/src/profiler/runtime/event-observer.d.ts +4 -0
  151. package/build/src/profiler/runtime/event-observer.js +142 -0
  152. package/build/src/profiler/runtime/event-observer.js.map +1 -0
  153. package/build/src/profiler/runtime/noop.d.ts +20 -0
  154. package/build/src/profiler/runtime/noop.js +37 -0
  155. package/build/src/profiler/runtime/noop.js.map +1 -0
  156. package/build/src/profiler/runtime/runtime.d.ts +95 -0
  157. package/build/src/profiler/runtime/runtime.js +1343 -0
  158. package/build/src/profiler/runtime/runtime.js.map +1 -0
  159. package/build/src/profiler/runtime/types.d.ts +88 -0
  160. package/build/src/profiler/runtime/types.js +3 -0
  161. package/build/src/profiler/runtime/types.js.map +1 -0
  162. package/build/src/profiler/sanitize.d.ts +15 -0
  163. package/build/src/profiler/sanitize.js +194 -0
  164. package/build/src/profiler/sanitize.js.map +1 -0
  165. package/build/src/profiler/schema/index.d.ts +1 -0
  166. package/build/src/profiler/schema/index.js +18 -0
  167. package/build/src/profiler/schema/index.js.map +1 -0
  168. package/build/src/profiler/schema/v1.d.ts +281 -0
  169. package/build/src/profiler/schema/v1.js +3 -0
  170. package/build/src/profiler/schema/v1.js.map +1 -0
  171. package/build/src/runner/browser-env/vite/browser-modules/mocha/index.js +30 -0
  172. package/build/src/runner/browser-env/vite/browser-modules/mocha/index.js.map +1 -1
  173. package/build/src/runner/browser-env/vite/browser-modules/tsconfig.tsbuildinfo +1 -1
  174. package/build/src/runner/browser-env/vite/browser-modules/types.d.ts +31 -6
  175. package/build/src/runner/browser-env/vite/browser-modules/types.js +8 -8
  176. package/build/src/runner/browser-env/vite/browser-modules/types.js.map +1 -1
  177. package/build/src/runner/browser-env/vite/plugins/generate-index-html.d.ts +7 -1
  178. package/build/src/runner/browser-env/vite/plugins/generate-index-html.js +28 -6
  179. package/build/src/runner/browser-env/vite/plugins/generate-index-html.js.map +1 -1
  180. package/build/src/runner/browser-env/vite/server.js +17 -1
  181. package/build/src/runner/browser-env/vite/server.js.map +1 -1
  182. package/build/src/runner/browser-env/vite/socket.js +4 -0
  183. package/build/src/runner/browser-env/vite/socket.js.map +1 -1
  184. package/build/src/runner/browser-env/vite/types.d.ts +9 -7
  185. package/build/src/runner/browser-env/vite/types.js +8 -8
  186. package/build/src/runner/browser-env/vite/types.js.map +1 -1
  187. package/build/src/runner/browser-env/vite/utils.js +9 -2
  188. package/build/src/runner/browser-env/vite/utils.js.map +1 -1
  189. package/build/src/runner/browser-runner.d.ts +3 -1
  190. package/build/src/runner/browser-runner.js +4 -2
  191. package/build/src/runner/browser-runner.js.map +1 -1
  192. package/build/src/runner/index.d.ts +3 -1
  193. package/build/src/runner/index.js +7 -4
  194. package/build/src/runner/index.js.map +1 -1
  195. package/build/src/runner/test-runner/index.d.ts +2 -1
  196. package/build/src/runner/test-runner/index.js +2 -2
  197. package/build/src/runner/test-runner/index.js.map +1 -1
  198. package/build/src/runner/test-runner/insistant-test-runner.d.ts +2 -1
  199. package/build/src/runner/test-runner/insistant-test-runner.js +3 -2
  200. package/build/src/runner/test-runner/insistant-test-runner.js.map +1 -1
  201. package/build/src/runner/test-runner/regular-test-runner.d.ts +9 -3
  202. package/build/src/runner/test-runner/regular-test-runner.js +77 -16
  203. package/build/src/runner/test-runner/regular-test-runner.js.map +1 -1
  204. package/build/src/signal-handler.js +14 -5
  205. package/build/src/signal-handler.js.map +1 -1
  206. package/build/src/test-reader/index.d.ts +2 -1
  207. package/build/src/test-reader/index.js +19 -10
  208. package/build/src/test-reader/index.js.map +1 -1
  209. package/build/src/test-reader/mocha-reader/index.d.ts +2 -1
  210. package/build/src/test-reader/mocha-reader/index.js +41 -24
  211. package/build/src/test-reader/mocha-reader/index.js.map +1 -1
  212. package/build/src/test-reader/mocha-reader/tree-builder-decorator.js +2 -2
  213. package/build/src/test-reader/mocha-reader/tree-builder-decorator.js.map +1 -1
  214. package/build/src/test-reader/mocha-reader/utils.d.ts +2 -0
  215. package/build/src/test-reader/mocha-reader/utils.js +18 -2
  216. package/build/src/test-reader/mocha-reader/utils.js.map +1 -1
  217. package/build/src/test-reader/test-object/hook.d.ts +4 -2
  218. package/build/src/test-reader/test-object/hook.js +3 -1
  219. package/build/src/test-reader/test-object/hook.js.map +1 -1
  220. package/build/src/test-reader/test-parser.d.ts +2 -1
  221. package/build/src/test-reader/test-parser.js +48 -4
  222. package/build/src/test-reader/test-parser.js.map +1 -1
  223. package/build/src/testplane.d.ts +6 -2
  224. package/build/src/testplane.js +82 -27
  225. package/build/src/testplane.js.map +1 -1
  226. package/build/src/types/index.d.ts +4 -1
  227. package/build/src/types/index.js.map +1 -1
  228. package/build/src/utils/exit-code.d.ts +1 -0
  229. package/build/src/utils/exit-code.js +28 -0
  230. package/build/src/utils/exit-code.js.map +1 -0
  231. package/build/src/utils/module-observer-registry.d.ts +43 -0
  232. package/build/src/utils/module-observer-registry.js +257 -0
  233. package/build/src/utils/module-observer-registry.js.map +1 -0
  234. package/build/src/utils/processor.js +1 -0
  235. package/build/src/utils/processor.js.map +1 -1
  236. package/build/src/utils/workers-registry.d.ts +48 -1
  237. package/build/src/utils/workers-registry.js +162 -4
  238. package/build/src/utils/workers-registry.js.map +1 -1
  239. package/build/src/worker/browser-env/runner/test-runner/execution-thread.js +15 -1
  240. package/build/src/worker/browser-env/runner/test-runner/execution-thread.js.map +1 -1
  241. package/build/src/worker/browser-env/runner/test-runner/index.js +20 -0
  242. package/build/src/worker/browser-env/runner/test-runner/index.js.map +1 -1
  243. package/build/src/worker/index.js +39 -1
  244. package/build/src/worker/index.js.map +1 -1
  245. package/build/src/worker/runner/browser-pool.d.ts +3 -2
  246. package/build/src/worker/runner/browser-pool.js +5 -3
  247. package/build/src/worker/runner/browser-pool.js.map +1 -1
  248. package/build/src/worker/runner/caching-test-parser.d.ts +6 -1
  249. package/build/src/worker/runner/caching-test-parser.js +40 -4
  250. package/build/src/worker/runner/caching-test-parser.js.map +1 -1
  251. package/build/src/worker/runner/index.d.ts +10 -9
  252. package/build/src/worker/runner/index.js +52 -6
  253. package/build/src/worker/runner/index.js.map +1 -1
  254. package/build/src/worker/runner/sequence-test-parser.d.ts +4 -1
  255. package/build/src/worker/runner/sequence-test-parser.js +17 -3
  256. package/build/src/worker/runner/sequence-test-parser.js.map +1 -1
  257. package/build/src/worker/runner/simple-test-parser.d.ts +3 -1
  258. package/build/src/worker/runner/simple-test-parser.js +4 -2
  259. package/build/src/worker/runner/simple-test-parser.js.map +1 -1
  260. package/build/src/worker/runner/test-runner/execution-thread.d.ts +20 -2
  261. package/build/src/worker/runner/test-runner/execution-thread.js +37 -2
  262. package/build/src/worker/runner/test-runner/execution-thread.js.map +1 -1
  263. package/build/src/worker/runner/test-runner/hook-runner.d.ts +1 -1
  264. package/build/src/worker/runner/test-runner/hook-runner.js +4 -4
  265. package/build/src/worker/runner/test-runner/hook-runner.js.map +1 -1
  266. package/build/src/worker/runner/test-runner/index.d.ts +8 -7
  267. package/build/src/worker/runner/test-runner/index.js +36 -25
  268. package/build/src/worker/runner/test-runner/index.js.map +1 -1
  269. package/build/src/worker/runner/test-runner/types.d.ts +8 -1
  270. package/build/src/worker/testplane-facade.js +63 -4
  271. package/build/src/worker/testplane-facade.js.map +1 -1
  272. package/build/src/worker/testplane.d.ts +6 -0
  273. package/build/src/worker/testplane.js +7 -1
  274. package/build/src/worker/testplane.js.map +1 -1
  275. package/package.json +3 -3
@@ -0,0 +1,443 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.printProfilerResult = void 0;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const finding_order_1 = require("../analysis/finding-order");
9
+ const defaultConsole = {
10
+ log: message => console.log(message),
11
+ warn: message => console.warn(message),
12
+ };
13
+ const FINDING_LABELS = {
14
+ "long-run-v1": "Long test run",
15
+ "major-phase-v1": "Slow phase",
16
+ "unattributed-v1": "Unattributed time",
17
+ "event-listener-v1": "Slow event listener",
18
+ "test-file-v1": "Slow test file load",
19
+ "slow-test-v1": "Slow test",
20
+ "common-hook-v1": "Slow hook",
21
+ "browser-command-v1": "Slow command",
22
+ "browser-pause-v1": "Excessive pause",
23
+ "module-dependency-v1": "Slow dependency",
24
+ "worker-capacity-v1": "Worker capacity",
25
+ "session-concurrency-v1": "Session capacity",
26
+ "test-discovery-v1": "Slow test discovery",
27
+ "host-cpu-v1": "High host CPU",
28
+ "event-loop-delay-v1": "Event-loop delay",
29
+ };
30
+ const FINDING_GROUP_LABELS = {
31
+ "major-phase-v1": "Slow phases",
32
+ "event-listener-v1": "Slow event listeners",
33
+ "test-file-v1": "Slow test file loads",
34
+ "slow-test-v1": "Slow tests",
35
+ "common-hook-v1": "Slow hooks",
36
+ "browser-command-v1": "Slow commands",
37
+ "browser-pause-v1": "Excessive pauses",
38
+ "module-dependency-v1": "Slow dependencies",
39
+ };
40
+ const TABLE_FINDINGS = new Map([
41
+ ["slow-test-v1", "Test"],
42
+ ["common-hook-v1", "Hook"],
43
+ ["browser-command-v1", "Command"],
44
+ ]);
45
+ const CONFIDENCE_RANK = { high: 3, medium: 2, low: 1 };
46
+ const REPORT_WIDTH = 88;
47
+ const BAR_WIDTH = 13;
48
+ const ANSI_PATTERN = new RegExp(`${String.fromCharCode(27)}\\[[0-9;]*m`, "g");
49
+ const printProfilerResult = (result, output = defaultConsole) => {
50
+ output.log(renderReport(result));
51
+ };
52
+ exports.printProfilerResult = printProfilerResult;
53
+ function renderReport(result) {
54
+ const groups = groupFindings(sortFindings(result.findings));
55
+ const lines = [
56
+ `${profilerPrefix()} Test run profile`,
57
+ divider(),
58
+ "",
59
+ `Total time: ${chalk_1.default.red(formatDuration(result.run.durationMs))}`,
60
+ "",
61
+ "Execution breakdown",
62
+ ...renderExecutionBreakdown(result),
63
+ "",
64
+ "Performance findings",
65
+ "",
66
+ ];
67
+ if (!groups.length) {
68
+ lines.push("No significant bottlenecks were found by the current heuristics.", "", divider());
69
+ lines.push(`${profilerPrefix()} No performance findings`);
70
+ return lines.join("\n");
71
+ }
72
+ groups.forEach((group, index) => {
73
+ lines.push(...renderFindingGroup(group, index + 1));
74
+ lines.push("");
75
+ });
76
+ lines.push(divider());
77
+ lines.push(`${profilerPrefix()} ${formatFindingSummary(groups)}`);
78
+ return lines.join("\n");
79
+ }
80
+ function renderExecutionBreakdown(result) {
81
+ const phases = topLevelPhases(result.timeline)
82
+ .sort((left, right) => right.timing.wallMs - left.timing.wallMs)
83
+ .slice(0, 6);
84
+ if (!phases.length) {
85
+ return ["", " No lifecycle phases were retained."];
86
+ }
87
+ const rows = phases.map(phase => {
88
+ const ratio = result.run.durationMs > 0 ? phase.timing.wallMs / result.run.durationMs : 0;
89
+ const duration = formatDuration(phase.timing.wallMs);
90
+ return [
91
+ phase.name,
92
+ ratio >= 0.5 ? chalk_1.default.red(duration) : chalk_1.default.gray(duration),
93
+ formatPercent(ratio),
94
+ formatBar(ratio),
95
+ ];
96
+ });
97
+ return [
98
+ "",
99
+ ...renderTable([
100
+ { header: "Phase" },
101
+ { header: "Time", align: "right" },
102
+ { header: "Time %", align: "right" },
103
+ { header: "Bar" },
104
+ ], rows),
105
+ ];
106
+ }
107
+ function renderFindingGroup(group, position) {
108
+ const label = group.findings.length > 1 || TABLE_FINDINGS.has(group.analyzerId)
109
+ ? FINDING_GROUP_LABELS[group.analyzerId] ?? FINDING_LABELS[group.analyzerId] ?? "Performance notes"
110
+ : FINDING_LABELS[group.analyzerId] ?? "Performance note";
111
+ const entity = group.findings.length === 1 && !TABLE_FINDINGS.has(group.analyzerId)
112
+ ? findingEntity(group.findings[0])
113
+ : undefined;
114
+ const title = [`${position}.`, formatGroupConfidence(group.findings), "•", label];
115
+ if (entity) {
116
+ title.push("•", entity);
117
+ }
118
+ const lines = [title.join(" "), ""];
119
+ if (TABLE_FINDINGS.has(group.analyzerId)) {
120
+ lines.push(...renderSlowFindingTable(group.findings, TABLE_FINDINGS.get(group.analyzerId)));
121
+ if (group.analyzerId === "browser-command-v1") {
122
+ lines.push(...renderCommandSources(group.findings));
123
+ }
124
+ }
125
+ else if (group.analyzerId === "event-listener-v1") {
126
+ lines.push(...renderEventListenerFindings(group.findings));
127
+ }
128
+ else if (group.analyzerId === "test-discovery-v1" && group.findings.length === 1) {
129
+ lines.push(...renderTestDiscoveryFinding(group.findings[0]));
130
+ }
131
+ else if (group.findings.length === 1) {
132
+ lines.push(...indentWrapped(formatFindingText(group.findings[0].observation, group.findings[0]), 4));
133
+ }
134
+ else {
135
+ for (const finding of group.findings) {
136
+ lines.push(...indentWrapped(`• ${formatFindingText(finding.observation, finding)}`, 4));
137
+ }
138
+ }
139
+ const actions = [...new Set(group.findings.map(finding => plainFindingText(finding.action)))];
140
+ lines.push("", actions.length === 1 ? " Suggested action:" : " Suggested actions:");
141
+ if (actions.length === 1) {
142
+ lines.push(...indentWrapped(actions[0], 4));
143
+ }
144
+ else {
145
+ for (const action of actions) {
146
+ lines.push(...indentWrapped(`• ${action}`, 4));
147
+ }
148
+ }
149
+ return lines;
150
+ }
151
+ function renderEventListenerFindings(findings) {
152
+ const lines = [];
153
+ findings.forEach((finding, index) => {
154
+ const bullet = findings.length > 1 ? "• " : "";
155
+ lines.push(...indentWrapped(`${bullet}${formatFindingText(finding.observation, finding)}`, 4));
156
+ const activeJsMs = numericEvidence(finding, "activeJs");
157
+ const waitingMs = numericEvidence(finding, "waiting");
158
+ if (activeJsMs !== undefined && waitingMs !== undefined) {
159
+ const totalMs = Math.max(1, activeJsMs + waitingMs);
160
+ const breakdown = [
161
+ ["Active JS", activeJsMs],
162
+ ["Waiting", waitingMs],
163
+ ];
164
+ const rows = breakdown.map(([label, durationMs]) => {
165
+ const ratio = durationMs / totalMs;
166
+ return [
167
+ label,
168
+ colorByConfidence(formatDuration(durationMs), finding.confidence),
169
+ formatPercent(ratio),
170
+ formatBar(ratio),
171
+ ];
172
+ });
173
+ lines.push("", " Slowest call breakdown", ...renderTable([
174
+ { header: "Activity" },
175
+ { header: "Time", align: "right" },
176
+ { header: "Call %", align: "right" },
177
+ { header: "Bar" },
178
+ ], rows));
179
+ }
180
+ if (index < findings.length - 1) {
181
+ lines.push("");
182
+ }
183
+ });
184
+ return lines;
185
+ }
186
+ function renderTestDiscoveryFinding(finding) {
187
+ const lines = [...indentWrapped(formatFindingText(finding.observation, finding), 4)];
188
+ const phaseWallMs = numericEvidence(finding, "wall") ?? 0;
189
+ const components = [
190
+ ["Find test files (glob)", "discoveryGlobWall"],
191
+ ["Load test files", "fileLoadWall"],
192
+ ["Group, parse and validate", "testParseWall"],
193
+ ["Other", "otherDiscoveryWall"],
194
+ ];
195
+ const rows = components
196
+ .map(([label, metric]) => [label, numericEvidence(finding, metric) ?? 0])
197
+ .filter(([, wallMs]) => wallMs > 0)
198
+ .map(([label, wallMs]) => [
199
+ label,
200
+ colorByConfidence(formatDuration(wallMs), finding.confidence),
201
+ formatPercent(phaseWallMs > 0 ? wallMs / phaseWallMs : 0),
202
+ ]);
203
+ if (rows.length) {
204
+ lines.push("", " Breakdown", ...renderTable([{ header: "Component" }, { header: "Time", align: "right" }, { header: "Phase %", align: "right" }], rows));
205
+ }
206
+ const fileCount = numericEvidence(finding, "fileCount");
207
+ const averageFileLoadMs = numericEvidence(finding, "averageFileLoad");
208
+ if (fileCount === undefined && averageFileLoadMs === undefined) {
209
+ return lines;
210
+ }
211
+ const summary = [
212
+ fileCount === undefined ? undefined : `${fileCount} files`,
213
+ averageFileLoadMs === undefined ? undefined : `avg ${formatDuration(averageFileLoadMs)} each`,
214
+ ]
215
+ .filter(Boolean)
216
+ .join(", ");
217
+ lines.push("", " File loads", ` ${summary}`);
218
+ const hasOutliers = finding.evidence.find(item => item.metric === "hasFileLoadOutliers")?.value;
219
+ if (hasOutliers === false) {
220
+ lines.push(" Files at least 3× slower than average: none.");
221
+ }
222
+ else if (hasOutliers === true) {
223
+ const outliers = finding.evidence.filter(item => item.metric === "fileLoadOutlier" && typeof item.value === "string");
224
+ if (!outliers.length) {
225
+ lines.push(" At least one file was 3× slower than average; its detail was not retained.");
226
+ }
227
+ else {
228
+ lines.push(" Files at least 3× slower than average:");
229
+ for (const outlier of outliers) {
230
+ const wallMs = finding.evidence.find(item => item.metric === "fileLoadOutlierWall" && item.operationId === outlier.operationId)?.value;
231
+ const duration = typeof wallMs === "number"
232
+ ? ` — ${colorByConfidence(formatDuration(wallMs), finding.confidence)}`
233
+ : "";
234
+ lines.push(` • ${outlier.value}${duration}`);
235
+ }
236
+ }
237
+ }
238
+ else {
239
+ lines.push(" Individual file outliers require profiler.level 2.");
240
+ }
241
+ return lines;
242
+ }
243
+ function renderSlowFindingTable(findings, entityHeader) {
244
+ const rows = findings.map(finding => {
245
+ const durationMs = numericEvidence(finding, "totalWall") ?? firstDurationEvidence(finding) ?? 0;
246
+ const calls = numericEvidence(finding, "count") ?? callsFromObservation(finding.observation) ?? 1;
247
+ return [
248
+ colorByConfidence(formatDuration(durationMs), finding.confidence),
249
+ String(calls),
250
+ wrapText(findingEntity(finding) ?? "<unknown>", 55),
251
+ ];
252
+ });
253
+ return renderTable([{ header: "Duration", align: "right" }, { header: "Calls", align: "right" }, { header: entityHeader }], rows, true);
254
+ }
255
+ function renderCommandSources(findings) {
256
+ const sources = findings.flatMap(finding => {
257
+ const source = finding.evidence.find(item => item.metric === "source")?.value;
258
+ return typeof source === "string" ? [[findingEntity(finding) ?? "<unknown>", source]] : [];
259
+ });
260
+ if (!sources.length) {
261
+ return [];
262
+ }
263
+ return ["", " Registration sources", ...sources.map(([command, source]) => ` • ${command} — ${source}`)];
264
+ }
265
+ function renderTable(columns, rows, blankLineBetweenRows = false) {
266
+ const splitRows = rows.map(row => row.map(cell => cell.split("\n")));
267
+ const widths = columns.map((column, index) => Math.max(visibleLength(column.header), ...splitRows.flatMap(row => row[index]?.map(visibleLength) ?? [0])));
268
+ const renderCells = (cells) => ` ${cells
269
+ .map((cell, index) => index === cells.length - 1 ? cell : padCell(cell, widths[index], columns[index].align))
270
+ .join(" ")}`.trimEnd();
271
+ const lines = [
272
+ renderCells(columns.map(column => column.header)),
273
+ renderCells(widths.map(width => "_".repeat(width))),
274
+ ];
275
+ splitRows.forEach((row, rowIndex) => {
276
+ const height = Math.max(...row.map(cell => cell.length));
277
+ for (let line = 0; line < height; line++) {
278
+ lines.push(renderCells(row.map(cell => cell[line] ?? "")));
279
+ }
280
+ if (blankLineBetweenRows && rowIndex < splitRows.length - 1) {
281
+ lines.push("");
282
+ }
283
+ });
284
+ return lines;
285
+ }
286
+ function sortFindings(findings) {
287
+ return [...findings].sort(finding_order_1.compareFindings);
288
+ }
289
+ function groupFindings(findings) {
290
+ const groups = new Map();
291
+ for (const finding of findings) {
292
+ const group = groups.get(finding.analyzer.id) ?? [];
293
+ group.push(finding);
294
+ groups.set(finding.analyzer.id, group);
295
+ }
296
+ return [...groups].map(([analyzerId, groupedFindings]) => ({ analyzerId, findings: groupedFindings }));
297
+ }
298
+ function findingEntity(finding) {
299
+ const explicit = finding.entityIds?.find(Boolean);
300
+ if (explicit) {
301
+ return explicit;
302
+ }
303
+ const evidence = finding.evidence.find(item => typeof item.value === "string" && ["browser", "process"].includes(item.metric));
304
+ if (typeof evidence?.value === "string") {
305
+ return evidence.value;
306
+ }
307
+ return finding.observation.match(/`([^`]*)`/)?.[1];
308
+ }
309
+ function formatGroupConfidence(findings) {
310
+ const values = [...new Set(findings.map(finding => finding.confidence))].sort((left, right) => CONFIDENCE_RANK[right] - CONFIDENCE_RANK[left]);
311
+ return values.map(value => colorByConfidence(value.toUpperCase(), value)).join("/");
312
+ }
313
+ function formatFindingSummary(groups) {
314
+ const counts = new Map();
315
+ for (const group of groups) {
316
+ const confidence = [...group.findings].sort((left, right) => CONFIDENCE_RANK[right.confidence] - CONFIDENCE_RANK[left.confidence])[0].confidence;
317
+ counts.set(confidence, (counts.get(confidence) ?? 0) + 1);
318
+ }
319
+ const details = ["high", "medium", "low"]
320
+ .filter(confidence => counts.has(confidence))
321
+ .map(confidence => {
322
+ const count = counts.get(confidence);
323
+ return colorByConfidence(`${count} ${confidence}`, confidence);
324
+ });
325
+ const noun = groups.length === 1 ? "finding" : "findings";
326
+ return `${groups.length} ${noun}: ${details.join(", ")}`;
327
+ }
328
+ function formatFindingText(text, finding) {
329
+ let result = plainFindingText(text);
330
+ for (const evidence of finding.evidence) {
331
+ if (evidence.unit !== "ms" || typeof evidence.value !== "number") {
332
+ continue;
333
+ }
334
+ const analyzerDuration = evidence.value >= 1000 ? `${(evidence.value / 1000).toFixed(1)}s` : `${evidence.value.toFixed(0)}ms`;
335
+ result = result.replaceAll(analyzerDuration, colorByConfidence(formatDuration(evidence.value), finding.confidence));
336
+ }
337
+ return result;
338
+ }
339
+ function plainFindingText(text) {
340
+ return text.replace(/`([^`]*)`/g, "$1");
341
+ }
342
+ function numericEvidence(finding, metric) {
343
+ const value = finding.evidence.find(item => item.metric === metric)?.value;
344
+ return typeof value === "number" ? value : undefined;
345
+ }
346
+ function firstDurationEvidence(finding) {
347
+ const value = finding.evidence.find(item => item.unit === "ms")?.value;
348
+ return typeof value === "number" ? value : undefined;
349
+ }
350
+ function callsFromObservation(observation) {
351
+ const value = observation.match(/\bacross (\d+) call/)?.[1];
352
+ return value === undefined ? undefined : Number(value);
353
+ }
354
+ function colorByConfidence(value, confidence) {
355
+ if (confidence === "high") {
356
+ return chalk_1.default.red(value);
357
+ }
358
+ if (confidence === "medium") {
359
+ return chalk_1.default.yellow(value);
360
+ }
361
+ return chalk_1.default.gray(value);
362
+ }
363
+ function topLevelPhases(timeline) {
364
+ const root = timeline.find(operation => operation.kind === "testplane.operation");
365
+ if (!root) {
366
+ return [];
367
+ }
368
+ // Workers repeat bootstrap phases in parallel. The breakdown describes the master lifecycle,
369
+ // so retain the largest master occurrence of each direct root phase.
370
+ const byName = new Map();
371
+ for (const operation of timeline) {
372
+ if (operation.parentId !== root.id ||
373
+ !operation.kind.startsWith("testplane.phase.") ||
374
+ operation.process.type !== "master") {
375
+ continue;
376
+ }
377
+ const existing = byName.get(operation.name);
378
+ if (!existing || operation.timing.wallMs > existing.timing.wallMs) {
379
+ byName.set(operation.name, operation);
380
+ }
381
+ }
382
+ return [...byName.values()];
383
+ }
384
+ function formatDuration(milliseconds) {
385
+ if (milliseconds < 1000) {
386
+ return `${Math.round(milliseconds)}ms`;
387
+ }
388
+ const seconds = Math.round(milliseconds / 100) / 10;
389
+ if (seconds < 60) {
390
+ return `${Number.isInteger(seconds) ? seconds.toFixed(0) : seconds.toFixed(1)}s`;
391
+ }
392
+ const roundedSeconds = Math.round(seconds);
393
+ return `${Math.floor(roundedSeconds / 60)}m ${String(roundedSeconds % 60).padStart(2, "0")}s`;
394
+ }
395
+ function formatPercent(ratio) {
396
+ const percent = Math.max(0, ratio * 100);
397
+ return percent > 0 && percent < 0.1 ? "<0.1%" : `${percent.toFixed(1)}%`;
398
+ }
399
+ function formatBar(ratio) {
400
+ const filled = Math.min(BAR_WIDTH, Math.round(Math.max(0, ratio) * BAR_WIDTH));
401
+ return filled ? "█".repeat(filled) : "";
402
+ }
403
+ function indentWrapped(value, indentation) {
404
+ const prefix = " ".repeat(indentation);
405
+ return wrapText(value, REPORT_WIDTH - indentation)
406
+ .split("\n")
407
+ .map(line => `${prefix}${line}`);
408
+ }
409
+ function wrapText(value, width) {
410
+ return value
411
+ .split("\n")
412
+ .flatMap(line => {
413
+ const words = line.split(/\s+/).filter(Boolean);
414
+ const wrapped = [];
415
+ let current = "";
416
+ for (const word of words) {
417
+ if (current && visibleLength(`${current} ${word}`) > width) {
418
+ wrapped.push(current);
419
+ current = word;
420
+ }
421
+ else {
422
+ current = current ? `${current} ${word}` : word;
423
+ }
424
+ }
425
+ wrapped.push(current);
426
+ return wrapped;
427
+ })
428
+ .join("\n");
429
+ }
430
+ function padCell(value, width, align = "left") {
431
+ const padding = " ".repeat(Math.max(0, width - visibleLength(value)));
432
+ return align === "right" ? `${padding}${value}` : `${value}${padding}`;
433
+ }
434
+ function visibleLength(value) {
435
+ return value.replace(ANSI_PATTERN, "").length;
436
+ }
437
+ function profilerPrefix() {
438
+ return chalk_1.default.yellow("[profiler]");
439
+ }
440
+ function divider() {
441
+ return "_".repeat(REPORT_WIDTH);
442
+ }
443
+ //# sourceMappingURL=console.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console.js","sourceRoot":"","sources":["../../../../src/profiler/output/console.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { ProfilerResultV1 } from "../schema";
2
+ export declare const writeProfilerJson: (outputPath: string, result: Readonly<ProfilerResultV1>, cwd?: string) => Promise<void>;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.writeProfilerJson = void 0;
7
+ const promises_1 = __importDefault(require("node:fs/promises"));
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const writeProfilerJson = async (outputPath, result, cwd = process.cwd()) => {
10
+ const destination = node_path_1.default.resolve(cwd, outputPath);
11
+ const directory = node_path_1.default.dirname(destination);
12
+ const temporary = node_path_1.default.join(directory, `.${node_path_1.default.basename(destination)}.${result.run.id}.tmp`);
13
+ await promises_1.default.mkdir(directory, { recursive: true });
14
+ try {
15
+ await promises_1.default.writeFile(temporary, `${JSON.stringify(result, null, 2)}\n`, { encoding: "utf8", flag: "wx" });
16
+ await promises_1.default.rename(temporary, destination);
17
+ }
18
+ catch (error) {
19
+ await promises_1.default.rm(temporary, { force: true }).catch(() => undefined);
20
+ throw error;
21
+ }
22
+ };
23
+ exports.writeProfilerJson = writeProfilerJson;
24
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../../../src/profiler/output/json.ts"],"names":[],"mappings":";;;;;;AAAA,gEAAkC;AAClC,0DAA6B;AAGtB,MAAM,iBAAiB,GAAG,KAAK,EAClC,UAAkB,EAClB,MAAkC,EAClC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EACN,EAAE;IACf,MAAM,WAAW,GAAG,mBAAI,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,mBAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,mBAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;IAE9F,MAAM,kBAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,IAAI,CAAC;QACD,MAAM,kBAAE,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACxG,MAAM,kBAAE,CAAC,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,kBAAE,CAAC,EAAE,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC/D,MAAM,KAAK,CAAC;IAChB,CAAC;AACL,CAAC,CAAC;AAjBW,QAAA,iBAAiB,qBAiB5B"}
@@ -0,0 +1,22 @@
1
+ import type { RetainedOperation, TruncationEntry } from "../schema";
2
+ /**
3
+ * Keeps bucket winners and only the ancestors needed by those winners.
4
+ * Descendants must be added before their ancestors, matching span completion order.
5
+ */
6
+ export declare class OperationStore {
7
+ private readonly _buckets;
8
+ private readonly _retained;
9
+ private readonly _winnerIds;
10
+ private readonly _pinnedIds;
11
+ private readonly _requiredByChildren;
12
+ add(operation: RetainedOperation): void;
13
+ snapshot(): {
14
+ operations: RetainedOperation[];
15
+ truncation: TruncationEntry[];
16
+ };
17
+ private _retain;
18
+ private _releaseIfUnused;
19
+ private _incrementRequirement;
20
+ private _decrementRequirement;
21
+ private _isRequired;
22
+ }
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OperationStore = void 0;
4
+ const policy_v1_1 = require("./policy-v1");
5
+ const top_k_1 = require("./top-k");
6
+ /**
7
+ * Keeps bucket winners and only the ancestors needed by those winners.
8
+ * Descendants must be added before their ancestors, matching span completion order.
9
+ */
10
+ class OperationStore {
11
+ constructor() {
12
+ this._buckets = new Map();
13
+ this._retained = new Map();
14
+ this._winnerIds = new Set();
15
+ this._pinnedIds = new Set();
16
+ this._requiredByChildren = new Map();
17
+ }
18
+ add(operation) {
19
+ if (operation.kind.startsWith("testplane.phase.") || operation.kind === "testplane.operation") {
20
+ this._pinnedIds.add(operation.id);
21
+ this._retain(operation);
22
+ return;
23
+ }
24
+ const bucket = (0, policy_v1_1.getRetentionBucket)(operation.kind);
25
+ let state = this._buckets.get(bucket);
26
+ if (!state) {
27
+ state = {
28
+ seen: 0,
29
+ values: new top_k_1.TopK(policy_v1_1.RETENTION_POLICY_V1.operationLimits[bucket]),
30
+ };
31
+ this._buckets.set(bucket, state);
32
+ }
33
+ state.seen += 1;
34
+ const { accepted, evicted } = state.values.add(operation, operation.timing.wallMs);
35
+ if (accepted) {
36
+ this._winnerIds.add(operation.id);
37
+ this._retain(operation);
38
+ }
39
+ else if (this._isRequired(operation.id)) {
40
+ this._retain(operation);
41
+ }
42
+ if (evicted) {
43
+ this._winnerIds.delete(evicted.id);
44
+ this._releaseIfUnused(evicted.id);
45
+ }
46
+ }
47
+ snapshot() {
48
+ const truncation = [];
49
+ for (const [bucket, state] of this._buckets) {
50
+ let retained = 0;
51
+ for (const operation of this._retained.values()) {
52
+ if (!operation.kind.startsWith("testplane.phase.") &&
53
+ operation.kind !== "testplane.operation" &&
54
+ (0, policy_v1_1.getRetentionBucket)(operation.kind) === bucket) {
55
+ retained += 1;
56
+ }
57
+ }
58
+ truncation.push({
59
+ collector: bucket,
60
+ seen: state.seen,
61
+ retained,
62
+ rule: `top ${policy_v1_1.RETENTION_POLICY_V1.operationLimits[bucket]} by wall time; keep ancestors of retained operations`,
63
+ truncated: retained < state.seen,
64
+ });
65
+ }
66
+ const operations = [...this._retained.values()].sort((left, right) => left.startOffsetMs - right.startOffsetMs || left.id.localeCompare(right.id));
67
+ return { operations, truncation };
68
+ }
69
+ _retain(operation) {
70
+ if (this._retained.has(operation.id)) {
71
+ return;
72
+ }
73
+ this._retained.set(operation.id, operation);
74
+ this._incrementRequirement(operation.parentId);
75
+ }
76
+ _releaseIfUnused(operationId) {
77
+ if (this._winnerIds.has(operationId) || this._pinnedIds.has(operationId) || this._isRequired(operationId)) {
78
+ return;
79
+ }
80
+ const operation = this._retained.get(operationId);
81
+ if (!operation) {
82
+ return;
83
+ }
84
+ this._retained.delete(operationId);
85
+ this._decrementRequirement(operation.parentId);
86
+ }
87
+ _incrementRequirement(operationId) {
88
+ if (!operationId) {
89
+ return;
90
+ }
91
+ this._requiredByChildren.set(operationId, (this._requiredByChildren.get(operationId) ?? 0) + 1);
92
+ }
93
+ _decrementRequirement(operationId) {
94
+ if (!operationId) {
95
+ return;
96
+ }
97
+ const next = (this._requiredByChildren.get(operationId) ?? 0) - 1;
98
+ if (next > 0) {
99
+ this._requiredByChildren.set(operationId, next);
100
+ return;
101
+ }
102
+ this._requiredByChildren.delete(operationId);
103
+ this._releaseIfUnused(operationId);
104
+ }
105
+ _isRequired(operationId) {
106
+ return (this._requiredByChildren.get(operationId) ?? 0) > 0;
107
+ }
108
+ }
109
+ exports.OperationStore = OperationStore;
110
+ //# sourceMappingURL=operation-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operation-store.js","sourceRoot":"","sources":["../../../../src/profiler/retention/operation-store.ts"],"names":[],"mappings":"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"}