sourcemonkey 0.0.0-stage → 0.5.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 (367) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +87 -2
  3. package/dist/bytes.js +37 -0
  4. package/dist/channel-placeholder.js +5 -0
  5. package/dist/collection-scan.js +17 -0
  6. package/dist/collections.html +353 -0
  7. package/dist/compare.html +358 -0
  8. package/dist/composed-source.js +205 -0
  9. package/dist/connect-prompt.html +47 -0
  10. package/dist/debug/icons.html +211 -0
  11. package/dist/debug/storage.html +163 -0
  12. package/dist/debug-log.js +75 -0
  13. package/dist/diagnostic-location.js +64 -0
  14. package/dist/eval-hook.js +308 -0
  15. package/dist/extension/background.js +5263 -0
  16. package/dist/extension/channel.js +133 -0
  17. package/dist/extension/code-links.js +187 -0
  18. package/dist/extension/code-tabs.js +460 -0
  19. package/dist/extension/collection-dialog.js +619 -0
  20. package/dist/extension/collection-display.js +322 -0
  21. package/dist/extension/collections.js +2905 -0
  22. package/dist/extension/compare.js +867 -0
  23. package/dist/extension/concurrency.js +186 -0
  24. package/dist/extension/connect-grants.js +109 -0
  25. package/dist/extension/connect-prompt-page.js +70 -0
  26. package/dist/extension/connect-prompt.js +266 -0
  27. package/dist/extension/copy-button.js +63 -0
  28. package/dist/extension/copy-dialog.js +502 -0
  29. package/dist/extension/copy-preference.js +66 -0
  30. package/dist/extension/debug/icons.js +203 -0
  31. package/dist/extension/debug/storage.js +365 -0
  32. package/dist/extension/deep-link.js +77 -0
  33. package/dist/extension/delete-dialog.js +432 -0
  34. package/dist/extension/delete-icon.js +40 -0
  35. package/dist/extension/details-tooltips.js +66 -0
  36. package/dist/extension/directories.js +679 -0
  37. package/dist/extension/export-backup.js +407 -0
  38. package/dist/extension/export-dialog.js +142 -0
  39. package/dist/extension/file-access.js +74 -0
  40. package/dist/extension/file-changes.js +346 -0
  41. package/dist/extension/frame-info.js +85 -0
  42. package/dist/extension/github-provider.js +336 -0
  43. package/dist/extension/glyph.js +84 -0
  44. package/dist/extension/gm-bindings.js +601 -0
  45. package/dist/extension/gm-download.js +419 -0
  46. package/dist/extension/gm-menu.js +228 -0
  47. package/dist/extension/gm-notification.js +141 -0
  48. package/dist/extension/gm-originator-map.js +23 -0
  49. package/dist/extension/gm-tab-data.js +121 -0
  50. package/dist/extension/gm-tab.js +160 -0
  51. package/dist/extension/gm-url-change.js +111 -0
  52. package/dist/extension/gm-url-scheme.js +27 -0
  53. package/dist/extension/gm-values.js +176 -0
  54. package/dist/extension/gm-window-control.js +104 -0
  55. package/dist/extension/gm-xhr-headers.js +333 -0
  56. package/dist/extension/gm-xhr.js +584 -0
  57. package/dist/extension/injector.js +3145 -0
  58. package/dist/extension/install-capture.js +277 -0
  59. package/dist/extension/line-diff.js +233 -0
  60. package/dist/extension/local-copy.js +560 -0
  61. package/dist/extension/local-delete.js +276 -0
  62. package/dist/extension/location-kinds.js +108 -0
  63. package/dist/extension/log-format.js +158 -0
  64. package/dist/extension/managed-changes.js +361 -0
  65. package/dist/extension/managed-items.js +57 -0
  66. package/dist/extension/match-index.js +375 -0
  67. package/dist/extension/missing-scripts.js +66 -0
  68. package/dist/extension/more-menu.js +109 -0
  69. package/dist/extension/move-dialog.js +197 -0
  70. package/dist/extension/offscreen.js +37 -0
  71. package/dist/extension/options.js +504 -0
  72. package/dist/extension/page-heading.js +170 -0
  73. package/dist/extension/page-links.js +199 -0
  74. package/dist/extension/parse-check-client.js +70 -0
  75. package/dist/extension/parse-check.js +161 -0
  76. package/dist/extension/parse-sandbox-host.js +172 -0
  77. package/dist/extension/parse-sandbox.js +175 -0
  78. package/dist/extension/popup-commands-open.js +41 -0
  79. package/dist/extension/popup-view.js +387 -0
  80. package/dist/extension/popup.js +703 -0
  81. package/dist/extension/prism-userscript.js +53 -0
  82. package/dist/extension/refresh-error.js +136 -0
  83. package/dist/extension/refresh-targets.js +160 -0
  84. package/dist/extension/related-versions.js +1144 -0
  85. package/dist/extension/resize-observer-loop.js +19 -0
  86. package/dist/extension/row-cache.js +387 -0
  87. package/dist/extension/script-blobs.js +413 -0
  88. package/dist/extension/script-details.js +658 -0
  89. package/dist/extension/script-enablement.js +285 -0
  90. package/dist/extension/script-identity.js +310 -0
  91. package/dist/extension/script-keys.js +54 -0
  92. package/dist/extension/script-log-id.js +155 -0
  93. package/dist/extension/script-log.js +290 -0
  94. package/dist/extension/script-rejection.js +104 -0
  95. package/dist/extension/script-sites.js +158 -0
  96. package/dist/extension/script-store.js +3507 -0
  97. package/dist/extension/script-updater.js +991 -0
  98. package/dist/extension/script-url-hash.js +61 -0
  99. package/dist/extension/select-all.js +37 -0
  100. package/dist/extension/select-open-guard.js +90 -0
  101. package/dist/extension/site-icon.js +1261 -0
  102. package/dist/extension/sm-dev-link.js +302 -0
  103. package/dist/extension/solo-click.js +58 -0
  104. package/dist/extension/sticky-numbers.js +188 -0
  105. package/dist/extension/storage-breakdown.js +253 -0
  106. package/dist/extension/storage-scan.js +86 -0
  107. package/dist/extension/storage-usage.js +194 -0
  108. package/dist/extension/structural-keys.js +29 -0
  109. package/dist/extension/sw-teardown.js +36 -0
  110. package/dist/extension/tab-status.js +403 -0
  111. package/dist/extension/toolbar-summary.js +105 -0
  112. package/dist/extension/user-scripts-access.js +43 -0
  113. package/dist/extension/userscript.js +3672 -0
  114. package/dist/extension/value-store.js +204 -0
  115. package/dist/extension/version-probe-fetch.js +68 -0
  116. package/dist/extension/worker-client.js +109 -0
  117. package/dist/extension/worker-ops.js +171 -0
  118. package/dist/extension/zip-writer.js +24 -0
  119. package/dist/external-files.js +878 -0
  120. package/dist/file-loader.js +436 -0
  121. package/dist/file-locations.js +439 -0
  122. package/dist/generated-wrappers.js +5 -0
  123. package/dist/github-auth.js +148 -0
  124. package/dist/github-urls.js +46 -0
  125. package/dist/gm-api-catalog.js +217 -0
  126. package/dist/gm-connect.js +273 -0
  127. package/dist/gm-xhr-types.js +5 -0
  128. package/dist/http-read.js +142 -0
  129. package/dist/icons/icon-128.png +0 -0
  130. package/dist/icons/icon-16.png +0 -0
  131. package/dist/icons/icon-48.png +0 -0
  132. package/dist/local-file-overrides.js +558 -0
  133. package/dist/manifest.json +38 -0
  134. package/dist/markup-response.js +126 -0
  135. package/dist/match-targets.js +305 -0
  136. package/dist/menu-captions.js +22 -0
  137. package/dist/offscreen.html +39 -0
  138. package/dist/options.html +197 -0
  139. package/dist/parse-check-protocol.js +51 -0
  140. package/dist/parse-location.js +171 -0
  141. package/dist/parse-sandbox.html +56 -0
  142. package/dist/phase-timing.js +155 -0
  143. package/dist/popup.html +197 -0
  144. package/dist/public-suffixes.js +6957 -0
  145. package/dist/run-context.js +31 -0
  146. package/dist/runtime-messages.js +34 -0
  147. package/dist/sandboxed-page.js +35 -0
  148. package/dist/script-build.js +787 -0
  149. package/dist/script-display.js +383 -0
  150. package/dist/script-icon.js +43 -0
  151. package/dist/script-links.js +204 -0
  152. package/dist/script-source-url.js +214 -0
  153. package/dist/script-world.js +65 -0
  154. package/dist/sm-dev-protocol.js +84 -0
  155. package/dist/source-map.js +177 -0
  156. package/dist/stack-link.js +138 -0
  157. package/dist/styles.css +825 -0
  158. package/dist/unsafe-window-use.js +229 -0
  159. package/dist/url-match.js +734 -0
  160. package/dist/userscript-header.js +248 -0
  161. package/dist/userscript.html +1165 -0
  162. package/dist/vendor/fflate.LICENSE +21 -0
  163. package/dist/vendor/fflate.js +2692 -0
  164. package/dist/vendor/prism/prism-line-numbers.css +1 -0
  165. package/dist/vendor/prism/prism-line-numbers.js +1 -0
  166. package/dist/vendor/prism/prism.css +1 -0
  167. package/dist/vendor/prism/prism.js +1946 -0
  168. package/dist/version-compare.js +141 -0
  169. package/dist/version-probe.js +120 -0
  170. package/lib/build-info.json +1 -0
  171. package/lib/bytes.d.ts +3 -0
  172. package/lib/bytes.js +37 -0
  173. package/lib/channel-placeholder.d.ts +1 -0
  174. package/lib/channel-placeholder.js +5 -0
  175. package/lib/collection-scan.d.ts +8 -0
  176. package/lib/collection-scan.js +17 -0
  177. package/lib/composed-source.d.ts +28 -0
  178. package/lib/composed-source.js +205 -0
  179. package/lib/debug-log.d.ts +9 -0
  180. package/lib/debug-log.js +75 -0
  181. package/lib/diagnostic-location.d.ts +8 -0
  182. package/lib/diagnostic-location.js +64 -0
  183. package/lib/eval-hook.d.ts +34 -0
  184. package/lib/eval-hook.js +308 -0
  185. package/lib/external-files.d.ts +111 -0
  186. package/lib/external-files.js +878 -0
  187. package/lib/file-loader.d.ts +48 -0
  188. package/lib/file-loader.js +436 -0
  189. package/lib/file-locations.d.ts +44 -0
  190. package/lib/file-locations.js +439 -0
  191. package/lib/generated-wrappers.d.ts +11 -0
  192. package/lib/generated-wrappers.js +5 -0
  193. package/lib/github-auth.d.ts +12 -0
  194. package/lib/github-auth.js +148 -0
  195. package/lib/github-urls.d.ts +1 -0
  196. package/lib/github-urls.js +46 -0
  197. package/lib/gm-api-catalog.d.ts +24 -0
  198. package/lib/gm-api-catalog.js +217 -0
  199. package/lib/gm-connect.d.ts +34 -0
  200. package/lib/gm-connect.js +273 -0
  201. package/lib/gm-xhr-types.d.ts +68 -0
  202. package/lib/gm-xhr-types.js +5 -0
  203. package/lib/harness/browser-extensions.d.ts +73 -0
  204. package/lib/harness/browser-extensions.js +285 -0
  205. package/lib/harness/browser-lang.d.ts +20 -0
  206. package/lib/harness/browser-lang.js +86 -0
  207. package/lib/harness/browser-launch.d.ts +14 -0
  208. package/lib/harness/browser-launch.js +184 -0
  209. package/lib/harness/checks.d.ts +110 -0
  210. package/lib/harness/checks.js +321 -0
  211. package/lib/harness/cli.d.ts +2 -0
  212. package/lib/harness/cli.js +2259 -0
  213. package/lib/harness/command-args.d.ts +91 -0
  214. package/lib/harness/command-args.js +369 -0
  215. package/lib/harness/command-lines.d.ts +80 -0
  216. package/lib/harness/command-lines.js +180 -0
  217. package/lib/harness/command-list.d.ts +206 -0
  218. package/lib/harness/command-list.js +1475 -0
  219. package/lib/harness/console-commands.d.ts +463 -0
  220. package/lib/harness/console-commands.js +3216 -0
  221. package/lib/harness/download-watch.d.ts +21 -0
  222. package/lib/harness/download-watch.js +156 -0
  223. package/lib/harness/extension-backend.d.ts +41 -0
  224. package/lib/harness/extension-backend.js +100 -0
  225. package/lib/harness/extension-host.d.ts +112 -0
  226. package/lib/harness/extension-host.js +552 -0
  227. package/lib/harness/extension-launch.d.ts +67 -0
  228. package/lib/harness/extension-launch.js +285 -0
  229. package/lib/harness/extension-link.d.ts +315 -0
  230. package/lib/harness/extension-link.js +607 -0
  231. package/lib/harness/external-manager.d.ts +146 -0
  232. package/lib/harness/external-manager.js +414 -0
  233. package/lib/harness/fixture.d.ts +165 -0
  234. package/lib/harness/fixture.js +461 -0
  235. package/lib/harness/frame-sessions.d.ts +71 -0
  236. package/lib/harness/frame-sessions.js +248 -0
  237. package/lib/harness/frames.d.ts +68 -0
  238. package/lib/harness/frames.js +216 -0
  239. package/lib/harness/help-format.d.ts +17 -0
  240. package/lib/harness/help-format.js +127 -0
  241. package/lib/harness/host.d.ts +352 -0
  242. package/lib/harness/host.js +423 -0
  243. package/lib/harness/index.d.ts +8 -0
  244. package/lib/harness/index.js +10 -0
  245. package/lib/harness/input-file.d.ts +18 -0
  246. package/lib/harness/input-file.js +61 -0
  247. package/lib/harness/json-output.d.ts +565 -0
  248. package/lib/harness/json-output.js +71 -0
  249. package/lib/harness/manager-actions.d.ts +21 -0
  250. package/lib/harness/manager-actions.js +129 -0
  251. package/lib/harness/manager-commands.d.ts +142 -0
  252. package/lib/harness/manager-commands.js +1196 -0
  253. package/lib/harness/manager-fetch.d.ts +33 -0
  254. package/lib/harness/manager-fetch.js +239 -0
  255. package/lib/harness/managers.d.ts +24 -0
  256. package/lib/harness/managers.js +27 -0
  257. package/lib/harness/output-style.d.ts +125 -0
  258. package/lib/harness/output-style.js +322 -0
  259. package/lib/harness/page-commands.d.ts +134 -0
  260. package/lib/harness/page-commands.js +1141 -0
  261. package/lib/harness/page-output.d.ts +67 -0
  262. package/lib/harness/page-output.js +139 -0
  263. package/lib/harness/page-watch.d.ts +171 -0
  264. package/lib/harness/page-watch.js +607 -0
  265. package/lib/harness/parse-check-node.d.ts +3 -0
  266. package/lib/harness/parse-check-node.js +132 -0
  267. package/lib/harness/path-args.d.ts +22 -0
  268. package/lib/harness/path-args.js +148 -0
  269. package/lib/harness/playwright-chromium.d.ts +16 -0
  270. package/lib/harness/playwright-chromium.js +86 -0
  271. package/lib/harness/prepare.d.ts +168 -0
  272. package/lib/harness/prepare.js +364 -0
  273. package/lib/harness/prompt-editor.d.ts +17 -0
  274. package/lib/harness/prompt-editor.js +354 -0
  275. package/lib/harness/prompt-history.d.ts +13 -0
  276. package/lib/harness/prompt-history.js +89 -0
  277. package/lib/harness/rebuild-advice.d.ts +6 -0
  278. package/lib/harness/rebuild-advice.js +39 -0
  279. package/lib/harness/run-log.d.ts +47 -0
  280. package/lib/harness/run-log.js +140 -0
  281. package/lib/harness/run-logs.d.ts +132 -0
  282. package/lib/harness/run-logs.js +241 -0
  283. package/lib/harness/run.d.ts +194 -0
  284. package/lib/harness/run.js +1973 -0
  285. package/lib/harness/runs.d.ts +229 -0
  286. package/lib/harness/runs.js +726 -0
  287. package/lib/harness/save-html.d.ts +39 -0
  288. package/lib/harness/save-html.js +89 -0
  289. package/lib/harness/saved-pages.d.ts +120 -0
  290. package/lib/harness/saved-pages.js +275 -0
  291. package/lib/harness/script-mark.d.ts +17 -0
  292. package/lib/harness/script-mark.js +56 -0
  293. package/lib/harness/snapshot.d.ts +143 -0
  294. package/lib/harness/snapshot.js +474 -0
  295. package/lib/harness/stuck-tabs.d.ts +19 -0
  296. package/lib/harness/stuck-tabs.js +131 -0
  297. package/lib/harness/tab-refs.d.ts +20 -0
  298. package/lib/harness/tab-refs.js +80 -0
  299. package/lib/harness/tampermonkey.d.ts +71 -0
  300. package/lib/harness/tampermonkey.js +356 -0
  301. package/lib/harness/tm-ids.d.ts +18 -0
  302. package/lib/harness/tm-ids.js +88 -0
  303. package/lib/harness/violentmonkey.d.ts +34 -0
  304. package/lib/harness/violentmonkey.js +162 -0
  305. package/lib/harness/wait.d.ts +77 -0
  306. package/lib/harness/wait.js +458 -0
  307. package/lib/http-read.d.ts +30 -0
  308. package/lib/http-read.js +142 -0
  309. package/lib/local-file-overrides.d.ts +35 -0
  310. package/lib/local-file-overrides.js +558 -0
  311. package/lib/manifest.json +38 -0
  312. package/lib/markup-response.d.ts +11 -0
  313. package/lib/markup-response.js +126 -0
  314. package/lib/match-targets.d.ts +18 -0
  315. package/lib/match-targets.js +305 -0
  316. package/lib/menu-captions.d.ts +1 -0
  317. package/lib/menu-captions.js +22 -0
  318. package/lib/parse-check-protocol.d.ts +27 -0
  319. package/lib/parse-check-protocol.js +51 -0
  320. package/lib/parse-location.d.ts +12 -0
  321. package/lib/parse-location.js +171 -0
  322. package/lib/phase-timing.d.ts +12 -0
  323. package/lib/phase-timing.js +155 -0
  324. package/lib/public-suffixes.d.ts +1 -0
  325. package/lib/public-suffixes.js +6957 -0
  326. package/lib/run-context.d.ts +2 -0
  327. package/lib/run-context.js +31 -0
  328. package/lib/runtime-messages.d.ts +10 -0
  329. package/lib/runtime-messages.js +34 -0
  330. package/lib/sandboxed-page.d.ts +5 -0
  331. package/lib/sandboxed-page.js +35 -0
  332. package/lib/script-build.d.ts +111 -0
  333. package/lib/script-build.js +787 -0
  334. package/lib/script-display.d.ts +51 -0
  335. package/lib/script-display.js +383 -0
  336. package/lib/script-icon.d.ts +16 -0
  337. package/lib/script-icon.js +43 -0
  338. package/lib/script-links.d.ts +24 -0
  339. package/lib/script-links.js +204 -0
  340. package/lib/script-source-url.d.ts +8 -0
  341. package/lib/script-source-url.js +214 -0
  342. package/lib/script-world.d.ts +6 -0
  343. package/lib/script-world.js +65 -0
  344. package/lib/sm-dev-protocol.d.ts +251 -0
  345. package/lib/sm-dev-protocol.js +84 -0
  346. package/lib/source-map.d.ts +32 -0
  347. package/lib/source-map.js +177 -0
  348. package/lib/stack-link.d.ts +15 -0
  349. package/lib/stack-link.js +138 -0
  350. package/lib/unsafe-window-use.d.ts +1 -0
  351. package/lib/unsafe-window-use.js +229 -0
  352. package/lib/url-match.d.ts +40 -0
  353. package/lib/url-match.js +734 -0
  354. package/lib/userscript-header.d.ts +33 -0
  355. package/lib/userscript-header.js +248 -0
  356. package/lib/version-compare.d.ts +6 -0
  357. package/lib/version-compare.js +141 -0
  358. package/lib/version-probe.d.ts +17 -0
  359. package/lib/version-probe.js +120 -0
  360. package/package.json +55 -3
  361. package/skills/SourceMonkey-dev/SKILL.md +868 -0
  362. package/skills/SourceMonkey-dev/references/cdp.md +293 -0
  363. package/skills/SourceMonkey-dev/references/commands.md +297 -0
  364. package/skills/SourceMonkey-dev/references/other-managers.md +63 -0
  365. package/skills/SourceMonkey-dev/references/specs.md +46 -0
  366. package/skills/SourceMonkey-friction/SKILL.md +103 -0
  367. package/skills/SourceMonkey-friction/references/template.md +59 -0
@@ -0,0 +1,67 @@
1
+ import type { ConsoleMessage } from '@playwright/test';
2
+ export interface ConsoleLine {
3
+ type: string;
4
+ text: string;
5
+ /** Where the line was logged from, `''` when unknown. */
6
+ url: string;
7
+ /**
8
+ * The URLs of the call's stack frames, innermost first, async parents
9
+ * included; empty when not known.
10
+ */
11
+ frames: string[];
12
+ /** Logged from SourceMonkey's own JavaScript world (`USER_SCRIPT`), where only its code runs. */
13
+ extensionWorld?: boolean;
14
+ /**
15
+ * How many values were passed. Zero for the browser's own entries
16
+ * (a blocked request, a policy violation), which are not console
17
+ * calls at all.
18
+ */
19
+ argCount: number;
20
+ }
21
+ /**
22
+ * A line the prelude logs, which repeats a report the host already
23
+ * printed, so it's only `page`.
24
+ */
25
+ export declare function isPreludeLine(text: string): boolean;
26
+ /**
27
+ * Whose a console line is: the scripts', when it was logged from
28
+ * SourceMonkey's world or any frame of its stack is SourceMonkey's
29
+ * code (a script calling a page helper that logs), else the page's.
30
+ * The browser's own entries are always the page's. `ours`: what the
31
+ * manager's code URLs start with, when it isn't SourceMonkey.
32
+ */
33
+ export declare function consoleSource(line: ConsoleLine, ours?: string): 'script' | 'page';
34
+ /** `stack` is Playwright's for the error: the message, then its frames. */
35
+ /** An error a script body threw, which the host printed already. */
36
+ export declare function hostReportedError(stack: string, hostReports: boolean): boolean;
37
+ /**
38
+ * Whose an uncaught error is (`stack`: the message, then its frames),
39
+ * or null for a script body's throw the host printed already.
40
+ */
41
+ export declare function pageErrorSource(stack: string, hostReports: boolean, ours?: string): 'script' | 'page' | null;
42
+ /**
43
+ * A console call's text, as `msg.text()` gives it but with each DOM
44
+ * node described (see NODE_TEXT_CHARS) and `%` directives applied
45
+ * (`formatConsoleArgs`). Every level goes through this,
46
+ * so `debug` and `error` lines read alike. A node that can't be read
47
+ * now keeps Playwright's text: its page gone, or not answering within
48
+ * NODE_LOOKUP_MS (a dialog open, paused in the debugger), since the
49
+ * page's later lines wait for this one.
50
+ */
51
+ export declare function consoleText(msg: ConsoleMessage): Promise<string>;
52
+ /**
53
+ * A console call's values as one line, the first one's `%` directives
54
+ * applied as the browser's console does: `%s`, `%d`, `%i`, `%f`, `%o`
55
+ * and `%O` take the next value in its place, `%c` takes the next value
56
+ * (its CSS) and shows nothing, and `%%` is a `%`. The values left over
57
+ * follow, space-separated. A string the page logged with `%` and no
58
+ * values to take reads as written.
59
+ */
60
+ export declare function formatConsoleArgs(parts: string[]): string;
61
+ /**
62
+ * `text` with each stack ref to SourceMonkey's own `sourcemonkey://`
63
+ * URLs decoded once, as the viewer's Log tab shows them: a file named
64
+ * `Video%20Speed%20Buttons.user.js` is in the URL as
65
+ * `Video%2520Speed%2520Buttons.user.js`. Other refs stay as they are.
66
+ */
67
+ export declare function decodeOwnRefs(text: string): string;
@@ -0,0 +1,139 @@
1
+ // Whose the page's console lines and uncaught errors are: the run's
2
+ // scripts' (the `script` log source) or the page's own (`page`). A
3
+ // busy site logs plenty of its own (blocked trackers, failed ads) that
4
+ // would bury the scripts' lines, so the stream shows only `script`
5
+ // unless asked. See docs/sm-dev-logs.md.
6
+ // Also how a console line reads when it logs a DOM node.
7
+ import { ROOT } from '../script-source-url.js';
8
+ import { displayRefText, parseStackRefs } from '../stack-link.js';
9
+ // Every URL SourceMonkey runs code under: the scripts, and its own
10
+ // prelude, bridge and GM runtime, whose failures are ours to show too.
11
+ const OURS = `${ROOT}/`;
12
+ // A script's main body, `<ROOT>/<folder>/<name>.user.js`, as a stack
13
+ // frame (`:line:col` follows). The extension concatenates `@require`s
14
+ // into it, so their frames carry this URL too.
15
+ const SCRIPT_BODY_FRAME = new RegExp(`${ROOT.replace(/[.*+?^${}()|[\]\\/]/g, '\\$&')}/[^/\\s]+/[^/\\s]+\\.user\\.js:`);
16
+ /**
17
+ * A line the prelude logs, which repeats a report the host already
18
+ * printed, so it's only `page`.
19
+ */
20
+ export function isPreludeLine(text) {
21
+ return text.startsWith('[SourceMonkey]');
22
+ }
23
+ /**
24
+ * Whose a console line is: the scripts', when it was logged from
25
+ * SourceMonkey's world or any frame of its stack is SourceMonkey's
26
+ * code (a script calling a page helper that logs), else the page's.
27
+ * The browser's own entries are always the page's. `ours`: what the
28
+ * manager's code URLs start with, when it isn't SourceMonkey.
29
+ */
30
+ export function consoleSource(line, ours = OURS) {
31
+ if (line.argCount === 0)
32
+ return 'page';
33
+ if (line.extensionWorld)
34
+ return 'script';
35
+ return [line.url, ...line.frames].some((url) => url.startsWith(ours)) ? 'script' : 'page';
36
+ }
37
+ /** `stack` is Playwright's for the error: the message, then its frames. */
38
+ /** An error a script body threw, which the host printed already. */
39
+ export function hostReportedError(stack, hostReports) {
40
+ return hostReports && SCRIPT_BODY_FRAME.test(stack);
41
+ }
42
+ /**
43
+ * Whose an uncaught error is (`stack`: the message, then its frames),
44
+ * or null for a script body's throw the host printed already.
45
+ */
46
+ export function pageErrorSource(stack, hostReports, ours = OURS) {
47
+ if (hostReportedError(stack, hostReports))
48
+ return null;
49
+ // A thrown or rejected non-Error value (`Promise.reject('nope')`)
50
+ // has no frames, so there's no telling from its stack. The run looks
51
+ // at where it was thrown (`stacklessIsScripts` in run.ts).
52
+ if (!/\n\s+at /.test(stack))
53
+ return 'script';
54
+ return stack.includes(ours) ? 'script' : 'page';
55
+ }
56
+ // How a node logged to the console reads: its opening tag, as in
57
+ // `<div id="x" class="a b">`, rather than Playwright's `JSHandle@node`.
58
+ // Cut at this length, attribute values first.
59
+ const NODE_TEXT_CHARS = 120;
60
+ const NODE_LOOKUP_MS = 1000;
61
+ /**
62
+ * A console call's text, as `msg.text()` gives it but with each DOM
63
+ * node described (see NODE_TEXT_CHARS) and `%` directives applied
64
+ * (`formatConsoleArgs`). Every level goes through this,
65
+ * so `debug` and `error` lines read alike. A node that can't be read
66
+ * now keeps Playwright's text: its page gone, or not answering within
67
+ * NODE_LOOKUP_MS (a dialog open, paused in the debugger), since the
68
+ * page's later lines wait for this one.
69
+ */
70
+ export async function consoleText(msg) {
71
+ const parts = await Promise.all(msg.args().map(async (arg) => {
72
+ const node = arg.asElement();
73
+ if (!node)
74
+ return arg.toString();
75
+ let timer;
76
+ const late = new Promise((resolve) => { timer = setTimeout(() => resolve(arg.toString()), NODE_LOOKUP_MS); });
77
+ try {
78
+ return await Promise.race([node.evaluate(describeNode, NODE_TEXT_CHARS), late]);
79
+ }
80
+ catch {
81
+ return arg.toString();
82
+ }
83
+ finally {
84
+ clearTimeout(timer);
85
+ }
86
+ }));
87
+ return formatConsoleArgs(parts);
88
+ }
89
+ /**
90
+ * A console call's values as one line, the first one's `%` directives
91
+ * applied as the browser's console does: `%s`, `%d`, `%i`, `%f`, `%o`
92
+ * and `%O` take the next value in its place, `%c` takes the next value
93
+ * (its CSS) and shows nothing, and `%%` is a `%`. The values left over
94
+ * follow, space-separated. A string the page logged with `%` and no
95
+ * values to take reads as written.
96
+ */
97
+ export function formatConsoleArgs(parts) {
98
+ if (parts.length < 2 || !parts[0].includes('%'))
99
+ return parts.join(' ');
100
+ let next = 1;
101
+ const first = parts[0].replace(/%([sdifoOc%])/g, (whole, kind) => {
102
+ if (kind === '%')
103
+ return '%';
104
+ if (next >= parts.length)
105
+ return whole;
106
+ const value = parts[next++];
107
+ if (kind === 'c')
108
+ return '';
109
+ if (kind === 'd' || kind === 'i')
110
+ return String(parseInt(value, 10));
111
+ if (kind === 'f')
112
+ return String(parseFloat(value));
113
+ return value;
114
+ });
115
+ return [first, ...parts.slice(next)].join(' ');
116
+ }
117
+ // Runs in the page.
118
+ function describeNode(node, limit) {
119
+ const cut = (s, n) => (s.length > n ? `${s.slice(0, n)}...` : s);
120
+ if (node.nodeType === Node.TEXT_NODE)
121
+ return `#text ${JSON.stringify(cut(node.textContent ?? '', 40))}`;
122
+ if (!(node instanceof Element))
123
+ return node.nodeName;
124
+ const attrs = Array.from(node.attributes, (a) => (a.value === '' ? a.name : `${a.name}="${cut(a.value, 40)}"`));
125
+ const tag = node.tagName.toLowerCase();
126
+ const open = `<${[tag, ...attrs].join(' ')}>`;
127
+ return open.length > limit ? `${open.slice(0, limit - 4)}...>` : open;
128
+ }
129
+ /**
130
+ * `text` with each stack ref to SourceMonkey's own `sourcemonkey://`
131
+ * URLs decoded once, as the viewer's Log tab shows them: a file named
132
+ * `Video%20Speed%20Buttons.user.js` is in the URL as
133
+ * `Video%2520Speed%2520Buttons.user.js`. Other refs stay as they are.
134
+ */
135
+ export function decodeOwnRefs(text) {
136
+ if (!text.includes(`${ROOT}/`))
137
+ return text;
138
+ return parseStackRefs(text).map((run) => (run.kind === 'ref' ? displayRefText(run.text, run.url) : run.text)).join('');
139
+ }
@@ -0,0 +1,171 @@
1
+ import type { Frame, Page } from '@playwright/test';
2
+ import type { HarnessHost, PageLink } from './host.js';
3
+ import type { PreparedScript } from './prepare.js';
4
+ import type { InjectionWorld } from '../script-world.js';
5
+ /** What `activity` reads from a page, for `wait`. */
6
+ export interface PageActivity {
7
+ readyState: string;
8
+ /** Milliseconds since the DOM last changed. */
9
+ sinceDom: number;
10
+ /** The element that changed last, as `div#id.class`. */
11
+ lastChanged: string;
12
+ }
13
+ /** A request the page has in flight, and for how long. */
14
+ export interface PendingRequest {
15
+ url: string;
16
+ ms: number;
17
+ }
18
+ /** What an expression `evaluate` ran threw, as opposed to evaluate failing. */
19
+ export declare class ScriptThrew extends Error {
20
+ }
21
+ /**
22
+ * A script's own scope, for `eval` in a script: the world it runs in, and
23
+ * where its eval hook is kept there (see src/eval-hook.ts).
24
+ */
25
+ export interface ScriptScope {
26
+ world: InjectionWorld;
27
+ key: string;
28
+ id: string;
29
+ }
30
+ /** `evaluate` found no eval hook for the script: it hasn't run in this document. */
31
+ export declare class NoEvalHook extends Error {
32
+ }
33
+ /** `evaluate` found no document to run in: the page stayed between documents. */
34
+ export declare class NoDocument extends Error {
35
+ }
36
+ export interface AttachOptions {
37
+ /**
38
+ * The extension's origin (`chrome-extension://<id>`), which names the
39
+ * world its scripts run in, for `eval` in a script.
40
+ */
41
+ watchOnly: {
42
+ extensionOrigin: string;
43
+ };
44
+ }
45
+ export interface InjectOptions {
46
+ /**
47
+ * The script runs in the current document too, not only from the
48
+ * next navigation: one the tab already showed when it was set up.
49
+ */
50
+ immediately?: boolean;
51
+ }
52
+ /**
53
+ * One page watched for a host. Create with `attachPage`, then record the
54
+ * scripts its tab runs with `inject`.
55
+ */
56
+ export declare class PageAttachment implements PageLink {
57
+ readonly page: Page;
58
+ readonly host: HarnessHost;
59
+ private readonly cdp;
60
+ private readonly options;
61
+ private readonly injected;
62
+ private disposing;
63
+ private closed;
64
+ private mainFrameId;
65
+ private readonly documents;
66
+ private currentDocument;
67
+ private readonly contexts;
68
+ private frameSessions?;
69
+ private readonly requests;
70
+ private lastRequestEnd;
71
+ private readonly onRequest;
72
+ private readonly onRequestEnd;
73
+ private readonly onClose;
74
+ private constructor();
75
+ static create(page: Page, host: HarnessHost, options: AttachOptions): Promise<PageAttachment>;
76
+ private install;
77
+ /**
78
+ * When the main frame entered its current document, by the host's
79
+ * clock, as reports are stamped. Changes only when a new document
80
+ * loads, not on a same-document (hash or `pushState`) navigation.
81
+ */
82
+ documentStart(): number;
83
+ /**
84
+ * Resolves once the page has run the tasks it already had queued, and
85
+ * the console lines they printed have arrived. A round trip through
86
+ * Playwright's own session, as those lines are, so none comes after
87
+ * it. Then one through the attachment's session, so the events it
88
+ * was sent meanwhile have arrived too. For a
89
+ * command to end after what it set off in the page, such as a menu
90
+ * handler, or a script body, which runs after its start report.
91
+ */
92
+ drain(): Promise<void>;
93
+ /**
94
+ * Resolves once the events the attachment's session had already been
95
+ * sent have arrived: a navigation's new document. Playwright's own
96
+ * session can run ahead of it.
97
+ */
98
+ caughtUp(): Promise<void>;
99
+ private enterDocument;
100
+ /**
101
+ * The page's document state and its DOM's last change, for `wait`.
102
+ * Null when there is no document to ask. Can wait on a page busy in
103
+ * a long script, so the caller bounds it.
104
+ */
105
+ activity(): Promise<PageActivity | null>;
106
+ /**
107
+ * Resolves once the page's main thread has a moment with nothing to
108
+ * do (`requestIdleCallback`), or after `maxMs`.
109
+ */
110
+ idle(maxMs: number): Promise<void>;
111
+ /** The page's requests in flight, and milliseconds since one last ended. */
112
+ network(): {
113
+ pending: PendingRequest[];
114
+ sinceLast: number;
115
+ };
116
+ url(): string;
117
+ private scriptsContext;
118
+ private contextFor;
119
+ /**
120
+ * Evaluates `expression` in the main frame, or in `frame` (one of the
121
+ * page's iframes), in the page's own world or one script's own
122
+ * scope, for `eval`. Resolves to the result as a
123
+ * line to print; rejects with a `ScriptThrew` for what the expression
124
+ * threw, a `NoEvalHook` for a script that hasn't run here, a
125
+ * `NoDocument` for a frame that has gone, or an error of the
126
+ * evaluation's own (the page gone, say).
127
+ */
128
+ evaluate(expression: string, world: 'page' | ScriptScope, documentWaitMs?: number, frame?: Frame): Promise<string>;
129
+ private topContexts;
130
+ /**
131
+ * The CDP target id of an iframe in a process of its own, for a raw
132
+ * CDP client; undefined for one in its parent's (see frame-sessions.ts).
133
+ */
134
+ frameTargetId(frame: Frame): Promise<string | undefined>;
135
+ /** An iframe's CDP frame id in the session that covers it, if found. */
136
+ frameCdpId(frame: Frame): Promise<string | undefined>;
137
+ private frameContexts;
138
+ private documentReady;
139
+ private evaluateInScript;
140
+ private evaluated;
141
+ private describe;
142
+ /**
143
+ * Records a script the tab runs. Re-recording the same script
144
+ * replaces it.
145
+ */
146
+ inject(prepared: PreparedScript, options?: InjectOptions): Promise<void>;
147
+ /** The tab no longer runs a script, from its next navigation. */
148
+ remove(scriptId: string): Promise<void>;
149
+ injectedScripts(): PreparedScript[];
150
+ /**
151
+ * The scripts the current document runs, and so hears from: recorded
152
+ * before it started, or run in it at once. One added later (a `load`
153
+ * into a tab a dialog kept from reloading) waits for the next load.
154
+ */
155
+ scriptsInDocument(): PreparedScript[];
156
+ /**
157
+ * When the main frame first entered its current document. Unlike
158
+ * `documentStart`, the same after the back/forward cache restores it,
159
+ * when its scripts don't run again.
160
+ */
161
+ documentFirstStart(): number;
162
+ /** Stop watching, and drop the CDP session. */
163
+ dispose(): Promise<void>;
164
+ }
165
+ /**
166
+ * The page's CDP target id (the `id` in `/json/list`, and what CDP's
167
+ * `Target.*` calls take), or null when it can't be read, as once the
168
+ * page has closed.
169
+ */
170
+ export declare function targetIdOf(page: Page): Promise<string | null>;
171
+ export declare function attachPage(page: Page, host: HarnessHost, options: AttachOptions): Promise<PageAttachment>;