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,7 +1,8 @@
|
|
|
1
|
-
import type { Checkpoint
|
|
2
|
-
import type {
|
|
3
|
-
import {
|
|
4
|
-
import type {
|
|
1
|
+
import type { Checkpoint } from "../../checkpoint/checkpoint.js";
|
|
2
|
+
import type { DefinedBlock } from "../block.js";
|
|
3
|
+
import type { Trait } from "../../trait/trait.js";
|
|
4
|
+
import type { RoutedBlockBase } from "../../checkpoint/route.js";
|
|
5
|
+
import type { MemKey } from "../../mem/mem.js";
|
|
5
6
|
/**
|
|
6
7
|
* TypeScript salt over {@link defineBlock} for one-shot non-nav app steps
|
|
7
8
|
* (submit, upload, finish, logout) - **methods** on a page. Same runtime Block;
|
|
@@ -15,23 +16,18 @@ export type MethodBlock<In extends Checkpoint<string>, Out extends Checkpoint<st
|
|
|
15
16
|
withVerify(verify: Trait[] | ((out: Out) => Trait[])): MethodBlock<In, Out>;
|
|
16
17
|
modVerify(nameOrIndex: string | number, newCheck: Trait["check"] | Trait): MethodBlock<In, Out>;
|
|
17
18
|
modVerifyAll(patches: Record<string, Trait["check"] | Trait>): MethodBlock<In, Out>;
|
|
18
|
-
stubBefore(stub: import("../../
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
stubAfter(stub: import("../../highlights.js").StubLifecycleFn<Out>): MethodBlock<In, Out>;
|
|
22
|
-
stubOnError(stub: import("../../highlights.js").HighlightStubPhase): MethodBlock<In, Out>;
|
|
23
|
-
stubOnError(stub: import("../../highlights.js").StubLifecycleFn<Out>): MethodBlock<In, Out>;
|
|
19
|
+
stubBefore(stub: import("../../stub/stub.js").StubLifecycleFn<Out>): MethodBlock<In, Out>;
|
|
20
|
+
stubAfter(stub: import("../../stub/stub.js").StubLifecycleFn<Out>): MethodBlock<In, Out>;
|
|
21
|
+
stubOnError(stub: import("../../stub/stub.js").StubLifecycleFn<Out>): MethodBlock<In, Out>;
|
|
24
22
|
};
|
|
25
|
-
/**
|
|
26
|
-
export
|
|
27
|
-
|
|
28
|
-
/** @deprecated Prefer {@link defineMethodBlock} - identical helper (0.7 name). */
|
|
29
|
-
export declare const defineActionBlock: typeof defineMethodBlock;
|
|
23
|
+
/** Builds a Block for one page action (fill, submit, click) that does not navigate. */
|
|
24
|
+
export declare function defineMethodBlock<In extends Checkpoint<string>, Out extends Checkpoint<string>>(base: RoutedBlockBase<In, Out>): MethodBlock<In, Out>;
|
|
25
|
+
/** Options for `defineAssertBlock`: a Checkpoint to stay on and the Traits that must hold. */
|
|
30
26
|
export interface AssertBlockOptions<Out extends Checkpoint<string> = Checkpoint<string>> {
|
|
31
27
|
name: string;
|
|
32
28
|
description?: string;
|
|
33
|
-
/**
|
|
34
|
-
checkpoint: Out
|
|
29
|
+
/** The Checkpoint this assertion runs on and returns to: its value (`Home`). */
|
|
30
|
+
checkpoint: Out;
|
|
35
31
|
/**
|
|
36
32
|
* Shorthand for the wait-then-assert shape found repeatedly in hand-written
|
|
37
33
|
* assertion Blocks: waits for a heading with this accessible name before
|
|
@@ -42,12 +38,9 @@ export interface AssertBlockOptions<Out extends Checkpoint<string> = Checkpoint<
|
|
|
42
38
|
waitForHeading?: string;
|
|
43
39
|
verify: Trait[] | ((out: Out) => Trait[]);
|
|
44
40
|
/** Mem keys this assertion's `verify` reads (e.g. a mem-aware Trait) - checked by preflight before the flow runs. */
|
|
45
|
-
requires?: readonly MemKey<
|
|
46
|
-
stubBefore?: import("../../highlights.js").HighlightStubPhaseOrFn<Out>;
|
|
47
|
-
stubAfter?: import("../../highlights.js").HighlightStubPhaseOrFn<Out>;
|
|
48
|
-
stubOnError?: import("../../highlights.js").HighlightStubPhaseOrFn<Out>;
|
|
41
|
+
requires?: readonly MemKey<unknown>[];
|
|
49
42
|
/** Multi-step yap slides (demo only) - same field `Instruction.slides` exposes elsewhere. */
|
|
50
|
-
slides?: import("../../
|
|
43
|
+
slides?: import("../../stub/ring.js").WaygraphSlidesOrFn<Out>;
|
|
51
44
|
}
|
|
52
45
|
/**
|
|
53
46
|
* Sugar for a self-loop-only "pure assertion" Block: no hand-written
|
|
@@ -65,7 +58,7 @@ export interface AssertBlockOptions<Out extends Checkpoint<string> = Checkpoint<
|
|
|
65
58
|
* verify: [Trait.visible(RawMaterialsSel.reorderBadge)],
|
|
66
59
|
* });
|
|
67
60
|
*/
|
|
68
|
-
export declare function defineAssertBlock<Out extends Checkpoint<string
|
|
61
|
+
export declare function defineAssertBlock<Out extends Checkpoint<string>>(options: AssertBlockOptions<Out>): AssertBlock<Out>;
|
|
69
62
|
/**
|
|
70
63
|
* Self-loop verify Block from {@link defineAssertBlock}. Branded for
|
|
71
64
|
* {@link MapBuilder.assert} (not accepted by `.method()`).
|
|
@@ -75,10 +68,7 @@ export type AssertBlock<Out extends Checkpoint<string>> = Omit<DefinedBlock<Out,
|
|
|
75
68
|
withVerify(verify: Trait[] | ((out: Out) => Trait[])): AssertBlock<Out>;
|
|
76
69
|
modVerify(nameOrIndex: string | number, newCheck: Trait["check"] | Trait): AssertBlock<Out>;
|
|
77
70
|
modVerifyAll(patches: Record<string, Trait["check"] | Trait>): AssertBlock<Out>;
|
|
78
|
-
stubBefore(stub: import("../../
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
stubAfter(stub: import("../../highlights.js").StubLifecycleFn<Out>): AssertBlock<Out>;
|
|
82
|
-
stubOnError(stub: import("../../highlights.js").HighlightStubPhase): AssertBlock<Out>;
|
|
83
|
-
stubOnError(stub: import("../../highlights.js").StubLifecycleFn<Out>): AssertBlock<Out>;
|
|
71
|
+
stubBefore(stub: import("../../stub/stub.js").StubLifecycleFn<Out>): AssertBlock<Out>;
|
|
72
|
+
stubAfter(stub: import("../../stub/stub.js").StubLifecycleFn<Out>): AssertBlock<Out>;
|
|
73
|
+
stubOnError(stub: import("../../stub/stub.js").StubLifecycleFn<Out>): AssertBlock<Out>;
|
|
84
74
|
};
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
// Split out of the former 2,900-line engine.ts (see src/ARCHITECTURE.md). Behavior unchanged.
|
|
2
|
-
import { checkpoint } from "../../types.js";
|
|
3
1
|
import { defineBlock } from "../block.js";
|
|
2
|
+
import { markRouteOf, routed } from "../../checkpoint/route.js";
|
|
3
|
+
/** Builds a Block for one page action (fill, submit, click) that does not navigate. */
|
|
4
4
|
export function defineMethodBlock(base) {
|
|
5
|
-
const built = defineBlock(base);
|
|
5
|
+
const built = defineBlock(routed(base));
|
|
6
|
+
markRouteOf(built, base);
|
|
6
7
|
Object.defineProperty(built, "__waygraphSalt", {
|
|
7
8
|
value: "method",
|
|
8
9
|
enumerable: false,
|
|
@@ -10,8 +11,6 @@ export function defineMethodBlock(base) {
|
|
|
10
11
|
});
|
|
11
12
|
return built;
|
|
12
13
|
}
|
|
13
|
-
/** @deprecated Prefer {@link defineMethodBlock} - identical helper (0.7 name). */
|
|
14
|
-
export const defineActionBlock = defineMethodBlock;
|
|
15
14
|
/**
|
|
16
15
|
* Sugar for a self-loop-only "pure assertion" Block: no hand-written
|
|
17
16
|
* `act`/`resolve`, just a name, a `checkpoint` tag, and a `verify` array.
|
|
@@ -33,32 +32,19 @@ export function defineAssertBlock(options) {
|
|
|
33
32
|
name: options.name,
|
|
34
33
|
...(options.description ? { description: options.description } : {}),
|
|
35
34
|
...(options.requires ? { requires: options.requires } : {}),
|
|
35
|
+
// An assertion stays where it is: from and to are its one Checkpoint, and resolve lands there.
|
|
36
|
+
from: options.checkpoint,
|
|
37
|
+
to: options.checkpoint,
|
|
36
38
|
instruction: {
|
|
37
39
|
async act(page) {
|
|
38
40
|
if (options.waitForHeading !== undefined) {
|
|
39
41
|
await page.getByRole("heading", { name: options.waitForHeading }).waitFor();
|
|
40
42
|
}
|
|
41
43
|
},
|
|
42
|
-
resolve: () => checkpoint(options.checkpoint),
|
|
43
44
|
verify: options.verify,
|
|
44
|
-
...(options.stubBefore ? { stubBefore: options.stubBefore } : {}),
|
|
45
|
-
...(options.stubAfter ? { stubAfter: options.stubAfter } : {}),
|
|
46
|
-
...(options.stubOnError ? { stubOnError: options.stubOnError } : {}),
|
|
47
45
|
...(options.slides ? { slides: options.slides } : {}),
|
|
48
46
|
},
|
|
49
47
|
});
|
|
50
|
-
// Real bug this closes: `waygraph graph`'s static discovery only knows
|
|
51
|
-
// how to read a Block's Checkpoint tags from an EXPLICIT `<In, Out>`
|
|
52
|
-
// generic written in the source text (or, for Nav/Page Blocks, by calling
|
|
53
|
-
// their own input-independent `resolve()` directly). `defineAssertBlock`'s
|
|
54
|
-
// whole point is skipping that generic - called exactly as documented
|
|
55
|
-
// (`defineAssertBlock({ name, checkpoint, verify })`, no generics), it was
|
|
56
|
-
// silently invisible to both `waygraph graph` and the live Pilot menu
|
|
57
|
-
// ("2 Block(s) skipped (Out not resolvable)", confirmed live against a
|
|
58
|
-
// real veciro-waygraph session). `resolve()` here is ALSO input-
|
|
59
|
-
// independent (always `checkpoint(options.checkpoint)`), so the same
|
|
60
|
-
// resolve()-calling path Nav/Page Blocks already use is reused via this
|
|
61
|
-
// marker instead of requiring authors to write generics just to be found.
|
|
62
48
|
Object.defineProperty(built, "__waygraphKind", {
|
|
63
49
|
value: "assert",
|
|
64
50
|
enumerable: false,
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import type { Block,
|
|
2
|
-
import type {
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
1
|
+
import type { Block, DefinedBlock } from "../block.js";
|
|
2
|
+
import type { Checkpoint } from "../../checkpoint/checkpoint.js";
|
|
3
|
+
import type { Trait } from "../../trait/trait.js";
|
|
4
|
+
import { MemPage } from "../../mem/mem.js";
|
|
5
|
+
import type { MemKey } from "../../mem/mem.js";
|
|
5
6
|
/**
|
|
6
7
|
* A Block whose only possible action is navigating to a URL - built via
|
|
7
8
|
* {@link defineNavBlock}, never with a hand-authored `act()`. Extends `Block`
|
|
8
9
|
* (same shape `DefinedBlock`/`ComposedBlock` already use), so it drops into
|
|
9
|
-
* `
|
|
10
|
+
* `map()`, `connect()`, `composeBlock()` exactly like any other
|
|
10
11
|
* Block - no special-casing needed anywhere that only expects a `Block`.
|
|
11
12
|
* See `openspec/specs/nav-block-and-check/spec.md` for why this exists.
|
|
12
13
|
*
|
|
@@ -20,12 +21,9 @@ export type NavBlock<Out extends Checkpoint<string>> = Omit<DefinedBlock<Checkpo
|
|
|
20
21
|
withVerify(verify: Trait[] | ((out: Out) => Trait[])): NavBlock<Out>;
|
|
21
22
|
modVerify(nameOrIndex: string | number, newCheck: Trait["check"] | Trait): NavBlock<Out>;
|
|
22
23
|
modVerifyAll(patches: Record<string, Trait["check"] | Trait>): NavBlock<Out>;
|
|
23
|
-
stubBefore(stub: import("../../
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
stubAfter(stub: import("../../highlights.js").StubLifecycleFn<Out>): NavBlock<Out>;
|
|
27
|
-
stubOnError(stub: import("../../highlights.js").HighlightStubPhase): NavBlock<Out>;
|
|
28
|
-
stubOnError(stub: import("../../highlights.js").StubLifecycleFn<Out>): NavBlock<Out>;
|
|
24
|
+
stubBefore(stub: import("../../stub/stub.js").StubLifecycleFn<Out>): NavBlock<Out>;
|
|
25
|
+
stubAfter(stub: import("../../stub/stub.js").StubLifecycleFn<Out>): NavBlock<Out>;
|
|
26
|
+
stubOnError(stub: import("../../stub/stub.js").StubLifecycleFn<Out>): NavBlock<Out>;
|
|
29
27
|
};
|
|
30
28
|
/**
|
|
31
29
|
* `defineNavBlock`'s own options - exactly one of `url`/`click` required,
|
|
@@ -38,23 +36,19 @@ export type NavBlock<Out extends Checkpoint<string>> = Omit<DefinedBlock<Checkpo
|
|
|
38
36
|
export type NavBlockOptions<Out extends Checkpoint<string>> = {
|
|
39
37
|
name: string;
|
|
40
38
|
description?: string;
|
|
41
|
-
|
|
39
|
+
/** The Checkpoint this Nav lands on: its value (`Home`). */
|
|
40
|
+
checkpoint: Out;
|
|
42
41
|
/**
|
|
43
42
|
* Checkpoint tags this Nav can run from. Omit (the default) = reachable from anywhere. Set it for
|
|
44
43
|
* a page that only exists after something else - e.g. every in-app page after sign-in - so route
|
|
45
44
|
* finding (`auto --blocks`, `pilot reach`, `traverse`) goes through the sign-in steps instead of
|
|
46
45
|
* jumping straight there from the login page.
|
|
47
|
-
* @example const SIGNED_IN = [
|
|
46
|
+
* @example const SIGNED_IN = [Dashboard, CommandCenter] as const; // src/states/
|
|
48
47
|
* defineNavBlock({ ..., from: SIGNED_IN })
|
|
49
48
|
*/
|
|
50
|
-
from?: readonly string[];
|
|
51
|
-
requires?: readonly MemKey<
|
|
49
|
+
from?: readonly Checkpoint<string>[];
|
|
50
|
+
requires?: readonly MemKey<unknown>[];
|
|
52
51
|
verify?: Trait[] | ((out: Out) => Trait[]);
|
|
53
|
-
stubBefore?: import("../../highlights.js").HighlightStubPhaseOrFn<Out>;
|
|
54
|
-
stubAfter?: import("../../highlights.js").HighlightStubPhaseOrFn<Out>;
|
|
55
|
-
stubOnError?: import("../../highlights.js").HighlightStubPhaseOrFn<Out>;
|
|
56
|
-
/** @deprecated Prefer stubAfter. */
|
|
57
|
-
highlights?: readonly WaygraphHighlight[] | ((out: Out) => readonly WaygraphHighlight[]);
|
|
58
52
|
/**
|
|
59
53
|
* Live per-instance menu rows for `waygraph auto` (see {@link Block.instanceOptions}).
|
|
60
54
|
* When set, the explore menu lists one row per option instead of a single
|
|
@@ -110,19 +104,16 @@ export declare function defineNavBlock<Out extends Checkpoint<string>>(options:
|
|
|
110
104
|
export type NavClickBlockOptions<Out extends Checkpoint<string>> = {
|
|
111
105
|
name: string;
|
|
112
106
|
description?: string;
|
|
113
|
-
|
|
107
|
+
/** The Checkpoint this Nav lands on: its value (`Home`). */
|
|
108
|
+
checkpoint: Out;
|
|
114
109
|
click: string | ((mem: MemPage) => string);
|
|
115
|
-
/**
|
|
116
|
-
from?: readonly string[];
|
|
117
|
-
requires?: readonly MemKey<
|
|
110
|
+
/** Where the click can start: the Checkpoints whose page shows the link. Leave out for "from anywhere". */
|
|
111
|
+
from?: readonly Checkpoint<string>[];
|
|
112
|
+
requires?: readonly MemKey<unknown>[];
|
|
118
113
|
verify?: Trait[] | ((out: Out) => Trait[]);
|
|
119
|
-
stubBefore?: import("../../highlights.js").HighlightStubPhaseOrFn<Out>;
|
|
120
|
-
stubAfter?: import("../../highlights.js").HighlightStubPhaseOrFn<Out>;
|
|
121
|
-
stubOnError?: import("../../highlights.js").HighlightStubPhaseOrFn<Out>;
|
|
122
|
-
/** @deprecated Prefer stubAfter. */
|
|
123
|
-
highlights?: readonly WaygraphHighlight[] | ((out: Out) => readonly WaygraphHighlight[]);
|
|
124
114
|
instanceOptions?: Block<Checkpoint<string>, Out>["instanceOptions"];
|
|
125
115
|
};
|
|
116
|
+
/** A Block whose only action is clicking a link; built with `defineNavClickBlock`. */
|
|
126
117
|
export type NavClickBlock<Out extends Checkpoint<string>> = NavBlock<Out>;
|
|
127
118
|
/** @see {@link NavClickBlockOptions} */
|
|
128
119
|
export declare function defineNavClickBlock<Out extends Checkpoint<string>>(options: NavClickBlockOptions<Out>): NavClickBlock<Out>;
|
|
@@ -131,7 +122,7 @@ export declare function defineNavClickBlock<Out extends Checkpoint<string>>(opti
|
|
|
131
122
|
* (which product row / which request id). Still a NavBlock / Block at runtime.
|
|
132
123
|
*/
|
|
133
124
|
export type MemNavBlock<Out extends Checkpoint<string>> = NavBlock<Out> & {
|
|
134
|
-
requires: readonly MemKey<
|
|
125
|
+
requires: readonly MemKey<unknown>[];
|
|
135
126
|
instanceOptions: NonNullable<Block<Checkpoint<string>, Out>["instanceOptions"]>;
|
|
136
127
|
};
|
|
137
128
|
/**
|
|
@@ -141,6 +132,6 @@ export type MemNavBlock<Out extends Checkpoint<string>> = NavBlock<Out> & {
|
|
|
141
132
|
* several live rows/items rather than a fixed nav target. Still a Block.
|
|
142
133
|
*/
|
|
143
134
|
export declare function defineMemNavBlock<Out extends Checkpoint<string>>(options: NavBlockOptions<Out> & {
|
|
144
|
-
requires: readonly MemKey<
|
|
135
|
+
requires: readonly MemKey<unknown>[];
|
|
145
136
|
instanceOptions: NonNullable<Block<Checkpoint<string>, Out>["instanceOptions"]>;
|
|
146
137
|
}): MemNavBlock<Out>;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
//
|
|
2
|
-
import { checkpoint } from "../../
|
|
1
|
+
// A Nav Block: gets to a page, by URL or by clicking a link, and lands on that page's Checkpoint.
|
|
2
|
+
import { checkpoint } from "../../checkpoint/checkpoint.js";
|
|
3
3
|
import { defineBlock } from "../block.js";
|
|
4
|
+
import { markRoute, tagsOf } from "../../checkpoint/route.js";
|
|
4
5
|
/**
|
|
5
6
|
* Builds a {@link NavBlock}. The generated `act()` is always exactly
|
|
6
7
|
* `page.goto(url)` or `page.locator(click).click()` - never anything else,
|
|
@@ -34,14 +35,11 @@ export function defineNavBlock(options) {
|
|
|
34
35
|
await page.locator(selector).click();
|
|
35
36
|
}
|
|
36
37
|
},
|
|
37
|
-
resolve: () => checkpoint(options.checkpoint),
|
|
38
|
+
resolve: () => checkpoint(options.checkpoint.__state),
|
|
38
39
|
...(options.verify ? { verify: options.verify } : {}),
|
|
39
|
-
...(options.stubBefore ? { stubBefore: options.stubBefore } : {}),
|
|
40
|
-
...(options.stubAfter ? { stubAfter: options.stubAfter } : {}),
|
|
41
|
-
...(options.stubOnError ? { stubOnError: options.stubOnError } : {}),
|
|
42
|
-
...(options.highlights ? { highlights: options.highlights } : {}),
|
|
43
40
|
},
|
|
44
41
|
});
|
|
42
|
+
markRoute(built, options.from?.length ? tagsOf(options.from) : ["*"], [options.checkpoint.__state]);
|
|
45
43
|
// Non-enumerable so it never shows up in Object.keys/JSON/autocomplete -
|
|
46
44
|
// purely a runtime marker `waygraph check` (or anything else walking a
|
|
47
45
|
// project's Blocks) can test for to tell a NavBlock apart from a regular
|
|
@@ -56,7 +54,7 @@ export function defineNavBlock(options) {
|
|
|
56
54
|
// overlays can label "nav click" without re-parsing source.
|
|
57
55
|
if (options.from && options.from.length > 0) {
|
|
58
56
|
Object.defineProperty(built, "__waygraphNavFrom", {
|
|
59
|
-
value:
|
|
57
|
+
value: tagsOf(options.from),
|
|
60
58
|
enumerable: false,
|
|
61
59
|
configurable: false,
|
|
62
60
|
});
|
|
@@ -94,10 +92,6 @@ export function defineNavClickBlock(options) {
|
|
|
94
92
|
...(options.description ? { description: options.description } : {}),
|
|
95
93
|
...(options.requires ? { requires: options.requires } : {}),
|
|
96
94
|
...(options.verify ? { verify: options.verify } : {}),
|
|
97
|
-
...(options.stubBefore ? { stubBefore: options.stubBefore } : {}),
|
|
98
|
-
...(options.stubAfter ? { stubAfter: options.stubAfter } : {}),
|
|
99
|
-
...(options.stubOnError ? { stubOnError: options.stubOnError } : {}),
|
|
100
|
-
...(options.highlights ? { highlights: options.highlights } : {}),
|
|
101
95
|
...(options.instanceOptions ? { instanceOptions: options.instanceOptions } : {}),
|
|
102
96
|
});
|
|
103
97
|
}
|
|
@@ -1,21 +1,19 @@
|
|
|
1
|
-
import type { Block,
|
|
2
|
-
import type {
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
1
|
+
import type { Block, DefinedBlock } from "../block.js";
|
|
2
|
+
import type { Checkpoint } from "../../checkpoint/checkpoint.js";
|
|
3
|
+
import type { Trait } from "../../trait/trait.js";
|
|
4
|
+
import { MemPage } from "../../mem/mem.js";
|
|
5
|
+
import type { MemKey } from "../../mem/mem.js";
|
|
6
|
+
import type { SomeDefinedBlock } from "../block.js";
|
|
5
7
|
/** One Block (or lazy factory) registered on a {@link PageBlock}. */
|
|
6
|
-
export type PageMethodEntry =
|
|
8
|
+
export type PageMethodEntry = SomeDefinedBlock | (() => SomeDefinedBlock);
|
|
9
|
+
/** Options for `definePageBlock`: the Checkpoint a page hub confirms and the Methods that hang off it. */
|
|
7
10
|
export type PageBlockOptions<Out extends Checkpoint<string>> = {
|
|
8
11
|
name: string;
|
|
9
12
|
description?: string;
|
|
10
|
-
/** Checkpoint
|
|
11
|
-
checkpoint: Out
|
|
13
|
+
/** The Checkpoint this page hub confirms: its value (`Home`). */
|
|
14
|
+
checkpoint: Out;
|
|
12
15
|
verify?: Trait[] | ((out: Out) => Trait[]);
|
|
13
|
-
|
|
14
|
-
stubAfter?: import("../../highlights.js").HighlightStubPhaseOrFn<Out>;
|
|
15
|
-
stubOnError?: import("../../highlights.js").HighlightStubPhaseOrFn<Out>;
|
|
16
|
-
/** @deprecated Prefer stubAfter. */
|
|
17
|
-
highlights?: readonly WaygraphHighlight[] | ((out: Out) => readonly WaygraphHighlight[]);
|
|
18
|
-
requires?: readonly MemKey<any>[];
|
|
16
|
+
requires?: readonly MemKey<unknown>[];
|
|
19
17
|
/**
|
|
20
18
|
* Methods available on this page. Array, or a record of Blocks / `() => Block`
|
|
21
19
|
* factories (lazy so the page object can colocate method definitions).
|
|
@@ -41,16 +39,13 @@ export type PageBlockOptions<Out extends Checkpoint<string>> = {
|
|
|
41
39
|
export type PageBlock<Out extends Checkpoint<string>> = Omit<DefinedBlock<Checkpoint<string>, Out>, "withVerify" | "modVerify" | "modVerifyAll" | "stubBefore" | "stubAfter" | "stubOnError"> & {
|
|
42
40
|
readonly __wgFactory?: "page";
|
|
43
41
|
/** Resolved method Blocks registered at define time. */
|
|
44
|
-
readonly methods: readonly
|
|
42
|
+
readonly methods: readonly SomeDefinedBlock[];
|
|
45
43
|
withVerify(verify: Trait[] | ((out: Out) => Trait[])): PageBlock<Out>;
|
|
46
44
|
modVerify(nameOrIndex: string | number, newCheck: Trait["check"] | Trait): PageBlock<Out>;
|
|
47
45
|
modVerifyAll(patches: Record<string, Trait["check"] | Trait>): PageBlock<Out>;
|
|
48
|
-
stubBefore(stub: import("../../
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
stubAfter(stub: import("../../highlights.js").StubLifecycleFn<Out>): PageBlock<Out>;
|
|
52
|
-
stubOnError(stub: import("../../highlights.js").HighlightStubPhase): PageBlock<Out>;
|
|
53
|
-
stubOnError(stub: import("../../highlights.js").StubLifecycleFn<Out>): PageBlock<Out>;
|
|
46
|
+
stubBefore(stub: import("../../stub/stub.js").StubLifecycleFn<Out>): PageBlock<Out>;
|
|
47
|
+
stubAfter(stub: import("../../stub/stub.js").StubLifecycleFn<Out>): PageBlock<Out>;
|
|
48
|
+
stubOnError(stub: import("../../stub/stub.js").StubLifecycleFn<Out>): PageBlock<Out>;
|
|
54
49
|
};
|
|
55
50
|
/** @see {@link PageBlockOptions} */
|
|
56
51
|
export declare function definePageBlock<Out extends Checkpoint<string>>(options: PageBlockOptions<Out>): PageBlock<Out>;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
//
|
|
2
|
-
import { checkpoint } from "../../
|
|
1
|
+
// A Page Block: "you have arrived" - the hub other pages navigate to, verified by what the page shows.
|
|
2
|
+
import { checkpoint } from "../../checkpoint/checkpoint.js";
|
|
3
3
|
import { defineBlock } from "../block.js";
|
|
4
|
+
import { markRoute } from "../../checkpoint/route.js";
|
|
4
5
|
function resolvePageMethods(methods) {
|
|
5
6
|
if (!methods)
|
|
6
7
|
return [];
|
|
@@ -30,14 +31,11 @@ export function definePageBlock(options) {
|
|
|
30
31
|
}
|
|
31
32
|
// else: arrival-only hub — previous Block already landed here
|
|
32
33
|
},
|
|
33
|
-
resolve: () => checkpoint(options.checkpoint),
|
|
34
|
+
resolve: () => checkpoint(options.checkpoint.__state),
|
|
34
35
|
...(options.verify ? { verify: options.verify } : {}),
|
|
35
|
-
...(options.stubBefore ? { stubBefore: options.stubBefore } : {}),
|
|
36
|
-
...(options.stubAfter ? { stubAfter: options.stubAfter } : {}),
|
|
37
|
-
...(options.stubOnError ? { stubOnError: options.stubOnError } : {}),
|
|
38
|
-
...(options.highlights ? { highlights: options.highlights } : {}),
|
|
39
36
|
},
|
|
40
37
|
});
|
|
38
|
+
markRoute(built, ["*"], [options.checkpoint.__state]);
|
|
41
39
|
Object.defineProperty(built, "__waygraphKind", {
|
|
42
40
|
value: "page",
|
|
43
41
|
enumerable: false,
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A Checkpoint is identified solely by its string tag - a phantom marker with no
|
|
3
|
+
* embedded data. Two Checkpoints with the same tag are the same state everywhere.
|
|
4
|
+
*/
|
|
5
|
+
export type Checkpoint<Tag extends string> = {
|
|
6
|
+
readonly __state: Tag;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Builds a Checkpoint - spells `__state` for you so no call site does it by hand.
|
|
10
|
+
* @example resolve: () => checkpoint("LoggedIn")
|
|
11
|
+
*/
|
|
12
|
+
export declare function checkpoint<Tag extends string>(tag: Tag): Checkpoint<Tag>;
|
|
13
|
+
/**
|
|
14
|
+
* The type every entry Block's `In` must be - `runGraph` always seeds a fresh
|
|
15
|
+
* run with `checkpoint("__start__")` as the fake initial input, so a Block
|
|
16
|
+
* meant to lead off a Flow needs exactly this type. Exported so no project
|
|
17
|
+
* has to know or hand-type the `"__start__"` literal itself - the same reason
|
|
18
|
+
* `checkpoint()` exists instead of every call site spelling `{ __state: tag }`
|
|
19
|
+
* by hand.
|
|
20
|
+
* @example export const LoginBlock: Block<Start, LoggedIn> = { ... }
|
|
21
|
+
*/
|
|
22
|
+
export type Start = Checkpoint<"__start__">;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// The states a flow moves between. A Checkpoint is just its tag; flows declare them once as values.
|
|
2
|
+
/**
|
|
3
|
+
* Builds a Checkpoint - spells `__state` for you so no call site does it by hand.
|
|
4
|
+
* @example resolve: () => checkpoint("LoggedIn")
|
|
5
|
+
*/
|
|
6
|
+
export function checkpoint(tag) {
|
|
7
|
+
return { __state: tag };
|
|
8
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Checkpoint } from "./checkpoint.js";
|
|
2
|
+
import type { defineBlock } from "../block/block.js";
|
|
3
|
+
/** Tags of one Checkpoint or a list of them. */
|
|
4
|
+
export declare function tagsOf(refs: Checkpoint<string> | readonly Checkpoint<string>[]): string[];
|
|
5
|
+
/**
|
|
6
|
+
* Records where a Block runs from and lands on, as tags, so the manifest can read the graph at runtime. `from` of `["*"]`
|
|
7
|
+
* means reachable from anywhere.
|
|
8
|
+
*/
|
|
9
|
+
export declare function markRoute(block: object, from: readonly string[], to: readonly string[]): void;
|
|
10
|
+
export type BlockBase<In extends Checkpoint<string>, Out extends Checkpoint<string>> = Parameters<typeof defineBlock<In, Out>>[0];
|
|
11
|
+
/**
|
|
12
|
+
* A Method or Effect that says where it runs: `from` (one Checkpoint value or a list; leave it out for "from anywhere") and
|
|
13
|
+
* `to`. `resolve` may be left out when `to` is one Checkpoint; it then always lands there.
|
|
14
|
+
*/
|
|
15
|
+
export type RoutedBlockBase<In extends Checkpoint<string>, Out extends Checkpoint<string>> = Omit<BlockBase<In, Out>, "instruction"> & {
|
|
16
|
+
from?: In | readonly In[];
|
|
17
|
+
to: Out | readonly Out[];
|
|
18
|
+
instruction: Omit<BlockBase<In, Out>["instruction"], "resolve" | "stubBefore" | "stubAfter" | "stubOnError"> & {
|
|
19
|
+
resolve?: BlockBase<In, Out>["instruction"]["resolve"];
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
/** Turns a `from`/`to` Block base into the plain one `defineBlock` takes (filling `resolve` for a single `to`). */
|
|
23
|
+
export declare function routed<In extends Checkpoint<string>, Out extends Checkpoint<string>>(base: RoutedBlockBase<In, Out>): BlockBase<In, Out>;
|
|
24
|
+
/** Records a routed Block's `from`/`to` on the built Block. */
|
|
25
|
+
export declare function markRouteOf(block: object, base: {
|
|
26
|
+
from?: Checkpoint<string> | readonly Checkpoint<string>[];
|
|
27
|
+
to: Checkpoint<string> | readonly Checkpoint<string>[];
|
|
28
|
+
}): void;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { checkpoint } from "./checkpoint.js";
|
|
2
|
+
/** Tags of one Checkpoint or a list of them. */
|
|
3
|
+
export function tagsOf(refs) {
|
|
4
|
+
return (Array.isArray(refs) ? refs : [refs]).map((r) => r.__state);
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Records where a Block runs from and lands on, as tags, so the manifest can read the graph at runtime. `from` of `["*"]`
|
|
8
|
+
* means reachable from anywhere.
|
|
9
|
+
*/
|
|
10
|
+
export function markRoute(block, from, to) {
|
|
11
|
+
Object.defineProperty(block, "__waygraphFrom", { value: [...from], enumerable: false, configurable: true });
|
|
12
|
+
Object.defineProperty(block, "__waygraphTo", { value: [...to], enumerable: false, configurable: true });
|
|
13
|
+
}
|
|
14
|
+
/** Turns a `from`/`to` Block base into the plain one `defineBlock` takes (filling `resolve` for a single `to`). */
|
|
15
|
+
export function routed(base) {
|
|
16
|
+
const { from: _from, to, ...rest } = base;
|
|
17
|
+
if (rest.instruction.resolve)
|
|
18
|
+
return rest;
|
|
19
|
+
const targets = tagsOf(to);
|
|
20
|
+
if (targets.length !== 1) {
|
|
21
|
+
throw new Error(`waygraph: Block "${base.name}" lands on ${targets.join(" or ")}; give it a resolve() that picks one`);
|
|
22
|
+
}
|
|
23
|
+
return { ...rest, instruction: { ...rest.instruction, resolve: () => checkpoint(targets[0]) } };
|
|
24
|
+
}
|
|
25
|
+
/** Records a routed Block's `from`/`to` on the built Block. */
|
|
26
|
+
export function markRouteOf(block, base) {
|
|
27
|
+
markRoute(block, base.from === undefined ? ["*"] : tagsOf(base.from), tagsOf(base.to));
|
|
28
|
+
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { BrowserType } from "@playwright/test";
|
|
2
|
-
import type { Layout } from "./run
|
|
3
|
-
import type { ExtensionSpec } from "../extensions.js";
|
|
2
|
+
import type { Layout } from "./run/run.js";
|
|
4
3
|
/**
|
|
5
4
|
* Resolves which `BrowserType` actually launches for a `mem`-only run (no
|
|
6
5
|
* caller-supplied context) - `config.browsers[browserName]` if given,
|
|
@@ -12,6 +11,12 @@ import type { ExtensionSpec } from "../extensions.js";
|
|
|
12
11
|
* `webkit` - same `.launch()` shape - so accepting one here costs nothing for
|
|
13
12
|
* a consumer who never sets it.
|
|
14
13
|
*/
|
|
14
|
+
/** A browser extension to load: a known name (`"hoppscotch"`), a Chrome Web Store id, a path, or `{ id, sha256 }`. */
|
|
15
|
+
export type ExtensionSpec = string | {
|
|
16
|
+
id?: string;
|
|
17
|
+
path?: string;
|
|
18
|
+
sha256?: string;
|
|
19
|
+
};
|
|
15
20
|
export declare function resolveLauncher(browserName: "chromium" | "firefox" | "webkit", config: EngineConfig | undefined): BrowserType;
|
|
16
21
|
/** Configures how an Engine launches its own browser - only used by `Flow.run(mem)` (no context given); ignored by `Flow.run(context, mem)`, since that context is already launched. */
|
|
17
22
|
export interface EngineConfig {
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// EngineConfig: which browser a flow launches when it opens its own, how, and the layouts every step is checked against.
|
|
2
|
+
import { chromium, firefox, webkit } from "@playwright/test";
|
|
3
|
+
const LAUNCHERS = { chromium, firefox, webkit };
|
|
4
|
+
export function resolveLauncher(browserName, config) {
|
|
5
|
+
return config?.browsers?.[browserName] ?? LAUNCHERS[browserName];
|
|
6
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { Checkpoint } from "./checkpoint/checkpoint.js";
|
|
2
|
+
import type { EngineConfig } from "./config.js";
|
|
3
|
+
import { MapBuilder } from "./flow/map-builder.js";
|
|
4
|
+
import type { MapBuilderOptions } from "./flow/map-builder.js";
|
|
5
|
+
/** Where every `map()` starts: before its first step. */
|
|
6
|
+
export type MapStart = Checkpoint<"__start__">;
|
|
7
|
+
/**
|
|
8
|
+
* Holds engine-level configuration shared across every flow defined from it -
|
|
9
|
+
* for now, just how to launch a browser when a Flow owns its own
|
|
10
|
+
* (`headless`/`browserName`/`slowMo`); traits/interstitials/watchers land here
|
|
11
|
+
* in a later change.
|
|
12
|
+
* @example const engine = new Engine({ headless: false, slowMo: 250 });
|
|
13
|
+
*/
|
|
14
|
+
export declare class Engine {
|
|
15
|
+
readonly config: EngineConfig;
|
|
16
|
+
/** How flows from this engine launch their own browser, and the layouts every step is checked against. */
|
|
17
|
+
constructor(config?: EngineConfig);
|
|
18
|
+
/**
|
|
19
|
+
* Builds a flow, one kind-checked step at a time - see {@link MapBuilder}. Real, direct request this responds to: pia/zsign's
|
|
20
|
+
* own agents kept hand-editing/hand-composing Blocks into ad hoc shapes
|
|
21
|
+
* ("locks" convention tried, still got broken) - `map()` forces every step
|
|
22
|
+
* through this Engine's own `define*Block` factories (checked by the same
|
|
23
|
+
* `__waygraphKind`/`__waygraphSalt` runtime markers `graph.ts`/`map-check.ts`
|
|
24
|
+
* already trust), so a hand-rolled plain-object Block can never silently
|
|
25
|
+
* pass as a real navigation/assertion/method step. `homeOrigin`, if given,
|
|
26
|
+
* also gates `.gotoPage()`/`.gotoExternal()` against each Nav/Page Block's
|
|
27
|
+
* own static `url` (skipped, honestly, for click-based/dynamic nav - not
|
|
28
|
+
* statically checkable, same limitation `map-check.ts` already documents).
|
|
29
|
+
* @example
|
|
30
|
+
* const flow = engine.map({ homeOrigin: "https://app.example.com" })
|
|
31
|
+
* .start()
|
|
32
|
+
* .gotoPage(NavHomeBlock)
|
|
33
|
+
* .assert(AssertHelloBlock)
|
|
34
|
+
* .gotoExternal(NavMailpitBlock)
|
|
35
|
+
* .end();
|
|
36
|
+
*/
|
|
37
|
+
map(options?: MapBuilderOptions): MapBuilder<MapStart>;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Standalone convenience for `new Engine(config).map(options)` - use this
|
|
41
|
+
* when a call site doesn't otherwise need its own `Engine` instance (no
|
|
42
|
+
* shared `headless`/`slowMo`/`layouts` across several flows).
|
|
43
|
+
* @example const flow = map({ homeOrigin: "https://app.example.com" }).gotoPage(NavHomeBlock).end();
|
|
44
|
+
*/
|
|
45
|
+
export declare function map(options?: MapBuilderOptions & EngineConfig): MapBuilder<MapStart>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { MapBuilder } from "./map-builder.js";
|
|
1
|
+
import { buildFlow, withSettings } from "./flow/flow.js";
|
|
2
|
+
import { MapBuilder } from "./flow/map-builder.js";
|
|
3
3
|
/**
|
|
4
4
|
* Holds engine-level configuration shared across every flow defined from it -
|
|
5
5
|
* for now, just how to launch a browser when a Flow owns its own
|
|
@@ -9,15 +9,12 @@ import { MapBuilder } from "./map-builder.js";
|
|
|
9
9
|
*/
|
|
10
10
|
export class Engine {
|
|
11
11
|
config;
|
|
12
|
+
/** How flows from this engine launch their own browser, and the layouts every step is checked against. */
|
|
12
13
|
constructor(config = {}) {
|
|
13
14
|
this.config = config;
|
|
14
15
|
}
|
|
15
|
-
defineFlow(blocks, options) {
|
|
16
|
-
return applyFlowOptions(buildFlow(blocks.slice(1, -1), this.config), options);
|
|
17
|
-
}
|
|
18
16
|
/**
|
|
19
|
-
*
|
|
20
|
-
* see {@link MapBuilder}. Real, direct request this responds to: pia/zsign's
|
|
17
|
+
* Builds a flow, one kind-checked step at a time - see {@link MapBuilder}. Real, direct request this responds to: pia/zsign's
|
|
21
18
|
* own agents kept hand-editing/hand-composing Blocks into ad hoc shapes
|
|
22
19
|
* ("locks" convention tried, still got broken) - `map()` forces every step
|
|
23
20
|
* through this Engine's own `define*Block` factories (checked by the same
|
|
@@ -36,9 +33,8 @@ export class Engine {
|
|
|
36
33
|
* .end();
|
|
37
34
|
*/
|
|
38
35
|
map(options) {
|
|
39
|
-
const { homeOrigin, ...
|
|
40
|
-
|
|
41
|
-
return MapBuilder.begin((blocks, extra) => define(blocks, { ...flowOptions, ...extra }), homeOrigin);
|
|
36
|
+
const { homeOrigin, ...settings } = options ?? {};
|
|
37
|
+
return MapBuilder.begin((steps, flowSettings) => withSettings(buildFlow(steps, this.config), flowSettings), settings, homeOrigin);
|
|
42
38
|
}
|
|
43
39
|
}
|
|
44
40
|
/**
|