testplane 9.0.0-rc.3 → 9.0.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 (607) hide show
  1. package/README.md +1 -1
  2. package/build/package.json +41 -25
  3. package/build/src/base-testplane.d.ts +6 -2
  4. package/build/src/base-testplane.js +19 -5
  5. package/build/src/base-testplane.js.map +1 -1
  6. package/build/src/browser/browser.d.ts +8 -0
  7. package/build/src/browser/browser.js +16 -5
  8. package/build/src/browser/browser.js.map +1 -1
  9. package/build/src/browser/calibrator.d.ts +5 -4
  10. package/build/src/browser/calibrator.js +96 -47
  11. package/build/src/browser/calibrator.js.map +1 -1
  12. package/build/src/browser/camera/index.d.ts +16 -19
  13. package/build/src/browser/camera/index.js +72 -25
  14. package/build/src/browser/camera/index.js.map +1 -1
  15. package/build/src/browser/camera/utils.d.ts +15 -2
  16. package/build/src/browser/camera/utils.js +58 -5
  17. package/build/src/browser/camera/utils.js.map +1 -1
  18. package/build/src/browser/cdp/connection.d.ts +15 -0
  19. package/build/src/browser/cdp/connection.js +145 -0
  20. package/build/src/browser/cdp/connection.js.map +1 -0
  21. package/build/src/browser/cdp/constants.d.ts +6 -0
  22. package/build/src/browser/cdp/constants.js +10 -0
  23. package/build/src/browser/cdp/constants.js.map +1 -0
  24. package/build/src/browser/cdp/debug.d.ts +2 -0
  25. package/build/src/browser/cdp/debug.js +9 -0
  26. package/build/src/browser/cdp/debug.js.map +1 -0
  27. package/build/src/browser/cdp/domains/css.d.ts +54 -0
  28. package/build/src/browser/cdp/domains/css.js +39 -0
  29. package/build/src/browser/cdp/domains/css.js.map +1 -0
  30. package/build/src/browser/cdp/domains/debugger.d.ts +65 -0
  31. package/build/src/browser/cdp/domains/debugger.js +31 -0
  32. package/build/src/browser/cdp/domains/debugger.js.map +1 -0
  33. package/build/src/browser/cdp/domains/dom.d.ts +24 -0
  34. package/build/src/browser/cdp/domains/dom.js +23 -0
  35. package/build/src/browser/cdp/domains/dom.js.map +1 -0
  36. package/build/src/browser/cdp/domains/fetch.d.ts +163 -0
  37. package/build/src/browser/cdp/domains/fetch.js +51 -0
  38. package/build/src/browser/cdp/domains/fetch.js.map +1 -0
  39. package/build/src/browser/cdp/domains/network.d.ts +290 -0
  40. package/build/src/browser/cdp/domains/network.js +75 -0
  41. package/build/src/browser/cdp/domains/network.js.map +1 -0
  42. package/build/src/browser/cdp/domains/page.d.ts +378 -0
  43. package/build/src/browser/cdp/domains/page.js +114 -0
  44. package/build/src/browser/cdp/domains/page.js.map +1 -0
  45. package/build/src/browser/cdp/domains/profiler.d.ts +60 -0
  46. package/build/src/browser/cdp/domains/profiler.js +39 -0
  47. package/build/src/browser/cdp/domains/profiler.js.map +1 -0
  48. package/build/src/browser/cdp/domains/runtime.d.ts +57 -0
  49. package/build/src/browser/cdp/domains/runtime.js +34 -0
  50. package/build/src/browser/cdp/domains/runtime.js.map +1 -0
  51. package/build/src/browser/cdp/domains/target.d.ts +77 -0
  52. package/build/src/browser/cdp/domains/target.js +53 -0
  53. package/build/src/browser/cdp/domains/target.js.map +1 -0
  54. package/build/src/browser/cdp/emitter.d.ts +10 -0
  55. package/build/src/browser/cdp/emitter.js +61 -0
  56. package/build/src/browser/cdp/emitter.js.map +1 -0
  57. package/build/src/browser/cdp/error.d.ts +17 -0
  58. package/build/src/browser/cdp/error.js +38 -0
  59. package/build/src/browser/cdp/error.js.map +1 -0
  60. package/build/src/browser/cdp/index.d.ts +29 -0
  61. package/build/src/browser/cdp/index.js +80 -0
  62. package/build/src/browser/cdp/index.js.map +1 -0
  63. package/build/src/browser/cdp/selectivity/constants.d.ts +3 -0
  64. package/build/src/browser/cdp/selectivity/constants.js +7 -0
  65. package/build/src/browser/cdp/selectivity/constants.js.map +1 -0
  66. package/build/src/browser/cdp/selectivity/css-selectivity.d.ts +24 -0
  67. package/build/src/browser/cdp/selectivity/css-selectivity.js +261 -0
  68. package/build/src/browser/cdp/selectivity/css-selectivity.js.map +1 -0
  69. package/build/src/browser/cdp/selectivity/debug.d.ts +2 -0
  70. package/build/src/browser/cdp/selectivity/debug.js +9 -0
  71. package/build/src/browser/cdp/selectivity/debug.js.map +1 -0
  72. package/build/src/browser/cdp/selectivity/fs-cache.d.ts +12 -0
  73. package/build/src/browser/cdp/selectivity/fs-cache.js +122 -0
  74. package/build/src/browser/cdp/selectivity/fs-cache.js.map +1 -0
  75. package/build/src/browser/cdp/selectivity/hash-provider.d.ts +7 -0
  76. package/build/src/browser/cdp/selectivity/hash-provider.js +86 -0
  77. package/build/src/browser/cdp/selectivity/hash-provider.js.map +1 -0
  78. package/build/src/browser/cdp/selectivity/hash-reader.d.ts +16 -0
  79. package/build/src/browser/cdp/selectivity/hash-reader.js +83 -0
  80. package/build/src/browser/cdp/selectivity/hash-reader.js.map +1 -0
  81. package/build/src/browser/cdp/selectivity/hash-writer.d.ts +18 -0
  82. package/build/src/browser/cdp/selectivity/hash-writer.js +80 -0
  83. package/build/src/browser/cdp/selectivity/hash-writer.js.map +1 -0
  84. package/build/src/browser/cdp/selectivity/index.d.ts +15 -0
  85. package/build/src/browser/cdp/selectivity/index.js +220 -0
  86. package/build/src/browser/cdp/selectivity/index.js.map +1 -0
  87. package/build/src/browser/cdp/selectivity/js-selectivity.d.ts +23 -0
  88. package/build/src/browser/cdp/selectivity/js-selectivity.js +242 -0
  89. package/build/src/browser/cdp/selectivity/js-selectivity.js.map +1 -0
  90. package/build/src/browser/cdp/selectivity/json-utils.d.ts +15 -0
  91. package/build/src/browser/cdp/selectivity/json-utils.js +135 -0
  92. package/build/src/browser/cdp/selectivity/json-utils.js.map +1 -0
  93. package/build/src/browser/cdp/selectivity/merge-dumps/index.d.ts +2 -0
  94. package/build/src/browser/cdp/selectivity/merge-dumps/index.js +28 -0
  95. package/build/src/browser/cdp/selectivity/merge-dumps/index.js.map +1 -0
  96. package/build/src/browser/cdp/selectivity/merge-dumps/merge-hashes.d.ts +2 -0
  97. package/build/src/browser/cdp/selectivity/merge-dumps/merge-hashes.js +39 -0
  98. package/build/src/browser/cdp/selectivity/merge-dumps/merge-hashes.js.map +1 -0
  99. package/build/src/browser/cdp/selectivity/merge-dumps/merge-tests.d.ts +2 -0
  100. package/build/src/browser/cdp/selectivity/merge-dumps/merge-tests.js +129 -0
  101. package/build/src/browser/cdp/selectivity/merge-dumps/merge-tests.js.map +1 -0
  102. package/build/src/browser/cdp/selectivity/modes.d.ts +4 -0
  103. package/build/src/browser/cdp/selectivity/modes.js +11 -0
  104. package/build/src/browser/cdp/selectivity/modes.js.map +1 -0
  105. package/build/src/browser/cdp/selectivity/runner.d.ts +24 -0
  106. package/build/src/browser/cdp/selectivity/runner.js +234 -0
  107. package/build/src/browser/cdp/selectivity/runner.js.map +1 -0
  108. package/build/src/browser/cdp/selectivity/test-dependencies-reader.d.ts +10 -0
  109. package/build/src/browser/cdp/selectivity/test-dependencies-reader.js +41 -0
  110. package/build/src/browser/cdp/selectivity/test-dependencies-reader.js.map +1 -0
  111. package/build/src/browser/cdp/selectivity/test-dependencies-writer.d.ts +11 -0
  112. package/build/src/browser/cdp/selectivity/test-dependencies-writer.js +69 -0
  113. package/build/src/browser/cdp/selectivity/test-dependencies-writer.js.map +1 -0
  114. package/build/src/browser/cdp/selectivity/testplane-selectivity.d.ts +7 -0
  115. package/build/src/browser/cdp/selectivity/testplane-selectivity.js +127 -0
  116. package/build/src/browser/cdp/selectivity/testplane-selectivity.js.map +1 -0
  117. package/build/src/browser/cdp/selectivity/types.d.ts +26 -0
  118. package/build/src/browser/cdp/selectivity/types.js +10 -0
  119. package/build/src/browser/cdp/selectivity/types.js.map +1 -0
  120. package/build/src/browser/cdp/selectivity/used-dumps-tracker.d.ts +7 -0
  121. package/build/src/browser/cdp/selectivity/used-dumps-tracker.js +25 -0
  122. package/build/src/browser/cdp/selectivity/used-dumps-tracker.js.map +1 -0
  123. package/build/src/browser/cdp/selectivity/utils.d.ts +57 -0
  124. package/build/src/browser/cdp/selectivity/utils.js +382 -0
  125. package/build/src/browser/cdp/selectivity/utils.js.map +1 -0
  126. package/build/src/browser/cdp/types.d.ts +417 -0
  127. package/build/src/browser/cdp/types.js.map +1 -0
  128. package/build/src/browser/cdp/utils.d.ts +1 -0
  129. package/build/src/browser/cdp/utils.js +18 -0
  130. package/build/src/browser/cdp/utils.js.map +1 -0
  131. package/build/src/browser/cdp/ws-endpoint.d.ts +2 -0
  132. package/build/src/browser/cdp/ws-endpoint.js +70 -0
  133. package/build/src/browser/cdp/ws-endpoint.js.map +1 -0
  134. package/build/src/browser/client-bridge/error.d.ts +1 -1
  135. package/build/src/browser/client-bridge/error.js +2 -2
  136. package/build/src/browser/client-bridge/error.js.map +1 -1
  137. package/build/src/browser/client-bridge/index.d.ts +17 -7
  138. package/build/src/browser/client-bridge/index.js +65 -14
  139. package/build/src/browser/client-bridge/index.js.map +1 -1
  140. package/build/src/browser/client-scripts/browser-utils/build/bundle.compat.js +18 -0
  141. package/build/src/browser/client-scripts/browser-utils/build/bundle.native.js +10 -0
  142. package/build/src/browser/client-scripts/browser-utils/tsc-out/client-scripts/browser-utils/implementation.js +38 -0
  143. package/build/src/browser/client-scripts/browser-utils/tsc-out/client-scripts/browser-utils/inject.js +31 -0
  144. package/build/src/browser/client-scripts/browser-utils/tsc-out/client-scripts/shared/lib.compat.js +57 -0
  145. package/build/src/browser/client-scripts/browser-utils/tsc-out/client-scripts/shared/lib.native.js +53 -0
  146. package/build/src/browser/client-scripts/browser-utils/tsc-out/client-scripts/shared/logger.js +42 -0
  147. package/build/src/browser/client-scripts/browser-utils/tsc-out/client-scripts/shared/polyfills/getComputedStyle.js +132 -0
  148. package/build/src/browser/client-scripts/browser-utils/tsc-out/client-scripts/shared/polyfills/matchMedia.js +82 -0
  149. package/build/src/browser/client-scripts/{xpath.js → browser-utils/tsc-out/client-scripts/shared/xpath.js} +9 -13
  150. package/build/src/browser/client-scripts/browser-utils/tsc-out/isomorphic/assign.js +21 -0
  151. package/build/src/browser/client-scripts/browser-utils/tsc-out/isomorphic/geometry.js +220 -0
  152. package/build/src/browser/client-scripts/browser-utils/tsc-out/isomorphic/index.js +19 -0
  153. package/build/src/browser/client-scripts/browser-utils/tsc-out/isomorphic/types.js +18 -0
  154. package/build/src/browser/client-scripts/build.js +50 -13
  155. package/build/src/browser/client-scripts/calibrate.js +13 -1
  156. package/build/src/browser/client-scripts/rrweb-record.min.js +32 -32
  157. package/build/src/browser/client-scripts/screen-shooter/build/bundle.compat.js +38 -0
  158. package/build/src/browser/client-scripts/screen-shooter/build/bundle.native.js +38 -0
  159. package/build/src/browser/client-scripts/screen-shooter/tsc-out/client-scripts/screen-shooter/errors/outside-of-viewport.js +32 -0
  160. package/build/src/browser/client-scripts/screen-shooter/tsc-out/client-scripts/screen-shooter/implementation.js +406 -0
  161. package/build/src/browser/client-scripts/screen-shooter/tsc-out/client-scripts/screen-shooter/inject.js +31 -0
  162. package/build/src/browser/client-scripts/screen-shooter/tsc-out/client-scripts/screen-shooter/operations.js +633 -0
  163. package/build/src/browser/client-scripts/screen-shooter/tsc-out/client-scripts/screen-shooter/types.js +2 -0
  164. package/build/src/browser/client-scripts/screen-shooter/tsc-out/client-scripts/screen-shooter/utils/clip-rect.js +103 -0
  165. package/build/src/browser/client-scripts/screen-shooter/tsc-out/client-scripts/screen-shooter/utils/descriptions.js +19 -0
  166. package/build/src/browser/client-scripts/screen-shooter/tsc-out/client-scripts/screen-shooter/utils/dom.js +99 -0
  167. package/build/src/browser/client-scripts/screen-shooter/tsc-out/client-scripts/screen-shooter/utils/element-rect.js +183 -0
  168. package/build/src/browser/client-scripts/screen-shooter/tsc-out/client-scripts/screen-shooter/utils/pseudo-element-rect.js +205 -0
  169. package/build/src/browser/client-scripts/screen-shooter/tsc-out/client-scripts/screen-shooter/utils/scroll.js +155 -0
  170. package/build/src/browser/client-scripts/screen-shooter/tsc-out/client-scripts/screen-shooter/utils/trusted-types.js +14 -0
  171. package/build/src/browser/client-scripts/screen-shooter/tsc-out/client-scripts/screen-shooter/utils/user-agent.js +10 -0
  172. package/build/src/browser/client-scripts/screen-shooter/tsc-out/client-scripts/screen-shooter/utils/z-index.js +144 -0
  173. package/build/src/browser/client-scripts/screen-shooter/tsc-out/client-scripts/shared/lib.compat.js +57 -0
  174. package/build/src/browser/client-scripts/screen-shooter/tsc-out/client-scripts/shared/lib.native.js +53 -0
  175. package/build/src/browser/client-scripts/screen-shooter/tsc-out/client-scripts/shared/logger.js +42 -0
  176. package/build/src/browser/client-scripts/screen-shooter/tsc-out/client-scripts/shared/polyfills/getComputedStyle.js +132 -0
  177. package/build/src/browser/client-scripts/screen-shooter/tsc-out/client-scripts/shared/polyfills/matchMedia.js +82 -0
  178. package/build/src/browser/client-scripts/screen-shooter/tsc-out/client-scripts/shared/xpath.js +27 -0
  179. package/build/src/browser/client-scripts/screen-shooter/tsc-out/isomorphic/assign.js +21 -0
  180. package/build/src/browser/client-scripts/screen-shooter/tsc-out/isomorphic/geometry.js +220 -0
  181. package/build/src/browser/client-scripts/screen-shooter/tsc-out/isomorphic/index.js +19 -0
  182. package/build/src/browser/client-scripts/screen-shooter/tsc-out/isomorphic/types.js +18 -0
  183. package/build/src/browser/commands/assert-view/errors/image-diff-error.d.ts +1 -0
  184. package/build/src/browser/commands/assert-view/index.js +79 -31
  185. package/build/src/browser/commands/assert-view/index.js.map +1 -1
  186. package/build/src/browser/commands/getPuppeteer.js +1 -1
  187. package/build/src/browser/commands/getPuppeteer.js.map +1 -1
  188. package/build/src/browser/commands/getState.d.ts +5 -0
  189. package/build/src/browser/commands/getState.js +41 -0
  190. package/build/src/browser/commands/getState.js.map +1 -0
  191. package/build/src/browser/commands/index.js +5 -0
  192. package/build/src/browser/commands/index.js.map +1 -1
  193. package/build/src/browser/commands/moveCursorTo.d.ts +1 -1
  194. package/build/src/browser/commands/openAndWait.js +47 -5
  195. package/build/src/browser/commands/openAndWait.js.map +1 -1
  196. package/build/src/browser/commands/restoreState/index.d.ts +9 -0
  197. package/build/src/browser/commands/restoreState/index.js +112 -0
  198. package/build/src/browser/commands/restoreState/index.js.map +1 -0
  199. package/build/src/browser/commands/restoreState/restoreStorage.d.ts +1 -0
  200. package/build/src/browser/commands/restoreState/restoreStorage.js +12 -0
  201. package/build/src/browser/commands/restoreState/restoreStorage.js.map +1 -0
  202. package/build/src/browser/commands/saveState/dumpStorage.d.ts +5 -0
  203. package/build/src/browser/commands/saveState/dumpStorage.js +29 -0
  204. package/build/src/browser/commands/saveState/dumpStorage.js.map +1 -0
  205. package/build/src/browser/commands/saveState/index.d.ts +13 -0
  206. package/build/src/browser/commands/saveState/index.js +156 -0
  207. package/build/src/browser/commands/saveState/index.js.map +1 -0
  208. package/build/src/browser/commands/switchToRepl.js +64 -11
  209. package/build/src/browser/commands/switchToRepl.js.map +1 -1
  210. package/build/src/browser/commands/unstable_getCdp.d.ts +3 -0
  211. package/build/src/browser/commands/unstable_getCdp.js +9 -0
  212. package/build/src/browser/commands/unstable_getCdp.js.map +1 -0
  213. package/build/src/browser/commands/waitForStaticToLoad.d.ts +13 -0
  214. package/build/src/browser/commands/waitForStaticToLoad.js +169 -0
  215. package/build/src/browser/commands/waitForStaticToLoad.js.map +1 -0
  216. package/build/src/browser/existing-browser.d.ts +27 -35
  217. package/build/src/browser/existing-browser.js +141 -98
  218. package/build/src/browser/existing-browser.js.map +1 -1
  219. package/build/src/browser/history/async-local-storage.d.ts +5 -0
  220. package/build/src/browser/history/async-local-storage.js +14 -0
  221. package/build/src/browser/history/async-local-storage.js.map +1 -0
  222. package/build/src/browser/history/callstack.d.ts +0 -4
  223. package/build/src/browser/history/callstack.js +0 -8
  224. package/build/src/browser/history/callstack.js.map +1 -1
  225. package/build/src/browser/history/index.d.ts +19 -6
  226. package/build/src/browser/history/index.js +85 -47
  227. package/build/src/browser/history/index.js.map +1 -1
  228. package/build/src/browser/history/rrweb.d.ts +3 -1
  229. package/build/src/browser/history/rrweb.js +163 -57
  230. package/build/src/browser/history/rrweb.js.map +1 -1
  231. package/build/src/browser/isomorphic/assign.d.ts +2 -0
  232. package/build/src/browser/isomorphic/assign.js +18 -0
  233. package/build/src/browser/isomorphic/assign.js.map +1 -0
  234. package/build/src/browser/isomorphic/geometry.d.ts +85 -0
  235. package/build/src/browser/isomorphic/geometry.js +198 -0
  236. package/build/src/browser/isomorphic/geometry.js.map +1 -0
  237. package/build/src/browser/isomorphic/index.d.ts +3 -0
  238. package/build/src/browser/isomorphic/index.js +20 -0
  239. package/build/src/browser/isomorphic/index.js.map +1 -0
  240. package/build/src/browser/isomorphic/tsconfig.tsbuildinfo +1 -0
  241. package/build/src/browser/isomorphic/types.d.ts +15 -0
  242. package/build/src/browser/isomorphic/types.js +19 -0
  243. package/build/src/browser/isomorphic/types.js.map +1 -0
  244. package/build/src/browser/new-browser.d.ts +2 -1
  245. package/build/src/browser/new-browser.js +12 -12
  246. package/build/src/browser/new-browser.js.map +1 -1
  247. package/build/src/browser/screen-shooter/composite-image/debug-utils.d.ts +37 -0
  248. package/build/src/browser/screen-shooter/composite-image/debug-utils.js +127 -0
  249. package/build/src/browser/screen-shooter/composite-image/debug-utils.js.map +1 -0
  250. package/build/src/browser/screen-shooter/composite-image/index.d.ts +65 -14
  251. package/build/src/browser/screen-shooter/composite-image/index.js +488 -122
  252. package/build/src/browser/screen-shooter/composite-image/index.js.map +1 -1
  253. package/build/src/browser/screen-shooter/constants.d.ts +1 -0
  254. package/build/src/browser/screen-shooter/constants.js +5 -0
  255. package/build/src/browser/screen-shooter/constants.js.map +1 -0
  256. package/build/src/browser/screen-shooter/debug.d.ts +3 -0
  257. package/build/src/browser/screen-shooter/debug.js +25 -0
  258. package/build/src/browser/screen-shooter/debug.js.map +1 -0
  259. package/build/src/browser/screen-shooter/elements-screen-shooter.d.ts +43 -0
  260. package/build/src/browser/screen-shooter/elements-screen-shooter.js +466 -0
  261. package/build/src/browser/screen-shooter/elements-screen-shooter.js.map +1 -0
  262. package/build/src/browser/screen-shooter/errors/horizontal-overflow-error.d.ts +1 -0
  263. package/build/src/browser/screen-shooter/errors/horizontal-overflow-error.js +16 -12
  264. package/build/src/browser/screen-shooter/errors/horizontal-overflow-error.js.map +1 -1
  265. package/build/src/browser/screen-shooter/errors/vertical-overflow-error.d.ts +1 -0
  266. package/build/src/browser/screen-shooter/errors/vertical-overflow-error.js +12 -8
  267. package/build/src/browser/screen-shooter/errors/vertical-overflow-error.js.map +1 -1
  268. package/build/src/browser/screen-shooter/full-page-screen-shooter.d.ts +44 -0
  269. package/build/src/browser/screen-shooter/full-page-screen-shooter.js +160 -0
  270. package/build/src/browser/screen-shooter/full-page-screen-shooter.js.map +1 -0
  271. package/build/src/browser/screen-shooter/operations/animations.d.ts +7 -0
  272. package/build/src/browser/screen-shooter/operations/animations.js +25 -0
  273. package/build/src/browser/screen-shooter/operations/animations.js.map +1 -0
  274. package/build/src/browser/screen-shooter/operations/iframe.d.ts +1 -0
  275. package/build/src/browser/screen-shooter/operations/iframe.js +27 -0
  276. package/build/src/browser/screen-shooter/operations/iframe.js.map +1 -0
  277. package/build/src/browser/screen-shooter/operations/index.d.ts +5 -0
  278. package/build/src/browser/screen-shooter/operations/index.js +16 -0
  279. package/build/src/browser/screen-shooter/operations/index.js.map +1 -0
  280. package/build/src/browser/screen-shooter/operations/pointer-events.d.ts +11 -0
  281. package/build/src/browser/screen-shooter/operations/pointer-events.js +45 -0
  282. package/build/src/browser/screen-shooter/operations/pointer-events.js.map +1 -0
  283. package/build/src/browser/screen-shooter/operations/scrolls.d.ts +5 -0
  284. package/build/src/browser/screen-shooter/operations/scrolls.js +8 -0
  285. package/build/src/browser/screen-shooter/operations/scrolls.js.map +1 -0
  286. package/build/src/browser/screen-shooter/operations/wait-for-selectors-to-settle.d.ts +2 -0
  287. package/build/src/browser/screen-shooter/operations/wait-for-selectors-to-settle.js +133 -0
  288. package/build/src/browser/screen-shooter/operations/wait-for-selectors-to-settle.js.map +1 -0
  289. package/build/src/browser/screen-shooter/validation/index.d.ts +2 -2
  290. package/build/src/browser/screen-shooter/validation/index.js +31 -5
  291. package/build/src/browser/screen-shooter/validation/index.js.map +1 -1
  292. package/build/src/browser/screen-shooter/viewport-screen-shooter.d.ts +44 -0
  293. package/build/src/browser/screen-shooter/viewport-screen-shooter.js +89 -0
  294. package/build/src/browser/screen-shooter/viewport-screen-shooter.js.map +1 -0
  295. package/build/src/browser/stacktrace/utils.js +13 -3
  296. package/build/src/browser/stacktrace/utils.js.map +1 -1
  297. package/build/src/browser/standalone/attachToBrowser.d.ts +2 -0
  298. package/build/src/browser/standalone/attachToBrowser.js +63 -0
  299. package/build/src/browser/standalone/attachToBrowser.js.map +1 -0
  300. package/build/src/browser/standalone/index.d.ts +2 -0
  301. package/build/src/browser/standalone/index.js +8 -0
  302. package/build/src/browser/standalone/index.js.map +1 -0
  303. package/build/src/browser/standalone/launchBrowser.d.ts +4 -0
  304. package/build/src/browser/{standalone.js → standalone/launchBrowser.js} +24 -10
  305. package/build/src/browser/standalone/launchBrowser.js.map +1 -0
  306. package/build/src/browser/standalone/types.d.ts +5 -0
  307. package/build/src/browser/standalone/types.js +3 -0
  308. package/build/src/browser/standalone/types.js.map +1 -0
  309. package/build/src/browser/types.d.ts +30 -4
  310. package/build/src/browser/types.js.map +1 -1
  311. package/build/src/browser/wsdriver/compression.d.ts +5 -0
  312. package/build/src/browser/wsdriver/compression.js +79 -0
  313. package/build/src/browser/wsdriver/compression.js.map +1 -0
  314. package/build/src/browser/wsdriver/constants.d.ts +11 -0
  315. package/build/src/browser/wsdriver/constants.js +15 -0
  316. package/build/src/browser/wsdriver/constants.js.map +1 -0
  317. package/build/src/browser/wsdriver/debug.d.ts +2 -0
  318. package/build/src/browser/wsdriver/debug.js +9 -0
  319. package/build/src/browser/wsdriver/debug.js.map +1 -0
  320. package/build/src/browser/wsdriver/error.d.ts +18 -0
  321. package/build/src/browser/wsdriver/error.js +36 -0
  322. package/build/src/browser/wsdriver/error.js.map +1 -0
  323. package/build/src/browser/wsdriver/index.d.ts +23 -0
  324. package/build/src/browser/wsdriver/index.js +261 -0
  325. package/build/src/browser/wsdriver/index.js.map +1 -0
  326. package/build/src/browser/wsdriver/request.d.ts +10 -0
  327. package/build/src/browser/wsdriver/request.js +58 -0
  328. package/build/src/browser/wsdriver/request.js.map +1 -0
  329. package/build/src/browser/wsdriver/response.d.ts +3 -0
  330. package/build/src/browser/wsdriver/response.js +111 -0
  331. package/build/src/browser/wsdriver/response.js.map +1 -0
  332. package/build/src/browser/wsdriver/types.d.ts +71 -0
  333. package/build/src/browser/wsdriver/types.js +27 -0
  334. package/build/src/browser/wsdriver/types.js.map +1 -0
  335. package/build/src/browser-installer/chrome/index.d.ts +1 -0
  336. package/build/src/browser-installer/chrome/index.js +13 -3
  337. package/build/src/browser-installer/chrome/index.js.map +1 -1
  338. package/build/src/browser-installer/edge/index.d.ts +1 -0
  339. package/build/src/browser-installer/edge/index.js +8 -3
  340. package/build/src/browser-installer/edge/index.js.map +1 -1
  341. package/build/src/browser-installer/firefox/index.d.ts +1 -0
  342. package/build/src/browser-installer/firefox/index.js +8 -3
  343. package/build/src/browser-installer/firefox/index.js.map +1 -1
  344. package/build/src/browser-installer/safari/index.d.ts +1 -0
  345. package/build/src/browser-installer/safari/index.js +8 -3
  346. package/build/src/browser-installer/safari/index.js.map +1 -1
  347. package/build/src/browser-pool/basic-pool.js +3 -1
  348. package/build/src/browser-pool/basic-pool.js.map +1 -1
  349. package/build/src/browser-pool/cancelled-error.js +7 -1
  350. package/build/src/browser-pool/cancelled-error.js.map +1 -1
  351. package/build/src/browser-pool/limited-pool.d.ts +1 -1
  352. package/build/src/browser-pool/limited-pool.js +3 -3
  353. package/build/src/browser-pool/limited-pool.js.map +1 -1
  354. package/build/src/browser-pool/per-browser-limited-pool.d.ts +1 -1
  355. package/build/src/browser-pool/per-browser-limited-pool.js +3 -2
  356. package/build/src/browser-pool/per-browser-limited-pool.js.map +1 -1
  357. package/build/src/browser-pool/types.d.ts +1 -1
  358. package/build/src/browser-pool/webdriver-pool.d.ts +1 -0
  359. package/build/src/browser-pool/webdriver-pool.js +2 -0
  360. package/build/src/browser-pool/webdriver-pool.js.map +1 -1
  361. package/build/src/bundle/cjs/index.js +207 -108
  362. package/build/src/cli/commands/list-tests/index.js +2 -1
  363. package/build/src/cli/commands/list-tests/index.js.map +1 -1
  364. package/build/src/cli/commands/selectivity-merge-dumps/index.d.ts +2 -0
  365. package/build/src/cli/commands/selectivity-merge-dumps/index.js +50 -0
  366. package/build/src/cli/commands/selectivity-merge-dumps/index.js.map +1 -0
  367. package/build/src/cli/constants.d.ts +1 -0
  368. package/build/src/cli/constants.js +1 -0
  369. package/build/src/cli/constants.js.map +1 -1
  370. package/build/src/cli/index.js +29 -8
  371. package/build/src/cli/index.js.map +1 -1
  372. package/build/src/config/browser-options.js +51 -6
  373. package/build/src/config/browser-options.js.map +1 -1
  374. package/build/src/config/defaults.d.ts +27 -2
  375. package/build/src/config/defaults.js +30 -5
  376. package/build/src/config/defaults.js.map +1 -1
  377. package/build/src/config/index.d.ts +10 -6
  378. package/build/src/config/index.js +67 -42
  379. package/build/src/config/index.js.map +1 -1
  380. package/build/src/config/options.js +3 -2
  381. package/build/src/config/options.js.map +1 -1
  382. package/build/src/config/types.d.ts +133 -11
  383. package/build/src/config/types.js +15 -5
  384. package/build/src/config/types.js.map +1 -1
  385. package/build/src/config/utils.d.ts +4 -1
  386. package/build/src/config/utils.js +20 -2
  387. package/build/src/config/utils.js.map +1 -1
  388. package/build/src/constants/config.d.ts +1 -1
  389. package/build/src/constants/config.js +2 -2
  390. package/build/src/constants/config.js.map +1 -1
  391. package/build/src/constants/png.d.ts +14 -0
  392. package/build/src/constants/png.js +17 -0
  393. package/build/src/constants/png.js.map +1 -0
  394. package/build/src/constants/process-messages.d.ts +1 -0
  395. package/build/src/constants/process-messages.js +2 -1
  396. package/build/src/constants/process-messages.js.map +1 -1
  397. package/build/src/constants/repl.d.ts +2 -0
  398. package/build/src/constants/repl.js +6 -0
  399. package/build/src/constants/repl.js.map +1 -0
  400. package/build/src/dev-server/index.d.ts +1 -1
  401. package/build/src/dev-server/index.js +1 -1
  402. package/build/src/dev-server/index.js.map +1 -1
  403. package/build/src/error-snippets/constants.d.ts +2 -1
  404. package/build/src/error-snippets/constants.js +3 -2
  405. package/build/src/error-snippets/constants.js.map +1 -1
  406. package/build/src/error-snippets/source-maps.d.ts +3 -3
  407. package/build/src/error-snippets/source-maps.js +10 -8
  408. package/build/src/error-snippets/source-maps.js.map +1 -1
  409. package/build/src/error-snippets/utils.js +2 -2
  410. package/build/src/error-snippets/utils.js.map +1 -1
  411. package/build/src/errors/unhandled-rejection-error.d.ts +9 -0
  412. package/build/src/errors/unhandled-rejection-error.js +24 -0
  413. package/build/src/errors/unhandled-rejection-error.js.map +1 -0
  414. package/build/src/events/index.d.ts +12 -0
  415. package/build/src/events/index.js +3 -0
  416. package/build/src/events/index.js.map +1 -1
  417. package/build/src/globalFilesToRemove.d.ts +4 -0
  418. package/build/src/globalFilesToRemove.js +24 -0
  419. package/build/src/globalFilesToRemove.js.map +1 -0
  420. package/build/src/globals.d.ts +7 -0
  421. package/build/src/globals.js +10 -0
  422. package/build/src/globals.js.map +1 -0
  423. package/build/src/image.d.ts +26 -9
  424. package/build/src/image.js +201 -97
  425. package/build/src/image.js.map +1 -1
  426. package/build/src/index.d.ts +6 -14
  427. package/build/src/index.js +5 -1
  428. package/build/src/index.js.map +1 -1
  429. package/build/src/reporters/flat.js +7 -5
  430. package/build/src/reporters/flat.js.map +1 -1
  431. package/build/src/reporters/informers/console.d.ts +3 -3
  432. package/build/src/reporters/informers/console.js +6 -6
  433. package/build/src/reporters/informers/console.js.map +1 -1
  434. package/build/src/reporters/informers/file.d.ts +3 -3
  435. package/build/src/reporters/informers/file.js +13 -6
  436. package/build/src/reporters/informers/file.js.map +1 -1
  437. package/build/src/reporters/plain.js +4 -2
  438. package/build/src/reporters/plain.js.map +1 -1
  439. package/build/src/reporters/utils/helpers.js +10 -1
  440. package/build/src/reporters/utils/helpers.js.map +1 -1
  441. package/build/src/runner/browser-env/vite/browser-modules/driver.js +28 -8
  442. package/build/src/runner/browser-env/vite/browser-modules/driver.js.map +1 -1
  443. package/build/src/runner/browser-env/vite/browser-modules/tsconfig.tsbuildinfo +1 -1
  444. package/build/src/runner/browser-env/vite/browser-modules/types.d.ts +1 -1
  445. package/build/src/runner/browser-env/vite/plugins/generate-index-html.js +4 -6
  446. package/build/src/runner/browser-env/vite/plugins/generate-index-html.js.map +1 -1
  447. package/build/src/runner/browser-env/vite/server.d.ts +1 -0
  448. package/build/src/runner/browser-env/vite/server.js +26 -0
  449. package/build/src/runner/browser-env/vite/server.js.map +1 -1
  450. package/build/src/runner/browser-env/vite/utils.d.ts +0 -5
  451. package/build/src/runner/browser-env/vite/utils.js +15 -9
  452. package/build/src/runner/browser-env/vite/utils.js.map +1 -1
  453. package/build/src/runner/browser-runner.d.ts +1 -1
  454. package/build/src/runner/browser-runner.js +2 -2
  455. package/build/src/runner/browser-runner.js.map +1 -1
  456. package/build/src/runner/index.d.ts +6 -3
  457. package/build/src/runner/index.js +20 -8
  458. package/build/src/runner/index.js.map +1 -1
  459. package/build/src/runner/suite-monitor.d.ts +1 -1
  460. package/build/src/runner/test-runner/insistant-test-runner.d.ts +1 -0
  461. package/build/src/runner/test-runner/regular-test-runner.d.ts +3 -1
  462. package/build/src/runner/test-runner/regular-test-runner.js +30 -3
  463. package/build/src/runner/test-runner/regular-test-runner.js.map +1 -1
  464. package/build/src/runner/tests-tracker.d.ts +25 -0
  465. package/build/src/runner/tests-tracker.js +121 -0
  466. package/build/src/runner/tests-tracker.js.map +1 -0
  467. package/build/src/runner/types.d.ts +1 -1
  468. package/build/src/signal-handler.d.ts +2 -2
  469. package/build/src/signal-handler.js +24 -11
  470. package/build/src/signal-handler.js.map +1 -1
  471. package/build/src/test-reader/index.js +12 -8
  472. package/build/src/test-reader/index.js.map +1 -1
  473. package/build/src/test-reader/mocha-reader/index.d.ts +2 -1
  474. package/build/src/test-reader/mocha-reader/index.js +47 -2
  475. package/build/src/test-reader/mocha-reader/index.js.map +1 -1
  476. package/build/src/test-reader/mocha-reader/mocha-event-bus.d.ts +1 -1
  477. package/build/src/test-reader/mocha-reader/tree-builder-decorator.js +4 -4
  478. package/build/src/test-reader/mocha-reader/tree-builder-decorator.js.map +1 -1
  479. package/build/src/test-reader/test-object/suite.d.ts +9 -3
  480. package/build/src/test-reader/test-object/suite.js +19 -1
  481. package/build/src/test-reader/test-object/suite.js.map +1 -1
  482. package/build/src/test-reader/test-object/test.d.ts +7 -2
  483. package/build/src/test-reader/test-object/test.js +20 -1
  484. package/build/src/test-reader/test-object/test.js.map +1 -1
  485. package/build/src/test-reader/test-object/types.d.ts +11 -2
  486. package/build/src/test-reader/test-parser.d.ts +3 -1
  487. package/build/src/test-reader/test-parser.js +22 -6
  488. package/build/src/test-reader/test-parser.js.map +1 -1
  489. package/build/src/testplane.d.ts +22 -10
  490. package/build/src/testplane.js +115 -18
  491. package/build/src/testplane.js.map +1 -1
  492. package/build/src/types/globals.d.ts +16 -0
  493. package/build/src/types/globals.js +3 -0
  494. package/build/src/types/globals.js.map +1 -0
  495. package/build/src/types/index.d.ts +44 -7
  496. package/build/src/unstable.d.ts +2 -2
  497. package/build/src/unstable.js +2 -1
  498. package/build/src/unstable.js.map +1 -1
  499. package/build/src/utils/cli.d.ts +2 -0
  500. package/build/src/utils/cli.js +29 -2
  501. package/build/src/utils/cli.js.map +1 -1
  502. package/build/src/utils/config.d.ts +1 -0
  503. package/build/src/utils/config.js +6 -1
  504. package/build/src/utils/config.js.map +1 -1
  505. package/build/src/utils/crypto.d.ts +1 -0
  506. package/build/src/utils/crypto.js +2 -1
  507. package/build/src/utils/crypto.js.map +1 -1
  508. package/build/src/utils/eight-bit-rgba-to-png.d.ts +3 -0
  509. package/build/src/utils/eight-bit-rgba-to-png.js +61 -0
  510. package/build/src/utils/eight-bit-rgba-to-png.js.map +1 -0
  511. package/build/src/utils/ipc.d.ts +1 -1
  512. package/build/src/utils/ipc.js +15 -1
  513. package/build/src/utils/ipc.js.map +1 -1
  514. package/build/src/utils/logger.d.ts +9 -0
  515. package/build/src/utils/logger.js +27 -3
  516. package/build/src/utils/logger.js.map +1 -1
  517. package/build/src/utils/preload-utils.d.ts +1 -0
  518. package/build/src/utils/preload-utils.js +4 -4
  519. package/build/src/utils/preload-utils.js.map +1 -1
  520. package/build/src/utils/processor.js +15 -6
  521. package/build/src/utils/processor.js.map +1 -1
  522. package/build/src/utils/repl-instrumentation/index.d.ts +1 -0
  523. package/build/src/utils/repl-instrumentation/index.js +46 -0
  524. package/build/src/utils/repl-instrumentation/index.js.map +1 -0
  525. package/build/src/utils/repl-instrumentation/typescript.d.ts +7 -0
  526. package/build/src/utils/repl-instrumentation/typescript.js +307 -0
  527. package/build/src/utils/repl-instrumentation/typescript.js.map +1 -0
  528. package/build/src/utils/repl-module-hooks.d.ts +1 -0
  529. package/build/src/utils/repl-module-hooks.js +111 -0
  530. package/build/src/utils/repl-module-hooks.js.map +1 -0
  531. package/build/src/utils/typescript.d.ts +3 -0
  532. package/build/src/utils/typescript.js +142 -36
  533. package/build/src/utils/typescript.js.map +1 -1
  534. package/build/src/utils/worker-error-serialization.d.ts +13 -0
  535. package/build/src/utils/worker-error-serialization.js +125 -0
  536. package/build/src/utils/worker-error-serialization.js.map +1 -0
  537. package/build/src/utils/workers-registry.d.ts +2 -2
  538. package/build/src/utils/workers-registry.js +53 -3
  539. package/build/src/utils/workers-registry.js.map +1 -1
  540. package/build/src/vendors/expect-webdriverio/matchers-overrides.d.ts +49 -0
  541. package/build/src/vendors/expect-webdriverio/matchers-overrides.js +3 -0
  542. package/build/src/vendors/expect-webdriverio/matchers-overrides.js.map +1 -0
  543. package/build/src/worker/browser-env/runner/test-runner/index.js +16 -0
  544. package/build/src/worker/browser-env/runner/test-runner/index.js.map +1 -1
  545. package/build/src/worker/runner/browser-pool.js +5 -2
  546. package/build/src/worker/runner/browser-pool.js.map +1 -1
  547. package/build/src/worker/runner/index.d.ts +1 -0
  548. package/build/src/worker/runner/index.js +27 -6
  549. package/build/src/worker/runner/index.js.map +1 -1
  550. package/build/src/worker/runner/sequence-test-parser.js +5 -7
  551. package/build/src/worker/runner/sequence-test-parser.js.map +1 -1
  552. package/build/src/worker/runner/test-runner/capture-fail-screenshot.d.ts +10 -0
  553. package/build/src/worker/runner/test-runner/capture-fail-screenshot.js +68 -0
  554. package/build/src/worker/runner/test-runner/capture-fail-screenshot.js.map +1 -0
  555. package/build/src/worker/runner/test-runner/execution-thread.d.ts +2 -4
  556. package/build/src/worker/runner/test-runner/execution-thread.js +11 -18
  557. package/build/src/worker/runner/test-runner/execution-thread.js.map +1 -1
  558. package/build/src/worker/runner/test-runner/index.d.ts +3 -2
  559. package/build/src/worker/runner/test-runner/index.js +72 -12
  560. package/build/src/worker/runner/test-runner/index.js.map +1 -1
  561. package/build/src/worker/runner/test-runner/types.d.ts +1 -2
  562. package/build/src/worker/testplane-facade.js +5 -3
  563. package/build/src/worker/testplane-facade.js.map +1 -1
  564. package/build/src/worker/testplane.d.ts +2 -0
  565. package/build/src/worker/testplane.js +4 -1
  566. package/build/src/worker/testplane.js.map +1 -1
  567. package/build/src/ws-connection/constants.d.ts +13 -0
  568. package/build/src/ws-connection/constants.js +17 -0
  569. package/build/src/ws-connection/constants.js.map +1 -0
  570. package/build/src/ws-connection/error.d.ts +52 -0
  571. package/build/src/ws-connection/error.js +84 -0
  572. package/build/src/ws-connection/error.js.map +1 -0
  573. package/build/src/ws-connection/index.d.ts +83 -0
  574. package/build/src/ws-connection/index.js +397 -0
  575. package/build/src/ws-connection/index.js.map +1 -0
  576. package/build/src/ws-connection/utils.d.ts +6 -0
  577. package/build/src/ws-connection/utils.js +9 -0
  578. package/build/src/ws-connection/utils.js.map +1 -0
  579. package/package.json +41 -25
  580. package/build/src/browser/client-bridge/client-bridge.d.ts +0 -12
  581. package/build/src/browser/client-bridge/client-bridge.js +0 -45
  582. package/build/src/browser/client-bridge/client-bridge.js.map +0 -1
  583. package/build/src/browser/client-scripts/bundle.compat.js +0 -23
  584. package/build/src/browser/client-scripts/bundle.native.js +0 -15
  585. package/build/src/browser/client-scripts/ignore-areas.js +0 -7
  586. package/build/src/browser/client-scripts/index.js +0 -850
  587. package/build/src/browser/client-scripts/lib.compat.js +0 -28
  588. package/build/src/browser/client-scripts/lib.native.js +0 -28
  589. package/build/src/browser/client-scripts/rect.js +0 -251
  590. package/build/src/browser/client-scripts/util.js +0 -319
  591. package/build/src/browser/screen-shooter/index.d.ts +0 -22
  592. package/build/src/browser/screen-shooter/index.js +0 -117
  593. package/build/src/browser/screen-shooter/index.js.map +0 -1
  594. package/build/src/browser/screen-shooter/types.d.ts +0 -14
  595. package/build/src/browser/screen-shooter/types.js.map +0 -1
  596. package/build/src/browser/screen-shooter/utils.d.ts +0 -18
  597. package/build/src/browser/screen-shooter/utils.js +0 -198
  598. package/build/src/browser/screen-shooter/utils.js.map +0 -1
  599. package/build/src/browser/standalone.d.ts +0 -6
  600. package/build/src/browser/standalone.js.map +0 -1
  601. package/build/src/runner/browser-env/index.d.ts +0 -12
  602. package/build/src/runner/browser-env/index.js +0 -39
  603. package/build/src/runner/browser-env/index.js.map +0 -1
  604. package/build/src/worker/runner/test-runner/one-time-screenshooter.d.ts +0 -35
  605. package/build/src/worker/runner/test-runner/one-time-screenshooter.js +0 -86
  606. package/build/src/worker/runner/test-runner/one-time-screenshooter.js.map +0 -1
  607. /package/build/src/browser/{screen-shooter → cdp}/types.js +0 -0
@@ -4,150 +4,516 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.CompositeImage = void 0;
7
- const debug_1 = __importDefault(require("debug"));
7
+ const node_os_1 = __importDefault(require("node:os"));
8
+ const node_path_1 = __importDefault(require("node:path"));
8
9
  const image_1 = require("../../../image");
9
- const help_1 = require("../../../constants/help");
10
- const debug = (0, debug_1.default)("testplane:screenshots:composite-image");
11
- function getAreaBottom(area) {
12
- return area.top + area.height;
13
- }
14
- function getAreaRight(area) {
15
- return area.left + area.width;
16
- }
17
- function getIntersection(...areas) {
18
- const top = Math.max(...areas.map(area => area.top));
19
- const bottom = Math.min(...areas.map(getAreaBottom));
20
- const left = Math.max(...areas.map(area => area.left));
21
- const right = Math.min(...areas.map(getAreaRight));
22
- if (left >= right || top >= bottom) {
23
- return null;
24
- }
25
- return { left, top, width: right - left, height: bottom - top };
26
- }
10
+ const geometry_1 = require("../../isomorphic/geometry");
11
+ const debug_utils_1 = require("./debug-utils");
12
+ const debug_1 = require("../debug");
13
+ const debug = (0, debug_1.makeVerboseScreenshotsDebug)("testplane:screenshots:composite-image");
27
14
  class CompositeImage {
15
+ /** Creates a composite renderer instance while preserving subclass construction. */
28
16
  static create(...args) {
29
17
  return new this(...args);
30
18
  }
31
- constructor(captureArea, safeArea, ignoreAreas) {
32
- this._lastViewportImageBuffer = null;
33
- this._lastContainerOffset = null;
34
- this._lastViewportOffset = null;
35
- this._captureArea = this._sanitize(captureArea);
36
- this._safeArea = this._sanitize(safeArea);
37
- this._ignoreAreas = ignoreAreas;
19
+ /** Initializes chunk storage and an optional debug-output directory. */
20
+ constructor() {
21
+ this._debugTmpDir = null;
22
+ this._captureAreaSize = null;
38
23
  this._compositeChunks = [];
39
- debug("CompositeImage initialized. captureArea: %O, safeArea: %O, ignoreAreas: %O", this._captureArea, this._safeArea, this._ignoreAreas);
40
- }
41
- async _addIgnoreAreas(image) {
42
- debug("Adding ignore areas to image.");
43
- const size = await image.getSize();
44
- debug("Image size: %O", size);
45
- for (const area of this._ignoreAreas) {
46
- const ignoreAreaInImageCoords = getIntersection({
47
- width: area.width,
48
- height: area.height,
49
- left: area.left - this._captureArea.left,
50
- top: area.top - this._captureArea.top,
51
- }, {
52
- width: size.width,
53
- height: size.height,
54
- left: 0,
55
- top: 0,
56
- });
57
- if (ignoreAreaInImageCoords) {
58
- debug("Adding ignore area: %O", ignoreAreaInImageCoords);
59
- await image.addClear(ignoreAreaInImageCoords);
24
+ if (process.env.TESTPLANE_DEBUG_SCREENSHOTS) {
25
+ this._debugTmpDir = node_path_1.default.join(node_os_1.default.tmpdir(), `testplane-composite-image-${Math.random().toString(36).slice(2)}`);
26
+ }
27
+ }
28
+ /**
29
+ * Registers a viewport image with corresponding safe area, capture bounding rects and ignore bounding rects, all relative to the viewport.
30
+ * The order of registration can be arbitrary, viewport height can change between chunks, gaps will be handled gracefully.
31
+ * Expects finite integer coords and sizes, otherwise behavior is undefined.
32
+ * @throws {Error} if capture area size is zero or negative
33
+ */
34
+ async registerViewportImageAtOffset(viewportImage, safeArea, captureSpecs, ignoreBoundingRects, anchorShift = null) {
35
+ const visibleCoveringRect = this._getVisibleCoveringRect({ captureSpecs }) ?? (0, geometry_1.getCoveringRect)(captureSpecs.map(s => s.visible));
36
+ if (!this._captureAreaSize) {
37
+ this._captureAreaSize = (0, geometry_1.getSize)(visibleCoveringRect);
38
+ }
39
+ if (this._captureAreaSize.width <= 0 || this._captureAreaSize.height <= 0) {
40
+ throw new Error("Capture area size cannot be zero or negative. Got: " + (0, geometry_1.prettySize)(this._captureAreaSize));
41
+ }
42
+ const imageSize = viewportImage.getSize();
43
+ debug("Captured the next chunk.\n captureSpecs: %O\n visibleCoveringRect: %O\n ignoreBoundingRects: %O\n viewportImageSize: %O", captureSpecs, visibleCoveringRect, ignoreBoundingRects, imageSize);
44
+ await (0, debug_utils_1.saveViewportImageForDebugIfNeeded)(this._compositeChunks.length, viewportImage, imageSize, safeArea, captureSpecs, visibleCoveringRect, this._debugTmpDir);
45
+ this._compositeChunks.push({
46
+ image: viewportImage,
47
+ imageSize,
48
+ safeArea,
49
+ captureSpecs,
50
+ boundingRectsToIgnore: ignoreBoundingRects,
51
+ anchorShift,
52
+ });
53
+ }
54
+ /**
55
+ * Renders a composite image from the registered chunks.
56
+ * @throws {Error} if trying to render with zero chunks registered
57
+ * @throws {Error} if any of the chunks contain malformed PNG data
58
+ */
59
+ async render() {
60
+ if (!this._compositeChunks.length) {
61
+ throw new Error("Cannot render composite image: no chunks were registered.\n" +
62
+ "This means that screenshot was not captured even once and we have no image to render.");
63
+ }
64
+ if (!this._captureAreaSize) {
65
+ throw new Error("Cannot render composite image: capture area size is not set.\n" +
66
+ "This means registerViewportImageAtOffset was never called with a valid capture rect.");
67
+ }
68
+ const anchoredChunks = this._computeAnchoredChunks();
69
+ const sortedChunks = anchoredChunks.slice().sort((a, b) => (0, geometry_1.subtractCoords)(b.anchorTop, a.anchorTop));
70
+ const candidates = sortedChunks.map(chunk => this._buildCandidate(chunk));
71
+ debug("Candidates: %O", candidates);
72
+ this._chooseBestCandidates(candidates);
73
+ this._expandCandidatesToFullArea(candidates);
74
+ const commonHorizontalArea = this._computeCommonHorizontalAreaIfNeeded(candidates, this._captureAreaSize.width);
75
+ const captureWidth = commonHorizontalArea?.width ?? this._captureAreaSize.width;
76
+ debug("Chosen best candidates: %O", candidates);
77
+ const pieces = this._buildRenderPieces(candidates);
78
+ debug("Rendering composite image. chunks: %d, pieces: %O", this._compositeChunks.length, pieces);
79
+ const renderedPieces = [];
80
+ for (const piece of pieces) {
81
+ if (piece.type === "black") {
82
+ renderedPieces.push(await this._createBlackPiece(piece.height, captureWidth));
83
+ continue;
84
+ }
85
+ if (piece.verticalArea.height <= 0) {
86
+ continue;
87
+ }
88
+ renderedPieces.push(await this._createChunkPiece(piece.chunk, piece.verticalArea, captureWidth, commonHorizontalArea));
89
+ }
90
+ await (0, debug_utils_1.saveRenderedPiecesForDebugIfNeeded)(renderedPieces, this._debugTmpDir);
91
+ if (!renderedPieces.length) {
92
+ return this._createBlackPiece(this._captureAreaSize.height, captureWidth);
93
+ }
94
+ const result = renderedPieces[0];
95
+ if (renderedPieces.length > 1) {
96
+ result.addJoin(renderedPieces.slice(1));
97
+ }
98
+ await result.applyJoin();
99
+ return result;
100
+ }
101
+ /**
102
+ * Computes anchor tops for all chunks.
103
+ *
104
+ * The reference chunk is the one with the highest captureSpec covering-rect top (= the first
105
+ * scroll position, which has the most positive viewport-space top).
106
+ *
107
+ * For each non-reference chunk the base anchorTop is computed from captureSpec deltas (same as
108
+ * before). When per-chunk correction data is available, the anchor is additionally corrected.
109
+ *
110
+ * anchorTop_corrected = anchorTop_from_specs + (chunkAnchorShift - referenceAnchorShift)
111
+ *
112
+ * In the stable case correction values are 0 for all chunks.
113
+ */
114
+ _computeAnchoredChunks() {
115
+ let referenceIndex = 0;
116
+ let referenceCoveringRectTop = (0, geometry_1.getCoveringRect)(this._compositeChunks[0].captureSpecs.map(s => s.full)).top;
117
+ for (let i = 1; i < this._compositeChunks.length; i++) {
118
+ const coveringRectTop = (0, geometry_1.getCoveringRect)(this._compositeChunks[i].captureSpecs.map(s => s.full)).top;
119
+ if (coveringRectTop > referenceCoveringRectTop) {
120
+ referenceIndex = i;
121
+ referenceCoveringRectTop = coveringRectTop;
60
122
  }
61
123
  }
124
+ const referenceChunk = this._compositeChunks[referenceIndex];
125
+ const referenceCaptureSpecs = referenceChunk.captureSpecs;
126
+ const referenceAnchorShift = referenceChunk.anchorShift;
127
+ const anchoredChunks = this._compositeChunks.map((chunk, index) => {
128
+ if (index === referenceIndex) {
129
+ return { ...chunk, anchorTop: referenceCoveringRectTop };
130
+ }
131
+ let maxDelta = 0;
132
+ let hasRenderableDelta = false;
133
+ const minLength = Math.min(chunk.captureSpecs.length, referenceCaptureSpecs.length);
134
+ for (let i = 0; i < minLength; i++) {
135
+ const referenceSpec = referenceCaptureSpecs[i];
136
+ const chunkSpec = chunk.captureSpecs[i];
137
+ if (!this._isRenderableCaptureSpec(referenceSpec) || !this._isRenderableCaptureSpec(chunkSpec)) {
138
+ continue;
139
+ }
140
+ const delta = (0, geometry_1.subtractCoords)(referenceSpec.full.top, chunkSpec.full.top);
141
+ if (delta > maxDelta) {
142
+ maxDelta = delta;
143
+ }
144
+ hasRenderableDelta = true;
145
+ }
146
+ if (!hasRenderableDelta) {
147
+ for (let i = 0; i < minLength; i++) {
148
+ const referenceSpec = referenceCaptureSpecs[i];
149
+ const chunkSpec = chunk.captureSpecs[i];
150
+ const delta = (0, geometry_1.subtractCoords)(referenceSpec.full.top, chunkSpec.full.top);
151
+ if (delta > maxDelta) {
152
+ maxDelta = delta;
153
+ }
154
+ }
155
+ }
156
+ else if (maxDelta === 0) {
157
+ for (let i = 0; i < minLength; i++) {
158
+ const referenceSpec = referenceCaptureSpecs[i];
159
+ const chunkSpec = chunk.captureSpecs[i];
160
+ if (!this._isRenderableCaptureSpec(chunkSpec)) {
161
+ continue;
162
+ }
163
+ const delta = (0, geometry_1.subtractCoords)(referenceSpec.full.top, chunkSpec.full.top);
164
+ if (delta > maxDelta) {
165
+ maxDelta = delta;
166
+ }
167
+ }
168
+ }
169
+ const anchorTopFromSpecs = referenceCoveringRectTop - maxDelta;
170
+ // Apply content-shift correction when anchor tracking data is available (best-effort pass).
171
+ const shiftCorrection = chunk.anchorShift !== null && referenceAnchorShift !== null
172
+ ? chunk.anchorShift - referenceAnchorShift
173
+ : 0;
174
+ return {
175
+ ...chunk,
176
+ anchorTop: (anchorTopFromSpecs + shiftCorrection),
177
+ };
178
+ });
179
+ debug("Anchored chunks: %O", anchoredChunks);
180
+ return anchoredChunks;
62
181
  }
63
- hasNotCapturedArea() {
64
- return Boolean(this.getNextNotCapturedArea());
182
+ /** Checks whether a capture spec contributes visible pixels in the current chunk. */
183
+ _isRenderableCaptureSpec(spec) {
184
+ return spec.visible.width > 0 && spec.visible.height > 0;
65
185
  }
66
- getNextNotCapturedArea() {
67
- const capturedAreaHeight = this._compositeChunks.reduce((acc, chunk) => acc + chunk.imageSize.height, 0);
68
- if (capturedAreaHeight >= this._captureArea.height) {
186
+ /** Returns the bounding rect that covers all visible capture-spec parts for a chunk. */
187
+ _getVisibleCoveringRect(chunk) {
188
+ const visibleRects = chunk.captureSpecs
189
+ .filter(spec => this._isRenderableCaptureSpec(spec))
190
+ .map(spec => spec.visible);
191
+ if (!visibleRects.length) {
69
192
  return null;
70
193
  }
194
+ return (0, geometry_1.getCoveringRect)(visibleRects);
195
+ }
196
+ /** Builds a segment candidate, listing all possible options, e.g. strictly follow safe area, relax top/bottom edges, ignore safe area at all. */
197
+ _buildCandidate(chunk) {
198
+ const strict = this._getYBandForMode(chunk, "strict");
199
+ const relaxTop = this._getYBandForMode(chunk, "relaxTop");
200
+ const relaxBottom = this._getYBandForMode(chunk, "relaxBottom");
201
+ const full = this._getYBandForMode(chunk, "full");
71
202
  return {
72
- left: this._captureArea.left,
73
- top: this._captureArea.top + capturedAreaHeight,
74
- width: this._captureArea.width,
75
- height: this._captureArea.height - capturedAreaHeight,
203
+ chunk,
204
+ strict,
205
+ relaxTop,
206
+ relaxBottom,
207
+ full,
208
+ chosen: strict,
76
209
  };
77
210
  }
78
- async registerViewportImageAtOffset(viewportImage, scrollElementOffset, viewportOffset) {
79
- const notCapturedArea = this.getNextNotCapturedArea();
80
- const notCapturedAreaInViewportCoords = this._fromPageCoordsToViewportCoords(scrollElementOffset, viewportOffset, notCapturedArea);
81
- const cropAreaInViewportCoords = this._sanitize(getIntersection(this._safeArea, notCapturedAreaInViewportCoords));
82
- if (this._compositeChunks.length === 0 && cropAreaInViewportCoords.top > notCapturedAreaInViewportCoords.top) {
83
- debug("Safe area prevented us from capturing head of the element at the beginning, expanding crop area.");
84
- debug(" crop area top before: %O", cropAreaInViewportCoords.top);
85
- cropAreaInViewportCoords.height =
86
- cropAreaInViewportCoords.height + (cropAreaInViewportCoords.top - notCapturedAreaInViewportCoords.top);
87
- cropAreaInViewportCoords.top = Math.max(0, notCapturedAreaInViewportCoords.top);
88
- debug(" crop area top after: %O", cropAreaInViewportCoords.top);
89
- }
90
- this._lastViewportImageBuffer = await viewportImage.toPngBuffer({ resolveWithObject: false });
91
- this._lastContainerOffset = scrollElementOffset;
92
- this._lastViewportOffset = viewportOffset;
93
- debug("Captured the next chunk at offset %O.\n notCapturedArea before capture: %O\n notCapturedAreaInViewportCoords: %O\n cropArea: %O\n windowOffset: %O", scrollElementOffset, notCapturedArea, notCapturedAreaInViewportCoords, cropAreaInViewportCoords, viewportOffset);
94
- await viewportImage.crop(cropAreaInViewportCoords);
95
- this._compositeChunks.push({ image: viewportImage, imageSize: await viewportImage.getSize() });
211
+ /** Computes a usable vertical band for a specific mode: e.g. what if we expand the top edge of the safe area? */
212
+ _getYBandForMode(chunk, mode) {
213
+ const viewportTop = 0;
214
+ const viewportBottom = chunk.imageSize.height;
215
+ const safeTop = chunk.safeArea.top;
216
+ const safeBottom = (0, geometry_1.getBottom)(chunk.safeArea);
217
+ let resultingBand = {
218
+ top: safeTop,
219
+ height: (0, geometry_1.getHeight)(safeTop, safeBottom),
220
+ };
221
+ if (mode === "relaxTop") {
222
+ resultingBand.top = viewportTop;
223
+ resultingBand.height = (0, geometry_1.getHeight)(resultingBand.top, safeBottom);
224
+ }
225
+ else if (mode === "relaxBottom") {
226
+ resultingBand.height = (0, geometry_1.getHeight)(resultingBand.top, viewportBottom);
227
+ }
228
+ else if (mode === "full") {
229
+ resultingBand.top = viewportTop;
230
+ resultingBand.height = (0, geometry_1.getHeight)(resultingBand.top, viewportBottom);
231
+ }
232
+ const visibleCoveringRect = this._getVisibleCoveringRect(chunk);
233
+ if (!visibleCoveringRect) {
234
+ return null;
235
+ }
236
+ resultingBand = (0, geometry_1.intersectYBands)(resultingBand, { top: viewportTop, height: chunk.imageSize.height });
237
+ resultingBand = (0, geometry_1.intersectYBands)(resultingBand, visibleCoveringRect);
238
+ if (!resultingBand || resultingBand.height <= 0) {
239
+ return null;
240
+ }
241
+ return resultingBand;
96
242
  }
97
- async render() {
98
- if (!this._lastViewportImageBuffer || !this._lastContainerOffset || !this._lastViewportOffset) {
99
- throw new Error("Cannot render composite image: last viewport image buffer, container offset or window offset is not set.\n" +
100
- "This means that screenshot was not captured even once and we have no image to render.\n" +
101
- "Please, make sure element that you are trying to capture exists and is valid.\n\n" +
102
- "If everything looks fine, but you are getting this error, please run your test with DEBUG=testplane:screenshots* and let us know at " +
103
- help_1.NEW_ISSUE_LINK);
104
- }
105
- if (this.hasNotCapturedArea()) {
106
- debug("Safe area prevented us from capturing tail of the element in the end, adding it to the composite image.");
107
- const captureAreaTail = new image_1.Image(this._lastViewportImageBuffer);
108
- const notCapturedArea = this.getNextNotCapturedArea();
109
- const notCapturedAreaInViewportCoords = this._fromPageCoordsToViewportCoords(this._lastContainerOffset, this._lastViewportOffset, notCapturedArea);
110
- const viewportSize = await captureAreaTail.getSize();
111
- const cropAreaInViewportCoords = this._sanitize(getIntersection({ top: 0, left: 0, width: viewportSize.width, height: viewportSize.height }, notCapturedAreaInViewportCoords));
112
- if (cropAreaInViewportCoords.height > 0) {
113
- captureAreaTail.crop(cropAreaInViewportCoords);
114
- debug(" crop area coordinates: %O", cropAreaInViewportCoords);
115
- this._compositeChunks.push({ image: captureAreaTail, imageSize: await captureAreaTail.getSize() });
116
- }
117
- else {
118
- debug(" crop area is empty, skipping");
119
- }
120
- }
121
- debug("Rendering composite image.");
122
- const image = new image_1.Image(await this._compositeChunks[0].image.toPngBuffer({ resolveWithObject: false }));
123
- if (this._compositeChunks.length > 1) {
124
- image.addJoin(this._compositeChunks.slice(1).map(chunk => {
125
- debug(" Adding chunk to join. imageSize: %O", chunk.imageSize);
126
- return chunk.image;
127
- }));
128
- }
129
- await this._addIgnoreAreas(image);
130
- await image.applyJoin();
131
- return image;
243
+ /** Chooses the best vertical band per chunk, relaxing edges only where needed to avoid gaps. */
244
+ _chooseBestCandidates(candidates) {
245
+ if (!candidates.length) {
246
+ return;
247
+ }
248
+ // Always choose relaxed values for the first and last candidates
249
+ const first = candidates[0];
250
+ first.chosen = first.chosen ?? first.relaxTop ?? first.full;
251
+ if (first.chosen) {
252
+ const originalBottom = (0, geometry_1.getBottom)(first.chosen);
253
+ const relaxedTop = first.relaxTop?.top ?? first.full?.top ?? first.chosen.top;
254
+ first.chosen.top = (0, geometry_1.getMinCoord)(first.chosen.top, relaxedTop);
255
+ first.chosen.height = (0, geometry_1.getHeight)(first.chosen.top, originalBottom);
256
+ }
257
+ const last = candidates[candidates.length - 1];
258
+ last.chosen = last.chosen ?? last.relaxBottom ?? last.full;
259
+ if (last.chosen) {
260
+ const relaxedBottom = (0, geometry_1.getBottom)(last.relaxBottom ?? last.full ?? last.chosen);
261
+ const currentBottom = (0, geometry_1.getBottom)(last.chosen);
262
+ const maxBottom = (0, geometry_1.getMaxCoord)(currentBottom, relaxedBottom);
263
+ const maxHeight = (0, geometry_1.getHeight)(last.chosen.top, maxBottom);
264
+ last.chosen.height = (0, geometry_1.getMaxLength)(last.chosen.height, maxHeight);
265
+ }
266
+ for (let i = 0; i < candidates.length - 1; i++) {
267
+ const upper = candidates[i];
268
+ const lower = candidates[i + 1];
269
+ upper.chosen = upper.chosen ?? upper.relaxBottom ?? upper.full;
270
+ lower.chosen = lower.chosen ?? lower.relaxTop ?? lower.full;
271
+ if (!upper.chosen || !lower.chosen) {
272
+ continue;
273
+ }
274
+ let upperRelativeToCaptureArea = {
275
+ top: (0, geometry_1.fromViewportToCaptureArea)(upper.chosen.top, upper.chunk.anchorTop),
276
+ height: upper.chosen.height,
277
+ };
278
+ let upperBottomRelativeToCaptureArea = (0, geometry_1.getBottom)(upperRelativeToCaptureArea);
279
+ let lowerTopRelativeToCaptureArea = (0, geometry_1.fromViewportToCaptureArea)(lower.chosen.top, lower.chunk.anchorTop);
280
+ if (upperBottomRelativeToCaptureArea >= lowerTopRelativeToCaptureArea) {
281
+ continue;
282
+ }
283
+ const relaxedUpperBottom = (0, geometry_1.getBottom)(upper.relaxBottom ?? upper.full ?? upper.chosen);
284
+ if (relaxedUpperBottom > (0, geometry_1.getBottom)(upper.chosen)) {
285
+ upper.chosen.height = (0, geometry_1.getHeight)(upper.chosen.top, relaxedUpperBottom);
286
+ }
287
+ upperRelativeToCaptureArea = {
288
+ top: (0, geometry_1.fromViewportToCaptureArea)(upper.chosen.top, upper.chunk.anchorTop),
289
+ height: upper.chosen.height,
290
+ };
291
+ upperBottomRelativeToCaptureArea = (0, geometry_1.getBottom)(upperRelativeToCaptureArea);
292
+ lowerTopRelativeToCaptureArea = (0, geometry_1.fromViewportToCaptureArea)(lower.chosen.top, lower.chunk.anchorTop);
293
+ if (upperBottomRelativeToCaptureArea >= lowerTopRelativeToCaptureArea) {
294
+ continue;
295
+ }
296
+ const relaxedLowerStart = lower.relaxTop?.top ?? lower.full?.top ?? lower.chosen.top;
297
+ if (relaxedLowerStart < lower.chosen.top) {
298
+ const originalBottom = (0, geometry_1.getBottom)(lower.chosen);
299
+ lower.chosen.top = relaxedLowerStart;
300
+ lower.chosen.height = (0, geometry_1.getHeight)(lower.chosen.top, originalBottom);
301
+ }
302
+ }
132
303
  }
133
- _sanitize(area) {
134
- if (!area) {
135
- return { left: 0, top: 0, width: 0, height: 0 };
304
+ /** Expansion for cases when capture elements are far apart and not fit one viewport. */
305
+ _expandCandidatesToFullArea(candidates) {
306
+ if (candidates.some(candidate => this._doesVisibleAreaCoverFullArea(candidate.chunk))) {
307
+ return;
136
308
  }
137
- return {
138
- left: Math.max(area.left, 0),
139
- top: Math.max(area.top, 0),
140
- width: Math.max(area.width, 0),
141
- height: Math.max(area.height, 0),
309
+ for (const candidate of candidates) {
310
+ if (!candidate.chosen) {
311
+ continue;
312
+ }
313
+ const safeAreaBand = candidate.chunk.safeArea;
314
+ const fullCoveringRect = (0, geometry_1.getCoveringRect)(candidate.chunk.captureSpecs.map(spec => spec.full));
315
+ const safeAreaBottom = (0, geometry_1.getBottom)(safeAreaBand);
316
+ const fullBottom = (0, geometry_1.getBottom)(fullCoveringRect);
317
+ const chosenBottom = (0, geometry_1.getBottom)(candidate.chosen);
318
+ let top = candidate.chosen.top;
319
+ let bottom = chosenBottom;
320
+ if (fullCoveringRect.top < safeAreaBand.top && top > safeAreaBand.top) {
321
+ top = safeAreaBand.top;
322
+ }
323
+ if (fullBottom > safeAreaBottom && bottom < safeAreaBottom) {
324
+ bottom = safeAreaBottom;
325
+ }
326
+ if (top !== candidate.chosen.top || bottom !== chosenBottom) {
327
+ candidate.chosen = {
328
+ top,
329
+ height: (0, geometry_1.getHeight)(top, bottom),
330
+ };
331
+ candidate.expanded = true;
332
+ }
333
+ }
334
+ }
335
+ /** Checks whether visible capture-spec pixels cover the complete requested capture area. */
336
+ _doesVisibleAreaCoverFullArea(chunk) {
337
+ const visibleCoveringRect = this._getVisibleCoveringRect(chunk);
338
+ if (!visibleCoveringRect) {
339
+ return false;
340
+ }
341
+ const fullCoveringRect = (0, geometry_1.getCoveringRect)(chunk.captureSpecs.map(spec => spec.full));
342
+ return (visibleCoveringRect.top <= fullCoveringRect.top &&
343
+ (0, geometry_1.getBottom)(visibleCoveringRect) >= (0, geometry_1.getBottom)(fullCoveringRect));
344
+ }
345
+ /** Given a list of best possible segments, builds a list of image pieces, inserting gaps when needed,
346
+ * ensuring resulting array is a vertically continuous sequence of pieces. */
347
+ _buildRenderPieces(candidates) {
348
+ const pieces = [];
349
+ const sortedCandidates = candidates
350
+ .filter(candidate => Boolean(candidate.chosen))
351
+ .sort((a, b) => (0, geometry_1.subtractCoords)((0, geometry_1.fromViewportToCaptureArea)(a.chosen.top, a.chunk.anchorTop), (0, geometry_1.fromViewportToCaptureArea)(b.chosen.top, b.chunk.anchorTop)));
352
+ let cursor = 0;
353
+ let hasStartedRendering = false;
354
+ for (const candidate of sortedCandidates) {
355
+ const chosen = candidate.chosen;
356
+ const chosenRelativeToCaptureArea = {
357
+ top: (0, geometry_1.fromViewportToCaptureArea)(chosen.top, candidate.chunk.anchorTop),
358
+ height: chosen.height,
359
+ };
360
+ const bottomRelativeToCaptureArea = (0, geometry_1.getBottom)(chosenRelativeToCaptureArea);
361
+ if (bottomRelativeToCaptureArea <= cursor) {
362
+ continue;
363
+ }
364
+ if (!hasStartedRendering) {
365
+ cursor = chosenRelativeToCaptureArea.top;
366
+ hasStartedRendering = true;
367
+ }
368
+ const topRelativeToCaptureArea = (0, geometry_1.getMaxCoord)(chosenRelativeToCaptureArea.top, cursor);
369
+ if (topRelativeToCaptureArea > cursor) {
370
+ pieces.push(...this._buildGapPieces(candidates, cursor, topRelativeToCaptureArea));
371
+ }
372
+ const cursorRelativeToViewport = (0, geometry_1.fromCaptureAreaToViewport)(cursor, candidate.chunk.anchorTop);
373
+ const topRelativeToViewport = (0, geometry_1.getMaxCoord)(chosen.top, cursorRelativeToViewport);
374
+ const bottomRelativeToViewport = (0, geometry_1.getBottom)(chosen);
375
+ pieces.push({
376
+ type: "chunk",
377
+ chunk: candidate.chunk,
378
+ verticalArea: {
379
+ top: topRelativeToViewport,
380
+ height: (0, geometry_1.getHeight)(topRelativeToViewport, bottomRelativeToViewport),
381
+ },
382
+ });
383
+ cursor = bottomRelativeToCaptureArea;
384
+ }
385
+ return pieces;
386
+ }
387
+ /** Fills an uncovered capture-area gap with usable chunk areas or black fallback slices. */
388
+ _buildGapPieces(candidates, gapTop, gapBottom) {
389
+ const pieces = [];
390
+ const usableAreas = candidates
391
+ .map(candidate => {
392
+ const safeArea = candidate.chunk.safeArea;
393
+ return {
394
+ chunk: candidate.chunk,
395
+ area: {
396
+ top: (0, geometry_1.fromViewportToCaptureArea)(safeArea.top, candidate.chunk.anchorTop),
397
+ height: safeArea.height,
398
+ },
399
+ };
400
+ })
401
+ .sort((a, b) => (0, geometry_1.subtractCoords)(a.area.top, b.area.top));
402
+ let cursor = gapTop;
403
+ for (const { chunk, area } of usableAreas) {
404
+ const areaBottom = (0, geometry_1.getBottom)(area);
405
+ if (areaBottom <= cursor || area.top >= gapBottom) {
406
+ continue;
407
+ }
408
+ const top = (0, geometry_1.getMaxCoord)(area.top, cursor);
409
+ const bottom = (0, geometry_1.getMinCoord)(areaBottom, gapBottom);
410
+ if (top > cursor) {
411
+ pieces.push({ type: "black", height: (0, geometry_1.getHeight)(cursor, top) });
412
+ }
413
+ if (bottom > top) {
414
+ pieces.push({
415
+ type: "chunk",
416
+ chunk,
417
+ verticalArea: {
418
+ top: (0, geometry_1.fromCaptureAreaToViewport)(top, chunk.anchorTop),
419
+ height: (0, geometry_1.getHeight)(top, bottom),
420
+ },
421
+ });
422
+ cursor = bottom;
423
+ }
424
+ if (cursor >= gapBottom) {
425
+ break;
426
+ }
427
+ }
428
+ if (cursor < gapBottom) {
429
+ pieces.push({ type: "black", height: (0, geometry_1.getHeight)(cursor, gapBottom) });
430
+ }
431
+ return pieces;
432
+ }
433
+ /** Returns the horizontal viewport band occupied by visible capture-spec pixels. */
434
+ _getChunkHorizontalArea(chunk) {
435
+ const viewportHorizontalArea = {
436
+ left: 0,
437
+ width: chunk.imageSize.width,
142
438
  };
439
+ const visibleCoveringRect = this._getVisibleCoveringRect(chunk);
440
+ if (!visibleCoveringRect) {
441
+ return null;
442
+ }
443
+ return (0, geometry_1.intersectXBands)(viewportHorizontalArea, visibleCoveringRect);
143
444
  }
144
- _fromPageCoordsToViewportCoords(scrollElementOffset, viewportOffset, areaInPageCoords) {
445
+ /** Computes a shared horizontal crop band when chunks cannot safely use the original width. */
446
+ _computeCommonHorizontalAreaIfNeeded(candidates, captureWidth) {
447
+ const chunkHorizontalAreas = candidates
448
+ .map(candidate => this._getCandidateHorizontalArea(candidate))
449
+ .filter((area) => Boolean(area));
450
+ if (chunkHorizontalAreas.length === 0) {
451
+ return null;
452
+ }
453
+ const hasMultipleCaptureSpecs = candidates.some(candidate => candidate.chunk.captureSpecs.length > 1);
454
+ const hasExpandedCandidate = candidates.some(candidate => candidate.expanded);
455
+ const hasWidthMismatch = chunkHorizontalAreas.some(area => area.width !== captureWidth);
456
+ if (!hasMultipleCaptureSpecs && !hasExpandedCandidate && !hasWidthMismatch) {
457
+ return null;
458
+ }
459
+ const left = Math.min(...chunkHorizontalAreas.map(area => area.left));
460
+ const right = Math.max(...chunkHorizontalAreas.map(area => area.left + area.width));
145
461
  return {
146
- left: areaInPageCoords.left - scrollElementOffset.left - viewportOffset.left,
147
- top: areaInPageCoords.top - scrollElementOffset.top - viewportOffset.top,
148
- width: areaInPageCoords.width,
149
- height: areaInPageCoords.height,
462
+ left: left,
463
+ width: (right - left),
464
+ };
465
+ }
466
+ /** Selects the horizontal band that should be used for a candidate chunk. */
467
+ _getCandidateHorizontalArea(candidate) {
468
+ if (!candidate.expanded) {
469
+ return this._getChunkHorizontalArea(candidate.chunk);
470
+ }
471
+ return this._getExpandedChunkHorizontalArea(candidate.chunk) ?? this._getChunkHorizontalArea(candidate.chunk);
472
+ }
473
+ /** Computes a horizontal band for expanded chunks using requested full rects and clip bounds. */
474
+ _getExpandedChunkHorizontalArea(chunk) {
475
+ const viewportHorizontalArea = {
476
+ left: 0,
477
+ width: chunk.imageSize.width,
478
+ };
479
+ const fullCoveringRect = (0, geometry_1.getCoveringRect)(chunk.captureSpecs.map(spec => spec.full));
480
+ const clipCoveringRect = (0, geometry_1.getCoveringRect)(chunk.captureSpecs.map(spec => spec.clip));
481
+ const fullHorizontalArea = (0, geometry_1.intersectXBands)(viewportHorizontalArea, fullCoveringRect);
482
+ return (0, geometry_1.intersectXBands)(fullHorizontalArea, clipCoveringRect);
483
+ }
484
+ /** Crops one viewport chunk into a render piece after clearing ignored regions. */
485
+ async _createChunkPiece(chunk, verticalArea, captureWidth, commonHorizontalArea) {
486
+ const viewportHorizontalArea = {
487
+ left: 0,
488
+ width: chunk.imageSize.width,
489
+ };
490
+ const horizonalArea = commonHorizontalArea
491
+ ? (0, geometry_1.intersectXBands)(viewportHorizontalArea, commonHorizontalArea)
492
+ : this._getChunkHorizontalArea(chunk);
493
+ if (!horizonalArea ||
494
+ horizonalArea.width <= 0 ||
495
+ verticalArea.height <= 0 ||
496
+ horizonalArea.width !== captureWidth) {
497
+ debug("Chunk crop area is invalid or doesn't match capture width, using black fallback.\n verticalArea: %O\n horizonalArea: %O \n captureWidth: %d", verticalArea, horizonalArea, captureWidth);
498
+ return this._createBlackPiece(verticalArea.height, captureWidth);
499
+ }
500
+ const cropArea = {
501
+ top: verticalArea.top,
502
+ height: verticalArea.height,
503
+ left: horizonalArea.left,
504
+ width: horizonalArea.width,
150
505
  };
506
+ const image = await chunk.image.clone();
507
+ for (const ignoreRect of chunk.boundingRectsToIgnore) {
508
+ await image.addClear(ignoreRect);
509
+ }
510
+ await image.applyJoin();
511
+ await image.crop(cropArea);
512
+ return image;
513
+ }
514
+ /** Creates a black fallback image piece for areas that no chunk can provide. */
515
+ async _createBlackPiece(height, width) {
516
+ return new image_1.Image({ width, height });
151
517
  }
152
518
  }
153
519
  exports.CompositeImage = CompositeImage;