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
|
@@ -2,12 +2,14 @@
|
|
|
2
2
|
// keeps working untouched; this is a second, richer place to put the same kind of project-level
|
|
3
3
|
// setting, for consumers who'd rather have a real typed file than a JSON field. Real ask: "I
|
|
4
4
|
// think its time to add waygraph config now."
|
|
5
|
-
import { existsSync
|
|
5
|
+
import { existsSync } from "node:fs";
|
|
6
6
|
import { isAbsolute, join } from "node:path";
|
|
7
7
|
import { pathToFileURL } from "node:url";
|
|
8
8
|
import { extensionPathsFromEnv } from "./browser.js";
|
|
9
9
|
import { envMode, loadEnvFiles } from "./env-file.js";
|
|
10
10
|
import { resolveExtensions } from "./extensions.js";
|
|
11
|
+
import { envString, setEnv } from "../engine/env.js";
|
|
12
|
+
import { takeGlobalFlag } from "./global-flag.js";
|
|
11
13
|
/**
|
|
12
14
|
* Typed identity helper, like `defineConfig` in `vite.config.ts`. Pass an object, or a function when values come
|
|
13
15
|
* from `.env` files (`.env`, `.env.local`, `.env.<mode>`; pick the mode with `--env <mode>`):
|
|
@@ -27,7 +29,7 @@ const CONFIG_FILENAMES = [...CONFIG_NAMES.map((n) => join("config", n)), ...CONF
|
|
|
27
29
|
* (`staging` -> `config/waygraph.staging.config.ts`, also tried in the project root). Without it, `waygraph.config.*`.
|
|
28
30
|
*/
|
|
29
31
|
function configCandidates() {
|
|
30
|
-
const chosen =
|
|
32
|
+
const chosen = envString("WAYGRAPH_CONFIG");
|
|
31
33
|
if (!chosen)
|
|
32
34
|
return CONFIG_FILENAMES;
|
|
33
35
|
if (/[\\/]/.test(chosen) || /\.[cm]?[jt]s$/.test(chosen))
|
|
@@ -37,21 +39,14 @@ function configCandidates() {
|
|
|
37
39
|
}
|
|
38
40
|
/** Removes `--config <file>` / `--config=<file>` from argv and records it as `WAYGRAPH_CONFIG`, so every command reads that config. */
|
|
39
41
|
export function takeConfigFlag(argv) {
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
process.env.WAYGRAPH_CONFIG = argv[++i];
|
|
45
|
-
else if (a.startsWith("--config="))
|
|
46
|
-
process.env.WAYGRAPH_CONFIG = a.slice("--config=".length);
|
|
47
|
-
else
|
|
48
|
-
out.push(a);
|
|
49
|
-
}
|
|
50
|
-
return out;
|
|
42
|
+
const { value, rest } = takeGlobalFlag(argv, "config");
|
|
43
|
+
if (value !== undefined)
|
|
44
|
+
setEnv("WAYGRAPH_CONFIG", value);
|
|
45
|
+
return rest;
|
|
51
46
|
}
|
|
52
47
|
/**
|
|
53
48
|
* Looks for the first `waygraph.config.*` in `projectDir` and imports it - `.ts` works
|
|
54
|
-
* unmodified because `bin/waygraph` already registers `tsx/esm` before `dist/cli.js` ever runs
|
|
49
|
+
* unmodified because `bin/waygraph` already registers `tsx/esm` before `dist/cli/cli.js` ever runs
|
|
55
50
|
* (the same mechanism that already lets a consumer's `.block.ts`/`.flow.ts` import directly), so
|
|
56
51
|
* no separate loader/transpile step is needed here. A broken config file throws loud, naming the
|
|
57
52
|
* file - silently swallowing it would make a missing `baseUrl` look like "nobody configured
|
|
@@ -62,8 +57,8 @@ export async function loadWaygraphConfig(projectDir) {
|
|
|
62
57
|
for (const name of configCandidates()) {
|
|
63
58
|
const p = isAbsolute(name) ? name : join(projectDir, name);
|
|
64
59
|
if (!existsSync(p)) {
|
|
65
|
-
if (
|
|
66
|
-
throw new Error(`waygraph: config "${
|
|
60
|
+
if (envString("WAYGRAPH_CONFIG") && name === envString("WAYGRAPH_CONFIG")) {
|
|
61
|
+
throw new Error(`waygraph: config "${envString("WAYGRAPH_CONFIG")}" not found (looked for ${p})`);
|
|
67
62
|
}
|
|
68
63
|
continue;
|
|
69
64
|
}
|
|
@@ -82,7 +77,7 @@ export async function loadWaygraphConfig(projectDir) {
|
|
|
82
77
|
}
|
|
83
78
|
/**
|
|
84
79
|
* Single source of truth for a project's base URL. Was three independently drifted copies
|
|
85
|
-
* (`src/cli/flags.ts`, `src/traverse/
|
|
80
|
+
* (`src/cli/flags.ts`, `src/live/traverse/traverse.ts`, `src/live/auto/auto.ts`), each checking
|
|
86
81
|
* a slightly different subset of sources in a different order - real duplication, not just
|
|
87
82
|
* stylistic, since one copy skipped `config.waygraph.*` nesting and another checked
|
|
88
83
|
* `WAYGRAPH_BASE_URL` first instead of last. Checked in this order:
|
|
@@ -91,43 +86,14 @@ export async function loadWaygraphConfig(projectDir) {
|
|
|
91
86
|
* `loadEnvFiles`, called here so every caller gets native `.env` support for free, not just
|
|
92
87
|
* whichever command remembered to call it).
|
|
93
88
|
* 2. A `waygraph.config.*` file's `baseUrl`.
|
|
94
|
-
* 3. `package.json`'s `waygraph.baseUrl`/`baseURL` (`config.waygraph.*` also checked - a common
|
|
95
|
-
* nested-config convention some tooling uses).
|
|
96
|
-
* 4. `playwright.config.*`'s own `baseURL` (regex-read as text, never imported - importing a
|
|
97
|
-
* consumer's real playwright.config risks pulling in `@playwright/test`'s own global setup
|
|
98
|
-
* as a side effect, which resolving a URL string has no business doing).
|
|
99
89
|
*/
|
|
100
90
|
export async function resolveBaseUrl(projectDir) {
|
|
101
91
|
loadEnvFiles(projectDir);
|
|
102
|
-
if (
|
|
103
|
-
return
|
|
92
|
+
if (envString("WAYGRAPH_BASE_URL"))
|
|
93
|
+
return envString("WAYGRAPH_BASE_URL");
|
|
104
94
|
const config = await loadWaygraphConfig(projectDir);
|
|
105
95
|
if (config?.baseUrl && config.baseUrl.trim())
|
|
106
96
|
return config.baseUrl.trim();
|
|
107
|
-
const pkgPath = join(projectDir, "package.json");
|
|
108
|
-
if (existsSync(pkgPath)) {
|
|
109
|
-
try {
|
|
110
|
-
const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
111
|
-
const fromPkg = pkg.waygraph?.baseUrl ??
|
|
112
|
-
pkg.waygraph?.baseURL ??
|
|
113
|
-
pkg.config?.waygraph?.baseUrl ??
|
|
114
|
-
pkg.config?.waygraph?.baseURL;
|
|
115
|
-
if (typeof fromPkg === "string" && fromPkg.trim())
|
|
116
|
-
return fromPkg.trim();
|
|
117
|
-
}
|
|
118
|
-
catch {
|
|
119
|
-
// ignore malformed package.json - fall through to playwright.config
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
for (const name of ["playwright.config.ts", "playwright.config.mts", "playwright.config.js", "playwright.config.mjs"]) {
|
|
123
|
-
const p = join(projectDir, name);
|
|
124
|
-
if (!existsSync(p))
|
|
125
|
-
continue;
|
|
126
|
-
const src = readFileSync(p, "utf-8");
|
|
127
|
-
const m = src.match(/baseURL\s*:\s*["']([^"']+)["']/);
|
|
128
|
-
if (m?.[1])
|
|
129
|
-
return m[1];
|
|
130
|
-
}
|
|
131
97
|
return undefined;
|
|
132
98
|
}
|
|
133
99
|
/** Unpacked extension directories for a run: `WAYGRAPH_EXTENSIONS` if set, else the config file's `extensions` (fetched on first use). */
|
|
@@ -143,18 +109,22 @@ export async function configuredExtensions(projectDir) {
|
|
|
143
109
|
* (`WAYGRAPH_COMMAND`, set by the CLI). The `run` / `demo` section overrides the shared top-level values. A flag, a shell
|
|
144
110
|
* variable or a `.env` value that is already set always wins, so the config only supplies defaults.
|
|
145
111
|
*/
|
|
146
|
-
export function applyConfigEnv(config, command =
|
|
112
|
+
export function applyConfigEnv(config, command = envString("WAYGRAPH_COMMAND")) {
|
|
147
113
|
if (!config)
|
|
148
114
|
return;
|
|
149
115
|
const isDemo = command === "demo" || command === "try";
|
|
150
116
|
const section = isDemo ? config.demo : command === "run" ? config.run : undefined;
|
|
151
117
|
const set = (name, value) => {
|
|
152
|
-
if (value !== undefined &&
|
|
153
|
-
|
|
118
|
+
if (value !== undefined && envString(name) === undefined)
|
|
119
|
+
setEnv(name, value);
|
|
154
120
|
};
|
|
155
121
|
const flag = (b) => (b === undefined ? undefined : b ? "1" : "0");
|
|
156
122
|
const video = { ...config.video, ...section?.video };
|
|
157
123
|
const slowMo = section?.slowMo ?? config.slowMo;
|
|
124
|
+
if (config.runLog === false)
|
|
125
|
+
set("WAYGRAPH_RUN_LOG", "0");
|
|
126
|
+
else if (typeof config.runLog === "string")
|
|
127
|
+
set("WAYGRAPH_RUN_LOG", config.runLog);
|
|
158
128
|
set("WAYGRAPH_VIDEO_DIR", video.dir);
|
|
159
129
|
set("WAYGRAPH_VIDEO_VIEWPORT", video.viewport);
|
|
160
130
|
set("WAYGRAPH_SLOWMO", slowMo === undefined ? undefined : String(slowMo));
|
|
@@ -1,38 +1,13 @@
|
|
|
1
|
-
// Starts/stops a project's `webServer` (waygraph.config
|
|
1
|
+
// Starts/stops a project's `webServer` (from config/waygraph.config.ts) around `waygraph run`/`demo`/`auto`,
|
|
2
2
|
// the same block `waygraph test` already honors.
|
|
3
|
-
import { existsSync } from "node:fs";
|
|
4
3
|
import { join } from "node:path";
|
|
5
|
-
import { pathToFileURL } from "node:url";
|
|
6
4
|
import { spawn } from "node:child_process";
|
|
7
|
-
import { loadWaygraphConfig } from "./config.js";
|
|
8
|
-
const CONFIG_FILES = [
|
|
9
|
-
"playwright.config.ts",
|
|
10
|
-
"playwright.config.mts",
|
|
11
|
-
"playwright.config.mjs",
|
|
12
|
-
"playwright.config.js",
|
|
13
|
-
"playwright.config.cjs",
|
|
14
|
-
];
|
|
5
|
+
import { loadWaygraphConfig } from "./waygraph-config.js";
|
|
15
6
|
async function loadWebServerConfigs(projectDir) {
|
|
16
7
|
const fromWaygraph = (await loadWaygraphConfig(projectDir))?.webServer;
|
|
17
|
-
if (fromWaygraph)
|
|
18
|
-
return
|
|
19
|
-
|
|
20
|
-
const p = join(projectDir, name);
|
|
21
|
-
if (!existsSync(p))
|
|
22
|
-
continue;
|
|
23
|
-
let mod;
|
|
24
|
-
try {
|
|
25
|
-
mod = (await import(pathToFileURL(p).href));
|
|
26
|
-
}
|
|
27
|
-
catch (err) {
|
|
28
|
-
throw new Error(`waygraph: failed to load ${name}: ${err instanceof Error ? err.message : String(err)}`);
|
|
29
|
-
}
|
|
30
|
-
const webServer = mod.default?.webServer;
|
|
31
|
-
if (!webServer)
|
|
32
|
-
return [];
|
|
33
|
-
return Array.isArray(webServer) ? webServer : [webServer];
|
|
34
|
-
}
|
|
35
|
-
return [];
|
|
8
|
+
if (!fromWaygraph)
|
|
9
|
+
return [];
|
|
10
|
+
return Array.isArray(fromWaygraph) ? fromWaygraph : [fromWaygraph];
|
|
36
11
|
}
|
|
37
12
|
async function isUp(target) {
|
|
38
13
|
try {
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Engine, defineConfig } from "waygraph";
|
|
2
|
+
|
|
3
|
+
const config = defineConfig({
|
|
4
|
+
baseUrl: "http://127.0.0.1:4277",
|
|
5
|
+
testDir: "./tests",
|
|
6
|
+
webServer: {
|
|
7
|
+
command: "node scripts/fixture-server.mjs",
|
|
8
|
+
url: "http://127.0.0.1:4277/dashboard",
|
|
9
|
+
reuseExistingServer: !process.env.CI,
|
|
10
|
+
},
|
|
11
|
+
playwright: {
|
|
12
|
+
workers: 1,
|
|
13
|
+
fullyParallel: false,
|
|
14
|
+
timeout: 30_000,
|
|
15
|
+
use: { headless: true, trace: "retain-on-failure" },
|
|
16
|
+
},
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
export default config;
|
|
20
|
+
export const engine = new Engine(config);
|
|
@@ -6,15 +6,12 @@
|
|
|
6
6
|
"description": "Waygraph Map folder convention proof - (group)/<page>/page.block.ts + nav.block.ts + methods/*.block.ts, offline fixture, zero new engine code.",
|
|
7
7
|
"scripts": {
|
|
8
8
|
"typecheck": "tsc --noEmit",
|
|
9
|
-
"test": "
|
|
9
|
+
"test": "waygraph test",
|
|
10
10
|
"fixture": "node scripts/fixture-server.mjs",
|
|
11
11
|
"graph": "waygraph graph",
|
|
12
12
|
"map": "waygraph map",
|
|
13
13
|
"auto:cli": "waygraph auto --cli"
|
|
14
14
|
},
|
|
15
|
-
"waygraph": {
|
|
16
|
-
"baseUrl": "http://127.0.0.1:4277"
|
|
17
|
-
},
|
|
18
15
|
"dependencies": {
|
|
19
16
|
"waygraph": "file:../.."
|
|
20
17
|
},
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Stands in for this example's real app: serves src/pages/<name>.html at clean URLs (/dashboard, /docs).
|
|
2
|
-
// Started and stopped by
|
|
2
|
+
// Started and stopped by config/waygraph.config.ts's webServer - waygraph run/demo/auto/test all honor it.
|
|
3
3
|
import { createServer } from "node:http";
|
|
4
4
|
import { readFileSync, existsSync } from "node:fs";
|
|
5
5
|
import { join } from "node:path";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { engine } from "../../config/waygraph.config.js";
|
|
2
2
|
import { NavDashboardBlock } from "../map/(app_base)/dashboard/_nav.block.js";
|
|
3
3
|
import { ClickWidgetBlock } from "../map/(app_base)/dashboard/_methods/click-widget.block.js";
|
|
4
4
|
import { NavDocsBlock } from "../map/(external)/docs/_nav.block.js";
|
|
@@ -6,14 +6,12 @@ import { NavDocsBlock } from "../map/(external)/docs/_nav.block.js";
|
|
|
6
6
|
import "../map/(app_base)/dashboard/_page.block.js";
|
|
7
7
|
import "../map/(external)/docs/_page.block.js";
|
|
8
8
|
|
|
9
|
-
const engine = new Engine();
|
|
10
9
|
|
|
11
10
|
const homeOrigin = process.env.WAYGRAPH_BASE_URL || "http://127.0.0.1:4277";
|
|
12
11
|
|
|
13
12
|
/**
|
|
14
13
|
* Same real Blocks, same real Checkpoints, same real fixture server as
|
|
15
|
-
* routed-demo.flow.ts - built with `engine.map()`
|
|
16
|
-
* the deprecated `engine.defineFlow([start, ..., end])` to prove the fluent builder
|
|
14
|
+
* routed-demo.flow.ts - built with `engine.map()` to prove the fluent builder
|
|
17
15
|
* against a real browser/DOM, not just the in-memory fakes
|
|
18
16
|
* tests/nav/map-builder.spec.ts already covers in the main package.
|
|
19
17
|
*
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { engine } from "../../config/waygraph.config.js";
|
|
2
2
|
import { NavDashboardBlock } from "../map/(app_base)/dashboard/_nav.block.js";
|
|
3
3
|
import { ClickWidgetBlock } from "../map/(app_base)/dashboard/_methods/click-widget.block.js";
|
|
4
4
|
import { NavDocsBlock } from "../map/(external)/docs/_nav.block.js";
|
|
@@ -6,7 +6,6 @@ import { NavDocsBlock } from "../map/(external)/docs/_nav.block.js";
|
|
|
6
6
|
import "../map/(app_base)/dashboard/_page.block.js";
|
|
7
7
|
import "../map/(external)/docs/_page.block.js";
|
|
8
8
|
|
|
9
|
-
const engine = new Engine();
|
|
10
9
|
|
|
11
10
|
/** Smoke: dashboard -> click widget -> docs, all Blocks under the Waygraph Map folder convention. */
|
|
12
11
|
export const routedDemoFlow = engine.map().start().gotoPage(NavDashboardBlock).method(ClickWidgetBlock).gotoPage(NavDocsBlock).end();
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { defineMethodBlock,
|
|
2
|
-
import
|
|
1
|
+
import { defineMethodBlock, Trait } from "waygraph";
|
|
2
|
+
import { Dashboard } from "../../../../states/routed-demo.states.js";
|
|
3
3
|
import { DashboardSel } from "../_sel.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -10,14 +10,15 @@ import { DashboardSel } from "../_sel.js";
|
|
|
10
10
|
* folder's own actions live under methods/, same as today's freeform
|
|
11
11
|
* convention's own methods/ subfolder.
|
|
12
12
|
*/
|
|
13
|
-
export const ClickWidgetBlock = defineMethodBlock
|
|
13
|
+
export const ClickWidgetBlock = defineMethodBlock({
|
|
14
14
|
name: "click-widget",
|
|
15
15
|
description: "Clicks the dashboard's demo widget button.",
|
|
16
|
+
from: Dashboard,
|
|
17
|
+
to: Dashboard,
|
|
16
18
|
instruction: {
|
|
17
19
|
async act(page) {
|
|
18
20
|
await page.locator(DashboardSel.widgetBtn).click();
|
|
19
21
|
},
|
|
20
|
-
resolve: () => checkpoint("Dashboard"),
|
|
21
22
|
verify: [Trait.text(DashboardSel.widgetOut, "clicked")],
|
|
22
23
|
},
|
|
23
24
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineNavBlock, Trait } from "waygraph";
|
|
2
|
-
import
|
|
2
|
+
import { Dashboard } from "../../../states/routed-demo.states.js";
|
|
3
3
|
import { DashboardSel, DASHBOARD_URL } from "./_sel.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -9,10 +9,10 @@ import { DashboardSel, DASHBOARD_URL } from "./_sel.js";
|
|
|
9
9
|
* Fixed file name under the Waygraph Map convention - every page-slug
|
|
10
10
|
* folder's own navigation Block is always nav.block.ts.
|
|
11
11
|
*/
|
|
12
|
-
export const NavDashboardBlock = defineNavBlock
|
|
12
|
+
export const NavDashboardBlock = defineNavBlock({
|
|
13
13
|
name: "nav-dashboard",
|
|
14
14
|
description: "Opens the dashboard page.",
|
|
15
|
-
checkpoint:
|
|
15
|
+
checkpoint: Dashboard,
|
|
16
16
|
url: DASHBOARD_URL,
|
|
17
17
|
verify: [Trait.visible(DashboardSel.heading)],
|
|
18
18
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { definePageBlock, Trait } from "waygraph";
|
|
2
|
-
import
|
|
2
|
+
import { Dashboard } from "../../../states/routed-demo.states.js";
|
|
3
3
|
import { DashboardSel } from "./_sel.js";
|
|
4
4
|
import { ClickWidgetBlock } from "./_methods/click-widget.block.js";
|
|
5
5
|
|
|
@@ -11,10 +11,10 @@ import { ClickWidgetBlock } from "./_methods/click-widget.block.js";
|
|
|
11
11
|
* folder's own arrival hub is always page.block.ts. Arrival-only
|
|
12
12
|
* (nav.block.ts already landed on Dashboard).
|
|
13
13
|
*/
|
|
14
|
-
export const DashboardPageBlock = definePageBlock
|
|
14
|
+
export const DashboardPageBlock = definePageBlock({
|
|
15
15
|
name: "page-dashboard",
|
|
16
16
|
description: "Dashboard hub - the routed-demo example's (app_base) group.",
|
|
17
|
-
checkpoint:
|
|
17
|
+
checkpoint: Dashboard,
|
|
18
18
|
verify: [Trait.visible(DashboardSel.heading)],
|
|
19
19
|
methods: {
|
|
20
20
|
clickWidget: () => ClickWidgetBlock,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineNavBlock, Trait } from "waygraph";
|
|
2
|
-
import
|
|
2
|
+
import { Docs } from "../../../states/routed-demo.states.js";
|
|
3
3
|
import { DocsSel, DOCS_URL } from "./_sel.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -12,10 +12,10 @@ import { DocsSel, DOCS_URL } from "./_sel.js";
|
|
|
12
12
|
* already-established `*-external/` namespacing precedent from
|
|
13
13
|
* waygraph-mail-adapters.
|
|
14
14
|
*/
|
|
15
|
-
export const NavDocsBlock = defineNavBlock
|
|
15
|
+
export const NavDocsBlock = defineNavBlock({
|
|
16
16
|
name: "nav-docs",
|
|
17
17
|
description: "Opens the docs page.",
|
|
18
|
-
checkpoint:
|
|
18
|
+
checkpoint: Docs,
|
|
19
19
|
url: DOCS_URL,
|
|
20
20
|
verify: [Trait.visible(DocsSel.heading)],
|
|
21
21
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { definePageBlock, Trait } from "waygraph";
|
|
2
|
-
import
|
|
2
|
+
import { Docs } from "../../../states/routed-demo.states.js";
|
|
3
3
|
import { DocsSel } from "./_sel.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -7,9 +7,9 @@ import { DocsSel } from "./_sel.js";
|
|
|
7
7
|
* Route: (external)/docs/
|
|
8
8
|
* Arrival-only (nav.block.ts already landed on Docs).
|
|
9
9
|
*/
|
|
10
|
-
export const DocsPageBlock = definePageBlock
|
|
10
|
+
export const DocsPageBlock = definePageBlock({
|
|
11
11
|
name: "page-docs",
|
|
12
12
|
description: "Docs hub - the routed-demo example's (external) group.",
|
|
13
|
-
checkpoint:
|
|
13
|
+
checkpoint: Docs,
|
|
14
14
|
verify: [Trait.visible(DocsSel.heading)],
|
|
15
15
|
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { checkpoint } from "waygraph";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Checkpoint names match their own folder's page-slug (PascalCase) under the
|
|
@@ -6,5 +6,7 @@ import type { Checkpoint } from "waygraph";
|
|
|
6
6
|
* See openspec/changes/waygraph-map for why this is a naming convention, not
|
|
7
7
|
* something any tool enforces.
|
|
8
8
|
*/
|
|
9
|
-
export
|
|
10
|
-
export type
|
|
9
|
+
export const Dashboard = checkpoint("Dashboard");
|
|
10
|
+
export type Dashboard = typeof Dashboard;
|
|
11
|
+
export const Docs = checkpoint("Docs");
|
|
12
|
+
export type Docs = typeof Docs;
|
|
@@ -41,10 +41,10 @@ test("a real detached session navigates the convention-organized site for real,
|
|
|
41
41
|
test.setTimeout(30_000);
|
|
42
42
|
const { stdout } = await exec(node, [
|
|
43
43
|
CLI,
|
|
44
|
-
"
|
|
45
|
-
"
|
|
46
|
-
"--
|
|
47
|
-
"--
|
|
44
|
+
"browser",
|
|
45
|
+
"start",
|
|
46
|
+
"--headless",
|
|
47
|
+
"--goto",
|
|
48
48
|
process.env.WAYGRAPH_BASE_URL || "http://127.0.0.1:4277",
|
|
49
49
|
root,
|
|
50
50
|
]).then((r) => r);
|
|
@@ -48,7 +48,6 @@ src/blocks/
|
|
|
48
48
|
saucedemo-web/ # THIS FOLDER IS URL "/"
|
|
49
49
|
NAV.md
|
|
50
50
|
nav-login.block.ts # Page hub
|
|
51
|
-
ff-owner-auth.block.ts # FFCompose wrapping the 4 Blocks below
|
|
52
51
|
methods/
|
|
53
52
|
fill-username.method.block.ts # self-loop, fills only
|
|
54
53
|
fill-password.method.block.ts # self-loop, fills only
|
|
@@ -98,12 +97,12 @@ edges (including cycles via logout / continue-shopping / back-to-products).
|
|
|
98
97
|
Prefer flags (or npm scripts) over a pile of `WAYGRAPH_*` env vars:
|
|
99
98
|
|
|
100
99
|
```bash
|
|
101
|
-
npm run demo # waygraph demo shopFlow
|
|
102
|
-
npm run demo:
|
|
100
|
+
npm run demo # waygraph demo --blocks "loginFlow then shopFlow" (headed; baseUrl from config/waygraph.config.ts)
|
|
101
|
+
npm run demo:auto-next # the same, advancing on its own
|
|
103
102
|
waygraph demo shopFlow --base-url https://www.saucedemo.com --title "Shop"
|
|
104
|
-
waygraph
|
|
103
|
+
waygraph demo loginFlow --no-auto-next
|
|
105
104
|
```
|
|
106
105
|
|
|
107
|
-
Flags beat env: `--
|
|
106
|
+
Flags beat env: `--auto-next` / `--no-auto-next`,
|
|
108
107
|
`--base-url <url>`, `--title <text>`. Default BASE_URL resolution order for
|
|
109
108
|
`demo`: `--base-url` > `WAYGRAPH_BASE_URL` > `baseUrl` in `config/waygraph.config.ts`.
|
|
@@ -12,19 +12,16 @@ Runtime is always a `Block`. Helpers are TypeScript salt + clear intent.
|
|
|
12
12
|
| `defineAssertBlock` | Self-loop assertion, no state change - `verify` only | `*.method.block.ts` under `methods/` |
|
|
13
13
|
| `defineEffectBlock` | Instance mutate + auto menu rows | `*.effect.block.ts` under `methods/` |
|
|
14
14
|
| `defineBlock` | Escape hatch: tests, unsure, probes | any |
|
|
15
|
-
| `defineActionBlock` | **Deprecated** alias of `defineMethodBlock` | - |
|
|
16
15
|
|
|
17
|
-
`defineNavBlock({ click })`
|
|
16
|
+
`defineNavBlock({ click })` and `defineNavClickBlock` build the same Block; app code reads better with `defineNavClickBlock`.
|
|
18
17
|
|
|
19
18
|
**One distinct action per Block.** A Method that fills fields *and* submits is wrong even if
|
|
20
19
|
it "works" - split it (`fill-username` + `fill-password` + `submit-login`, not one Block).
|
|
21
20
|
`defineAssertBlock({ name, checkpoint, verify, waitForHeading?, requires? })` is the
|
|
22
21
|
self-loop-only shape for "assert something on the current page, no state change" - no
|
|
23
22
|
hand-written `act`/`resolve` to accidentally make do two things. `waygraph check` warns when
|
|
24
|
-
a `verify` array inlines a literal selector string instead of a `*Sel` reference.
|
|
25
|
-
|
|
26
|
-
Block before `end` - otherwise `Out` defaults to wildcard `Checkpoint<string>`, which breaks
|
|
27
|
-
`defineFlow`'s tuple typing mid-chain.
|
|
23
|
+
a `verify` array inlines a literal selector string instead of a `*Sel` reference. Its `checkpoint` is a Checkpoint
|
|
24
|
+
value, which types it on both sides, so it sits anywhere in a `map()` chain.
|
|
28
25
|
|
|
29
26
|
---
|
|
30
27
|
|
|
@@ -41,7 +38,7 @@ export const InventorySel = {
|
|
|
41
38
|
|
|
42
39
|
export const InventoryPageBlock = definePageBlock({
|
|
43
40
|
name: "page-inventory",
|
|
44
|
-
checkpoint:
|
|
41
|
+
checkpoint: LoggedIn,
|
|
45
42
|
verify: [Trait.url({ pathname: "/inventory.html" }), Trait.visible(InventorySel.list)],
|
|
46
43
|
methods: {
|
|
47
44
|
addToCart: () => AddToCartBlock,
|
|
@@ -84,8 +81,10 @@ Checkpoint = place on the map. `branch()` = which road to take from that place.
|
|
|
84
81
|
Conditional Out (no `branch()` needed for auto/graph):
|
|
85
82
|
|
|
86
83
|
```ts
|
|
87
|
-
defineMethodBlock
|
|
84
|
+
defineMethodBlock({
|
|
88
85
|
name: "submit-login",
|
|
86
|
+
from: LoginPage,
|
|
87
|
+
to: [LoggedIn, LoginPage],
|
|
89
88
|
instruction: {
|
|
90
89
|
async act(page) { /* click only - fields were filled by earlier Blocks */ },
|
|
91
90
|
async observe(page) {
|
|
@@ -123,8 +122,9 @@ then run the Block (act reads mem as usual).
|
|
|
123
122
|
### Effect - spawn Method-like rows (Add / Remove)
|
|
124
123
|
|
|
125
124
|
```ts
|
|
126
|
-
defineEffectBlock
|
|
125
|
+
defineEffectBlock({
|
|
127
126
|
name: "add-to-cart",
|
|
127
|
+
to: ItemInCart, // no `from`: runs from anywhere
|
|
128
128
|
requires: [SelectedItem.key],
|
|
129
129
|
instruction: {
|
|
130
130
|
async act(page, _in, mem) {
|
|
@@ -151,9 +151,9 @@ Auto shows: `Add "Sauce Labs Backpack" to cart`, `Add "Bike Light"…`, …
|
|
|
151
151
|
### MemNav - spawn Nav rows (Open details)
|
|
152
152
|
|
|
153
153
|
```ts
|
|
154
|
-
defineMemNavBlock
|
|
154
|
+
defineMemNavBlock({
|
|
155
155
|
name: "nav-item-detail",
|
|
156
|
-
checkpoint:
|
|
156
|
+
checkpoint: ItemDetailPage,
|
|
157
157
|
requires: [SelectedItem.key],
|
|
158
158
|
click: (mem) => InventorySel.title(mem.get(SelectedItem.key).id),
|
|
159
159
|
verify: [Trait.url({ pathname: "/inventory-item.html" })],
|
|
@@ -9,7 +9,6 @@ src/blocks/
|
|
|
9
9
|
saucedemo-web/ # URL /
|
|
10
10
|
NAV.md
|
|
11
11
|
nav-login.block.ts # Page definePageBlock url:/
|
|
12
|
-
ff-owner-auth.block.ts # FFCompose (nav-login + fill-username + fill-password + submit-login)
|
|
13
12
|
methods/
|
|
14
13
|
fill-username.method.block.ts # Method defineMethodBlock (self-loop on LoginPage)
|
|
15
14
|
fill-password.method.block.ts # Method defineMethodBlock (self-loop on LoginPage)
|
|
@@ -27,11 +27,7 @@ Fill and submit are three separate Blocks (not one that fills both fields and
|
|
|
27
27
|
clicks Login) so the graph/demo show each as its own step - no Block does
|
|
28
28
|
more than one distinct action.
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
| File | Kind | Notes |
|
|
33
|
-
|------|------|-------|
|
|
34
|
-
| `ff-owner-auth.block.ts` | FFCompose | Collapses nav-login + fill-username + fill-password + submit-login into one opaque demo/run step (`--ff-expand` shows all 4 again) |
|
|
30
|
+
A flow that wants to skip watching auth marks those steps `{ ff: true }` (see `src/flows/checkout.flow.ts`).
|
|
35
31
|
|
|
36
32
|
## Related mem keys / checkpoints
|
|
37
33
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineNavClickBlock, Trait } from "waygraph";
|
|
2
|
-
import
|
|
2
|
+
import { CartPage } from "../../../states/checkout.states.js";
|
|
3
3
|
import { CartSel } from "./cart.sel.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -9,10 +9,10 @@ import { CartSel } from "./cart.sel.js";
|
|
|
9
9
|
*
|
|
10
10
|
* click, not url - header cart link from inventory-adjacent pages.
|
|
11
11
|
*/
|
|
12
|
-
export const NavCartBlock = defineNavClickBlock
|
|
12
|
+
export const NavCartBlock = defineNavClickBlock({
|
|
13
13
|
name: "nav-cart",
|
|
14
14
|
description: "Clicks the cart link in the header.",
|
|
15
|
-
checkpoint:
|
|
15
|
+
checkpoint: CartPage,
|
|
16
16
|
click: CartSel.cartLink,
|
|
17
17
|
verify: [Trait.url({ pathname: "/cart.html" })],
|
|
18
18
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineNavClickBlock, Trait } from "waygraph";
|
|
2
|
-
import
|
|
2
|
+
import { CheckoutInfoPage } from "../../../states/checkout.states.js";
|
|
3
3
|
import { CartSel } from "./cart.sel.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -9,10 +9,10 @@ import { CartSel } from "./cart.sel.js";
|
|
|
9
9
|
*
|
|
10
10
|
* Cart page "Checkout" button - owns the nav into step one.
|
|
11
11
|
*/
|
|
12
|
-
export const NavCheckoutInfoBlock = defineNavClickBlock
|
|
12
|
+
export const NavCheckoutInfoBlock = defineNavClickBlock({
|
|
13
13
|
name: "nav-checkout-info",
|
|
14
14
|
description: "Clicks 'Checkout' on the cart page.",
|
|
15
|
-
checkpoint:
|
|
15
|
+
checkpoint: CheckoutInfoPage,
|
|
16
16
|
click: CartSel.checkoutBtn,
|
|
17
17
|
verify: [Trait.url({ pathname: "/checkout-step-one.html" })],
|
|
18
18
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { defineMethodBlock
|
|
2
|
-
import
|
|
1
|
+
import { defineMethodBlock } from "waygraph";
|
|
2
|
+
import { CheckoutInfoPage } from "../../../../states/checkout.states.js";
|
|
3
3
|
import { CheckoutInfoSel } from "./checkout-info.sel.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -10,13 +10,14 @@ import { CheckoutInfoSel } from "./checkout-info.sel.js";
|
|
|
10
10
|
* Fills the first name field only - self-loop on CheckoutInfoPage. Continue
|
|
11
11
|
* is its own Block (submit-checkout-info.method.block.ts).
|
|
12
12
|
*/
|
|
13
|
-
export const FillFirstNameBlock = defineMethodBlock
|
|
13
|
+
export const FillFirstNameBlock = defineMethodBlock({
|
|
14
14
|
name: "fill-first-name",
|
|
15
15
|
description: "Fills the first name field on the shipping info form.",
|
|
16
|
+
from: CheckoutInfoPage,
|
|
17
|
+
to: CheckoutInfoPage,
|
|
16
18
|
instruction: {
|
|
17
19
|
async act(page) {
|
|
18
20
|
await page.locator(CheckoutInfoSel.firstName).fill("Ada");
|
|
19
21
|
},
|
|
20
|
-
resolve: () => checkpoint("CheckoutInfoPage"),
|
|
21
22
|
},
|
|
22
23
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { defineMethodBlock
|
|
2
|
-
import
|
|
1
|
+
import { defineMethodBlock } from "waygraph";
|
|
2
|
+
import { CheckoutInfoPage } from "../../../../states/checkout.states.js";
|
|
3
3
|
import { CheckoutInfoSel } from "./checkout-info.sel.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -9,13 +9,14 @@ import { CheckoutInfoSel } from "./checkout-info.sel.js";
|
|
|
9
9
|
*
|
|
10
10
|
* Fills the last name field only - self-loop on CheckoutInfoPage.
|
|
11
11
|
*/
|
|
12
|
-
export const FillLastNameBlock = defineMethodBlock
|
|
12
|
+
export const FillLastNameBlock = defineMethodBlock({
|
|
13
13
|
name: "fill-last-name",
|
|
14
14
|
description: "Fills the last name field on the shipping info form.",
|
|
15
|
+
from: CheckoutInfoPage,
|
|
16
|
+
to: CheckoutInfoPage,
|
|
15
17
|
instruction: {
|
|
16
18
|
async act(page) {
|
|
17
19
|
await page.locator(CheckoutInfoSel.lastName).fill("Lovelace");
|
|
18
20
|
},
|
|
19
|
-
resolve: () => checkpoint("CheckoutInfoPage"),
|
|
20
21
|
},
|
|
21
22
|
});
|