waygraph 0.15.54 → 0.16.1
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/cli/commands/browser.d.ts +2 -0
- package/dist/cli/commands/browser.js +109 -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/cli/commands/pilot.d.ts +2 -0
- package/dist/cli/commands/pilot.js +102 -0
- package/dist/{commands → cli/commands}/run.d.ts +0 -1
- package/dist/cli/commands/run.js +64 -0
- package/dist/cli/commands/session-ops.d.ts +3 -0
- package/dist/cli/commands/session-ops.js +257 -0
- package/dist/cli/commands/session.js +132 -0
- 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 +4 -12
- package/dist/{highlights → demo/narration}/demo-pace.js +5 -11
- package/dist/{highlights → demo/narration}/device.d.ts +4 -4
- package/dist/{highlights → demo/narration}/device.js +1 -1
- package/dist/demo/narration/merge.d.ts +10 -0
- package/dist/demo/narration/merge.js +67 -0
- package/dist/demo/narration/narration.d.ts +39 -0
- 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 +8 -8
- 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 +19 -0
- package/dist/demo/overlay/cursor.js +142 -0
- package/dist/demo/overlay/device-stage.d.ts +26 -0
- package/dist/demo/overlay/device-stage.js +396 -0
- package/dist/demo/overlay/inpage/banner.d.ts +2 -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 +2 -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 +10 -0
- package/dist/demo/overlay/inpage/network.js +189 -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 +2 -0
- package/dist/demo/overlay/inpage/todos.js +293 -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 +31 -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 +61 -0
- package/dist/demo/overlay/rings.js +422 -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 +103 -0
- package/dist/demo/stepper/banner-log.d.ts +35 -0
- package/dist/demo/stepper/banner-log.js +65 -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 +48 -0
- package/dist/demo/stepper/demo-log.js +292 -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 +4 -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/panel-after.d.ts +17 -0
- package/dist/demo/stepper/panel-after.js +166 -0
- package/dist/demo/stepper/panel-before.d.ts +12 -0
- package/dist/demo/stepper/panel-before.js +241 -0
- package/dist/demo/stepper/slides.d.ts +23 -0
- package/dist/demo/stepper/slides.js +233 -0
- package/dist/demo/stepper/step-panels.d.ts +69 -0
- package/dist/demo/stepper/step-panels.js +172 -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 +47 -0
- package/dist/demo/stepper/teardown.js +178 -0
- package/dist/demo/stepper/todo-advance.d.ts +15 -0
- package/dist/demo/stepper/todo-advance.js +110 -0
- package/dist/demo/stepper/view.d.ts +58 -0
- package/dist/demo/stepper/view.js +31 -0
- package/dist/demo/types.d.ts +85 -0
- package/dist/demo/verbose-log.js +15 -0
- package/dist/engine/block/action-page.d.ts +53 -0
- package/dist/engine/block/action-page.js +1 -0
- package/dist/{types.d.ts → engine/block/block.d.ts} +102 -142
- package/dist/{core → engine/block}/block.js +12 -130
- package/dist/engine/block/branch.d.ts +17 -0
- package/dist/engine/block/branch.js +40 -0
- package/dist/{core → engine/block}/compose.d.ts +9 -7
- package/dist/{core → engine/block}/compose.js +1 -1
- package/dist/engine/block/dialog.d.ts +13 -0
- package/dist/engine/block/dialog.js +37 -0
- 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/engine/flow/map-branch.d.ts +9 -0
- package/dist/engine/flow/map-branch.js +57 -0
- package/dist/{core → engine/flow}/map-builder.d.ts +34 -54
- package/dist/engine/flow/map-builder.js +242 -0
- package/dist/engine/flow/map-steps.d.ts +30 -0
- package/dist/engine/flow/map-steps.js +87 -0
- 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/{trait.js → engine/trait/trait.js} +1 -1
- package/dist/index.d.ts +88 -36
- package/dist/index.js +46 -19
- package/dist/live/auto/auto.d.ts +22 -0
- package/dist/live/auto/auto.js +207 -0
- 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/live/auto/mem.d.ts +11 -0
- package/dist/live/auto/mem.js +85 -0
- package/dist/live/auto/menu.d.ts +30 -0
- package/dist/live/auto/menu.js +335 -0
- package/dist/live/auto-session/auto-session.d.ts +113 -0
- package/dist/live/auto-session/auto-session.js +452 -0
- package/dist/live/auto-session/console.d.ts +4 -0
- package/dist/live/auto-session/console.js +41 -0
- package/dist/live/auto-session/files.d.ts +44 -0
- package/dist/live/auto-session/files.js +145 -0
- package/dist/{auto-session → live/auto-session}/helpers.d.ts +9 -5
- package/dist/{auto-session → live/auto-session}/helpers.js +18 -1
- package/dist/live/auto-session/inspect.d.ts +4 -0
- package/dist/live/auto-session/inspect.js +75 -0
- package/dist/{session/auto-session-ipc.d.ts → live/auto-session/ipc.d.ts} +8 -25
- package/dist/{session/auto-session-ipc.js → live/auto-session/ipc.js} +36 -161
- package/dist/live/auto-session/open-browser.d.ts +6 -0
- package/dist/live/auto-session/open-browser.js +47 -0
- 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 +5 -4
- package/dist/{traverse/run.d.ts → live/traverse/traverse.d.ts} +1 -1
- package/dist/live/traverse/traverse.js +212 -0
- package/dist/live/traverse/worker.d.ts +37 -0
- package/dist/live/traverse/worker.js +200 -0
- 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 +14 -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/session.d.ts +0 -193
- package/dist/auto-session/session.js +0 -719
- 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/session.js +0 -600
- 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/map-builder.js +0 -383
- 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/run-phase.d.ts +0 -43
- 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/auto-explore-run.d.ts +0 -40
- package/dist/session/auto-explore-run.js +0 -707
- package/dist/session/step-overlay.d.ts +0 -37
- package/dist/session/step-overlay.js +0 -244
- package/dist/traverse/run.js +0 -423
- 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/{traverse → live/traverse}/coverage.d.ts +0 -0
- /package/dist/{traverse → live/traverse}/coverage.js +0 -0
- /package/dist/{traverse → live/traverse}/lease.d.ts +0 -0
- /package/dist/{traverse → live/traverse}/lease.js +0 -0
- /package/dist/{session/block-inject.d.ts → manifest/roots.d.ts} +0 -0
- /package/dist/{blocks-select.d.ts → manifest/select.d.ts} +0 -0
- /package/dist/{blocks-select.js → manifest/select.js} +0 -0
- /package/dist/{browser.d.ts → runtime/browser.d.ts} +0 -0
- /package/dist/{env-file.d.ts → runtime/env-file.d.ts} +0 -0
- /package/dist/{playwright-config.js → runtime/playwright-config.js} +0 -0
- /package/dist/{playwright.config.d.ts → runtime/playwright.config.d.ts} +0 -0
- /package/dist/{video-dir.d.ts → runtime/video-dir.d.ts} +0 -0
- /package/dist/{webserver.d.ts → runtime/webserver.d.ts} +0 -0
package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineNavClickBlock, Trait } from "waygraph";
|
|
2
|
-
import
|
|
2
|
+
import { LoggedIn } from "../../../states/checkout.states.js";
|
|
3
3
|
import { ItemDetailSel } from "./item-detail.sel.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -10,10 +10,10 @@ import { ItemDetailSel } from "./item-detail.sel.js";
|
|
|
10
10
|
* click, not url - order-complete "Back Home" proves the button path
|
|
11
11
|
* (a url NavBlock would teleport without exercising the control).
|
|
12
12
|
*/
|
|
13
|
-
export const NavBackToProductsBlock = defineNavClickBlock
|
|
13
|
+
export const NavBackToProductsBlock = defineNavClickBlock({
|
|
14
14
|
name: "nav-back-to-products",
|
|
15
15
|
description: "Clicks 'Back Home' on the order confirmation page.",
|
|
16
|
-
checkpoint:
|
|
16
|
+
checkpoint: LoggedIn,
|
|
17
17
|
click: ItemDetailSel.backToProductsBtn,
|
|
18
18
|
verify: [Trait.url({ pathname: "/inventory.html" })],
|
|
19
19
|
});
|
package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineNavClickBlock, Trait } from "waygraph";
|
|
2
|
-
import
|
|
2
|
+
import { LoggedIn } from "../../../states/checkout.states.js";
|
|
3
3
|
import { ItemDetailSel } from "./item-detail.sel.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -9,10 +9,10 @@ import { ItemDetailSel } from "./item-detail.sel.js";
|
|
|
9
9
|
*
|
|
10
10
|
* click, not url - cart page "Continue Shopping" proves the app's own path.
|
|
11
11
|
*/
|
|
12
|
-
export const NavContinueShoppingBlock = defineNavClickBlock
|
|
12
|
+
export const NavContinueShoppingBlock = defineNavClickBlock({
|
|
13
13
|
name: "nav-continue-shopping",
|
|
14
14
|
description: "Clicks 'Continue Shopping' on the cart page.",
|
|
15
|
-
checkpoint:
|
|
15
|
+
checkpoint: LoggedIn,
|
|
16
16
|
click: ItemDetailSel.continueShoppingBtn,
|
|
17
17
|
verify: [Trait.url({ pathname: "/inventory.html" })],
|
|
18
18
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { defineMethodBlock
|
|
2
|
-
import
|
|
1
|
+
import { defineMethodBlock } from "waygraph";
|
|
2
|
+
import { LoginPage } from "../../../states/checkout.states.js";
|
|
3
3
|
import { LoginCreds } from "../../../states/checkout.mem-keys.js";
|
|
4
4
|
import { LoginSel } from "./login.sel.js";
|
|
5
5
|
|
|
@@ -11,15 +11,16 @@ import { LoginSel } from "./login.sel.js";
|
|
|
11
11
|
* Fills the password field only - self-loop on LoginPage. See
|
|
12
12
|
* fill-username.method.block.ts for why this is split from submit.
|
|
13
13
|
*/
|
|
14
|
-
export const FillPasswordBlock = defineMethodBlock
|
|
14
|
+
export const FillPasswordBlock = defineMethodBlock({
|
|
15
15
|
name: "fill-password",
|
|
16
16
|
description: "Fills the password field on the login form.",
|
|
17
|
+
from: LoginPage,
|
|
18
|
+
to: LoginPage,
|
|
17
19
|
requires: [LoginCreds.key],
|
|
18
20
|
instruction: {
|
|
19
21
|
async act(page, _input, mem) {
|
|
20
22
|
const { password } = mem.get(LoginCreds.key);
|
|
21
23
|
await page.locator(LoginSel.password).fill(password);
|
|
22
24
|
},
|
|
23
|
-
resolve: () => checkpoint("LoginPage"),
|
|
24
25
|
},
|
|
25
26
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { defineMethodBlock
|
|
2
|
-
import
|
|
1
|
+
import { defineMethodBlock } from "waygraph";
|
|
2
|
+
import { LoginPage } from "../../../states/checkout.states.js";
|
|
3
3
|
import { LoginCreds } from "../../../states/checkout.mem-keys.js";
|
|
4
4
|
import { LoginSel } from "./login.sel.js";
|
|
5
5
|
|
|
@@ -13,15 +13,16 @@ import { LoginSel } from "./login.sel.js";
|
|
|
13
13
|
* graph/demo show fill vs submit as real, distinct steps instead of one
|
|
14
14
|
* Block doing "input username and password and login at the same time".
|
|
15
15
|
*/
|
|
16
|
-
export const FillUsernameBlock = defineMethodBlock
|
|
16
|
+
export const FillUsernameBlock = defineMethodBlock({
|
|
17
17
|
name: "fill-username",
|
|
18
18
|
description: "Fills the username field on the login form.",
|
|
19
|
+
from: LoginPage,
|
|
20
|
+
to: LoginPage,
|
|
19
21
|
requires: [LoginCreds.key],
|
|
20
22
|
instruction: {
|
|
21
23
|
async act(page, _input, mem) {
|
|
22
24
|
const { username } = mem.get(LoginCreds.key);
|
|
23
25
|
await page.locator(LoginSel.username).fill(username);
|
|
24
26
|
},
|
|
25
|
-
resolve: () => checkpoint("LoginPage"),
|
|
26
27
|
},
|
|
27
28
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineMethodBlock, checkpoint, Trait } from "waygraph";
|
|
2
|
-
import
|
|
2
|
+
import {
|
|
3
3
|
LoginPage,
|
|
4
4
|
LoginSubmitOutcome,
|
|
5
5
|
} from "../../../states/checkout.states.js";
|
|
@@ -17,12 +17,11 @@ type LoginObserve = "success" | "failure";
|
|
|
17
17
|
* already did that). One Block, one action: submit.
|
|
18
18
|
* Branches: good creds -> LoggedIn; bad/locked -> LoginPage with error banner.
|
|
19
19
|
*/
|
|
20
|
-
export const SubmitLoginBlock = defineMethodBlock
|
|
21
|
-
LoginPage,
|
|
22
|
-
LoginSubmitOutcome
|
|
23
|
-
>({
|
|
20
|
+
export const SubmitLoginBlock = defineMethodBlock({
|
|
24
21
|
name: "submit-login",
|
|
25
22
|
description: "Submits the login form; stays on LoginPage when auth fails.",
|
|
23
|
+
from: LoginPage,
|
|
24
|
+
to: LoginSubmitOutcome,
|
|
26
25
|
instruction: {
|
|
27
26
|
async act(page) {
|
|
28
27
|
// noWaitAfter: observe owns the inventory URL wait. Default click
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { defineMethodBlock,
|
|
2
|
-
import
|
|
1
|
+
import { defineMethodBlock, Trait } from "waygraph";
|
|
2
|
+
import { LoggedIn, LoginPage } from "../../../states/checkout.states.js";
|
|
3
3
|
import { LoginSel } from "./login.sel.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -9,15 +9,16 @@ import { LoginSel } from "./login.sel.js";
|
|
|
9
9
|
*
|
|
10
10
|
* Burger menu Logout - real cycle back to LoginPage (same Checkpoint nav-login lands on).
|
|
11
11
|
*/
|
|
12
|
-
export const SubmitLogoutBlock = defineMethodBlock
|
|
12
|
+
export const SubmitLogoutBlock = defineMethodBlock({
|
|
13
13
|
name: "submit-logout",
|
|
14
14
|
description: "Opens the burger menu and logs out.",
|
|
15
|
+
from: LoggedIn,
|
|
16
|
+
to: LoginPage,
|
|
15
17
|
instruction: {
|
|
16
18
|
async act(page) {
|
|
17
19
|
await page.locator(LoginSel.burgerMenuButton).click();
|
|
18
20
|
await page.locator(LoginSel.logoutLink).click();
|
|
19
21
|
},
|
|
20
|
-
resolve: () => checkpoint("LoginPage"),
|
|
21
22
|
verify: [Trait.visible(LoginSel.loginButton)],
|
|
22
23
|
},
|
|
23
24
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { definePageBlock, Trait } from "waygraph";
|
|
2
|
-
import
|
|
2
|
+
import { LoginPage } from "../../states/checkout.states.js";
|
|
3
3
|
import { FillUsernameBlock } from "./methods/fill-username.method.block.js";
|
|
4
4
|
import { FillPasswordBlock } from "./methods/fill-password.method.block.js";
|
|
5
5
|
import { SubmitLoginBlock } from "./methods/submit-login.method.block.js";
|
|
@@ -17,10 +17,10 @@ import { LoginSel } from "./methods/login.sel.js";
|
|
|
17
17
|
* and submits. Name stays `nav-login` so existing flows / chain specs keep
|
|
18
18
|
* working.
|
|
19
19
|
*/
|
|
20
|
-
export const NavLoginBlock = definePageBlock
|
|
20
|
+
export const NavLoginBlock = definePageBlock({
|
|
21
21
|
name: "nav-login",
|
|
22
22
|
description: "Goes to the Swag Labs login page.",
|
|
23
|
-
checkpoint:
|
|
23
|
+
checkpoint: LoginPage,
|
|
24
24
|
url: "/",
|
|
25
25
|
verify: [Trait.visible(LoginSel.loginButton)],
|
|
26
26
|
methods: {
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { checkpoint, defineApiBlock } from "waygraph";
|
|
2
|
-
import type { Checkpoint, StubCtx } from "waygraph";
|
|
3
2
|
import { engine } from "../../config/waygraph.config.js";
|
|
4
3
|
import { loginFlow } from "./login.flow.js";
|
|
5
4
|
|
|
@@ -15,24 +14,27 @@ import { loginFlow } from "./login.flow.js";
|
|
|
15
14
|
* hits a well-known public REST test API (jsonplaceholder) purely to prove
|
|
16
15
|
* the mechanism - a real project would point `call` at its own backend.
|
|
17
16
|
*/
|
|
18
|
-
export
|
|
19
|
-
export type
|
|
17
|
+
export const BackendHealthy = checkpoint("BackendHealthy");
|
|
18
|
+
export type BackendHealthy = typeof BackendHealthy;
|
|
19
|
+
export const BackendDown = checkpoint("BackendDown");
|
|
20
|
+
export type BackendDown = typeof BackendDown;
|
|
20
21
|
|
|
21
|
-
const CheckBackendHealth = defineApiBlock
|
|
22
|
+
const CheckBackendHealth = defineApiBlock({
|
|
22
23
|
name: "check-backend-health",
|
|
24
|
+
to: [BackendHealthy, BackendDown],
|
|
23
25
|
call: ({ request }) =>
|
|
24
26
|
request.get("https://jsonplaceholder.typicode.com/todos/1"),
|
|
25
|
-
resolve: (result) =>
|
|
26
|
-
result.ok ? checkpoint("BackendHealthy") : checkpoint("BackendDown"),
|
|
27
|
-
stubBefore: (ctx: StubCtx<BackendHealthy | BackendDown>) => {
|
|
28
|
-
ctx.title("Checking backend health · real HTTP request, no browser");
|
|
29
|
-
},
|
|
27
|
+
resolve: (result) => (result.ok ? BackendHealthy : BackendDown),
|
|
30
28
|
});
|
|
31
29
|
|
|
32
30
|
export const apiDemoEpisode = engine
|
|
33
31
|
.map()
|
|
34
32
|
.start()
|
|
35
|
-
.method(
|
|
33
|
+
.method(
|
|
34
|
+
CheckBackendHealth.stubBefore((ctx) => {
|
|
35
|
+
ctx.title("Checking backend health · real HTTP request, no browser");
|
|
36
|
+
}),
|
|
37
|
+
)
|
|
36
38
|
.end();
|
|
37
39
|
|
|
38
40
|
export const apiDemoFlow = engine
|
|
@@ -1,19 +1,29 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { checkpoint } from "waygraph";
|
|
2
2
|
|
|
3
3
|
// One Checkpoint per real state the target app can be in - kept together so the
|
|
4
4
|
// whole checkout flow's state space reads in one place, the same reason a
|
|
5
5
|
// backend keeps its models together instead of scattered across handlers.
|
|
6
6
|
// `Start` is waygraph's own exported type, not redeclared here.
|
|
7
7
|
|
|
8
|
-
export
|
|
9
|
-
export type
|
|
8
|
+
export const LoginPage = checkpoint("LoginPage");
|
|
9
|
+
export type LoginPage = typeof LoginPage;
|
|
10
|
+
export const LoggedIn = checkpoint("LoggedIn");
|
|
11
|
+
export type LoggedIn = typeof LoggedIn;
|
|
10
12
|
/** submit-login: inventory on success, login form + error banner on auth failure. */
|
|
11
|
-
export
|
|
12
|
-
export type
|
|
13
|
+
export const LoginSubmitOutcome = [LoggedIn, LoginPage] as const;
|
|
14
|
+
export type LoginSubmitOutcome = (typeof LoginSubmitOutcome)[number];
|
|
15
|
+
export const ItemInCart = checkpoint("ItemInCart");
|
|
16
|
+
export type ItemInCart = typeof ItemInCart;
|
|
13
17
|
/** remove-from-cart: still has items → ItemInCart; empty cart → LoggedIn. */
|
|
14
|
-
export
|
|
15
|
-
export type
|
|
16
|
-
export
|
|
17
|
-
export type
|
|
18
|
-
export
|
|
19
|
-
export type
|
|
18
|
+
export const RemoveFromCartOutcome = [ItemInCart, LoggedIn] as const;
|
|
19
|
+
export type RemoveFromCartOutcome = (typeof RemoveFromCartOutcome)[number];
|
|
20
|
+
export const CartPage = checkpoint("CartPage");
|
|
21
|
+
export type CartPage = typeof CartPage;
|
|
22
|
+
export const CheckoutInfoPage = checkpoint("CheckoutInfoPage");
|
|
23
|
+
export type CheckoutInfoPage = typeof CheckoutInfoPage;
|
|
24
|
+
export const CheckoutOverviewPage = checkpoint("CheckoutOverviewPage");
|
|
25
|
+
export type CheckoutOverviewPage = typeof CheckoutOverviewPage;
|
|
26
|
+
export const ItemDetailPage = checkpoint("ItemDetailPage");
|
|
27
|
+
export type ItemDetailPage = typeof ItemDetailPage;
|
|
28
|
+
export const OrderComplete = checkpoint("OrderComplete");
|
|
29
|
+
export type OrderComplete = typeof OrderComplete;
|
|
@@ -40,7 +40,7 @@ export const deviceShowcase = {
|
|
|
40
40
|
before: (ctx: StubCtx) => {
|
|
41
41
|
ctx.title("Signing in · mobile");
|
|
42
42
|
ctx.device("mobile");
|
|
43
|
-
ctx.portrait
|
|
43
|
+
ctx.orientation("portrait");
|
|
44
44
|
ctx.todos("saucedemo", ...checklist(0, 0));
|
|
45
45
|
ctx.zoom(1.35);
|
|
46
46
|
const fromMem = ctx.mem?.get(LoginCreds.key)?.username;
|
|
@@ -93,8 +93,8 @@ export const deviceShowcase = {
|
|
|
93
93
|
});
|
|
94
94
|
},
|
|
95
95
|
after: (ctx: StubCtx) => {
|
|
96
|
-
ctx.
|
|
97
|
-
ctx.landscape
|
|
96
|
+
ctx.title("Inventory · landscape");
|
|
97
|
+
ctx.orientation("landscape");
|
|
98
98
|
ctx.todos("saucedemo", ...checklist(3, 3));
|
|
99
99
|
ctx.ring("shelf", {
|
|
100
100
|
selector: ".inventory_list",
|
|
@@ -111,7 +111,7 @@ export const deviceShowcase = {
|
|
|
111
111
|
before: (ctx: StubCtx) => {
|
|
112
112
|
ctx.title("Pick a product · tablet");
|
|
113
113
|
ctx.device("tablet");
|
|
114
|
-
ctx.portrait
|
|
114
|
+
ctx.orientation("portrait");
|
|
115
115
|
ctx.todos("saucedemo", ...checklist(3, 3));
|
|
116
116
|
ctx.zoom(1.35);
|
|
117
117
|
ctx.zoomOut(false);
|
|
@@ -138,7 +138,7 @@ export const deviceShowcase = {
|
|
|
138
138
|
});
|
|
139
139
|
},
|
|
140
140
|
after: (ctx: StubCtx) => {
|
|
141
|
-
ctx.
|
|
141
|
+
ctx.title("In the cart");
|
|
142
142
|
ctx.todos("saucedemo", ...checklist(4, 4));
|
|
143
143
|
ctx.zoomOut(false);
|
|
144
144
|
ctx.ring("badge", {
|
|
@@ -155,7 +155,7 @@ export const deviceShowcase = {
|
|
|
155
155
|
openCart: {
|
|
156
156
|
before: (ctx: StubCtx) => {
|
|
157
157
|
ctx.title("Open cart · landscape");
|
|
158
|
-
ctx.landscape
|
|
158
|
+
ctx.orientation("landscape");
|
|
159
159
|
ctx.todos("saucedemo", ...checklist(5, 5));
|
|
160
160
|
ctx.zoom(1.4);
|
|
161
161
|
ctx.zoomOut(false);
|
|
@@ -167,15 +167,14 @@ export const deviceShowcase = {
|
|
|
167
167
|
tone: "planned",
|
|
168
168
|
focus: true,
|
|
169
169
|
zoomOut: false,
|
|
170
|
-
followMouse: false,
|
|
171
170
|
weight: "bold",
|
|
172
171
|
gesture: "tap",
|
|
173
172
|
},
|
|
174
173
|
});
|
|
175
174
|
},
|
|
176
175
|
after: (ctx: StubCtx) => {
|
|
177
|
-
ctx.
|
|
178
|
-
ctx.
|
|
176
|
+
ctx.title("Your cart · desktop");
|
|
177
|
+
ctx.hideDevice();
|
|
179
178
|
ctx.hideTodos();
|
|
180
179
|
ctx.zoomOut(true);
|
|
181
180
|
ctx.ring("items", {
|
|
@@ -185,7 +184,6 @@ export const deviceShowcase = {
|
|
|
185
184
|
tone: "success",
|
|
186
185
|
focus: true,
|
|
187
186
|
zoomOut: true,
|
|
188
|
-
followMouse: false,
|
|
189
187
|
duration: true,
|
|
190
188
|
});
|
|
191
189
|
},
|
|
@@ -29,6 +29,7 @@ Change each `_nav.block.ts`'s `url` from the local `file://` path to a real one,
|
|
|
29
29
|
`package.json`'s `"waygraph"` field - see the main docs' "Project config" section). That file also
|
|
30
30
|
holds the test settings (`testDir`, `webServer`, `playwright: { workers, timeout, ... }`), so the
|
|
31
31
|
project needs no `playwright.config.ts`. Keep each
|
|
32
|
-
`src/map/` folder matching the URL it represents (`waygraph map` enforces this).
|
|
32
|
+
`src/map/` folder matching the URL it represents (`waygraph map` enforces this). `(external)/hoppscotch` and
|
|
33
|
+
`(external)/mailpit` keep their own `_states.ts` / `_keys.ts`, so `waygraph map pack <group>` can turn either into a package.
|
|
33
34
|
|
|
34
35
|
Docs: https://deviate-dv8.github.io/waygraph/
|
|
@@ -24,9 +24,9 @@ Next.js route groups) and never appear in a URL or Checkpoint name.
|
|
|
24
24
|
│ │ │ │ ├── assert-hello.method.block.ts # + stubs + YAP slide
|
|
25
25
|
│ │ │ │ └── assert-item-added.method.block.ts
|
|
26
26
|
│ │ │ └── docs/ # a second page, same shape
|
|
27
|
-
│ │ ├── (external)/mailpit/ # a different origin (mail catcher)
|
|
28
|
-
│ │ └── (external)/hoppscotch/ # API client,
|
|
29
|
-
│ ├── states/ #
|
|
27
|
+
│ │ ├── (external)/mailpit/ # a different origin (mail catcher); owns _states.ts + _keys.ts
|
|
28
|
+
│ │ └── (external)/hoppscotch/ # API client, needs the hoppscotch extension; owns _states.ts + _keys.ts
|
|
29
|
+
│ ├── states/ # the app's Checkpoints + mem keys
|
|
30
30
|
│ └── flows/ # use cases, one file per scenario (see flows/README.md)
|
|
31
31
|
│ ├── home/ # a page: hello, cart
|
|
32
32
|
│ ├── (user-stories)/ # flows that cross pages
|
|
@@ -45,9 +45,10 @@ page folder uses, so any agent or teammate knows where to look without asking.
|
|
|
45
45
|
| Add an action on a page | one file in that page's `_methods/` |
|
|
46
46
|
| Verify a state (button disabled, error shown) | `defineAssertBlock` + `Trait.disabled` / `Trait.enabled` |
|
|
47
47
|
| Define a use case (success, failed, bad input) | one `*.flow.ts` in `src/flows/<page>/`, or `(user-stories)/` for one that crosses pages |
|
|
48
|
-
| Give a flow fake data | `registerMemStub(key, fake)` + `memStub: true` in the flow's options (docs:
|
|
48
|
+
| Give a flow fake data | `registerMemStub(key, fake)` in a `*.mem-stubs.ts` file + `memStub: true` in the flow's options; live sessions use the same fakes as defaults (docs: the reference, Engine features, "memStub") |
|
|
49
49
|
| Explore by hand | `npm run auto` (headed) or `npm run auto:cli` |
|
|
50
50
|
| Check your work | `npm run check`, `npm run graph`, `waygraph map` |
|
|
51
|
+
| Share a tool's map with another project | `waygraph map pack hoppscotch`, then publish `.waygraph/packages/hoppscotch` |
|
|
51
52
|
|
|
52
53
|
`waygraph map` fails if a folder path stops matching the real URL it claims to represent.
|
|
53
54
|
Full convention: https://deviate-dv8.github.io/waygraph/consumer.html
|
|
@@ -26,6 +26,7 @@ const config = defineConfig(({ env }) => ({
|
|
|
26
26
|
// video: { viewport: "1920x1080" },
|
|
27
27
|
// },
|
|
28
28
|
// webServer: { command: "npm start", port: 3000 }, // started around test / run / demo / auto
|
|
29
|
+
// runLog: false, // each run is logged to .waygraph/runs/ (what Waygraph UI shows)
|
|
29
30
|
|
|
30
31
|
// Another config for another environment: config/waygraph.staging.config.ts, chosen with `waygraph test --config staging`.
|
|
31
32
|
|
|
@@ -32,8 +32,8 @@ src/flows/
|
|
|
32
32
|
|
|
33
33
|
## Writing one
|
|
34
34
|
|
|
35
|
-
- Build it with `engine.map({ memStub })…end()`; nest another with `.flow(sub, { reset: true })
|
|
36
|
-
|
|
35
|
+
- Build it with `engine.map({ memStub })…end()`; nest another with `.flow(sub, { reset: true })`;
|
|
36
|
+
`.end()` takes nothing.
|
|
37
37
|
- The flow's name and narration are ctx stubs chained on the Block where they apply: `ctx.title("…")`, `ctx.ring(…)`.
|
|
38
38
|
- A flow expected to fail (a locked-out user) says so in `map({ expectedFailure: "…" })`.
|
|
39
39
|
- A step's speed in the demo is `{ pace }`: `.method(FillBlock, { pace: "blitz" })`.
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { defineNavBlock, Trait } from "waygraph";
|
|
2
|
-
import
|
|
2
|
+
import { Docs } from "../../../states/demo.states.js";
|
|
3
3
|
import { DocsSel, DOCS_URL } from "./_sel.js";
|
|
4
4
|
|
|
5
|
-
export const NavDocsBlock = defineNavBlock
|
|
5
|
+
export const NavDocsBlock = defineNavBlock({
|
|
6
6
|
name: "nav-docs",
|
|
7
7
|
description: "Opens the docs page (Waygraph Map convention demo).",
|
|
8
|
-
checkpoint:
|
|
8
|
+
checkpoint: Docs,
|
|
9
9
|
url: DOCS_URL,
|
|
10
10
|
verify: [Trait.visible(DocsSel.heading)],
|
|
11
11
|
});
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { definePageBlock, Trait } from "waygraph";
|
|
2
|
-
import
|
|
2
|
+
import { Docs } from "../../../states/demo.states.js";
|
|
3
3
|
import { DocsSel } from "./_sel.js";
|
|
4
4
|
|
|
5
|
-
export const DocsPageBlock = definePageBlock
|
|
5
|
+
export const DocsPageBlock = definePageBlock({
|
|
6
6
|
name: "page-docs",
|
|
7
7
|
description: "Docs hub - Waygraph Map convention demo.",
|
|
8
|
-
checkpoint:
|
|
8
|
+
checkpoint: Docs,
|
|
9
9
|
verify: [Trait.visible(DocsSel.heading)],
|
|
10
10
|
});
|
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
import {
|
|
2
2
|
defineEffectBlock,
|
|
3
|
-
checkpoint,
|
|
4
3
|
type WaygraphInstanceOption,
|
|
5
4
|
} from "waygraph";
|
|
6
|
-
import
|
|
5
|
+
import { CanAddItem, ItemInCart } from "../../../../states/demo.states.js";
|
|
7
6
|
import { SelectedItem } from "../../../../states/demo.mem-keys.js";
|
|
8
7
|
import { DemoSel } from "../_sel.js";
|
|
9
8
|
|
|
10
9
|
/** `waygraph auto` lists one "Add …" row per live Add button via `instanceOptions`. */
|
|
11
|
-
export const AddItemBlock = defineEffectBlock
|
|
10
|
+
export const AddItemBlock = defineEffectBlock({
|
|
12
11
|
name: "add-item",
|
|
13
12
|
description: "Adds the mem-selected catalog item to the cart.",
|
|
13
|
+
from: CanAddItem,
|
|
14
|
+
to: ItemInCart,
|
|
14
15
|
requires: [SelectedItem.key],
|
|
15
16
|
instruction: {
|
|
16
17
|
async act(page, _input, mem) {
|
|
17
18
|
const { id } = mem.get(SelectedItem.key);
|
|
18
19
|
await page.locator(DemoSel.addBtn(id)).click();
|
|
19
20
|
},
|
|
20
|
-
resolve: () => checkpoint("ItemInCart"),
|
|
21
21
|
verify: [
|
|
22
22
|
{
|
|
23
23
|
name: "item-added",
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { defineAssertBlock, Trait } from "waygraph";
|
|
2
|
-
import
|
|
2
|
+
import { Home } from "../../../../states/demo.states.js";
|
|
3
3
|
import { DemoSel } from "../_sel.js";
|
|
4
4
|
|
|
5
5
|
/** Heading still shows after arrival; the slide is a YAP caption for the demo overlay. */
|
|
6
|
-
export const AssertHelloBlock = defineAssertBlock
|
|
6
|
+
export const AssertHelloBlock = defineAssertBlock({
|
|
7
7
|
name: "assert-hello",
|
|
8
8
|
description: "Confirms the hello heading is still visible after arrival.",
|
|
9
|
-
checkpoint:
|
|
9
|
+
checkpoint: Home,
|
|
10
10
|
waitForHeading: "Hello Waygraph",
|
|
11
11
|
verify: [Trait.text(DemoSel.title, "Hello Waygraph"), Trait.visible(DemoSel.sub)],
|
|
12
12
|
slides: [
|
package/templates/scaffold/src/map/(app_base)/home/_methods/assert-item-added.method.block.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineAssertBlock, Trait, type Trait as TraitType } from "waygraph";
|
|
2
|
-
import
|
|
2
|
+
import { ItemInCart } from "../../../../states/demo.states.js";
|
|
3
3
|
import { SelectedItem } from "../../../../states/demo.mem-keys.js";
|
|
4
4
|
import { DemoSel } from "../_sel.js";
|
|
5
5
|
|
|
@@ -13,9 +13,9 @@ const removeButtonVisibleForSelectedItem: TraitType = {
|
|
|
13
13
|
};
|
|
14
14
|
|
|
15
15
|
/** The mem-selected item's own Remove button appeared and the cart count reflects it. */
|
|
16
|
-
export const AssertItemAddedBlock = defineAssertBlock
|
|
16
|
+
export const AssertItemAddedBlock = defineAssertBlock({
|
|
17
17
|
name: "assert-item-added",
|
|
18
18
|
description: "Confirms the mem-selected item's own Remove button appeared and the cart count reflects it.",
|
|
19
|
-
checkpoint:
|
|
19
|
+
checkpoint: ItemInCart,
|
|
20
20
|
verify: [removeButtonVisibleForSelectedItem, Trait.text(DemoSel.cartCount, "1")],
|
|
21
21
|
});
|
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
import { defineMethodBlock,
|
|
2
|
-
import
|
|
1
|
+
import { defineMethodBlock, Trait } from "waygraph";
|
|
2
|
+
import { ItemInCart, CartEmpty } from "../../../../states/demo.states.js";
|
|
3
3
|
import { DemoSel } from "../_sel.js";
|
|
4
4
|
|
|
5
|
-
export const ClearCartBlock = defineMethodBlock
|
|
5
|
+
export const ClearCartBlock = defineMethodBlock({
|
|
6
6
|
name: "clear-cart",
|
|
7
7
|
description: "Clears every item via the Clear cart control.",
|
|
8
|
+
from: ItemInCart,
|
|
9
|
+
to: CartEmpty,
|
|
8
10
|
instruction: {
|
|
9
11
|
async act(page) {
|
|
10
12
|
await page.locator(DemoSel.clear).click();
|
|
11
13
|
},
|
|
12
|
-
resolve: () => checkpoint("CartEmpty"),
|
|
13
14
|
verify: [Trait.text(DemoSel.cartCount, "0")],
|
|
14
15
|
},
|
|
15
16
|
});
|
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
import {
|
|
2
2
|
defineEffectBlock,
|
|
3
|
-
checkpoint,
|
|
4
3
|
type WaygraphInstanceOption,
|
|
5
4
|
} from "waygraph";
|
|
6
|
-
import
|
|
5
|
+
import { CartEmpty, ItemInCart } from "../../../../states/demo.states.js";
|
|
7
6
|
import { SelectedItem } from "../../../../states/demo.mem-keys.js";
|
|
8
7
|
import { DemoSel } from "../_sel.js";
|
|
9
8
|
|
|
10
|
-
export const RemoveItemBlock = defineEffectBlock
|
|
9
|
+
export const RemoveItemBlock = defineEffectBlock({
|
|
11
10
|
name: "remove-item",
|
|
12
11
|
description: "Removes the mem-selected catalog item from the cart.",
|
|
12
|
+
from: ItemInCart,
|
|
13
|
+
to: CartEmpty,
|
|
13
14
|
requires: [SelectedItem.key],
|
|
14
15
|
instruction: {
|
|
15
16
|
async act(page, _input, mem) {
|
|
16
17
|
const { id } = mem.get(SelectedItem.key);
|
|
17
18
|
await page.locator(DemoSel.removeBtn(id)).click();
|
|
18
19
|
},
|
|
19
|
-
resolve: () => checkpoint("CartEmpty"),
|
|
20
20
|
verify: [
|
|
21
21
|
{
|
|
22
22
|
name: "item-removed",
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { defineNavBlock, Trait } from "waygraph";
|
|
2
|
-
import
|
|
2
|
+
import { Home } from "../../../states/demo.states.js";
|
|
3
3
|
import { DemoSel, HOME_URL } from "./_sel.js";
|
|
4
4
|
|
|
5
|
-
export const NavHomeBlock = defineNavBlock
|
|
5
|
+
export const NavHomeBlock = defineNavBlock({
|
|
6
6
|
name: "nav-home",
|
|
7
7
|
description: "Opens the offline catalog page (file://, no server).",
|
|
8
|
-
checkpoint:
|
|
8
|
+
checkpoint: Home,
|
|
9
9
|
url: HOME_URL,
|
|
10
10
|
verify: [Trait.text(DemoSel.title, "Hello Waygraph"), Trait.visible(DemoSel.catalog)],
|
|
11
11
|
});
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { definePageBlock, Trait } from "waygraph";
|
|
2
|
-
import
|
|
2
|
+
import { Home } from "../../../states/demo.states.js";
|
|
3
3
|
import { DemoSel } from "./_sel.js";
|
|
4
4
|
import { AddItemBlock } from "./_methods/add-item.effect.block.js";
|
|
5
5
|
import { RemoveItemBlock } from "./_methods/remove-item.effect.block.js";
|
|
6
6
|
import { ClearCartBlock } from "./_methods/clear-cart.method.block.js";
|
|
7
7
|
import { AssertHelloBlock } from "./_methods/assert-hello.method.block.js";
|
|
8
8
|
|
|
9
|
-
export const HomePageBlock = definePageBlock
|
|
9
|
+
export const HomePageBlock = definePageBlock({
|
|
10
10
|
name: "page-home",
|
|
11
11
|
description: "Offline home hub - add/remove effects, clear, assert-hello.",
|
|
12
|
-
checkpoint:
|
|
12
|
+
checkpoint: Home,
|
|
13
13
|
verify: [Trait.visible(DemoSel.catalog)],
|
|
14
14
|
methods: {
|
|
15
15
|
addItem: () => AddItemBlock,
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { defineNavBlock, Trait } from "waygraph";
|
|
2
|
-
import
|
|
3
|
-
import { EmailLink } from "
|
|
2
|
+
import { HomeVerified } from "../../../states/demo.states.js";
|
|
3
|
+
import { EmailLink } from "../../(external)/mailpit/_keys.js";
|
|
4
4
|
import { DemoSel } from "./_sel.js";
|
|
5
5
|
|
|
6
6
|
/** Follows the link `extract-email-link` put in mem. No `requires`: an earlier Block in the chain produces it. */
|
|
7
|
-
export const NavVerificationLinkBlock = defineNavBlock
|
|
7
|
+
export const NavVerificationLinkBlock = defineNavBlock({
|
|
8
8
|
name: "nav-verification-link",
|
|
9
|
-
checkpoint:
|
|
9
|
+
checkpoint: HomeVerified,
|
|
10
10
|
url: (mem) => mem.get(EmailLink.key).url,
|
|
11
11
|
verify: [Trait.visible(DemoSel.verifiedBanner)],
|
|
12
12
|
});
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { key, keyGroup } from "waygraph";
|
|
2
|
+
|
|
3
|
+
export const RequestMethod = key<string>("hoppscotch.requestMethod");
|
|
4
|
+
export const RequestUrl = key<string>("hoppscotch.requestUrl");
|
|
5
|
+
export const RequestHeaders = key<Record<string, string>>("hoppscotch.requestHeaders");
|
|
6
|
+
export const RequestParams = key<Record<string, string>>("hoppscotch.requestParams");
|
|
7
|
+
export const RequestBearerToken = key<string>("hoppscotch.requestBearerToken");
|
|
8
|
+
|
|
9
|
+
/** Raw JSON text typed into the request body editor. */
|
|
10
|
+
export const RequestBody = key<string>("hoppscotch.requestBody");
|
|
11
|
+
export const ExpectedStatus = key<number>("hoppscotch.expectedStatus");
|
|
12
|
+
|
|
13
|
+
/** Substring the response body must contain. */
|
|
14
|
+
export const ExpectedResponseText = key<string>("hoppscotch.expectedResponseText");
|
|
15
|
+
|
|
16
|
+
/** The raw response body, set by read-response-body. */
|
|
17
|
+
export const ResponseBody = key<string>("hoppscotch.responseBody");
|
|
18
|
+
|
|
19
|
+
/** Response headers (lower-cased names), set by read-response-headers. */
|
|
20
|
+
export const ResponseHeaders = key<Record<string, string>>("hoppscotch.responseHeaders");
|
|
21
|
+
export const ExpectedResponseHeader = keyGroup<{ name: string; value: string }>("hoppscotch.expectedResponseHeader");
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { defineAssertBlock, type Trait } from "waygraph";
|
|
2
|
-
import
|
|
3
|
-
import { ExpectedResponseText, ResponseBody } from "
|
|
2
|
+
import { HoppscotchRest } from "../_states.js";
|
|
3
|
+
import { ExpectedResponseText, ResponseBody } from "../_keys.js";
|
|
4
4
|
|
|
5
5
|
// Hoppscotch pretty-prints JSON, so compare with whitespace removed from both sides.
|
|
6
6
|
const squash = (text: string): string => text.replace(/\s+/g, "");
|
|
@@ -12,10 +12,10 @@ const bodyContainsExpected: Trait = {
|
|
|
12
12
|
},
|
|
13
13
|
};
|
|
14
14
|
|
|
15
|
-
export const AssertResponseBodyBlock = defineAssertBlock
|
|
15
|
+
export const AssertResponseBodyBlock = defineAssertBlock({
|
|
16
16
|
name: "assert-response-body",
|
|
17
17
|
description: "Confirms the response body read earlier contains the mem-supplied text (whitespace ignored).",
|
|
18
|
-
checkpoint:
|
|
18
|
+
checkpoint: HoppscotchRest,
|
|
19
19
|
requires: [ExpectedResponseText],
|
|
20
20
|
verify: [bodyContainsExpected],
|
|
21
21
|
});
|