waygraph 0.15.54 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -3
- package/bin/waygraph +2 -2
- package/dist/analysis/check.d.ts +38 -0
- package/dist/analysis/check.js +87 -0
- package/dist/analysis/coverage-gap.d.ts +1 -1
- package/dist/analysis/coverage-gap.js +14 -37
- package/dist/analysis/flow-source.d.ts +9 -0
- package/dist/analysis/flow-source.js +25 -0
- package/dist/analysis/graph.d.ts +10 -14
- package/dist/analysis/graph.js +48 -371
- package/dist/analysis/map-check.js +4 -39
- package/dist/analysis/practices-check.d.ts +1 -1
- package/dist/analysis/practices-check.js +24 -45
- package/dist/cli/args.d.ts +23 -0
- package/dist/cli/args.js +20 -0
- package/dist/{cli.d.ts → cli/cli.d.ts} +0 -1
- package/dist/{cli.js → cli/cli.js} +10 -9
- package/dist/{commands → cli/commands}/agent-dive-scaffold.js +35 -64
- package/dist/cli/commands/agent-dive.js +42 -0
- package/dist/{commands → cli/commands}/check.d.ts +0 -1
- package/dist/cli/commands/check.js +104 -0
- package/dist/cli/commands/codemod-checkpoints.d.ts +18 -0
- package/dist/cli/commands/codemod-checkpoints.js +186 -0
- package/dist/cli/commands/codemod-flows.d.ts +18 -0
- package/dist/cli/commands/codemod-flows.js +284 -0
- package/dist/cli/commands/codemod-stubs.d.ts +10 -0
- package/dist/cli/commands/codemod-stubs.js +187 -0
- package/dist/{commands → cli/commands}/extensions.js +5 -4
- package/dist/{commands → cli/commands}/init.js +1 -2
- package/dist/{commands → cli/commands}/list.js +9 -7
- package/dist/cli/commands/manifest.d.ts +2 -0
- package/dist/cli/commands/manifest.js +20 -0
- package/dist/cli/commands/map.js +57 -0
- package/dist/{commands → cli/commands}/run.d.ts +0 -1
- package/dist/cli/commands/run.js +64 -0
- package/dist/{commands → cli/commands}/session.js +61 -88
- package/dist/{commands → cli/commands}/test.js +11 -14
- package/dist/cli/commands/traverse.js +105 -0
- package/dist/{commands → cli/commands}/try.js +29 -25
- package/dist/{commands → cli/commands}/upgrade.js +40 -4
- package/dist/cli/flags.d.ts +193 -16
- package/dist/cli/flags.js +179 -234
- package/dist/cli/run-chain.d.ts +1 -0
- package/dist/cli/run-chain.js +42 -7
- package/dist/cli/usage.d.ts +1 -1
- package/dist/cli/usage.js +21 -53
- package/dist/cli/util.d.ts +2 -2
- package/dist/cli/util.js +2 -3
- package/dist/{highlights → demo/narration}/css.d.ts +1 -1
- package/dist/{highlights → demo/narration}/css.js +2 -3
- package/dist/{highlights → demo/narration}/demo-pace.d.ts +3 -11
- package/dist/{highlights → demo/narration}/demo-pace.js +5 -11
- package/dist/{highlights → demo/narration}/device.d.ts +2 -2
- package/dist/{highlights → demo/narration}/device.js +1 -1
- package/dist/demo/narration/merge.d.ts +8 -0
- package/dist/demo/narration/merge.js +71 -0
- package/dist/{highlights/run-phase.d.ts → demo/narration/narration.d.ts} +10 -14
- package/dist/{highlights/run-phase.js → demo/narration/narration.js} +25 -94
- package/dist/{highlights → demo/narration}/shorthand.d.ts +1 -1
- package/dist/demo/narration/stub-ctx.d.ts +8 -0
- package/dist/demo/narration/stub-ctx.js +164 -0
- package/dist/{highlights → demo/narration}/style.d.ts +1 -7
- package/dist/{highlights → demo/narration}/style.js +1 -41
- package/dist/{highlights → demo/narration}/todo-dock.d.ts +3 -3
- package/dist/{highlights → demo/narration}/todo-dock.js +13 -30
- package/dist/demo/overlay/auto-chrome.d.ts +7 -0
- package/dist/demo/overlay/auto-chrome.js +97 -0
- package/dist/demo/overlay/cursor.d.ts +12 -0
- package/dist/demo/overlay/cursor.js +142 -0
- package/dist/demo/overlay/device-stage.d.ts +13 -0
- package/dist/demo/overlay/device-stage.js +396 -0
- package/dist/demo/overlay/inpage/banner.d.ts +1 -0
- package/dist/demo/overlay/inpage/banner.js +160 -0
- package/dist/demo/overlay/inpage/caption.d.ts +2 -0
- package/dist/demo/overlay/inpage/caption.js +24 -0
- package/dist/demo/overlay/inpage/core.d.ts +1 -0
- package/dist/demo/overlay/inpage/core.js +345 -0
- package/dist/demo/overlay/inpage/device-chip.d.ts +1 -0
- package/dist/demo/overlay/inpage/device-chip.js +191 -0
- package/dist/demo/overlay/inpage/network.d.ts +9 -0
- package/dist/demo/overlay/inpage/network.js +200 -0
- package/dist/demo/overlay/inpage/panel-chrome.d.ts +1 -0
- package/dist/demo/overlay/inpage/panel-chrome.js +203 -0
- package/dist/demo/overlay/inpage/stamp.d.ts +1 -0
- package/dist/demo/overlay/inpage/stamp.js +46 -0
- package/dist/demo/overlay/inpage/swipe-zoom.d.ts +1 -0
- package/dist/demo/overlay/inpage/swipe-zoom.js +220 -0
- package/dist/demo/overlay/inpage/todos.d.ts +1 -0
- package/dist/demo/overlay/inpage/todos.js +294 -0
- package/dist/demo/overlay/locator-theater.d.ts +25 -0
- package/dist/demo/overlay/locator-theater.js +76 -0
- package/dist/demo/overlay/network-capture.d.ts +22 -0
- package/dist/demo/overlay/network-capture.js +127 -0
- package/dist/demo/overlay/overlay-css.d.ts +3 -0
- package/dist/demo/overlay/overlay-css.js +369 -0
- package/dist/demo/overlay/overlay-stage.d.ts +23 -0
- package/dist/demo/overlay/overlay-stage.js +106 -0
- package/dist/demo/overlay/overlay.d.ts +10 -0
- package/dist/demo/overlay/overlay.js +89 -0
- package/dist/{pilot-overlay/overlay-fixtures.d.ts → demo/overlay/phase-fixtures.d.ts} +2 -2
- package/dist/{pilot-overlay/overlay-fixtures.js → demo/overlay/phase-fixtures.js} +2 -2
- package/dist/{pilot-overlay/action-ring.js → demo/overlay/pilot/actions.js} +2 -1
- package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.d.ts +6 -5
- package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.js +19 -18
- package/dist/{pilot-overlay → demo/overlay/pilot}/shell.d.ts +2 -2
- package/dist/{pilot-overlay → demo/overlay/pilot}/shell.js +13 -22
- package/dist/demo/overlay/reattach.d.ts +7 -0
- package/dist/demo/overlay/reattach.js +23 -0
- package/dist/demo/overlay/rings.d.ts +33 -0
- package/dist/demo/overlay/rings.js +448 -0
- package/dist/{ui → demo/overlay/ui}/components/ring.js +2 -2
- package/dist/{ui → demo/overlay/ui}/overlay.css +4 -4
- package/dist/{ui → demo/overlay/ui}/shadow.d.ts +1 -1
- package/dist/{ui → demo/overlay/ui}/shadow.js +39 -2
- package/dist/demo/stepper/after.d.ts +3 -0
- package/dist/demo/stepper/after.js +113 -0
- package/dist/demo/stepper/banner-log.d.ts +37 -0
- package/dist/demo/stepper/banner-log.js +63 -0
- package/dist/demo/stepper/before.d.ts +4 -0
- package/dist/demo/stepper/before.js +110 -0
- package/dist/demo/stepper/demo-log.d.ts +31 -0
- package/dist/demo/stepper/demo-log.js +309 -0
- package/dist/demo/stepper/gate.d.ts +11 -0
- package/dist/demo/stepper/gate.js +78 -0
- package/dist/demo/stepper/interaction-patch.d.ts +3 -0
- package/dist/demo/stepper/interaction-patch.js +323 -0
- package/dist/demo/stepper/pacing.d.ts +21 -0
- package/dist/demo/stepper/pacing.js +23 -0
- package/dist/demo/stepper/slides.d.ts +11 -0
- package/dist/demo/stepper/slides.js +233 -0
- package/dist/demo/stepper/step-panels.d.ts +21 -0
- package/dist/demo/stepper/step-panels.js +589 -0
- package/dist/demo/stepper/stepper.d.ts +24 -0
- package/dist/demo/stepper/stepper.js +122 -0
- package/dist/demo/stepper/teardown.d.ts +48 -0
- package/dist/demo/stepper/teardown.js +179 -0
- package/dist/demo/stepper/todo-advance.d.ts +14 -0
- package/dist/demo/stepper/todo-advance.js +110 -0
- package/dist/demo/stepper/view.d.ts +68 -0
- package/dist/demo/stepper/view.js +31 -0
- package/dist/demo/types.d.ts +17 -0
- package/dist/demo/verbose-log.js +15 -0
- package/dist/{types.d.ts → engine/block/block.d.ts} +106 -91
- package/dist/{core → engine/block}/block.js +10 -53
- package/dist/{core → engine/block}/compose.d.ts +9 -7
- package/dist/{core → engine/block}/compose.js +1 -1
- package/dist/{core/blocks → engine/block/kinds}/api.d.ts +16 -12
- package/dist/{core/blocks → engine/block/kinds}/api.js +26 -18
- package/dist/{core/blocks → engine/block/kinds}/effect.d.ts +13 -18
- package/dist/engine/block/kinds/effect.js +17 -0
- package/dist/{core/blocks → engine/block/kinds}/method.d.ts +17 -29
- package/dist/{core/blocks → engine/block/kinds}/method.js +6 -21
- package/dist/{core/blocks → engine/block/kinds}/nav.d.ts +21 -31
- package/dist/{core/blocks → engine/block/kinds}/nav.js +6 -12
- package/dist/{core/blocks → engine/block/kinds}/page.d.ts +14 -20
- package/dist/{core/blocks → engine/block/kinds}/page.js +5 -7
- package/dist/engine/checkpoint/checkpoint.d.ts +22 -0
- package/dist/engine/checkpoint/checkpoint.js +8 -0
- package/dist/engine/checkpoint/route.d.ts +28 -0
- package/dist/engine/checkpoint/route.js +28 -0
- package/dist/{core → engine}/config.d.ts +7 -2
- package/dist/engine/config.js +6 -0
- package/dist/engine/engine.d.ts +45 -0
- package/dist/{core → engine}/engine.js +6 -10
- package/dist/engine/env.d.ts +59 -0
- package/dist/engine/env.js +83 -0
- package/dist/{errors.d.ts → engine/errors.d.ts} +22 -22
- package/dist/{errors.js → engine/errors.js} +22 -22
- package/dist/{core → engine/flow}/branch-regression.d.ts +7 -7
- package/dist/{core → engine/flow}/branch-regression.js +4 -3
- package/dist/engine/flow/flow.d.ts +162 -0
- package/dist/engine/flow/flow.js +244 -0
- package/dist/{core → engine/flow}/map-builder.d.ts +34 -39
- package/dist/{core → engine/flow}/map-builder.js +45 -47
- package/dist/{core → engine}/locate.d.ts +1 -1
- package/dist/{core → engine}/locate.js +1 -2
- package/dist/{mem-stub.d.ts → engine/mem/mem-stub.d.ts} +9 -8
- package/dist/{mem-stub.js → engine/mem/mem-stub.js} +2 -2
- package/dist/{mem-page.d.ts → engine/mem/mem.d.ts} +1 -1
- package/dist/{mem-page.js → engine/mem/mem.js} +2 -1
- package/dist/engine/page-gone.d.ts +5 -0
- package/dist/engine/page-gone.js +20 -0
- package/dist/engine/run/connect.d.ts +28 -0
- package/dist/{types.js → engine/run/connect.js} +11 -10
- package/dist/engine/run/events.d.ts +67 -0
- package/dist/engine/run/events.js +90 -0
- package/dist/engine/run/hooks.d.ts +16 -0
- package/dist/engine/run/hooks.js +8 -0
- package/dist/engine/run/launch.d.ts +13 -0
- package/dist/engine/run/launch.js +27 -0
- package/dist/{core/run-graph.d.ts → engine/run/run.d.ts} +8 -12
- package/dist/{core/run-graph.js → engine/run/run.js} +22 -12
- package/dist/engine/stub/pace.d.ts +12 -0
- package/dist/engine/stub/pace.js +2 -0
- package/dist/engine/stub/ring.d.ts +130 -0
- package/dist/engine/stub/ring.js +41 -0
- package/dist/engine/stub/stub.d.ts +268 -0
- package/dist/engine/stub/stub.js +1 -0
- package/dist/engine/stub/todos.d.ts +104 -0
- package/dist/engine/stub/todos.js +2 -0
- package/dist/engine/stub/viewport.d.ts +26 -0
- package/dist/engine/stub/viewport.js +2 -0
- package/dist/{trait.d.ts → engine/trait/trait.d.ts} +1 -1
- package/dist/index.d.ts +84 -36
- package/dist/index.js +44 -19
- package/dist/{session/auto-explore-run.d.ts → live/auto/auto.d.ts} +10 -16
- package/dist/{session/auto-explore-run.js → live/auto/auto.js} +164 -254
- package/dist/{session/auto-explore.d.ts → live/auto/explore.d.ts} +4 -14
- package/dist/{session/auto-explore.js → live/auto/explore.js} +21 -127
- package/dist/{auto-session/session.d.ts → live/auto-session/auto-session.d.ts} +1 -1
- package/dist/{auto-session/session.js → live/auto-session/auto-session.js} +27 -24
- package/dist/{auto-session → live/auto-session}/helpers.d.ts +6 -5
- package/dist/{auto-session → live/auto-session}/helpers.js +1 -1
- package/dist/{session/auto-session-ipc.d.ts → live/auto-session/ipc.d.ts} +7 -5
- package/dist/{session/auto-session-ipc.js → live/auto-session/ipc.js} +31 -16
- package/dist/{session/browser.d.ts → live/auto-session/start.d.ts} +1 -2
- package/dist/{session/browser.js → live/auto-session/start.js} +2 -3
- package/dist/{pilot-overlay → live/pilot}/panel.d.ts +1 -1
- package/dist/{pilot-overlay → live/pilot}/panel.js +23 -31
- package/dist/{session → live/pilot}/pilot.d.ts +3 -3
- package/dist/{session → live/pilot}/pilot.js +4 -4
- package/dist/{traverse/run.d.ts → live/traverse/traverse.d.ts} +1 -1
- package/dist/{traverse/run.js → live/traverse/traverse.js} +26 -43
- package/dist/manifest/manifest.d.ts +52 -0
- package/dist/manifest/manifest.js +93 -0
- package/dist/manifest/map-imports.d.ts +7 -0
- package/dist/manifest/map-imports.js +22 -0
- package/dist/manifest/maps.d.ts +33 -0
- package/dist/manifest/maps.js +62 -0
- package/dist/manifest/pack.d.ts +21 -0
- package/dist/manifest/pack.js +109 -0
- package/dist/manifest/project.d.ts +60 -0
- package/dist/manifest/project.js +101 -0
- package/dist/{session/block-inject.js → manifest/roots.js} +1 -18
- package/dist/manifest/scan.d.ts +19 -0
- package/dist/manifest/scan.js +57 -0
- package/dist/manifest/source.d.ts +23 -0
- package/dist/manifest/source.js +86 -0
- package/dist/runner/mode.d.ts +71 -0
- package/dist/runner/mode.js +1 -0
- package/dist/runner/modes/branches.d.ts +5 -0
- package/dist/runner/modes/branches.js +37 -0
- package/dist/runner/modes/demo.d.ts +3 -0
- package/dist/runner/modes/demo.js +13 -0
- package/dist/runner/modes/report.d.ts +2 -0
- package/dist/runner/modes/report.js +54 -0
- package/dist/runner/modes/run.d.ts +2 -0
- package/dist/runner/modes/run.js +3 -0
- package/dist/runner/options.d.ts +31 -0
- package/dist/runner/options.js +42 -0
- package/dist/runner/plan/find.d.ts +18 -0
- package/dist/runner/plan/find.js +65 -0
- package/dist/runner/plan/plan.d.ts +11 -0
- package/dist/runner/plan/plan.js +97 -0
- package/dist/runner/plan/seed-mem.d.ts +12 -0
- package/dist/runner/plan/seed-mem.js +98 -0
- package/dist/runner/plan/spec.d.ts +5 -0
- package/dist/runner/plan/spec.js +17 -0
- package/dist/runner/play-steps.d.ts +2 -0
- package/dist/runner/play-steps.js +59 -0
- package/dist/runner/runner.d.ts +4 -0
- package/dist/runner/runner.js +64 -0
- package/dist/runner/session.d.ts +9 -0
- package/dist/runner/session.js +87 -0
- package/dist/{browser.js → runtime/browser.js} +4 -2
- package/dist/{env-file.js → runtime/env-file.js} +7 -12
- package/dist/{extensions.d.ts → runtime/extensions.d.ts} +1 -5
- package/dist/{extensions.js → runtime/extensions.js} +2 -1
- package/dist/runtime/full-launch.d.ts +1 -0
- package/dist/runtime/full-launch.js +34 -0
- package/dist/runtime/global-flag.d.ts +5 -0
- package/dist/runtime/global-flag.js +18 -0
- package/dist/{playwright-config.d.ts → runtime/playwright-config.d.ts} +1 -1
- package/dist/{playwright.config.js → runtime/playwright.config.js} +3 -2
- package/dist/runtime/run-log.d.ts +2 -0
- package/dist/runtime/run-log.js +17 -0
- package/dist/{video-dir.js → runtime/video-dir.js} +3 -2
- package/dist/{config.d.ts → runtime/waygraph-config.d.ts} +6 -9
- package/dist/{config.js → runtime/waygraph-config.js} +21 -51
- package/dist/{webserver.js → runtime/webserver.js} +5 -30
- package/examples/routed-demo/config/waygraph.config.ts +20 -0
- package/examples/routed-demo/package.json +1 -4
- package/examples/routed-demo/scripts/fixture-server.mjs +1 -1
- package/examples/routed-demo/src/flows/routed-demo-map.flow.ts +2 -4
- package/examples/routed-demo/src/flows/routed-demo.flow.ts +1 -2
- package/examples/routed-demo/src/map/(app_base)/dashboard/_methods/click-widget.block.ts +5 -4
- package/examples/routed-demo/src/map/(app_base)/dashboard/_nav.block.ts +3 -3
- package/examples/routed-demo/src/map/(app_base)/dashboard/_page.block.ts +3 -3
- package/examples/routed-demo/src/map/(external)/docs/_nav.block.ts +3 -3
- package/examples/routed-demo/src/map/(external)/docs/_page.block.ts +3 -3
- package/examples/routed-demo/src/states/routed-demo.states.ts +5 -3
- package/examples/routed-demo/tests/routed-demo.spec.ts +4 -4
- package/examples/routed-demo/tsconfig.json +1 -1
- package/examples/saucedemo/docs/CONVENTION.md +4 -5
- package/examples/saucedemo/docs/HELPERS.md +11 -11
- package/examples/saucedemo/src/blocks/SITE-MAP.md +0 -1
- package/examples/saucedemo/src/blocks/saucedemo-web/NAV.md +1 -5
- package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +5 -8
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +35 -43
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +4 -5
- package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
- package/examples/saucedemo/src/flows/api-demo.flow.ts +12 -10
- package/examples/saucedemo/src/states/checkout.states.ts +21 -11
- package/examples/saucedemo/src/stubs/device-showcase.ts +8 -10
- package/examples/saucedemo/tests/auto-graph.spec.ts +4 -12
- package/package.json +10 -6
- package/templates/agents/waygraph-planner.agent.md +2 -2
- package/templates/quickstart/docs/CONVENTION.md +4 -4
- package/templates/quickstart/docs/HELPERS.md +10 -8
- package/templates/quickstart/package.json +0 -3
- package/templates/quickstart/src/blocks/SITE-MAP.md +0 -1
- package/templates/quickstart/src/blocks/saucedemo-web/NAV.md +1 -5
- package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +5 -8
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +35 -43
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +4 -5
- package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
- package/templates/quickstart/src/flows/api-demo.flow.ts +12 -10
- package/templates/quickstart/src/states/checkout.states.ts +21 -11
- package/templates/quickstart/src/stubs/device-showcase.ts +8 -10
- package/templates/scaffold/README.md +2 -1
- package/templates/scaffold/STRUCTURE.md +5 -4
- package/templates/scaffold/config/waygraph.config.ts +1 -0
- package/templates/scaffold/gitignore +1 -0
- package/templates/scaffold/src/flows/README.md +2 -2
- package/templates/scaffold/src/map/(app_base)/docs/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/docs/_page.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/_methods/add-item.effect.block.ts +4 -4
- package/templates/scaffold/src/map/(app_base)/home/_methods/assert-hello.method.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/_methods/assert-item-added.method.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/_methods/clear-cart.method.block.ts +5 -4
- package/templates/scaffold/src/map/(app_base)/home/_methods/remove-item.effect.block.ts +4 -4
- package/templates/scaffold/src/map/(app_base)/home/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/_page.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/nav-verification-link.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_keys.ts +21 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-body.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-header.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-status.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/pick-extension-interceptor.method.block.ts +5 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-body.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-headers.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/send-request.method.block.ts +5 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-bearer-token.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-headers.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-json-body.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-method.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-query-params.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-url.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/hoppscotch/_page.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/hoppscotch/_states.ts +6 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/settings/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/mailpit/_keys.ts +13 -0
- package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-content.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-received.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/mailpit/_methods/extract-email-link.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/mailpit/_methods/open-message.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/mailpit/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/mailpit/_page.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/mailpit/_states.ts +9 -0
- package/templates/scaffold/src/map/README.md +7 -0
- package/templates/scaffold/src/states/README.md +4 -1
- package/templates/scaffold/src/states/demo.mem-keys.ts +1 -29
- package/templates/scaffold/src/states/demo.states.ts +14 -20
- package/templates/scaffold/tests/hoppscotch.spec.ts +1 -11
- package/templates/scaffold/tests/mail-verify.spec.ts +2 -2
- package/templates/skills/waygraph-blind-pilot.skill.md +2 -6
- package/templates/skills/waygraph-convention.skill.md +23 -14
- package/templates/skills/waygraph-pilot.skill.md +7 -4
- package/dist/auto-session/verbose-log.js +0 -16
- package/dist/auto-session.d.ts +0 -2
- package/dist/auto-session.js +0 -3
- package/dist/cli/discover.d.ts +0 -40
- package/dist/cli/discover.js +0 -148
- package/dist/commands/agent-dive.js +0 -52
- package/dist/commands/check.js +0 -192
- package/dist/commands/map.js +0 -29
- package/dist/commands/run.js +0 -104
- package/dist/commands/traverse.js +0 -177
- package/dist/core/block.d.ts +0 -109
- package/dist/core/blocks/effect.js +0 -23
- package/dist/core/config.js +0 -17
- package/dist/core/engine.d.ts +0 -198
- package/dist/core/flow.d.ts +0 -294
- package/dist/core/flow.js +0 -432
- package/dist/core.d.ts +0 -14
- package/dist/core.js +0 -15
- package/dist/highlights/merge.d.ts +0 -8
- package/dist/highlights/merge.js +0 -173
- package/dist/highlights/stub-ctx.d.ts +0 -10
- package/dist/highlights/stub-ctx.js +0 -331
- package/dist/highlights/types.d.ts +0 -613
- package/dist/highlights.d.ts +0 -9
- package/dist/highlights.js +0 -10
- package/dist/pilot-overlay.d.ts +0 -5
- package/dist/pilot-overlay.js +0 -6
- package/dist/runner/banner-log.js +0 -63
- package/dist/runner/chain-run.js +0 -102
- package/dist/runner/cursor.js +0 -140
- package/dist/runner/demo-log.js +0 -316
- package/dist/runner/device-stage.d.ts +0 -9
- package/dist/runner/device-stage.js +0 -420
- package/dist/runner/discovery.js +0 -105
- package/dist/runner/index.js +0 -2
- package/dist/runner/inpage/banner.d.ts +0 -21
- package/dist/runner/inpage/banner.js +0 -156
- package/dist/runner/inpage/caption.d.ts +0 -3
- package/dist/runner/inpage/caption.js +0 -23
- package/dist/runner/inpage/core.d.ts +0 -4
- package/dist/runner/inpage/core.js +0 -316
- package/dist/runner/inpage/device.d.ts +0 -3
- package/dist/runner/inpage/device.js +0 -211
- package/dist/runner/inpage/network.d.ts +0 -15
- package/dist/runner/inpage/network.js +0 -217
- package/dist/runner/inpage/panel-chrome.js +0 -192
- package/dist/runner/inpage/stamp.js +0 -46
- package/dist/runner/inpage/swipe-zoom.js +0 -220
- package/dist/runner/inpage/todos.js +0 -337
- package/dist/runner/interaction-patch.js +0 -384
- package/dist/runner/main.js +0 -469
- package/dist/runner/network-capture.d.ts +0 -9
- package/dist/runner/network-capture.js +0 -126
- package/dist/runner/overlay-css.d.ts +0 -3
- package/dist/runner/overlay-css.js +0 -377
- package/dist/runner/overlay-install.js +0 -90
- package/dist/runner/overlay-stage.js +0 -110
- package/dist/runner/rings.js +0 -514
- package/dist/runner/seed-mem.js +0 -110
- package/dist/runner/slides.js +0 -278
- package/dist/runner/step-mode.js +0 -703
- package/dist/runner/step-panels.js +0 -729
- package/dist/runner/teardown.js +0 -202
- package/dist/runner/todo-dock.js +0 -142
- package/dist/session/step-overlay.d.ts +0 -37
- package/dist/session/step-overlay.js +0 -244
- package/examples/routed-demo/playwright.config.ts +0 -21
- package/examples/saucedemo/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
- package/templates/quickstart/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
- /package/dist/{commands → cli/commands}/agent-dive-scaffold.d.ts +0 -0
- /package/dist/{commands → cli/commands}/agent-dive.d.ts +0 -0
- /package/dist/{commands → cli/commands}/extensions.d.ts +0 -0
- /package/dist/{commands → cli/commands}/init.d.ts +0 -0
- /package/dist/{commands → cli/commands}/list.d.ts +0 -0
- /package/dist/{commands → cli/commands}/map.d.ts +0 -0
- /package/dist/{commands → cli/commands}/session.d.ts +0 -0
- /package/dist/{commands → cli/commands}/test.d.ts +0 -0
- /package/dist/{commands → cli/commands}/traverse.d.ts +0 -0
- /package/dist/{commands → cli/commands}/try.d.ts +0 -0
- /package/dist/{commands → cli/commands}/upgrade.d.ts +0 -0
- /package/dist/{highlights → demo/narration}/shorthand.js +0 -0
- /package/dist/{session/overlay-beacon.d.ts → demo/overlay/beacon.d.ts} +0 -0
- /package/dist/{session/overlay-beacon.js → demo/overlay/beacon.js} +0 -0
- /package/dist/{pilot-overlay/action-ring.d.ts → demo/overlay/pilot/actions.d.ts} +0 -0
- /package/dist/{ui → demo/overlay/ui}/components/ring.d.ts +0 -0
- /package/dist/{ui → demo/overlay/ui}/stylesheet.d.ts +0 -0
- /package/dist/{ui → demo/overlay/ui}/stylesheet.js +0 -0
- /package/dist/{ui → demo/overlay/ui}/tokens.d.ts +0 -0
- /package/dist/{ui → demo/overlay/ui}/tokens.js +0 -0
- /package/dist/{highlights → demo}/types.js +0 -0
- /package/dist/{auto-session → demo}/verbose-log.d.ts +0 -0
- /package/dist/{selector.d.ts → engine/trait/selector.d.ts} +0 -0
- /package/dist/{selector.js → engine/trait/selector.js} +0 -0
- /package/dist/{trait.js → engine/trait/trait.js} +0 -0
- /package/dist/{traverse → live/traverse}/coverage.d.ts +0 -0
- /package/dist/{traverse → live/traverse}/coverage.js +0 -0
- /package/dist/{traverse → live/traverse}/lease.d.ts +0 -0
- /package/dist/{traverse → live/traverse}/lease.js +0 -0
- /package/dist/{session/block-inject.d.ts → manifest/roots.d.ts} +0 -0
- /package/dist/{blocks-select.d.ts → manifest/select.d.ts} +0 -0
- /package/dist/{blocks-select.js → manifest/select.js} +0 -0
- /package/dist/{browser.d.ts → runtime/browser.d.ts} +0 -0
- /package/dist/{env-file.d.ts → runtime/env-file.d.ts} +0 -0
- /package/dist/{playwright-config.js → runtime/playwright-config.js} +0 -0
- /package/dist/{playwright.config.d.ts → runtime/playwright.config.d.ts} +0 -0
- /package/dist/{video-dir.d.ts → runtime/video-dir.d.ts} +0 -0
- /package/dist/{webserver.d.ts → runtime/webserver.d.ts} +0 -0
package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts
CHANGED
|
@@ -1,14 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
checkpoint,
|
|
4
|
-
type Checkpoint,
|
|
5
|
-
type WaygraphInstanceOption,
|
|
6
|
-
} from "waygraph";
|
|
7
|
-
import type { ItemInCart } from "../../../../states/checkout.states.js";
|
|
1
|
+
import { defineEffectBlock, type WaygraphInstanceOption } from "waygraph";
|
|
2
|
+
import { ItemInCart } from "../../../../states/checkout.states.js";
|
|
8
3
|
import { SelectedItem } from "../../../../states/checkout.mem-keys.js";
|
|
9
4
|
import { collectAddableItems, InventorySel } from "./inventory-items.js";
|
|
10
5
|
|
|
11
|
-
|
|
12
6
|
/**
|
|
13
7
|
* Kind: Effect
|
|
14
8
|
* Helper: defineEffectBlock
|
|
@@ -17,40 +11,38 @@ import { collectAddableItems, InventorySel } from "./inventory-items.js";
|
|
|
17
11
|
* Mutates cart for the mem-picked product. waygraph auto lists one
|
|
18
12
|
* "Add ..." row per live Add button via instanceOptions.
|
|
19
13
|
*/
|
|
20
|
-
export const AddToCartBlock = defineEffectBlock
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
},
|
|
31
|
-
resolve: () => checkpoint("ItemInCart"),
|
|
32
|
-
verify: [
|
|
33
|
-
{
|
|
34
|
-
name: "item-added-to-cart",
|
|
35
|
-
async check(page, mem) {
|
|
36
|
-
const { id } = mem.get(SelectedItem.key);
|
|
37
|
-
return await page
|
|
38
|
-
.locator(InventorySel.removeBtn(id))
|
|
39
|
-
.first()
|
|
40
|
-
.isVisible();
|
|
41
|
-
},
|
|
42
|
-
},
|
|
43
|
-
],
|
|
44
|
-
},
|
|
45
|
-
async instanceOptions(page): Promise<readonly WaygraphInstanceOption[]> {
|
|
46
|
-
const items = await collectAddableItems(page);
|
|
47
|
-
return items.map((item) => ({
|
|
48
|
-
id: item.id,
|
|
49
|
-
label: `Add "${item.name}" to cart`,
|
|
50
|
-
key: SelectedItem.key,
|
|
51
|
-
value: item,
|
|
52
|
-
highlight: InventorySel.addBtn(item.id),
|
|
53
|
-
}));
|
|
14
|
+
export const AddToCartBlock = defineEffectBlock({
|
|
15
|
+
name: "add-to-cart",
|
|
16
|
+
description:
|
|
17
|
+
"Adds the item named by mem (saucedemo.selectedItem) to the cart.",
|
|
18
|
+
to: ItemInCart,
|
|
19
|
+
requires: [SelectedItem.key],
|
|
20
|
+
instruction: {
|
|
21
|
+
async act(page, _input, mem) {
|
|
22
|
+
const { id } = mem.get(SelectedItem.key);
|
|
23
|
+
await page.locator(InventorySel.addBtn(id)).click();
|
|
54
24
|
},
|
|
25
|
+
verify: [
|
|
26
|
+
{
|
|
27
|
+
name: "item-added-to-cart",
|
|
28
|
+
async check(page, mem) {
|
|
29
|
+
const { id } = mem.get(SelectedItem.key);
|
|
30
|
+
return await page
|
|
31
|
+
.locator(InventorySel.removeBtn(id))
|
|
32
|
+
.first()
|
|
33
|
+
.isVisible();
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
},
|
|
38
|
+
async instanceOptions(page): Promise<readonly WaygraphInstanceOption[]> {
|
|
39
|
+
const items = await collectAddableItems(page);
|
|
40
|
+
return items.map((item) => ({
|
|
41
|
+
id: item.id,
|
|
42
|
+
label: `Add "${item.name}" to cart`,
|
|
43
|
+
key: SelectedItem.key,
|
|
44
|
+
value: item,
|
|
45
|
+
highlight: InventorySel.addBtn(item.id),
|
|
46
|
+
}));
|
|
55
47
|
},
|
|
56
|
-
);
|
|
48
|
+
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { defineMethodBlock, checkpoint
|
|
2
|
-
import
|
|
1
|
+
import { defineMethodBlock, checkpoint } from "waygraph";
|
|
2
|
+
import { RemoveFromCartOutcome } from "../../../../states/checkout.states.js";
|
|
3
3
|
import { collectRemovableItems, InventorySel } from "./inventory-items.js";
|
|
4
4
|
|
|
5
5
|
type BulkObserve = "still-has-items" | "cart-empty";
|
|
@@ -14,12 +14,10 @@ type BulkObserve = "still-has-items" | "cart-empty";
|
|
|
14
14
|
* single-item remove. Out: LoggedIn when cart empty; ItemInCart if anything
|
|
15
15
|
* remains (partial failure / race).
|
|
16
16
|
*/
|
|
17
|
-
export const RemoveAllFromCartBlock = defineMethodBlock
|
|
18
|
-
Checkpoint<string>,
|
|
19
|
-
RemoveFromCartOutcome
|
|
20
|
-
>({
|
|
17
|
+
export const RemoveAllFromCartBlock = defineMethodBlock({
|
|
21
18
|
name: "remove-all-from-cart",
|
|
22
19
|
description: "Removes every product still showing Remove on this page.",
|
|
20
|
+
to: RemoveFromCartOutcome,
|
|
23
21
|
instruction: {
|
|
24
22
|
async act(page) {
|
|
25
23
|
const items = await collectRemovableItems(page);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { defineEffectBlock, checkpoint, type
|
|
2
|
-
import
|
|
1
|
+
import { defineEffectBlock, checkpoint, type WaygraphInstanceOption } from "waygraph";
|
|
2
|
+
import { RemoveFromCartOutcome } from "../../../../states/checkout.states.js";
|
|
3
3
|
import { SelectedItem } from "../../../../states/checkout.mem-keys.js";
|
|
4
4
|
import { collectRemovableItems, InventorySel } from "./inventory-items.js";
|
|
5
5
|
|
|
@@ -13,9 +13,10 @@ type RemoveObserve = "still-has-items" | "cart-empty";
|
|
|
13
13
|
* Removes the mem-picked product. After Add, waygraph auto shows matching
|
|
14
14
|
* "Remove ..." rows from live Remove buttons.
|
|
15
15
|
*/
|
|
16
|
-
export const RemoveFromCartBlock = defineEffectBlock
|
|
16
|
+
export const RemoveFromCartBlock = defineEffectBlock({
|
|
17
17
|
name: "remove-from-cart",
|
|
18
18
|
description: "Removes the item named by mem (saucedemo.selectedItem) from the cart.",
|
|
19
|
+
to: RemoveFromCartOutcome,
|
|
19
20
|
requires: [SelectedItem.key],
|
|
20
21
|
instruction: {
|
|
21
22
|
async act(page, _input, mem) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineMemNavBlock, Trait, type WaygraphInstanceOption } from "waygraph";
|
|
2
|
-
import
|
|
2
|
+
import { ItemDetailPage } from "../../../states/checkout.states.js";
|
|
3
3
|
import { SelectedItem } from "../../../states/checkout.mem-keys.js";
|
|
4
4
|
import {
|
|
5
5
|
collectInventoryItems,
|
|
@@ -14,10 +14,10 @@ import {
|
|
|
14
14
|
* Opens the mem-picked product detail page. waygraph auto lists one
|
|
15
15
|
* "Open ... details" row per inventory card via instanceOptions.
|
|
16
16
|
*/
|
|
17
|
-
export const NavItemDetailBlock = defineMemNavBlock
|
|
17
|
+
export const NavItemDetailBlock = defineMemNavBlock({
|
|
18
18
|
name: "nav-item-detail",
|
|
19
19
|
description: "Opens the product named by mem (saucedemo.selectedItem) on its detail page.",
|
|
20
|
-
checkpoint:
|
|
20
|
+
checkpoint: ItemDetailPage,
|
|
21
21
|
requires: [SelectedItem.key],
|
|
22
22
|
click: (mem) => InventorySel.title(mem.get(SelectedItem.key).id),
|
|
23
23
|
verify: [Trait.url({ pathname: "/inventory-item.html" })],
|
package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineNavClickBlock, Trait } from "waygraph";
|
|
2
|
-
import
|
|
2
|
+
import { LoggedIn } from "../../../states/checkout.states.js";
|
|
3
3
|
import { ItemDetailSel } from "./item-detail.sel.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -10,10 +10,10 @@ import { ItemDetailSel } from "./item-detail.sel.js";
|
|
|
10
10
|
* click, not url - detail page "Back to products". Separate Block from
|
|
11
11
|
* nav-back-to-products (different From Checkpoint; atomic convention).
|
|
12
12
|
*/
|
|
13
|
-
export const NavBackToInventoryBlock = defineNavClickBlock
|
|
13
|
+
export const NavBackToInventoryBlock = defineNavClickBlock({
|
|
14
14
|
name: "nav-back-to-inventory",
|
|
15
15
|
description: "Clicks 'Back to products' on the item detail page.",
|
|
16
|
-
checkpoint:
|
|
16
|
+
checkpoint: LoggedIn,
|
|
17
17
|
click: ItemDetailSel.backToProductsBtn,
|
|
18
18
|
verify: [Trait.url({ pathname: "/inventory.html" })],
|
|
19
19
|
});
|
package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineNavClickBlock, Trait } from "waygraph";
|
|
2
|
-
import
|
|
2
|
+
import { LoggedIn } from "../../../states/checkout.states.js";
|
|
3
3
|
import { ItemDetailSel } from "./item-detail.sel.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -10,10 +10,10 @@ import { ItemDetailSel } from "./item-detail.sel.js";
|
|
|
10
10
|
* click, not url - order-complete "Back Home" proves the button path
|
|
11
11
|
* (a url NavBlock would teleport without exercising the control).
|
|
12
12
|
*/
|
|
13
|
-
export const NavBackToProductsBlock = defineNavClickBlock
|
|
13
|
+
export const NavBackToProductsBlock = defineNavClickBlock({
|
|
14
14
|
name: "nav-back-to-products",
|
|
15
15
|
description: "Clicks 'Back Home' on the order confirmation page.",
|
|
16
|
-
checkpoint:
|
|
16
|
+
checkpoint: LoggedIn,
|
|
17
17
|
click: ItemDetailSel.backToProductsBtn,
|
|
18
18
|
verify: [Trait.url({ pathname: "/inventory.html" })],
|
|
19
19
|
});
|
package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineNavClickBlock, Trait } from "waygraph";
|
|
2
|
-
import
|
|
2
|
+
import { LoggedIn } from "../../../states/checkout.states.js";
|
|
3
3
|
import { ItemDetailSel } from "./item-detail.sel.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -9,10 +9,10 @@ import { ItemDetailSel } from "./item-detail.sel.js";
|
|
|
9
9
|
*
|
|
10
10
|
* click, not url - cart page "Continue Shopping" proves the app's own path.
|
|
11
11
|
*/
|
|
12
|
-
export const NavContinueShoppingBlock = defineNavClickBlock
|
|
12
|
+
export const NavContinueShoppingBlock = defineNavClickBlock({
|
|
13
13
|
name: "nav-continue-shopping",
|
|
14
14
|
description: "Clicks 'Continue Shopping' on the cart page.",
|
|
15
|
-
checkpoint:
|
|
15
|
+
checkpoint: LoggedIn,
|
|
16
16
|
click: ItemDetailSel.continueShoppingBtn,
|
|
17
17
|
verify: [Trait.url({ pathname: "/inventory.html" })],
|
|
18
18
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { defineMethodBlock
|
|
2
|
-
import
|
|
1
|
+
import { defineMethodBlock } from "waygraph";
|
|
2
|
+
import { LoginPage } from "../../../states/checkout.states.js";
|
|
3
3
|
import { LoginCreds } from "../../../states/checkout.mem-keys.js";
|
|
4
4
|
import { LoginSel } from "./login.sel.js";
|
|
5
5
|
|
|
@@ -11,15 +11,16 @@ import { LoginSel } from "./login.sel.js";
|
|
|
11
11
|
* Fills the password field only - self-loop on LoginPage. See
|
|
12
12
|
* fill-username.method.block.ts for why this is split from submit.
|
|
13
13
|
*/
|
|
14
|
-
export const FillPasswordBlock = defineMethodBlock
|
|
14
|
+
export const FillPasswordBlock = defineMethodBlock({
|
|
15
15
|
name: "fill-password",
|
|
16
16
|
description: "Fills the password field on the login form.",
|
|
17
|
+
from: LoginPage,
|
|
18
|
+
to: LoginPage,
|
|
17
19
|
requires: [LoginCreds.key],
|
|
18
20
|
instruction: {
|
|
19
21
|
async act(page, _input, mem) {
|
|
20
22
|
const { password } = mem.get(LoginCreds.key);
|
|
21
23
|
await page.locator(LoginSel.password).fill(password);
|
|
22
24
|
},
|
|
23
|
-
resolve: () => checkpoint("LoginPage"),
|
|
24
25
|
},
|
|
25
26
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { defineMethodBlock
|
|
2
|
-
import
|
|
1
|
+
import { defineMethodBlock } from "waygraph";
|
|
2
|
+
import { LoginPage } from "../../../states/checkout.states.js";
|
|
3
3
|
import { LoginCreds } from "../../../states/checkout.mem-keys.js";
|
|
4
4
|
import { LoginSel } from "./login.sel.js";
|
|
5
5
|
|
|
@@ -13,15 +13,16 @@ import { LoginSel } from "./login.sel.js";
|
|
|
13
13
|
* graph/demo show fill vs submit as real, distinct steps instead of one
|
|
14
14
|
* Block doing "input username and password and login at the same time".
|
|
15
15
|
*/
|
|
16
|
-
export const FillUsernameBlock = defineMethodBlock
|
|
16
|
+
export const FillUsernameBlock = defineMethodBlock({
|
|
17
17
|
name: "fill-username",
|
|
18
18
|
description: "Fills the username field on the login form.",
|
|
19
|
+
from: LoginPage,
|
|
20
|
+
to: LoginPage,
|
|
19
21
|
requires: [LoginCreds.key],
|
|
20
22
|
instruction: {
|
|
21
23
|
async act(page, _input, mem) {
|
|
22
24
|
const { username } = mem.get(LoginCreds.key);
|
|
23
25
|
await page.locator(LoginSel.username).fill(username);
|
|
24
26
|
},
|
|
25
|
-
resolve: () => checkpoint("LoginPage"),
|
|
26
27
|
},
|
|
27
28
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineMethodBlock, checkpoint, Trait } from "waygraph";
|
|
2
|
-
import
|
|
2
|
+
import {
|
|
3
3
|
LoginPage,
|
|
4
4
|
LoginSubmitOutcome,
|
|
5
5
|
} from "../../../states/checkout.states.js";
|
|
@@ -17,12 +17,11 @@ type LoginObserve = "success" | "failure";
|
|
|
17
17
|
* already did that). One Block, one action: submit.
|
|
18
18
|
* Branches: good creds -> LoggedIn; bad/locked -> LoginPage with error banner.
|
|
19
19
|
*/
|
|
20
|
-
export const SubmitLoginBlock = defineMethodBlock
|
|
21
|
-
LoginPage,
|
|
22
|
-
LoginSubmitOutcome
|
|
23
|
-
>({
|
|
20
|
+
export const SubmitLoginBlock = defineMethodBlock({
|
|
24
21
|
name: "submit-login",
|
|
25
22
|
description: "Submits the login form; stays on LoginPage when auth fails.",
|
|
23
|
+
from: LoginPage,
|
|
24
|
+
to: LoginSubmitOutcome,
|
|
26
25
|
instruction: {
|
|
27
26
|
async act(page) {
|
|
28
27
|
// noWaitAfter: observe owns the inventory URL wait. Default click
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { defineMethodBlock,
|
|
2
|
-
import
|
|
1
|
+
import { defineMethodBlock, Trait } from "waygraph";
|
|
2
|
+
import { LoggedIn, LoginPage } from "../../../states/checkout.states.js";
|
|
3
3
|
import { LoginSel } from "./login.sel.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -9,15 +9,16 @@ import { LoginSel } from "./login.sel.js";
|
|
|
9
9
|
*
|
|
10
10
|
* Burger menu Logout - real cycle back to LoginPage (same Checkpoint nav-login lands on).
|
|
11
11
|
*/
|
|
12
|
-
export const SubmitLogoutBlock = defineMethodBlock
|
|
12
|
+
export const SubmitLogoutBlock = defineMethodBlock({
|
|
13
13
|
name: "submit-logout",
|
|
14
14
|
description: "Opens the burger menu and logs out.",
|
|
15
|
+
from: LoggedIn,
|
|
16
|
+
to: LoginPage,
|
|
15
17
|
instruction: {
|
|
16
18
|
async act(page) {
|
|
17
19
|
await page.locator(LoginSel.burgerMenuButton).click();
|
|
18
20
|
await page.locator(LoginSel.logoutLink).click();
|
|
19
21
|
},
|
|
20
|
-
resolve: () => checkpoint("LoginPage"),
|
|
21
22
|
verify: [Trait.visible(LoginSel.loginButton)],
|
|
22
23
|
},
|
|
23
24
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { definePageBlock, Trait } from "waygraph";
|
|
2
|
-
import
|
|
2
|
+
import { LoginPage } from "../../states/checkout.states.js";
|
|
3
3
|
import { FillUsernameBlock } from "./methods/fill-username.method.block.js";
|
|
4
4
|
import { FillPasswordBlock } from "./methods/fill-password.method.block.js";
|
|
5
5
|
import { SubmitLoginBlock } from "./methods/submit-login.method.block.js";
|
|
@@ -17,10 +17,10 @@ import { LoginSel } from "./methods/login.sel.js";
|
|
|
17
17
|
* and submits. Name stays `nav-login` so existing flows / chain specs keep
|
|
18
18
|
* working.
|
|
19
19
|
*/
|
|
20
|
-
export const NavLoginBlock = definePageBlock
|
|
20
|
+
export const NavLoginBlock = definePageBlock({
|
|
21
21
|
name: "nav-login",
|
|
22
22
|
description: "Goes to the Swag Labs login page.",
|
|
23
|
-
checkpoint:
|
|
23
|
+
checkpoint: LoginPage,
|
|
24
24
|
url: "/",
|
|
25
25
|
verify: [Trait.visible(LoginSel.loginButton)],
|
|
26
26
|
methods: {
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { checkpoint, defineApiBlock } from "waygraph";
|
|
2
|
-
import type { Checkpoint, StubCtx } from "waygraph";
|
|
3
2
|
import { engine } from "../../config/waygraph.config.js";
|
|
4
3
|
import { loginFlow } from "./login.flow.js";
|
|
5
4
|
|
|
@@ -15,24 +14,27 @@ import { loginFlow } from "./login.flow.js";
|
|
|
15
14
|
* hits a well-known public REST test API (jsonplaceholder) purely to prove
|
|
16
15
|
* the mechanism - a real project would point `call` at its own backend.
|
|
17
16
|
*/
|
|
18
|
-
export
|
|
19
|
-
export type
|
|
17
|
+
export const BackendHealthy = checkpoint("BackendHealthy");
|
|
18
|
+
export type BackendHealthy = typeof BackendHealthy;
|
|
19
|
+
export const BackendDown = checkpoint("BackendDown");
|
|
20
|
+
export type BackendDown = typeof BackendDown;
|
|
20
21
|
|
|
21
|
-
const CheckBackendHealth = defineApiBlock
|
|
22
|
+
const CheckBackendHealth = defineApiBlock({
|
|
22
23
|
name: "check-backend-health",
|
|
24
|
+
to: [BackendHealthy, BackendDown],
|
|
23
25
|
call: ({ request }) =>
|
|
24
26
|
request.get("https://jsonplaceholder.typicode.com/todos/1"),
|
|
25
|
-
resolve: (result) =>
|
|
26
|
-
result.ok ? checkpoint("BackendHealthy") : checkpoint("BackendDown"),
|
|
27
|
-
stubBefore: (ctx: StubCtx<BackendHealthy | BackendDown>) => {
|
|
28
|
-
ctx.title("Checking backend health · real HTTP request, no browser");
|
|
29
|
-
},
|
|
27
|
+
resolve: (result) => (result.ok ? BackendHealthy : BackendDown),
|
|
30
28
|
});
|
|
31
29
|
|
|
32
30
|
export const apiDemoEpisode = engine
|
|
33
31
|
.map()
|
|
34
32
|
.start()
|
|
35
|
-
.method(
|
|
33
|
+
.method(
|
|
34
|
+
CheckBackendHealth.stubBefore((ctx) => {
|
|
35
|
+
ctx.title("Checking backend health · real HTTP request, no browser");
|
|
36
|
+
}),
|
|
37
|
+
)
|
|
36
38
|
.end();
|
|
37
39
|
|
|
38
40
|
export const apiDemoFlow = engine
|
|
@@ -1,19 +1,29 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { checkpoint } from "waygraph";
|
|
2
2
|
|
|
3
3
|
// One Checkpoint per real state the target app can be in - kept together so the
|
|
4
4
|
// whole checkout flow's state space reads in one place, the same reason a
|
|
5
5
|
// backend keeps its models together instead of scattered across handlers.
|
|
6
6
|
// `Start` is waygraph's own exported type, not redeclared here.
|
|
7
7
|
|
|
8
|
-
export
|
|
9
|
-
export type
|
|
8
|
+
export const LoginPage = checkpoint("LoginPage");
|
|
9
|
+
export type LoginPage = typeof LoginPage;
|
|
10
|
+
export const LoggedIn = checkpoint("LoggedIn");
|
|
11
|
+
export type LoggedIn = typeof LoggedIn;
|
|
10
12
|
/** submit-login: inventory on success, login form + error banner on auth failure. */
|
|
11
|
-
export
|
|
12
|
-
export type
|
|
13
|
+
export const LoginSubmitOutcome = [LoggedIn, LoginPage] as const;
|
|
14
|
+
export type LoginSubmitOutcome = (typeof LoginSubmitOutcome)[number];
|
|
15
|
+
export const ItemInCart = checkpoint("ItemInCart");
|
|
16
|
+
export type ItemInCart = typeof ItemInCart;
|
|
13
17
|
/** remove-from-cart: still has items → ItemInCart; empty cart → LoggedIn. */
|
|
14
|
-
export
|
|
15
|
-
export type
|
|
16
|
-
export
|
|
17
|
-
export type
|
|
18
|
-
export
|
|
19
|
-
export type
|
|
18
|
+
export const RemoveFromCartOutcome = [ItemInCart, LoggedIn] as const;
|
|
19
|
+
export type RemoveFromCartOutcome = (typeof RemoveFromCartOutcome)[number];
|
|
20
|
+
export const CartPage = checkpoint("CartPage");
|
|
21
|
+
export type CartPage = typeof CartPage;
|
|
22
|
+
export const CheckoutInfoPage = checkpoint("CheckoutInfoPage");
|
|
23
|
+
export type CheckoutInfoPage = typeof CheckoutInfoPage;
|
|
24
|
+
export const CheckoutOverviewPage = checkpoint("CheckoutOverviewPage");
|
|
25
|
+
export type CheckoutOverviewPage = typeof CheckoutOverviewPage;
|
|
26
|
+
export const ItemDetailPage = checkpoint("ItemDetailPage");
|
|
27
|
+
export type ItemDetailPage = typeof ItemDetailPage;
|
|
28
|
+
export const OrderComplete = checkpoint("OrderComplete");
|
|
29
|
+
export type OrderComplete = typeof OrderComplete;
|
|
@@ -40,7 +40,7 @@ export const deviceShowcase = {
|
|
|
40
40
|
before: (ctx: StubCtx) => {
|
|
41
41
|
ctx.title("Signing in · mobile");
|
|
42
42
|
ctx.device("mobile");
|
|
43
|
-
ctx.portrait
|
|
43
|
+
ctx.orientation("portrait");
|
|
44
44
|
ctx.todos("saucedemo", ...checklist(0, 0));
|
|
45
45
|
ctx.zoom(1.35);
|
|
46
46
|
const fromMem = ctx.mem?.get(LoginCreds.key)?.username;
|
|
@@ -93,8 +93,8 @@ export const deviceShowcase = {
|
|
|
93
93
|
});
|
|
94
94
|
},
|
|
95
95
|
after: (ctx: StubCtx) => {
|
|
96
|
-
ctx.
|
|
97
|
-
ctx.landscape
|
|
96
|
+
ctx.title("Inventory · landscape");
|
|
97
|
+
ctx.orientation("landscape");
|
|
98
98
|
ctx.todos("saucedemo", ...checklist(3, 3));
|
|
99
99
|
ctx.ring("shelf", {
|
|
100
100
|
selector: ".inventory_list",
|
|
@@ -111,7 +111,7 @@ export const deviceShowcase = {
|
|
|
111
111
|
before: (ctx: StubCtx) => {
|
|
112
112
|
ctx.title("Pick a product · tablet");
|
|
113
113
|
ctx.device("tablet");
|
|
114
|
-
ctx.portrait
|
|
114
|
+
ctx.orientation("portrait");
|
|
115
115
|
ctx.todos("saucedemo", ...checklist(3, 3));
|
|
116
116
|
ctx.zoom(1.35);
|
|
117
117
|
ctx.zoomOut(false);
|
|
@@ -138,7 +138,7 @@ export const deviceShowcase = {
|
|
|
138
138
|
});
|
|
139
139
|
},
|
|
140
140
|
after: (ctx: StubCtx) => {
|
|
141
|
-
ctx.
|
|
141
|
+
ctx.title("In the cart");
|
|
142
142
|
ctx.todos("saucedemo", ...checklist(4, 4));
|
|
143
143
|
ctx.zoomOut(false);
|
|
144
144
|
ctx.ring("badge", {
|
|
@@ -155,7 +155,7 @@ export const deviceShowcase = {
|
|
|
155
155
|
openCart: {
|
|
156
156
|
before: (ctx: StubCtx) => {
|
|
157
157
|
ctx.title("Open cart · landscape");
|
|
158
|
-
ctx.landscape
|
|
158
|
+
ctx.orientation("landscape");
|
|
159
159
|
ctx.todos("saucedemo", ...checklist(5, 5));
|
|
160
160
|
ctx.zoom(1.4);
|
|
161
161
|
ctx.zoomOut(false);
|
|
@@ -167,15 +167,14 @@ export const deviceShowcase = {
|
|
|
167
167
|
tone: "planned",
|
|
168
168
|
focus: true,
|
|
169
169
|
zoomOut: false,
|
|
170
|
-
followMouse: false,
|
|
171
170
|
weight: "bold",
|
|
172
171
|
gesture: "tap",
|
|
173
172
|
},
|
|
174
173
|
});
|
|
175
174
|
},
|
|
176
175
|
after: (ctx: StubCtx) => {
|
|
177
|
-
ctx.
|
|
178
|
-
ctx.
|
|
176
|
+
ctx.title("Your cart · desktop");
|
|
177
|
+
ctx.hideDevice();
|
|
179
178
|
ctx.hideTodos();
|
|
180
179
|
ctx.zoomOut(true);
|
|
181
180
|
ctx.ring("items", {
|
|
@@ -185,7 +184,6 @@ export const deviceShowcase = {
|
|
|
185
184
|
tone: "success",
|
|
186
185
|
focus: true,
|
|
187
186
|
zoomOut: true,
|
|
188
|
-
followMouse: false,
|
|
189
187
|
duration: true,
|
|
190
188
|
});
|
|
191
189
|
},
|
|
@@ -29,6 +29,7 @@ Change each `_nav.block.ts`'s `url` from the local `file://` path to a real one,
|
|
|
29
29
|
`package.json`'s `"waygraph"` field - see the main docs' "Project config" section). That file also
|
|
30
30
|
holds the test settings (`testDir`, `webServer`, `playwright: { workers, timeout, ... }`), so the
|
|
31
31
|
project needs no `playwright.config.ts`. Keep each
|
|
32
|
-
`src/map/` folder matching the URL it represents (`waygraph map` enforces this).
|
|
32
|
+
`src/map/` folder matching the URL it represents (`waygraph map` enforces this). `(external)/hoppscotch` and
|
|
33
|
+
`(external)/mailpit` keep their own `_states.ts` / `_keys.ts`, so `waygraph map pack <group>` can turn either into a package.
|
|
33
34
|
|
|
34
35
|
Docs: https://deviate-dv8.github.io/waygraph/
|
|
@@ -24,9 +24,9 @@ Next.js route groups) and never appear in a URL or Checkpoint name.
|
|
|
24
24
|
│ │ │ │ ├── assert-hello.method.block.ts # + stubs + YAP slide
|
|
25
25
|
│ │ │ │ └── assert-item-added.method.block.ts
|
|
26
26
|
│ │ │ └── docs/ # a second page, same shape
|
|
27
|
-
│ │ ├── (external)/mailpit/ # a different origin (mail catcher)
|
|
28
|
-
│ │ └── (external)/hoppscotch/ # API client,
|
|
29
|
-
│ ├── states/ #
|
|
27
|
+
│ │ ├── (external)/mailpit/ # a different origin (mail catcher); owns _states.ts + _keys.ts
|
|
28
|
+
│ │ └── (external)/hoppscotch/ # API client, needs the hoppscotch extension; owns _states.ts + _keys.ts
|
|
29
|
+
│ ├── states/ # the app's Checkpoints + mem keys
|
|
30
30
|
│ └── flows/ # use cases, one file per scenario (see flows/README.md)
|
|
31
31
|
│ ├── home/ # a page: hello, cart
|
|
32
32
|
│ ├── (user-stories)/ # flows that cross pages
|
|
@@ -45,9 +45,10 @@ page folder uses, so any agent or teammate knows where to look without asking.
|
|
|
45
45
|
| Add an action on a page | one file in that page's `_methods/` |
|
|
46
46
|
| Verify a state (button disabled, error shown) | `defineAssertBlock` + `Trait.disabled` / `Trait.enabled` |
|
|
47
47
|
| Define a use case (success, failed, bad input) | one `*.flow.ts` in `src/flows/<page>/`, or `(user-stories)/` for one that crosses pages |
|
|
48
|
-
| Give a flow fake data | `registerMemStub(key, fake)` + `memStub: true` in the flow's options (docs:
|
|
48
|
+
| Give a flow fake data | `registerMemStub(key, fake)` in a `*.mem-stubs.ts` file + `memStub: true` in the flow's options; live sessions use the same fakes as defaults (docs: the reference, Engine features, "memStub") |
|
|
49
49
|
| Explore by hand | `npm run auto` (headed) or `npm run auto:cli` |
|
|
50
50
|
| Check your work | `npm run check`, `npm run graph`, `waygraph map` |
|
|
51
|
+
| Share a tool's map with another project | `waygraph map pack hoppscotch`, then publish `.waygraph/packages/hoppscotch` |
|
|
51
52
|
|
|
52
53
|
`waygraph map` fails if a folder path stops matching the real URL it claims to represent.
|
|
53
54
|
Full convention: https://deviate-dv8.github.io/waygraph/consumer.html
|
|
@@ -26,6 +26,7 @@ const config = defineConfig(({ env }) => ({
|
|
|
26
26
|
// video: { viewport: "1920x1080" },
|
|
27
27
|
// },
|
|
28
28
|
// webServer: { command: "npm start", port: 3000 }, // started around test / run / demo / auto
|
|
29
|
+
// runLog: false, // each run is logged to .waygraph/runs/ (what Waygraph UI shows)
|
|
29
30
|
|
|
30
31
|
// Another config for another environment: config/waygraph.staging.config.ts, chosen with `waygraph test --config staging`.
|
|
31
32
|
|
|
@@ -32,8 +32,8 @@ src/flows/
|
|
|
32
32
|
|
|
33
33
|
## Writing one
|
|
34
34
|
|
|
35
|
-
- Build it with `engine.map({ memStub })…end()`; nest another with `.flow(sub, { reset: true })
|
|
36
|
-
|
|
35
|
+
- Build it with `engine.map({ memStub })…end()`; nest another with `.flow(sub, { reset: true })`;
|
|
36
|
+
`.end()` takes nothing.
|
|
37
37
|
- The flow's name and narration are ctx stubs chained on the Block where they apply: `ctx.title("…")`, `ctx.ring(…)`.
|
|
38
38
|
- A flow expected to fail (a locked-out user) says so in `map({ expectedFailure: "…" })`.
|
|
39
39
|
- A step's speed in the demo is `{ pace }`: `.method(FillBlock, { pace: "blitz" })`.
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { defineNavBlock, Trait } from "waygraph";
|
|
2
|
-
import
|
|
2
|
+
import { Docs } from "../../../states/demo.states.js";
|
|
3
3
|
import { DocsSel, DOCS_URL } from "./_sel.js";
|
|
4
4
|
|
|
5
|
-
export const NavDocsBlock = defineNavBlock
|
|
5
|
+
export const NavDocsBlock = defineNavBlock({
|
|
6
6
|
name: "nav-docs",
|
|
7
7
|
description: "Opens the docs page (Waygraph Map convention demo).",
|
|
8
|
-
checkpoint:
|
|
8
|
+
checkpoint: Docs,
|
|
9
9
|
url: DOCS_URL,
|
|
10
10
|
verify: [Trait.visible(DocsSel.heading)],
|
|
11
11
|
});
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { definePageBlock, Trait } from "waygraph";
|
|
2
|
-
import
|
|
2
|
+
import { Docs } from "../../../states/demo.states.js";
|
|
3
3
|
import { DocsSel } from "./_sel.js";
|
|
4
4
|
|
|
5
|
-
export const DocsPageBlock = definePageBlock
|
|
5
|
+
export const DocsPageBlock = definePageBlock({
|
|
6
6
|
name: "page-docs",
|
|
7
7
|
description: "Docs hub - Waygraph Map convention demo.",
|
|
8
|
-
checkpoint:
|
|
8
|
+
checkpoint: Docs,
|
|
9
9
|
verify: [Trait.visible(DocsSel.heading)],
|
|
10
10
|
});
|
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
import {
|
|
2
2
|
defineEffectBlock,
|
|
3
|
-
checkpoint,
|
|
4
3
|
type WaygraphInstanceOption,
|
|
5
4
|
} from "waygraph";
|
|
6
|
-
import
|
|
5
|
+
import { CanAddItem, ItemInCart } from "../../../../states/demo.states.js";
|
|
7
6
|
import { SelectedItem } from "../../../../states/demo.mem-keys.js";
|
|
8
7
|
import { DemoSel } from "../_sel.js";
|
|
9
8
|
|
|
10
9
|
/** `waygraph auto` lists one "Add …" row per live Add button via `instanceOptions`. */
|
|
11
|
-
export const AddItemBlock = defineEffectBlock
|
|
10
|
+
export const AddItemBlock = defineEffectBlock({
|
|
12
11
|
name: "add-item",
|
|
13
12
|
description: "Adds the mem-selected catalog item to the cart.",
|
|
13
|
+
from: CanAddItem,
|
|
14
|
+
to: ItemInCart,
|
|
14
15
|
requires: [SelectedItem.key],
|
|
15
16
|
instruction: {
|
|
16
17
|
async act(page, _input, mem) {
|
|
17
18
|
const { id } = mem.get(SelectedItem.key);
|
|
18
19
|
await page.locator(DemoSel.addBtn(id)).click();
|
|
19
20
|
},
|
|
20
|
-
resolve: () => checkpoint("ItemInCart"),
|
|
21
21
|
verify: [
|
|
22
22
|
{
|
|
23
23
|
name: "item-added",
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { defineAssertBlock, Trait } from "waygraph";
|
|
2
|
-
import
|
|
2
|
+
import { Home } from "../../../../states/demo.states.js";
|
|
3
3
|
import { DemoSel } from "../_sel.js";
|
|
4
4
|
|
|
5
5
|
/** Heading still shows after arrival; the slide is a YAP caption for the demo overlay. */
|
|
6
|
-
export const AssertHelloBlock = defineAssertBlock
|
|
6
|
+
export const AssertHelloBlock = defineAssertBlock({
|
|
7
7
|
name: "assert-hello",
|
|
8
8
|
description: "Confirms the hello heading is still visible after arrival.",
|
|
9
|
-
checkpoint:
|
|
9
|
+
checkpoint: Home,
|
|
10
10
|
waitForHeading: "Hello Waygraph",
|
|
11
11
|
verify: [Trait.text(DemoSel.title, "Hello Waygraph"), Trait.visible(DemoSel.sub)],
|
|
12
12
|
slides: [
|