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
|
@@ -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
|
},
|
|
@@ -5,7 +5,7 @@ import { dirname, join } from "node:path";
|
|
|
5
5
|
|
|
6
6
|
const projectDir = join(dirname(fileURLToPath(import.meta.url)), "..");
|
|
7
7
|
|
|
8
|
-
test("waygraph auto discovers the decomposed saucedemo graph,
|
|
8
|
+
test("waygraph auto discovers the decomposed saucedemo graph, with no Block skipped", async () => {
|
|
9
9
|
const graph = await discoverGraph(projectDir);
|
|
10
10
|
|
|
11
11
|
expect(graph.nodes.map((n) => n.checkpoint).sort()).toEqual(
|
|
@@ -22,9 +22,7 @@ test("waygraph auto discovers the decomposed saucedemo graph, skipping only the
|
|
|
22
22
|
);
|
|
23
23
|
// 24 vs the earlier 15: checkout-info split into fill-first-name/
|
|
24
24
|
// fill-last-name/fill-postal-code (+2 net) plus the atomic login Blocks
|
|
25
|
-
// (fill-username/fill-password/submit-login's 2 branches)
|
|
26
|
-
// discovery still sees even though checkoutFlow itself now drives them
|
|
27
|
-
// through the ff-owner-auth composition below.
|
|
25
|
+
// (fill-username/fill-password/submit-login's 2 branches).
|
|
28
26
|
expect(graph.edges.length).toBe(24);
|
|
29
27
|
const removeEdges = graph.edges.filter((e) => e.block === "remove-from-cart");
|
|
30
28
|
expect(removeEdges).toEqual(
|
|
@@ -37,14 +35,8 @@ test("waygraph auto discovers the decomposed saucedemo graph, skipping only the
|
|
|
37
35
|
const loginFail = graph.edges.find((e) => e.block === "submit-login" && e.to === "LoginPage");
|
|
38
36
|
expect(loginFail).toMatchObject({ from: "LoginPage", to: "LoginPage", kind: "action" });
|
|
39
37
|
|
|
40
|
-
//
|
|
41
|
-
|
|
42
|
-
// only understands plain defineMethodBlock/defineEffectBlock<In, Out> generic
|
|
43
|
-
// calls, so this one Block is expected to be skipped by static discovery even
|
|
44
|
-
// though it's a real, used step (see src/blocks/saucedemo-web/ff-owner-auth.block.ts).
|
|
45
|
-
expect(graph.skipped).toEqual([
|
|
46
|
-
expect.objectContaining({ block: "ff-owner-auth" }),
|
|
47
|
-
]);
|
|
38
|
+
// Every Block has a route, so nothing is skipped.
|
|
39
|
+
expect(graph.skipped).toEqual([]);
|
|
48
40
|
|
|
49
41
|
const logout = graph.edges.find((e) => e.block === "submit-logout");
|
|
50
42
|
expect(logout).toMatchObject({ from: "LoggedIn", to: "LoginPage", kind: "action" });
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "waygraph",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.16.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "A typed graph of reusable Blocks for driving a browser through E2E flows.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"default": "./dist/index.js"
|
|
13
13
|
},
|
|
14
14
|
"./runner": {
|
|
15
|
-
"default": "./dist/runner/
|
|
15
|
+
"default": "./dist/runner/runner.js"
|
|
16
16
|
}
|
|
17
17
|
},
|
|
18
18
|
"bin": {
|
|
@@ -38,7 +38,9 @@
|
|
|
38
38
|
"!**/playwright-report",
|
|
39
39
|
"!**/playwright-report/**",
|
|
40
40
|
"!**/.waygraph-chain-*.mjs",
|
|
41
|
-
"!**/*.log"
|
|
41
|
+
"!**/*.log",
|
|
42
|
+
"!examples/**/.waygraph",
|
|
43
|
+
"!examples/**/.waygraph/**"
|
|
42
44
|
],
|
|
43
45
|
"repository": {
|
|
44
46
|
"type": "git",
|
|
@@ -46,7 +48,7 @@
|
|
|
46
48
|
},
|
|
47
49
|
"scripts": {
|
|
48
50
|
"clean": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"",
|
|
49
|
-
"build": "npm run clean && tsc -p tsconfig.build.json && node scripts/copy-
|
|
51
|
+
"build": "npm run clean && tsc -p tsconfig.build.json && node scripts/copy-ui-css.mjs",
|
|
50
52
|
"typecheck": "node bin/waygraph typecheck .",
|
|
51
53
|
"test": "npm run check:structure && npm run knip && npm run test:unit && playwright test",
|
|
52
54
|
"test:ui": "playwright test --ui",
|
|
@@ -58,7 +60,7 @@
|
|
|
58
60
|
"docs:dev": "npm run docs:api && vitepress dev docs",
|
|
59
61
|
"docs:build": "npm run docs:api && vitepress build docs",
|
|
60
62
|
"docs:preview": "vitepress preview docs",
|
|
61
|
-
"docs:api": "typedoc && node scripts/gen-deprecated.mjs",
|
|
63
|
+
"docs:api": "typedoc && node scripts/gen-deprecated.mjs && node --import tsx scripts/gen-env.mjs",
|
|
62
64
|
"knip": "knip",
|
|
63
65
|
"sync:quickstart": "node scripts/sync-quickstart.mjs"
|
|
64
66
|
},
|
|
@@ -67,8 +69,10 @@
|
|
|
67
69
|
},
|
|
68
70
|
"dependencies": {
|
|
69
71
|
"open-props": "^1.7.23",
|
|
72
|
+
"ts-morph": "^28.0.0",
|
|
70
73
|
"tsx": "^4.0.0",
|
|
71
|
-
"urlpattern-polyfill": "^10.1.0"
|
|
74
|
+
"urlpattern-polyfill": "^10.1.0",
|
|
75
|
+
"yaml": "^2.9.1"
|
|
72
76
|
},
|
|
73
77
|
"devDependencies": {
|
|
74
78
|
"@playwright/test": "^1.63.0",
|
|
@@ -50,9 +50,9 @@ When there is no app codebase to read - a production target, or a deliberately
|
|
|
50
50
|
codebase-blind engagement - discover the route/interaction structure live instead, using the
|
|
51
51
|
`waygraph auto` session tools rather than skipping planning:
|
|
52
52
|
|
|
53
|
-
1. `waygraph
|
|
53
|
+
1. `waygraph browser start --headless [--base-url <url>] --goto /` against a throwaway project dir (or the
|
|
54
54
|
target project once a `src/map/` or `src/blocks/` tree exists) - starts a driveable session, prints
|
|
55
|
-
`{sessionId, socketPath}`.
|
|
55
|
+
`{sessionId, socketPath, headless}`.
|
|
56
56
|
2. `waygraph auto status <sessionId>` to read the current menu (what Blocks/edges are already
|
|
57
57
|
discoverable) and `waygraph auto dom <sessionId>` (default `aria` mode) to see the live
|
|
58
58
|
page's actual interactive elements by role/name - this is how you find real routes and
|
|
@@ -74,12 +74,12 @@ edges (including cycles via logout / continue-shopping / back-to-products).
|
|
|
74
74
|
Prefer flags (or npm scripts) over a pile of `WAYGRAPH_*` env vars:
|
|
75
75
|
|
|
76
76
|
```bash
|
|
77
|
-
npm run demo # waygraph demo shopFlow
|
|
78
|
-
npm run demo:
|
|
77
|
+
npm run demo # waygraph demo --blocks "loginFlow then shopFlow" (headed; baseUrl from config/waygraph.config.ts)
|
|
78
|
+
npm run demo:auto-next # the same, advancing on its own
|
|
79
79
|
waygraph demo shopFlow --base-url https://www.saucedemo.com --title "Shop"
|
|
80
|
-
waygraph
|
|
80
|
+
waygraph demo loginFlow --no-auto-next
|
|
81
81
|
```
|
|
82
82
|
|
|
83
|
-
Flags beat env: `--
|
|
83
|
+
Flags beat env: `--auto-next` / `--no-auto-next`,
|
|
84
84
|
`--base-url <url>`, `--title <text>`. Default BASE_URL resolution order for
|
|
85
85
|
`demo`: `--base-url` > `WAYGRAPH_BASE_URL` > `baseUrl` in `config/waygraph.config.ts`.
|
|
@@ -11,9 +11,8 @@ Runtime is always a `Block`. Helpers are TypeScript salt + clear intent.
|
|
|
11
11
|
| `defineMethodBlock` | One-shot non-nav app step | `*.method.block.ts` under `methods/` |
|
|
12
12
|
| `defineEffectBlock` | Instance mutate + auto menu rows | `*.effect.block.ts` under `methods/` |
|
|
13
13
|
| `defineBlock` | Escape hatch: tests, unsure, probes | any |
|
|
14
|
-
| `defineActionBlock` | **Deprecated** alias of `defineMethodBlock` | — |
|
|
15
14
|
|
|
16
|
-
`defineNavBlock({ click })`
|
|
15
|
+
`defineNavBlock({ click })` and `defineNavClickBlock` build the same Block; app code reads better with `defineNavClickBlock`.
|
|
17
16
|
|
|
18
17
|
---
|
|
19
18
|
|
|
@@ -30,7 +29,7 @@ export const InventorySel = {
|
|
|
30
29
|
|
|
31
30
|
export const InventoryPageBlock = definePageBlock({
|
|
32
31
|
name: "page-inventory",
|
|
33
|
-
checkpoint:
|
|
32
|
+
checkpoint: LoggedIn,
|
|
34
33
|
verify: [Trait.url({ pathname: "/inventory.html" }), Trait.visible(InventorySel.list)],
|
|
35
34
|
methods: {
|
|
36
35
|
addToCart: () => AddToCartBlock,
|
|
@@ -73,8 +72,10 @@ Checkpoint = place on the map. `branch()` = which road to take from that place.
|
|
|
73
72
|
Conditional Out (no `branch()` needed for auto/graph):
|
|
74
73
|
|
|
75
74
|
```ts
|
|
76
|
-
defineMethodBlock
|
|
75
|
+
defineMethodBlock({
|
|
77
76
|
name: "submit-login",
|
|
77
|
+
from: LoginPage,
|
|
78
|
+
to: [LoggedIn, LoginPage],
|
|
78
79
|
instruction: {
|
|
79
80
|
async act(page, _in, mem) { /* fill + click */ },
|
|
80
81
|
async observe(page) {
|
|
@@ -93,7 +94,7 @@ defineMethodBlock<LoginPage, LoggedIn | LoginPage>({
|
|
|
93
94
|
Optional routing for `runGraph`:
|
|
94
95
|
|
|
95
96
|
```ts
|
|
96
|
-
branch(
|
|
97
|
+
branch(SubmitLoginBlock, {
|
|
97
98
|
LoggedIn: AddToCartBlock,
|
|
98
99
|
LoginPage: null, // stop
|
|
99
100
|
});
|
|
@@ -112,8 +113,9 @@ then run the Block (act reads mem as usual).
|
|
|
112
113
|
### Effect - spawn Method-like rows (Add / Remove)
|
|
113
114
|
|
|
114
115
|
```ts
|
|
115
|
-
defineEffectBlock
|
|
116
|
+
defineEffectBlock({
|
|
116
117
|
name: "add-to-cart",
|
|
118
|
+
to: ItemInCart, // no `from`: runs from anywhere
|
|
117
119
|
requires: [SelectedItem.key],
|
|
118
120
|
instruction: {
|
|
119
121
|
async act(page, _in, mem) {
|
|
@@ -140,9 +142,9 @@ Auto shows: `Add "Sauce Labs Backpack" to cart`, `Add "Bike Light"…`, …
|
|
|
140
142
|
### MemNav - spawn Nav rows (Open details)
|
|
141
143
|
|
|
142
144
|
```ts
|
|
143
|
-
defineMemNavBlock
|
|
145
|
+
defineMemNavBlock({
|
|
144
146
|
name: "nav-item-detail",
|
|
145
|
-
checkpoint:
|
|
147
|
+
checkpoint: ItemDetailPage,
|
|
146
148
|
requires: [SelectedItem.key],
|
|
147
149
|
click: (mem) => InventorySel.title(mem.get(SelectedItem.key).id),
|
|
148
150
|
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);
|