testdriverai 7.1.0 → 7.1.2

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 (325) hide show
  1. package/.env.example +2 -0
  2. package/.github/workflows/linux-tests.yml +28 -0
  3. package/agent/index.js +18 -45
  4. package/agent/interface.js +13 -2
  5. package/agent/lib/commands.js +1 -1
  6. package/agent/lib/redraw.js +1 -1
  7. package/agent/lib/sandbox.js +30 -2
  8. package/agent/lib/valid-version.js +2 -2
  9. package/debugger/index.html +1 -1
  10. package/docs/docs.json +140 -131
  11. package/docs/v6/getting-started/self-hosting.mdx +3 -2
  12. package/docs/v7/_drafts/agents.mdx +852 -0
  13. package/docs/v7/_drafts/auto-cache-key.mdx +167 -0
  14. package/docs/v7/{guides → _drafts}/caching-selectors.mdx +125 -17
  15. package/docs/v7/_drafts/dashcam-title-feature.mdx +89 -0
  16. package/docs/v7/_drafts/error-handling.mdx +501 -0
  17. package/docs/v7/_drafts/implementation-plan.mdx +994 -0
  18. package/docs/v7/_drafts/init-command.mdx +95 -0
  19. package/docs/v7/_drafts/optimal-sdk-design.mdx +1348 -0
  20. package/docs/v7/_drafts/plugin-migration.mdx +222 -0
  21. package/docs/v7/_drafts/prompt-cache.mdx +200 -0
  22. package/docs/{QUICK_START_TEST_RECORDING.md → v7/_drafts/quick-start-test-recording.mdx} +3 -3
  23. package/docs/v7/_drafts/sdk-logging.mdx +222 -0
  24. package/docs/v7/_drafts/sdk-migration.mdx +474 -0
  25. package/docs/v7/_drafts/sdk-v7-complete.mdx +345 -0
  26. package/docs/v7/{guides → _drafts}/self-hosting.mdx +1 -1
  27. package/docs/v7/{guides → _drafts}/troubleshooting.mdx +2 -2
  28. package/docs/v7/{guides → _drafts}/vitest-plugin.mdx +4 -4
  29. package/docs/v7/api/{ai.mdx → act.mdx} +24 -24
  30. package/docs/v7/api/client.mdx +1 -1
  31. package/docs/v7/api/dashcam.mdx +2 -2
  32. package/docs/v7/api/elements.mdx +143 -41
  33. package/docs/v7/api/find.mdx +258 -0
  34. package/docs/v7/api/type.mdx +51 -7
  35. package/docs/v7/features/ai-native.mdx +427 -0
  36. package/docs/v7/features/easy-to-write.mdx +351 -0
  37. package/docs/v7/features/enterprise.mdx +540 -0
  38. package/docs/v7/features/fast.mdx +424 -0
  39. package/docs/v7/features/observable.mdx +623 -0
  40. package/docs/v7/features/powerful.mdx +531 -0
  41. package/docs/v7/features/scalable.mdx +417 -0
  42. package/docs/v7/features/stable.mdx +514 -0
  43. package/docs/v7/getting-started/configuration.mdx +1 -1
  44. package/docs/v7/getting-started/generating-tests.mdx +525 -0
  45. package/docs/v7/getting-started/installation.mdx +486 -0
  46. package/docs/v7/getting-started/quickstart.mdx +51 -5
  47. package/docs/v7/getting-started/running-and-debugging.mdx +511 -0
  48. package/docs/v7/getting-started/setting-up-in-ci.mdx +612 -0
  49. package/docs/v7/getting-started/writing-tests.mdx +535 -0
  50. package/docs/v7/overview/what-is-testdriver.mdx +398 -0
  51. package/docs/v7/playwright.mdx +3 -3
  52. package/docs/v7/presets/chrome.mdx +16 -0
  53. package/docs/v7/presets/electron.mdx +18 -0
  54. package/docs/v7/presets/vscode.mdx +19 -0
  55. package/examples/run-tests-with-recording.sh +70 -0
  56. package/examples/screenshot-example.js +63 -0
  57. package/examples/sdk-awesome-logs-demo.js +177 -0
  58. package/examples/sdk-cache-thresholds.js +96 -0
  59. package/examples/sdk-element-properties.js +155 -0
  60. package/examples/sdk-simple-example.js +65 -0
  61. package/examples/test-recording-example.test.js +166 -0
  62. package/interfaces/cli/commands/init.js +358 -0
  63. package/interfaces/vitest-plugin.mjs +214 -10
  64. package/{src → lib}/core/Dashcam.js +41 -4
  65. package/{src → lib}/vitest/hooks.mjs +118 -100
  66. package/lib/vitest/setup.mjs +44 -0
  67. package/package.json +9 -10
  68. package/sdk.d.ts +15 -2
  69. package/sdk.js +72 -17
  70. package/{self-hosted.yml → setup/aws/self-hosted.yml} +1 -1
  71. package/{testdriver/acceptance-sdk → test/manual}/test-console-logs.test.mjs +1 -1
  72. package/test/manual/test-find-api.js +73 -0
  73. package/test/manual/test-init.sh +54 -0
  74. package/test/manual/test-prompt-cache.js +96 -0
  75. package/test/manual/test-provision-auth.mjs +22 -0
  76. package/test/manual/test-sandbox-render.js +28 -0
  77. package/test/manual/test-sdk-methods.js +15 -0
  78. package/test/manual/test-sdk-refactor.js +53 -0
  79. package/test/manual/test-stack-trace.mjs +57 -0
  80. package/test/testdriver/assert.test.mjs +41 -0
  81. package/{testdriver/acceptance-sdk → test/testdriver}/auto-cache-key-demo.test.mjs +1 -1
  82. package/{testdriver/acceptance-sdk → test/testdriver}/drag-and-drop.test.mjs +1 -1
  83. package/{testdriver/acceptance-sdk → test/testdriver}/element-not-found.test.mjs +1 -1
  84. package/{testdriver/acceptance-sdk → test/testdriver}/exec-js.test.mjs +1 -1
  85. package/{testdriver/acceptance-sdk → test/testdriver}/exec-output.test.mjs +3 -3
  86. package/{testdriver/acceptance-sdk → test/testdriver}/exec-pwsh.test.mjs +3 -3
  87. package/{testdriver/acceptance-sdk → test/testdriver}/focus-window.test.mjs +1 -1
  88. package/{testdriver/acceptance-sdk → test/testdriver}/formatted-logging.test.mjs +1 -1
  89. package/{testdriver/acceptance-sdk → test/testdriver}/hover-image.test.mjs +1 -1
  90. package/{testdriver/acceptance-sdk → test/testdriver}/hover-text-with-description.test.mjs +1 -1
  91. package/{testdriver/acceptance-sdk → test/testdriver}/hover-text.test.mjs +1 -1
  92. package/{testdriver/acceptance-sdk → test/testdriver}/match-image.test.mjs +1 -1
  93. package/{testdriver/acceptance-sdk → test/testdriver}/press-keys.test.mjs +1 -1
  94. package/{testdriver/acceptance-sdk → test/testdriver}/prompt.test.mjs +2 -2
  95. package/{testdriver/acceptance-sdk → test/testdriver}/scroll-keyboard.test.mjs +1 -1
  96. package/{testdriver/acceptance-sdk → test/testdriver}/scroll-until-image.test.mjs +1 -1
  97. package/{testdriver/acceptance-sdk → test/testdriver}/scroll-until-text.test.mjs +1 -1
  98. package/{testdriver/acceptance-sdk → test/testdriver}/scroll.test.mjs +1 -1
  99. package/{src/vitest/lifecycle.mjs → test/testdriver/setup/lifecycleHelpers.mjs} +84 -99
  100. package/test/testdriver/setup/testHelpers.mjs +653 -0
  101. package/{testdriver/acceptance-sdk → test/testdriver}/type.test.mjs +1 -1
  102. package/vitest.config.mjs +8 -59
  103. package/.github/dependabot.yml +0 -11
  104. package/.github/workflows/acceptance-linux.yml +0 -75
  105. package/.github/workflows/acceptance-sdk-tests.yml +0 -133
  106. package/.github/workflows/acceptance-tests.yml +0 -130
  107. package/.github/workflows/lint.yml +0 -27
  108. package/.github/workflows/publish-canary.yml +0 -40
  109. package/.github/workflows/publish-latest.yml +0 -61
  110. package/.github/workflows/test-install.yml +0 -29
  111. package/.vscode/extensions.json +0 -3
  112. package/.vscode/launch.json +0 -22
  113. package/.vscode/settings.json +0 -14
  114. package/AGENTS.md +0 -550
  115. package/CODEOWNERS +0 -2
  116. package/_testdriver/acceptance/assert.yaml +0 -7
  117. package/_testdriver/acceptance/dashcam.yaml +0 -9
  118. package/_testdriver/acceptance/drag-and-drop.yaml +0 -49
  119. package/_testdriver/acceptance/embed.yaml +0 -9
  120. package/_testdriver/acceptance/exec-js.yaml +0 -29
  121. package/_testdriver/acceptance/exec-output.yaml +0 -43
  122. package/_testdriver/acceptance/exec-shell.yaml +0 -40
  123. package/_testdriver/acceptance/focus-window.yaml +0 -16
  124. package/_testdriver/acceptance/hover-image.yaml +0 -18
  125. package/_testdriver/acceptance/hover-text-with-description.yaml +0 -29
  126. package/_testdriver/acceptance/hover-text.yaml +0 -14
  127. package/_testdriver/acceptance/if-else.yaml +0 -31
  128. package/_testdriver/acceptance/match-image.yaml +0 -15
  129. package/_testdriver/acceptance/press-keys.yaml +0 -35
  130. package/_testdriver/acceptance/prompt.yaml +0 -11
  131. package/_testdriver/acceptance/remember.yaml +0 -27
  132. package/_testdriver/acceptance/screenshots/cart.png +0 -0
  133. package/_testdriver/acceptance/scroll-keyboard.yaml +0 -34
  134. package/_testdriver/acceptance/scroll-until-image.yaml +0 -26
  135. package/_testdriver/acceptance/scroll-until-text.yaml +0 -20
  136. package/_testdriver/acceptance/scroll.yaml +0 -33
  137. package/_testdriver/acceptance/snippets/login.yaml +0 -29
  138. package/_testdriver/acceptance/snippets/match-cart.yaml +0 -8
  139. package/_testdriver/acceptance/type.yaml +0 -29
  140. package/_testdriver/behavior/failure.yaml +0 -7
  141. package/_testdriver/behavior/hover-text.yaml +0 -13
  142. package/_testdriver/behavior/lifecycle/postrun.yaml +0 -10
  143. package/_testdriver/behavior/lifecycle/prerun.yaml +0 -8
  144. package/_testdriver/behavior/lifecycle/provision.yaml +0 -8
  145. package/_testdriver/behavior/secrets.yaml +0 -7
  146. package/_testdriver/edge-cases/dashcam-chrome.yaml +0 -8
  147. package/_testdriver/edge-cases/exec-pwsh-multiline.yaml +0 -10
  148. package/_testdriver/edge-cases/js-exception.yaml +0 -8
  149. package/_testdriver/edge-cases/js-promise.yaml +0 -19
  150. package/_testdriver/edge-cases/lifecycle/postrun.yaml +0 -10
  151. package/_testdriver/edge-cases/prompt-in-middle.yaml +0 -23
  152. package/_testdriver/edge-cases/prompt-nested.yaml +0 -7
  153. package/_testdriver/edge-cases/success-test.yaml +0 -9
  154. package/_testdriver/examples/android/example.yaml +0 -12
  155. package/_testdriver/examples/android/lifecycle/postrun.yaml +0 -11
  156. package/_testdriver/examples/android/lifecycle/provision.yaml +0 -47
  157. package/_testdriver/examples/android/readme.md +0 -7
  158. package/_testdriver/examples/chrome-extension/lifecycle/provision.yaml +0 -74
  159. package/_testdriver/examples/desktop/lifecycle/prerun.yaml +0 -0
  160. package/_testdriver/examples/desktop/lifecycle/provision.yaml +0 -64
  161. package/_testdriver/examples/vscode-extension/lifecycle/provision.yaml +0 -73
  162. package/_testdriver/examples/web/lifecycle/postrun.yaml +0 -7
  163. package/_testdriver/examples/web/lifecycle/prerun.yaml +0 -22
  164. package/_testdriver/lifecycle/postrun.yaml +0 -8
  165. package/_testdriver/lifecycle/prerun.yaml +0 -15
  166. package/_testdriver/lifecycle/provision.yaml +0 -25
  167. package/docs/v7/guides/ci-cd/azure.mdx +0 -587
  168. package/docs/v7/guides/ci-cd/circleci.mdx +0 -523
  169. package/docs/v7/guides/ci-cd/github-actions.mdx +0 -457
  170. package/docs/v7/guides/ci-cd/gitlab.mdx +0 -498
  171. package/docs/v7/guides/ci-cd/jenkins.mdx +0 -664
  172. package/docs/v7/guides/ci-cd/travis.mdx +0 -438
  173. package/scripts/view-test-results.mjs +0 -96
  174. package/src/vitest/extended.mjs +0 -108
  175. package/src/vitest/index.mjs +0 -64
  176. package/src/vitest/utils.mjs +0 -150
  177. package/styles/.vale-config/2-MDX.ini +0 -5
  178. package/styles/Microsoft/AMPM.yml +0 -9
  179. package/styles/Microsoft/Accessibility.yml +0 -30
  180. package/styles/Microsoft/Acronyms.yml +0 -64
  181. package/styles/Microsoft/Adverbs.yml +0 -272
  182. package/styles/Microsoft/Auto.yml +0 -11
  183. package/styles/Microsoft/Avoid.yml +0 -14
  184. package/styles/Microsoft/Contractions.yml +0 -50
  185. package/styles/Microsoft/Dashes.yml +0 -13
  186. package/styles/Microsoft/DateFormat.yml +0 -8
  187. package/styles/Microsoft/DateNumbers.yml +0 -40
  188. package/styles/Microsoft/DateOrder.yml +0 -8
  189. package/styles/Microsoft/Ellipses.yml +0 -9
  190. package/styles/Microsoft/FirstPerson.yml +0 -16
  191. package/styles/Microsoft/Foreign.yml +0 -13
  192. package/styles/Microsoft/Gender.yml +0 -8
  193. package/styles/Microsoft/GenderBias.yml +0 -42
  194. package/styles/Microsoft/GeneralURL.yml +0 -11
  195. package/styles/Microsoft/HeadingAcronyms.yml +0 -7
  196. package/styles/Microsoft/HeadingColons.yml +0 -8
  197. package/styles/Microsoft/HeadingPunctuation.yml +0 -13
  198. package/styles/Microsoft/Headings.yml +0 -28
  199. package/styles/Microsoft/Hyphens.yml +0 -14
  200. package/styles/Microsoft/Negative.yml +0 -13
  201. package/styles/Microsoft/Ordinal.yml +0 -13
  202. package/styles/Microsoft/OxfordComma.yml +0 -8
  203. package/styles/Microsoft/Passive.yml +0 -183
  204. package/styles/Microsoft/Percentages.yml +0 -7
  205. package/styles/Microsoft/Plurals.yml +0 -7
  206. package/styles/Microsoft/Quotes.yml +0 -7
  207. package/styles/Microsoft/RangeTime.yml +0 -13
  208. package/styles/Microsoft/Semicolon.yml +0 -8
  209. package/styles/Microsoft/SentenceLength.yml +0 -6
  210. package/styles/Microsoft/Spacing.yml +0 -8
  211. package/styles/Microsoft/Suspended.yml +0 -7
  212. package/styles/Microsoft/Terms.yml +0 -42
  213. package/styles/Microsoft/URLFormat.yml +0 -9
  214. package/styles/Microsoft/Units.yml +0 -16
  215. package/styles/Microsoft/Vocab.yml +0 -25
  216. package/styles/Microsoft/We.yml +0 -11
  217. package/styles/Microsoft/Wordiness.yml +0 -127
  218. package/styles/Microsoft/meta.json +0 -4
  219. package/styles/alex/Ablist.yml +0 -274
  220. package/styles/alex/Condescending.yml +0 -16
  221. package/styles/alex/Gendered.yml +0 -110
  222. package/styles/alex/LGBTQ.yml +0 -55
  223. package/styles/alex/OCD.yml +0 -10
  224. package/styles/alex/Press.yml +0 -12
  225. package/styles/alex/ProfanityLikely.yml +0 -1289
  226. package/styles/alex/ProfanityMaybe.yml +0 -282
  227. package/styles/alex/ProfanityUnlikely.yml +0 -251
  228. package/styles/alex/README.md +0 -27
  229. package/styles/alex/Race.yml +0 -85
  230. package/styles/alex/Suicide.yml +0 -26
  231. package/styles/alex/meta.json +0 -4
  232. package/styles/config/vocabularies/Docs/accept.txt +0 -47
  233. package/styles/config/vocabularies/Docs/reject.txt +0 -4
  234. package/styles/proselint/Airlinese.yml +0 -8
  235. package/styles/proselint/AnimalLabels.yml +0 -48
  236. package/styles/proselint/Annotations.yml +0 -9
  237. package/styles/proselint/Apologizing.yml +0 -8
  238. package/styles/proselint/Archaisms.yml +0 -52
  239. package/styles/proselint/But.yml +0 -8
  240. package/styles/proselint/Cliches.yml +0 -782
  241. package/styles/proselint/CorporateSpeak.yml +0 -30
  242. package/styles/proselint/Currency.yml +0 -5
  243. package/styles/proselint/Cursing.yml +0 -15
  244. package/styles/proselint/DateCase.yml +0 -7
  245. package/styles/proselint/DateMidnight.yml +0 -7
  246. package/styles/proselint/DateRedundancy.yml +0 -10
  247. package/styles/proselint/DateSpacing.yml +0 -7
  248. package/styles/proselint/DenizenLabels.yml +0 -52
  249. package/styles/proselint/Diacritical.yml +0 -95
  250. package/styles/proselint/GenderBias.yml +0 -45
  251. package/styles/proselint/GroupTerms.yml +0 -39
  252. package/styles/proselint/Hedging.yml +0 -8
  253. package/styles/proselint/Hyperbole.yml +0 -6
  254. package/styles/proselint/Jargon.yml +0 -11
  255. package/styles/proselint/LGBTOffensive.yml +0 -13
  256. package/styles/proselint/LGBTTerms.yml +0 -15
  257. package/styles/proselint/Malapropisms.yml +0 -8
  258. package/styles/proselint/Needless.yml +0 -358
  259. package/styles/proselint/Nonwords.yml +0 -38
  260. package/styles/proselint/Oxymorons.yml +0 -22
  261. package/styles/proselint/P-Value.yml +0 -6
  262. package/styles/proselint/RASSyndrome.yml +0 -30
  263. package/styles/proselint/README.md +0 -12
  264. package/styles/proselint/Skunked.yml +0 -13
  265. package/styles/proselint/Spelling.yml +0 -17
  266. package/styles/proselint/Typography.yml +0 -11
  267. package/styles/proselint/Uncomparables.yml +0 -50
  268. package/styles/proselint/Very.yml +0 -6
  269. package/styles/proselint/meta.json +0 -15
  270. package/styles/write-good/Cliches.yml +0 -702
  271. package/styles/write-good/E-Prime.yml +0 -32
  272. package/styles/write-good/Illusions.yml +0 -11
  273. package/styles/write-good/Passive.yml +0 -183
  274. package/styles/write-good/README.md +0 -27
  275. package/styles/write-good/So.yml +0 -5
  276. package/styles/write-good/ThereIs.yml +0 -6
  277. package/styles/write-good/TooWordy.yml +0 -221
  278. package/styles/write-good/Weasel.yml +0 -29
  279. package/styles/write-good/meta.json +0 -4
  280. package/test/dashcam.test.js +0 -137
  281. package/test/mcp-example-test.yaml +0 -27
  282. package/test/test_parser.js +0 -47
  283. package/testdriver/acceptance-sdk/QUICK_REFERENCE.md +0 -61
  284. package/testdriver/acceptance-sdk/README.md +0 -128
  285. package/testdriver/acceptance-sdk/TEST_REPORTING.md +0 -245
  286. package/testdriver/acceptance-sdk/assert.test.mjs +0 -26
  287. package/testdriver/acceptance-sdk/hooks-example.test.mjs +0 -38
  288. package/testdriver/acceptance-sdk/presets-example.test.mjs +0 -87
  289. package/testdriver/acceptance-sdk/setup/testHelpers.mjs +0 -420
  290. package/testdriver/acceptance-sdk/sully-ai.test.mjs +0 -234
  291. package/testdriver/acceptance-sdk/type-checking-demo.js +0 -49
  292. package/vale.ini +0 -18
  293. package/vitest.config.example.js +0 -19
  294. package/vitest.config.mjs.bak +0 -44
  295. /package/docs/{ARCHITECTURE.md → v7/_drafts/architecture.mdx} +0 -0
  296. /package/docs/{AWESOME_LOGS_QUICK_REF.md → v7/_drafts/awesome-logs-quick-ref.mdx} +0 -0
  297. /package/docs/v7/{guides → _drafts}/best-practices.mdx +0 -0
  298. /package/docs/v7/{guides → _drafts}/caching-ai.mdx +0 -0
  299. /package/docs/v7/{guides → _drafts}/caching.mdx +0 -0
  300. /package/docs/{MIGRATION.md → v7/_drafts/cli-to-sdk-migration.mdx} +0 -0
  301. /package/{CONTRIBUTING.md → docs/v7/_drafts/contributing.mdx} +0 -0
  302. /package/docs/v7/{progressive-apis/CORE.md → _drafts/core.mdx} +0 -0
  303. /package/docs/v7/{guides → _drafts}/debugging.mdx +0 -0
  304. /package/docs/v7/{guides → _drafts}/faq.mdx +0 -0
  305. /package/docs/v7/{progressive-apis/HOOKS.md → _drafts/hooks.mdx} +0 -0
  306. /package/docs/v7/{guides → _drafts}/migration.mdx +0 -0
  307. /package/docs/v7/{guides → _drafts}/performance.mdx +0 -0
  308. /package/docs/{PRESETS.md → v7/_drafts/presets.mdx} +0 -0
  309. /package/docs/v7/{progressive-apis/PROGRESSIVE_DISCLOSURE.md → _drafts/progressive-disclosure.mdx} +0 -0
  310. /package/docs/v7/{progressive-apis/PROVISION.md → _drafts/provision.mdx} +0 -0
  311. /package/docs/{SDK_AWESOME_LOGS.md → v7/_drafts/sdk-awesome-logs.mdx} +0 -0
  312. /package/docs/{sdk-browser-rendering.md → v7/_drafts/sdk-browser-rendering.mdx} +0 -0
  313. /package/docs/{TEST_RECORDING.md → v7/_drafts/test-recording.mdx} +0 -0
  314. /package/docs/v7/{guides → _drafts}/vitest.mdx +0 -0
  315. /package/docs/v7/{README.md → overview/readme.mdx} +0 -0
  316. /package/{src → lib}/core/index.d.ts +0 -0
  317. /package/{src → lib}/core/index.js +0 -0
  318. /package/{src → lib}/presets/index.mjs +0 -0
  319. /package/{src → lib}/vitest/hooks.d.ts +0 -0
  320. /package/{debug-locate-response.js → test/manual/debug-locate-response.js} +0 -0
  321. /package/{verify-element-api.js → test/manual/verify-element-api.js} +0 -0
  322. /package/{verify-types.js → test/manual/verify-types.js} +0 -0
  323. /package/{testdriver/acceptance-sdk → test/testdriver}/chrome-extension.test.mjs +0 -0
  324. /package/{testdriver/acceptance-sdk → test/testdriver}/setup/globalTeardown.mjs +0 -0
  325. /package/{testdriver/acceptance-sdk → test/testdriver}/setup/vitestSetup.mjs +0 -0
@@ -1,150 +0,0 @@
1
- /**
2
- * Utility Functions for TestDriver Vitest Plugin
3
- *
4
- * General-purpose utilities for testing with TestDriver.
5
- *
6
- * @example
7
- * import { retryAsync, setupEventLogging } from 'testdriverai/vitest';
8
- */
9
-
10
- /**
11
- * Set up detailed event logging for debugging
12
- * @param {TestDriver} client - TestDriver client
13
- */
14
- export function setupEventLogging(client) {
15
- const emitter = client.getEmitter();
16
-
17
- // Log all events
18
- emitter.on("**", function (data) {
19
- const event = this.event;
20
- if (event.startsWith("log:debug")) return; // Skip debug logs
21
- console.log(`[EVENT] ${event}`, data || "");
22
- });
23
-
24
- // Log command lifecycle
25
- emitter.on("command:start", (data) => {
26
- console.log("🚀 Command started:", data);
27
- });
28
-
29
- emitter.on("command:success", (data) => {
30
- console.log("✅ Command succeeded:", data);
31
- });
32
-
33
- emitter.on("command:error", (data) => {
34
- console.error("❌ Command error:", data);
35
- });
36
-
37
- // Log sandbox events
38
- emitter.on("sandbox:connected", () => {
39
- console.log("🔌 Sandbox connected");
40
- });
41
-
42
- emitter.on("sandbox:authenticated", () => {
43
- console.log("🔐 Sandbox authenticated");
44
- });
45
-
46
- emitter.on("sandbox:error", (error) => {
47
- console.error("⚠️ Sandbox error:", error);
48
- });
49
-
50
- // Log SDK API calls
51
- emitter.on("sdk:request", (data) => {
52
- console.log("📤 SDK Request:", data);
53
- });
54
-
55
- emitter.on("sdk:response", (data) => {
56
- console.log("📥 SDK Response:", data);
57
- });
58
- }
59
-
60
- /**
61
- * Retry an async function with configurable attempts and delay
62
- * @param {Function} fn - Async function to retry
63
- * @param {number} retries - Number of retries (default: 3)
64
- * @param {number} delay - Delay between retries in ms (default: 1000)
65
- * @returns {Promise} Result of successful execution
66
- * @throws {Error} Last error if all retries fail
67
- *
68
- * @example
69
- * const result = await retryAsync(
70
- * () => testdriver.find("Flaky Element"),
71
- * 5,
72
- * 2000
73
- * );
74
- */
75
- export async function retryAsync(fn, retries = 3, delay = 1000) {
76
- let lastError;
77
-
78
- for (let i = 0; i < retries; i++) {
79
- try {
80
- return await fn();
81
- } catch (error) {
82
- lastError = error;
83
- if (i < retries - 1) {
84
- await new Promise((resolve) => setTimeout(resolve, delay));
85
- }
86
- }
87
- }
88
-
89
- throw lastError;
90
- }
91
-
92
- /**
93
- * Wait for a condition to be true
94
- * @param {Function} condition - Function that returns boolean or Promise<boolean>
95
- * @param {object} options - Wait options
96
- * @param {number} options.timeout - Maximum time to wait in ms (default: 30000)
97
- * @param {number} options.interval - Poll interval in ms (default: 500)
98
- * @param {string} options.message - Error message if timeout (default: "Condition not met")
99
- * @returns {Promise<boolean>} True if condition met
100
- * @throws {Error} If timeout reached
101
- *
102
- * @example
103
- * await waitFor(() => element.exists(), { timeout: 10000 });
104
- */
105
- export async function waitFor(condition, options = {}) {
106
- const {
107
- timeout = 30000,
108
- interval = 500,
109
- message = "Condition not met within timeout"
110
- } = options;
111
-
112
- const startTime = Date.now();
113
-
114
- while (Date.now() - startTime < timeout) {
115
- try {
116
- const result = await condition();
117
- if (result) {
118
- return true;
119
- }
120
- } catch (error) {
121
- // Condition threw, keep polling
122
- }
123
- await new Promise(resolve => setTimeout(resolve, interval));
124
- }
125
-
126
- throw new Error(`${message} (timeout: ${timeout}ms)`);
127
- }
128
-
129
- /**
130
- * Sleep for a specified duration
131
- * @param {number} ms - Milliseconds to sleep
132
- * @returns {Promise<void>}
133
- *
134
- * @example
135
- * await sleep(1000); // Wait 1 second
136
- */
137
- export function sleep(ms) {
138
- return new Promise(resolve => setTimeout(resolve, ms));
139
- }
140
-
141
- /**
142
- * Generate a unique test ID
143
- * @param {string} prefix - Optional prefix for the ID
144
- * @returns {string} Unique ID
145
- */
146
- export function generateTestId(prefix = "test") {
147
- const timestamp = Date.now().toString(36);
148
- const random = Math.random().toString(36).substring(2, 8);
149
- return `${prefix}-${timestamp}-${random}`;
150
- }
@@ -1,5 +0,0 @@
1
- [*.mdx]
2
- # Exclude:
3
- #
4
- # - Non-JS inline expressions (which cause Acorn to throw)
5
- TokenIgnores = '({#[^\n}]+})(?!`)'
@@ -1,9 +0,0 @@
1
- extends: existence
2
- message: Use 'AM' or 'PM' (preceded by a space).
3
- link: https://docs.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/term-collections/date-time-terms
4
- level: error
5
- nonword: true
6
- tokens:
7
- - '\d{1,2}[AP]M'
8
- - '\d{1,2} ?[ap]m'
9
- - '\d{1,2} ?[aApP]\.[mM]\.'
@@ -1,30 +0,0 @@
1
- extends: existence
2
- message: "Don't use language (such as '%s') that defines people by their disability."
3
- link: https://docs.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/term-collections/accessibility-terms
4
- level: suggestion
5
- ignorecase: true
6
- tokens:
7
- - a victim of
8
- - able-bodied
9
- - an epileptic
10
- - birth defect
11
- - crippled
12
- - differently abled
13
- - disabled
14
- - dumb
15
- - handicapped
16
- - handicaps
17
- - healthy person
18
- - hearing-impaired
19
- - lame
20
- - maimed
21
- - mentally handicapped
22
- - missing a limb
23
- - mute
24
- - non-verbal
25
- - normal person
26
- - sight-impaired
27
- - slow learner
28
- - stricken with
29
- - suffers from
30
- - vision-impaired
@@ -1,64 +0,0 @@
1
- extends: conditional
2
- message: "'%s' has no definition."
3
- link: https://docs.microsoft.com/en-us/style-guide/acronyms
4
- level: suggestion
5
- ignorecase: false
6
- # Ensures that the existence of 'first' implies the existence of 'second'.
7
- first: '\b([A-Z]{3,5})\b'
8
- second: '(?:\b[A-Z][a-z]+ )+\(([A-Z]{3,5})\)'
9
- # ... with the exception of these:
10
- exceptions:
11
- - API
12
- - ASP
13
- - CLI
14
- - CPU
15
- - CSS
16
- - CSV
17
- - DEBUG
18
- - DOM
19
- - DPI
20
- - FAQ
21
- - GCC
22
- - GDB
23
- - GET
24
- - GPU
25
- - GTK
26
- - GUI
27
- - HTML
28
- - HTTP
29
- - HTTPS
30
- - IDE
31
- - JAR
32
- - JSON
33
- - JSX
34
- - LESS
35
- - LLDB
36
- - NET
37
- - NOTE
38
- - NVDA
39
- - OSS
40
- - PATH
41
- - PDF
42
- - PHP
43
- - POST
44
- - RAM
45
- - REPL
46
- - RSA
47
- - SCM
48
- - SCSS
49
- - SDK
50
- - SQL
51
- - SSH
52
- - SSL
53
- - SVG
54
- - TBD
55
- - TCP
56
- - TODO
57
- - URI
58
- - URL
59
- - USB
60
- - UTF
61
- - XML
62
- - XSS
63
- - YAML
64
- - ZIP
@@ -1,272 +0,0 @@
1
- extends: existence
2
- message: "Remove '%s' if it's not important to the meaning of the statement."
3
- link: https://docs.microsoft.com/en-us/style-guide/word-choice/use-simple-words-concise-sentences
4
- ignorecase: true
5
- level: warning
6
- action:
7
- name: remove
8
- tokens:
9
- - abnormally
10
- - absentmindedly
11
- - accidentally
12
- - adventurously
13
- - anxiously
14
- - arrogantly
15
- - awkwardly
16
- - bashfully
17
- - beautifully
18
- - bitterly
19
- - bleakly
20
- - blindly
21
- - blissfully
22
- - boastfully
23
- - boldly
24
- - bravely
25
- - briefly
26
- - brightly
27
- - briskly
28
- - broadly
29
- - busily
30
- - calmly
31
- - carefully
32
- - carelessly
33
- - cautiously
34
- - cheerfully
35
- - cleverly
36
- - closely
37
- - coaxingly
38
- - colorfully
39
- - continually
40
- - coolly
41
- - courageously
42
- - crossly
43
- - cruelly
44
- - curiously
45
- - daintily
46
- - dearly
47
- - deceivingly
48
- - deeply
49
- - defiantly
50
- - deliberately
51
- - delightfully
52
- - diligently
53
- - dimly
54
- - doubtfully
55
- - dreamily
56
- - easily
57
- - effectively
58
- - elegantly
59
- - energetically
60
- - enormously
61
- - enthusiastically
62
- - excitedly
63
- - extremely
64
- - fairly
65
- - faithfully
66
- - famously
67
- - ferociously
68
- - fervently
69
- - fiercely
70
- - fondly
71
- - foolishly
72
- - fortunately
73
- - frankly
74
- - frantically
75
- - freely
76
- - frenetically
77
- - frightfully
78
- - furiously
79
- - generally
80
- - generously
81
- - gently
82
- - gladly
83
- - gleefully
84
- - gracefully
85
- - gratefully
86
- - greatly
87
- - greedily
88
- - happily
89
- - hastily
90
- - healthily
91
- - heavily
92
- - helplessly
93
- - honestly
94
- - hopelessly
95
- - hungrily
96
- - innocently
97
- - inquisitively
98
- - intensely
99
- - intently
100
- - interestingly
101
- - inwardly
102
- - irritably
103
- - jaggedly
104
- - jealously
105
- - jovially
106
- - joyfully
107
- - joyously
108
- - jubilantly
109
- - judgmentally
110
- - justly
111
- - keenly
112
- - kiddingly
113
- - kindheartedly
114
- - knavishly
115
- - knowingly
116
- - knowledgeably
117
- - lazily
118
- - lightly
119
- - limply
120
- - lively
121
- - loftily
122
- - longingly
123
- - loosely
124
- - loudly
125
- - lovingly
126
- - loyally
127
- - madly
128
- - majestically
129
- - meaningfully
130
- - mechanically
131
- - merrily
132
- - miserably
133
- - mockingly
134
- - mortally
135
- - mysteriously
136
- - naturally
137
- - nearly
138
- - neatly
139
- - nervously
140
- - nicely
141
- - noisily
142
- - obediently
143
- - obnoxiously
144
- - oddly
145
- - offensively
146
- - optimistically
147
- - overconfidently
148
- - painfully
149
- - partially
150
- - patiently
151
- - perfectly
152
- - playfully
153
- - politely
154
- - poorly
155
- - positively
156
- - potentially
157
- - powerfully
158
- - promptly
159
- - properly
160
- - punctually
161
- - quaintly
162
- - queasily
163
- - queerly
164
- - questionably
165
- - quickly
166
- - quietly
167
- - quirkily
168
- - quite
169
- - quizzically
170
- - randomly
171
- - rapidly
172
- - rarely
173
- - readily
174
- - really
175
- - reassuringly
176
- - recklessly
177
- - regularly
178
- - reluctantly
179
- - repeatedly
180
- - reproachfully
181
- - restfully
182
- - righteously
183
- - rightfully
184
- - rigidly
185
- - roughly
186
- - rudely
187
- - safely
188
- - scarcely
189
- - scarily
190
- - searchingly
191
- - sedately
192
- - seemingly
193
- - selfishly
194
- - separately
195
- - seriously
196
- - shakily
197
- - sharply
198
- - sheepishly
199
- - shrilly
200
- - shyly
201
- - silently
202
- - sleepily
203
- - slowly
204
- - smoothly
205
- - softly
206
- - solemnly
207
- - solidly
208
- - speedily
209
- - stealthily
210
- - sternly
211
- - strictly
212
- - suddenly
213
- - supposedly
214
- - surprisingly
215
- - suspiciously
216
- - sweetly
217
- - swiftly
218
- - sympathetically
219
- - tenderly
220
- - tensely
221
- - terribly
222
- - thankfully
223
- - thoroughly
224
- - thoughtfully
225
- - tightly
226
- - tremendously
227
- - triumphantly
228
- - truthfully
229
- - ultimately
230
- - unabashedly
231
- - unaccountably
232
- - unbearably
233
- - unethically
234
- - unexpectedly
235
- - unfortunately
236
- - unimpressively
237
- - unnaturally
238
- - unnecessarily
239
- - urgently
240
- - usefully
241
- - uselessly
242
- - utterly
243
- - vacantly
244
- - vaguely
245
- - vainly
246
- - valiantly
247
- - vastly
248
- - verbally
249
- - very
250
- - viciously
251
- - victoriously
252
- - violently
253
- - vivaciously
254
- - voluntarily
255
- - warmly
256
- - weakly
257
- - wearily
258
- - wetly
259
- - wholly
260
- - wildly
261
- - willfully
262
- - wisely
263
- - woefully
264
- - wonderfully
265
- - worriedly
266
- - yawningly
267
- - yearningly
268
- - yieldingly
269
- - youthfully
270
- - zealously
271
- - zestfully
272
- - zestily
@@ -1,11 +0,0 @@
1
- extends: existence
2
- message: "In general, don't hyphenate '%s'."
3
- link: https://docs.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/a/auto
4
- ignorecase: true
5
- level: error
6
- action:
7
- name: convert
8
- params:
9
- - simple
10
- tokens:
11
- - 'auto-\w+'
@@ -1,14 +0,0 @@
1
- extends: existence
2
- message: "Don't use '%s'. See the A-Z word list for details."
3
- # See the A-Z word list
4
- link: https://docs.microsoft.com/en-us/style-guide
5
- ignorecase: true
6
- level: error
7
- tokens:
8
- - abortion
9
- - and so on
10
- - app(?:lication)?s? (?:developer|program)
11
- - app(?:lication)? file
12
- - backbone
13
- - backend
14
- - contiguous selection
@@ -1,50 +0,0 @@
1
- extends: substitution
2
- message: "Use '%s' instead of '%s'."
3
- link: https://docs.microsoft.com/en-us/style-guide/word-choice/use-contractions
4
- level: error
5
- ignorecase: true
6
- action:
7
- name: replace
8
- swap:
9
- are not: aren't
10
- cannot: can't
11
- could not: couldn't
12
- did not: didn't
13
- do not: don't
14
- does not: doesn't
15
- has not: hasn't
16
- have not: haven't
17
- how is: how's
18
- is not: isn't
19
-
20
- 'it is(?!\.)': it's
21
- 'it''s(?=\.)': it is
22
-
23
- should not: shouldn't
24
-
25
- "that is(?![.,])": that's
26
- 'that''s(?=\.)': that is
27
-
28
- 'they are(?!\.)': they're
29
- 'they''re(?=\.)': they are
30
-
31
- was not: wasn't
32
-
33
- 'we are(?!\.)': we're
34
- 'we''re(?=\.)': we are
35
-
36
- 'we have(?!\.)': we've
37
- 'we''ve(?=\.)': we have
38
-
39
- were not: weren't
40
-
41
- 'what is(?!\.)': what's
42
- 'what''s(?=\.)': what is
43
-
44
- 'when is(?!\.)': when's
45
- 'when''s(?=\.)': when is
46
-
47
- 'where is(?!\.)': where's
48
- 'where''s(?=\.)': where is
49
-
50
- will not: won't
@@ -1,13 +0,0 @@
1
- extends: existence
2
- message: "Remove the spaces around '%s'."
3
- link: https://docs.microsoft.com/en-us/style-guide/punctuation/dashes-hyphens/emes
4
- ignorecase: true
5
- nonword: true
6
- level: error
7
- action:
8
- name: edit
9
- params:
10
- - trim
11
- - " "
12
- tokens:
13
- - '\s[—–]\s|\s[—–]|[—–]\s'
@@ -1,8 +0,0 @@
1
- extends: existence
2
- message: Use 'July 31, 2016' format, not '%s'.
3
- link: https://docs.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/term-collections/date-time-terms
4
- ignorecase: true
5
- level: error
6
- nonword: true
7
- tokens:
8
- - '\d{1,2} (?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)|May|Jun(?:e)|Jul(?:y)|Aug(?:ust)|Sep(?:tember)?|Oct(?:ober)|Nov(?:ember)?|Dec(?:ember)?) \d{4}'
@@ -1,40 +0,0 @@
1
- extends: existence
2
- message: "Don't use ordinal numbers for dates."
3
- link: https://docs.microsoft.com/en-us/style-guide/numbers#numbers-in-dates
4
- level: error
5
- nonword: true
6
- ignorecase: true
7
- raw:
8
- - \b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)|May|Jun(?:e)|Jul(?:y)|Aug(?:ust)|Sep(?:tember)?|Oct(?:ober)|Nov(?:ember)?|Dec(?:ember)?)\b\s*
9
- tokens:
10
- - first
11
- - second
12
- - third
13
- - fourth
14
- - fifth
15
- - sixth
16
- - seventh
17
- - eighth
18
- - ninth
19
- - tenth
20
- - eleventh
21
- - twelfth
22
- - thirteenth
23
- - fourteenth
24
- - fifteenth
25
- - sixteenth
26
- - seventeenth
27
- - eighteenth
28
- - nineteenth
29
- - twentieth
30
- - twenty-first
31
- - twenty-second
32
- - twenty-third
33
- - twenty-fourth
34
- - twenty-fifth
35
- - twenty-sixth
36
- - twenty-seventh
37
- - twenty-eighth
38
- - twenty-ninth
39
- - thirtieth
40
- - thirty-first
@@ -1,8 +0,0 @@
1
- extends: existence
2
- message: "Always spell out the name of the month."
3
- link: https://docs.microsoft.com/en-us/style-guide/numbers#numbers-in-dates
4
- ignorecase: true
5
- level: error
6
- nonword: true
7
- tokens:
8
- - '\b\d{1,2}/\d{1,2}/(?:\d{4}|\d{2})\b'
@@ -1,9 +0,0 @@
1
- extends: existence
2
- message: "In general, don't use an ellipsis."
3
- link: https://docs.microsoft.com/en-us/style-guide/punctuation/ellipses
4
- nonword: true
5
- level: warning
6
- action:
7
- name: remove
8
- tokens:
9
- - '\.\.\.'
@@ -1,16 +0,0 @@
1
- extends: existence
2
- message: "Use first person (such as '%s') sparingly."
3
- link: https://docs.microsoft.com/en-us/style-guide/grammar/person
4
- ignorecase: true
5
- level: warning
6
- nonword: true
7
- tokens:
8
- - (?:^|\s)I(?=\s)
9
- - (?:^|\s)I(?=,\s)
10
- - \bI'd\b
11
- - \bI'll\b
12
- - \bI'm\b
13
- - \bI've\b
14
- - \bme\b
15
- - \bmy\b
16
- - \bmine\b