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
@@ -1,4 +1,5 @@
1
- import { Engine, start, end, withTitle, withHighlightFixtures } from "waygraph";
1
+ import { Engine } from "waygraph";
2
+ import config from "../../config/waygraph.config.js";
2
3
  import { NavMailpitInboxBlock } from "../map/(external)/mailpit/_nav.block.js";
3
4
  import { AssertEmailReceivedBlock } from "../map/(external)/mailpit/_methods/assert-email-received.method.block.js";
4
5
  import { OpenMessageBlock } from "../map/(external)/mailpit/_methods/open-message.method.block.js";
@@ -8,78 +9,38 @@ import { NavVerificationLinkBlock } from "../map/(app_base)/home/nav-verificatio
8
9
  import "../map/(external)/mailpit/_page.block.js";
9
10
  import { MailpitSel } from "../map/(external)/mailpit/_sel.js";
10
11
 
11
- const engine = new Engine();
12
+ const engine = new Engine(config);
12
13
 
13
- /**
14
- * Cross-origin mail demo, QA-rich: navigate to a real Mailpit inbox (a real,
15
- * separate web UI - not this app), confirm the email actually arrived,
16
- * open it, confirm its body says what it's supposed to, read a link
17
- * straight out of the DOM, then navigate back into the app with it - six
18
- * atomic Blocks, no mail-catcher REST API anywhere.
19
- *
20
- * The four mail-reading Blocks (`assert-email-received`, `open-message`,
21
- * `assert-email-content`, `extract-email-link`) are reusable across any
22
- * number of different email scenarios in a project (signup confirmation,
23
- * password reset, magic link, ...) with zero new Blocks per scenario - only
24
- * mem varies per run: `ExpectedRecipient` (who), `ExpectedLinkPattern`
25
- * (which link in the body to follow), `ExpectedEmailContent` (what the body
26
- * should say). This particular flow wires them to this scaffold's own
27
- * "verified" landing route (`nav-verification-link`, app-specific by
28
- * nature - a different scenario would use a different landing Nav) - see
29
- * tests/mail-verify.spec.ts for two different scenarios driven through the
30
- * same four mail-reading Blocks.
31
- *
32
- * Needs a real Mailpit instance reachable at WAYGRAPH_MAIL_URL (default
33
- * http://127.0.0.1:8025) with a message already waiting for
34
- * ExpectedRecipient's email - see tests/mail-verify.spec.ts for how the test
35
- * drives this end to end (spins up a real Mailpit container, sends a real
36
- * email, then runs this exact flow) - including the negative cases: no email
37
- * arriving, or content that doesn't match, each fail loud, naming
38
- * themselves, not a silent pass.
39
- */
40
- export const mailVerifyFlow = withHighlightFixtures(
41
- withTitle(
42
- engine.defineFlow([
43
- start,
44
- NavMailpitInboxBlock,
45
- AssertEmailReceivedBlock,
46
- OpenMessageBlock,
47
- AssertEmailContentBlock,
48
- ExtractEmailLinkBlock,
49
- NavVerificationLinkBlock,
50
- end,
51
- ]),
52
- "Scaffold: Cross-origin mail verification (QA-rich)",
53
- ),
54
- {
55
- "assert-email-received": {
56
- stubAfter: {
57
- note: {
58
- selector: MailpitSel.messageRow,
59
- label: "AC · email arrived",
60
- detail: "Confirmed before opening anything.",
61
- tag: "AC",
62
- },
63
- },
64
- },
65
- "assert-email-content": {
66
- stubAfter: {
67
- note: {
68
- selector: MailpitSel.previewIframe,
69
- label: "AC · email body matches expected copy",
70
- tag: "AC",
71
- },
72
- },
73
- },
74
- "extract-email-link": {
75
- stubAfter: {
76
- note: {
77
- selector: MailpitSel.previewIframe,
78
- label: "AC · link found",
79
- detail: "Read from the message preview iframe.",
80
- tag: "AC",
81
- },
82
- },
83
- },
84
- },
85
- );
14
+ /** Needs a Mailpit at WAYGRAPH_MAIL_URL (default http://127.0.0.1:8025); tests/mail-verify.spec.ts starts one. */
15
+ export const mailVerifyFlow = engine
16
+ .map()
17
+ .start()
18
+ .gotoExternal(NavMailpitInboxBlock)
19
+ .assert(
20
+ AssertEmailReceivedBlock.stubAfter((ctx) => {
21
+ ctx.ring("note", {
22
+ selector: MailpitSel.messageRow,
23
+ label: "AC · email arrived",
24
+ detail: "Confirmed before opening anything.",
25
+ tag: "AC",
26
+ });
27
+ }),
28
+ )
29
+ .method(OpenMessageBlock)
30
+ .assert(
31
+ AssertEmailContentBlock.stubAfter((ctx) => {
32
+ ctx.ring("note", { selector: MailpitSel.previewIframe, label: "AC · email body matches expected copy", tag: "AC" });
33
+ }),
34
+ )
35
+ .method(
36
+ ExtractEmailLinkBlock.stubAfter((ctx) => {
37
+ ctx.ring("note", {
38
+ selector: MailpitSel.previewIframe,
39
+ label: "AC · link found",
40
+ detail: "Read from the message preview iframe.",
41
+ tag: "AC",
42
+ });
43
+ }),
44
+ )
45
+ .gotoPage(NavVerificationLinkBlock)
46
+ .end({ title: "Scaffold: Cross-origin mail verification (QA-rich)" });
@@ -1,74 +1,50 @@
1
- import {
2
- Engine,
3
- start,
4
- end,
5
- withTitle,
6
- withHighlightFixtures,
7
- withSessionReset,
8
- withMemStub,
9
- registerMemStub,
10
- } from "waygraph";
1
+ import { Engine } from "waygraph";
2
+ import config from "../../config/waygraph.config.js";
3
+ import { DemoSel } from "../map/(app_base)/home/_sel.js";
11
4
  import { NavHomeBlock } from "../map/(app_base)/home/_nav.block.js";
12
5
  import { AddItemBlock } from "../map/(app_base)/home/_methods/add-item.effect.block.js";
13
6
  import { AssertItemAddedBlock } from "../map/(app_base)/home/_methods/assert-item-added.method.block.js";
14
7
  import { RemoveItemBlock } from "../map/(app_base)/home/_methods/remove-item.effect.block.js";
15
8
  import { ClearCartBlock } from "../map/(app_base)/home/_methods/clear-cart.method.block.js";
16
- import { SelectedItem } from "../states/demo.mem-keys.js";
9
+ import "../states/demo.mem-stubs.js";
17
10
  import "../map/(app_base)/home/_page.block.js";
18
11
 
19
- const engine = new Engine();
12
+ const engine = new Engine(config);
20
13
 
21
- /**
22
- * memStub: a real fixture row (`alpha`/`Alpha`), registered once so this Flow never needs
23
- * --data at all. Still override-able - `--data '{"demo.selectedItem":{"id":"beta",...}}'`
24
- * wins over this registration, same as any other memStub (see docs/REFERENCE.md's own
25
- * "memStub - fake values for requires" section).
26
- */
27
- registerMemStub(SelectedItem.key, () => ({ id: "alpha", name: "Alpha" }));
14
+ // `memStub: true` fills SelectedItem (alpha) from src/states/demo.mem-stubs.ts; --data overrides it.
15
+ const AddShown = AddItemBlock.stubBefore((ctx) => {
16
+ ctx.ring("add", { selector: DemoSel.catalog, label: "Catalog" });
17
+ })
18
+ .stubAfter((ctx) => {
19
+ ctx.ring("cart", {
20
+ selector: DemoSel.cartCount,
21
+ label: "AC · item in cart",
22
+ detail: "Cart count bumped after Add.",
23
+ tag: "AC",
24
+ duration: true,
25
+ });
26
+ })
27
+ .stubOnError((ctx) => {
28
+ ctx.ring("cart", { selector: DemoSel.cartCount, label: "Cart at failure", tag: "FAIL" });
29
+ });
28
30
 
29
- /**
30
- * Effect + Method demo. `requires: [SelectedItem.key]` (on `add-item`) is filled automatically
31
- * by the memStub registration above - no --data needed. Override it with real data, or use
32
- * `waygraph auto` which fills SelectedItem via instanceOptions instead:
33
- *
34
- * waygraph demo --blocks shopFlow # memStub fills it
35
- * waygraph demo --blocks shopFlow --data '{"demo.selectedItem":{"id":"beta","name":"Beta"}}'
36
- * waygraph auto # after landing on home, pick Add Alpha / Add Beta / Remove ...
37
- *
38
- * Add -> assert it actually landed (mem-matched Remove button + cart count,
39
- * only provable from the method's real effect, not a static page state) ->
40
- * Remove that same row (per-item Effect, `remove-item`) -> Add again ->
41
- * Clear cart (bulk Method, `clear-cart`) - keeps both the per-item and bulk
42
- * clear paths atomic and each wired into a real flow, not orphaned.
43
- */
44
- export const shopFlow = withMemStub(
45
- withHighlightFixtures(
46
- withTitle(
47
- withSessionReset(
48
- engine.defineFlow([
49
- start,
50
- NavHomeBlock,
51
- AddItemBlock,
52
- AssertItemAddedBlock,
53
- RemoveItemBlock,
54
- AddItemBlock,
55
- ClearCartBlock,
56
- end,
57
- ]),
58
- ),
59
- "Scaffold: Shop (Effect + clear)",
60
- ),
61
- {
62
- "add-item": {
63
- stubAfter: {
64
- cart: {
65
- label: "AC · item in cart",
66
- detail: "Cart count bumped after Add.",
67
- tag: "AC",
68
- duration: true,
69
- },
70
- },
71
- },
72
- },
73
- ),
74
- );
31
+ const RemoveShown = RemoveItemBlock.stubAfter((ctx) => {
32
+ ctx.ring("cart", { selector: DemoSel.cartCount, label: "Cart count", duration: true });
33
+ });
34
+
35
+ const ClearShown = ClearCartBlock.stubBefore((ctx) => {
36
+ ctx.ring("clear", { selector: DemoSel.clear, label: "Clear cart" });
37
+ }).stubAfter((ctx) => {
38
+ ctx.ring("cart", { selector: DemoSel.cartCount, label: "Empty cart", duration: true });
39
+ });
40
+
41
+ export const shopFlow = engine
42
+ .map()
43
+ .start()
44
+ .gotoPage(NavHomeBlock)
45
+ .method(AddShown)
46
+ .assert(AssertItemAddedBlock)
47
+ .method(RemoveShown)
48
+ .method(AddShown)
49
+ .method(ClearShown)
50
+ .end({ title: "Scaffold: Shop (Effect + clear)", sessionReset: true, memStub: true });
@@ -2,15 +2,6 @@ import { defineNavBlock, Trait } from "waygraph";
2
2
  import type { Docs } from "../../../states/demo.states.js";
3
3
  import { DocsSel, DOCS_URL } from "./_sel.js";
4
4
 
5
- /**
6
- * Kind: Nav
7
- * Route: (app_base)/docs/
8
- *
9
- * Same origin as home/ (same fixture server, different HTML file) - lives
10
- * under (app_base), not (external). See docs/REFERENCE.md "Waygraph Map" and
11
- * openspec/changes/waygraph-map. `(app_base)` is purely organizational
12
- * (Next.js route-group style) - never part of the Checkpoint tag.
13
- */
14
5
  export const NavDocsBlock = defineNavBlock<Docs>({
15
6
  name: "nav-docs",
16
7
  description: "Opens the docs page (Waygraph Map convention demo).",
@@ -2,11 +2,6 @@ import { definePageBlock, Trait } from "waygraph";
2
2
  import type { Docs } from "../../../states/demo.states.js";
3
3
  import { DocsSel } from "./_sel.js";
4
4
 
5
- /**
6
- * Kind: Page
7
- * Route: (app_base)/docs/
8
- * Arrival-only (nav.block.ts already landed on Docs).
9
- */
10
5
  export const DocsPageBlock = definePageBlock<Docs>({
11
6
  name: "page-docs",
12
7
  description: "Docs hub - Waygraph Map convention demo.",
@@ -1,6 +1,5 @@
1
- export const DOCS_URL =
2
- process.env.WAYGRAPH_DOCS_URL ??
3
- `http://${process.env.WAYGRAPH_FIXTURE_HOST || "127.0.0.1"}:${process.env.WAYGRAPH_FIXTURE_PORT || "4177"}/docs.html`;
1
+ // Relative to baseUrl in config/waygraph.config.ts (the (app_base) folder, set by `waygraph init`).
2
+ export const DOCS_URL = "docs/index.html";
4
3
 
5
4
  export const DocsSel = {
6
5
  heading: "#docs-heading",
@@ -3,6 +3,6 @@
3
3
  <head><title>Scaffold - docs (Waygraph Map convention demo)</title></head>
4
4
  <body>
5
5
  <h1 id="docs-heading">Docs</h1>
6
- <a id="go-home" href="/home.html">Back home</a>
6
+ <a id="go-home" href="../home/index.html">Back home</a>
7
7
  </body>
8
8
  </html>
@@ -1,22 +1,14 @@
1
1
  import {
2
2
  defineEffectBlock,
3
3
  checkpoint,
4
- type Checkpoint,
5
4
  type WaygraphInstanceOption,
6
5
  } from "waygraph";
7
- import type { ItemInCart } from "../../../../states/demo.states.js";
6
+ import type { CanAddItem, ItemInCart } from "../../../../states/demo.states.js";
8
7
  import { SelectedItem } from "../../../../states/demo.mem-keys.js";
9
8
  import { DemoSel } from "../_sel.js";
10
9
 
11
- /**
12
- * Kind: Effect
13
- * Helper: defineEffectBlock
14
- * Route: demo-web/methods/
15
- *
16
- * Mutates one catalog row from mem. `waygraph auto` lists one "Add …" row per
17
- * live Add button via instanceOptions.
18
- */
19
- export const AddItemBlock = defineEffectBlock<Checkpoint<string>, ItemInCart>({
10
+ /** `waygraph auto` lists one "Add …" row per live Add button via `instanceOptions`. */
11
+ export const AddItemBlock = defineEffectBlock<CanAddItem, ItemInCart>({
20
12
  name: "add-item",
21
13
  description: "Adds the mem-selected catalog item to the cart.",
22
14
  requires: [SelectedItem.key],
@@ -35,18 +27,9 @@ export const AddItemBlock = defineEffectBlock<Checkpoint<string>, ItemInCart>({
35
27
  },
36
28
  },
37
29
  ],
38
- stubBefore: {
39
- add: { selector: DemoSel.catalog, label: "Catalog" },
40
- },
41
- stubAfter: {
42
- cart: { selector: DemoSel.cartCount, label: "Cart count", duration: true },
43
- },
44
- stubOnError: {
45
- cart: { selector: DemoSel.cartCount, label: "Cart at failure", tag: "FAIL" },
46
- },
47
30
  },
48
31
  async instanceOptions(page): Promise<readonly WaygraphInstanceOption[]> {
49
- const buttons = page.locator("button.add:not([hidden])");
32
+ const buttons = page.locator(DemoSel.addButtons);
50
33
  const n = await buttons.count();
51
34
  const out: WaygraphInstanceOption[] = [];
52
35
  for (let i = 0; i < n; i++) {
@@ -1,40 +1,14 @@
1
1
  import { defineAssertBlock, Trait } from "waygraph";
2
+ import type { Home } from "../../../../states/demo.states.js";
2
3
  import { DemoSel } from "../_sel.js";
3
4
 
4
- /**
5
- * Kind: Assert
6
- * Helper: defineAssertBlock
7
- * Route: demo-web/methods/
8
- *
9
- * Self-loop-only "verify what's already on the page" check - no hand-written
10
- * act/resolve to accidentally do a second thing. Same-URL assert after nav,
11
- * with stubs + fixtures + a YAP slide.
12
- */
13
- export const AssertHelloBlock = defineAssertBlock({
5
+ /** Heading still shows after arrival; the slide is a YAP caption for the demo overlay. */
6
+ export const AssertHelloBlock = defineAssertBlock<Home>({
14
7
  name: "assert-hello",
15
8
  description: "Confirms the hello heading is still visible after arrival.",
16
- checkpoint: "HomeVerified",
9
+ checkpoint: "Home",
17
10
  waitForHeading: "Hello Waygraph",
18
11
  verify: [Trait.text(DemoSel.title, "Hello Waygraph"), Trait.visible(DemoSel.sub)],
19
- stubBefore: {
20
- title: { selector: DemoSel.title, label: "Heading about to check" },
21
- },
22
- stubAfter: {
23
- title: {
24
- selector: DemoSel.title,
25
- label: "Hello confirmed",
26
- detail: "Offline scaffold proof point.",
27
- duration: true,
28
- },
29
- sub: { selector: DemoSel.sub, label: "Subcopy", duration: 1500 },
30
- },
31
- stubOnError: {
32
- title: {
33
- selector: DemoSel.title,
34
- label: "Heading at failure",
35
- tag: "FAIL",
36
- },
37
- },
38
12
  slides: [
39
13
  {
40
14
  caption: "Scaffold covers auto + narration",
@@ -3,11 +3,7 @@ import type { ItemInCart } from "../../../../states/demo.states.js";
3
3
  import { SelectedItem } from "../../../../states/demo.mem-keys.js";
4
4
  import { DemoSel } from "../_sel.js";
5
5
 
6
- /**
7
- * Mem-aware Trait: which item's Remove button should be visible depends on
8
- * which row add-item just acted on (mem, not a static selector) - a Trait's
9
- * own `check(page, mem)` already receives mem, so this reads it directly.
10
- */
6
+ // Reads mem at check time, so it follows whichever item add-item acted on.
11
7
  const removeButtonVisibleForSelectedItem: TraitType = {
12
8
  name: "remove-button-visible-for-selected-item",
13
9
  async check(page, mem) {
@@ -16,20 +12,7 @@ const removeButtonVisibleForSelectedItem: TraitType = {
16
12
  },
17
13
  };
18
14
 
19
- /**
20
- * Kind: Assert
21
- * Helper: defineAssertBlock
22
- * Route: demo-web/methods/
23
- *
24
- * "Did add-item actually work" - provable only after the fact, from the
25
- * method's real effect on the page: the specific row's own Remove button
26
- * appeared (mem-matched, not just "some" row), AND the aggregate cart count
27
- * reflects it. Self-loop on ItemInCart - no state change, verify only.
28
- *
29
- * Explicit `<ItemInCart>` type argument - `defineAssertBlock` defaults to
30
- * wildcard `Checkpoint<string>` when uninferred, which only "works" when the
31
- * assert sits last in a chain; this one sits mid-chain (see shop.flow.ts).
32
- */
15
+ /** The mem-selected item's own Remove button appeared and the cart count reflects it. */
33
16
  export const AssertItemAddedBlock = defineAssertBlock<ItemInCart>({
34
17
  name: "assert-item-added",
35
18
  description: "Confirms the mem-selected item's own Remove button appeared and the cart count reflects it.",
@@ -2,16 +2,6 @@ import { defineMethodBlock, checkpoint, Trait } from "waygraph";
2
2
  import type { ItemInCart, CartEmpty } from "../../../../states/demo.states.js";
3
3
  import { DemoSel } from "../_sel.js";
4
4
 
5
- /**
6
- * Kind: Method
7
- * Helper: defineMethodBlock
8
- * Route: (app_base)/home/_methods/
9
- *
10
- * Real, pre-existing bug found live while verifying the Waygraph Map
11
- * rename: this Block had no explicit <In, Out> generic at all, so static
12
- * discovery (`waygraph graph`) always skipped it silently ("no ...generic
13
- * call found") - present before this move, not caused by it.
14
- */
15
5
  export const ClearCartBlock = defineMethodBlock<ItemInCart, CartEmpty>({
16
6
  name: "clear-cart",
17
7
  description: "Clears every item via the Clear cart control.",
@@ -21,12 +11,5 @@ export const ClearCartBlock = defineMethodBlock<ItemInCart, CartEmpty>({
21
11
  },
22
12
  resolve: () => checkpoint("CartEmpty"),
23
13
  verify: [Trait.text(DemoSel.cartCount, "0")],
24
- stubBefore: {
25
- clear: { selector: DemoSel.clear, label: "Clear cart" },
26
- },
27
- stubAfter: {
28
- cart: { selector: DemoSel.cartCount, label: "Empty cart", duration: true },
29
- },
30
- stubOnError: {},
31
14
  },
32
15
  });
@@ -1,21 +1,13 @@
1
1
  import {
2
2
  defineEffectBlock,
3
3
  checkpoint,
4
- type Checkpoint,
5
4
  type WaygraphInstanceOption,
6
5
  } from "waygraph";
7
- import type { CartEmpty } from "../../../../states/demo.states.js";
6
+ import type { CartEmpty, ItemInCart } from "../../../../states/demo.states.js";
8
7
  import { SelectedItem } from "../../../../states/demo.mem-keys.js";
9
8
  import { DemoSel } from "../_sel.js";
10
9
 
11
- /**
12
- * Kind: Effect
13
- * Helper: defineEffectBlock
14
- * Route: demo-web/methods/
15
- *
16
- * Removes one in-cart row. Auto menus one row per visible Remove button.
17
- */
18
- export const RemoveItemBlock = defineEffectBlock<Checkpoint<string>, CartEmpty>({
10
+ export const RemoveItemBlock = defineEffectBlock<ItemInCart, CartEmpty>({
19
11
  name: "remove-item",
20
12
  description: "Removes the mem-selected catalog item from the cart.",
21
13
  requires: [SelectedItem.key],
@@ -34,14 +26,9 @@ export const RemoveItemBlock = defineEffectBlock<Checkpoint<string>, CartEmpty>(
34
26
  },
35
27
  },
36
28
  ],
37
- stubBefore: {},
38
- stubAfter: {
39
- cart: { selector: DemoSel.cartCount, label: "Cart count", duration: true },
40
- },
41
- stubOnError: {},
42
29
  },
43
30
  async instanceOptions(page): Promise<readonly WaygraphInstanceOption[]> {
44
- const buttons = page.locator("button.remove:not([hidden])");
31
+ const buttons = page.locator(DemoSel.removeButtons);
45
32
  const n = await buttons.count();
46
33
  const out: WaygraphInstanceOption[] = [];
47
34
  for (let i = 0; i < n; i++) {
@@ -1,22 +1,11 @@
1
1
  import { defineNavBlock, Trait } from "waygraph";
2
+ import type { Home } from "../../../states/demo.states.js";
2
3
  import { DemoSel, HOME_URL } from "./_sel.js";
3
4
 
4
- /**
5
- * Kind: Nav
6
- * Helper: defineNavBlock
7
- * Route: (app_base)/home/ (synthetic "/")
8
- */
9
- export const NavHomeBlock = defineNavBlock({
5
+ export const NavHomeBlock = defineNavBlock<Home>({
10
6
  name: "nav-home",
11
- description: "Opens the offline catalog page (HTTP fixture :4177).",
7
+ description: "Opens the offline catalog page (file://, no server).",
12
8
  checkpoint: "Home",
13
9
  url: HOME_URL,
14
10
  verify: [Trait.text(DemoSel.title, "Hello Waygraph"), Trait.visible(DemoSel.catalog)],
15
- stubBefore: {},
16
- stubAfter: {
17
- title: { selector: DemoSel.title, label: "Home heading", duration: true },
18
- },
19
- stubOnError: {
20
- title: { selector: DemoSel.title, label: "Home heading at failure" },
21
- },
22
11
  });
@@ -6,15 +6,6 @@ import { RemoveItemBlock } from "./_methods/remove-item.effect.block.js";
6
6
  import { ClearCartBlock } from "./_methods/clear-cart.method.block.js";
7
7
  import { AssertHelloBlock } from "./_methods/assert-hello.method.block.js";
8
8
 
9
- /**
10
- * Kind: Page
11
- * Helper: definePageBlock
12
- * Route: (app_base)/home/
13
- *
14
- * Hub for the offline home screen. Methods hang here for docs/auto grouping;
15
- * edges in flows still reference the method Blocks directly.
16
- * Arrival-only (nav-home already landed on Home).
17
- */
18
9
  export const HomePageBlock = definePageBlock<Home>({
19
10
  name: "page-home",
20
11
  description: "Offline home hub - add/remove effects, clear, assert-hello.",
@@ -1,7 +1,5 @@
1
- /** Offline catalog URL — HTTP fixture server (not file://; Flatpak Chromium blocks /tmp file URLs). */
2
- export const HOME_URL =
3
- process.env.WAYGRAPH_HOME_URL ??
4
- `http://${process.env.WAYGRAPH_FIXTURE_HOST || "127.0.0.1"}:${process.env.WAYGRAPH_FIXTURE_PORT || "4177"}/home.html`;
1
+ // Relative to baseUrl in config/waygraph.config.ts (the (app_base) folder, set by `waygraph init`).
2
+ export const HOME_URL = "home/index.html";
5
3
 
6
4
  export const DemoSel = {
7
5
  title: "h1",
@@ -9,6 +7,8 @@ export const DemoSel = {
9
7
  cartCount: "[data-test=cart-count]",
10
8
  catalog: "#catalog",
11
9
  clear: "[data-test=clear-cart]",
10
+ addButtons: "button.add:not([hidden])",
11
+ removeButtons: "button.remove:not([hidden])",
12
12
  addBtn: (id: string) => `[data-test=add-${id}]`,
13
13
  removeBtn: (id: string) => `[data-test=remove-${id}]`,
14
14
  verifiedBanner: "#verified-banner",
@@ -3,29 +3,7 @@ import type { HomeVerified } from "../../../states/demo.states.js";
3
3
  import { EmailLink } from "../../../states/demo.mem-keys.js";
4
4
  import { DemoSel } from "./_sel.js";
5
5
 
6
- /**
7
- * Kind: Nav
8
- * Helper: defineNavBlock
9
- * Route: (app_base)/home/
10
- *
11
- * Navigates back into the app to the link extract-email-link read out of
12
- * the real Mailpit message, then confirms the page actually reflects it
13
- * (the verified banner only appears when the exact `verified=1` link was
14
- * followed, not just any URL). This particular check is app-specific (this
15
- * scaffold's own verification landing route) even though the mail-reading
16
- * Blocks feeding it are scenario-agnostic - a real project would have one
17
- * such Nav per distinct landing route, same as any other app screen.
18
- *
19
- * Deliberately no `requires: [EmailLink.key]` here: `requires` means "the
20
- * caller must seed this externally before the flow starts" (preflight
21
- * checks the whole chain's requires up front) - `EmailLink` is instead
22
- * produced by an earlier Block in this very chain, so declaring it as a
23
- * requirement would make preflight fail before the flow ever gets the
24
- * chance to produce it. Engine support for declaring a mem key as "produced
25
- * by an earlier Block in this chain" (vs. externally supplied) is a
26
- * separate, not-yet-built roadmap item - see ROADMAP.md's "Split requires"
27
- * row.
28
- */
6
+ /** Follows the link `extract-email-link` put in mem. No `requires`: an earlier Block in the chain produces it. */
29
7
  export const NavVerificationLinkBlock = defineNavBlock<HomeVerified>({
30
8
  name: "nav-verification-link",
31
9
  checkpoint: "HomeVerified",
@@ -0,0 +1,17 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <title>Waygraph scaffold demo</title>
6
+ <style>
7
+ body { font-family: system-ui, sans-serif; margin: 6rem 2rem 2rem; }
8
+ </style>
9
+ </head>
10
+ <body>
11
+ <h1>Waygraph scaffold demo</h1>
12
+ <ul>
13
+ <li><a href="home/index.html">Home</a></li>
14
+ <li><a href="docs/index.html">Docs</a></li>
15
+ </ul>
16
+ </body>
17
+ </html>
@@ -0,0 +1,21 @@
1
+ import { defineAssertBlock, type Trait } from "waygraph";
2
+ import type { HoppscotchRest } from "../../../../states/demo.states.js";
3
+ import { ExpectedResponseText, ResponseBody } from "../../../../states/demo.mem-keys.js";
4
+
5
+ // Hoppscotch pretty-prints JSON, so compare with whitespace removed from both sides.
6
+ const squash = (text: string): string => text.replace(/\s+/g, "");
7
+
8
+ const bodyContainsExpected: Trait = {
9
+ name: "response-body-contains-expected",
10
+ async check(_page, mem) {
11
+ return squash(mem.get(ResponseBody)).includes(squash(mem.get(ExpectedResponseText)));
12
+ },
13
+ };
14
+
15
+ export const AssertResponseBodyBlock = defineAssertBlock<HoppscotchRest>({
16
+ name: "assert-response-body",
17
+ description: "Confirms the response body read earlier contains the mem-supplied text (whitespace ignored).",
18
+ checkpoint: "HoppscotchRest",
19
+ requires: [ExpectedResponseText],
20
+ verify: [bodyContainsExpected],
21
+ });
@@ -0,0 +1,19 @@
1
+ import { defineAssertBlock, type Trait } from "waygraph";
2
+ import type { HoppscotchRest } from "../../../../states/demo.states.js";
3
+ import { ExpectedResponseHeader, ResponseHeaders } from "../../../../states/demo.mem-keys.js";
4
+
5
+ const headerMatches: Trait = {
6
+ name: "response-header-matches",
7
+ async check(_page, mem) {
8
+ const { name, value } = mem.get(ExpectedResponseHeader.key);
9
+ return mem.get(ResponseHeaders)[name.toLowerCase()] === value;
10
+ },
11
+ };
12
+
13
+ export const AssertResponseHeaderBlock = defineAssertBlock<HoppscotchRest>({
14
+ name: "assert-response-header",
15
+ description: "Confirms a response header read earlier has the mem-supplied value.",
16
+ checkpoint: "HoppscotchRest",
17
+ requires: [ExpectedResponseHeader.key],
18
+ verify: [headerMatches],
19
+ });