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
|
@@ -12,19 +12,16 @@ Runtime is always a `Block`. Helpers are TypeScript salt + clear intent.
|
|
|
12
12
|
| `defineAssertBlock` | Self-loop assertion, no state change - `verify` only | `*.method.block.ts` under `methods/` |
|
|
13
13
|
| `defineEffectBlock` | Instance mutate + auto menu rows | `*.effect.block.ts` under `methods/` |
|
|
14
14
|
| `defineBlock` | Escape hatch: tests, unsure, probes | any |
|
|
15
|
-
| `defineActionBlock` | **Deprecated** alias of `defineMethodBlock` | - |
|
|
16
15
|
|
|
17
|
-
`defineNavBlock({ click })`
|
|
16
|
+
`defineNavBlock({ click })` and `defineNavClickBlock` build the same Block; app code reads better with `defineNavClickBlock`.
|
|
18
17
|
|
|
19
18
|
**One distinct action per Block.** A Method that fills fields *and* submits is wrong even if
|
|
20
19
|
it "works" - split it (`fill-username` + `fill-password` + `submit-login`, not one Block).
|
|
21
20
|
`defineAssertBlock({ name, checkpoint, verify, waitForHeading?, requires? })` is the
|
|
22
21
|
self-loop-only shape for "assert something on the current page, no state change" - no
|
|
23
22
|
hand-written `act`/`resolve` to accidentally make do two things. `waygraph check` warns when
|
|
24
|
-
a `verify` array inlines a literal selector string instead of a `*Sel` reference.
|
|
25
|
-
|
|
26
|
-
Block before `end` - otherwise `Out` defaults to wildcard `Checkpoint<string>`, which breaks
|
|
27
|
-
`defineFlow`'s tuple typing mid-chain.
|
|
23
|
+
a `verify` array inlines a literal selector string instead of a `*Sel` reference. Its `checkpoint` is a Checkpoint
|
|
24
|
+
value, which types it on both sides, so it sits anywhere in a `map()` chain.
|
|
28
25
|
|
|
29
26
|
---
|
|
30
27
|
|
|
@@ -41,7 +38,7 @@ export const InventorySel = {
|
|
|
41
38
|
|
|
42
39
|
export const InventoryPageBlock = definePageBlock({
|
|
43
40
|
name: "page-inventory",
|
|
44
|
-
checkpoint:
|
|
41
|
+
checkpoint: LoggedIn,
|
|
45
42
|
verify: [Trait.url({ pathname: "/inventory.html" }), Trait.visible(InventorySel.list)],
|
|
46
43
|
methods: {
|
|
47
44
|
addToCart: () => AddToCartBlock,
|
|
@@ -84,8 +81,10 @@ Checkpoint = place on the map. `branch()` = which road to take from that place.
|
|
|
84
81
|
Conditional Out (no `branch()` needed for auto/graph):
|
|
85
82
|
|
|
86
83
|
```ts
|
|
87
|
-
defineMethodBlock
|
|
84
|
+
defineMethodBlock({
|
|
88
85
|
name: "submit-login",
|
|
86
|
+
from: LoginPage,
|
|
87
|
+
to: [LoggedIn, LoginPage],
|
|
89
88
|
instruction: {
|
|
90
89
|
async act(page) { /* click only - fields were filled by earlier Blocks */ },
|
|
91
90
|
async observe(page) {
|
|
@@ -123,8 +122,9 @@ then run the Block (act reads mem as usual).
|
|
|
123
122
|
### Effect - spawn Method-like rows (Add / Remove)
|
|
124
123
|
|
|
125
124
|
```ts
|
|
126
|
-
defineEffectBlock
|
|
125
|
+
defineEffectBlock({
|
|
127
126
|
name: "add-to-cart",
|
|
127
|
+
to: ItemInCart, // no `from`: runs from anywhere
|
|
128
128
|
requires: [SelectedItem.key],
|
|
129
129
|
instruction: {
|
|
130
130
|
async act(page, _in, mem) {
|
|
@@ -151,9 +151,9 @@ Auto shows: `Add "Sauce Labs Backpack" to cart`, `Add "Bike Light"…`, …
|
|
|
151
151
|
### MemNav - spawn Nav rows (Open details)
|
|
152
152
|
|
|
153
153
|
```ts
|
|
154
|
-
defineMemNavBlock
|
|
154
|
+
defineMemNavBlock({
|
|
155
155
|
name: "nav-item-detail",
|
|
156
|
-
checkpoint:
|
|
156
|
+
checkpoint: ItemDetailPage,
|
|
157
157
|
requires: [SelectedItem.key],
|
|
158
158
|
click: (mem) => InventorySel.title(mem.get(SelectedItem.key).id),
|
|
159
159
|
verify: [Trait.url({ pathname: "/inventory-item.html" })],
|
|
@@ -9,7 +9,6 @@ src/blocks/
|
|
|
9
9
|
saucedemo-web/ # URL /
|
|
10
10
|
NAV.md
|
|
11
11
|
nav-login.block.ts # Page definePageBlock url:/
|
|
12
|
-
ff-owner-auth.block.ts # FFCompose (nav-login + fill-username + fill-password + submit-login)
|
|
13
12
|
methods/
|
|
14
13
|
fill-username.method.block.ts # Method defineMethodBlock (self-loop on LoginPage)
|
|
15
14
|
fill-password.method.block.ts # Method defineMethodBlock (self-loop on LoginPage)
|
|
@@ -27,11 +27,7 @@ Fill and submit are three separate Blocks (not one that fills both fields and
|
|
|
27
27
|
clicks Login) so the graph/demo show each as its own step - no Block does
|
|
28
28
|
more than one distinct action.
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
| File | Kind | Notes |
|
|
33
|
-
|------|------|-------|
|
|
34
|
-
| `ff-owner-auth.block.ts` | FFCompose | Collapses nav-login + fill-username + fill-password + submit-login into one opaque demo/run step (`--ff-expand` shows all 4 again) |
|
|
30
|
+
A flow that wants to skip watching auth marks those steps `{ ff: true }` (see `src/flows/checkout.flow.ts`).
|
|
35
31
|
|
|
36
32
|
## Related mem keys / checkpoints
|
|
37
33
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineNavClickBlock, Trait } from "waygraph";
|
|
2
|
-
import
|
|
2
|
+
import { CartPage } from "../../../states/checkout.states.js";
|
|
3
3
|
import { CartSel } from "./cart.sel.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -9,10 +9,10 @@ import { CartSel } from "./cart.sel.js";
|
|
|
9
9
|
*
|
|
10
10
|
* click, not url - header cart link from inventory-adjacent pages.
|
|
11
11
|
*/
|
|
12
|
-
export const NavCartBlock = defineNavClickBlock
|
|
12
|
+
export const NavCartBlock = defineNavClickBlock({
|
|
13
13
|
name: "nav-cart",
|
|
14
14
|
description: "Clicks the cart link in the header.",
|
|
15
|
-
checkpoint:
|
|
15
|
+
checkpoint: CartPage,
|
|
16
16
|
click: CartSel.cartLink,
|
|
17
17
|
verify: [Trait.url({ pathname: "/cart.html" })],
|
|
18
18
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineNavClickBlock, Trait } from "waygraph";
|
|
2
|
-
import
|
|
2
|
+
import { CheckoutInfoPage } from "../../../states/checkout.states.js";
|
|
3
3
|
import { CartSel } from "./cart.sel.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -9,10 +9,10 @@ import { CartSel } from "./cart.sel.js";
|
|
|
9
9
|
*
|
|
10
10
|
* Cart page "Checkout" button - owns the nav into step one.
|
|
11
11
|
*/
|
|
12
|
-
export const NavCheckoutInfoBlock = defineNavClickBlock
|
|
12
|
+
export const NavCheckoutInfoBlock = defineNavClickBlock({
|
|
13
13
|
name: "nav-checkout-info",
|
|
14
14
|
description: "Clicks 'Checkout' on the cart page.",
|
|
15
|
-
checkpoint:
|
|
15
|
+
checkpoint: CheckoutInfoPage,
|
|
16
16
|
click: CartSel.checkoutBtn,
|
|
17
17
|
verify: [Trait.url({ pathname: "/checkout-step-one.html" })],
|
|
18
18
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { defineMethodBlock
|
|
2
|
-
import
|
|
1
|
+
import { defineMethodBlock } from "waygraph";
|
|
2
|
+
import { CheckoutInfoPage } from "../../../../states/checkout.states.js";
|
|
3
3
|
import { CheckoutInfoSel } from "./checkout-info.sel.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -10,13 +10,14 @@ import { CheckoutInfoSel } from "./checkout-info.sel.js";
|
|
|
10
10
|
* Fills the first name field only - self-loop on CheckoutInfoPage. Continue
|
|
11
11
|
* is its own Block (submit-checkout-info.method.block.ts).
|
|
12
12
|
*/
|
|
13
|
-
export const FillFirstNameBlock = defineMethodBlock
|
|
13
|
+
export const FillFirstNameBlock = defineMethodBlock({
|
|
14
14
|
name: "fill-first-name",
|
|
15
15
|
description: "Fills the first name field on the shipping info form.",
|
|
16
|
+
from: CheckoutInfoPage,
|
|
17
|
+
to: CheckoutInfoPage,
|
|
16
18
|
instruction: {
|
|
17
19
|
async act(page) {
|
|
18
20
|
await page.locator(CheckoutInfoSel.firstName).fill("Ada");
|
|
19
21
|
},
|
|
20
|
-
resolve: () => checkpoint("CheckoutInfoPage"),
|
|
21
22
|
},
|
|
22
23
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { defineMethodBlock
|
|
2
|
-
import
|
|
1
|
+
import { defineMethodBlock } from "waygraph";
|
|
2
|
+
import { CheckoutInfoPage } from "../../../../states/checkout.states.js";
|
|
3
3
|
import { CheckoutInfoSel } from "./checkout-info.sel.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -9,13 +9,14 @@ import { CheckoutInfoSel } from "./checkout-info.sel.js";
|
|
|
9
9
|
*
|
|
10
10
|
* Fills the last name field only - self-loop on CheckoutInfoPage.
|
|
11
11
|
*/
|
|
12
|
-
export const FillLastNameBlock = defineMethodBlock
|
|
12
|
+
export const FillLastNameBlock = defineMethodBlock({
|
|
13
13
|
name: "fill-last-name",
|
|
14
14
|
description: "Fills the last name field on the shipping info form.",
|
|
15
|
+
from: CheckoutInfoPage,
|
|
16
|
+
to: CheckoutInfoPage,
|
|
15
17
|
instruction: {
|
|
16
18
|
async act(page) {
|
|
17
19
|
await page.locator(CheckoutInfoSel.lastName).fill("Lovelace");
|
|
18
20
|
},
|
|
19
|
-
resolve: () => checkpoint("CheckoutInfoPage"),
|
|
20
21
|
},
|
|
21
22
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { defineMethodBlock
|
|
2
|
-
import
|
|
1
|
+
import { defineMethodBlock } from "waygraph";
|
|
2
|
+
import { CheckoutInfoPage } from "../../../../states/checkout.states.js";
|
|
3
3
|
import { CheckoutInfoSel } from "./checkout-info.sel.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -9,13 +9,14 @@ import { CheckoutInfoSel } from "./checkout-info.sel.js";
|
|
|
9
9
|
*
|
|
10
10
|
* Fills the postal code field only - self-loop on CheckoutInfoPage.
|
|
11
11
|
*/
|
|
12
|
-
export const FillPostalCodeBlock = defineMethodBlock
|
|
12
|
+
export const FillPostalCodeBlock = defineMethodBlock({
|
|
13
13
|
name: "fill-postal-code",
|
|
14
14
|
description: "Fills the postal code field on the shipping info form.",
|
|
15
|
+
from: CheckoutInfoPage,
|
|
16
|
+
to: CheckoutInfoPage,
|
|
15
17
|
instruction: {
|
|
16
18
|
async act(page) {
|
|
17
19
|
await page.locator(CheckoutInfoSel.postalCode).fill("1000");
|
|
18
20
|
},
|
|
19
|
-
resolve: () => checkpoint("CheckoutInfoPage"),
|
|
20
21
|
},
|
|
21
22
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { defineMethodBlock,
|
|
2
|
-
import
|
|
1
|
+
import { defineMethodBlock, Trait } from "waygraph";
|
|
2
|
+
import { CheckoutInfoPage, CheckoutOverviewPage } from "../../../../states/checkout.states.js";
|
|
3
3
|
import { CheckoutInfoSel } from "./checkout-info.sel.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -11,14 +11,15 @@ import { CheckoutInfoSel } from "./checkout-info.sel.js";
|
|
|
11
11
|
* fill-last-name / fill-postal-code (each its own Block). One Block, one
|
|
12
12
|
* action: submit.
|
|
13
13
|
*/
|
|
14
|
-
export const SubmitCheckoutInfoBlock = defineMethodBlock
|
|
14
|
+
export const SubmitCheckoutInfoBlock = defineMethodBlock({
|
|
15
15
|
name: "submit-checkout-info",
|
|
16
16
|
description: "Continues from the shipping info form to the order overview.",
|
|
17
|
+
from: CheckoutInfoPage,
|
|
18
|
+
to: CheckoutOverviewPage,
|
|
17
19
|
instruction: {
|
|
18
20
|
async act(page) {
|
|
19
21
|
await page.locator(CheckoutInfoSel.continueBtn).click();
|
|
20
22
|
},
|
|
21
|
-
resolve: () => checkpoint("CheckoutOverviewPage"),
|
|
22
23
|
verify: [Trait.url({ pathname: "/checkout-step-two.html" })],
|
|
23
24
|
},
|
|
24
25
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { defineMethodBlock,
|
|
2
|
-
import
|
|
1
|
+
import { defineMethodBlock, Trait, narrate } from "waygraph";
|
|
2
|
+
import {
|
|
3
3
|
CheckoutOverviewPage,
|
|
4
4
|
OrderComplete,
|
|
5
5
|
} from "../../../../states/checkout.states.js";
|
|
@@ -11,15 +11,13 @@ import { CheckoutOverviewSel } from "./checkout-overview.sel.js";
|
|
|
11
11
|
* Route: saucedemo-web/checkout-step-two/methods/ (= /checkout-step-two.html)
|
|
12
12
|
*
|
|
13
13
|
* Places the order on the overview page - form/finish click, not a NavBlock.
|
|
14
|
-
* Stubs use open ctx lifecycles (preferred) - not static slot maps.
|
|
15
14
|
*/
|
|
16
|
-
export const FinishOrderBlock = defineMethodBlock
|
|
17
|
-
CheckoutOverviewPage,
|
|
18
|
-
OrderComplete
|
|
19
|
-
>({
|
|
15
|
+
export const FinishOrderBlock = defineMethodBlock({
|
|
20
16
|
name: "finish-order",
|
|
21
17
|
description:
|
|
22
18
|
"Places the order and confirms the 'Thank you for your order!' completion page.",
|
|
19
|
+
from: CheckoutOverviewPage,
|
|
20
|
+
to: OrderComplete,
|
|
23
21
|
instruction: {
|
|
24
22
|
async act(page) {
|
|
25
23
|
const finishButton = page.locator(CheckoutOverviewSel.finishBtn);
|
|
@@ -27,7 +25,6 @@ export const FinishOrderBlock = defineMethodBlock<
|
|
|
27
25
|
finishButton.click(),
|
|
28
26
|
);
|
|
29
27
|
},
|
|
30
|
-
resolve: () => checkpoint("OrderComplete"),
|
|
31
28
|
verify: [
|
|
32
29
|
Trait.text(
|
|
33
30
|
CheckoutOverviewSel.completeHeader,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { definePageBlock, Trait } from "waygraph";
|
|
2
|
-
import
|
|
2
|
+
import { LoggedIn } from "../../../states/checkout.states.js";
|
|
3
3
|
import { AddToCartBlock } from "./methods/add-to-cart.effect.block.js";
|
|
4
4
|
import { RemoveFromCartBlock } from "./methods/remove-from-cart.effect.block.js";
|
|
5
5
|
import { AddAllToCartBlock } from "./methods/add-all-to-cart.method.block.js";
|
|
@@ -18,11 +18,11 @@ import { InventorySel } from "./methods/inventory-items.js";
|
|
|
18
18
|
* to LoggedIn. Cart Effects/Methods use In Checkpoint<string> (from: "*") so
|
|
19
19
|
* auto still offers them after leave/return - menu follows live DOM buttons.
|
|
20
20
|
*/
|
|
21
|
-
export const InventoryPageBlock = definePageBlock
|
|
21
|
+
export const InventoryPageBlock = definePageBlock({
|
|
22
22
|
name: "page-inventory",
|
|
23
23
|
description:
|
|
24
24
|
"Inventory catalog hub - per-item and bulk add/remove, open item detail.",
|
|
25
|
-
checkpoint:
|
|
25
|
+
checkpoint: LoggedIn,
|
|
26
26
|
verify: [
|
|
27
27
|
Trait.url({ pathname: "/inventory.html" }),
|
|
28
28
|
Trait.visible(InventorySel.list),
|
|
@@ -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 { collectAddableItems, InventorySel } from "./inventory-items.js";
|
|
4
4
|
|
|
5
5
|
type BulkObserve = "added" | "nothing";
|
|
@@ -14,12 +14,10 @@ type BulkObserve = "added" | "nothing";
|
|
|
14
14
|
* leave inventory and return, collectors re-read Add buttons from the DOM.
|
|
15
15
|
* Out: ItemInCart if the cart has items after; LoggedIn if still empty.
|
|
16
16
|
*/
|
|
17
|
-
export const AddAllToCartBlock = defineMethodBlock
|
|
18
|
-
Checkpoint<string>,
|
|
19
|
-
RemoveFromCartOutcome
|
|
20
|
-
>({
|
|
17
|
+
export const AddAllToCartBlock = defineMethodBlock({
|
|
21
18
|
name: "add-all-to-cart",
|
|
22
19
|
description: "Adds every product still showing Add to cart on this page.",
|
|
20
|
+
to: RemoveFromCartOutcome,
|
|
23
21
|
instruction: {
|
|
24
22
|
async act(page) {
|
|
25
23
|
const items = await collectAddableItems(page);
|
package/examples/saucedemo/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/examples/saucedemo/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/examples/saucedemo/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/examples/saucedemo/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
|
});
|