waygraph 0.15.54 → 0.16.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -3
- package/bin/waygraph +2 -2
- package/dist/analysis/check.d.ts +38 -0
- package/dist/analysis/check.js +87 -0
- package/dist/analysis/coverage-gap.d.ts +1 -1
- package/dist/analysis/coverage-gap.js +14 -37
- package/dist/analysis/flow-source.d.ts +9 -0
- package/dist/analysis/flow-source.js +25 -0
- package/dist/analysis/graph.d.ts +10 -14
- package/dist/analysis/graph.js +48 -371
- package/dist/analysis/map-check.js +4 -39
- package/dist/analysis/practices-check.d.ts +1 -1
- package/dist/analysis/practices-check.js +24 -45
- package/dist/cli/args.d.ts +23 -0
- package/dist/cli/args.js +20 -0
- package/dist/{cli.d.ts → cli/cli.d.ts} +0 -1
- package/dist/{cli.js → cli/cli.js} +10 -9
- package/dist/{commands → cli/commands}/agent-dive-scaffold.js +35 -64
- package/dist/cli/commands/agent-dive.js +42 -0
- package/dist/cli/commands/browser.d.ts +2 -0
- package/dist/cli/commands/browser.js +109 -0
- package/dist/{commands → cli/commands}/check.d.ts +0 -1
- package/dist/cli/commands/check.js +104 -0
- package/dist/cli/commands/codemod-checkpoints.d.ts +18 -0
- package/dist/cli/commands/codemod-checkpoints.js +186 -0
- package/dist/cli/commands/codemod-flows.d.ts +18 -0
- package/dist/cli/commands/codemod-flows.js +284 -0
- package/dist/cli/commands/codemod-stubs.d.ts +10 -0
- package/dist/cli/commands/codemod-stubs.js +187 -0
- package/dist/{commands → cli/commands}/extensions.js +5 -4
- package/dist/{commands → cli/commands}/init.js +1 -2
- package/dist/{commands → cli/commands}/list.js +9 -7
- package/dist/cli/commands/manifest.d.ts +2 -0
- package/dist/cli/commands/manifest.js +20 -0
- package/dist/cli/commands/map.js +57 -0
- package/dist/cli/commands/pilot.d.ts +2 -0
- package/dist/cli/commands/pilot.js +102 -0
- package/dist/{commands → cli/commands}/run.d.ts +0 -1
- package/dist/cli/commands/run.js +64 -0
- package/dist/cli/commands/session-ops.d.ts +3 -0
- package/dist/cli/commands/session-ops.js +257 -0
- package/dist/cli/commands/session.js +132 -0
- package/dist/{commands → cli/commands}/test.js +11 -14
- package/dist/cli/commands/traverse.js +105 -0
- package/dist/{commands → cli/commands}/try.js +29 -25
- package/dist/{commands → cli/commands}/upgrade.js +40 -4
- package/dist/cli/flags.d.ts +193 -16
- package/dist/cli/flags.js +179 -234
- package/dist/cli/run-chain.d.ts +1 -0
- package/dist/cli/run-chain.js +42 -7
- package/dist/cli/usage.d.ts +1 -1
- package/dist/cli/usage.js +21 -53
- package/dist/cli/util.d.ts +2 -2
- package/dist/cli/util.js +2 -3
- package/dist/{highlights → demo/narration}/css.d.ts +1 -1
- package/dist/{highlights → demo/narration}/css.js +2 -3
- package/dist/{highlights → demo/narration}/demo-pace.d.ts +4 -12
- package/dist/{highlights → demo/narration}/demo-pace.js +5 -11
- package/dist/{highlights → demo/narration}/device.d.ts +4 -4
- package/dist/{highlights → demo/narration}/device.js +1 -1
- package/dist/demo/narration/merge.d.ts +10 -0
- package/dist/demo/narration/merge.js +67 -0
- package/dist/demo/narration/narration.d.ts +39 -0
- package/dist/{highlights/run-phase.js → demo/narration/narration.js} +25 -94
- package/dist/{highlights → demo/narration}/shorthand.d.ts +1 -1
- package/dist/demo/narration/stub-ctx.d.ts +8 -0
- package/dist/demo/narration/stub-ctx.js +164 -0
- package/dist/{highlights → demo/narration}/style.d.ts +1 -7
- package/dist/{highlights → demo/narration}/style.js +1 -41
- package/dist/{highlights → demo/narration}/todo-dock.d.ts +8 -8
- package/dist/{highlights → demo/narration}/todo-dock.js +13 -30
- package/dist/demo/overlay/auto-chrome.d.ts +7 -0
- package/dist/demo/overlay/auto-chrome.js +97 -0
- package/dist/demo/overlay/cursor.d.ts +19 -0
- package/dist/demo/overlay/cursor.js +142 -0
- package/dist/demo/overlay/device-stage.d.ts +26 -0
- package/dist/demo/overlay/device-stage.js +396 -0
- package/dist/demo/overlay/inpage/banner.d.ts +2 -0
- package/dist/demo/overlay/inpage/banner.js +160 -0
- package/dist/demo/overlay/inpage/caption.d.ts +2 -0
- package/dist/demo/overlay/inpage/caption.js +24 -0
- package/dist/demo/overlay/inpage/core.d.ts +2 -0
- package/dist/demo/overlay/inpage/core.js +345 -0
- package/dist/demo/overlay/inpage/device-chip.d.ts +1 -0
- package/dist/demo/overlay/inpage/device-chip.js +191 -0
- package/dist/demo/overlay/inpage/network.d.ts +10 -0
- package/dist/demo/overlay/inpage/network.js +189 -0
- package/dist/demo/overlay/inpage/panel-chrome.d.ts +1 -0
- package/dist/demo/overlay/inpage/panel-chrome.js +203 -0
- package/dist/demo/overlay/inpage/stamp.d.ts +1 -0
- package/dist/demo/overlay/inpage/stamp.js +46 -0
- package/dist/demo/overlay/inpage/swipe-zoom.d.ts +1 -0
- package/dist/demo/overlay/inpage/swipe-zoom.js +220 -0
- package/dist/demo/overlay/inpage/todos.d.ts +2 -0
- package/dist/demo/overlay/inpage/todos.js +293 -0
- package/dist/demo/overlay/locator-theater.d.ts +25 -0
- package/dist/demo/overlay/locator-theater.js +76 -0
- package/dist/demo/overlay/network-capture.d.ts +22 -0
- package/dist/demo/overlay/network-capture.js +127 -0
- package/dist/demo/overlay/overlay-css.d.ts +3 -0
- package/dist/demo/overlay/overlay-css.js +369 -0
- package/dist/demo/overlay/overlay-stage.d.ts +31 -0
- package/dist/demo/overlay/overlay-stage.js +106 -0
- package/dist/demo/overlay/overlay.d.ts +10 -0
- package/dist/demo/overlay/overlay.js +89 -0
- package/dist/{pilot-overlay/overlay-fixtures.d.ts → demo/overlay/phase-fixtures.d.ts} +2 -2
- package/dist/{pilot-overlay/overlay-fixtures.js → demo/overlay/phase-fixtures.js} +2 -2
- package/dist/{pilot-overlay/action-ring.js → demo/overlay/pilot/actions.js} +2 -1
- package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.d.ts +6 -5
- package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.js +19 -18
- package/dist/{pilot-overlay → demo/overlay/pilot}/shell.d.ts +2 -2
- package/dist/{pilot-overlay → demo/overlay/pilot}/shell.js +13 -22
- package/dist/demo/overlay/reattach.d.ts +7 -0
- package/dist/demo/overlay/reattach.js +23 -0
- package/dist/demo/overlay/rings.d.ts +61 -0
- package/dist/demo/overlay/rings.js +422 -0
- package/dist/{ui → demo/overlay/ui}/components/ring.js +2 -2
- package/dist/{ui → demo/overlay/ui}/overlay.css +4 -4
- package/dist/{ui → demo/overlay/ui}/shadow.d.ts +1 -1
- package/dist/{ui → demo/overlay/ui}/shadow.js +39 -2
- package/dist/demo/stepper/after.d.ts +3 -0
- package/dist/demo/stepper/after.js +103 -0
- package/dist/demo/stepper/banner-log.d.ts +35 -0
- package/dist/demo/stepper/banner-log.js +65 -0
- package/dist/demo/stepper/before.d.ts +4 -0
- package/dist/demo/stepper/before.js +110 -0
- package/dist/demo/stepper/demo-log.d.ts +48 -0
- package/dist/demo/stepper/demo-log.js +292 -0
- package/dist/demo/stepper/gate.d.ts +11 -0
- package/dist/demo/stepper/gate.js +78 -0
- package/dist/demo/stepper/interaction-patch.d.ts +4 -0
- package/dist/demo/stepper/interaction-patch.js +323 -0
- package/dist/demo/stepper/pacing.d.ts +21 -0
- package/dist/demo/stepper/pacing.js +23 -0
- package/dist/demo/stepper/panel-after.d.ts +17 -0
- package/dist/demo/stepper/panel-after.js +166 -0
- package/dist/demo/stepper/panel-before.d.ts +12 -0
- package/dist/demo/stepper/panel-before.js +241 -0
- package/dist/demo/stepper/slides.d.ts +23 -0
- package/dist/demo/stepper/slides.js +233 -0
- package/dist/demo/stepper/step-panels.d.ts +69 -0
- package/dist/demo/stepper/step-panels.js +172 -0
- package/dist/demo/stepper/stepper.d.ts +24 -0
- package/dist/demo/stepper/stepper.js +122 -0
- package/dist/demo/stepper/teardown.d.ts +47 -0
- package/dist/demo/stepper/teardown.js +178 -0
- package/dist/demo/stepper/todo-advance.d.ts +15 -0
- package/dist/demo/stepper/todo-advance.js +110 -0
- package/dist/demo/stepper/view.d.ts +58 -0
- package/dist/demo/stepper/view.js +31 -0
- package/dist/demo/types.d.ts +85 -0
- package/dist/demo/verbose-log.js +15 -0
- package/dist/engine/block/action-page.d.ts +53 -0
- package/dist/engine/block/action-page.js +1 -0
- package/dist/{types.d.ts → engine/block/block.d.ts} +102 -142
- package/dist/{core → engine/block}/block.js +12 -130
- package/dist/engine/block/branch.d.ts +17 -0
- package/dist/engine/block/branch.js +40 -0
- package/dist/{core → engine/block}/compose.d.ts +9 -7
- package/dist/{core → engine/block}/compose.js +1 -1
- package/dist/engine/block/dialog.d.ts +13 -0
- package/dist/engine/block/dialog.js +37 -0
- package/dist/{core/blocks → engine/block/kinds}/api.d.ts +16 -12
- package/dist/{core/blocks → engine/block/kinds}/api.js +26 -18
- package/dist/{core/blocks → engine/block/kinds}/effect.d.ts +13 -18
- package/dist/engine/block/kinds/effect.js +17 -0
- package/dist/{core/blocks → engine/block/kinds}/method.d.ts +17 -29
- package/dist/{core/blocks → engine/block/kinds}/method.js +6 -21
- package/dist/{core/blocks → engine/block/kinds}/nav.d.ts +21 -31
- package/dist/{core/blocks → engine/block/kinds}/nav.js +6 -12
- package/dist/{core/blocks → engine/block/kinds}/page.d.ts +14 -20
- package/dist/{core/blocks → engine/block/kinds}/page.js +5 -7
- package/dist/engine/checkpoint/checkpoint.d.ts +22 -0
- package/dist/engine/checkpoint/checkpoint.js +8 -0
- package/dist/engine/checkpoint/route.d.ts +28 -0
- package/dist/engine/checkpoint/route.js +28 -0
- package/dist/{core → engine}/config.d.ts +7 -2
- package/dist/engine/config.js +6 -0
- package/dist/engine/engine.d.ts +45 -0
- package/dist/{core → engine}/engine.js +6 -10
- package/dist/engine/env.d.ts +59 -0
- package/dist/engine/env.js +83 -0
- package/dist/{errors.d.ts → engine/errors.d.ts} +22 -22
- package/dist/{errors.js → engine/errors.js} +22 -22
- package/dist/{core → engine/flow}/branch-regression.d.ts +7 -7
- package/dist/{core → engine/flow}/branch-regression.js +4 -3
- package/dist/engine/flow/flow.d.ts +162 -0
- package/dist/engine/flow/flow.js +244 -0
- package/dist/engine/flow/map-branch.d.ts +9 -0
- package/dist/engine/flow/map-branch.js +57 -0
- package/dist/{core → engine/flow}/map-builder.d.ts +34 -54
- package/dist/engine/flow/map-builder.js +242 -0
- package/dist/engine/flow/map-steps.d.ts +30 -0
- package/dist/engine/flow/map-steps.js +87 -0
- package/dist/{core → engine}/locate.d.ts +1 -1
- package/dist/{core → engine}/locate.js +1 -2
- package/dist/{mem-stub.d.ts → engine/mem/mem-stub.d.ts} +9 -8
- package/dist/{mem-stub.js → engine/mem/mem-stub.js} +2 -2
- package/dist/{mem-page.d.ts → engine/mem/mem.d.ts} +1 -1
- package/dist/{mem-page.js → engine/mem/mem.js} +2 -1
- package/dist/engine/page-gone.d.ts +5 -0
- package/dist/engine/page-gone.js +20 -0
- package/dist/engine/run/connect.d.ts +28 -0
- package/dist/{types.js → engine/run/connect.js} +11 -10
- package/dist/engine/run/events.d.ts +67 -0
- package/dist/engine/run/events.js +90 -0
- package/dist/engine/run/hooks.d.ts +16 -0
- package/dist/engine/run/hooks.js +8 -0
- package/dist/engine/run/launch.d.ts +13 -0
- package/dist/engine/run/launch.js +27 -0
- package/dist/{core/run-graph.d.ts → engine/run/run.d.ts} +8 -12
- package/dist/{core/run-graph.js → engine/run/run.js} +22 -12
- package/dist/engine/stub/pace.d.ts +12 -0
- package/dist/engine/stub/pace.js +2 -0
- package/dist/engine/stub/ring.d.ts +130 -0
- package/dist/engine/stub/ring.js +41 -0
- package/dist/engine/stub/stub.d.ts +268 -0
- package/dist/engine/stub/stub.js +1 -0
- package/dist/engine/stub/todos.d.ts +104 -0
- package/dist/engine/stub/todos.js +2 -0
- package/dist/engine/stub/viewport.d.ts +26 -0
- package/dist/engine/stub/viewport.js +2 -0
- package/dist/{trait.d.ts → engine/trait/trait.d.ts} +1 -1
- package/dist/{trait.js → engine/trait/trait.js} +1 -1
- package/dist/index.d.ts +88 -36
- package/dist/index.js +46 -19
- package/dist/live/auto/auto.d.ts +22 -0
- package/dist/live/auto/auto.js +207 -0
- package/dist/{session/auto-explore.d.ts → live/auto/explore.d.ts} +4 -14
- package/dist/{session/auto-explore.js → live/auto/explore.js} +21 -127
- package/dist/live/auto/mem.d.ts +11 -0
- package/dist/live/auto/mem.js +85 -0
- package/dist/live/auto/menu.d.ts +30 -0
- package/dist/live/auto/menu.js +335 -0
- package/dist/live/auto-session/auto-session.d.ts +113 -0
- package/dist/live/auto-session/auto-session.js +452 -0
- package/dist/live/auto-session/console.d.ts +4 -0
- package/dist/live/auto-session/console.js +41 -0
- package/dist/live/auto-session/files.d.ts +44 -0
- package/dist/live/auto-session/files.js +145 -0
- package/dist/{auto-session → live/auto-session}/helpers.d.ts +9 -5
- package/dist/{auto-session → live/auto-session}/helpers.js +18 -1
- package/dist/live/auto-session/inspect.d.ts +4 -0
- package/dist/live/auto-session/inspect.js +75 -0
- package/dist/{session/auto-session-ipc.d.ts → live/auto-session/ipc.d.ts} +8 -25
- package/dist/{session/auto-session-ipc.js → live/auto-session/ipc.js} +36 -161
- package/dist/live/auto-session/open-browser.d.ts +6 -0
- package/dist/live/auto-session/open-browser.js +47 -0
- package/dist/{session/browser.d.ts → live/auto-session/start.d.ts} +1 -2
- package/dist/{session/browser.js → live/auto-session/start.js} +2 -3
- package/dist/{pilot-overlay → live/pilot}/panel.d.ts +1 -1
- package/dist/{pilot-overlay → live/pilot}/panel.js +23 -31
- package/dist/{session → live/pilot}/pilot.d.ts +3 -3
- package/dist/{session → live/pilot}/pilot.js +5 -4
- package/dist/{traverse/run.d.ts → live/traverse/traverse.d.ts} +1 -1
- package/dist/live/traverse/traverse.js +212 -0
- package/dist/live/traverse/worker.d.ts +37 -0
- package/dist/live/traverse/worker.js +200 -0
- package/dist/manifest/manifest.d.ts +52 -0
- package/dist/manifest/manifest.js +93 -0
- package/dist/manifest/map-imports.d.ts +7 -0
- package/dist/manifest/map-imports.js +22 -0
- package/dist/manifest/maps.d.ts +33 -0
- package/dist/manifest/maps.js +62 -0
- package/dist/manifest/pack.d.ts +21 -0
- package/dist/manifest/pack.js +109 -0
- package/dist/manifest/project.d.ts +60 -0
- package/dist/manifest/project.js +101 -0
- package/dist/{session/block-inject.js → manifest/roots.js} +1 -18
- package/dist/manifest/scan.d.ts +19 -0
- package/dist/manifest/scan.js +57 -0
- package/dist/manifest/source.d.ts +23 -0
- package/dist/manifest/source.js +86 -0
- package/dist/runner/mode.d.ts +71 -0
- package/dist/runner/mode.js +1 -0
- package/dist/runner/modes/branches.d.ts +5 -0
- package/dist/runner/modes/branches.js +37 -0
- package/dist/runner/modes/demo.d.ts +3 -0
- package/dist/runner/modes/demo.js +13 -0
- package/dist/runner/modes/report.d.ts +2 -0
- package/dist/runner/modes/report.js +54 -0
- package/dist/runner/modes/run.d.ts +2 -0
- package/dist/runner/modes/run.js +3 -0
- package/dist/runner/options.d.ts +31 -0
- package/dist/runner/options.js +42 -0
- package/dist/runner/plan/find.d.ts +18 -0
- package/dist/runner/plan/find.js +65 -0
- package/dist/runner/plan/plan.d.ts +11 -0
- package/dist/runner/plan/plan.js +97 -0
- package/dist/runner/plan/seed-mem.d.ts +12 -0
- package/dist/runner/plan/seed-mem.js +98 -0
- package/dist/runner/plan/spec.d.ts +5 -0
- package/dist/runner/plan/spec.js +17 -0
- package/dist/runner/play-steps.d.ts +2 -0
- package/dist/runner/play-steps.js +59 -0
- package/dist/runner/runner.d.ts +4 -0
- package/dist/runner/runner.js +64 -0
- package/dist/runner/session.d.ts +9 -0
- package/dist/runner/session.js +87 -0
- package/dist/{browser.js → runtime/browser.js} +4 -2
- package/dist/{env-file.js → runtime/env-file.js} +7 -12
- package/dist/{extensions.d.ts → runtime/extensions.d.ts} +1 -5
- package/dist/{extensions.js → runtime/extensions.js} +2 -1
- package/dist/runtime/full-launch.d.ts +1 -0
- package/dist/runtime/full-launch.js +34 -0
- package/dist/runtime/global-flag.d.ts +5 -0
- package/dist/runtime/global-flag.js +18 -0
- package/dist/{playwright-config.d.ts → runtime/playwright-config.d.ts} +1 -1
- package/dist/{playwright.config.js → runtime/playwright.config.js} +3 -2
- package/dist/runtime/run-log.d.ts +2 -0
- package/dist/runtime/run-log.js +17 -0
- package/dist/{video-dir.js → runtime/video-dir.js} +3 -2
- package/dist/{config.d.ts → runtime/waygraph-config.d.ts} +6 -9
- package/dist/{config.js → runtime/waygraph-config.js} +21 -51
- package/dist/{webserver.js → runtime/webserver.js} +5 -30
- package/examples/routed-demo/config/waygraph.config.ts +20 -0
- package/examples/routed-demo/package.json +1 -4
- package/examples/routed-demo/scripts/fixture-server.mjs +1 -1
- package/examples/routed-demo/src/flows/routed-demo-map.flow.ts +2 -4
- package/examples/routed-demo/src/flows/routed-demo.flow.ts +1 -2
- package/examples/routed-demo/src/map/(app_base)/dashboard/_methods/click-widget.block.ts +5 -4
- package/examples/routed-demo/src/map/(app_base)/dashboard/_nav.block.ts +3 -3
- package/examples/routed-demo/src/map/(app_base)/dashboard/_page.block.ts +3 -3
- package/examples/routed-demo/src/map/(external)/docs/_nav.block.ts +3 -3
- package/examples/routed-demo/src/map/(external)/docs/_page.block.ts +3 -3
- package/examples/routed-demo/src/states/routed-demo.states.ts +5 -3
- package/examples/routed-demo/tests/routed-demo.spec.ts +4 -4
- package/examples/routed-demo/tsconfig.json +1 -1
- package/examples/saucedemo/docs/CONVENTION.md +4 -5
- package/examples/saucedemo/docs/HELPERS.md +11 -11
- package/examples/saucedemo/src/blocks/SITE-MAP.md +0 -1
- package/examples/saucedemo/src/blocks/saucedemo-web/NAV.md +1 -5
- package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +5 -8
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +35 -43
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +4 -5
- package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
- package/examples/saucedemo/src/flows/api-demo.flow.ts +12 -10
- package/examples/saucedemo/src/states/checkout.states.ts +21 -11
- package/examples/saucedemo/src/stubs/device-showcase.ts +8 -10
- package/examples/saucedemo/tests/auto-graph.spec.ts +4 -12
- package/package.json +14 -6
- package/templates/agents/waygraph-planner.agent.md +2 -2
- package/templates/quickstart/docs/CONVENTION.md +4 -4
- package/templates/quickstart/docs/HELPERS.md +10 -8
- package/templates/quickstart/package.json +0 -3
- package/templates/quickstart/src/blocks/SITE-MAP.md +0 -1
- package/templates/quickstart/src/blocks/saucedemo-web/NAV.md +1 -5
- package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +5 -8
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +35 -43
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +4 -5
- package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
- package/templates/quickstart/src/flows/api-demo.flow.ts +12 -10
- package/templates/quickstart/src/states/checkout.states.ts +21 -11
- package/templates/quickstart/src/stubs/device-showcase.ts +8 -10
- package/templates/scaffold/README.md +2 -1
- package/templates/scaffold/STRUCTURE.md +5 -4
- package/templates/scaffold/config/waygraph.config.ts +1 -0
- package/templates/scaffold/gitignore +1 -0
- package/templates/scaffold/src/flows/README.md +2 -2
- package/templates/scaffold/src/map/(app_base)/docs/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/docs/_page.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/_methods/add-item.effect.block.ts +4 -4
- package/templates/scaffold/src/map/(app_base)/home/_methods/assert-hello.method.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/_methods/assert-item-added.method.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/_methods/clear-cart.method.block.ts +5 -4
- package/templates/scaffold/src/map/(app_base)/home/_methods/remove-item.effect.block.ts +4 -4
- package/templates/scaffold/src/map/(app_base)/home/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/_page.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/nav-verification-link.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_keys.ts +21 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-body.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-header.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-status.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/pick-extension-interceptor.method.block.ts +5 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-body.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-headers.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/send-request.method.block.ts +5 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-bearer-token.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-headers.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-json-body.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-method.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-query-params.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-url.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/hoppscotch/_page.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/hoppscotch/_states.ts +6 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/settings/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/mailpit/_keys.ts +13 -0
- package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-content.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-received.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/mailpit/_methods/extract-email-link.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/mailpit/_methods/open-message.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/mailpit/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/mailpit/_page.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/mailpit/_states.ts +9 -0
- package/templates/scaffold/src/map/README.md +7 -0
- package/templates/scaffold/src/states/README.md +4 -1
- package/templates/scaffold/src/states/demo.mem-keys.ts +1 -29
- package/templates/scaffold/src/states/demo.states.ts +14 -20
- package/templates/scaffold/tests/hoppscotch.spec.ts +1 -11
- package/templates/scaffold/tests/mail-verify.spec.ts +2 -2
- package/templates/skills/waygraph-blind-pilot.skill.md +2 -6
- package/templates/skills/waygraph-convention.skill.md +23 -14
- package/templates/skills/waygraph-pilot.skill.md +7 -4
- package/dist/auto-session/session.d.ts +0 -193
- package/dist/auto-session/session.js +0 -719
- package/dist/auto-session/verbose-log.js +0 -16
- package/dist/auto-session.d.ts +0 -2
- package/dist/auto-session.js +0 -3
- package/dist/cli/discover.d.ts +0 -40
- package/dist/cli/discover.js +0 -148
- package/dist/commands/agent-dive.js +0 -52
- package/dist/commands/check.js +0 -192
- package/dist/commands/map.js +0 -29
- package/dist/commands/run.js +0 -104
- package/dist/commands/session.js +0 -600
- package/dist/commands/traverse.js +0 -177
- package/dist/core/block.d.ts +0 -109
- package/dist/core/blocks/effect.js +0 -23
- package/dist/core/config.js +0 -17
- package/dist/core/engine.d.ts +0 -198
- package/dist/core/flow.d.ts +0 -294
- package/dist/core/flow.js +0 -432
- package/dist/core/map-builder.js +0 -383
- package/dist/core.d.ts +0 -14
- package/dist/core.js +0 -15
- package/dist/highlights/merge.d.ts +0 -8
- package/dist/highlights/merge.js +0 -173
- package/dist/highlights/run-phase.d.ts +0 -43
- package/dist/highlights/stub-ctx.d.ts +0 -10
- package/dist/highlights/stub-ctx.js +0 -331
- package/dist/highlights/types.d.ts +0 -613
- package/dist/highlights.d.ts +0 -9
- package/dist/highlights.js +0 -10
- package/dist/pilot-overlay.d.ts +0 -5
- package/dist/pilot-overlay.js +0 -6
- package/dist/runner/banner-log.js +0 -63
- package/dist/runner/chain-run.js +0 -102
- package/dist/runner/cursor.js +0 -140
- package/dist/runner/demo-log.js +0 -316
- package/dist/runner/device-stage.d.ts +0 -9
- package/dist/runner/device-stage.js +0 -420
- package/dist/runner/discovery.js +0 -105
- package/dist/runner/index.js +0 -2
- package/dist/runner/inpage/banner.d.ts +0 -21
- package/dist/runner/inpage/banner.js +0 -156
- package/dist/runner/inpage/caption.d.ts +0 -3
- package/dist/runner/inpage/caption.js +0 -23
- package/dist/runner/inpage/core.d.ts +0 -4
- package/dist/runner/inpage/core.js +0 -316
- package/dist/runner/inpage/device.d.ts +0 -3
- package/dist/runner/inpage/device.js +0 -211
- package/dist/runner/inpage/network.d.ts +0 -15
- package/dist/runner/inpage/network.js +0 -217
- package/dist/runner/inpage/panel-chrome.js +0 -192
- package/dist/runner/inpage/stamp.js +0 -46
- package/dist/runner/inpage/swipe-zoom.js +0 -220
- package/dist/runner/inpage/todos.js +0 -337
- package/dist/runner/interaction-patch.js +0 -384
- package/dist/runner/main.js +0 -469
- package/dist/runner/network-capture.d.ts +0 -9
- package/dist/runner/network-capture.js +0 -126
- package/dist/runner/overlay-css.d.ts +0 -3
- package/dist/runner/overlay-css.js +0 -377
- package/dist/runner/overlay-install.js +0 -90
- package/dist/runner/overlay-stage.js +0 -110
- package/dist/runner/rings.js +0 -514
- package/dist/runner/seed-mem.js +0 -110
- package/dist/runner/slides.js +0 -278
- package/dist/runner/step-mode.js +0 -703
- package/dist/runner/step-panels.js +0 -729
- package/dist/runner/teardown.js +0 -202
- package/dist/runner/todo-dock.js +0 -142
- package/dist/session/auto-explore-run.d.ts +0 -40
- package/dist/session/auto-explore-run.js +0 -707
- package/dist/session/step-overlay.d.ts +0 -37
- package/dist/session/step-overlay.js +0 -244
- package/dist/traverse/run.js +0 -423
- package/examples/routed-demo/playwright.config.ts +0 -21
- package/examples/saucedemo/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
- package/templates/quickstart/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
- /package/dist/{commands → cli/commands}/agent-dive-scaffold.d.ts +0 -0
- /package/dist/{commands → cli/commands}/agent-dive.d.ts +0 -0
- /package/dist/{commands → cli/commands}/extensions.d.ts +0 -0
- /package/dist/{commands → cli/commands}/init.d.ts +0 -0
- /package/dist/{commands → cli/commands}/list.d.ts +0 -0
- /package/dist/{commands → cli/commands}/map.d.ts +0 -0
- /package/dist/{commands → cli/commands}/session.d.ts +0 -0
- /package/dist/{commands → cli/commands}/test.d.ts +0 -0
- /package/dist/{commands → cli/commands}/traverse.d.ts +0 -0
- /package/dist/{commands → cli/commands}/try.d.ts +0 -0
- /package/dist/{commands → cli/commands}/upgrade.d.ts +0 -0
- /package/dist/{highlights → demo/narration}/shorthand.js +0 -0
- /package/dist/{session/overlay-beacon.d.ts → demo/overlay/beacon.d.ts} +0 -0
- /package/dist/{session/overlay-beacon.js → demo/overlay/beacon.js} +0 -0
- /package/dist/{pilot-overlay/action-ring.d.ts → demo/overlay/pilot/actions.d.ts} +0 -0
- /package/dist/{ui → demo/overlay/ui}/components/ring.d.ts +0 -0
- /package/dist/{ui → demo/overlay/ui}/stylesheet.d.ts +0 -0
- /package/dist/{ui → demo/overlay/ui}/stylesheet.js +0 -0
- /package/dist/{ui → demo/overlay/ui}/tokens.d.ts +0 -0
- /package/dist/{ui → demo/overlay/ui}/tokens.js +0 -0
- /package/dist/{highlights → demo}/types.js +0 -0
- /package/dist/{auto-session → demo}/verbose-log.d.ts +0 -0
- /package/dist/{selector.d.ts → engine/trait/selector.d.ts} +0 -0
- /package/dist/{selector.js → engine/trait/selector.js} +0 -0
- /package/dist/{traverse → live/traverse}/coverage.d.ts +0 -0
- /package/dist/{traverse → live/traverse}/coverage.js +0 -0
- /package/dist/{traverse → live/traverse}/lease.d.ts +0 -0
- /package/dist/{traverse → live/traverse}/lease.js +0 -0
- /package/dist/{session/block-inject.d.ts → manifest/roots.d.ts} +0 -0
- /package/dist/{blocks-select.d.ts → manifest/select.d.ts} +0 -0
- /package/dist/{blocks-select.js → manifest/select.js} +0 -0
- /package/dist/{browser.d.ts → runtime/browser.d.ts} +0 -0
- /package/dist/{env-file.d.ts → runtime/env-file.d.ts} +0 -0
- /package/dist/{playwright-config.js → runtime/playwright-config.js} +0 -0
- /package/dist/{playwright.config.d.ts → runtime/playwright.config.d.ts} +0 -0
- /package/dist/{video-dir.d.ts → runtime/video-dir.d.ts} +0 -0
- /package/dist/{webserver.d.ts → runtime/webserver.d.ts} +0 -0
|
@@ -1,35 +1,19 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
3
|
-
import type {
|
|
4
|
-
import type {
|
|
5
|
-
import type {
|
|
6
|
-
import type {
|
|
7
|
-
import type {
|
|
8
|
-
import type {
|
|
1
|
+
import type { SomeBlock } from "../block/block.js";
|
|
2
|
+
import type { EffectBlock } from "../block/kinds/effect.js";
|
|
3
|
+
import type { AssertBlock, MethodBlock } from "../block/kinds/method.js";
|
|
4
|
+
import type { NavBlock } from "../block/kinds/nav.js";
|
|
5
|
+
import type { PageBlock } from "../block/kinds/page.js";
|
|
6
|
+
import type { Checkpoint } from "../checkpoint/checkpoint.js";
|
|
7
|
+
import type { DemoPace } from "../stub/pace.js";
|
|
8
|
+
import type { HighlightStyleDefaults } from "../stub/ring.js";
|
|
9
|
+
import type { Flow, FlowSettings } from "./flow.js";
|
|
10
|
+
import { MapStepOpts } from "./map-steps.js";
|
|
9
11
|
type S = Checkpoint<"__start__">;
|
|
10
12
|
/**
|
|
11
|
-
* The one capability MapBuilder needs from Engine
|
|
12
|
-
*
|
|
13
|
-
* import each other (Engine.map() builds a MapBuilder; MapBuilder.end() calls back into
|
|
14
|
-
* defineFlow) - a real cycle check:structure forbids. This type is how that's avoided.
|
|
13
|
+
* The one capability MapBuilder needs from Engine: turn the finished steps into a Flow with the engine's config. A
|
|
14
|
+
* function, not the Engine class, so engine.ts and map-builder.ts don't import each other.
|
|
15
15
|
*/
|
|
16
|
-
export type
|
|
17
|
-
/** Per-step options for the map builder: `ff` fast-forwards the step, `pace` sets its demo pace. */
|
|
18
|
-
export interface MapStepOpts {
|
|
19
|
-
/**
|
|
20
|
-
* Fast-forward just this step, inline - no `.ffStart()/.ffEnd()` bracket needed. Consecutive
|
|
21
|
-
* `{ ff: true }` steps merge into ONE fast-forward block, same result as the explicit bracket
|
|
22
|
-
* form; a step without the flag closes an auto-opened window first.
|
|
23
|
-
* @example map().gotoPage(NavLoginBlock, { ff: true }).method(FillUsernameBlock, { ff: true })
|
|
24
|
-
*/
|
|
25
|
-
ff?: boolean;
|
|
26
|
-
/**
|
|
27
|
-
* Demo pace for just this step (`"blitz"` skips the typing animation and the pause after the action; `"fast"`, `"slow"`,
|
|
28
|
-
* or a number scale the narration gates). The map equivalent of `withBlockPace`, with no wrapper.
|
|
29
|
-
* @example map().method(SetBearerTokenBlock, { pace: "blitz" })
|
|
30
|
-
*/
|
|
31
|
-
pace?: DemoPace;
|
|
32
|
-
}
|
|
16
|
+
export type BuildFlowFn = (steps: readonly SomeBlock[], settings: FlowSettings) => Flow<Checkpoint<string>>;
|
|
33
17
|
/** Flow-level settings for `engine.map({ … })`: `memStub`, `sessionReset`, `expectedFailure`, `demoPace`, `highlightStyle`, `homeOrigin`. */
|
|
34
18
|
export interface MapBuilderOptions {
|
|
35
19
|
/**
|
|
@@ -39,18 +23,18 @@ export interface MapBuilderOptions {
|
|
|
39
23
|
* way; only the internal/external origin distinction is opt-in).
|
|
40
24
|
*/
|
|
41
25
|
homeOrigin?: string;
|
|
42
|
-
/** Fill missing `requires` keys from `registerMemStub` when the flow runs
|
|
26
|
+
/** Fill missing `requires` keys from `registerMemStub` when the flow runs. */
|
|
43
27
|
memStub?: boolean;
|
|
44
28
|
/**
|
|
45
29
|
* This flow wants a fresh browser session (cookies and storage cleared) when it runs after another one, in a CLI chain
|
|
46
30
|
* (`waygraph run "a then b"`) or nested with `.flow(sub)`: a second user signing in, a logged-out check.
|
|
47
31
|
*/
|
|
48
32
|
sessionReset?: boolean;
|
|
49
|
-
/** Marks a flow that is supposed to throw, with the reason shown in the demo
|
|
33
|
+
/** Marks a flow that is supposed to throw, with the reason shown in the demo. */
|
|
50
34
|
expectedFailure?: string;
|
|
51
|
-
/** Default demo pace for the whole flow
|
|
35
|
+
/** Default demo pace for the whole flow. */
|
|
52
36
|
demoPace?: DemoPace;
|
|
53
|
-
/** Default ring tone, size and weight for the whole flow
|
|
37
|
+
/** Default ring tone, size and weight for the whole flow. */
|
|
54
38
|
highlightStyle?: HighlightStyleDefaults;
|
|
55
39
|
}
|
|
56
40
|
/** What `.flow()` takes for the sub-flow it runs inline. */
|
|
@@ -59,7 +43,7 @@ export interface MapFlowOpts {
|
|
|
59
43
|
reset?: boolean;
|
|
60
44
|
}
|
|
61
45
|
/**
|
|
62
|
-
*
|
|
46
|
+
* The flow builder behind `engine.map()` - see `map()`'s own doc
|
|
63
47
|
* comment for why this exists. Each step method is scoped to exactly the
|
|
64
48
|
* Block kind its name promises, checked at RUNTIME against the
|
|
65
49
|
* `__waygraphKind`/`__waygraphSalt` markers `defineNavBlock`/`definePageBlock`/
|
|
@@ -67,21 +51,21 @@ export interface MapFlowOpts {
|
|
|
67
51
|
* (the same markers `graph.ts` and `map-check.ts` trust) - not just a type
|
|
68
52
|
* hint, since a hand-rolled object can satisfy the TypeScript `Block<In,Out>`
|
|
69
53
|
* shape without ever going through a real factory. Each call also
|
|
70
|
-
* typechecks the accumulated Checkpoint chain
|
|
71
|
-
* own tuple overloads do (a step's `In` must equal the previous step's
|
|
54
|
+
* typechecks the accumulated Checkpoint chain (a step's `In` must equal the previous step's
|
|
72
55
|
* `Out`) - this is what "no teleporting" means: there is no method on this
|
|
73
56
|
* builder that can skip from one Checkpoint to an unrelated one without a
|
|
74
57
|
* real, kind-correct Block in between.
|
|
75
58
|
*/
|
|
76
59
|
export declare class MapBuilder<Out extends Checkpoint<string>> {
|
|
77
|
-
private readonly
|
|
60
|
+
private readonly build;
|
|
61
|
+
private readonly settings;
|
|
78
62
|
private readonly steps;
|
|
79
63
|
private readonly homeOrigin;
|
|
80
64
|
private readonly ff;
|
|
81
65
|
private constructor();
|
|
82
66
|
/** @internal - use `engine.map()` or the standalone `map()` export. */
|
|
83
|
-
static begin(
|
|
84
|
-
/** Readable chain-opener
|
|
67
|
+
static begin(build: BuildFlowFn, settings: FlowSettings, homeOrigin: string | undefined): MapBuilder<S>;
|
|
68
|
+
/** Readable chain-opener. Returns `this` unchanged; entirely optional. */
|
|
85
69
|
start(): MapBuilder<Out>;
|
|
86
70
|
/**
|
|
87
71
|
* Open a fast-forward window - steps until {@link ffEnd} collapse into one
|
|
@@ -110,7 +94,7 @@ export declare class MapBuilder<Out extends Checkpoint<string>> {
|
|
|
110
94
|
* `defineNavBlock`/`defineMemNavBlock`/`definePageBlock`. Throws if given
|
|
111
95
|
* anything else, including a `homeOrigin`-mismatched static `url`.
|
|
112
96
|
* Compile-time: {@link NavBlock} or {@link PageBlock} only (not Assert/Method).
|
|
113
|
-
* `{ ff: true }`: fast-forward this one step inline - see
|
|
97
|
+
* `{ ff: true }`: fast-forward this one step inline - see `appendStep`'s own comment.
|
|
114
98
|
*/
|
|
115
99
|
gotoPage<NextOut extends Checkpoint<string>>(block: (NavBlock<NextOut> | PageBlock<NextOut>) & {
|
|
116
100
|
name: string;
|
|
@@ -120,7 +104,7 @@ export declare class MapBuilder<Out extends Checkpoint<string>> {
|
|
|
120
104
|
* Blocks in the Waygraph Map convention: mailpit, maildrop.cc) - same
|
|
121
105
|
* kind requirement as {@link gotoPage}, plus the inverse `homeOrigin` check.
|
|
122
106
|
* Compile-time: {@link NavBlock} or {@link PageBlock} only.
|
|
123
|
-
* `{ ff: true }`: fast-forward this one step inline - see
|
|
107
|
+
* `{ ff: true }`: fast-forward this one step inline - see `appendStep`'s own comment.
|
|
124
108
|
*/
|
|
125
109
|
gotoExternal<NextOut extends Checkpoint<string>>(block: (NavBlock<NextOut> | PageBlock<NextOut>) & {
|
|
126
110
|
name: string;
|
|
@@ -128,7 +112,7 @@ export declare class MapBuilder<Out extends Checkpoint<string>> {
|
|
|
128
112
|
/**
|
|
129
113
|
* Appends a self-loop verification step - requires a Block from
|
|
130
114
|
* `defineAssertBlock`. Compile-time: {@link AssertBlock} only (not `.method()`).
|
|
131
|
-
* `{ ff: true }`: fast-forward this one step inline - see
|
|
115
|
+
* `{ ff: true }`: fast-forward this one step inline - see `appendStep`'s own comment.
|
|
132
116
|
*/
|
|
133
117
|
assert(block: AssertBlock<Out> & {
|
|
134
118
|
name: string;
|
|
@@ -140,7 +124,7 @@ export declare class MapBuilder<Out extends Checkpoint<string>> {
|
|
|
140
124
|
* Compile-time: {@link MethodBlock} or {@link EffectBlock} only - Assert
|
|
141
125
|
* Blocks must use `.assert()`. Runtime also rejects `__waygraphKind =
|
|
142
126
|
* "assert"` (those still carry method salt from the factory internals).
|
|
143
|
-
* `{ ff: true }`: fast-forward this one step inline - see
|
|
127
|
+
* `{ ff: true }`: fast-forward this one step inline - see `appendStep`'s own comment.
|
|
144
128
|
*/
|
|
145
129
|
method<NextOut extends Checkpoint<string>>(block: (MethodBlock<Out, NextOut> | EffectBlock<Out, NextOut>) & {
|
|
146
130
|
name: string;
|
|
@@ -148,7 +132,7 @@ export declare class MapBuilder<Out extends Checkpoint<string>> {
|
|
|
148
132
|
/**
|
|
149
133
|
* Runs another flow's steps inline here, in the same page, browser and `mem`. This is how flows nest:
|
|
150
134
|
* `map().flow(loginFlow).flow(viewerFlow, { reset: true })`. With `{ reset: true }` cookies and storage are cleared
|
|
151
|
-
* right before the sub-flow's first step.
|
|
135
|
+
* right before the sub-flow's first step.
|
|
152
136
|
*/
|
|
153
137
|
flow<NextOut extends Checkpoint<string>>(sub: Flow<NextOut>, opts?: MapFlowOpts): MapBuilder<NextOut>;
|
|
154
138
|
/**
|
|
@@ -163,7 +147,7 @@ export declare class MapBuilder<Out extends Checkpoint<string>> {
|
|
|
163
147
|
* Checkpoint to chain `.method()/.gotoPage()/.assert()/.end()` (or another `.branch()`) off of.
|
|
164
148
|
*
|
|
165
149
|
* Real gap this fixes: the plain `branch()` helper's `.next` routing is only ever consulted by
|
|
166
|
-
* `runGraph`'s own graph walk -
|
|
150
|
+
* `runGraph`'s own graph walk - `.end()` composes steps pairwise via `connect()`,
|
|
167
151
|
* which never looks at `.next` at all, so a Map-built Flow had no way to branch. This method
|
|
168
152
|
* branches at the Flow level instead: it finalizes the prefix, runs it, and picks the next Flow
|
|
169
153
|
* itself once the real tag is known - no engine-level routing involved.
|
|
@@ -174,7 +158,7 @@ export declare class MapBuilder<Out extends Checkpoint<string>> {
|
|
|
174
158
|
*
|
|
175
159
|
* The route's first Block still sees `input.__state === "__start__"` in `act()`, not the tag that
|
|
176
160
|
* routed there - `runGraph` seeds every Flow's entry Block that way unconditionally, the same as
|
|
177
|
-
* any
|
|
161
|
+
* any single-Block Flow does. Read `page`/`mem`, not `input`,
|
|
178
162
|
* in `act()` - every real Block in this codebase already follows that convention.
|
|
179
163
|
*
|
|
180
164
|
* @example
|
|
@@ -184,21 +168,17 @@ export declare class MapBuilder<Out extends Checkpoint<string>> {
|
|
|
184
168
|
* });
|
|
185
169
|
*/
|
|
186
170
|
branch<Routes extends {
|
|
187
|
-
[K in Out["__state"]]: ((m: MapBuilder<Extract<Out, Checkpoint<K>>>) => Flow<
|
|
171
|
+
[K in Out["__state"]]: ((m: MapBuilder<Extract<Out, Checkpoint<K>>>) => Flow<Checkpoint<string>>) | null;
|
|
188
172
|
}>(routes: Routes): Flow<{
|
|
189
173
|
[K in keyof Routes & string]: Routes[K] extends (m: any) => Flow<infer R> ? R : Extract<Out, Checkpoint<K>>;
|
|
190
174
|
}[keyof Routes & string]>;
|
|
191
175
|
/**
|
|
192
|
-
* Finalizes this chain into a
|
|
193
|
-
* `
|
|
194
|
-
* `withTitle`/`withHighlightFixtures`/etc. decorator still apply exactly
|
|
195
|
-
* as they do today; this builder only changes how the chain is assembled,
|
|
196
|
-
* never what it produces. Throws if no step was ever added - an empty map
|
|
176
|
+
* Finalizes this chain into a runnable {@link Flow} with the settings given to `map({ ... })`;
|
|
177
|
+
* `withBlockVerify`/`modBlockVerify` work on it. Throws if no step was ever added - an empty map
|
|
197
178
|
* isn't a flow. An auto-opened `{ ff: true }` window (see {@link MapStepOpts})
|
|
198
179
|
* left open at `.end()` closes silently; an EXPLICIT `.ffStart()` left open
|
|
199
180
|
* still throws - the author opened that one and needs to close it themselves.
|
|
200
181
|
*/
|
|
201
|
-
|
|
202
|
-
end(options?: FlowOptions): Flow<Out>;
|
|
182
|
+
end(): Flow<Out>;
|
|
203
183
|
}
|
|
204
184
|
export {};
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
import { fastForwardComposeBlock } from "../block/compose.js";
|
|
2
|
+
import { MSG_MAP_BRANCH_NO_PRIOR_STEP, MSG_MAP_EMPTY, MSG_MAP_FF_ALREADY_OPEN, MSG_MAP_FF_EMPTY, MSG_MAP_FF_NOT_CLOSED, MSG_MAP_FF_NOT_OPEN, MSG_MAP_METHOD_GOT_ASSERT, WaygraphError, } from "../errors.js";
|
|
3
|
+
import { buildBranchedFlow } from "./map-branch.js";
|
|
4
|
+
import { assertMapKind, assertMapOrigin, assertMapSalt, mapKindOf, paced, resetBefore } from "./map-steps.js";
|
|
5
|
+
/**
|
|
6
|
+
* The flow builder behind `engine.map()` - see `map()`'s own doc
|
|
7
|
+
* comment for why this exists. Each step method is scoped to exactly the
|
|
8
|
+
* Block kind its name promises, checked at RUNTIME against the
|
|
9
|
+
* `__waygraphKind`/`__waygraphSalt` markers `defineNavBlock`/`definePageBlock`/
|
|
10
|
+
* `defineAssertBlock`/`defineMethodBlock`/`defineEffectBlock` already set
|
|
11
|
+
* (the same markers `graph.ts` and `map-check.ts` trust) - not just a type
|
|
12
|
+
* hint, since a hand-rolled object can satisfy the TypeScript `Block<In,Out>`
|
|
13
|
+
* shape without ever going through a real factory. Each call also
|
|
14
|
+
* typechecks the accumulated Checkpoint chain (a step's `In` must equal the previous step's
|
|
15
|
+
* `Out`) - this is what "no teleporting" means: there is no method on this
|
|
16
|
+
* builder that can skip from one Checkpoint to an unrelated one without a
|
|
17
|
+
* real, kind-correct Block in between.
|
|
18
|
+
*/
|
|
19
|
+
export class MapBuilder {
|
|
20
|
+
build;
|
|
21
|
+
settings;
|
|
22
|
+
steps;
|
|
23
|
+
homeOrigin;
|
|
24
|
+
ff;
|
|
25
|
+
constructor(
|
|
26
|
+
// From Engine.map(): see BuildFlowFn.
|
|
27
|
+
build, settings, steps, homeOrigin,
|
|
28
|
+
// `auto: true` = opened implicitly by a `{ ff: true }` step flag, not an explicit .ffStart() -
|
|
29
|
+
// closes silently at the next non-flagged step (or at .end()/.branch()) instead of demanding a
|
|
30
|
+
// matching .ffEnd(), since the author never opened anything they'd need to remember to close.
|
|
31
|
+
ff = null) {
|
|
32
|
+
this.build = build;
|
|
33
|
+
this.settings = settings;
|
|
34
|
+
this.steps = steps;
|
|
35
|
+
this.homeOrigin = homeOrigin;
|
|
36
|
+
this.ff = ff;
|
|
37
|
+
}
|
|
38
|
+
/** @internal - use `engine.map()` or the standalone `map()` export. */
|
|
39
|
+
static begin(build, settings, homeOrigin) {
|
|
40
|
+
return new MapBuilder(build, settings, [], homeOrigin, null);
|
|
41
|
+
}
|
|
42
|
+
/** Readable chain-opener. Returns `this` unchanged; entirely optional. */
|
|
43
|
+
start() {
|
|
44
|
+
return this;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Open a fast-forward window - steps until {@link ffEnd} collapse into one
|
|
48
|
+
* opaque `fastForwardComposeBlock` (blitz theater). Kind/salt checks still
|
|
49
|
+
* run on each inner step as it is added.
|
|
50
|
+
*/
|
|
51
|
+
ffStart(name) {
|
|
52
|
+
if (this.ff) {
|
|
53
|
+
throw new WaygraphError("WG_MAP_FF_ALREADY_OPEN", MSG_MAP_FF_ALREADY_OPEN(this.ff.name));
|
|
54
|
+
}
|
|
55
|
+
const ffName = typeof name === "string" && name.trim()
|
|
56
|
+
? name.trim()
|
|
57
|
+
: `ff-${this.steps.length + 1}`;
|
|
58
|
+
return new MapBuilder(this.build, this.settings, this.steps, this.homeOrigin, {
|
|
59
|
+
name: ffName,
|
|
60
|
+
buffer: [],
|
|
61
|
+
auto: false,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Close the current fast-forward window and append one FFCompose step.
|
|
66
|
+
* Throws if empty or if {@link ffStart} was never opened.
|
|
67
|
+
*/
|
|
68
|
+
ffEnd() {
|
|
69
|
+
if (!this.ff) {
|
|
70
|
+
throw new WaygraphError("WG_MAP_FF_NOT_OPEN", MSG_MAP_FF_NOT_OPEN);
|
|
71
|
+
}
|
|
72
|
+
return this.closeFf();
|
|
73
|
+
}
|
|
74
|
+
/** Shared by the explicit {@link ffEnd} and the implicit close a `{ ff: true }` step flag triggers. */
|
|
75
|
+
closeFf() {
|
|
76
|
+
const ff = this.ff;
|
|
77
|
+
if (!ff)
|
|
78
|
+
return this;
|
|
79
|
+
if (ff.buffer.length === 0) {
|
|
80
|
+
throw new WaygraphError("WG_MAP_FF_EMPTY", MSG_MAP_FF_EMPTY(ff.name));
|
|
81
|
+
}
|
|
82
|
+
const composed = fastForwardComposeBlock(ff.name,
|
|
83
|
+
// The window's steps were typechecked as they were added; the one-step overload takes them as one Block.
|
|
84
|
+
ff.buffer);
|
|
85
|
+
return new MapBuilder(this.build, this.settings, [...this.steps, composed], this.homeOrigin, null);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* `ff`: inline fast-forward, no `.ffStart()/.ffEnd()` bracket needed - `.method(X, { ff: true })`
|
|
89
|
+
* marks just that step; consecutive `{ ff: true }` steps merge into ONE fast-forward block (same
|
|
90
|
+
* runtime result as the explicit bracket form), same as if they'd been wrapped in
|
|
91
|
+
* `.ffStart()/.ffEnd()`. A step WITHOUT the flag closes an auto-opened window first, so a plain
|
|
92
|
+
* step is never silently swept into one; an EXPLICIT `.ffStart()` window still behaves as before
|
|
93
|
+
* (stays open until its own `.ffEnd()`, regardless of whether a step passed `{ ff: true }`).
|
|
94
|
+
*/
|
|
95
|
+
appendStep(block, ff) {
|
|
96
|
+
if (ff) {
|
|
97
|
+
const win = this.ff ?? { name: `ff-${this.steps.length + 1}`, buffer: [], auto: true };
|
|
98
|
+
return new MapBuilder(this.build, this.settings, this.steps, this.homeOrigin, {
|
|
99
|
+
name: win.name,
|
|
100
|
+
buffer: [...win.buffer, block],
|
|
101
|
+
auto: win.auto,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
if (this.ff && this.ff.auto) {
|
|
105
|
+
return this.closeFf().appendStep(block);
|
|
106
|
+
}
|
|
107
|
+
if (this.ff) {
|
|
108
|
+
// Explicit .ffStart() window still open - absorbs a plain step too, same as always.
|
|
109
|
+
return new MapBuilder(this.build, this.settings, this.steps, this.homeOrigin, {
|
|
110
|
+
name: this.ff.name,
|
|
111
|
+
buffer: [...this.ff.buffer, block],
|
|
112
|
+
auto: false,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
return new MapBuilder(this.build, this.settings, [...this.steps, block], this.homeOrigin, null);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Appends an internal navigation/page-arrival step - requires a Block from
|
|
119
|
+
* `defineNavBlock`/`defineMemNavBlock`/`definePageBlock`. Throws if given
|
|
120
|
+
* anything else, including a `homeOrigin`-mismatched static `url`.
|
|
121
|
+
* Compile-time: {@link NavBlock} or {@link PageBlock} only (not Assert/Method).
|
|
122
|
+
* `{ ff: true }`: fast-forward this one step inline - see `appendStep`'s own comment.
|
|
123
|
+
*/
|
|
124
|
+
gotoPage(block, opts) {
|
|
125
|
+
assertMapKind(block, ["nav", "page"], "gotoPage");
|
|
126
|
+
assertMapOrigin(block, this.homeOrigin, "internal", "gotoPage");
|
|
127
|
+
return this.appendStep(paced(block, opts), opts?.ff);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Appends a genuinely cross-origin navigation step (e.g. `(external)/`
|
|
131
|
+
* Blocks in the Waygraph Map convention: mailpit, maildrop.cc) - same
|
|
132
|
+
* kind requirement as {@link gotoPage}, plus the inverse `homeOrigin` check.
|
|
133
|
+
* Compile-time: {@link NavBlock} or {@link PageBlock} only.
|
|
134
|
+
* `{ ff: true }`: fast-forward this one step inline - see `appendStep`'s own comment.
|
|
135
|
+
*/
|
|
136
|
+
gotoExternal(block, opts) {
|
|
137
|
+
assertMapKind(block, ["nav", "page"], "gotoExternal");
|
|
138
|
+
assertMapOrigin(block, this.homeOrigin, "external", "gotoExternal");
|
|
139
|
+
return this.appendStep(paced(block, opts), opts?.ff);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Appends a self-loop verification step - requires a Block from
|
|
143
|
+
* `defineAssertBlock`. Compile-time: {@link AssertBlock} only (not `.method()`).
|
|
144
|
+
* `{ ff: true }`: fast-forward this one step inline - see `appendStep`'s own comment.
|
|
145
|
+
*/
|
|
146
|
+
assert(block, opts) {
|
|
147
|
+
assertMapKind(block, ["assert"], "assert");
|
|
148
|
+
return this.appendStep(paced(block, opts), opts?.ff);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Appends a non-navigating page action (submit, upload, add/remove an
|
|
152
|
+
* instance) - requires a Block from `defineMethodBlock`/`defineActionBlock`/
|
|
153
|
+
* `defineEffectBlock`/`defineMemEffectBlock`.
|
|
154
|
+
* Compile-time: {@link MethodBlock} or {@link EffectBlock} only - Assert
|
|
155
|
+
* Blocks must use `.assert()`. Runtime also rejects `__waygraphKind =
|
|
156
|
+
* "assert"` (those still carry method salt from the factory internals).
|
|
157
|
+
* `{ ff: true }`: fast-forward this one step inline - see `appendStep`'s own comment.
|
|
158
|
+
*/
|
|
159
|
+
method(block, opts) {
|
|
160
|
+
if (mapKindOf(block) === "assert") {
|
|
161
|
+
throw new WaygraphError("WG_MAP_WRONG_KIND", MSG_MAP_METHOD_GOT_ASSERT(block.name));
|
|
162
|
+
}
|
|
163
|
+
assertMapSalt(block, ["method", "effect", "api"], "method");
|
|
164
|
+
return this.appendStep(paced(block, opts), opts?.ff);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Runs another flow's steps inline here, in the same page, browser and `mem`. This is how flows nest:
|
|
168
|
+
* `map().flow(loginFlow).flow(viewerFlow, { reset: true })`. With `{ reset: true }` cookies and storage are cleared
|
|
169
|
+
* right before the sub-flow's first step.
|
|
170
|
+
*/
|
|
171
|
+
flow(sub, opts) {
|
|
172
|
+
// The steps' types live in `sub`; at runtime this is one untyped walk, typed again as the sub-flow's last Checkpoint.
|
|
173
|
+
let next = this;
|
|
174
|
+
sub.blocks().forEach((info, i) => {
|
|
175
|
+
const block = i === 0 && (opts?.reset ?? sub.resetSession) ? resetBefore(info.block) : info.block;
|
|
176
|
+
next = next.appendStep(block);
|
|
177
|
+
});
|
|
178
|
+
return next;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Branch: run everything added so far, then continue into whichever `routes[tag]` matches the
|
|
182
|
+
* resolved Checkpoint's tag - same page, same context, same mem. `routes` must cover every tag
|
|
183
|
+
* of `Out` (a missing one is a compile error, matching {@link branch}'s own exhaustiveness);
|
|
184
|
+
* `null` means that tag is terminal (the branched Flow just returns that Checkpoint).
|
|
185
|
+
*
|
|
186
|
+
* Each non-null route is a function, not a ready-made `Flow` - a fresh Flow always starts at the
|
|
187
|
+
* special `S` (start) Checkpoint, but a branch's blocks start from the TAG it routes on (e.g.
|
|
188
|
+
* `LoggedIn`), so the function is handed a brand-new `MapBuilder` already seeded at that exact
|
|
189
|
+
* Checkpoint to chain `.method()/.gotoPage()/.assert()/.end()` (or another `.branch()`) off of.
|
|
190
|
+
*
|
|
191
|
+
* Real gap this fixes: the plain `branch()` helper's `.next` routing is only ever consulted by
|
|
192
|
+
* `runGraph`'s own graph walk - `.end()` composes steps pairwise via `connect()`,
|
|
193
|
+
* which never looks at `.next` at all, so a Map-built Flow had no way to branch. This method
|
|
194
|
+
* branches at the Flow level instead: it finalizes the prefix, runs it, and picks the next Flow
|
|
195
|
+
* itself once the real tag is known - no engine-level routing involved.
|
|
196
|
+
*
|
|
197
|
+
* Only the `run(context, mem[, options])` signature is supported - the page must survive across
|
|
198
|
+
* the branch, and the bare `run(mem, config)` convenience form always closes its own browser
|
|
199
|
+
* before a tag is even known, so it throws instead of silently reopening a fresh (state-losing) page.
|
|
200
|
+
*
|
|
201
|
+
* The route's first Block still sees `input.__state === "__start__"` in `act()`, not the tag that
|
|
202
|
+
* routed there - `runGraph` seeds every Flow's entry Block that way unconditionally, the same as
|
|
203
|
+
* any single-Block Flow does. Read `page`/`mem`, not `input`,
|
|
204
|
+
* in `act()` - every real Block in this codebase already follows that convention.
|
|
205
|
+
*
|
|
206
|
+
* @example
|
|
207
|
+
* map({ homeOrigin }).gotoPage(NavCartBlock).branch({
|
|
208
|
+
* ItemInCart: (m) => m.method(RemoveFromCartBlock).end(),
|
|
209
|
+
* LoggedIn: (m) => m.method(AddToCartBlock).end(),
|
|
210
|
+
* });
|
|
211
|
+
*/
|
|
212
|
+
branch(routes) {
|
|
213
|
+
if (this.steps.length === 0) {
|
|
214
|
+
throw new WaygraphError("WG_MAP_BRANCH_NO_PRIOR_STEP", MSG_MAP_BRANCH_NO_PRIOR_STEP);
|
|
215
|
+
}
|
|
216
|
+
const before = this.end();
|
|
217
|
+
const resolvedRoutes = {};
|
|
218
|
+
for (const [tag, fn] of Object.entries(routes)) {
|
|
219
|
+
resolvedRoutes[tag] = fn ? fn(new MapBuilder(this.build, this.settings, [], this.homeOrigin, null)) : null;
|
|
220
|
+
}
|
|
221
|
+
return buildBranchedFlow(before, resolvedRoutes);
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Finalizes this chain into a runnable {@link Flow} with the settings given to `map({ ... })`;
|
|
225
|
+
* `withBlockVerify`/`modBlockVerify` work on it. Throws if no step was ever added - an empty map
|
|
226
|
+
* isn't a flow. An auto-opened `{ ff: true }` window (see {@link MapStepOpts})
|
|
227
|
+
* left open at `.end()` closes silently; an EXPLICIT `.ffStart()` left open
|
|
228
|
+
* still throws - the author opened that one and needs to close it themselves.
|
|
229
|
+
*/
|
|
230
|
+
end() {
|
|
231
|
+
if (this.ff && !this.ff.auto) {
|
|
232
|
+
throw new WaygraphError("WG_MAP_FF_NOT_CLOSED", MSG_MAP_FF_NOT_CLOSED(this.ff.name));
|
|
233
|
+
}
|
|
234
|
+
if (this.ff && this.ff.auto) {
|
|
235
|
+
return this.closeFf().end();
|
|
236
|
+
}
|
|
237
|
+
if (this.steps.length === 0) {
|
|
238
|
+
throw new WaygraphError("WG_MAP_EMPTY", MSG_MAP_EMPTY);
|
|
239
|
+
}
|
|
240
|
+
return this.build(this.steps, this.settings);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type SomeBlock, type SomeDefinedBlock } from "../block/block.js";
|
|
2
|
+
import type { DemoPace } from "../stub/pace.js";
|
|
3
|
+
/** The same Block, but it clears cookies and storage before it acts. Keeps the runtime markers. */
|
|
4
|
+
export declare function resetBefore(block: SomeBlock): SomeBlock;
|
|
5
|
+
/** Applies a step's `pace` option, keeping the Block's runtime markers. */
|
|
6
|
+
export declare function paced(block: object, opts: MapStepOpts | undefined): SomeDefinedBlock;
|
|
7
|
+
export declare function mapKindOf(block: unknown): string | undefined;
|
|
8
|
+
export declare function mapSaltOf(block: unknown): string | undefined;
|
|
9
|
+
export declare function mapNavUrlOf(block: unknown): string | undefined;
|
|
10
|
+
export declare function assertMapKind(block: SomeBlock, allowed: readonly string[], method: string): void;
|
|
11
|
+
export declare function assertMapSalt(block: SomeBlock, allowed: readonly string[], method: string): void;
|
|
12
|
+
export declare function assertMapOrigin(block: SomeBlock, homeOrigin: string | undefined, expect: "internal" | "external", method: string): void;
|
|
13
|
+
export declare const MAP_KIND_FACTORY_HINT: Record<string, string>;
|
|
14
|
+
export declare const MAP_SALT_FACTORY_HINT: Record<string, string>;
|
|
15
|
+
/** Per-step options for the map builder: `ff` fast-forwards the step, `pace` sets its demo pace. */
|
|
16
|
+
export interface MapStepOpts {
|
|
17
|
+
/**
|
|
18
|
+
* Fast-forward just this step, inline - no `.ffStart()/.ffEnd()` bracket needed. Consecutive
|
|
19
|
+
* `{ ff: true }` steps merge into ONE fast-forward block, same result as the explicit bracket
|
|
20
|
+
* form; a step without the flag closes an auto-opened window first.
|
|
21
|
+
* @example map().gotoPage(NavLoginBlock, { ff: true }).method(FillUsernameBlock, { ff: true })
|
|
22
|
+
*/
|
|
23
|
+
ff?: boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Demo pace for just this step (`"blitz"` skips the typing animation and the pause after the action; `"fast"`, `"slow"`,
|
|
26
|
+
* or a number scale the narration gates).
|
|
27
|
+
* @example map().method(SetBearerTokenBlock, { pace: "blitz" })
|
|
28
|
+
*/
|
|
29
|
+
pace?: DemoPace;
|
|
30
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { copyWaygraphRuntime } from "../block/block.js";
|
|
2
|
+
import { MSG_MAP_WRONG_KIND, MSG_MAP_WRONG_ORIGIN_EXTERNAL, MSG_MAP_WRONG_ORIGIN_INTERNAL, MSG_MAP_WRONG_SALT, WaygraphError } from "../errors.js";
|
|
3
|
+
import { clearSessionState } from "./flow.js";
|
|
4
|
+
/** The same Block, but it clears cookies and storage before it acts. Keeps the runtime markers. */
|
|
5
|
+
export function resetBefore(block) {
|
|
6
|
+
const act = block.instruction.act.bind(block.instruction);
|
|
7
|
+
const next = {
|
|
8
|
+
...block,
|
|
9
|
+
instruction: {
|
|
10
|
+
...block.instruction,
|
|
11
|
+
async act(page, input, mem) {
|
|
12
|
+
await clearSessionState(page.context(), page);
|
|
13
|
+
return act(page, input, mem);
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
copyWaygraphRuntime(block, next);
|
|
18
|
+
Object.defineProperty(next, "__waygraphResetBefore", { value: true, enumerable: false, configurable: true });
|
|
19
|
+
return next;
|
|
20
|
+
}
|
|
21
|
+
/** Applies a step's `pace` option, keeping the Block's runtime markers. */
|
|
22
|
+
export function paced(block, opts) {
|
|
23
|
+
if (opts?.pace === undefined)
|
|
24
|
+
return block;
|
|
25
|
+
const next = { ...block, demoPace: opts.pace };
|
|
26
|
+
copyWaygraphRuntime(block, next);
|
|
27
|
+
return next;
|
|
28
|
+
}
|
|
29
|
+
export function mapKindOf(block) {
|
|
30
|
+
return block?.__waygraphKind;
|
|
31
|
+
}
|
|
32
|
+
export function mapSaltOf(block) {
|
|
33
|
+
return block?.__waygraphSalt;
|
|
34
|
+
}
|
|
35
|
+
export function mapNavUrlOf(block) {
|
|
36
|
+
const url = block?.__waygraphNavUrl;
|
|
37
|
+
return typeof url === "string" ? url : undefined;
|
|
38
|
+
}
|
|
39
|
+
export function assertMapKind(block, allowed, method) {
|
|
40
|
+
const kind = mapKindOf(block);
|
|
41
|
+
if (kind !== undefined && allowed.includes(kind))
|
|
42
|
+
return;
|
|
43
|
+
const wanted = allowed.map((k) => MAP_KIND_FACTORY_HINT[k] ?? k).join(" or ");
|
|
44
|
+
const found = kind ? `a Block of kind "${kind}"` : "an object with no waygraph kind marker at all";
|
|
45
|
+
throw new WaygraphError("WG_MAP_WRONG_KIND", MSG_MAP_WRONG_KIND(method, block?.name ?? "?", wanted, found));
|
|
46
|
+
}
|
|
47
|
+
export function assertMapSalt(block, allowed, method) {
|
|
48
|
+
const salt = mapSaltOf(block);
|
|
49
|
+
if (salt !== undefined && allowed.includes(salt))
|
|
50
|
+
return;
|
|
51
|
+
const wanted = allowed.map((s) => MAP_SALT_FACTORY_HINT[s] ?? s).join(" or ");
|
|
52
|
+
const found = salt ? `a Block salted "${salt}"` : "an object with no waygraph salt marker at all";
|
|
53
|
+
throw new WaygraphError("WG_MAP_WRONG_SALT", MSG_MAP_WRONG_SALT(method, block?.name ?? "?", wanted, found));
|
|
54
|
+
}
|
|
55
|
+
export function assertMapOrigin(block, homeOrigin, expect, method) {
|
|
56
|
+
if (!homeOrigin)
|
|
57
|
+
return; // not configured - can't validate, honest no-op
|
|
58
|
+
const navUrl = mapNavUrlOf(block);
|
|
59
|
+
if (navUrl === undefined)
|
|
60
|
+
return; // click-based/dynamic nav - not statically checkable
|
|
61
|
+
let targetOrigin;
|
|
62
|
+
let wantOrigin;
|
|
63
|
+
try {
|
|
64
|
+
targetOrigin = new URL(navUrl, homeOrigin).origin;
|
|
65
|
+
wantOrigin = new URL(homeOrigin).origin;
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return; // malformed URL - not this check's job to validate that
|
|
69
|
+
}
|
|
70
|
+
const isExternal = targetOrigin !== wantOrigin;
|
|
71
|
+
if (expect === "internal" && isExternal) {
|
|
72
|
+
throw new WaygraphError("WG_MAP_WRONG_ORIGIN", MSG_MAP_WRONG_ORIGIN_INTERNAL(block.name, targetOrigin, wantOrigin));
|
|
73
|
+
}
|
|
74
|
+
if (expect === "external" && !isExternal) {
|
|
75
|
+
throw new WaygraphError("WG_MAP_WRONG_ORIGIN", MSG_MAP_WRONG_ORIGIN_EXTERNAL(block.name, targetOrigin, wantOrigin));
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
export const MAP_KIND_FACTORY_HINT = {
|
|
79
|
+
nav: "defineNavBlock/defineMemNavBlock",
|
|
80
|
+
page: "definePageBlock",
|
|
81
|
+
assert: "defineAssertBlock",
|
|
82
|
+
};
|
|
83
|
+
export const MAP_SALT_FACTORY_HINT = {
|
|
84
|
+
method: "defineMethodBlock",
|
|
85
|
+
effect: "defineEffectBlock",
|
|
86
|
+
api: "defineApiBlock",
|
|
87
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { MemPage } from "
|
|
1
|
+
import { MemPage } from "./mem/mem.js";
|
|
2
2
|
/**
|
|
3
3
|
* "Where am I" - reverse-matches a live `page` against every NavBlock /
|
|
4
4
|
* PageBlock in `library`, in order, returning the first one whose own `verify`
|
|
@@ -38,7 +38,6 @@ export async function locate(page, library, options) {
|
|
|
38
38
|
const traits = typeof verify === "function" ? verify(resolved) : (verify ?? []);
|
|
39
39
|
let allPass = true;
|
|
40
40
|
for (const trait of traits) {
|
|
41
|
-
// eslint-disable-next-line no-await-in-loop
|
|
42
41
|
if (!(await trait.check(page, mem))) {
|
|
43
42
|
allPass = false;
|
|
44
43
|
break;
|
|
@@ -6,18 +6,19 @@
|
|
|
6
6
|
*
|
|
7
7
|
* "Stub" here is unrelated to the other two meanings already in this
|
|
8
8
|
* codebase: `stubBefore`/`stubAfter`/`stubOnError` (demo narration fixtures,
|
|
9
|
-
* see
|
|
9
|
+
* see demo/narration/index.ts's `runStubPhase`) and `upload`'s `stub: "image"|"pdf"|
|
|
10
10
|
* "video"` (a placeholder file). This is a third, separate "stub."
|
|
11
11
|
*
|
|
12
|
-
* Opt-in only, per Flow (`
|
|
12
|
+
* Opt-in only, per Flow (`map({ memStub: true })`) or per-run (`--mem-stub` /
|
|
13
13
|
* WAYGRAPH_MEM_STUB=1) - a required key with no registered generator still
|
|
14
14
|
* fails preflight exactly as before. Registered per MemKey *instance*
|
|
15
15
|
* (identity, not `.name`), matching MemPage's own store - two keys sharing a
|
|
16
16
|
* debug name must never cross-contaminate here either.
|
|
17
17
|
*/
|
|
18
|
-
import type { MemKey } from "./mem
|
|
19
|
-
import type { MemPage } from "./mem
|
|
20
|
-
import type { Flow } from "
|
|
18
|
+
import type { MemKey } from "./mem.js";
|
|
19
|
+
import type { MemPage } from "./mem.js";
|
|
20
|
+
import type { Flow } from "../flow/flow.js";
|
|
21
|
+
import type { Checkpoint } from "../checkpoint/checkpoint.js";
|
|
21
22
|
/**
|
|
22
23
|
* Registers a fake-value generator for one required MemKey.
|
|
23
24
|
* @example registerMemStub(LoginCreds.key, () => ({
|
|
@@ -26,16 +27,16 @@ import type { Flow } from "./core.js";
|
|
|
26
27
|
* }));
|
|
27
28
|
*/
|
|
28
29
|
export declare function registerMemStub<T>(key: MemKey<T>, fake: () => T): void;
|
|
29
|
-
/** Used by waygraph's own `--mem-stub`-aware CLI seeding and by {@link seedMemStub} - flow authors normally use {@link registerMemStub}
|
|
30
|
+
/** Used by waygraph's own `--mem-stub`-aware CLI seeding and by {@link seedMemStub} - flow authors normally use {@link registerMemStub} and `map({ memStub: true })` instead. */
|
|
30
31
|
export declare function getMemStub<T>(key: MemKey<T>): (() => T) | undefined;
|
|
31
32
|
/**
|
|
32
33
|
* For a bare library `flow.run(mem, ...)` call outside the CLI (which has its
|
|
33
34
|
* own `--mem-stub`-aware seeding) - call this yourself before `run()` when
|
|
34
35
|
* `flow.memStub` is true, the same way external tooling already reads
|
|
35
36
|
* `flow.resetSession`/`flow.title`/etc. (`run()` itself never reads Flow
|
|
36
|
-
* flags
|
|
37
|
+
* flags; the settings come from `map({ ... })`).
|
|
37
38
|
* @example
|
|
38
39
|
* if (flow.memStub) seedMemStub(mem, flow);
|
|
39
40
|
* await flow.run(mem, config);
|
|
40
41
|
*/
|
|
41
|
-
export declare function seedMemStub(mem: MemPage, flow: Flow<
|
|
42
|
+
export declare function seedMemStub(mem: MemPage, flow: Flow<Checkpoint<string>>): void;
|
|
@@ -9,7 +9,7 @@ const registry = new Map();
|
|
|
9
9
|
export function registerMemStub(key, fake) {
|
|
10
10
|
registry.set(key, fake);
|
|
11
11
|
}
|
|
12
|
-
/** Used by waygraph's own `--mem-stub`-aware CLI seeding and by {@link seedMemStub} - flow authors normally use {@link registerMemStub}
|
|
12
|
+
/** Used by waygraph's own `--mem-stub`-aware CLI seeding and by {@link seedMemStub} - flow authors normally use {@link registerMemStub} and `map({ memStub: true })` instead. */
|
|
13
13
|
export function getMemStub(key) {
|
|
14
14
|
return registry.get(key);
|
|
15
15
|
}
|
|
@@ -18,7 +18,7 @@ export function getMemStub(key) {
|
|
|
18
18
|
* own `--mem-stub`-aware seeding) - call this yourself before `run()` when
|
|
19
19
|
* `flow.memStub` is true, the same way external tooling already reads
|
|
20
20
|
* `flow.resetSession`/`flow.title`/etc. (`run()` itself never reads Flow
|
|
21
|
-
* flags
|
|
21
|
+
* flags; the settings come from `map({ ... })`).
|
|
22
22
|
* @example
|
|
23
23
|
* if (flow.memStub) seedMemStub(mem, flow);
|
|
24
24
|
* await flow.run(mem, config);
|
|
@@ -55,7 +55,7 @@ export declare class MemPage {
|
|
|
55
55
|
* can only have string/symbol property names, not object instances - a `[key,
|
|
56
56
|
* value]` pair is the shape that keeps that identity-based guarantee.
|
|
57
57
|
*
|
|
58
|
-
* Overloaded per pair count (2-6,
|
|
58
|
+
* Overloaded per pair count (2-6, per-arity overloads like the old `defineFlow`'s
|
|
59
59
|
* overloads) rather than one fully-generic variadic signature - each pair binds
|
|
60
60
|
* its own type parameter independently, which TS checks reliably; a single
|
|
61
61
|
* self-referential mapped-tuple-over-a-rest-parameter type was tried first and
|