waygraph 0.15.53 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -3
- package/bin/waygraph +2 -2
- package/dist/analysis/check.d.ts +38 -0
- package/dist/analysis/check.js +87 -0
- package/dist/analysis/coverage-gap.d.ts +1 -1
- package/dist/analysis/coverage-gap.js +14 -37
- package/dist/analysis/flow-source.d.ts +9 -0
- package/dist/analysis/flow-source.js +25 -0
- package/dist/analysis/graph.d.ts +13 -14
- package/dist/analysis/graph.js +48 -371
- package/dist/analysis/map-check.js +4 -39
- package/dist/analysis/practices-check.d.ts +1 -1
- package/dist/analysis/practices-check.js +24 -45
- package/dist/cli/args.d.ts +23 -0
- package/dist/cli/args.js +20 -0
- package/dist/{cli.d.ts → cli/cli.d.ts} +0 -1
- package/dist/{cli.js → cli/cli.js} +10 -9
- package/dist/{commands → cli/commands}/agent-dive-scaffold.js +35 -64
- package/dist/cli/commands/agent-dive.js +42 -0
- package/dist/{commands → cli/commands}/check.d.ts +0 -1
- package/dist/cli/commands/check.js +104 -0
- package/dist/cli/commands/codemod-checkpoints.d.ts +18 -0
- package/dist/cli/commands/codemod-checkpoints.js +186 -0
- package/dist/cli/commands/codemod-flows.d.ts +18 -0
- package/dist/cli/commands/codemod-flows.js +284 -0
- package/dist/cli/commands/codemod-stubs.d.ts +10 -0
- package/dist/cli/commands/codemod-stubs.js +187 -0
- package/dist/{commands → cli/commands}/extensions.js +5 -4
- package/dist/{commands → cli/commands}/init.js +1 -2
- package/dist/{commands → cli/commands}/list.js +9 -7
- package/dist/cli/commands/manifest.d.ts +2 -0
- package/dist/cli/commands/manifest.js +20 -0
- package/dist/cli/commands/map.js +57 -0
- package/dist/{commands → cli/commands}/run.d.ts +0 -1
- package/dist/cli/commands/run.js +64 -0
- package/dist/{commands → cli/commands}/session.js +61 -88
- package/dist/{commands → cli/commands}/test.js +11 -14
- package/dist/cli/commands/traverse.js +105 -0
- package/dist/{commands → cli/commands}/try.js +29 -25
- package/dist/{commands → cli/commands}/upgrade.js +40 -4
- package/dist/cli/flags.d.ts +193 -16
- package/dist/cli/flags.js +179 -234
- package/dist/cli/run-chain.d.ts +1 -0
- package/dist/cli/run-chain.js +42 -7
- package/dist/cli/usage.d.ts +1 -1
- package/dist/cli/usage.js +21 -53
- package/dist/cli/util.d.ts +2 -2
- package/dist/cli/util.js +2 -3
- package/dist/{highlights → demo/narration}/css.d.ts +1 -1
- package/dist/{highlights → demo/narration}/css.js +2 -3
- package/dist/{highlights → demo/narration}/demo-pace.d.ts +7 -11
- package/dist/{highlights → demo/narration}/demo-pace.js +9 -11
- package/dist/{highlights → demo/narration}/device.d.ts +4 -2
- package/dist/{highlights → demo/narration}/device.js +3 -1
- package/dist/demo/narration/merge.d.ts +8 -0
- package/dist/demo/narration/merge.js +71 -0
- package/dist/{highlights/run-phase.d.ts → demo/narration/narration.d.ts} +10 -14
- package/dist/{highlights/run-phase.js → demo/narration/narration.js} +25 -94
- package/dist/{highlights → demo/narration}/shorthand.d.ts +1 -1
- package/dist/demo/narration/stub-ctx.d.ts +8 -0
- package/dist/demo/narration/stub-ctx.js +164 -0
- package/dist/{highlights → demo/narration}/style.d.ts +1 -7
- package/dist/{highlights → demo/narration}/style.js +1 -41
- package/dist/{highlights → demo/narration}/todo-dock.d.ts +3 -3
- package/dist/{highlights → demo/narration}/todo-dock.js +13 -30
- package/dist/demo/overlay/auto-chrome.d.ts +7 -0
- package/dist/demo/overlay/auto-chrome.js +97 -0
- package/dist/{session/overlay-beacon.d.ts → demo/overlay/beacon.d.ts} +7 -0
- package/dist/{session/overlay-beacon.js → demo/overlay/beacon.js} +5 -0
- package/dist/demo/overlay/cursor.d.ts +12 -0
- package/dist/demo/overlay/cursor.js +142 -0
- package/dist/demo/overlay/device-stage.d.ts +13 -0
- package/dist/demo/overlay/device-stage.js +396 -0
- package/dist/demo/overlay/inpage/banner.d.ts +1 -0
- package/dist/demo/overlay/inpage/banner.js +160 -0
- package/dist/demo/overlay/inpage/caption.d.ts +2 -0
- package/dist/demo/overlay/inpage/caption.js +24 -0
- package/dist/demo/overlay/inpage/core.d.ts +1 -0
- package/dist/demo/overlay/inpage/core.js +345 -0
- package/dist/demo/overlay/inpage/device-chip.d.ts +1 -0
- package/dist/demo/overlay/inpage/device-chip.js +191 -0
- package/dist/demo/overlay/inpage/network.d.ts +9 -0
- package/dist/demo/overlay/inpage/network.js +200 -0
- package/dist/demo/overlay/inpage/panel-chrome.d.ts +1 -0
- package/dist/demo/overlay/inpage/panel-chrome.js +203 -0
- package/dist/demo/overlay/inpage/stamp.d.ts +1 -0
- package/dist/demo/overlay/inpage/stamp.js +46 -0
- package/dist/demo/overlay/inpage/swipe-zoom.d.ts +1 -0
- package/dist/demo/overlay/inpage/swipe-zoom.js +220 -0
- package/dist/demo/overlay/inpage/todos.d.ts +1 -0
- package/dist/demo/overlay/inpage/todos.js +294 -0
- package/dist/demo/overlay/locator-theater.d.ts +25 -0
- package/dist/demo/overlay/locator-theater.js +76 -0
- package/dist/demo/overlay/network-capture.d.ts +22 -0
- package/dist/demo/overlay/network-capture.js +127 -0
- package/dist/demo/overlay/overlay-css.d.ts +3 -0
- package/dist/demo/overlay/overlay-css.js +369 -0
- package/dist/demo/overlay/overlay-stage.d.ts +23 -0
- package/dist/demo/overlay/overlay-stage.js +106 -0
- package/dist/demo/overlay/overlay.d.ts +10 -0
- package/dist/demo/overlay/overlay.js +89 -0
- package/dist/{pilot-overlay/overlay-fixtures.d.ts → demo/overlay/phase-fixtures.d.ts} +2 -2
- package/dist/{pilot-overlay/overlay-fixtures.js → demo/overlay/phase-fixtures.js} +2 -2
- package/dist/{pilot-overlay/action-ring.js → demo/overlay/pilot/actions.js} +2 -1
- package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.d.ts +6 -5
- package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.js +19 -18
- package/dist/{pilot-overlay → demo/overlay/pilot}/shell.d.ts +2 -2
- package/dist/{pilot-overlay → demo/overlay/pilot}/shell.js +13 -22
- package/dist/demo/overlay/reattach.d.ts +7 -0
- package/dist/demo/overlay/reattach.js +23 -0
- package/dist/demo/overlay/rings.d.ts +33 -0
- package/dist/demo/overlay/rings.js +448 -0
- package/dist/{ui → demo/overlay/ui}/components/ring.js +2 -2
- package/dist/{ui → demo/overlay/ui}/overlay.css +4 -4
- package/dist/{ui → demo/overlay/ui}/shadow.d.ts +1 -1
- package/dist/{ui → demo/overlay/ui}/shadow.js +39 -2
- package/dist/demo/stepper/after.d.ts +3 -0
- package/dist/demo/stepper/after.js +113 -0
- package/dist/demo/stepper/banner-log.d.ts +37 -0
- package/dist/demo/stepper/banner-log.js +63 -0
- package/dist/demo/stepper/before.d.ts +4 -0
- package/dist/demo/stepper/before.js +110 -0
- package/dist/demo/stepper/demo-log.d.ts +31 -0
- package/dist/demo/stepper/demo-log.js +309 -0
- package/dist/demo/stepper/gate.d.ts +11 -0
- package/dist/demo/stepper/gate.js +78 -0
- package/dist/demo/stepper/interaction-patch.d.ts +3 -0
- package/dist/demo/stepper/interaction-patch.js +323 -0
- package/dist/demo/stepper/pacing.d.ts +21 -0
- package/dist/demo/stepper/pacing.js +23 -0
- package/dist/demo/stepper/slides.d.ts +11 -0
- package/dist/demo/stepper/slides.js +233 -0
- package/dist/demo/stepper/step-panels.d.ts +21 -0
- package/dist/demo/stepper/step-panels.js +589 -0
- package/dist/demo/stepper/stepper.d.ts +24 -0
- package/dist/demo/stepper/stepper.js +122 -0
- package/dist/demo/stepper/teardown.d.ts +48 -0
- package/dist/demo/stepper/teardown.js +179 -0
- package/dist/demo/stepper/todo-advance.d.ts +14 -0
- package/dist/demo/stepper/todo-advance.js +110 -0
- package/dist/demo/stepper/view.d.ts +68 -0
- package/dist/demo/stepper/view.js +31 -0
- package/dist/demo/types.d.ts +17 -0
- package/dist/demo/verbose-log.js +15 -0
- package/dist/{types.d.ts → engine/block/block.d.ts} +106 -91
- package/dist/{core → engine/block}/block.js +10 -53
- package/dist/{core → engine/block}/compose.d.ts +10 -7
- package/dist/{core → engine/block}/compose.js +1 -1
- package/dist/{core/blocks → engine/block/kinds}/api.d.ts +17 -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 +19 -29
- package/dist/{core/blocks → engine/block/kinds}/method.js +7 -21
- package/dist/{core/blocks → engine/block/kinds}/nav.d.ts +22 -31
- package/dist/{core/blocks → engine/block/kinds}/nav.js +6 -12
- package/dist/{core/blocks → engine/block/kinds}/page.d.ts +15 -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} +23 -22
- package/dist/{errors.js → engine/errors.js} +22 -22
- package/dist/{core → engine/flow}/branch-regression.d.ts +8 -7
- package/dist/{core → engine/flow}/branch-regression.js +4 -3
- package/dist/engine/flow/flow.d.ts +162 -0
- package/dist/engine/flow/flow.js +244 -0
- package/dist/{core → engine/flow}/map-builder.d.ts +42 -40
- package/dist/{core → engine/flow}/map-builder.js +46 -48
- 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} +9 -11
- package/dist/{core/run-graph.js → engine/run/run.js} +22 -11
- package/dist/engine/stub/pace.d.ts +12 -0
- package/dist/engine/stub/pace.js +2 -0
- package/dist/engine/stub/ring.d.ts +130 -0
- package/dist/engine/stub/ring.js +41 -0
- package/dist/engine/stub/stub.d.ts +268 -0
- package/dist/engine/stub/stub.js +1 -0
- package/dist/engine/stub/todos.d.ts +104 -0
- package/dist/engine/stub/todos.js +2 -0
- package/dist/engine/stub/viewport.d.ts +26 -0
- package/dist/engine/stub/viewport.js +2 -0
- package/dist/{trait.d.ts → engine/trait/trait.d.ts} +1 -1
- package/dist/index.d.ts +84 -36
- package/dist/index.js +44 -19
- package/dist/{session/auto-explore-run.d.ts → live/auto/auto.d.ts} +10 -16
- package/dist/{session/auto-explore-run.js → live/auto/auto.js} +164 -248
- package/dist/{session/auto-explore.d.ts → live/auto/explore.d.ts} +4 -14
- package/dist/{session/auto-explore.js → live/auto/explore.js} +21 -127
- package/dist/{auto-session/session.d.ts → live/auto-session/auto-session.d.ts} +1 -1
- package/dist/{auto-session/session.js → live/auto-session/auto-session.js} +27 -24
- package/dist/{auto-session → live/auto-session}/helpers.d.ts +16 -5
- package/dist/{auto-session → live/auto-session}/helpers.js +1 -1
- package/dist/{session/auto-session-ipc.d.ts → live/auto-session/ipc.d.ts} +7 -5
- package/dist/{session/auto-session-ipc.js → live/auto-session/ipc.js} +31 -16
- package/dist/{session/browser.d.ts → live/auto-session/start.d.ts} +1 -2
- package/dist/{session/browser.js → live/auto-session/start.js} +2 -3
- package/dist/{pilot-overlay → live/pilot}/panel.d.ts +1 -1
- package/dist/{pilot-overlay → live/pilot}/panel.js +23 -31
- package/dist/{session → live/pilot}/pilot.d.ts +4 -3
- package/dist/{session → live/pilot}/pilot.js +4 -4
- package/dist/{traverse → live/traverse}/coverage.d.ts +4 -0
- package/dist/{traverse → live/traverse}/coverage.js +3 -0
- package/dist/{traverse → live/traverse}/lease.d.ts +1 -0
- package/dist/{traverse → live/traverse}/lease.js +1 -0
- package/dist/{traverse/run.d.ts → live/traverse/traverse.d.ts} +4 -1
- package/dist/{traverse/run.js → live/traverse/traverse.js} +26 -43
- package/dist/manifest/manifest.d.ts +52 -0
- package/dist/manifest/manifest.js +93 -0
- package/dist/manifest/map-imports.d.ts +7 -0
- package/dist/manifest/map-imports.js +22 -0
- package/dist/manifest/maps.d.ts +33 -0
- package/dist/manifest/maps.js +62 -0
- package/dist/manifest/pack.d.ts +21 -0
- package/dist/manifest/pack.js +109 -0
- package/dist/manifest/project.d.ts +60 -0
- package/dist/manifest/project.js +101 -0
- package/dist/{session/block-inject.js → manifest/roots.js} +1 -18
- package/dist/manifest/scan.d.ts +19 -0
- package/dist/manifest/scan.js +57 -0
- package/dist/{blocks-select.d.ts → manifest/select.d.ts} +3 -0
- package/dist/{blocks-select.js → manifest/select.js} +2 -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} +2 -5
- package/dist/{extensions.js → runtime/extensions.js} +3 -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} +8 -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 +2 -3
- 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/README.md +11 -12
- package/examples/saucedemo/config/waygraph.config.ts +17 -0
- package/examples/saucedemo/docs/CONVENTION.md +5 -7
- package/examples/saucedemo/docs/HELPERS.md +12 -12
- package/examples/saucedemo/package-lock.json +10 -3
- package/examples/saucedemo/package.json +12 -29
- 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 -52
- 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 +21 -27
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -9
- 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 +10 -76
- 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 -29
- package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -48
- package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +13 -77
- 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 +26 -18
- package/examples/saucedemo/src/flows/cart-bulk.flow.ts +19 -14
- package/examples/saucedemo/src/flows/cart-continue.flow.ts +10 -8
- package/examples/saucedemo/src/flows/cart-mem.flow.ts +7 -7
- package/examples/saucedemo/src/flows/catalog-logout.flow.ts +13 -8
- package/examples/saucedemo/src/flows/checkout-then-browse-again.flow.ts +26 -48
- package/examples/saucedemo/src/flows/checkout.flow.ts +70 -86
- package/examples/saucedemo/src/flows/device-showcase.flow.ts +24 -25
- package/examples/saucedemo/src/flows/login.flow.ts +11 -18
- package/examples/saucedemo/src/flows/mem-stub-demo.flow.ts +9 -20
- package/examples/saucedemo/src/flows/shop.flow.ts +15 -20
- package/examples/saucedemo/src/flows/smoke.flow.ts +12 -27
- package/examples/saucedemo/src/flows/stub-on-error.flow.ts +24 -43
- package/examples/saucedemo/src/flows/viewer-blocked.flow.ts +26 -34
- package/examples/saucedemo/src/states/checkout.mem-stubs.ts +11 -0
- package/examples/saucedemo/src/states/checkout.states.ts +21 -11
- package/examples/saucedemo/src/stubs/device-showcase.ts +191 -0
- package/examples/saucedemo/src/stubs/login.ts +37 -0
- package/examples/saucedemo/tests/auto-graph.spec.ts +4 -12
- package/examples/saucedemo/tests/chain-flow-episodes.spec.ts +7 -9
- package/examples/saucedemo/tests/submit-login-branch.spec.ts +18 -5
- package/package.json +12 -7
- package/templates/agents/waygraph-planner.agent.md +2 -2
- package/templates/quickstart/README.md +4 -7
- package/templates/quickstart/config/waygraph.config.ts +17 -0
- package/templates/quickstart/docs/CONVENTION.md +5 -6
- package/templates/quickstart/docs/HELPERS.md +11 -9
- package/templates/quickstart/package.json +14 -17
- package/templates/quickstart/src/blocks/SITE-MAP.md +13 -3
- package/templates/quickstart/src/blocks/saucedemo-web/NAV.md +1 -5
- package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -52
- 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 +21 -27
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -9
- 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 +10 -76
- 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 -29
- package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -48
- package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +13 -77
- 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 +45 -0
- package/templates/quickstart/src/flows/cart-bulk.flow.ts +19 -14
- package/templates/quickstart/src/flows/cart-continue.flow.ts +10 -8
- package/templates/quickstart/src/flows/cart-mem.flow.ts +7 -7
- package/templates/quickstart/src/flows/catalog-logout.flow.ts +13 -8
- package/templates/quickstart/src/flows/checkout-then-browse-again.flow.ts +26 -48
- package/templates/quickstart/src/flows/checkout.flow.ts +70 -63
- package/templates/quickstart/src/flows/device-showcase.flow.ts +24 -25
- package/templates/quickstart/src/flows/login.flow.ts +11 -18
- package/templates/quickstart/src/flows/mem-stub-demo.flow.ts +12 -0
- package/templates/quickstart/src/flows/shop.flow.ts +15 -20
- package/templates/quickstart/src/flows/smoke.flow.ts +12 -27
- package/templates/quickstart/src/flows/stub-on-error.flow.ts +31 -0
- package/templates/quickstart/src/flows/viewer-blocked.flow.ts +26 -34
- package/templates/quickstart/src/states/checkout.mem-stubs.ts +11 -0
- package/templates/quickstart/src/states/checkout.states.ts +21 -11
- package/templates/quickstart/src/stubs/device-showcase.ts +191 -0
- package/templates/quickstart/src/stubs/login.ts +37 -0
- package/templates/quickstart/tests/chain-flow.spec.ts +7 -10
- package/templates/scaffold/README.md +2 -1
- package/templates/scaffold/STRUCTURE.md +5 -4
- package/templates/scaffold/config/waygraph.config.ts +1 -0
- package/templates/scaffold/gitignore +1 -0
- package/templates/scaffold/src/flows/README.md +2 -2
- package/templates/scaffold/src/map/(app_base)/docs/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/docs/_page.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/_methods/add-item.effect.block.ts +4 -4
- package/templates/scaffold/src/map/(app_base)/home/_methods/assert-hello.method.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/_methods/assert-item-added.method.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/_methods/clear-cart.method.block.ts +5 -4
- package/templates/scaffold/src/map/(app_base)/home/_methods/remove-item.effect.block.ts +4 -4
- package/templates/scaffold/src/map/(app_base)/home/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/_page.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/nav-verification-link.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_keys.ts +21 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-body.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-header.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-status.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/pick-extension-interceptor.method.block.ts +5 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-body.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-headers.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/send-request.method.block.ts +5 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-bearer-token.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-headers.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-json-body.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-method.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-query-params.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-url.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/hoppscotch/_page.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/hoppscotch/_states.ts +6 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/settings/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/mailpit/_keys.ts +13 -0
- package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-content.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-received.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/mailpit/_methods/extract-email-link.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/mailpit/_methods/open-message.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/mailpit/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/mailpit/_page.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/mailpit/_states.ts +9 -0
- package/templates/scaffold/src/map/README.md +7 -0
- package/templates/scaffold/src/states/README.md +4 -1
- package/templates/scaffold/src/states/demo.mem-keys.ts +1 -29
- package/templates/scaffold/src/states/demo.states.ts +14 -20
- package/templates/scaffold/tests/hoppscotch.spec.ts +1 -11
- package/templates/scaffold/tests/mail-verify.spec.ts +2 -2
- package/templates/skills/waygraph-blind-pilot.skill.md +2 -6
- package/templates/skills/waygraph-convention.skill.md +23 -14
- package/templates/skills/waygraph-pilot.skill.md +7 -4
- package/dist/auto-session/verbose-log.js +0 -16
- package/dist/auto-session.d.ts +0 -2
- package/dist/auto-session.js +0 -3
- package/dist/cli/discover.d.ts +0 -40
- package/dist/cli/discover.js +0 -148
- package/dist/commands/agent-dive.js +0 -52
- package/dist/commands/check.js +0 -192
- package/dist/commands/map.js +0 -29
- package/dist/commands/run.js +0 -104
- package/dist/commands/traverse.js +0 -177
- package/dist/core/block.d.ts +0 -109
- package/dist/core/blocks/effect.js +0 -23
- package/dist/core/config.js +0 -17
- package/dist/core/engine.d.ts +0 -198
- package/dist/core/flow.d.ts +0 -293
- package/dist/core/flow.js +0 -432
- package/dist/core.d.ts +0 -14
- package/dist/core.js +0 -15
- package/dist/highlights/merge.d.ts +0 -8
- package/dist/highlights/merge.js +0 -173
- package/dist/highlights/stub-ctx.d.ts +0 -10
- package/dist/highlights/stub-ctx.js +0 -331
- package/dist/highlights/types.d.ts +0 -607
- package/dist/highlights.d.ts +0 -9
- package/dist/highlights.js +0 -10
- package/dist/pilot-overlay.d.ts +0 -5
- package/dist/pilot-overlay.js +0 -6
- package/dist/runner/banner-log.js +0 -63
- package/dist/runner/chain-run.js +0 -102
- package/dist/runner/cursor.js +0 -140
- package/dist/runner/demo-log.js +0 -316
- package/dist/runner/device-stage.d.ts +0 -9
- package/dist/runner/device-stage.js +0 -420
- package/dist/runner/discovery.js +0 -105
- package/dist/runner/index.js +0 -2
- package/dist/runner/inpage/banner.d.ts +0 -21
- package/dist/runner/inpage/banner.js +0 -156
- package/dist/runner/inpage/caption.d.ts +0 -3
- package/dist/runner/inpage/caption.js +0 -23
- package/dist/runner/inpage/core.d.ts +0 -4
- package/dist/runner/inpage/core.js +0 -316
- package/dist/runner/inpage/device.d.ts +0 -3
- package/dist/runner/inpage/device.js +0 -211
- package/dist/runner/inpage/network.d.ts +0 -15
- package/dist/runner/inpage/network.js +0 -217
- package/dist/runner/inpage/panel-chrome.js +0 -192
- package/dist/runner/inpage/stamp.js +0 -46
- package/dist/runner/inpage/swipe-zoom.js +0 -220
- package/dist/runner/inpage/todos.js +0 -337
- package/dist/runner/interaction-patch.js +0 -384
- package/dist/runner/main.js +0 -469
- package/dist/runner/network-capture.d.ts +0 -9
- package/dist/runner/network-capture.js +0 -126
- package/dist/runner/overlay-css.d.ts +0 -3
- package/dist/runner/overlay-css.js +0 -377
- package/dist/runner/overlay-install.js +0 -90
- package/dist/runner/overlay-stage.js +0 -110
- package/dist/runner/rings.js +0 -514
- package/dist/runner/seed-mem.js +0 -110
- package/dist/runner/slides.js +0 -278
- package/dist/runner/step-mode.js +0 -703
- package/dist/runner/step-panels.js +0 -729
- package/dist/runner/teardown.js +0 -202
- package/dist/runner/todo-dock.js +0 -142
- package/dist/session/step-overlay.d.ts +0 -37
- package/dist/session/step-overlay.js +0 -244
- package/examples/routed-demo/playwright.config.ts +0 -21
- package/examples/saucedemo/playwright.config.ts +0 -19
- package/examples/saucedemo/scripts/drive-auto-cli.mjs +0 -93
- package/examples/saucedemo/scripts/prove-add-to-cart-menu.mjs +0 -126
- package/examples/saucedemo/scripts/prove-auto-graph.mjs +0 -92
- package/examples/saucedemo/scripts/prove-wrong-login-runtime.mjs +0 -63
- package/examples/saucedemo/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
- package/templates/quickstart/playwright.config.ts +0 -14
- package/templates/quickstart/scripts/drive-auto-cli.mjs +0 -93
- 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/{pilot-overlay/action-ring.d.ts → demo/overlay/pilot/actions.d.ts} +0 -0
- /package/dist/{ui → demo/overlay/ui}/components/ring.d.ts +0 -0
- /package/dist/{ui → demo/overlay/ui}/stylesheet.d.ts +0 -0
- /package/dist/{ui → demo/overlay/ui}/stylesheet.js +0 -0
- /package/dist/{ui → demo/overlay/ui}/tokens.d.ts +0 -0
- /package/dist/{ui → demo/overlay/ui}/tokens.js +0 -0
- /package/dist/{highlights → demo}/types.js +0 -0
- /package/dist/{auto-session → demo}/verbose-log.d.ts +0 -0
- /package/dist/{selector.d.ts → engine/trait/selector.d.ts} +0 -0
- /package/dist/{selector.js → engine/trait/selector.js} +0 -0
- /package/dist/{trait.js → engine/trait/trait.js} +0 -0
- /package/dist/{session/block-inject.d.ts → manifest/roots.d.ts} +0 -0
- /package/dist/{browser.d.ts → runtime/browser.d.ts} +0 -0
- /package/dist/{env-file.d.ts → runtime/env-file.d.ts} +0 -0
- /package/dist/{playwright-config.js → runtime/playwright-config.js} +0 -0
- /package/dist/{playwright.config.d.ts → runtime/playwright.config.d.ts} +0 -0
- /package/dist/{video-dir.d.ts → runtime/video-dir.d.ts} +0 -0
- /package/dist/{webserver.d.ts → runtime/webserver.d.ts} +0 -0
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* Drive `waygraph auto --cli` through login -> add-all -> remove-all -> quit.
|
|
4
|
-
* Waits for each Choose: prompt so picks are not sent early.
|
|
5
|
-
*
|
|
6
|
-
* Usage (from examples/saucedemo):
|
|
7
|
-
* node scripts/drive-auto-cli.mjs
|
|
8
|
-
*/
|
|
9
|
-
import { spawn } from "node:child_process";
|
|
10
|
-
import { createInterface } from "node:readline";
|
|
11
|
-
import { fileURLToPath } from "node:url";
|
|
12
|
-
import { dirname, join } from "node:path";
|
|
13
|
-
|
|
14
|
-
const root = join(dirname(fileURLToPath(import.meta.url)), "..");
|
|
15
|
-
const waygraphBin = join(root, "../../bin/waygraph");
|
|
16
|
-
const DATA =
|
|
17
|
-
process.env.WAYGRAPH_DATA ??
|
|
18
|
-
'{"saucedemo.credentials":{"username":"standard_user","password":"secret_sauce"}}';
|
|
19
|
-
|
|
20
|
-
function pickByLabel(menuText, label) {
|
|
21
|
-
const re = new RegExp(`\\[(\\d+)\\]\\s+${label.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}`);
|
|
22
|
-
const m = menuText.match(re);
|
|
23
|
-
if (!m) throw new Error(`menu missing "${label}"\n${menuText}`);
|
|
24
|
-
return m[1];
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
async function main() {
|
|
28
|
-
const child = spawn(waygraphBin, ["auto", "--cli", "--data", DATA, "."], {
|
|
29
|
-
cwd: root,
|
|
30
|
-
stdio: ["pipe", "pipe", "pipe"],
|
|
31
|
-
env: process.env,
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
let buf = "";
|
|
35
|
-
const dump = (chunk, stream) => {
|
|
36
|
-
const s = chunk.toString();
|
|
37
|
-
buf += s;
|
|
38
|
-
process[stream].write(s);
|
|
39
|
-
};
|
|
40
|
-
child.stdout.on("data", (c) => dump(c, "stdout"));
|
|
41
|
-
child.stderr.on("data", (c) => dump(c, "stderr"));
|
|
42
|
-
|
|
43
|
-
const waitChoose = () =>
|
|
44
|
-
new Promise((resolve, reject) => {
|
|
45
|
-
const start = Date.now();
|
|
46
|
-
const tick = () => {
|
|
47
|
-
if (buf.includes("Choose:")) {
|
|
48
|
-
const i = buf.lastIndexOf("Choose:");
|
|
49
|
-
const slice = buf.slice(Math.max(0, i - 4000), i + 8);
|
|
50
|
-
resolve(slice);
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
if (Date.now() - start > 120_000) {
|
|
54
|
-
reject(new Error(`timeout waiting for Choose:\n${buf.slice(-2000)}`));
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
setTimeout(tick, 100);
|
|
58
|
-
};
|
|
59
|
-
tick();
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
const send = (line) => {
|
|
63
|
-
console.error(`\n>> pick ${line.trim()}`);
|
|
64
|
-
buf = buf.replace(/Choose:/g, "Choose(done):");
|
|
65
|
-
child.stdin.write(line);
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
try {
|
|
69
|
-
let menu = await waitChoose();
|
|
70
|
-
send("1\n"); // submit-login
|
|
71
|
-
menu = await waitChoose();
|
|
72
|
-
if (!/LoggedIn|Add all to cart/.test(menu)) {
|
|
73
|
-
throw new Error(`expected inventory after login, got:\n${menu}`);
|
|
74
|
-
}
|
|
75
|
-
send(`${pickByLabel(menu, "Add all to cart")}\n`);
|
|
76
|
-
menu = await waitChoose();
|
|
77
|
-
send(`${pickByLabel(menu, "Remove all from cart")}\n`);
|
|
78
|
-
menu = await waitChoose();
|
|
79
|
-
if (!/Add all to cart/.test(menu)) {
|
|
80
|
-
throw new Error(`expected Add all again after remove-all, got:\n${menu}`);
|
|
81
|
-
}
|
|
82
|
-
send("q\n");
|
|
83
|
-
const code = await new Promise((res) => child.on("exit", res));
|
|
84
|
-
if (code !== 0 && code !== null) process.exitCode = code;
|
|
85
|
-
else console.error("\ndrive-auto-cli: PASS login -> add-all -> remove-all -> quit");
|
|
86
|
-
} catch (err) {
|
|
87
|
-
console.error(err instanceof Error ? err.message : String(err));
|
|
88
|
-
child.kill("SIGTERM");
|
|
89
|
-
process.exitCode = 1;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
main();
|
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
// Proves the dynamic add-to-cart menu for real: buildExploreMenu must offer
|
|
2
|
-
// one row PER item still on the page (not one generic "add-to-cart" row tied
|
|
3
|
-
// to the backpack), picking a non-default item must add THAT item (not the
|
|
4
|
-
// backpack), and the menu must stop offering an item once it is in the cart.
|
|
5
|
-
import { chromium } from "@playwright/test";
|
|
6
|
-
import { join, dirname } from "node:path";
|
|
7
|
-
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
8
|
-
import { createRequire } from "node:module";
|
|
9
|
-
import { chromiumExecutablePath } from "waygraph";
|
|
10
|
-
|
|
11
|
-
const require = createRequire(import.meta.url);
|
|
12
|
-
await import(require.resolve("tsx/esm"));
|
|
13
|
-
|
|
14
|
-
const root = join(dirname(fileURLToPath(import.meta.url)), "..");
|
|
15
|
-
const waygraphDist = join(root, "../../dist");
|
|
16
|
-
|
|
17
|
-
const { buildExploreContext, buildExploreMenu } = await import(
|
|
18
|
-
pathToFileURL(join(waygraphDist, "auto-explore.js")).href
|
|
19
|
-
);
|
|
20
|
-
const { MemPage, Engine, start, end } = await import(pathToFileURL(join(waygraphDist, "index.js")).href);
|
|
21
|
-
|
|
22
|
-
const exe = chromiumExecutablePath();
|
|
23
|
-
|
|
24
|
-
async function runBlock(engine, entry, context, page, mem) {
|
|
25
|
-
const flow = engine.defineFlow([start, entry.block, end]);
|
|
26
|
-
await flow.run(context, mem, { page, closeOnFinish: false });
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
const { graph, library } = await buildExploreContext(root);
|
|
30
|
-
const mem = new MemPage();
|
|
31
|
-
mem.set(library.byName.get("submit-login").block.requires[0], {
|
|
32
|
-
username: "standard_user",
|
|
33
|
-
password: "secret_sauce",
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
const browser = await chromium.launch({
|
|
37
|
-
headless: true,
|
|
38
|
-
...(exe ? { executablePath: exe, args: ["--no-sandbox"] } : {}),
|
|
39
|
-
});
|
|
40
|
-
const context = await browser.newContext({
|
|
41
|
-
baseURL: "https://www.saucedemo.com",
|
|
42
|
-
viewport: { width: 1280, height: 900 },
|
|
43
|
-
});
|
|
44
|
-
const page = await context.newPage();
|
|
45
|
-
const engine = new Engine({ headless: true });
|
|
46
|
-
|
|
47
|
-
await page.goto("/", { waitUntil: "load" });
|
|
48
|
-
await runBlock(engine, library.byName.get("submit-login"), context, page, mem);
|
|
49
|
-
await page.waitForURL(/inventory\.html/);
|
|
50
|
-
|
|
51
|
-
// 1. Menu on LoggedIn must offer one distinct add-to-cart row per product on
|
|
52
|
-
// the inventory page - not a single generic row.
|
|
53
|
-
const menu1 = await buildExploreMenu(page, graph, library, "LoggedIn");
|
|
54
|
-
const addRows1 = menu1.flat.filter((e) => e.block === "add-to-cart");
|
|
55
|
-
console.log(`add-to-cart rows on LoggedIn: ${addRows1.length}`);
|
|
56
|
-
for (const row of addRows1) console.log(` - ${row.label}`);
|
|
57
|
-
if (addRows1.length < 2) {
|
|
58
|
-
throw new Error(`expected several distinct add-to-cart rows, got ${addRows1.length}`);
|
|
59
|
-
}
|
|
60
|
-
if (addRows1.some((r) => !r.instanceOption)) {
|
|
61
|
-
throw new Error("every add-to-cart row must carry an instanceOption");
|
|
62
|
-
}
|
|
63
|
-
const backpackRow = addRows1.find((r) => r.instanceOption.value.id === "sauce-labs-backpack");
|
|
64
|
-
const bikeLightRow = addRows1.find((r) => r.instanceOption.value.id === "sauce-labs-bike-light");
|
|
65
|
-
if (!backpackRow || !bikeLightRow) {
|
|
66
|
-
throw new Error("expected both the backpack and the bike light as separate rows");
|
|
67
|
-
}
|
|
68
|
-
if (backpackRow.label === bikeLightRow.label) {
|
|
69
|
-
throw new Error("rows must have distinct, item-specific labels");
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// 2. Picking the NON-default item (bike light, not the backpack) must add
|
|
73
|
-
// exactly that item - proving mem really drives which product act() clicks.
|
|
74
|
-
mem.set(bikeLightRow.instanceOption.key, bikeLightRow.instanceOption.value);
|
|
75
|
-
await runBlock(engine, library.byName.get("add-to-cart"), context, page, mem);
|
|
76
|
-
|
|
77
|
-
const bikeLightInCart = await page.locator('[data-test="remove-sauce-labs-bike-light"]').first().isVisible();
|
|
78
|
-
const backpackStillInCart = await page.locator('[data-test="remove-sauce-labs-backpack"]').first().isVisible();
|
|
79
|
-
console.log(`bike light in cart: ${bikeLightInCart}, backpack in cart (should be false): ${backpackStillInCart}`);
|
|
80
|
-
if (!bikeLightInCart) throw new Error("expected the picked item (bike light) to be in the cart");
|
|
81
|
-
if (backpackStillInCart) throw new Error("backpack should NOT be in the cart - it was never picked");
|
|
82
|
-
|
|
83
|
-
// 3. Rebuilding the menu must now offer bike light's "Remove" row instead,
|
|
84
|
-
// and drop it from the add-to-cart options - the menu reflects the live page.
|
|
85
|
-
const menu2 = await buildExploreMenu(page, graph, library, "LoggedIn");
|
|
86
|
-
const addRows2 = menu2.flat.filter((e) => e.block === "add-to-cart");
|
|
87
|
-
if (addRows2.some((r) => r.instanceOption.value.id === "sauce-labs-bike-light")) {
|
|
88
|
-
throw new Error("bike light should no longer be offered - it is already in the cart");
|
|
89
|
-
}
|
|
90
|
-
if (!addRows2.some((r) => r.instanceOption.value.id === "sauce-labs-backpack")) {
|
|
91
|
-
throw new Error("backpack should still be offered - it was never added");
|
|
92
|
-
}
|
|
93
|
-
console.log(`add-to-cart rows after adding bike light: ${addRows2.length} (one fewer than before)`);
|
|
94
|
-
if (addRows2.length !== addRows1.length - 1) {
|
|
95
|
-
throw new Error(`expected exactly one fewer row (${addRows1.length - 1}), got ${addRows2.length}`);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// 4. Same rebuild must now offer Remove for the bike light (mem branch for
|
|
99
|
-
// items already in the cart) - not only shrink the Add list.
|
|
100
|
-
const removeRows = menu2.flat.filter((e) => e.block === "remove-from-cart");
|
|
101
|
-
console.log(`remove-from-cart rows after add: ${removeRows.length}`);
|
|
102
|
-
for (const row of removeRows) console.log(` - ${row.label}`);
|
|
103
|
-
if (removeRows.length !== 1) {
|
|
104
|
-
throw new Error(`expected exactly 1 Remove row (bike light), got ${removeRows.length}`);
|
|
105
|
-
}
|
|
106
|
-
if (removeRows[0].instanceOption.value.id !== "sauce-labs-bike-light") {
|
|
107
|
-
throw new Error(`expected Remove for bike light, got ${removeRows[0].label}`);
|
|
108
|
-
}
|
|
109
|
-
if (!/Remove "Sauce Labs Bike Light" from cart/.test(removeRows[0].label)) {
|
|
110
|
-
throw new Error(`unexpected Remove label: ${removeRows[0].label}`);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
// 5. MemNav: Open "…" details for every inventory card (including ones already
|
|
114
|
-
// in the cart) - separate from Add/Remove effect rows.
|
|
115
|
-
const openRows = menu2.flat.filter((e) => e.block === "nav-item-detail");
|
|
116
|
-
console.log(`nav-item-detail (MemNav) rows: ${openRows.length}`);
|
|
117
|
-
for (const row of openRows) console.log(` - ${row.label}`);
|
|
118
|
-
if (openRows.length < 6) {
|
|
119
|
-
throw new Error(`expected 6 Open details rows, got ${openRows.length}`);
|
|
120
|
-
}
|
|
121
|
-
if (!openRows.some((r) => /Open "Test\.allTheThings\(\) T-Shirt \(Red\)" details/.test(r.label))) {
|
|
122
|
-
throw new Error("missing Open details row for Test.allTheThings() T-Shirt (Red)");
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
console.log("\nPASS: add/remove Effect + open-details MemNav reflect the live page");
|
|
126
|
-
await browser.close();
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
import { chromium } from "@playwright/test";
|
|
2
|
-
import { join, dirname } from "node:path";
|
|
3
|
-
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
4
|
-
import { createRequire } from "node:module";
|
|
5
|
-
import { chromiumExecutablePath } from "waygraph";
|
|
6
|
-
|
|
7
|
-
const require = createRequire(import.meta.url);
|
|
8
|
-
await import(require.resolve("tsx/esm"));
|
|
9
|
-
|
|
10
|
-
const root = join(dirname(fileURLToPath(import.meta.url)), "..");
|
|
11
|
-
const outDir = join(root, "../../.tmp/waygraph-auto");
|
|
12
|
-
const waygraphDist = join(root, "../../dist");
|
|
13
|
-
|
|
14
|
-
const { buildExploreContext, buildExploreMenu } = await import(
|
|
15
|
-
pathToFileURL(join(waygraphDist, "auto-explore.js")).href
|
|
16
|
-
);
|
|
17
|
-
const { locate, MemPage, Engine, start, end } = await import(pathToFileURL(join(waygraphDist, "index.js")).href);
|
|
18
|
-
|
|
19
|
-
const exe = chromiumExecutablePath();
|
|
20
|
-
|
|
21
|
-
async function snap(page, name) {
|
|
22
|
-
const path = join(outDir, `graph-proof-${name}.png`);
|
|
23
|
-
await page.screenshot({ path, fullPage: false });
|
|
24
|
-
console.log("screenshot", path);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
async function resolveHere(page, navTags) {
|
|
28
|
-
const path = new URL(page.url()).pathname;
|
|
29
|
-
if (path.includes("inventory-item.html")) return "ItemDetailPage";
|
|
30
|
-
if (path.includes("inventory.html")) return "LoggedIn";
|
|
31
|
-
if (path.includes("cart.html")) return "CartPage";
|
|
32
|
-
if (path.includes("checkout-complete.html")) return "OrderComplete";
|
|
33
|
-
if (path === "/" || path === "") {
|
|
34
|
-
if (await page.locator("#login-button").isVisible({ timeout: 500 }).catch(() => false)) return "LoginPage";
|
|
35
|
-
}
|
|
36
|
-
return locate(page, navTags, { timeoutMs: 1500 });
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
async function menuSummary(page, graph, library, label) {
|
|
40
|
-
const navTags = library.navBlocks.map((n) => n.block);
|
|
41
|
-
const resolved = await resolveHere(page, navTags);
|
|
42
|
-
const menu = await buildExploreMenu(page, graph, library, resolved);
|
|
43
|
-
console.log(`\n=== ${label} | here=${resolved} ===`);
|
|
44
|
-
for (const s of menu.sections) {
|
|
45
|
-
console.log(` ${s.title}:`);
|
|
46
|
-
for (const e of s.edges) console.log(` ${e.block} (${e.kind}) → ${e.to}`);
|
|
47
|
-
}
|
|
48
|
-
return resolved;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
async function runBlock(engine, entry, context, page, mem) {
|
|
52
|
-
const flow = engine.defineFlow([start, entry.block, end]);
|
|
53
|
-
await flow.run(context, mem, { page, closeOnFinish: false });
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
const { graph, library } = await buildExploreContext(root);
|
|
57
|
-
const mem = new MemPage();
|
|
58
|
-
mem.set(
|
|
59
|
-
library.byName.get("submit-login").block.requires[0],
|
|
60
|
-
{ username: "standard_user", password: "secret_sauce" },
|
|
61
|
-
);
|
|
62
|
-
|
|
63
|
-
const browser = await chromium.launch({
|
|
64
|
-
headless: true,
|
|
65
|
-
...(exe ? { executablePath: exe, args: ["--no-sandbox"] } : {}),
|
|
66
|
-
});
|
|
67
|
-
const context = await browser.newContext({ baseURL: "https://www.saucedemo.com", viewport: { width: 1280, height: 900 } });
|
|
68
|
-
const page = await context.newPage();
|
|
69
|
-
const engine = new Engine({ headless: true });
|
|
70
|
-
|
|
71
|
-
await page.goto("/", { waitUntil: "load" });
|
|
72
|
-
await menuSummary(page, graph, library, "1. Login page");
|
|
73
|
-
await snap(page, "1-login-menu");
|
|
74
|
-
|
|
75
|
-
await runBlock(engine, library.byName.get("submit-login"), context, page, mem);
|
|
76
|
-
await page.waitForURL(/inventory\.html/);
|
|
77
|
-
const here2 = await menuSummary(page, graph, library, "2. After submit-login → LoggedIn");
|
|
78
|
-
if (here2 !== "LoggedIn") throw new Error(`expected LoggedIn got ${here2}`);
|
|
79
|
-
await snap(page, "2-logged-in-menu");
|
|
80
|
-
|
|
81
|
-
const logout = library.byName.get("submit-logout");
|
|
82
|
-
const hasLogout = (await buildExploreMenu(page, graph, library, "LoggedIn")).flat.some((e) => e.block === "submit-logout");
|
|
83
|
-
if (!hasLogout) throw new Error("graph menu missing submit-logout on LoggedIn");
|
|
84
|
-
|
|
85
|
-
await runBlock(engine, logout, context, page, mem);
|
|
86
|
-
await page.waitForSelector("#login-button");
|
|
87
|
-
const here3 = await menuSummary(page, graph, library, "3. After submit-logout → LoginPage");
|
|
88
|
-
if (here3 !== "LoginPage") throw new Error(`expected LoginPage got ${here3}`);
|
|
89
|
-
await snap(page, "3-back-to-login-menu");
|
|
90
|
-
|
|
91
|
-
console.log("\nPASS: graph cycle LoginPage → LoggedIn → LoginPage");
|
|
92
|
-
await browser.close();
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Headless runtime proof: wrong password -> LoginPage + error banner.
|
|
3
|
-
* Prints PASS/FAIL to stdout only (no screenshots, no visible browser).
|
|
4
|
-
*/
|
|
5
|
-
import { chromium } from "@playwright/test";
|
|
6
|
-
import { join, dirname } from "node:path";
|
|
7
|
-
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
8
|
-
import { createRequire } from "node:module";
|
|
9
|
-
import { chromiumExecutablePath } from "waygraph";
|
|
10
|
-
|
|
11
|
-
const require = createRequire(import.meta.url);
|
|
12
|
-
await import(require.resolve("tsx/esm"));
|
|
13
|
-
|
|
14
|
-
const root = join(dirname(fileURLToPath(import.meta.url)), "..");
|
|
15
|
-
const waygraphDist = join(root, "../../dist");
|
|
16
|
-
const { Engine, start, end, MemPage } = await import(pathToFileURL(join(waygraphDist, "index.js")).href);
|
|
17
|
-
const { NavLoginBlock } = await import(pathToFileURL(join(root, "src/blocks/saucedemo-web/nav-login.block.js")).href);
|
|
18
|
-
const { FillUsernameBlock } = await import(
|
|
19
|
-
pathToFileURL(join(root, "src/blocks/saucedemo-web/methods/fill-username.method.block.js")).href
|
|
20
|
-
);
|
|
21
|
-
const { FillPasswordBlock } = await import(
|
|
22
|
-
pathToFileURL(join(root, "src/blocks/saucedemo-web/methods/fill-password.method.block.js")).href
|
|
23
|
-
);
|
|
24
|
-
const { SubmitLoginBlock } = await import(
|
|
25
|
-
pathToFileURL(join(root, "src/blocks/saucedemo-web/methods/submit-login.method.block.js")).href
|
|
26
|
-
);
|
|
27
|
-
const { LoginCreds } = await import(pathToFileURL(join(root, "src/states/checkout.mem-keys.js")).href);
|
|
28
|
-
|
|
29
|
-
const exe = chromiumExecutablePath();
|
|
30
|
-
const baseURL = "https://www.saucedemo.com";
|
|
31
|
-
|
|
32
|
-
console.log("RUNTIME: headless browser (wrong password test)...");
|
|
33
|
-
console.log("RUNTIME: baseURL =", baseURL);
|
|
34
|
-
|
|
35
|
-
const browser = await chromium.launch({
|
|
36
|
-
headless: true,
|
|
37
|
-
...(exe ? { executablePath: exe, args: ["--no-sandbox", "--disable-dev-shm-usage"] } : {}),
|
|
38
|
-
});
|
|
39
|
-
const context = await browser.newContext({ baseURL, viewport: { width: 1280, height: 900 } });
|
|
40
|
-
const page = await context.newPage();
|
|
41
|
-
const engine = new Engine({ headless: true });
|
|
42
|
-
const mem = new MemPage();
|
|
43
|
-
mem.set(LoginCreds({ username: "standard_user", password: "wrong-password" }));
|
|
44
|
-
|
|
45
|
-
const flow = engine.defineFlow([start, NavLoginBlock, FillUsernameBlock, FillPasswordBlock, SubmitLoginBlock, end]);
|
|
46
|
-
const runOut = await flow.run(context, mem, { page, closeOnFinish: false });
|
|
47
|
-
const result = runOut && typeof runOut === "object" && "result" in runOut ? runOut.result : runOut;
|
|
48
|
-
|
|
49
|
-
const errorVisible = await page.locator('[data-test="error"]').isVisible();
|
|
50
|
-
const url = page.url();
|
|
51
|
-
|
|
52
|
-
console.log("RUNTIME: checkpoint =", result.__state);
|
|
53
|
-
console.log("RUNTIME: url =", url);
|
|
54
|
-
console.log("RUNTIME: error banner visible =", errorVisible);
|
|
55
|
-
|
|
56
|
-
if (result.__state !== "LoginPage" || !errorVisible) {
|
|
57
|
-
console.error("RUNTIME: FAIL");
|
|
58
|
-
await browser.close();
|
|
59
|
-
process.exit(1);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
console.log("RUNTIME: PASS — stayed on LoginPage with error banner.");
|
|
63
|
-
await browser.close();
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { fastForwardComposeBlock } from "waygraph";
|
|
2
|
-
import { NavLoginBlock } from "./nav-login.block.js";
|
|
3
|
-
import { FillUsernameBlock } from "./methods/fill-username.method.block.js";
|
|
4
|
-
import { FillPasswordBlock } from "./methods/fill-password.method.block.js";
|
|
5
|
-
import { SubmitLoginForFlow } from "./methods/submit-login-for-flow.js";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Kind: FFCompose (fast-forward)
|
|
9
|
-
* Helper: fastForwardComposeBlock
|
|
10
|
-
* Route: saucedemo-web/ (auth prefix)
|
|
11
|
-
*
|
|
12
|
-
* Collapses nav-login + fill-username + fill-password + submit-login into
|
|
13
|
-
* one opaque demo/run step so checkout demos skip watching auth. Use
|
|
14
|
-
* --ff-expand to gate inners again (they show as 4 separate steps).
|
|
15
|
-
* loginFlow stays expanded for Sign In episode narration.
|
|
16
|
-
*/
|
|
17
|
-
export const FfOwnerAuthBlock = fastForwardComposeBlock("ff-owner-auth", [
|
|
18
|
-
NavLoginBlock,
|
|
19
|
-
FillUsernameBlock,
|
|
20
|
-
FillPasswordBlock,
|
|
21
|
-
SubmitLoginForFlow,
|
|
22
|
-
]);
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { defineConfig } from "@playwright/test";
|
|
2
|
-
|
|
3
|
-
export default defineConfig({
|
|
4
|
-
testDir: "./tests",
|
|
5
|
-
fullyParallel: false,
|
|
6
|
-
workers: 1,
|
|
7
|
-
timeout: 30_000,
|
|
8
|
-
reporter: [["list"], ["html", { open: "never" }]],
|
|
9
|
-
use: {
|
|
10
|
-
headless: true,
|
|
11
|
-
baseURL: "https://www.saucedemo.com",
|
|
12
|
-
trace: "retain-on-failure",
|
|
13
|
-
},
|
|
14
|
-
});
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* Drive `waygraph auto --cli` through login -> add-all -> remove-all -> quit.
|
|
4
|
-
* Waits for each Choose: prompt so picks are not sent early.
|
|
5
|
-
*
|
|
6
|
-
* Usage (from examples/saucedemo):
|
|
7
|
-
* node scripts/drive-auto-cli.mjs
|
|
8
|
-
*/
|
|
9
|
-
import { spawn } from "node:child_process";
|
|
10
|
-
import { createInterface } from "node:readline";
|
|
11
|
-
import { fileURLToPath } from "node:url";
|
|
12
|
-
import { dirname, join } from "node:path";
|
|
13
|
-
|
|
14
|
-
const root = join(dirname(fileURLToPath(import.meta.url)), "..");
|
|
15
|
-
const waygraphBin = join(root, "../../bin/waygraph");
|
|
16
|
-
const DATA =
|
|
17
|
-
process.env.WAYGRAPH_DATA ??
|
|
18
|
-
'{"saucedemo.credentials":{"username":"standard_user","password":"secret_sauce"}}';
|
|
19
|
-
|
|
20
|
-
function pickByLabel(menuText, label) {
|
|
21
|
-
const re = new RegExp(`\\[(\\d+)\\]\\s+${label.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}`);
|
|
22
|
-
const m = menuText.match(re);
|
|
23
|
-
if (!m) throw new Error(`menu missing "${label}"\n${menuText}`);
|
|
24
|
-
return m[1];
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
async function main() {
|
|
28
|
-
const child = spawn(waygraphBin, ["auto", "--cli", "--data", DATA, "."], {
|
|
29
|
-
cwd: root,
|
|
30
|
-
stdio: ["pipe", "pipe", "pipe"],
|
|
31
|
-
env: process.env,
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
let buf = "";
|
|
35
|
-
const dump = (chunk, stream) => {
|
|
36
|
-
const s = chunk.toString();
|
|
37
|
-
buf += s;
|
|
38
|
-
process[stream].write(s);
|
|
39
|
-
};
|
|
40
|
-
child.stdout.on("data", (c) => dump(c, "stdout"));
|
|
41
|
-
child.stderr.on("data", (c) => dump(c, "stderr"));
|
|
42
|
-
|
|
43
|
-
const waitChoose = () =>
|
|
44
|
-
new Promise((resolve, reject) => {
|
|
45
|
-
const start = Date.now();
|
|
46
|
-
const tick = () => {
|
|
47
|
-
if (buf.includes("Choose:")) {
|
|
48
|
-
const i = buf.lastIndexOf("Choose:");
|
|
49
|
-
const slice = buf.slice(Math.max(0, i - 4000), i + 8);
|
|
50
|
-
resolve(slice);
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
if (Date.now() - start > 120_000) {
|
|
54
|
-
reject(new Error(`timeout waiting for Choose:\n${buf.slice(-2000)}`));
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
setTimeout(tick, 100);
|
|
58
|
-
};
|
|
59
|
-
tick();
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
const send = (line) => {
|
|
63
|
-
console.error(`\n>> pick ${line.trim()}`);
|
|
64
|
-
buf = buf.replace(/Choose:/g, "Choose(done):");
|
|
65
|
-
child.stdin.write(line);
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
try {
|
|
69
|
-
let menu = await waitChoose();
|
|
70
|
-
send("1\n"); // submit-login
|
|
71
|
-
menu = await waitChoose();
|
|
72
|
-
if (!/LoggedIn|Add all to cart/.test(menu)) {
|
|
73
|
-
throw new Error(`expected inventory after login, got:\n${menu}`);
|
|
74
|
-
}
|
|
75
|
-
send(`${pickByLabel(menu, "Add all to cart")}\n`);
|
|
76
|
-
menu = await waitChoose();
|
|
77
|
-
send(`${pickByLabel(menu, "Remove all from cart")}\n`);
|
|
78
|
-
menu = await waitChoose();
|
|
79
|
-
if (!/Add all to cart/.test(menu)) {
|
|
80
|
-
throw new Error(`expected Add all again after remove-all, got:\n${menu}`);
|
|
81
|
-
}
|
|
82
|
-
send("q\n");
|
|
83
|
-
const code = await new Promise((res) => child.on("exit", res));
|
|
84
|
-
if (code !== 0 && code !== null) process.exitCode = code;
|
|
85
|
-
else console.error("\ndrive-auto-cli: PASS login -> add-all -> remove-all -> quit");
|
|
86
|
-
} catch (err) {
|
|
87
|
-
console.error(err instanceof Error ? err.message : String(err));
|
|
88
|
-
child.kill("SIGTERM");
|
|
89
|
-
process.exitCode = 1;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
main();
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { fastForwardComposeBlock } from "waygraph";
|
|
2
|
-
import { NavLoginBlock } from "./nav-login.block.js";
|
|
3
|
-
import { FillUsernameBlock } from "./methods/fill-username.method.block.js";
|
|
4
|
-
import { FillPasswordBlock } from "./methods/fill-password.method.block.js";
|
|
5
|
-
import { SubmitLoginForFlow } from "./methods/submit-login-for-flow.js";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Kind: FFCompose (fast-forward)
|
|
9
|
-
* Helper: fastForwardComposeBlock
|
|
10
|
-
* Route: saucedemo-web/ (auth prefix)
|
|
11
|
-
*
|
|
12
|
-
* Collapses nav-login + fill-username + fill-password + submit-login into
|
|
13
|
-
* one opaque demo/run step so checkout demos skip watching auth. Use
|
|
14
|
-
* --ff-expand to gate inners again (they show as 4 separate steps).
|
|
15
|
-
* loginFlow stays expanded for Sign In episode narration.
|
|
16
|
-
*/
|
|
17
|
-
export const FfOwnerAuthBlock = fastForwardComposeBlock("ff-owner-auth", [
|
|
18
|
-
NavLoginBlock,
|
|
19
|
-
FillUsernameBlock,
|
|
20
|
-
FillPasswordBlock,
|
|
21
|
-
SubmitLoginForFlow,
|
|
22
|
-
]);
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|