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.
- package/dist/analysis/graph.d.ts +1 -1
- package/dist/analysis/graph.js +10 -15
- package/dist/analysis/map-check.js +5 -2
- package/dist/analysis/practices-check.d.ts +0 -1
- package/dist/analysis/practices-check.js +17 -17
- package/dist/auto-session/session.d.ts +1 -1
- package/dist/auto-session/session.js +14 -8
- package/dist/blocks-select.d.ts +7 -4
- package/dist/blocks-select.js +0 -14
- package/dist/browser.d.ts +27 -0
- package/dist/browser.js +62 -0
- package/dist/cli/run-chain.js +5 -0
- package/dist/cli/usage.js +14 -1
- package/dist/cli.js +10 -1
- package/dist/commands/agent-dive-scaffold.d.ts +5 -0
- package/dist/commands/agent-dive-scaffold.js +7 -0
- package/dist/commands/extensions.d.ts +1 -0
- package/dist/commands/extensions.js +22 -0
- package/dist/commands/init.js +45 -2
- package/dist/commands/test.js +16 -2
- package/dist/commands/try.js +2 -1
- package/dist/commands/upgrade.d.ts +6 -0
- package/dist/commands/upgrade.js +107 -0
- package/dist/config.d.ts +47 -3
- package/dist/config.js +45 -12
- package/dist/core/block.d.ts +12 -0
- package/dist/core/block.js +36 -0
- package/dist/core/blocks/effect.d.ts +0 -3
- package/dist/core/blocks/method.d.ts +0 -6
- package/dist/core/blocks/nav.d.ts +11 -3
- package/dist/core/blocks/nav.js +8 -0
- package/dist/core/blocks/page.d.ts +0 -3
- package/dist/core/config.d.ts +5 -0
- package/dist/core/engine.d.ts +17 -16
- package/dist/core/engine.js +3 -3
- package/dist/core/flow.d.ts +17 -0
- package/dist/core/flow.js +44 -24
- package/dist/core/map-builder.d.ts +3 -3
- package/dist/core/map-builder.js +3 -3
- package/dist/env-file.d.ts +7 -7
- package/dist/env-file.js +29 -16
- package/dist/extensions.d.ts +21 -0
- package/dist/extensions.js +178 -0
- package/dist/highlights/types.d.ts +3 -2
- package/dist/index.d.ts +8 -3
- package/dist/index.js +4 -1
- package/dist/pilot-overlay/overlay-fixtures.d.ts +0 -7
- package/dist/pilot-overlay/overlay-fixtures.js +0 -45
- package/dist/playwright-config.d.ts +4 -0
- package/dist/playwright-config.js +15 -0
- package/dist/playwright.config.d.ts +2 -0
- package/dist/playwright.config.js +6 -0
- package/dist/runner/demo-log.js +1 -7
- package/dist/runner/inpage/banner.js +10 -2
- package/dist/runner/inpage/core.d.ts +1 -1
- package/dist/runner/inpage/core.js +8 -7
- package/dist/runner/main.js +27 -15
- package/dist/runner/rings.js +0 -49
- package/dist/session/auto-explore-run.js +21 -6
- package/dist/session/auto-explore.js +6 -4
- package/dist/session/step-overlay.js +3 -1
- package/dist/traverse/run.js +4 -1
- package/dist/types.d.ts +0 -3
- package/dist/ui/components/ring.js +1 -0
- package/dist/ui/overlay.css +1 -0
- package/dist/ui/shadow.d.ts +1 -3
- package/dist/ui/shadow.js +0 -4
- package/dist/ui/tokens.d.ts +0 -11
- package/dist/ui/tokens.js +0 -5
- package/dist/video-dir.d.ts +8 -0
- package/dist/video-dir.js +60 -0
- package/dist/webserver.d.ts +14 -0
- package/dist/webserver.js +95 -0
- package/examples/routed-demo/package.json +3 -3
- package/examples/routed-demo/playwright.config.ts +8 -8
- package/examples/routed-demo/scripts/fixture-server.mjs +12 -31
- package/examples/routed-demo/src/map/(app_base)/dashboard/_sel.ts +1 -3
- package/examples/routed-demo/src/map/(external)/docs/_sel.ts +1 -3
- package/examples/routed-demo/src/pages/dashboard.html +1 -1
- package/examples/routed-demo/src/pages/docs.html +1 -1
- package/examples/saucedemo/playwright.config.ts +2 -3
- package/examples/saucedemo/scripts/prove-add-to-cart-menu.mjs +2 -1
- package/examples/saucedemo/scripts/prove-auto-graph.mjs +2 -1
- package/examples/saucedemo/scripts/prove-wrong-login-runtime.mjs +2 -1
- package/examples/saucedemo/tests/flow-block-verify.spec.ts +2 -7
- package/package.json +10 -2
- package/templates/quickstart/playwright.config.ts +0 -6
- package/templates/scaffold/README.md +7 -3
- package/templates/scaffold/STRUCTURE.md +8 -6
- package/templates/scaffold/config/waygraph.config.ts +26 -0
- package/templates/scaffold/package.json +9 -13
- package/templates/scaffold/src/flows/README.md +5 -5
- package/templates/scaffold/src/flows/example.flow.ts +31 -17
- package/templates/scaffold/src/flows/hoppscotch-auth.flow.ts +35 -0
- package/templates/scaffold/src/flows/hoppscotch-get.flow.ts +23 -0
- package/templates/scaffold/src/flows/hoppscotch-post.flow.ts +33 -0
- package/templates/scaffold/src/flows/mail-verify.flow.ts +36 -75
- package/templates/scaffold/src/flows/shop.flow.ts +41 -65
- package/templates/scaffold/src/map/(app_base)/docs/_nav.block.ts +0 -9
- package/templates/scaffold/src/map/(app_base)/docs/_page.block.ts +0 -5
- package/templates/scaffold/src/map/(app_base)/docs/_sel.ts +2 -3
- package/templates/scaffold/src/map/(app_base)/docs/{docs.html → index.html} +1 -1
- package/templates/scaffold/src/map/(app_base)/home/_methods/add-item.effect.block.ts +4 -21
- package/templates/scaffold/src/map/(app_base)/home/_methods/assert-hello.method.block.ts +4 -30
- package/templates/scaffold/src/map/(app_base)/home/_methods/assert-item-added.method.block.ts +2 -19
- package/templates/scaffold/src/map/(app_base)/home/_methods/clear-cart.method.block.ts +0 -17
- package/templates/scaffold/src/map/(app_base)/home/_methods/remove-item.effect.block.ts +3 -16
- package/templates/scaffold/src/map/(app_base)/home/_nav.block.ts +3 -14
- package/templates/scaffold/src/map/(app_base)/home/_page.block.ts +0 -9
- package/templates/scaffold/src/map/(app_base)/home/_sel.ts +4 -4
- package/templates/scaffold/src/map/(app_base)/home/nav-verification-link.block.ts +1 -23
- package/templates/scaffold/src/map/(app_base)/index.html +17 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-body.method.block.ts +21 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-header.method.block.ts +19 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-status.method.block.ts +20 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/pick-extension-interceptor.method.block.ts +18 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-body.method.block.ts +21 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-headers.method.block.ts +21 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/send-request.method.block.ts +15 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-bearer-token.method.block.ts +20 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-headers.method.block.ts +23 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-json-body.method.block.ts +36 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-method.method.block.ts +17 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-query-params.method.block.ts +22 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-url.method.block.ts +18 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_nav.block.ts +11 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_page.block.ts +36 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_sel.ts +27 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/settings/_nav.block.ts +10 -0
- package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-content.method.block.ts +2 -27
- package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-received.method.block.ts +2 -21
- package/templates/scaffold/src/map/(external)/mailpit/_methods/extract-email-link.method.block.ts +1 -19
- package/templates/scaffold/src/map/(external)/mailpit/_methods/open-message.method.block.ts +1 -11
- package/templates/scaffold/src/map/(external)/mailpit/_nav.block.ts +1 -9
- package/templates/scaffold/src/map/(external)/mailpit/_page.block.ts +0 -11
- package/templates/scaffold/src/states/demo.mem-keys.ts +20 -19
- package/templates/scaffold/src/states/demo.mem-stubs.ts +4 -0
- package/templates/scaffold/src/states/demo.states.ts +7 -1
- package/templates/scaffold/tests/README.md +3 -2
- package/templates/scaffold/tests/example.spec.ts +2 -3
- package/templates/scaffold/tests/hoppscotch.spec.ts +97 -0
- package/templates/scaffold/tests/mail-verify.spec.ts +2 -11
- package/templates/scaffold/tsconfig.json +1 -1
- package/templates/skills/waygraph-convention.skill.md +37 -6
- package/templates/skills/waygraph-pilot.skill.md +5 -6
- package/dist/runner/overlay-present.d.ts +0 -8
- package/dist/runner/overlay-present.js +0 -57
- package/dist/ui/components/banner.d.ts +0 -2
- package/dist/ui/components/banner.js +0 -10
- package/dist/ui/components/cursor.d.ts +0 -2
- package/dist/ui/components/cursor.js +0 -19
- package/examples/routed-demo/.waygraph-auto/4d4902b7.log +0 -0
- package/examples/routed-demo/.waygraph-auto/51ef462e.log +0 -0
- package/examples/routed-demo/.waygraph-auto/71527ad9.log +0 -0
- package/examples/routed-demo/.waygraph-auto/ca16778e.log +0 -0
- package/examples/routed-demo/scripts/with-fixture.mjs +0 -70
- package/examples/saucedemo/.waygraph-auto/00b0c55c.log +0 -22
- package/examples/saucedemo/.waygraph-auto/00d147d1.log +0 -21
- package/examples/saucedemo/.waygraph-auto/00e5d037.log +0 -5
- package/examples/saucedemo/.waygraph-auto/015be8f6.log +0 -6
- package/examples/saucedemo/.waygraph-auto/026e188e.log +0 -0
- package/examples/saucedemo/.waygraph-auto/02f7dd22.log +0 -20
- package/examples/saucedemo/.waygraph-auto/03df352d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/0402cfcf.log +0 -6
- package/examples/saucedemo/.waygraph-auto/050e5b55.log +0 -0
- package/examples/saucedemo/.waygraph-auto/05d76fc3.log +0 -0
- package/examples/saucedemo/.waygraph-auto/062b581f.log +0 -20
- package/examples/saucedemo/.waygraph-auto/0681582b.log +0 -6
- package/examples/saucedemo/.waygraph-auto/07845ed1.log +0 -0
- package/examples/saucedemo/.waygraph-auto/07f3e964.log +0 -6
- package/examples/saucedemo/.waygraph-auto/0868ae4d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/0924ddaa.log +0 -22
- package/examples/saucedemo/.waygraph-auto/092d6173.log +0 -5
- package/examples/saucedemo/.waygraph-auto/096fea05.log +0 -20
- package/examples/saucedemo/.waygraph-auto/09924510.log +0 -0
- package/examples/saucedemo/.waygraph-auto/0998c941.log +0 -21
- package/examples/saucedemo/.waygraph-auto/0a8c3719.log +0 -0
- package/examples/saucedemo/.waygraph-auto/0bf74300.log +0 -21
- package/examples/saucedemo/.waygraph-auto/0c01fd29.log +0 -4
- package/examples/saucedemo/.waygraph-auto/0c19e232.log +0 -5
- package/examples/saucedemo/.waygraph-auto/0c302590.log +0 -0
- package/examples/saucedemo/.waygraph-auto/0dee62d6.log +0 -5
- package/examples/saucedemo/.waygraph-auto/0eb4c081.log +0 -5
- package/examples/saucedemo/.waygraph-auto/0f0cb120.log +0 -0
- package/examples/saucedemo/.waygraph-auto/102c38ca.log +0 -0
- package/examples/saucedemo/.waygraph-auto/10fd431c.log +0 -0
- package/examples/saucedemo/.waygraph-auto/1122c13c.log +0 -0
- package/examples/saucedemo/.waygraph-auto/123d1cad.log +0 -5
- package/examples/saucedemo/.waygraph-auto/12ed8e28.log +0 -0
- package/examples/saucedemo/.waygraph-auto/13c6fe3c.log +0 -0
- package/examples/saucedemo/.waygraph-auto/1581b677.log +0 -0
- package/examples/saucedemo/.waygraph-auto/161cc8dd.log +0 -22
- package/examples/saucedemo/.waygraph-auto/164761a5.log +0 -6
- package/examples/saucedemo/.waygraph-auto/1905ceb2.log +0 -0
- package/examples/saucedemo/.waygraph-auto/1b1d55c6.log +0 -0
- package/examples/saucedemo/.waygraph-auto/1b80fd24.log +0 -6
- package/examples/saucedemo/.waygraph-auto/1bd7b7bf.log +0 -0
- package/examples/saucedemo/.waygraph-auto/1c30a3c2.log +0 -0
- package/examples/saucedemo/.waygraph-auto/1c58a174.log +0 -0
- package/examples/saucedemo/.waygraph-auto/1cb6f44c.log +0 -5
- package/examples/saucedemo/.waygraph-auto/1d90aa9a.log +0 -0
- package/examples/saucedemo/.waygraph-auto/1de7d889.log +0 -0
- package/examples/saucedemo/.waygraph-auto/1f233a4c.log +0 -6
- package/examples/saucedemo/.waygraph-auto/1fdb2100.log +0 -0
- package/examples/saucedemo/.waygraph-auto/20e66801.log +0 -0
- package/examples/saucedemo/.waygraph-auto/20e91af6.log +0 -5
- package/examples/saucedemo/.waygraph-auto/20ffdb77.log +0 -0
- package/examples/saucedemo/.waygraph-auto/22048fff.log +0 -4
- package/examples/saucedemo/.waygraph-auto/222d1d09.log +0 -0
- package/examples/saucedemo/.waygraph-auto/22f1a704.log +0 -5
- package/examples/saucedemo/.waygraph-auto/2324269a.log +0 -0
- package/examples/saucedemo/.waygraph-auto/232a1d81.log +0 -0
- package/examples/saucedemo/.waygraph-auto/239cced3.log +0 -20
- package/examples/saucedemo/.waygraph-auto/25204b46.log +0 -4
- package/examples/saucedemo/.waygraph-auto/2553d107.log +0 -0
- package/examples/saucedemo/.waygraph-auto/25e2e90f.log +0 -0
- package/examples/saucedemo/.waygraph-auto/2708455e.log +0 -22
- package/examples/saucedemo/.waygraph-auto/272a96fd.log +0 -20
- package/examples/saucedemo/.waygraph-auto/28d7be5d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/2a577961.log +0 -0
- package/examples/saucedemo/.waygraph-auto/2a6a8266.log +0 -6
- package/examples/saucedemo/.waygraph-auto/2b3401cf.log +0 -20
- package/examples/saucedemo/.waygraph-auto/2b831907.log +0 -6
- package/examples/saucedemo/.waygraph-auto/2b9b56fc.log +0 -20
- package/examples/saucedemo/.waygraph-auto/2c79c73a.log +0 -0
- package/examples/saucedemo/.waygraph-auto/2c94a05b.log +0 -0
- package/examples/saucedemo/.waygraph-auto/2ceccd6d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/2e2069e7.log +0 -0
- package/examples/saucedemo/.waygraph-auto/2e6bc35e.log +0 -6
- package/examples/saucedemo/.waygraph-auto/2efd1983.log +0 -0
- package/examples/saucedemo/.waygraph-auto/2f1b0c13.log +0 -6
- package/examples/saucedemo/.waygraph-auto/2f4f531e.log +0 -0
- package/examples/saucedemo/.waygraph-auto/2f8d4073.log +0 -6
- package/examples/saucedemo/.waygraph-auto/2fdbd916.log +0 -0
- package/examples/saucedemo/.waygraph-auto/30739278.log +0 -6
- package/examples/saucedemo/.waygraph-auto/30a5c848.log +0 -20
- package/examples/saucedemo/.waygraph-auto/31cb2e80.log +0 -0
- package/examples/saucedemo/.waygraph-auto/322d63cd.log +0 -0
- package/examples/saucedemo/.waygraph-auto/3239aa8a.log +0 -6
- package/examples/saucedemo/.waygraph-auto/326d87b7.log +0 -6
- package/examples/saucedemo/.waygraph-auto/331c6e8e.log +0 -0
- package/examples/saucedemo/.waygraph-auto/3351c0b6.log +0 -0
- package/examples/saucedemo/.waygraph-auto/33a50dc0.log +0 -0
- package/examples/saucedemo/.waygraph-auto/33df0770.log +0 -0
- package/examples/saucedemo/.waygraph-auto/340d624d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/36367ccf.log +0 -0
- package/examples/saucedemo/.waygraph-auto/372536a5.log +0 -6
- package/examples/saucedemo/.waygraph-auto/37b56184.log +0 -0
- package/examples/saucedemo/.waygraph-auto/38f6799d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/3a208bb8.log +0 -20
- package/examples/saucedemo/.waygraph-auto/3a412f3c.log +0 -0
- package/examples/saucedemo/.waygraph-auto/3a859bd7.log +0 -0
- package/examples/saucedemo/.waygraph-auto/3a8674d5.log +0 -6
- package/examples/saucedemo/.waygraph-auto/3bdb2f5a.log +0 -0
- package/examples/saucedemo/.waygraph-auto/3c1e5fe0.log +0 -22
- package/examples/saucedemo/.waygraph-auto/3cb0add7.log +0 -0
- package/examples/saucedemo/.waygraph-auto/3e3c0f3b.log +0 -0
- package/examples/saucedemo/.waygraph-auto/3e42f0d8.log +0 -0
- package/examples/saucedemo/.waygraph-auto/3f088138.log +0 -0
- package/examples/saucedemo/.waygraph-auto/401177a3.log +0 -0
- package/examples/saucedemo/.waygraph-auto/413d934d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/4144071d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/4176a3c6.log +0 -0
- package/examples/saucedemo/.waygraph-auto/41d0793d.log +0 -4
- package/examples/saucedemo/.waygraph-auto/41e6feae.log +0 -0
- package/examples/saucedemo/.waygraph-auto/424b4d5d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/42e014d1.log +0 -0
- package/examples/saucedemo/.waygraph-auto/43253aba.log +0 -0
- package/examples/saucedemo/.waygraph-auto/432d09e3.log +0 -22
- package/examples/saucedemo/.waygraph-auto/438c6c53.log +0 -22
- package/examples/saucedemo/.waygraph-auto/4477db12.log +0 -0
- package/examples/saucedemo/.waygraph-auto/47247959.log +0 -0
- package/examples/saucedemo/.waygraph-auto/476cff76.log +0 -0
- package/examples/saucedemo/.waygraph-auto/4a1258b7.log +0 -0
- package/examples/saucedemo/.waygraph-auto/4ad09ece.log +0 -0
- package/examples/saucedemo/.waygraph-auto/4adcd179.log +0 -20
- package/examples/saucedemo/.waygraph-auto/4c9d9b16.log +0 -21
- package/examples/saucedemo/.waygraph-auto/4cebc228.log +0 -20
- package/examples/saucedemo/.waygraph-auto/4da39c36.log +0 -6
- package/examples/saucedemo/.waygraph-auto/4dbefa7e.log +0 -5
- package/examples/saucedemo/.waygraph-auto/4efa7035.log +0 -6
- package/examples/saucedemo/.waygraph-auto/505affdc.log +0 -4
- package/examples/saucedemo/.waygraph-auto/51bcb60a.log +0 -0
- package/examples/saucedemo/.waygraph-auto/527b6d76.log +0 -0
- package/examples/saucedemo/.waygraph-auto/5291bc78.log +0 -22
- package/examples/saucedemo/.waygraph-auto/535e8922.log +0 -0
- package/examples/saucedemo/.waygraph-auto/54274c39.log +0 -5
- package/examples/saucedemo/.waygraph-auto/5440ce7e.log +0 -0
- package/examples/saucedemo/.waygraph-auto/5738175f.log +0 -22
- package/examples/saucedemo/.waygraph-auto/573abedd.log +0 -0
- package/examples/saucedemo/.waygraph-auto/57ce5643.log +0 -22
- package/examples/saucedemo/.waygraph-auto/5984426b.log +0 -6
- package/examples/saucedemo/.waygraph-auto/5a682e7c.log +0 -22
- package/examples/saucedemo/.waygraph-auto/5b79320c.log +0 -21
- package/examples/saucedemo/.waygraph-auto/5b838485.log +0 -0
- package/examples/saucedemo/.waygraph-auto/5c55aaac.log +0 -21
- package/examples/saucedemo/.waygraph-auto/5d13bdde.log +0 -0
- package/examples/saucedemo/.waygraph-auto/5d285cd3.log +0 -0
- package/examples/saucedemo/.waygraph-auto/5ed00b16.log +0 -4
- package/examples/saucedemo/.waygraph-auto/60b9c066.log +0 -6
- package/examples/saucedemo/.waygraph-auto/610dd127.log +0 -0
- package/examples/saucedemo/.waygraph-auto/61105500.log +0 -5
- package/examples/saucedemo/.waygraph-auto/61333142.log +0 -5
- package/examples/saucedemo/.waygraph-auto/6134afe8.log +0 -20
- package/examples/saucedemo/.waygraph-auto/61937e83.log +0 -22
- package/examples/saucedemo/.waygraph-auto/625e7f65.log +0 -5
- package/examples/saucedemo/.waygraph-auto/62a0bdc9.log +0 -22
- package/examples/saucedemo/.waygraph-auto/6376fc15.log +0 -0
- package/examples/saucedemo/.waygraph-auto/63b0f4cd.log +0 -0
- package/examples/saucedemo/.waygraph-auto/6599cbca.log +0 -22
- package/examples/saucedemo/.waygraph-auto/6706ead4.log +0 -0
- package/examples/saucedemo/.waygraph-auto/67aaca30.log +0 -0
- package/examples/saucedemo/.waygraph-auto/685714af.log +0 -0
- package/examples/saucedemo/.waygraph-auto/68b10298.log +0 -0
- package/examples/saucedemo/.waygraph-auto/68be5e12.log +0 -0
- package/examples/saucedemo/.waygraph-auto/68df05a6.log +0 -22
- package/examples/saucedemo/.waygraph-auto/68fa0682.log +0 -0
- package/examples/saucedemo/.waygraph-auto/693f67c4.log +0 -20
- package/examples/saucedemo/.waygraph-auto/69ae030a.log +0 -6
- package/examples/saucedemo/.waygraph-auto/69e73f35.log +0 -6
- package/examples/saucedemo/.waygraph-auto/6b2333b0.log +0 -5
- package/examples/saucedemo/.waygraph-auto/6c4c3817.log +0 -0
- package/examples/saucedemo/.waygraph-auto/6c954911.log +0 -0
- package/examples/saucedemo/.waygraph-auto/6d65a439.log +0 -5
- package/examples/saucedemo/.waygraph-auto/6d700055.log +0 -0
- package/examples/saucedemo/.waygraph-auto/6ead848f.log +0 -0
- package/examples/saucedemo/.waygraph-auto/6f05bdc1.log +0 -0
- package/examples/saucedemo/.waygraph-auto/70279fc3.log +0 -0
- package/examples/saucedemo/.waygraph-auto/70c97639.log +0 -0
- package/examples/saucedemo/.waygraph-auto/72675b2d.log +0 -6
- package/examples/saucedemo/.waygraph-auto/731a14bd.log +0 -0
- package/examples/saucedemo/.waygraph-auto/733dd260.log +0 -5
- package/examples/saucedemo/.waygraph-auto/73a41843.log +0 -0
- package/examples/saucedemo/.waygraph-auto/75016486.log +0 -0
- package/examples/saucedemo/.waygraph-auto/752b01c6.log +0 -22
- package/examples/saucedemo/.waygraph-auto/75675227.log +0 -6
- package/examples/saucedemo/.waygraph-auto/756fd326.log +0 -20
- package/examples/saucedemo/.waygraph-auto/75e2e658.log +0 -0
- package/examples/saucedemo/.waygraph-auto/76128a2d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/76ac1a86.log +0 -0
- package/examples/saucedemo/.waygraph-auto/77605295.log +0 -0
- package/examples/saucedemo/.waygraph-auto/7773a809.log +0 -0
- package/examples/saucedemo/.waygraph-auto/78043767.log +0 -20
- package/examples/saucedemo/.waygraph-auto/792671f4.log +0 -22
- package/examples/saucedemo/.waygraph-auto/796ab578.log +0 -0
- package/examples/saucedemo/.waygraph-auto/79915adb.log +0 -20
- package/examples/saucedemo/.waygraph-auto/7a398774.log +0 -6
- package/examples/saucedemo/.waygraph-auto/7a72f66e.log +0 -6
- package/examples/saucedemo/.waygraph-auto/7a984334.log +0 -4
- package/examples/saucedemo/.waygraph-auto/7b226350.log +0 -5
- package/examples/saucedemo/.waygraph-auto/7c6ee793.log +0 -20
- package/examples/saucedemo/.waygraph-auto/7c726dc4.log +0 -22
- package/examples/saucedemo/.waygraph-auto/7c72e8a5.log +0 -4
- package/examples/saucedemo/.waygraph-auto/7c99674f.log +0 -0
- package/examples/saucedemo/.waygraph-auto/7dbee625.log +0 -22
- package/examples/saucedemo/.waygraph-auto/7df66956.log +0 -0
- package/examples/saucedemo/.waygraph-auto/7e053160.log +0 -0
- package/examples/saucedemo/.waygraph-auto/7e8a6b62.log +0 -0
- package/examples/saucedemo/.waygraph-auto/7effd5b2.log +0 -20
- package/examples/saucedemo/.waygraph-auto/7f1b4864.log +0 -0
- package/examples/saucedemo/.waygraph-auto/7f94fd02.log +0 -0
- package/examples/saucedemo/.waygraph-auto/7fcb512f.log +0 -22
- package/examples/saucedemo/.waygraph-auto/7fdd47ee.log +0 -2
- package/examples/saucedemo/.waygraph-auto/802a0b5b.log +0 -0
- package/examples/saucedemo/.waygraph-auto/80322e0b.log +0 -0
- package/examples/saucedemo/.waygraph-auto/80a4978e.log +0 -6
- package/examples/saucedemo/.waygraph-auto/81257bf0.log +0 -0
- package/examples/saucedemo/.waygraph-auto/81cfe480.log +0 -22
- package/examples/saucedemo/.waygraph-auto/832f5add.log +0 -0
- package/examples/saucedemo/.waygraph-auto/8337b6ad.log +0 -0
- package/examples/saucedemo/.waygraph-auto/8481aa1c.log +0 -0
- package/examples/saucedemo/.waygraph-auto/8493928e.log +0 -0
- package/examples/saucedemo/.waygraph-auto/849ed45d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/84dc6480.log +0 -6
- package/examples/saucedemo/.waygraph-auto/853bde43.log +0 -0
- package/examples/saucedemo/.waygraph-auto/8598b4c0.log +0 -0
- package/examples/saucedemo/.waygraph-auto/859a261d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/86350ea6.log +0 -22
- package/examples/saucedemo/.waygraph-auto/86bb598a.log +0 -0
- package/examples/saucedemo/.waygraph-auto/86d09876.log +0 -22
- package/examples/saucedemo/.waygraph-auto/878ad01b.log +0 -4
- package/examples/saucedemo/.waygraph-auto/87c88ba5.log +0 -0
- package/examples/saucedemo/.waygraph-auto/87cb80ff.log +0 -0
- package/examples/saucedemo/.waygraph-auto/880b2e78.log +0 -6
- package/examples/saucedemo/.waygraph-auto/88527936.log +0 -5
- package/examples/saucedemo/.waygraph-auto/88eda676.log +0 -0
- package/examples/saucedemo/.waygraph-auto/893023ea.log +0 -5
- package/examples/saucedemo/.waygraph-auto/89416718.log +0 -0
- package/examples/saucedemo/.waygraph-auto/8996a857.log +0 -6
- package/examples/saucedemo/.waygraph-auto/8a08b68d.log +0 -6
- package/examples/saucedemo/.waygraph-auto/8a64ba0f.log +0 -6
- package/examples/saucedemo/.waygraph-auto/8b1cc2aa.log +0 -6
- package/examples/saucedemo/.waygraph-auto/8b73d13e.log +0 -6
- package/examples/saucedemo/.waygraph-auto/8be93021.log +0 -0
- package/examples/saucedemo/.waygraph-auto/8d960d31.log +0 -1
- package/examples/saucedemo/.waygraph-auto/8d9e5cd2.log +0 -21
- package/examples/saucedemo/.waygraph-auto/8e12e34f.log +0 -22
- package/examples/saucedemo/.waygraph-auto/8ec7d260.log +0 -0
- package/examples/saucedemo/.waygraph-auto/8ed43279.log +0 -0
- package/examples/saucedemo/.waygraph-auto/93acae32.log +0 -5
- package/examples/saucedemo/.waygraph-auto/94221b2b.log +0 -0
- package/examples/saucedemo/.waygraph-auto/96321a08.log +0 -0
- package/examples/saucedemo/.waygraph-auto/9742b6c2.log +0 -6
- package/examples/saucedemo/.waygraph-auto/9761c4c4.log +0 -6
- package/examples/saucedemo/.waygraph-auto/976394cd.log +0 -20
- package/examples/saucedemo/.waygraph-auto/982138cf.log +0 -0
- package/examples/saucedemo/.waygraph-auto/99cc93eb.log +0 -6
- package/examples/saucedemo/.waygraph-auto/9a26134c.log +0 -20
- package/examples/saucedemo/.waygraph-auto/9cbfbedc.log +0 -0
- package/examples/saucedemo/.waygraph-auto/9d827954.log +0 -20
- package/examples/saucedemo/.waygraph-auto/9dc147d2.log +0 -22
- package/examples/saucedemo/.waygraph-auto/9dd78c5e.log +0 -0
- package/examples/saucedemo/.waygraph-auto/a1ab5d29.log +0 -0
- package/examples/saucedemo/.waygraph-auto/a215a395.log +0 -22
- package/examples/saucedemo/.waygraph-auto/a23b7086.log +0 -4
- package/examples/saucedemo/.waygraph-auto/a35bd5ec.log +0 -0
- package/examples/saucedemo/.waygraph-auto/a4b36275.log +0 -0
- package/examples/saucedemo/.waygraph-auto/a4f8d355.log +0 -20
- package/examples/saucedemo/.waygraph-auto/a68995e9.log +0 -22
- package/examples/saucedemo/.waygraph-auto/a6e4f936.log +0 -22
- package/examples/saucedemo/.waygraph-auto/a7da862b.log +0 -0
- package/examples/saucedemo/.waygraph-auto/a82e2a48.log +0 -0
- package/examples/saucedemo/.waygraph-auto/a8645294.log +0 -0
- package/examples/saucedemo/.waygraph-auto/a94738b7.log +0 -0
- package/examples/saucedemo/.waygraph-auto/a952eb91.log +0 -0
- package/examples/saucedemo/.waygraph-auto/a9559653.log +0 -5
- package/examples/saucedemo/.waygraph-auto/aa1beafb.log +0 -0
- package/examples/saucedemo/.waygraph-auto/aa226dd0.log +0 -22
- package/examples/saucedemo/.waygraph-auto/aa478de2.log +0 -0
- package/examples/saucedemo/.waygraph-auto/aa7323f8.log +0 -20
- package/examples/saucedemo/.waygraph-auto/aaae4fb0.log +0 -20
- package/examples/saucedemo/.waygraph-auto/ac350fc7.log +0 -20
- package/examples/saucedemo/.waygraph-auto/ac5dde3d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/acc1b63a.log +0 -0
- package/examples/saucedemo/.waygraph-auto/ad0bfad9.log +0 -5
- package/examples/saucedemo/.waygraph-auto/ad12d191.log +0 -0
- package/examples/saucedemo/.waygraph-auto/ae3a9b06.log +0 -0
- package/examples/saucedemo/.waygraph-auto/af2fae12.log +0 -0
- package/examples/saucedemo/.waygraph-auto/b04638f4.log +0 -6
- package/examples/saucedemo/.waygraph-auto/b0752c49.log +0 -0
- package/examples/saucedemo/.waygraph-auto/b14811d7.log +0 -6
- package/examples/saucedemo/.waygraph-auto/b2d2dbb2.log +0 -22
- package/examples/saucedemo/.waygraph-auto/b3d172f3.log +0 -0
- package/examples/saucedemo/.waygraph-auto/b48863e5.log +0 -22
- package/examples/saucedemo/.waygraph-auto/b5569336.log +0 -0
- package/examples/saucedemo/.waygraph-auto/b56968e1.log +0 -6
- package/examples/saucedemo/.waygraph-auto/b57921c5.log +0 -0
- package/examples/saucedemo/.waygraph-auto/b64e0620.log +0 -20
- package/examples/saucedemo/.waygraph-auto/b75168f7.log +0 -1
- package/examples/saucedemo/.waygraph-auto/b86a6218.log +0 -6
- package/examples/saucedemo/.waygraph-auto/b8e9e956.log +0 -22
- package/examples/saucedemo/.waygraph-auto/b9ab0983.log +0 -0
- package/examples/saucedemo/.waygraph-auto/b9b310ff.log +0 -21
- package/examples/saucedemo/.waygraph-auto/bb0e0e46.log +0 -0
- package/examples/saucedemo/.waygraph-auto/bc111745.log +0 -22
- package/examples/saucedemo/.waygraph-auto/bf7a77a2.log +0 -0
- package/examples/saucedemo/.waygraph-auto/bf85a598.log +0 -0
- package/examples/saucedemo/.waygraph-auto/bf8693e7.log +0 -0
- package/examples/saucedemo/.waygraph-auto/c0d6f353.log +0 -21
- package/examples/saucedemo/.waygraph-auto/c0febcf2.log +0 -20
- package/examples/saucedemo/.waygraph-auto/c4c52998.log +0 -6
- package/examples/saucedemo/.waygraph-auto/c52bac6d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/c60cc55e.log +0 -0
- package/examples/saucedemo/.waygraph-auto/c809ceb4.log +0 -22
- package/examples/saucedemo/.waygraph-auto/c851cc53.log +0 -6
- package/examples/saucedemo/.waygraph-auto/c8987b67.log +0 -0
- package/examples/saucedemo/.waygraph-auto/c9d76e32.log +0 -0
- package/examples/saucedemo/.waygraph-auto/ca6de7e7.log +0 -0
- package/examples/saucedemo/.waygraph-auto/ca8561bc.log +0 -0
- package/examples/saucedemo/.waygraph-auto/cae91469.log +0 -0
- package/examples/saucedemo/.waygraph-auto/cb05d223.log +0 -0
- package/examples/saucedemo/.waygraph-auto/cb86d45b.log +0 -0
- package/examples/saucedemo/.waygraph-auto/cb9a1978.log +0 -6
- package/examples/saucedemo/.waygraph-auto/cbbc689c.log +0 -6
- package/examples/saucedemo/.waygraph-auto/cc989184.log +0 -20
- package/examples/saucedemo/.waygraph-auto/cd88364b.log +0 -0
- package/examples/saucedemo/.waygraph-auto/cd919e1d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/ce584949.log +0 -5
- package/examples/saucedemo/.waygraph-auto/cf34b895.log +0 -2
- package/examples/saucedemo/.waygraph-auto/cfff9eef.log +0 -20
- package/examples/saucedemo/.waygraph-auto/d0f59b21.log +0 -4
- package/examples/saucedemo/.waygraph-auto/d1195079.log +0 -20
- package/examples/saucedemo/.waygraph-auto/d2ef067a.log +0 -5
- package/examples/saucedemo/.waygraph-auto/d37719a6.log +0 -0
- package/examples/saucedemo/.waygraph-auto/d425471f.log +0 -6
- package/examples/saucedemo/.waygraph-auto/d4afe93f.log +0 -5
- package/examples/saucedemo/.waygraph-auto/d50e58f0.log +0 -0
- package/examples/saucedemo/.waygraph-auto/d5293921.log +0 -0
- package/examples/saucedemo/.waygraph-auto/d62a22c2.log +0 -21
- package/examples/saucedemo/.waygraph-auto/d6d1761f.log +0 -22
- package/examples/saucedemo/.waygraph-auto/d6d5f411.log +0 -22
- package/examples/saucedemo/.waygraph-auto/d6df2771.log +0 -6
- package/examples/saucedemo/.waygraph-auto/d7075012.log +0 -21
- package/examples/saucedemo/.waygraph-auto/d846cd78.log +0 -0
- package/examples/saucedemo/.waygraph-auto/d934da78.log +0 -0
- package/examples/saucedemo/.waygraph-auto/d9ddc297.log +0 -0
- package/examples/saucedemo/.waygraph-auto/da0a06bf.log +0 -0
- package/examples/saucedemo/.waygraph-auto/da6ebb31.log +0 -0
- package/examples/saucedemo/.waygraph-auto/db4ac845.log +0 -0
- package/examples/saucedemo/.waygraph-auto/db6d7774.log +0 -0
- package/examples/saucedemo/.waygraph-auto/db81ba7d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/db839827.log +0 -5
- package/examples/saucedemo/.waygraph-auto/dc58eb72.log +0 -0
- package/examples/saucedemo/.waygraph-auto/dddd057c.log +0 -20
- package/examples/saucedemo/.waygraph-auto/dde5e859.log +0 -22
- package/examples/saucedemo/.waygraph-auto/ddf975e6.log +0 -0
- package/examples/saucedemo/.waygraph-auto/de8cac58.log +0 -0
- package/examples/saucedemo/.waygraph-auto/de8cb83d.log +0 -6
- package/examples/saucedemo/.waygraph-auto/ded5511a.log +0 -6
- package/examples/saucedemo/.waygraph-auto/dedfcb18.log +0 -0
- package/examples/saucedemo/.waygraph-auto/def4d9b1.log +0 -0
- package/examples/saucedemo/.waygraph-auto/e03cfd8e.log +0 -0
- package/examples/saucedemo/.waygraph-auto/e1549e40.log +0 -0
- package/examples/saucedemo/.waygraph-auto/e1b0676d.log +0 -21
- package/examples/saucedemo/.waygraph-auto/e230f24e.log +0 -0
- package/examples/saucedemo/.waygraph-auto/e5111463.log +0 -0
- package/examples/saucedemo/.waygraph-auto/e5127c03.log +0 -22
- package/examples/saucedemo/.waygraph-auto/e5fc1d7c.log +0 -5
- package/examples/saucedemo/.waygraph-auto/e6fd2202.log +0 -0
- package/examples/saucedemo/.waygraph-auto/eb38d92e.log +0 -22
- package/examples/saucedemo/.waygraph-auto/edaa806d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/edaf33de.log +0 -0
- package/examples/saucedemo/.waygraph-auto/edd40cbb.log +0 -20
- package/examples/saucedemo/.waygraph-auto/eddfbffc.log +0 -6
- package/examples/saucedemo/.waygraph-auto/ee86203e.log +0 -0
- package/examples/saucedemo/.waygraph-auto/ee9fa1ad.log +0 -5
- package/examples/saucedemo/.waygraph-auto/ef319474.log +0 -22
- package/examples/saucedemo/.waygraph-auto/f1f38eeb.log +0 -22
- package/examples/saucedemo/.waygraph-auto/f24b2915.log +0 -0
- package/examples/saucedemo/.waygraph-auto/f28eee8d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/f2943898.log +0 -0
- package/examples/saucedemo/.waygraph-auto/f33bde90.log +0 -0
- package/examples/saucedemo/.waygraph-auto/f43de83c.log +0 -0
- package/examples/saucedemo/.waygraph-auto/f6ba7cb4.log +0 -6
- package/examples/saucedemo/.waygraph-auto/f7ac4d62.log +0 -20
- package/examples/saucedemo/.waygraph-auto/f86224c6.log +0 -0
- package/examples/saucedemo/.waygraph-auto/f929bb79.log +0 -0
- package/examples/saucedemo/.waygraph-auto/f92d4c6c.log +0 -22
- package/examples/saucedemo/.waygraph-auto/f92faf40.log +0 -5
- package/examples/saucedemo/.waygraph-auto/fa784369.log +0 -21
- package/examples/saucedemo/.waygraph-auto/fb55f723.log +0 -20
- package/examples/saucedemo/.waygraph-auto/fba3b738.log +0 -0
- package/examples/saucedemo/.waygraph-auto/fc917c18.log +0 -0
- package/examples/saucedemo/.waygraph-auto/fdf66b74.log +0 -0
- package/examples/saucedemo/.waygraph-auto/fe83305d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/ff616932.log +0 -0
- package/examples/saucedemo/.waygraph-auto/ffdf2854.log +0 -6
- package/examples/saucedemo/scripts/capture-auto-headful.mjs +0 -120
- package/examples/saucedemo/scripts/capture-wrong-login.mjs +0 -141
- package/examples/saucedemo/scripts/demo-device-presets.mjs +0 -188
- package/examples/saucedemo/scripts/demo-orientation-gestures-video.mjs +0 -262
- package/examples/saucedemo/scripts/show-add-to-cart-menu.mjs +0 -123
- package/examples/saucedemo/scripts/show-auto-menu.mjs +0 -72
- package/templates/scaffold/playwright.config.ts +0 -28
- package/templates/scaffold/scripts/README.md +0 -13
- package/templates/scaffold/scripts/fixture-server.mjs +0 -50
- package/templates/scaffold/scripts/with-fixture.mjs +0 -69
- package/templates/scaffold/test-results/.last-run.json +0 -4
- /package/templates/scaffold/src/map/(app_base)/home/{home.html → index.html} +0 -0
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { Engine
|
|
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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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
|
-
|
|
3
|
-
|
|
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
|
|
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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|
-
|
|
2
|
-
|
|
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",
|
|
@@ -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
|
-
|
|
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(
|
|
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
|
-
|
|
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: "
|
|
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",
|
package/templates/scaffold/src/map/(app_base)/home/_methods/assert-item-added.method.block.ts
CHANGED
|
@@ -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(
|
|
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 (
|
|
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
|
-
|
|
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
|
+
});
|