waygraph 0.15.50 → 0.15.52

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 (559) hide show
  1. package/dist/analysis/graph.d.ts +1 -1
  2. package/dist/analysis/graph.js +10 -15
  3. package/dist/analysis/map-check.js +5 -2
  4. package/dist/analysis/practices-check.d.ts +0 -1
  5. package/dist/analysis/practices-check.js +17 -17
  6. package/dist/auto-session/session.d.ts +1 -1
  7. package/dist/auto-session/session.js +14 -8
  8. package/dist/blocks-select.d.ts +7 -4
  9. package/dist/blocks-select.js +0 -14
  10. package/dist/browser.d.ts +27 -0
  11. package/dist/browser.js +62 -0
  12. package/dist/cli/run-chain.js +5 -0
  13. package/dist/cli/usage.js +14 -1
  14. package/dist/cli.js +10 -1
  15. package/dist/commands/agent-dive-scaffold.d.ts +5 -0
  16. package/dist/commands/agent-dive-scaffold.js +7 -0
  17. package/dist/commands/extensions.d.ts +1 -0
  18. package/dist/commands/extensions.js +22 -0
  19. package/dist/commands/init.js +45 -2
  20. package/dist/commands/test.js +16 -2
  21. package/dist/commands/try.js +2 -1
  22. package/dist/commands/upgrade.d.ts +6 -0
  23. package/dist/commands/upgrade.js +107 -0
  24. package/dist/config.d.ts +47 -3
  25. package/dist/config.js +45 -12
  26. package/dist/core/block.d.ts +12 -0
  27. package/dist/core/block.js +36 -0
  28. package/dist/core/blocks/effect.d.ts +0 -3
  29. package/dist/core/blocks/method.d.ts +0 -6
  30. package/dist/core/blocks/nav.d.ts +11 -3
  31. package/dist/core/blocks/nav.js +8 -0
  32. package/dist/core/blocks/page.d.ts +0 -3
  33. package/dist/core/config.d.ts +5 -0
  34. package/dist/core/engine.d.ts +17 -16
  35. package/dist/core/engine.js +3 -3
  36. package/dist/core/flow.d.ts +17 -0
  37. package/dist/core/flow.js +44 -24
  38. package/dist/core/map-builder.d.ts +3 -3
  39. package/dist/core/map-builder.js +3 -3
  40. package/dist/env-file.d.ts +7 -7
  41. package/dist/env-file.js +29 -16
  42. package/dist/extensions.d.ts +21 -0
  43. package/dist/extensions.js +178 -0
  44. package/dist/highlights/types.d.ts +3 -2
  45. package/dist/index.d.ts +8 -3
  46. package/dist/index.js +4 -1
  47. package/dist/pilot-overlay/overlay-fixtures.d.ts +0 -7
  48. package/dist/pilot-overlay/overlay-fixtures.js +0 -45
  49. package/dist/playwright-config.d.ts +4 -0
  50. package/dist/playwright-config.js +15 -0
  51. package/dist/playwright.config.d.ts +2 -0
  52. package/dist/playwright.config.js +6 -0
  53. package/dist/runner/demo-log.js +1 -7
  54. package/dist/runner/inpage/banner.js +10 -2
  55. package/dist/runner/inpage/core.d.ts +1 -1
  56. package/dist/runner/inpage/core.js +8 -7
  57. package/dist/runner/main.js +27 -15
  58. package/dist/runner/rings.js +0 -49
  59. package/dist/session/auto-explore-run.js +21 -6
  60. package/dist/session/auto-explore.js +6 -4
  61. package/dist/session/step-overlay.js +3 -1
  62. package/dist/traverse/run.js +4 -1
  63. package/dist/types.d.ts +0 -3
  64. package/dist/ui/components/ring.js +1 -0
  65. package/dist/ui/overlay.css +1 -0
  66. package/dist/ui/shadow.d.ts +1 -3
  67. package/dist/ui/shadow.js +0 -4
  68. package/dist/ui/tokens.d.ts +0 -11
  69. package/dist/ui/tokens.js +0 -5
  70. package/dist/video-dir.d.ts +8 -0
  71. package/dist/video-dir.js +60 -0
  72. package/dist/webserver.d.ts +14 -0
  73. package/dist/webserver.js +95 -0
  74. package/examples/routed-demo/package.json +3 -3
  75. package/examples/routed-demo/playwright.config.ts +8 -8
  76. package/examples/routed-demo/scripts/fixture-server.mjs +12 -31
  77. package/examples/routed-demo/src/map/(app_base)/dashboard/_sel.ts +1 -3
  78. package/examples/routed-demo/src/map/(external)/docs/_sel.ts +1 -3
  79. package/examples/routed-demo/src/pages/dashboard.html +1 -1
  80. package/examples/routed-demo/src/pages/docs.html +1 -1
  81. package/examples/saucedemo/playwright.config.ts +2 -3
  82. package/examples/saucedemo/scripts/prove-add-to-cart-menu.mjs +2 -1
  83. package/examples/saucedemo/scripts/prove-auto-graph.mjs +2 -1
  84. package/examples/saucedemo/scripts/prove-wrong-login-runtime.mjs +2 -1
  85. package/examples/saucedemo/tests/flow-block-verify.spec.ts +2 -7
  86. package/package.json +10 -2
  87. package/templates/quickstart/playwright.config.ts +0 -6
  88. package/templates/scaffold/README.md +7 -3
  89. package/templates/scaffold/STRUCTURE.md +8 -6
  90. package/templates/scaffold/config/waygraph.config.ts +26 -0
  91. package/templates/scaffold/package.json +9 -13
  92. package/templates/scaffold/src/flows/README.md +5 -5
  93. package/templates/scaffold/src/flows/example.flow.ts +31 -17
  94. package/templates/scaffold/src/flows/hoppscotch-auth.flow.ts +35 -0
  95. package/templates/scaffold/src/flows/hoppscotch-get.flow.ts +23 -0
  96. package/templates/scaffold/src/flows/hoppscotch-post.flow.ts +33 -0
  97. package/templates/scaffold/src/flows/mail-verify.flow.ts +36 -75
  98. package/templates/scaffold/src/flows/shop.flow.ts +41 -65
  99. package/templates/scaffold/src/map/(app_base)/docs/_nav.block.ts +0 -9
  100. package/templates/scaffold/src/map/(app_base)/docs/_page.block.ts +0 -5
  101. package/templates/scaffold/src/map/(app_base)/docs/_sel.ts +2 -3
  102. package/templates/scaffold/src/map/(app_base)/docs/{docs.html → index.html} +1 -1
  103. package/templates/scaffold/src/map/(app_base)/home/_methods/add-item.effect.block.ts +4 -21
  104. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-hello.method.block.ts +4 -30
  105. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-item-added.method.block.ts +2 -19
  106. package/templates/scaffold/src/map/(app_base)/home/_methods/clear-cart.method.block.ts +0 -17
  107. package/templates/scaffold/src/map/(app_base)/home/_methods/remove-item.effect.block.ts +3 -16
  108. package/templates/scaffold/src/map/(app_base)/home/_nav.block.ts +3 -14
  109. package/templates/scaffold/src/map/(app_base)/home/_page.block.ts +0 -9
  110. package/templates/scaffold/src/map/(app_base)/home/_sel.ts +4 -4
  111. package/templates/scaffold/src/map/(app_base)/home/nav-verification-link.block.ts +1 -23
  112. package/templates/scaffold/src/map/(app_base)/index.html +17 -0
  113. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-body.method.block.ts +21 -0
  114. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-header.method.block.ts +19 -0
  115. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-status.method.block.ts +20 -0
  116. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/pick-extension-interceptor.method.block.ts +18 -0
  117. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-body.method.block.ts +21 -0
  118. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-headers.method.block.ts +21 -0
  119. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/send-request.method.block.ts +15 -0
  120. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-bearer-token.method.block.ts +20 -0
  121. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-headers.method.block.ts +23 -0
  122. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-json-body.method.block.ts +36 -0
  123. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-method.method.block.ts +17 -0
  124. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-query-params.method.block.ts +22 -0
  125. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-url.method.block.ts +18 -0
  126. package/templates/scaffold/src/map/(external)/hoppscotch/_nav.block.ts +11 -0
  127. package/templates/scaffold/src/map/(external)/hoppscotch/_page.block.ts +36 -0
  128. package/templates/scaffold/src/map/(external)/hoppscotch/_sel.ts +27 -0
  129. package/templates/scaffold/src/map/(external)/hoppscotch/settings/_nav.block.ts +10 -0
  130. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-content.method.block.ts +2 -27
  131. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-received.method.block.ts +2 -21
  132. package/templates/scaffold/src/map/(external)/mailpit/_methods/extract-email-link.method.block.ts +1 -19
  133. package/templates/scaffold/src/map/(external)/mailpit/_methods/open-message.method.block.ts +1 -11
  134. package/templates/scaffold/src/map/(external)/mailpit/_nav.block.ts +1 -9
  135. package/templates/scaffold/src/map/(external)/mailpit/_page.block.ts +0 -11
  136. package/templates/scaffold/src/states/demo.mem-keys.ts +20 -19
  137. package/templates/scaffold/src/states/demo.mem-stubs.ts +4 -0
  138. package/templates/scaffold/src/states/demo.states.ts +7 -1
  139. package/templates/scaffold/tests/README.md +3 -2
  140. package/templates/scaffold/tests/example.spec.ts +2 -3
  141. package/templates/scaffold/tests/hoppscotch.spec.ts +97 -0
  142. package/templates/scaffold/tests/mail-verify.spec.ts +2 -11
  143. package/templates/scaffold/tsconfig.json +1 -1
  144. package/templates/skills/waygraph-convention.skill.md +37 -6
  145. package/templates/skills/waygraph-pilot.skill.md +5 -6
  146. package/dist/runner/overlay-present.d.ts +0 -8
  147. package/dist/runner/overlay-present.js +0 -57
  148. package/dist/ui/components/banner.d.ts +0 -2
  149. package/dist/ui/components/banner.js +0 -10
  150. package/dist/ui/components/cursor.d.ts +0 -2
  151. package/dist/ui/components/cursor.js +0 -19
  152. package/examples/routed-demo/.waygraph-auto/4d4902b7.log +0 -0
  153. package/examples/routed-demo/.waygraph-auto/51ef462e.log +0 -0
  154. package/examples/routed-demo/.waygraph-auto/71527ad9.log +0 -0
  155. package/examples/routed-demo/.waygraph-auto/ca16778e.log +0 -0
  156. package/examples/routed-demo/scripts/with-fixture.mjs +0 -70
  157. package/examples/saucedemo/.waygraph-auto/00b0c55c.log +0 -22
  158. package/examples/saucedemo/.waygraph-auto/00d147d1.log +0 -21
  159. package/examples/saucedemo/.waygraph-auto/00e5d037.log +0 -5
  160. package/examples/saucedemo/.waygraph-auto/015be8f6.log +0 -6
  161. package/examples/saucedemo/.waygraph-auto/026e188e.log +0 -0
  162. package/examples/saucedemo/.waygraph-auto/02f7dd22.log +0 -20
  163. package/examples/saucedemo/.waygraph-auto/03df352d.log +0 -0
  164. package/examples/saucedemo/.waygraph-auto/0402cfcf.log +0 -6
  165. package/examples/saucedemo/.waygraph-auto/050e5b55.log +0 -0
  166. package/examples/saucedemo/.waygraph-auto/05d76fc3.log +0 -0
  167. package/examples/saucedemo/.waygraph-auto/062b581f.log +0 -20
  168. package/examples/saucedemo/.waygraph-auto/0681582b.log +0 -6
  169. package/examples/saucedemo/.waygraph-auto/07845ed1.log +0 -0
  170. package/examples/saucedemo/.waygraph-auto/07f3e964.log +0 -6
  171. package/examples/saucedemo/.waygraph-auto/0868ae4d.log +0 -0
  172. package/examples/saucedemo/.waygraph-auto/0924ddaa.log +0 -22
  173. package/examples/saucedemo/.waygraph-auto/092d6173.log +0 -5
  174. package/examples/saucedemo/.waygraph-auto/096fea05.log +0 -20
  175. package/examples/saucedemo/.waygraph-auto/09924510.log +0 -0
  176. package/examples/saucedemo/.waygraph-auto/0998c941.log +0 -21
  177. package/examples/saucedemo/.waygraph-auto/0a8c3719.log +0 -0
  178. package/examples/saucedemo/.waygraph-auto/0bf74300.log +0 -21
  179. package/examples/saucedemo/.waygraph-auto/0c01fd29.log +0 -4
  180. package/examples/saucedemo/.waygraph-auto/0c19e232.log +0 -5
  181. package/examples/saucedemo/.waygraph-auto/0c302590.log +0 -0
  182. package/examples/saucedemo/.waygraph-auto/0dee62d6.log +0 -5
  183. package/examples/saucedemo/.waygraph-auto/0eb4c081.log +0 -5
  184. package/examples/saucedemo/.waygraph-auto/0f0cb120.log +0 -0
  185. package/examples/saucedemo/.waygraph-auto/102c38ca.log +0 -0
  186. package/examples/saucedemo/.waygraph-auto/10fd431c.log +0 -0
  187. package/examples/saucedemo/.waygraph-auto/1122c13c.log +0 -0
  188. package/examples/saucedemo/.waygraph-auto/123d1cad.log +0 -5
  189. package/examples/saucedemo/.waygraph-auto/12ed8e28.log +0 -0
  190. package/examples/saucedemo/.waygraph-auto/13c6fe3c.log +0 -0
  191. package/examples/saucedemo/.waygraph-auto/1581b677.log +0 -0
  192. package/examples/saucedemo/.waygraph-auto/161cc8dd.log +0 -22
  193. package/examples/saucedemo/.waygraph-auto/164761a5.log +0 -6
  194. package/examples/saucedemo/.waygraph-auto/1905ceb2.log +0 -0
  195. package/examples/saucedemo/.waygraph-auto/1b1d55c6.log +0 -0
  196. package/examples/saucedemo/.waygraph-auto/1b80fd24.log +0 -6
  197. package/examples/saucedemo/.waygraph-auto/1bd7b7bf.log +0 -0
  198. package/examples/saucedemo/.waygraph-auto/1c30a3c2.log +0 -0
  199. package/examples/saucedemo/.waygraph-auto/1c58a174.log +0 -0
  200. package/examples/saucedemo/.waygraph-auto/1cb6f44c.log +0 -5
  201. package/examples/saucedemo/.waygraph-auto/1d90aa9a.log +0 -0
  202. package/examples/saucedemo/.waygraph-auto/1de7d889.log +0 -0
  203. package/examples/saucedemo/.waygraph-auto/1f233a4c.log +0 -6
  204. package/examples/saucedemo/.waygraph-auto/1fdb2100.log +0 -0
  205. package/examples/saucedemo/.waygraph-auto/20e66801.log +0 -0
  206. package/examples/saucedemo/.waygraph-auto/20e91af6.log +0 -5
  207. package/examples/saucedemo/.waygraph-auto/20ffdb77.log +0 -0
  208. package/examples/saucedemo/.waygraph-auto/22048fff.log +0 -4
  209. package/examples/saucedemo/.waygraph-auto/222d1d09.log +0 -0
  210. package/examples/saucedemo/.waygraph-auto/22f1a704.log +0 -5
  211. package/examples/saucedemo/.waygraph-auto/2324269a.log +0 -0
  212. package/examples/saucedemo/.waygraph-auto/232a1d81.log +0 -0
  213. package/examples/saucedemo/.waygraph-auto/239cced3.log +0 -20
  214. package/examples/saucedemo/.waygraph-auto/25204b46.log +0 -4
  215. package/examples/saucedemo/.waygraph-auto/2553d107.log +0 -0
  216. package/examples/saucedemo/.waygraph-auto/25e2e90f.log +0 -0
  217. package/examples/saucedemo/.waygraph-auto/2708455e.log +0 -22
  218. package/examples/saucedemo/.waygraph-auto/272a96fd.log +0 -20
  219. package/examples/saucedemo/.waygraph-auto/28d7be5d.log +0 -0
  220. package/examples/saucedemo/.waygraph-auto/2a577961.log +0 -0
  221. package/examples/saucedemo/.waygraph-auto/2a6a8266.log +0 -6
  222. package/examples/saucedemo/.waygraph-auto/2b3401cf.log +0 -20
  223. package/examples/saucedemo/.waygraph-auto/2b831907.log +0 -6
  224. package/examples/saucedemo/.waygraph-auto/2b9b56fc.log +0 -20
  225. package/examples/saucedemo/.waygraph-auto/2c79c73a.log +0 -0
  226. package/examples/saucedemo/.waygraph-auto/2c94a05b.log +0 -0
  227. package/examples/saucedemo/.waygraph-auto/2ceccd6d.log +0 -0
  228. package/examples/saucedemo/.waygraph-auto/2e2069e7.log +0 -0
  229. package/examples/saucedemo/.waygraph-auto/2e6bc35e.log +0 -6
  230. package/examples/saucedemo/.waygraph-auto/2efd1983.log +0 -0
  231. package/examples/saucedemo/.waygraph-auto/2f1b0c13.log +0 -6
  232. package/examples/saucedemo/.waygraph-auto/2f4f531e.log +0 -0
  233. package/examples/saucedemo/.waygraph-auto/2f8d4073.log +0 -6
  234. package/examples/saucedemo/.waygraph-auto/2fdbd916.log +0 -0
  235. package/examples/saucedemo/.waygraph-auto/30739278.log +0 -6
  236. package/examples/saucedemo/.waygraph-auto/30a5c848.log +0 -20
  237. package/examples/saucedemo/.waygraph-auto/31cb2e80.log +0 -0
  238. package/examples/saucedemo/.waygraph-auto/322d63cd.log +0 -0
  239. package/examples/saucedemo/.waygraph-auto/3239aa8a.log +0 -6
  240. package/examples/saucedemo/.waygraph-auto/326d87b7.log +0 -6
  241. package/examples/saucedemo/.waygraph-auto/331c6e8e.log +0 -0
  242. package/examples/saucedemo/.waygraph-auto/3351c0b6.log +0 -0
  243. package/examples/saucedemo/.waygraph-auto/33a50dc0.log +0 -0
  244. package/examples/saucedemo/.waygraph-auto/33df0770.log +0 -0
  245. package/examples/saucedemo/.waygraph-auto/340d624d.log +0 -0
  246. package/examples/saucedemo/.waygraph-auto/36367ccf.log +0 -0
  247. package/examples/saucedemo/.waygraph-auto/372536a5.log +0 -6
  248. package/examples/saucedemo/.waygraph-auto/37b56184.log +0 -0
  249. package/examples/saucedemo/.waygraph-auto/38f6799d.log +0 -0
  250. package/examples/saucedemo/.waygraph-auto/3a208bb8.log +0 -20
  251. package/examples/saucedemo/.waygraph-auto/3a412f3c.log +0 -0
  252. package/examples/saucedemo/.waygraph-auto/3a859bd7.log +0 -0
  253. package/examples/saucedemo/.waygraph-auto/3a8674d5.log +0 -6
  254. package/examples/saucedemo/.waygraph-auto/3bdb2f5a.log +0 -0
  255. package/examples/saucedemo/.waygraph-auto/3c1e5fe0.log +0 -22
  256. package/examples/saucedemo/.waygraph-auto/3cb0add7.log +0 -0
  257. package/examples/saucedemo/.waygraph-auto/3e3c0f3b.log +0 -0
  258. package/examples/saucedemo/.waygraph-auto/3e42f0d8.log +0 -0
  259. package/examples/saucedemo/.waygraph-auto/3f088138.log +0 -0
  260. package/examples/saucedemo/.waygraph-auto/401177a3.log +0 -0
  261. package/examples/saucedemo/.waygraph-auto/413d934d.log +0 -0
  262. package/examples/saucedemo/.waygraph-auto/4144071d.log +0 -0
  263. package/examples/saucedemo/.waygraph-auto/4176a3c6.log +0 -0
  264. package/examples/saucedemo/.waygraph-auto/41d0793d.log +0 -4
  265. package/examples/saucedemo/.waygraph-auto/41e6feae.log +0 -0
  266. package/examples/saucedemo/.waygraph-auto/424b4d5d.log +0 -0
  267. package/examples/saucedemo/.waygraph-auto/42e014d1.log +0 -0
  268. package/examples/saucedemo/.waygraph-auto/43253aba.log +0 -0
  269. package/examples/saucedemo/.waygraph-auto/432d09e3.log +0 -22
  270. package/examples/saucedemo/.waygraph-auto/438c6c53.log +0 -22
  271. package/examples/saucedemo/.waygraph-auto/4477db12.log +0 -0
  272. package/examples/saucedemo/.waygraph-auto/47247959.log +0 -0
  273. package/examples/saucedemo/.waygraph-auto/476cff76.log +0 -0
  274. package/examples/saucedemo/.waygraph-auto/4a1258b7.log +0 -0
  275. package/examples/saucedemo/.waygraph-auto/4ad09ece.log +0 -0
  276. package/examples/saucedemo/.waygraph-auto/4adcd179.log +0 -20
  277. package/examples/saucedemo/.waygraph-auto/4c9d9b16.log +0 -21
  278. package/examples/saucedemo/.waygraph-auto/4cebc228.log +0 -20
  279. package/examples/saucedemo/.waygraph-auto/4da39c36.log +0 -6
  280. package/examples/saucedemo/.waygraph-auto/4dbefa7e.log +0 -5
  281. package/examples/saucedemo/.waygraph-auto/4efa7035.log +0 -6
  282. package/examples/saucedemo/.waygraph-auto/505affdc.log +0 -4
  283. package/examples/saucedemo/.waygraph-auto/51bcb60a.log +0 -0
  284. package/examples/saucedemo/.waygraph-auto/527b6d76.log +0 -0
  285. package/examples/saucedemo/.waygraph-auto/5291bc78.log +0 -22
  286. package/examples/saucedemo/.waygraph-auto/535e8922.log +0 -0
  287. package/examples/saucedemo/.waygraph-auto/54274c39.log +0 -5
  288. package/examples/saucedemo/.waygraph-auto/5440ce7e.log +0 -0
  289. package/examples/saucedemo/.waygraph-auto/5738175f.log +0 -22
  290. package/examples/saucedemo/.waygraph-auto/573abedd.log +0 -0
  291. package/examples/saucedemo/.waygraph-auto/57ce5643.log +0 -22
  292. package/examples/saucedemo/.waygraph-auto/5984426b.log +0 -6
  293. package/examples/saucedemo/.waygraph-auto/5a682e7c.log +0 -22
  294. package/examples/saucedemo/.waygraph-auto/5b79320c.log +0 -21
  295. package/examples/saucedemo/.waygraph-auto/5b838485.log +0 -0
  296. package/examples/saucedemo/.waygraph-auto/5c55aaac.log +0 -21
  297. package/examples/saucedemo/.waygraph-auto/5d13bdde.log +0 -0
  298. package/examples/saucedemo/.waygraph-auto/5d285cd3.log +0 -0
  299. package/examples/saucedemo/.waygraph-auto/5ed00b16.log +0 -4
  300. package/examples/saucedemo/.waygraph-auto/60b9c066.log +0 -6
  301. package/examples/saucedemo/.waygraph-auto/610dd127.log +0 -0
  302. package/examples/saucedemo/.waygraph-auto/61105500.log +0 -5
  303. package/examples/saucedemo/.waygraph-auto/61333142.log +0 -5
  304. package/examples/saucedemo/.waygraph-auto/6134afe8.log +0 -20
  305. package/examples/saucedemo/.waygraph-auto/61937e83.log +0 -22
  306. package/examples/saucedemo/.waygraph-auto/625e7f65.log +0 -5
  307. package/examples/saucedemo/.waygraph-auto/62a0bdc9.log +0 -22
  308. package/examples/saucedemo/.waygraph-auto/6376fc15.log +0 -0
  309. package/examples/saucedemo/.waygraph-auto/63b0f4cd.log +0 -0
  310. package/examples/saucedemo/.waygraph-auto/6599cbca.log +0 -22
  311. package/examples/saucedemo/.waygraph-auto/6706ead4.log +0 -0
  312. package/examples/saucedemo/.waygraph-auto/67aaca30.log +0 -0
  313. package/examples/saucedemo/.waygraph-auto/685714af.log +0 -0
  314. package/examples/saucedemo/.waygraph-auto/68b10298.log +0 -0
  315. package/examples/saucedemo/.waygraph-auto/68be5e12.log +0 -0
  316. package/examples/saucedemo/.waygraph-auto/68df05a6.log +0 -22
  317. package/examples/saucedemo/.waygraph-auto/68fa0682.log +0 -0
  318. package/examples/saucedemo/.waygraph-auto/693f67c4.log +0 -20
  319. package/examples/saucedemo/.waygraph-auto/69ae030a.log +0 -6
  320. package/examples/saucedemo/.waygraph-auto/69e73f35.log +0 -6
  321. package/examples/saucedemo/.waygraph-auto/6b2333b0.log +0 -5
  322. package/examples/saucedemo/.waygraph-auto/6c4c3817.log +0 -0
  323. package/examples/saucedemo/.waygraph-auto/6c954911.log +0 -0
  324. package/examples/saucedemo/.waygraph-auto/6d65a439.log +0 -5
  325. package/examples/saucedemo/.waygraph-auto/6d700055.log +0 -0
  326. package/examples/saucedemo/.waygraph-auto/6ead848f.log +0 -0
  327. package/examples/saucedemo/.waygraph-auto/6f05bdc1.log +0 -0
  328. package/examples/saucedemo/.waygraph-auto/70279fc3.log +0 -0
  329. package/examples/saucedemo/.waygraph-auto/70c97639.log +0 -0
  330. package/examples/saucedemo/.waygraph-auto/72675b2d.log +0 -6
  331. package/examples/saucedemo/.waygraph-auto/731a14bd.log +0 -0
  332. package/examples/saucedemo/.waygraph-auto/733dd260.log +0 -5
  333. package/examples/saucedemo/.waygraph-auto/73a41843.log +0 -0
  334. package/examples/saucedemo/.waygraph-auto/75016486.log +0 -0
  335. package/examples/saucedemo/.waygraph-auto/752b01c6.log +0 -22
  336. package/examples/saucedemo/.waygraph-auto/75675227.log +0 -6
  337. package/examples/saucedemo/.waygraph-auto/756fd326.log +0 -20
  338. package/examples/saucedemo/.waygraph-auto/75e2e658.log +0 -0
  339. package/examples/saucedemo/.waygraph-auto/76128a2d.log +0 -0
  340. package/examples/saucedemo/.waygraph-auto/76ac1a86.log +0 -0
  341. package/examples/saucedemo/.waygraph-auto/77605295.log +0 -0
  342. package/examples/saucedemo/.waygraph-auto/7773a809.log +0 -0
  343. package/examples/saucedemo/.waygraph-auto/78043767.log +0 -20
  344. package/examples/saucedemo/.waygraph-auto/792671f4.log +0 -22
  345. package/examples/saucedemo/.waygraph-auto/796ab578.log +0 -0
  346. package/examples/saucedemo/.waygraph-auto/79915adb.log +0 -20
  347. package/examples/saucedemo/.waygraph-auto/7a398774.log +0 -6
  348. package/examples/saucedemo/.waygraph-auto/7a72f66e.log +0 -6
  349. package/examples/saucedemo/.waygraph-auto/7a984334.log +0 -4
  350. package/examples/saucedemo/.waygraph-auto/7b226350.log +0 -5
  351. package/examples/saucedemo/.waygraph-auto/7c6ee793.log +0 -20
  352. package/examples/saucedemo/.waygraph-auto/7c726dc4.log +0 -22
  353. package/examples/saucedemo/.waygraph-auto/7c72e8a5.log +0 -4
  354. package/examples/saucedemo/.waygraph-auto/7c99674f.log +0 -0
  355. package/examples/saucedemo/.waygraph-auto/7dbee625.log +0 -22
  356. package/examples/saucedemo/.waygraph-auto/7df66956.log +0 -0
  357. package/examples/saucedemo/.waygraph-auto/7e053160.log +0 -0
  358. package/examples/saucedemo/.waygraph-auto/7e8a6b62.log +0 -0
  359. package/examples/saucedemo/.waygraph-auto/7effd5b2.log +0 -20
  360. package/examples/saucedemo/.waygraph-auto/7f1b4864.log +0 -0
  361. package/examples/saucedemo/.waygraph-auto/7f94fd02.log +0 -0
  362. package/examples/saucedemo/.waygraph-auto/7fcb512f.log +0 -22
  363. package/examples/saucedemo/.waygraph-auto/7fdd47ee.log +0 -2
  364. package/examples/saucedemo/.waygraph-auto/802a0b5b.log +0 -0
  365. package/examples/saucedemo/.waygraph-auto/80322e0b.log +0 -0
  366. package/examples/saucedemo/.waygraph-auto/80a4978e.log +0 -6
  367. package/examples/saucedemo/.waygraph-auto/81257bf0.log +0 -0
  368. package/examples/saucedemo/.waygraph-auto/81cfe480.log +0 -22
  369. package/examples/saucedemo/.waygraph-auto/832f5add.log +0 -0
  370. package/examples/saucedemo/.waygraph-auto/8337b6ad.log +0 -0
  371. package/examples/saucedemo/.waygraph-auto/8481aa1c.log +0 -0
  372. package/examples/saucedemo/.waygraph-auto/8493928e.log +0 -0
  373. package/examples/saucedemo/.waygraph-auto/849ed45d.log +0 -0
  374. package/examples/saucedemo/.waygraph-auto/84dc6480.log +0 -6
  375. package/examples/saucedemo/.waygraph-auto/853bde43.log +0 -0
  376. package/examples/saucedemo/.waygraph-auto/8598b4c0.log +0 -0
  377. package/examples/saucedemo/.waygraph-auto/859a261d.log +0 -0
  378. package/examples/saucedemo/.waygraph-auto/86350ea6.log +0 -22
  379. package/examples/saucedemo/.waygraph-auto/86bb598a.log +0 -0
  380. package/examples/saucedemo/.waygraph-auto/86d09876.log +0 -22
  381. package/examples/saucedemo/.waygraph-auto/878ad01b.log +0 -4
  382. package/examples/saucedemo/.waygraph-auto/87c88ba5.log +0 -0
  383. package/examples/saucedemo/.waygraph-auto/87cb80ff.log +0 -0
  384. package/examples/saucedemo/.waygraph-auto/880b2e78.log +0 -6
  385. package/examples/saucedemo/.waygraph-auto/88527936.log +0 -5
  386. package/examples/saucedemo/.waygraph-auto/88eda676.log +0 -0
  387. package/examples/saucedemo/.waygraph-auto/893023ea.log +0 -5
  388. package/examples/saucedemo/.waygraph-auto/89416718.log +0 -0
  389. package/examples/saucedemo/.waygraph-auto/8996a857.log +0 -6
  390. package/examples/saucedemo/.waygraph-auto/8a08b68d.log +0 -6
  391. package/examples/saucedemo/.waygraph-auto/8a64ba0f.log +0 -6
  392. package/examples/saucedemo/.waygraph-auto/8b1cc2aa.log +0 -6
  393. package/examples/saucedemo/.waygraph-auto/8b73d13e.log +0 -6
  394. package/examples/saucedemo/.waygraph-auto/8be93021.log +0 -0
  395. package/examples/saucedemo/.waygraph-auto/8d960d31.log +0 -1
  396. package/examples/saucedemo/.waygraph-auto/8d9e5cd2.log +0 -21
  397. package/examples/saucedemo/.waygraph-auto/8e12e34f.log +0 -22
  398. package/examples/saucedemo/.waygraph-auto/8ec7d260.log +0 -0
  399. package/examples/saucedemo/.waygraph-auto/8ed43279.log +0 -0
  400. package/examples/saucedemo/.waygraph-auto/93acae32.log +0 -5
  401. package/examples/saucedemo/.waygraph-auto/94221b2b.log +0 -0
  402. package/examples/saucedemo/.waygraph-auto/96321a08.log +0 -0
  403. package/examples/saucedemo/.waygraph-auto/9742b6c2.log +0 -6
  404. package/examples/saucedemo/.waygraph-auto/9761c4c4.log +0 -6
  405. package/examples/saucedemo/.waygraph-auto/976394cd.log +0 -20
  406. package/examples/saucedemo/.waygraph-auto/982138cf.log +0 -0
  407. package/examples/saucedemo/.waygraph-auto/99cc93eb.log +0 -6
  408. package/examples/saucedemo/.waygraph-auto/9a26134c.log +0 -20
  409. package/examples/saucedemo/.waygraph-auto/9cbfbedc.log +0 -0
  410. package/examples/saucedemo/.waygraph-auto/9d827954.log +0 -20
  411. package/examples/saucedemo/.waygraph-auto/9dc147d2.log +0 -22
  412. package/examples/saucedemo/.waygraph-auto/9dd78c5e.log +0 -0
  413. package/examples/saucedemo/.waygraph-auto/a1ab5d29.log +0 -0
  414. package/examples/saucedemo/.waygraph-auto/a215a395.log +0 -22
  415. package/examples/saucedemo/.waygraph-auto/a23b7086.log +0 -4
  416. package/examples/saucedemo/.waygraph-auto/a35bd5ec.log +0 -0
  417. package/examples/saucedemo/.waygraph-auto/a4b36275.log +0 -0
  418. package/examples/saucedemo/.waygraph-auto/a4f8d355.log +0 -20
  419. package/examples/saucedemo/.waygraph-auto/a68995e9.log +0 -22
  420. package/examples/saucedemo/.waygraph-auto/a6e4f936.log +0 -22
  421. package/examples/saucedemo/.waygraph-auto/a7da862b.log +0 -0
  422. package/examples/saucedemo/.waygraph-auto/a82e2a48.log +0 -0
  423. package/examples/saucedemo/.waygraph-auto/a8645294.log +0 -0
  424. package/examples/saucedemo/.waygraph-auto/a94738b7.log +0 -0
  425. package/examples/saucedemo/.waygraph-auto/a952eb91.log +0 -0
  426. package/examples/saucedemo/.waygraph-auto/a9559653.log +0 -5
  427. package/examples/saucedemo/.waygraph-auto/aa1beafb.log +0 -0
  428. package/examples/saucedemo/.waygraph-auto/aa226dd0.log +0 -22
  429. package/examples/saucedemo/.waygraph-auto/aa478de2.log +0 -0
  430. package/examples/saucedemo/.waygraph-auto/aa7323f8.log +0 -20
  431. package/examples/saucedemo/.waygraph-auto/aaae4fb0.log +0 -20
  432. package/examples/saucedemo/.waygraph-auto/ac350fc7.log +0 -20
  433. package/examples/saucedemo/.waygraph-auto/ac5dde3d.log +0 -0
  434. package/examples/saucedemo/.waygraph-auto/acc1b63a.log +0 -0
  435. package/examples/saucedemo/.waygraph-auto/ad0bfad9.log +0 -5
  436. package/examples/saucedemo/.waygraph-auto/ad12d191.log +0 -0
  437. package/examples/saucedemo/.waygraph-auto/ae3a9b06.log +0 -0
  438. package/examples/saucedemo/.waygraph-auto/af2fae12.log +0 -0
  439. package/examples/saucedemo/.waygraph-auto/b04638f4.log +0 -6
  440. package/examples/saucedemo/.waygraph-auto/b0752c49.log +0 -0
  441. package/examples/saucedemo/.waygraph-auto/b14811d7.log +0 -6
  442. package/examples/saucedemo/.waygraph-auto/b2d2dbb2.log +0 -22
  443. package/examples/saucedemo/.waygraph-auto/b3d172f3.log +0 -0
  444. package/examples/saucedemo/.waygraph-auto/b48863e5.log +0 -22
  445. package/examples/saucedemo/.waygraph-auto/b5569336.log +0 -0
  446. package/examples/saucedemo/.waygraph-auto/b56968e1.log +0 -6
  447. package/examples/saucedemo/.waygraph-auto/b57921c5.log +0 -0
  448. package/examples/saucedemo/.waygraph-auto/b64e0620.log +0 -20
  449. package/examples/saucedemo/.waygraph-auto/b75168f7.log +0 -1
  450. package/examples/saucedemo/.waygraph-auto/b86a6218.log +0 -6
  451. package/examples/saucedemo/.waygraph-auto/b8e9e956.log +0 -22
  452. package/examples/saucedemo/.waygraph-auto/b9ab0983.log +0 -0
  453. package/examples/saucedemo/.waygraph-auto/b9b310ff.log +0 -21
  454. package/examples/saucedemo/.waygraph-auto/bb0e0e46.log +0 -0
  455. package/examples/saucedemo/.waygraph-auto/bc111745.log +0 -22
  456. package/examples/saucedemo/.waygraph-auto/bf7a77a2.log +0 -0
  457. package/examples/saucedemo/.waygraph-auto/bf85a598.log +0 -0
  458. package/examples/saucedemo/.waygraph-auto/bf8693e7.log +0 -0
  459. package/examples/saucedemo/.waygraph-auto/c0d6f353.log +0 -21
  460. package/examples/saucedemo/.waygraph-auto/c0febcf2.log +0 -20
  461. package/examples/saucedemo/.waygraph-auto/c4c52998.log +0 -6
  462. package/examples/saucedemo/.waygraph-auto/c52bac6d.log +0 -0
  463. package/examples/saucedemo/.waygraph-auto/c60cc55e.log +0 -0
  464. package/examples/saucedemo/.waygraph-auto/c809ceb4.log +0 -22
  465. package/examples/saucedemo/.waygraph-auto/c851cc53.log +0 -6
  466. package/examples/saucedemo/.waygraph-auto/c8987b67.log +0 -0
  467. package/examples/saucedemo/.waygraph-auto/c9d76e32.log +0 -0
  468. package/examples/saucedemo/.waygraph-auto/ca6de7e7.log +0 -0
  469. package/examples/saucedemo/.waygraph-auto/ca8561bc.log +0 -0
  470. package/examples/saucedemo/.waygraph-auto/cae91469.log +0 -0
  471. package/examples/saucedemo/.waygraph-auto/cb05d223.log +0 -0
  472. package/examples/saucedemo/.waygraph-auto/cb86d45b.log +0 -0
  473. package/examples/saucedemo/.waygraph-auto/cb9a1978.log +0 -6
  474. package/examples/saucedemo/.waygraph-auto/cbbc689c.log +0 -6
  475. package/examples/saucedemo/.waygraph-auto/cc989184.log +0 -20
  476. package/examples/saucedemo/.waygraph-auto/cd88364b.log +0 -0
  477. package/examples/saucedemo/.waygraph-auto/cd919e1d.log +0 -0
  478. package/examples/saucedemo/.waygraph-auto/ce584949.log +0 -5
  479. package/examples/saucedemo/.waygraph-auto/cf34b895.log +0 -2
  480. package/examples/saucedemo/.waygraph-auto/cfff9eef.log +0 -20
  481. package/examples/saucedemo/.waygraph-auto/d0f59b21.log +0 -4
  482. package/examples/saucedemo/.waygraph-auto/d1195079.log +0 -20
  483. package/examples/saucedemo/.waygraph-auto/d2ef067a.log +0 -5
  484. package/examples/saucedemo/.waygraph-auto/d37719a6.log +0 -0
  485. package/examples/saucedemo/.waygraph-auto/d425471f.log +0 -6
  486. package/examples/saucedemo/.waygraph-auto/d4afe93f.log +0 -5
  487. package/examples/saucedemo/.waygraph-auto/d50e58f0.log +0 -0
  488. package/examples/saucedemo/.waygraph-auto/d5293921.log +0 -0
  489. package/examples/saucedemo/.waygraph-auto/d62a22c2.log +0 -21
  490. package/examples/saucedemo/.waygraph-auto/d6d1761f.log +0 -22
  491. package/examples/saucedemo/.waygraph-auto/d6d5f411.log +0 -22
  492. package/examples/saucedemo/.waygraph-auto/d6df2771.log +0 -6
  493. package/examples/saucedemo/.waygraph-auto/d7075012.log +0 -21
  494. package/examples/saucedemo/.waygraph-auto/d846cd78.log +0 -0
  495. package/examples/saucedemo/.waygraph-auto/d934da78.log +0 -0
  496. package/examples/saucedemo/.waygraph-auto/d9ddc297.log +0 -0
  497. package/examples/saucedemo/.waygraph-auto/da0a06bf.log +0 -0
  498. package/examples/saucedemo/.waygraph-auto/da6ebb31.log +0 -0
  499. package/examples/saucedemo/.waygraph-auto/db4ac845.log +0 -0
  500. package/examples/saucedemo/.waygraph-auto/db6d7774.log +0 -0
  501. package/examples/saucedemo/.waygraph-auto/db81ba7d.log +0 -0
  502. package/examples/saucedemo/.waygraph-auto/db839827.log +0 -5
  503. package/examples/saucedemo/.waygraph-auto/dc58eb72.log +0 -0
  504. package/examples/saucedemo/.waygraph-auto/dddd057c.log +0 -20
  505. package/examples/saucedemo/.waygraph-auto/dde5e859.log +0 -22
  506. package/examples/saucedemo/.waygraph-auto/ddf975e6.log +0 -0
  507. package/examples/saucedemo/.waygraph-auto/de8cac58.log +0 -0
  508. package/examples/saucedemo/.waygraph-auto/de8cb83d.log +0 -6
  509. package/examples/saucedemo/.waygraph-auto/ded5511a.log +0 -6
  510. package/examples/saucedemo/.waygraph-auto/dedfcb18.log +0 -0
  511. package/examples/saucedemo/.waygraph-auto/def4d9b1.log +0 -0
  512. package/examples/saucedemo/.waygraph-auto/e03cfd8e.log +0 -0
  513. package/examples/saucedemo/.waygraph-auto/e1549e40.log +0 -0
  514. package/examples/saucedemo/.waygraph-auto/e1b0676d.log +0 -21
  515. package/examples/saucedemo/.waygraph-auto/e230f24e.log +0 -0
  516. package/examples/saucedemo/.waygraph-auto/e5111463.log +0 -0
  517. package/examples/saucedemo/.waygraph-auto/e5127c03.log +0 -22
  518. package/examples/saucedemo/.waygraph-auto/e5fc1d7c.log +0 -5
  519. package/examples/saucedemo/.waygraph-auto/e6fd2202.log +0 -0
  520. package/examples/saucedemo/.waygraph-auto/eb38d92e.log +0 -22
  521. package/examples/saucedemo/.waygraph-auto/edaa806d.log +0 -0
  522. package/examples/saucedemo/.waygraph-auto/edaf33de.log +0 -0
  523. package/examples/saucedemo/.waygraph-auto/edd40cbb.log +0 -20
  524. package/examples/saucedemo/.waygraph-auto/eddfbffc.log +0 -6
  525. package/examples/saucedemo/.waygraph-auto/ee86203e.log +0 -0
  526. package/examples/saucedemo/.waygraph-auto/ee9fa1ad.log +0 -5
  527. package/examples/saucedemo/.waygraph-auto/ef319474.log +0 -22
  528. package/examples/saucedemo/.waygraph-auto/f1f38eeb.log +0 -22
  529. package/examples/saucedemo/.waygraph-auto/f24b2915.log +0 -0
  530. package/examples/saucedemo/.waygraph-auto/f28eee8d.log +0 -0
  531. package/examples/saucedemo/.waygraph-auto/f2943898.log +0 -0
  532. package/examples/saucedemo/.waygraph-auto/f33bde90.log +0 -0
  533. package/examples/saucedemo/.waygraph-auto/f43de83c.log +0 -0
  534. package/examples/saucedemo/.waygraph-auto/f6ba7cb4.log +0 -6
  535. package/examples/saucedemo/.waygraph-auto/f7ac4d62.log +0 -20
  536. package/examples/saucedemo/.waygraph-auto/f86224c6.log +0 -0
  537. package/examples/saucedemo/.waygraph-auto/f929bb79.log +0 -0
  538. package/examples/saucedemo/.waygraph-auto/f92d4c6c.log +0 -22
  539. package/examples/saucedemo/.waygraph-auto/f92faf40.log +0 -5
  540. package/examples/saucedemo/.waygraph-auto/fa784369.log +0 -21
  541. package/examples/saucedemo/.waygraph-auto/fb55f723.log +0 -20
  542. package/examples/saucedemo/.waygraph-auto/fba3b738.log +0 -0
  543. package/examples/saucedemo/.waygraph-auto/fc917c18.log +0 -0
  544. package/examples/saucedemo/.waygraph-auto/fdf66b74.log +0 -0
  545. package/examples/saucedemo/.waygraph-auto/fe83305d.log +0 -0
  546. package/examples/saucedemo/.waygraph-auto/ff616932.log +0 -0
  547. package/examples/saucedemo/.waygraph-auto/ffdf2854.log +0 -6
  548. package/examples/saucedemo/scripts/capture-auto-headful.mjs +0 -120
  549. package/examples/saucedemo/scripts/capture-wrong-login.mjs +0 -141
  550. package/examples/saucedemo/scripts/demo-device-presets.mjs +0 -188
  551. package/examples/saucedemo/scripts/demo-orientation-gestures-video.mjs +0 -262
  552. package/examples/saucedemo/scripts/show-add-to-cart-menu.mjs +0 -123
  553. package/examples/saucedemo/scripts/show-auto-menu.mjs +0 -72
  554. package/templates/scaffold/playwright.config.ts +0 -28
  555. package/templates/scaffold/scripts/README.md +0 -13
  556. package/templates/scaffold/scripts/fixture-server.mjs +0 -50
  557. package/templates/scaffold/scripts/with-fixture.mjs +0 -69
  558. package/templates/scaffold/test-results/.last-run.json +0 -4
  559. /package/templates/scaffold/src/map/(app_base)/home/{home.html → index.html} +0 -0
@@ -0,0 +1,97 @@
1
+ import { test, expect } from "@playwright/test";
2
+ import { createServer, type Server } from "node:http";
3
+ import { MemPage, checkpoint } from "waygraph";
4
+ import config from "../config/waygraph.config.js";
5
+ import { hoppscotchGetFlow } from "../src/flows/hoppscotch-get.flow.js";
6
+ import { hoppscotchAuthFlow } from "../src/flows/hoppscotch-auth.flow.js";
7
+ import { hoppscotchPostFlow } from "../src/flows/hoppscotch-post.flow.js";
8
+ import {
9
+ ExpectedResponseHeader,
10
+ ExpectedResponseText,
11
+ ExpectedStatus,
12
+ RequestBearerToken,
13
+ RequestBody,
14
+ RequestHeaders,
15
+ RequestMethod,
16
+ RequestParams,
17
+ RequestUrl,
18
+ } from "../src/states/demo.mem-keys.js";
19
+
20
+ // The API under test: no CORS headers, so only the extension can reach it from hoppscotch.io.
21
+ let server: Server;
22
+ let apiUrl: string;
23
+
24
+ test.beforeAll(async () => {
25
+ server = createServer((req, res) => {
26
+ let body = "";
27
+ req.on("data", (chunk) => (body += chunk));
28
+ req.on("end", () => {
29
+ res.statusCode = req.method === "POST" ? 201 : 200;
30
+ res.setHeader("content-type", "application/json");
31
+ res.setHeader("x-request-id", "req-42");
32
+ res.end(JSON.stringify({ method: req.method, url: req.url, token: req.headers["x-token"], auth: req.headers.authorization, body }));
33
+ });
34
+ });
35
+ await new Promise<void>((resolve) => server.listen(0, "127.0.0.1", resolve));
36
+ apiUrl = `http://127.0.0.1:${(server.address() as { port: number }).port}/items`;
37
+ });
38
+
39
+ test.afterAll(() => server.close());
40
+
41
+ test.skip(!config.extensions?.includes("hoppscotch"), 'add extensions: ["hoppscotch"] to config/waygraph.config.ts to run these');
42
+ test.setTimeout(120_000);
43
+
44
+ test("GET returns 200", async () => {
45
+ const mem = new MemPage();
46
+ mem.set(RequestUrl, apiUrl);
47
+ mem.set(ExpectedStatus, 200);
48
+ expect(await hoppscotchGetFlow.run(mem, {})).toEqual(checkpoint("HoppscotchRest"));
49
+ });
50
+
51
+ test("POST sends the header and JSON body, returns 201", async () => {
52
+ const mem = new MemPage();
53
+ mem.set(RequestMethod, "POST");
54
+ mem.set(RequestUrl, apiUrl);
55
+ mem.set(RequestHeaders, { "x-token": "abc123" });
56
+ mem.set(RequestBody, '{"name":"waygraph"}');
57
+ mem.set(ExpectedStatus, 201);
58
+ mem.set(ExpectedResponseText, '"token":"abc123"');
59
+ expect(await hoppscotchPostFlow.run(mem, {})).toEqual(checkpoint("HoppscotchRest"));
60
+ });
61
+
62
+ test("a wrong expected status fails the flow, naming assert-status", async () => {
63
+ const mem = new MemPage();
64
+ mem.set(RequestUrl, apiUrl);
65
+ mem.set(ExpectedStatus, 404);
66
+ await expect(hoppscotchGetFlow.run(mem, {})).rejects.toThrow(/assert-status/);
67
+ });
68
+
69
+ test("a response body without the expected text fails the flow, naming assert-response-body", async () => {
70
+ const mem = new MemPage();
71
+ mem.set(RequestMethod, "POST");
72
+ mem.set(RequestUrl, apiUrl);
73
+ mem.set(RequestHeaders, { "x-token": "abc123" });
74
+ mem.set(RequestBody, '{"name":"waygraph"}');
75
+ mem.set(ExpectedStatus, 201);
76
+ mem.set(ExpectedResponseText, '"token":"nope"');
77
+ await expect(hoppscotchPostFlow.run(mem, {})).rejects.toThrow(/assert-response-body/);
78
+ });
79
+
80
+ const authMem = (headerValue: string): MemPage => {
81
+ const mem = new MemPage();
82
+ mem.set(RequestUrl, apiUrl);
83
+ mem.set(RequestParams, { q: "waygraph" });
84
+ mem.set(RequestBearerToken, "tok-9");
85
+ mem.set(ExpectedStatus, 200);
86
+ mem.set(ExpectedResponseText, '"url":"/items?q=waygraph","auth":"Bearer tok-9"');
87
+ mem.set(ExpectedResponseHeader({ name: "X-Request-Id", value: headerValue }));
88
+ return mem;
89
+ };
90
+
91
+ test("query params and a bearer token reach the API; a response header is checked", async () => {
92
+ expect(await hoppscotchAuthFlow.run(authMem("req-42"), {})).toEqual(checkpoint("HoppscotchRest"));
93
+ });
94
+
95
+ test("a wrong response header value fails the flow, naming assert-response-header", async () => {
96
+ await expect(hoppscotchAuthFlow.run(authMem("other"), {})).rejects.toThrow(/assert-response-header/);
97
+ });
@@ -6,17 +6,8 @@ import { mailVerifyFlow } from "../src/flows/mail-verify.flow.js";
6
6
  import { ExpectedRecipient, ExpectedLinkPattern, ExpectedEmailContent } from "../src/states/demo.mem-keys.js";
7
7
  import { HOME_URL } from "../src/map/(app_base)/home/_sel.js";
8
8
 
9
- /**
10
- * This scaffold has no real backend, so these tests play the role of "the
11
- * app sent a verification email" themselves: spin up a real, throwaway
12
- * Mailpit container, send a real SMTP message, then run mailVerifyFlow for
13
- * real - a real cross-origin browser hop into Mailpit's own web UI and
14
- * back, no mail-catcher REST API anywhere. Covers the happy path, both
15
- * failure paths its QA-facing asserts exist for (no email arrived, wrong
16
- * content), and - the actual point of making the mail-reading Blocks
17
- * mem-driven - a second, entirely different email scenario running through
18
- * the exact same four Blocks with zero new code.
19
- */
9
+ // Plays "the app sent a verification email": starts a throwaway Mailpit container, sends a real SMTP message,
10
+ // then runs mailVerifyFlow against it, including the no-email and wrong-content failure paths.
20
11
 
21
12
  function runMailpit(): { containerId: string; smtpPort: number; httpPort: number } {
22
13
  const run = spawnSync("docker", ["run", "--rm", "-d", "-p", "0:1025", "-p", "0:8025", "axllent/mailpit"], {
@@ -10,5 +10,5 @@
10
10
  "skipLibCheck": true,
11
11
  "forceConsistentCasingInFileNames": true
12
12
  },
13
- "include": ["src/**/*.ts", "tests/**/*.ts"]
13
+ "include": ["config/**/*.ts", "src/**/*.ts", "tests/**/*.ts", "scripts/**/*.ts"]
14
14
  }
@@ -17,6 +17,9 @@ against a live site, use `--skill-pilot-blind`.
17
17
  2. **Navigation only inside Nav.** `page.goto` / NavBlock `click` live in
18
18
  `defineNavBlock` / `defineNavClickBlock` only. Method/Effect `act` uses ActionPage
19
19
  (no goto) even when the app changes URL as a side effect of a button click.
20
+ A Nav for a page that only exists after something else (every in-app page after sign-in)
21
+ declares `from: [...]` with the Checkpoints it is valid from (a `SIGNED_IN` list in
22
+ `src/states/`); without it, routing jumps there from anywhere, skipping sign-in.
20
23
  3. **Selectors in `*Sel`, never inline.** DOM strings live in a `*Sel` next to the page - `_sel.ts`
21
24
  in the Map layout (one per page folder, next to `_nav`/`_page`/`_methods`), `<name>.sel.ts` in a
22
25
  freeform layout (one per concern) - never a fresh file-naming convention per project (`_sel.ts`,
@@ -39,12 +42,14 @@ against a live site, use `--skill-pilot-blind`.
39
42
  5. **`requires` = externally supplied.** A key an earlier Block in the same chain produces
40
43
  is never listed under `requires` - preflight checks the whole chain up front. For a
41
44
  genuinely arbitrary key (a username, an email) that a demo/dev run shouldn't need
42
- hand-supplied every time, `registerMemStub(key, fake)` + `withMemStub(flow)` (or
45
+ hand-supplied every time, `registerMemStub(key, fake)` + `memStub: true` on the flow (or
43
46
  `--mem-stub`) fills it from a registry instead - a key with no registration still fails
44
47
  preflight exactly as before, so this narrows what needs real input, never removes the guard.
45
- 6. **Keep Checkpoints typed — never `Checkpoint<string>`.** Block helpers take concrete
46
- Checkpoint types from `src/states/` (e.g. `defineMethodBlock<LoginPage, LoginPage>`).
47
- Wildcard `Checkpoint<string>` compiles but kills graph honesty; `waygraph check` / `waygraph typecheck` warn.
48
+ 6. **Keep Checkpoints typed.** Block helpers take concrete Checkpoint types from `src/states/`
49
+ (e.g. `defineMethodBlock<LoginPage, LoggedIn>`). A Block's **output** must never be
50
+ `Checkpoint<string>` — `waygraph check` / `waygraph typecheck` warn. When a Block runs from a
51
+ few known states, name them as a union in `src/states/` (`type CanAddItem = Home | CartEmpty`);
52
+ a `Checkpoint<string>` **input** is only for a Block that's genuinely reachable from anywhere.
48
53
  Same for `defineAssertBlock({…})` without an explicit type arg — use
49
54
  `defineAssertBlock<YourCheckpoint>({…})`.
50
55
  7. **One input/action per Method Block.** No block that `.fill()`s two fields or `.fill()` + `.click()` in one
@@ -61,6 +66,33 @@ against a live site, use `--skill-pilot-blind`.
61
66
  when a *different* Block right after it in the `.flow.ts` is what actually confirms the
62
67
  transition (e.g. an `AssertXBlock`) - `// waygraph-ignore: empty-verify`.
63
68
 
69
+ ## Flows, stubs and config (the scaffold's shape)
70
+
71
+ - **Build flows with `map()`** (`.start().gotoPage(Nav).method(B).assert(A).end({ ... })`; `.gotoExternal` for another origin),
72
+ not a raw `defineFlow([start, ...])` array. Flow settings go in `.end`'s options:
73
+ `.end({ title: "Shop", memStub: true, sessionReset: true })`. Never `withMemStub(withTitle(withSessionReset(...)))`.
74
+ (`defineFlow(blocks, options)` takes the same options.)
75
+ - **Blocks carry no stubs; the flow does.** Demo highlights are ctx stubs chained on the Block where the flow uses it:
76
+ `AddItemBlock.stubAfter((ctx) => { ctx.ring("cart", { selector: DemoSel.cartCount, label: "AC · item in cart" }); })`.
77
+ Not a static `withHighlightFixtures({ "add-item": { stubAfter: {...} } })` map, and not an inline
78
+ `instruction: { stubAfter() {} }`. A Block used twice gets one `const AddShown = AddItemBlock.stubAfter(...)`.
79
+ - **Reading a value into `mem` happens in `act`** (`mem.set(Key, value)`), like Mailpit's `extract-email-link`.
80
+ `observe` is only for a Block that branches (it feeds `resolve`); an empty `act(){}` plus an `observe` that
81
+ writes `mem` is a misuse.
82
+ - **Per-environment values** (a different `baseUrl` for staging) come from `.env` files read in the config function:
83
+ `defineConfig(({ env }) => ({ baseUrl: env.BASE_URL }))`; `--env staging` loads `.env.staging`. Never edit the config to switch.
84
+ - **A browser dialog (`confirm`, `beforeunload`) is answered with `withDialog(block, { accept, into })`**, not inside the
85
+ Block's `act`; the click Block stays a plain click.
86
+ - **Project settings live in `config/waygraph.config.ts`** (`defineConfig({ baseUrl, testDir, webServer,
87
+ extensions, playwright: {...} })`). Flows import it and build the Engine from it (`new Engine(config)`); a project needs no
88
+ `playwright.config.ts` - `waygraph test` builds one from it. A leftover `playwright.config.*` is deprecated.
89
+ - **Another origin the test needs is a Map external** under `src/map/(external)/<tool>/`. For REST API
90
+ tests, `(external)/hoppscotch` (list `extensions: ["hoppscotch"]` in the config) drives hoppscotch.io's client
91
+ with the extension, so requests skip CORS: `set-method`, `set-url`, `set-headers`, `set-json-body`,
92
+ `send-request`, `assert-status`, `read-response-body`, `assert-response-body`.
93
+ - **Updating an older project:** `npm install waygraph@latest`, then `waygraph upgrade` (dry run) to see new
94
+ and differing scaffold files; copy the paths you want with `--apply`.
95
+
64
96
  ## Block kinds (file convention)
65
97
 
66
98
  | Kind | File | Helper | `page.goto`? |
@@ -111,8 +143,7 @@ src/map/
111
143
  - `(group)` parentheses and leading-underscore segments (`_methods/`, `_page…`) are
112
144
  **not** URL segments. `waygraph map` excludes them when checking folder-vs-URL.
113
145
  - A bare non-underscore folder always means a real child Checkpoint/URL segment.
114
- - Prefer `map()` over a hand-assembled `defineFlow([start, ...])` when wiring Map Blocks -
115
- it rejects Blocks that didn't come from a real factory (no silent teleporting).
146
+ - `map()` rejects Blocks that didn't come from a real factory (no silent teleporting).
116
147
 
117
148
  Mail / external tools: under `*-external/<tool>/` or `map/(external)/<tool>/`, never under
118
149
  the site's `*-web/` tree. Browser-driven (DOM / iframe Traits), not the catcher's REST API.
@@ -58,7 +58,7 @@ Use `--no-practices` on either command to skip the practice scan.
58
58
 
59
59
  Patterns warned (does not fail `check`; fails `typecheck` only when `tsc` fails):
60
60
 
61
- - **`Checkpoint<string>` in Block generics** — e.g. `defineMethodBlock<Checkpoint<string>, …>` instead of a project Checkpoint type from `src/states/`.
61
+ - **`Checkpoint<string>` as a Block's output** — e.g. `defineMethodBlock<…, Checkpoint<string>>` instead of a project Checkpoint type from `src/states/` (a wildcard *input* means "reachable from anywhere" and is allowed).
62
62
  - **`defineAssertBlock({…})` without an explicit type arg** — use `defineAssertBlock<YourCheckpoint>({…})` so `defineFlow` typing stays honest.
63
63
  - **Multiple `.fill()` in one Method** — split into one Block per input (fill-username, fill-password, …).
64
64
  - **`.fill()` + `.click()` in one Method** — split fill and submit into separate Blocks.
@@ -104,13 +104,12 @@ thing that differs from demo is *who* triggers the paint:
104
104
 
105
105
  | Mode | Who paints | How |
106
106
  |------|------------|-----|
107
- | `waygraph demo` | Engine, automatically | Block `stubBefore` / `stubAfter` / `withHighlightFixtures` run each step |
107
+ | `waygraph demo` | Engine, automatically | ctx stubs chained in the flow run each step |
108
108
  | Pilot / `auto --detach` | **You (the agent)** | `waygraph auto highlight <sessionId> '<json>'` before (or between) sends |
109
109
 
110
- Block-authored `stubBefore` / `withHighlightFixtures` still exist on Blocks in Pilot —
111
- they show up in `auto trace` as metadata — but they do **not** auto-draw. You re-express
112
- the same intent with `auto highlight` (copy selectors/labels from the Block stubs or from
113
- `auto dom`). Paint, then `auto send` the real Block. Clear when done.
110
+ The ctx stubs a flow chains onto Blocks show up in Pilot's `auto trace` as metadata, but they do **not**
111
+ auto-draw. You re-express the same intent with `auto highlight` (copy selectors/labels from the flow's stubs or
112
+ from `auto dom`). Paint, then `auto send` the real Block. Clear when done.
114
113
 
115
114
  ```
116
115
  # Headful watch session (rings visible to a human audience):
@@ -1,8 +0,0 @@
1
- import type { Page } from "@playwright/test";
2
- import type { StubPhaseResult } from "../highlights/types.js";
3
-
4
- export interface SessionOverlay {
5
- present(tag: string, phase: Partial<StubPhaseResult>): Promise<void>;
6
- restore(): Promise<void>;
7
- }
8
- export function createSessionOverlay(page: Page, surface: string): SessionOverlay;
@@ -1,57 +0,0 @@
1
- // Presents a resolved stub phase ("waygraph overlay fixtures": ctx.todos / device / title / banner ...) on a LIVE page
2
- // for the session surfaces (auto / browser / pilot). Same OverlayStage + same in-page installers + same verbose log
3
- // lines as `waygraph demo`, so an overlay fixture behaves identically on every surface. Rings are painted separately
4
- // (pilot holds them; demo cycles them) - that is the only intended difference.
5
- import { installOverlay } from "./overlay-install.js";
6
- import { createOverlayStage } from "./overlay-stage.js";
7
- import { demoLog, logStubPhaseFixtures, logTodoDockFull, setDemoLogSurface, summarizeDevice } from "./demo-log.js";
8
- import { logBannerDom, probeBanner } from "./banner-log.js";
9
- import { probeTodoDocksOnPage } from "./todo-dock.js";
10
-
11
- export function createSessionOverlay(page, surface) {
12
- setDemoLogSurface(surface);
13
- const stage = createOverlayStage(page, { todoDockRef: { current: undefined }, deviceRef: { current: undefined } });
14
- let title = undefined;
15
- let painted = false;
16
-
17
- const paintChrome = async (phaseParallel) => {
18
- await installOverlay(page, title, stage.state.lastBannerUi);
19
- await stage.syncAllTodoDocks({ parallel: !!phaseParallel });
20
- };
21
-
22
- return {
23
- stage,
24
- /** Apply one phase (tag = before | after | error | highlight) and log the resulting overlay state. */
25
- async present(tag, phase) {
26
- setDemoLogSurface(surface);
27
- logStubPhaseFixtures(tag, phase);
28
- await stage.pushTodoDockUi(phase.todoDockUi);
29
- const { appliedTodo, appliedDevice } = await stage.applyPhase(phase, { reapplyDeviceOnKeep: true });
30
- if (phase.title && String(phase.title).trim()) title = String(phase.title).trim();
31
- const wantsChrome = !!(title || stage.state.lastTodoDock || phase.todoSync === "set");
32
- if (wantsChrome) {
33
- painted = true;
34
- await paintChrome(phase.todoParallel);
35
- }
36
- logTodoDockFull(stage.state.lastTodoDock, " " + tag);
37
- demoLog(" " + tag + " device=" + summarizeDevice(stage.state.lastDevice) + " deviceSync=" + appliedDevice.sync);
38
- demoLog(" " + tag + " todoSync=" + appliedTodo.sync);
39
- const docks = await probeTodoDocksOnPage(page);
40
- if (!docks.length && stage.state.lastTodoDock && appliedTodo.sync !== "clear") {
41
- demoLog(" WARN " + tag + ": todos authored but dock-dom empty (not painted?)");
42
- }
43
- for (const d of docks) {
44
- demoLog(
45
- " " + tag + " dock-dom " + d.key + "@" + d.pos + " " + d.left + "," + d.top + " " + d.w + "x" + d.h +
46
- (d.onScreen ? "" : " OFFSCREEN") + " n=" + d.n + (d.current ? ' cur="' + d.current + '"' : ""),
47
- );
48
- }
49
- if (title || painted) logBannerDom(tag, await probeBanner(page));
50
- },
51
- /** A navigation wipes the overlay DOM: rebuild what was authored (same job as the demo's post-navigation restore). */
52
- async restore() {
53
- if (!painted) return;
54
- await paintChrome(false);
55
- },
56
- };
57
- }
@@ -1,2 +0,0 @@
1
- /** Top-left demo banner (`#wg-banner`). */
2
- export declare function bannerCss(): string;
@@ -1,10 +0,0 @@
1
- import { ACCENT_SOFT, SURFACE } from "../tokens.js";
2
- /** Top-left demo banner (`#wg-banner`). */
3
- export function bannerCss() {
4
- return ("#wg-banner{position:fixed;z-index:2147483647;top:14px;left:14px;" +
5
- `background:${SURFACE};color:#fff;border-radius:12px;padding:10px 16px;` +
6
- "font:14px/1.4 system-ui,sans-serif;box-shadow:0 8px 20px rgba(0,0,0,.3);" +
7
- "border:1px solid rgba(124,58,237,.4);}" +
8
- `#wg-banner .wg-banner-tag{display:block;font-size:10px;font-weight:700;color:${ACCENT_SOFT};` +
9
- "letter-spacing:.05em;text-transform:uppercase;margin-bottom:2px;}");
10
- }
@@ -1,2 +0,0 @@
1
- /** Travelling mouse cursor + click ripple (`#wg-cursor`, `#wg-click-pulse`). */
2
- export declare function cursorCss(): string;
@@ -1,19 +0,0 @@
1
- import { TONES } from "../tokens.js";
2
- /** Travelling mouse cursor + click ripple (`#wg-cursor`, `#wg-click-pulse`). */
3
- export function cursorCss() {
4
- const p = TONES.planned;
5
- const pulseTones = ["auto", "info", "warning", "danger", "success"]
6
- .map((n) => `#wg-click-pulse[data-tone=${n}]{border-color:${TONES[n].ring};background:${TONES[n].pulse};}`)
7
- .join("");
8
- return ("#wg-cursor{position:fixed;z-index:2147483647;width:24px;height:24px;pointer-events:none;" +
9
- "left:0;top:0;opacity:0;margin:0;" +
10
- // Travel time is JS-driven via --wg-cursor-ms (a hardcoded duration would make speed a no-op).
11
- "transition:transform var(--wg-cursor-ms,600ms) cubic-bezier(.22,1,.36,1),opacity .2s ease;" +
12
- "filter:drop-shadow(0 2px 4px rgba(12,12,26,.4));}" +
13
- "#wg-click-pulse{position:fixed;z-index:2147483647;width:14px;height:14px;" +
14
- "margin-left:-7px;margin-top:-7px;border-radius:50%;pointer-events:none;opacity:0;" +
15
- `border:2px solid ${p.ring};background:${p.pulse};}` +
16
- pulseTones +
17
- "#wg-click-pulse.wg-pulse{animation:wg-pulse .5s ease-out;}" +
18
- "@keyframes wg-pulse{0%{opacity:.9;transform:scale(.4);}100%{opacity:0;transform:scale(2.4);}}");
19
- }
File without changes
File without changes
File without changes
File without changes
@@ -1,70 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * Start fixture-server, run a child command, tear down on exit.
4
- * Usage: node scripts/with-fixture.mjs [--] <cmd> [args...]
5
- * Mirrors templates/scaffold's own scripts/with-fixture.mjs exactly.
6
- */
7
- import { spawn } from "node:child_process";
8
- import { dirname, join } from "node:path";
9
- import { fileURLToPath } from "node:url";
10
-
11
- const HERE = dirname(fileURLToPath(import.meta.url));
12
- const PORT = process.env.WAYGRAPH_FIXTURE_PORT || "4277";
13
- const HOST = process.env.WAYGRAPH_FIXTURE_HOST || "127.0.0.1";
14
-
15
- const argv = process.argv.slice(2).filter((a) => a !== "--");
16
- if (argv.length === 0) {
17
- console.error("usage: node scripts/with-fixture.mjs <cmd> [args...]");
18
- process.exit(1);
19
- }
20
-
21
- const env = {
22
- ...process.env,
23
- WAYGRAPH_FIXTURE_PORT: PORT,
24
- WAYGRAPH_FIXTURE_HOST: HOST,
25
- WAYGRAPH_FIXTURE_QUIET: "1",
26
- WAYGRAPH_BASE_URL: process.env.WAYGRAPH_BASE_URL || `http://${HOST}:${PORT}`,
27
- };
28
-
29
- const server = spawn(process.execPath, [join(HERE, "fixture-server.mjs")], {
30
- env,
31
- stdio: ["ignore", "ignore", "inherit"],
32
- });
33
-
34
- function killServer() {
35
- try {
36
- server.kill("SIGTERM");
37
- } catch {
38
- /* ignore */
39
- }
40
- }
41
-
42
- async function waitReady(ms = 5000) {
43
- const url = `http://${HOST}:${PORT}/dashboard.html`;
44
- const start = Date.now();
45
- while (Date.now() - start < ms) {
46
- try {
47
- const res = await fetch(url);
48
- if (res.ok) return;
49
- } catch {
50
- /* retry */
51
- }
52
- await new Promise((r) => setTimeout(r, 50));
53
- }
54
- throw new Error(`fixture server not ready at ${url}`);
55
- }
56
-
57
- let code = 1;
58
- try {
59
- await waitReady();
60
- const child = spawn(argv[0], argv.slice(1), { env, stdio: "inherit", shell: false });
61
- code = await new Promise((resolve) => {
62
- child.on("exit", (c, signal) => resolve(signal ? 1 : (c ?? 1)));
63
- });
64
- } catch (e) {
65
- console.error(e instanceof Error ? e.message : String(e));
66
- code = 1;
67
- } finally {
68
- killServer();
69
- }
70
- process.exit(code);
@@ -1,22 +0,0 @@
1
- [13:03:06.191] waygraph pilot: stub.before ctx.title("Signing in · mobile")
2
- [13:03:06.193] waygraph pilot: stub.before ctx.todos n=6 index=0
3
- [13:03:06.193] waygraph pilot: stub.before ctx.device(mobile)
4
- [13:03:06.193] waygraph pilot: stub.before ctx.zoom(1.35)
5
- [13:03:06.193] waygraph pilot: stub.before ring #user-name tone=info label="Username"
6
- [13:03:07.307] waygraph pilot: stub.after ctx.todos n=6 index=1
7
- [13:03:10.364] waygraph pilot: stub.before ring #password tone=planned label="Password"
8
- [13:03:10.548] waygraph pilot: stub.after ctx.todos n=6 index=2
9
- [13:03:13.519] waygraph pilot: stub.before ring #login-button tone=warning label="Login"
10
- [13:03:13.719] waygraph pilot: stub.after ctx.title("Inventory · landscape")
11
- [13:03:13.719] waygraph pilot: stub.after ctx.todos n=6 index=3
12
- [13:03:13.719] waygraph pilot: stub.after ctx.device(mobile)
13
- [13:03:13.719] waygraph pilot: stub.after ring .inventory_list tone=success label="Product shelf"
14
- [13:03:19.068] waygraph pilot: stub.before ctx.title("Pick a product · tablet")
15
- [13:03:19.068] waygraph pilot: stub.before ctx.todos n=6 index=3
16
- [13:03:19.068] waygraph pilot: stub.before ctx.device(tablet)
17
- [13:03:19.068] waygraph pilot: stub.before ctx.zoom(1.35)
18
- [13:03:19.068] waygraph pilot: stub.before ring div.inventory_item:has(button[data-test="add-to-cart-sauce-labs-backpack"], button[data-test="remove-sauce-labs-backpack"]) .inventory_item_name tone=info label="Sauce Labs Backpack"
19
- [13:03:19.068] waygraph pilot: stub.before ring [data-test="add-to-cart-sauce-labs-backpack"] tone=success label="Add to cart"
20
- [13:03:20.353] waygraph pilot: stub.after ctx.title("In the cart")
21
- [13:03:20.353] waygraph pilot: stub.after ctx.todos n=6 index=4
22
- [13:03:20.353] waygraph pilot: stub.after ring .shopping_cart_badge tone=success label="Cart badge"
@@ -1,21 +0,0 @@
1
- [18:43:31.014] waygraph pilot: stub.before ctx.title("Signing in · mobile")
2
- [18:43:31.014] waygraph pilot: stub.before ctx.todos n=6 index=0
3
- [18:43:31.015] waygraph pilot: stub.before ctx.device(mobile)
4
- [18:43:31.015] waygraph pilot: stub.before ctx.zoom(1.35)
5
- [18:43:31.015] waygraph pilot: stub.before ring #user-name tone=info label="Username"
6
- [18:43:31.780] waygraph pilot: stub.after ctx.todos n=6 index=1
7
- [18:43:32.878] waygraph pilot: stub.before ring #password tone=planned label="Password"
8
- [18:43:33.035] waygraph pilot: stub.after ctx.todos n=6 index=2
9
- [18:43:34.170] waygraph pilot: stub.before ring #login-button tone=warning label="Login"
10
- [18:43:34.393] waygraph pilot: stub.after ctx.title("Inventory · landscape")
11
- [18:43:34.393] waygraph pilot: stub.after ctx.todos n=6 index=3
12
- [18:43:34.393] waygraph pilot: stub.after ctx.device(mobile)
13
- [18:43:34.393] waygraph pilot: stub.after ring .inventory_list tone=success label="Product shelf"
14
- [18:43:37.076] waygraph pilot: stub.before ctx.title("Open cart · landscape")
15
- [18:43:37.076] waygraph pilot: stub.before ctx.todos n=6 index=5
16
- [18:43:37.076] waygraph pilot: stub.before ctx.device(mobile)
17
- [18:43:37.076] waygraph pilot: stub.before ctx.zoom(1.4)
18
- [18:43:37.076] waygraph pilot: stub.before ring .shopping_cart_link tone=planned label="Cart"
19
- [18:43:37.510] waygraph pilot: stub.after ctx.title("Your cart · desktop")
20
- [18:43:37.511] waygraph pilot: stub.after ring .cart_item tone=success label="Cart items"
21
- [18:43:37.589] waygraph pilot: ring not painted - selector matched nothing (or a zero-size element): .cart_item
@@ -1,5 +0,0 @@
1
- [13:02:45.353] waygraph pilot: highlight ctx.todos n=3 index=0
2
- [13:02:45.353] waygraph pilot: highlight ring #user-name tone=planned label="Username"
3
- [13:02:45.354] waygraph pilot: highlight ring #password tone=info label="Password"
4
- [13:02:47.600] waygraph pilot: highlight ring #no-such-element-waygraph tone=danger label="Gone"
5
- [13:02:50.359] waygraph pilot: highlight ring #login-button tone=success label="Login"
@@ -1,6 +0,0 @@
1
- [13:03:12.156] waygraph pilot: stub.before ctx.title("Signing in · mobile")
2
- [13:03:12.157] waygraph pilot: stub.before ctx.todos n=6 index=0
3
- [13:03:12.157] waygraph pilot: stub.before ctx.device(mobile)
4
- [13:03:12.159] waygraph pilot: stub.before ctx.zoom(1.35)
5
- [13:03:12.159] waygraph pilot: stub.before ring #user-name tone=info label="Username"
6
- [13:03:13.508] waygraph pilot: stub.after ctx.todos n=6 index=1
File without changes
@@ -1,20 +0,0 @@
1
- [13:39:10.711] waygraph pilot: stub.before ctx.title("Signing in · mobile")
2
- [13:39:10.717] waygraph pilot: stub.before ctx.todos n=6 index=0
3
- [13:39:10.719] waygraph pilot: stub.before ctx.device(mobile)
4
- [13:39:10.719] waygraph pilot: stub.before ctx.zoom(1.35)
5
- [13:39:10.719] waygraph pilot: stub.before ring #user-name tone=info label="Username"
6
- [13:39:11.863] waygraph pilot: stub.after ctx.todos n=6 index=1
7
- [13:39:13.470] waygraph pilot: stub.before ring #password tone=planned label="Password"
8
- [13:39:13.668] waygraph pilot: stub.after ctx.todos n=6 index=2
9
- [13:39:15.550] waygraph pilot: stub.before ring #login-button tone=warning label="Login"
10
- [13:39:15.936] waygraph pilot: stub.after ctx.title("Inventory · landscape")
11
- [13:39:15.936] waygraph pilot: stub.after ctx.todos n=6 index=3
12
- [13:39:15.936] waygraph pilot: stub.after ctx.device(mobile)
13
- [13:39:15.936] waygraph pilot: stub.after ring .inventory_list tone=success label="Product shelf"
14
- [13:39:20.251] waygraph pilot: stub.before ctx.title("Open cart · landscape")
15
- [13:39:20.252] waygraph pilot: stub.before ctx.todos n=6 index=5
16
- [13:39:20.252] waygraph pilot: stub.before ctx.device(mobile)
17
- [13:39:20.252] waygraph pilot: stub.before ctx.zoom(1.4)
18
- [13:39:20.252] waygraph pilot: stub.before ring .shopping_cart_link tone=planned label="Cart"
19
- [13:39:20.880] waygraph pilot: stub.after ctx.title("Your cart · desktop")
20
- [13:39:20.880] waygraph pilot: stub.after ring .cart_item tone=success label="Cart items"
File without changes
@@ -1,6 +0,0 @@
1
- [14:01:13.381] waygraph pilot: stub.before ctx.title("Signing in · mobile")
2
- [14:01:13.382] waygraph pilot: stub.before ctx.todos n=6 index=0
3
- [14:01:13.382] waygraph pilot: stub.before ctx.device(mobile)
4
- [14:01:13.382] waygraph pilot: stub.before ctx.zoom(1.35)
5
- [14:01:13.382] waygraph pilot: stub.before ring #user-name tone=info label="Username"
6
- [14:01:14.418] waygraph pilot: stub.after ctx.todos n=6 index=1
File without changes
File without changes
@@ -1,20 +0,0 @@
1
- [15:11:57.159] waygraph pilot: stub.before ctx.title("Signing in · mobile")
2
- [15:11:57.159] waygraph pilot: stub.before ctx.todos n=6 index=0
3
- [15:11:57.160] waygraph pilot: stub.before ctx.device(mobile)
4
- [15:11:57.160] waygraph pilot: stub.before ctx.zoom(1.35)
5
- [15:11:57.160] waygraph pilot: stub.before ring #user-name tone=info label="Username"
6
- [15:11:58.387] waygraph pilot: stub.after ctx.todos n=6 index=1
7
- [15:11:59.771] waygraph pilot: stub.before ring #password tone=planned label="Password"
8
- [15:11:59.868] waygraph pilot: stub.after ctx.todos n=6 index=2
9
- [15:12:01.498] waygraph pilot: stub.before ring #login-button tone=warning label="Login"
10
- [15:12:01.761] waygraph pilot: stub.after ctx.title("Inventory · landscape")
11
- [15:12:01.763] waygraph pilot: stub.after ctx.todos n=6 index=3
12
- [15:12:01.763] waygraph pilot: stub.after ctx.device(mobile)
13
- [15:12:01.763] waygraph pilot: stub.after ring .inventory_list tone=success label="Product shelf"
14
- [15:12:05.024] waygraph pilot: stub.before ctx.title("Open cart · landscape")
15
- [15:12:05.024] waygraph pilot: stub.before ctx.todos n=6 index=5
16
- [15:12:05.024] waygraph pilot: stub.before ctx.device(mobile)
17
- [15:12:05.024] waygraph pilot: stub.before ctx.zoom(1.4)
18
- [15:12:05.024] waygraph pilot: stub.before ring .shopping_cart_link tone=planned label="Cart"
19
- [15:12:05.374] waygraph pilot: stub.after ctx.title("Your cart · desktop")
20
- [15:12:05.374] waygraph pilot: stub.after ring .cart_item tone=success label="Cart items"
@@ -1,6 +0,0 @@
1
- [10:25:35.405] waygraph pilot: highlight ctx.todos n=3 index=0
2
- [10:25:35.406] waygraph pilot: highlight ring #user-name tone=planned label="Username"
3
- [10:25:35.406] waygraph pilot: highlight ring #password tone=info label="Password"
4
- [10:25:40.761] waygraph pilot: highlight ring #no-such-element-waygraph tone=danger label="Gone"
5
- [10:25:40.795] waygraph pilot: ring not painted - selector matched nothing (or a zero-size element): #no-such-element-waygraph
6
- [10:25:44.204] waygraph pilot: highlight ring #login-button tone=success label="Login"
File without changes
@@ -1,6 +0,0 @@
1
- [18:22:04.004] waygraph pilot: stub.before ctx.title("Signing in · mobile")
2
- [18:22:04.004] waygraph pilot: stub.before ctx.todos n=6 index=0
3
- [18:22:04.005] waygraph pilot: stub.before ctx.device(mobile)
4
- [18:22:04.005] waygraph pilot: stub.before ctx.zoom(1.35)
5
- [18:22:04.005] waygraph pilot: stub.before ring #user-name tone=info label="Username"
6
- [18:22:05.633] waygraph pilot: stub.after ctx.todos n=6 index=1
File without changes
@@ -1,22 +0,0 @@
1
- [11:09:34.839] waygraph pilot: stub.before ctx.title("Signing in · mobile")
2
- [11:09:34.839] waygraph pilot: stub.before ctx.todos n=6 index=0
3
- [11:09:34.839] waygraph pilot: stub.before ctx.device(mobile)
4
- [11:09:34.839] waygraph pilot: stub.before ctx.zoom(1.35)
5
- [11:09:34.839] waygraph pilot: stub.before ring #user-name tone=info label="Username"
6
- [11:09:35.582] waygraph pilot: stub.after ctx.todos n=6 index=1
7
- [11:09:38.020] waygraph pilot: stub.before ring #password tone=planned label="Password"
8
- [11:09:38.142] waygraph pilot: stub.after ctx.todos n=6 index=2
9
- [11:09:41.474] waygraph pilot: stub.before ring #login-button tone=warning label="Login"
10
- [11:09:41.984] waygraph pilot: stub.after ctx.title("Inventory · landscape")
11
- [11:09:41.985] waygraph pilot: stub.after ctx.todos n=6 index=3
12
- [11:09:41.985] waygraph pilot: stub.after ctx.device(mobile)
13
- [11:09:41.985] waygraph pilot: stub.after ring .inventory_list tone=success label="Product shelf"
14
- [11:09:47.467] waygraph pilot: stub.before ctx.title("Pick a product · tablet")
15
- [11:09:47.467] waygraph pilot: stub.before ctx.todos n=6 index=3
16
- [11:09:47.467] waygraph pilot: stub.before ctx.device(tablet)
17
- [11:09:47.467] waygraph pilot: stub.before ctx.zoom(1.35)
18
- [11:09:47.468] waygraph pilot: stub.before ring div.inventory_item:has(button[data-test="add-to-cart-sauce-labs-backpack"], button[data-test="remove-sauce-labs-backpack"]) .inventory_item_name tone=info label="Sauce Labs Backpack"
19
- [11:09:47.468] waygraph pilot: stub.before ring [data-test="add-to-cart-sauce-labs-backpack"] tone=success label="Add to cart"
20
- [11:09:48.774] waygraph pilot: stub.after ctx.title("In the cart")
21
- [11:09:48.775] waygraph pilot: stub.after ctx.todos n=6 index=4
22
- [11:09:48.775] waygraph pilot: stub.after ring .shopping_cart_badge tone=success label="Cart badge"
@@ -1,5 +0,0 @@
1
- [14:52:25.116] waygraph pilot: highlight ctx.todos n=3 index=0
2
- [14:52:25.117] waygraph pilot: highlight ring #user-name tone=planned label="Username"
3
- [14:52:25.117] waygraph pilot: highlight ring #password tone=info label="Password"
4
- [14:52:30.181] waygraph pilot: highlight ring #no-such-element-waygraph tone=danger label="Gone"
5
- [14:52:32.860] waygraph pilot: highlight ring #login-button tone=success label="Login"
@@ -1,20 +0,0 @@
1
- [12:51:40.250] waygraph pilot: stub.before ctx.title("Signing in · mobile")
2
- [12:51:40.251] waygraph pilot: stub.before ctx.todos n=6 index=0
3
- [12:51:40.251] waygraph pilot: stub.before ctx.device(mobile)
4
- [12:51:40.251] waygraph pilot: stub.before ctx.zoom(1.35)
5
- [12:51:40.251] waygraph pilot: stub.before ring #user-name tone=info label="Username"
6
- [12:51:41.434] waygraph pilot: stub.after ctx.todos n=6 index=1
7
- [12:51:43.164] waygraph pilot: stub.before ring #password tone=planned label="Password"
8
- [12:51:43.434] waygraph pilot: stub.after ctx.todos n=6 index=2
9
- [12:51:45.089] waygraph pilot: stub.before ring #login-button tone=warning label="Login"
10
- [12:51:45.274] waygraph pilot: stub.after ctx.title("Inventory · landscape")
11
- [12:51:45.274] waygraph pilot: stub.after ctx.todos n=6 index=3
12
- [12:51:45.274] waygraph pilot: stub.after ctx.device(mobile)
13
- [12:51:45.274] waygraph pilot: stub.after ring .inventory_list tone=success label="Product shelf"
14
- [12:51:48.597] waygraph pilot: stub.before ctx.title("Open cart · landscape")
15
- [12:51:48.597] waygraph pilot: stub.before ctx.todos n=6 index=5
16
- [12:51:48.597] waygraph pilot: stub.before ctx.device(mobile)
17
- [12:51:48.597] waygraph pilot: stub.before ctx.zoom(1.4)
18
- [12:51:48.597] waygraph pilot: stub.before ring .shopping_cart_link tone=planned label="Cart"
19
- [12:51:48.903] waygraph pilot: stub.after ctx.title("Your cart · desktop")
20
- [12:51:48.903] waygraph pilot: stub.after ring .cart_item tone=success label="Cart items"
File without changes