waygraph 0.15.54 → 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 +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/{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 +3 -11
- package/dist/{highlights → demo/narration}/demo-pace.js +5 -11
- package/dist/{highlights → demo/narration}/device.d.ts +2 -2
- package/dist/{highlights → demo/narration}/device.js +1 -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/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 +9 -7
- package/dist/{core → engine/block}/compose.js +1 -1
- 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/{core → engine/flow}/map-builder.d.ts +34 -39
- package/dist/{core → engine/flow}/map-builder.js +45 -47
- 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/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 -254
- 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 +6 -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 +3 -3
- package/dist/{session → live/pilot}/pilot.js +4 -4
- package/dist/{traverse/run.d.ts → live/traverse/traverse.d.ts} +1 -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/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 +10 -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/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 -294
- 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 -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/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/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/{trait.js → engine/trait/trait.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,30 +1,10 @@
|
|
|
1
1
|
import type { Page } from "@playwright/test";
|
|
2
|
-
import type {
|
|
3
|
-
import type {
|
|
4
|
-
import type {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
* embedded data. Two Checkpoints with the same tag are the same state everywhere.
|
|
9
|
-
*/
|
|
10
|
-
export type Checkpoint<Tag extends string> = {
|
|
11
|
-
readonly __state: Tag;
|
|
12
|
-
};
|
|
13
|
-
/**
|
|
14
|
-
* Builds a Checkpoint - spells `__state` for you so no call site does it by hand.
|
|
15
|
-
* @example resolve: () => checkpoint("LoggedIn")
|
|
16
|
-
*/
|
|
17
|
-
export declare function checkpoint<Tag extends string>(tag: Tag): Checkpoint<Tag>;
|
|
18
|
-
/**
|
|
19
|
-
* The type every entry Block's `In` must be - `runGraph` always seeds a fresh
|
|
20
|
-
* run with `checkpoint("__start__")` as the fake initial input, so a Block
|
|
21
|
-
* meant to lead off a Flow needs exactly this type. Exported so no project
|
|
22
|
-
* has to know or hand-type the `"__start__"` literal itself - the same reason
|
|
23
|
-
* `checkpoint()` exists instead of every call site spelling `{ __state: tag }`
|
|
24
|
-
* by hand.
|
|
25
|
-
* @example export const LoginBlock: Block<Start, LoggedIn> = { ... }
|
|
26
|
-
*/
|
|
27
|
-
export type Start = Checkpoint<"__start__">;
|
|
2
|
+
import type { Checkpoint } from "../checkpoint/checkpoint.js";
|
|
3
|
+
import type { StubLifecycleFn } from "../stub/stub.js";
|
|
4
|
+
import type { WaygraphSlidesOrFn } from "../stub/ring.js";
|
|
5
|
+
import { MemPage } from "../mem/mem.js";
|
|
6
|
+
import type { MemKey } from "../mem/mem.js";
|
|
7
|
+
import type { Trait } from "../trait/trait.js";
|
|
28
8
|
/**
|
|
29
9
|
* The `page` a regular Block's `act()` is typed against via `defineBlock` -
|
|
30
10
|
* structurally identical to Playwright's own `Page` (the same real object is
|
|
@@ -90,36 +70,14 @@ export interface Instruction<In extends Checkpoint<string>, Out extends Checkpoi
|
|
|
90
70
|
*/
|
|
91
71
|
verify?: Trait[] | ((out: Out) => Trait[]);
|
|
92
72
|
/**
|
|
93
|
-
*
|
|
94
|
-
*
|
|
95
|
-
* slot object. Object map `{ email: { selector, label } }` remains a shorthand.
|
|
96
|
-
* Flow {@link HighlightFixtureMap} still overrides ring labels.
|
|
97
|
-
* @example stubBefore: (ctx) => {
|
|
98
|
-
* ctx.todos(["Email", "Password", "Submit"]);
|
|
99
|
-
* ctx.todoIndex(0);
|
|
100
|
-
* ctx.highlights({ email: { selector: "#email", label: "Email" } });
|
|
101
|
-
* }
|
|
102
|
-
*/
|
|
103
|
-
stubBefore?: HighlightStubPhaseOrFn<Out>;
|
|
104
|
-
/**
|
|
105
|
-
* Open block lifecycle **after** resolve (step panel rings + fixtures).
|
|
106
|
-
* Prefer `stubAfter(ctx) { ... }`. Object map shorthand still works.
|
|
107
|
-
* Prefer this over legacy {@link Instruction.highlights}.
|
|
108
|
-
* @example stubAfter: (ctx) => {
|
|
109
|
-
* ctx.todoIndex(2);
|
|
110
|
-
* ctx.ring("badge", { selector: ".cart", label: "Cart updated" });
|
|
111
|
-
* }
|
|
73
|
+
* The demo's narration before the step, written by `Block.stubBefore((ctx) => ...)` where a flow uses the Block (stubs
|
|
74
|
+
* chained there add up). Not something to set in a Block's definition: Blocks carry no narration.
|
|
112
75
|
*/
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
* @example stubOnError: (ctx) => {
|
|
119
|
-
* ctx.ring("card", { selector: ".alt-1", label: "Card at failure", tag: "BUG" });
|
|
120
|
-
* }
|
|
121
|
-
*/
|
|
122
|
-
stubOnError?: HighlightStubPhaseOrFn<Out>;
|
|
76
|
+
stubBefore?: StubLifecycleFn<Out>;
|
|
77
|
+
/** After the step lands; written by `Block.stubAfter((ctx) => ...)`. */
|
|
78
|
+
stubAfter?: StubLifecycleFn<Out>;
|
|
79
|
+
/** When the step fails, before the failure panel; written by `Block.stubOnError((ctx) => ...)`. */
|
|
80
|
+
stubOnError?: StubLifecycleFn<Out>;
|
|
123
81
|
/**
|
|
124
82
|
* Multi-step demo captions ("yap" slides) with Next between each -
|
|
125
83
|
* not block lifecycle. Explains a long process; optional `selector` rings
|
|
@@ -130,11 +88,6 @@ export interface Instruction<In extends Checkpoint<string>, Out extends Checkpoi
|
|
|
130
88
|
* ]
|
|
131
89
|
*/
|
|
132
90
|
slides?: WaygraphSlidesOrFn<Out>;
|
|
133
|
-
/**
|
|
134
|
-
* @deprecated Prefer {@link Instruction.stubAfter}. Shimmed to stubAfter keys
|
|
135
|
-
* `"0"`, `"1"`, … when stubAfter is empty.
|
|
136
|
-
*/
|
|
137
|
-
highlights?: readonly WaygraphHighlight[] | ((out: Out) => readonly WaygraphHighlight[]);
|
|
138
91
|
}
|
|
139
92
|
/**
|
|
140
93
|
* One selectable option for a Block whose real choices depend on the live
|
|
@@ -200,7 +153,7 @@ export interface Block<In extends Checkpoint<string>, Out extends Checkpoint<str
|
|
|
200
153
|
* Block, meaning "terminal after one step". Returning the Block itself is a
|
|
201
154
|
* self-loop - see `runGraph`'s `maxSteps` for the safety net that needs.
|
|
202
155
|
*/
|
|
203
|
-
next?(checkpoint: Out):
|
|
156
|
+
next?(checkpoint: Out): SomeBlock | null | undefined;
|
|
204
157
|
/**
|
|
205
158
|
* `branch()`'s routing table as plain, readable data - Checkpoint tag ->
|
|
206
159
|
* target Block's `.name` (`null` for a terminal tag) - alongside {@link next}
|
|
@@ -220,12 +173,12 @@ export interface Block<In extends Checkpoint<string>, Out extends Checkpoint<str
|
|
|
220
173
|
* `act`.
|
|
221
174
|
* @example requires: [LoginCreds.key]
|
|
222
175
|
*/
|
|
223
|
-
requires?: readonly MemKey<
|
|
176
|
+
requires?: readonly MemKey<unknown>[];
|
|
224
177
|
/**
|
|
225
|
-
* Demo pacing for this Block
|
|
178
|
+
* Demo pacing for this Block (the `{ pace }` step option).
|
|
226
179
|
* Demo/step only - `runGraph` ignores. Prefer `fastForwardComposeBlock` for blitz.
|
|
227
180
|
*/
|
|
228
|
-
demoPace?: import("
|
|
181
|
+
demoPace?: import("../stub/pace.js").DemoPace;
|
|
229
182
|
/**
|
|
230
183
|
* Optional. When this Block's real choices depend on the live page
|
|
231
184
|
* (which of several items to add to cart, which of several rows to
|
|
@@ -282,39 +235,101 @@ export type DefinedBlock<In extends Checkpoint<string>, Out extends Checkpoint<s
|
|
|
282
235
|
* Overloads keep `ctx` typed when the author passes a lifecycle function
|
|
283
236
|
* (a single union parameter would make the callback param `any`).
|
|
284
237
|
*/
|
|
285
|
-
stubBefore(stub: import("
|
|
286
|
-
stubBefore(stub: import("./highlights.js").StubLifecycleFn<Out>): DefinedBlock<In, Out>;
|
|
238
|
+
stubBefore(stub: import("../stub/stub.js").StubLifecycleFn<Out>): DefinedBlock<In, Out>;
|
|
287
239
|
/** Demo narration after resolve. Prefer ctx callbacks over slot-map objects. */
|
|
288
|
-
stubAfter(stub: import("
|
|
289
|
-
stubAfter(stub: import("./highlights.js").StubLifecycleFn<Out>): DefinedBlock<In, Out>;
|
|
240
|
+
stubAfter(stub: import("../stub/stub.js").StubLifecycleFn<Out>): DefinedBlock<In, Out>;
|
|
290
241
|
/** Demo narration when the step fails / expected-failure path. */
|
|
291
|
-
stubOnError(stub: import("
|
|
292
|
-
stubOnError(stub: import("./highlights.js").StubLifecycleFn<Out>): DefinedBlock<In, Out>;
|
|
242
|
+
stubOnError(stub: import("../stub/stub.js").StubLifecycleFn<Out>): DefinedBlock<In, Out>;
|
|
293
243
|
};
|
|
294
244
|
/**
|
|
295
|
-
*
|
|
296
|
-
*
|
|
297
|
-
|
|
298
|
-
|
|
245
|
+
* Any Block, whatever its route. A Block takes its `In` Checkpoint as a callback argument, so it is contravariant in `In`
|
|
246
|
+
* and no one Checkpoint type covers every Block: `any` is that "some Block", written once here.
|
|
247
|
+
*/
|
|
248
|
+
export type SomeBlock = Block<any, any>;
|
|
249
|
+
/** Any {@link DefinedBlock} (see {@link SomeBlock}). */
|
|
250
|
+
export type SomeDefinedBlock = DefinedBlock<any, any>;
|
|
251
|
+
export declare function findBlockIndex(middle: readonly SomeBlock[], block: SomeBlock | string | number): number;
|
|
252
|
+
/**
|
|
253
|
+
* Attaches routing to `block` without touching its act/observe/resolve/verify -
|
|
254
|
+
* `routes` must cover every tag of `block`'s output (a missing route is a compile
|
|
255
|
+
* error), and the returned Block runs exactly as `block` always did, just followed
|
|
256
|
+
* by whichever next Block the resolved tag routes to. `null` for a tag means that
|
|
257
|
+
* tag is terminal - the run stops there, same as a Block with no routing at all.
|
|
258
|
+
* A route pointing back at `block` itself is a self-loop; see `runGraph`'s
|
|
259
|
+
* `maxSteps` for its safety net. The return type is deliberately `Block<In, any>` -
|
|
260
|
+
* a route can lead anywhere, including back through itself, so there is no fixed
|
|
261
|
+
* Out type to express; state the expected outcomes to `runGraph` via `terminals`
|
|
262
|
+
* instead.
|
|
299
263
|
*/
|
|
300
|
-
export
|
|
264
|
+
export declare function branch<In extends Checkpoint<string>, Out extends Checkpoint<string>>(block: Block<In, Out>, routes: {
|
|
265
|
+
[K in Out["__state"]]: Block<Extract<Out, Checkpoint<K>>, any> | null;
|
|
266
|
+
}): DefinedBlock<In, any>;
|
|
267
|
+
/** Copy non-enumerable waygraph markers so decorate/withVerify keep map() kind checks. */
|
|
268
|
+
export declare function copyWaygraphRuntime(from: object, to: object): void;
|
|
269
|
+
/**
|
|
270
|
+
* Builds a Block with `withVerify`/`modVerify`/`modVerifyAll` attached as
|
|
271
|
+
* methods - `LoginBlock.withVerify([...])`, discoverable by typing
|
|
272
|
+
* `LoginBlock.` in an editor, not just callable as `withVerify(LoginBlock, ...)`
|
|
273
|
+
* if you already know it exists. A raw object literal is still a perfectly
|
|
274
|
+
* valid Block (every test fixture in this codebase is one) - it just won't have
|
|
275
|
+
* these attached. The methods are thin: they delegate to the identically-named
|
|
276
|
+
* free functions, which remain the one place this logic actually lives.
|
|
277
|
+
*/
|
|
278
|
+
export declare function defineBlock<In extends Checkpoint<string>, Out extends Checkpoint<string>>(base: {
|
|
301
279
|
name: string;
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
280
|
+
description?: Block<In, Out>["description"];
|
|
281
|
+
instruction: Omit<Instruction<In, Out, any>, "act"> & {
|
|
282
|
+
act(page: ActionPage, input: In, mem: MemPage): Promise<void>;
|
|
283
|
+
};
|
|
284
|
+
next?: Block<In, Out>["next"];
|
|
285
|
+
requires?: Block<In, Out>["requires"];
|
|
286
|
+
routes?: Block<In, Out>["routes"];
|
|
287
|
+
instanceOptions?: Block<In, Out>["instanceOptions"];
|
|
288
|
+
}): DefinedBlock<In, Out>;
|
|
305
289
|
/**
|
|
306
|
-
*
|
|
307
|
-
*
|
|
308
|
-
*
|
|
309
|
-
*
|
|
290
|
+
* Returns a new Block that runs exactly like `block` - same act/observe/resolve,
|
|
291
|
+
* same routing - but with `verify` replaced. For giving one flow stricter (or
|
|
292
|
+
* looser, or just different) confirmation on a Block it didn't author, without
|
|
293
|
+
* that Block needing to have been written as a parameterized factory in
|
|
294
|
+
* anticipation. Same move as `branch()`: decorate an existing Block, don't ask
|
|
295
|
+
* every Block to pre-build its own override mechanism.
|
|
310
296
|
*
|
|
311
|
-
*
|
|
312
|
-
*
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
*
|
|
317
|
-
*
|
|
318
|
-
*
|
|
297
|
+
* Wrap the one Block you want to change, in place, where a flow uses it:
|
|
298
|
+
* `map().gotoPage(NavLoginBlock).method(withVerify(AddToCartBlock, [...]))`.
|
|
299
|
+
*/
|
|
300
|
+
export declare function withVerify<B extends SomeBlock>(block: B, verify: Trait[] | ((out: any) => Trait[])): B;
|
|
301
|
+
/**
|
|
302
|
+
* Answers the browser's own dialog (`confirm`, `alert`, `prompt`, `beforeunload`) that this Block's action
|
|
303
|
+
* triggers. A dialog freezes the page until it is answered, so the answer has to be armed before the click -
|
|
304
|
+
* this does that without folding it into the Block's own `act`. The dialog's text can be kept in mem.
|
|
305
|
+
* @example withDialog(CancelBlock, { accept: true, into: LeaveWarning })
|
|
306
|
+
*/
|
|
307
|
+
export declare function withDialog<B extends SomeBlock>(block: B, options?: {
|
|
308
|
+
accept?: boolean;
|
|
309
|
+
into?: MemKey<string>;
|
|
310
|
+
promptText?: string;
|
|
311
|
+
}): B;
|
|
312
|
+
/**
|
|
313
|
+
* Replaces one Trait inside `block`'s verify list, leaving every other check
|
|
314
|
+
* untouched - the v1/v2/legacy-variant case, where one check needs a different
|
|
315
|
+
* selector or URL pattern but the rest of the Block is identical. Addressed by
|
|
316
|
+
* the Trait's own `name` (recommended - inserting or reordering other checks
|
|
317
|
+
* can't silently retarget it) or, if you genuinely know the position and don't
|
|
318
|
+
* need that safety, a numeric index. Either way a bad address fails loud
|
|
319
|
+
* immediately instead of quietly doing nothing. `newCheck` can be a bare
|
|
320
|
+
* `check` function (keeps the existing name) or a full `Trait` (to rename too).
|
|
321
|
+
* Only works on a flat `verify` array - a function-form `verify` (from
|
|
322
|
+
* `verify: (out) => Trait[]`) has no fixed list to address into, so this
|
|
323
|
+
* throws rather than guess; use `withVerify` to replace it wholesale instead.
|
|
324
|
+
*/
|
|
325
|
+
export declare function modVerify<In extends Checkpoint<string>, Out extends Checkpoint<string>>(block: Block<In, Out>, nameOrIndex: string | number, newCheck: Trait["check"] | Trait): DefinedBlock<In, Out>;
|
|
326
|
+
/**
|
|
327
|
+
* `modVerify`, but for several named checks in one call - a v2 variant that
|
|
328
|
+
* differs in five ways from v1 shouldn't need five nested `modVerify(modVerify(
|
|
329
|
+
* modVerify(...)))` calls to track by eye. `patches` keys are plain strings (a
|
|
330
|
+
* Trait's `name`, not a `MemKey` instance), so an ordinary object literal is
|
|
331
|
+
* fine here - unlike `MemPage`, there's no identity-collision reason to need
|
|
332
|
+
* `[name, check]` pairs. Applies each patch in turn via `modVerify`, so the
|
|
333
|
+
* same fail-loud-on-unknown-name behavior holds for every entry.
|
|
319
334
|
*/
|
|
320
|
-
export declare function
|
|
335
|
+
export declare function modVerifyAll<In extends Checkpoint<string>, Out extends Checkpoint<string>>(block: Block<In, Out>, patches: Record<string, Trait["check"] | Trait>): DefinedBlock<In, Out>;
|
|
@@ -27,7 +27,6 @@ export function findBlockIndex(middle, block) {
|
|
|
27
27
|
*/
|
|
28
28
|
export function branch(block, routes) {
|
|
29
29
|
const base = stripMethods(block);
|
|
30
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
31
30
|
let routed;
|
|
32
31
|
const routesAsData = {};
|
|
33
32
|
for (const [tag, target] of Object.entries(routes)) {
|
|
@@ -62,7 +61,6 @@ export function branch(block, routes) {
|
|
|
62
61
|
* `branch()` added routing to afterward, and without this step the result would
|
|
63
62
|
* silently drop that routing, since the stale closure never knew about it.
|
|
64
63
|
*/
|
|
65
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
66
64
|
function stripMethods(block) {
|
|
67
65
|
return {
|
|
68
66
|
name: block.name,
|
|
@@ -82,6 +80,8 @@ export function copyWaygraphRuntime(from, to) {
|
|
|
82
80
|
"__waygraphNavUrl",
|
|
83
81
|
"__waygraphNavClick",
|
|
84
82
|
"__waygraphNavFrom",
|
|
83
|
+
"__waygraphFrom",
|
|
84
|
+
"__waygraphTo",
|
|
85
85
|
]) {
|
|
86
86
|
const desc = Object.getOwnPropertyDescriptor(from, key);
|
|
87
87
|
if (!desc)
|
|
@@ -131,9 +131,9 @@ export function defineBlock(base) {
|
|
|
131
131
|
withVerify: (verify) => withVerify(defined, verify),
|
|
132
132
|
modVerify: (nameOrIndex, newCheck) => modVerify(defined, nameOrIndex, newCheck),
|
|
133
133
|
modVerifyAll: (patches) => modVerifyAll(defined, patches),
|
|
134
|
-
stubBefore: (stub) =>
|
|
135
|
-
stubAfter: (stub) =>
|
|
136
|
-
stubOnError: (stub) =>
|
|
134
|
+
stubBefore: (stub) => withStubPhase(defined, "stubBefore", stub),
|
|
135
|
+
stubAfter: (stub) => withStubPhase(defined, "stubAfter", stub),
|
|
136
|
+
stubOnError: (stub) => withStubPhase(defined, "stubOnError", stub),
|
|
137
137
|
};
|
|
138
138
|
return defined;
|
|
139
139
|
}
|
|
@@ -145,13 +145,8 @@ export function defineBlock(base) {
|
|
|
145
145
|
* anticipation. Same move as `branch()`: decorate an existing Block, don't ask
|
|
146
146
|
* every Block to pre-build its own override mechanism.
|
|
147
147
|
*
|
|
148
|
-
* Wrap the one Block you want to change, in place,
|
|
149
|
-
*
|
|
150
|
-
* `defineFlow([start, LoginBlock, withVerify(AddToCartBlock, [...]), end])`.
|
|
151
|
-
* There is no separate positional array to keep in sync and no `null`
|
|
152
|
-
* placeholder for "skip this one" - `defineFlow` has no per-slot verify
|
|
153
|
-
* argument at all, only whatever `verify` each Block's own `instruction` (or
|
|
154
|
-
* a `withVerify(...)` wrapping it) carries with it.
|
|
148
|
+
* Wrap the one Block you want to change, in place, where a flow uses it:
|
|
149
|
+
* `map().gotoPage(NavLoginBlock).method(withVerify(AddToCartBlock, [...]))`.
|
|
155
150
|
*/
|
|
156
151
|
export function withVerify(block, verify) {
|
|
157
152
|
const base = stripMethods(block);
|
|
@@ -159,29 +154,10 @@ export function withVerify(block, verify) {
|
|
|
159
154
|
copyWaygraphRuntime(block, next);
|
|
160
155
|
return next;
|
|
161
156
|
}
|
|
162
|
-
|
|
163
|
-
return !!v && typeof v === "object" && !Array.isArray(v);
|
|
164
|
-
}
|
|
165
|
-
/** Run a prior stub (fn or slot map) into an open ctx so decorate can chain. */
|
|
157
|
+
/** Runs a prior stub into the same ctx, so stubs chained on one Block add up. */
|
|
166
158
|
async function applyStubIntoCtx(raw, ctx) {
|
|
167
|
-
if (raw
|
|
168
|
-
|
|
169
|
-
if (typeof raw === "function") {
|
|
170
|
-
const ret = await raw(ctx);
|
|
171
|
-
if (isHighlightStubPhase(ret)) {
|
|
172
|
-
for (const [id, stub] of Object.entries(ret)) {
|
|
173
|
-
if (stub)
|
|
174
|
-
ctx.ring(id, stub);
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
return;
|
|
178
|
-
}
|
|
179
|
-
if (isHighlightStubPhase(raw)) {
|
|
180
|
-
for (const [id, stub] of Object.entries(raw)) {
|
|
181
|
-
if (stub)
|
|
182
|
-
ctx.ring(id, stub);
|
|
183
|
-
}
|
|
184
|
-
}
|
|
159
|
+
if (raw !== undefined)
|
|
160
|
+
await raw(ctx);
|
|
185
161
|
}
|
|
186
162
|
function withStubPhase(block, phase, stub) {
|
|
187
163
|
const base = stripMethods(block);
|
|
@@ -198,25 +174,6 @@ function withStubPhase(block, phase, stub) {
|
|
|
198
174
|
copyWaygraphRuntime(block, next);
|
|
199
175
|
return next;
|
|
200
176
|
}
|
|
201
|
-
/**
|
|
202
|
-
* Attach / chain a stubBefore lifecycle on a Block. Prefer
|
|
203
|
-
* `(ctx) => { ctx.ring(...); const x = ctx.mem?.get(Key); }`.
|
|
204
|
-
* @example FillUsernameBlock.stubBefore((ctx) => { ctx.ring("username", { ... }) })
|
|
205
|
-
* @deprecated Use the chained method: `Block.stubBefore((ctx) => …)`.
|
|
206
|
-
*/
|
|
207
|
-
export function withStubBefore(block, stub) {
|
|
208
|
-
return withStubPhase(block, "stubBefore", stub);
|
|
209
|
-
}
|
|
210
|
-
/** @see {@link withStubBefore} * @deprecated Use the chained method: `Block.stubAfter((ctx) => …)`.
|
|
211
|
-
*/
|
|
212
|
-
export function withStubAfter(block, stub) {
|
|
213
|
-
return withStubPhase(block, "stubAfter", stub);
|
|
214
|
-
}
|
|
215
|
-
/** @see {@link withStubBefore} * @deprecated Use the chained method: `Block.stubOnError((ctx) => …)`.
|
|
216
|
-
*/
|
|
217
|
-
export function withStubOnError(block, stub) {
|
|
218
|
-
return withStubPhase(block, "stubOnError", stub);
|
|
219
|
-
}
|
|
220
177
|
/**
|
|
221
178
|
* Answers the browser's own dialog (`confirm`, `alert`, `prompt`, `beforeunload`) that this Block's action
|
|
222
179
|
* triggers. A dialog freezes the page until it is answered, so the answer has to be armed before the click -
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import type { BlockInfo } from "
|
|
2
|
-
import type { Block
|
|
3
|
-
import type {
|
|
1
|
+
import type { BlockInfo } from "../flow/flow.js";
|
|
2
|
+
import type { Block } from "./block.js";
|
|
3
|
+
import type { Checkpoint } from "../checkpoint/checkpoint.js";
|
|
4
|
+
import type { Trait } from "../trait/trait.js";
|
|
5
|
+
import type { SomeBlock } from "./block.js";
|
|
4
6
|
/**
|
|
5
7
|
* A Block guaranteed to have `withStepVerify`/`modStepVerify` attached - what
|
|
6
8
|
* {@link composeBlock} returns. Extends plain `Block`, so it drops straight into
|
|
7
|
-
*
|
|
9
|
+
* a flow like any other Block; no special
|
|
8
10
|
* casing needed anywhere that only expects a `Block`.
|
|
9
11
|
*/
|
|
10
12
|
export interface ComposedBlock<In extends Checkpoint<string>, Out extends Checkpoint<string>> extends Block<In, Out> {
|
|
@@ -19,14 +21,14 @@ export interface ComposedBlock<In extends Checkpoint<string>, Out extends Checkp
|
|
|
19
21
|
* Block - same rules as {@link withVerify}. Throws if no step matches.
|
|
20
22
|
* @example GovFormBlock.withStepVerify("step-2-address", [])
|
|
21
23
|
*/
|
|
22
|
-
withStepVerify(step:
|
|
24
|
+
withStepVerify(step: SomeBlock | string | number, verify: Trait[] | ((out: any) => Trait[])): ComposedBlock<In, Out>;
|
|
23
25
|
/**
|
|
24
26
|
* Replaces one Trait inside one step's verify list - same rules as
|
|
25
27
|
* {@link modVerify}. Throws if no step matches, or that step has no verify
|
|
26
28
|
* trait at the given name/index.
|
|
27
29
|
* @example GovFormBlock.modStepVerify("step-2-address", "zip-visible", Trait.visible("#zip-confirmed"))
|
|
28
30
|
*/
|
|
29
|
-
modStepVerify(step:
|
|
31
|
+
modStepVerify(step: SomeBlock | string | number, nameOrIndex: string | number, newCheck: Trait["check"] | Trait): ComposedBlock<In, Out>;
|
|
30
32
|
}
|
|
31
33
|
/**
|
|
32
34
|
* Chains several Blocks into one named, exported unit - what a naturally
|
|
@@ -66,7 +68,7 @@ export interface FastForwardComposedBlock<In extends Checkpoint<string>, Out ext
|
|
|
66
68
|
readonly fastForward: true;
|
|
67
69
|
}
|
|
68
70
|
/** True when `block` came from {@link fastForwardComposeBlock}. */
|
|
69
|
-
export declare function isFastForwardBlock(block:
|
|
71
|
+
export declare function isFastForwardBlock(block: SomeBlock): block is FastForwardComposedBlock<any, any>;
|
|
70
72
|
/** Like `composeBlock`, but the steps run as one blitz-paced unit in a demo. */
|
|
71
73
|
export declare function fastForwardComposeBlock<In extends Checkpoint<string>, Out extends Checkpoint<string>>(name: string, steps: readonly [Block<In, Out>]): FastForwardComposedBlock<In, Out>;
|
|
72
74
|
export declare function fastForwardComposeBlock<In extends Checkpoint<string>, B extends Checkpoint<string>, Out extends Checkpoint<string>>(name: string, steps: readonly [Block<In, B>, Block<B, Out>]): FastForwardComposedBlock<In, Out>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { connect } from "../
|
|
1
|
+
import { connect } from "../run/connect.js";
|
|
2
2
|
import { WaygraphError, MSG_COMPOSE_EMPTY, MSG_FASTFORWARD_EMPTY } from "../errors.js";
|
|
3
3
|
import { findBlockIndex, modVerify, withVerify } from "./block.js";
|
|
4
4
|
export function composeBlock(name, steps) {
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import type { Checkpoint
|
|
2
|
-
import type {
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
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 { MemPage } from "../../mem/mem.js";
|
|
5
|
+
import type { MemKey } from "../../mem/mem.js";
|
|
5
6
|
import type { APIRequestContext, APIResponse } from "@playwright/test";
|
|
6
7
|
/** What `resolve`/`verify` see: the response's status and parsed body, nothing Playwright-specific. */
|
|
7
8
|
export interface ApiCallResult {
|
|
@@ -31,13 +32,14 @@ export interface ApiBlockOptions<In extends Checkpoint<string>, Out extends Chec
|
|
|
31
32
|
* @example method: "POST"
|
|
32
33
|
*/
|
|
33
34
|
method?: string;
|
|
34
|
-
/**
|
|
35
|
-
|
|
35
|
+
/** Where it runs: one Checkpoint value or a list; leave it out for "from anywhere". */
|
|
36
|
+
from?: In | readonly In[];
|
|
37
|
+
/** Where it lands: one Checkpoint value (then `resolve` may be left out) or a list. */
|
|
38
|
+
to: Out | readonly Out[];
|
|
39
|
+
/** Pure, like every other Block's resolve - picks the Checkpoint from the response. Optional when `to` is one Checkpoint. */
|
|
40
|
+
resolve?: (result: ApiCallResult) => Out;
|
|
36
41
|
verify?: Trait[] | ((out: Out) => Trait[]);
|
|
37
|
-
requires?: readonly MemKey<
|
|
38
|
-
stubBefore?: import("../../highlights.js").HighlightStubPhaseOrFn<Out>;
|
|
39
|
-
stubAfter?: import("../../highlights.js").HighlightStubPhaseOrFn<Out>;
|
|
40
|
-
stubOnError?: import("../../highlights.js").HighlightStubPhaseOrFn<Out>;
|
|
42
|
+
requires?: readonly MemKey<unknown>[];
|
|
41
43
|
}
|
|
42
44
|
/**
|
|
43
45
|
* A Block whose `act()` is a real HTTP request, not a page interaction - lets one Flow narrate a
|
|
@@ -45,10 +47,12 @@ export interface ApiBlockOptions<In extends Checkpoint<string>, Out extends Chec
|
|
|
45
47
|
* machine, checked by the same Trait/verify system. Runs through `page.request`, so it shares the
|
|
46
48
|
* browser context's cookies/origin - no separate auth dance for an already-logged-in session.
|
|
47
49
|
* @example
|
|
48
|
-
* const CheckOrderCreated = defineApiBlock
|
|
50
|
+
* const CheckOrderCreated = defineApiBlock({
|
|
49
51
|
* name: "check-order-created",
|
|
52
|
+
* from: LoggedIn,
|
|
53
|
+
* to: [OrderConfirmed, OrderFailed],
|
|
50
54
|
* call: ({ request }) => request.get("/api/orders/latest"),
|
|
51
|
-
* resolve: (r) => (r.ok ?
|
|
55
|
+
* resolve: (r) => (r.ok ? OrderConfirmed : OrderFailed),
|
|
52
56
|
* verify: [Trait.disabled],
|
|
53
57
|
* });
|
|
54
58
|
*/
|
|
@@ -1,5 +1,13 @@
|
|
|
1
|
+
// New Block kind: a backend/API check, not a page action - proves a Flow can mix a UI step
|
|
2
|
+
// (defineNavBlock/defineMethodBlock) with a real HTTP request in the SAME state machine, verified
|
|
3
|
+
// by the same Trait system everything else uses. Built on Playwright's own `page.request`
|
|
4
|
+
// (APIRequestContext) - no shell-out to curl, no second HTTP client to depend on.
|
|
5
|
+
import { recordApiCall } from "../../run/hooks.js";
|
|
6
|
+
import { checkpoint } from "../../checkpoint/checkpoint.js";
|
|
7
|
+
import { markRouteOf, tagsOf } from "../../checkpoint/route.js";
|
|
1
8
|
import { defineBlock } from "../block.js";
|
|
2
|
-
import { key } from "../../mem
|
|
9
|
+
import { key } from "../../mem/mem.js";
|
|
10
|
+
import { ignorePageGone } from "../../page-gone.js";
|
|
3
11
|
// Internal scratch key threading act()'s result to observe()/resolve() - Instruction has no other
|
|
4
12
|
// channel for this (resolve is pure, given only what observe returns). Identity-keyed, so this can
|
|
5
13
|
// never collide with a real author's own MemKey even if names happened to match; safe to share one
|
|
@@ -11,14 +19,22 @@ const API_RESULT_SCRATCH = key("__wgApiBlockResult");
|
|
|
11
19
|
* machine, checked by the same Trait/verify system. Runs through `page.request`, so it shares the
|
|
12
20
|
* browser context's cookies/origin - no separate auth dance for an already-logged-in session.
|
|
13
21
|
* @example
|
|
14
|
-
* const CheckOrderCreated = defineApiBlock
|
|
22
|
+
* const CheckOrderCreated = defineApiBlock({
|
|
15
23
|
* name: "check-order-created",
|
|
24
|
+
* from: LoggedIn,
|
|
25
|
+
* to: [OrderConfirmed, OrderFailed],
|
|
16
26
|
* call: ({ request }) => request.get("/api/orders/latest"),
|
|
17
|
-
* resolve: (r) => (r.ok ?
|
|
27
|
+
* resolve: (r) => (r.ok ? OrderConfirmed : OrderFailed),
|
|
18
28
|
* verify: [Trait.disabled],
|
|
19
29
|
* });
|
|
20
30
|
*/
|
|
21
31
|
export function defineApiBlock(options) {
|
|
32
|
+
const targets = tagsOf(options.to);
|
|
33
|
+
const pick = options.resolve;
|
|
34
|
+
if (!pick && targets.length !== 1) {
|
|
35
|
+
throw new Error(`waygraph: API Block "${options.name}" lands on several Checkpoints; give it a resolve() that picks one`);
|
|
36
|
+
}
|
|
37
|
+
const resolve = pick ?? (() => checkpoint(targets[0]));
|
|
22
38
|
const built = defineBlock({
|
|
23
39
|
name: options.name,
|
|
24
40
|
...(options.description ? { description: options.description } : {}),
|
|
@@ -33,20 +49,12 @@ export function defineApiBlock(options) {
|
|
|
33
49
|
body = await response.json();
|
|
34
50
|
}
|
|
35
51
|
catch {
|
|
36
|
-
body = await response.text().catch(
|
|
52
|
+
body = await response.text().catch(ignorePageGone);
|
|
37
53
|
}
|
|
38
54
|
mem.set(API_RESULT_SCRATCH, { status: response.status(), ok: response.ok(), body });
|
|
39
|
-
//
|
|
40
|
-
// so without this it's a silent title flash. No-ops outside a demo/pilot/auto run (see
|
|
41
|
-
// addNetworkEntry's own guard) and never fails the Block if painting the panel throws.
|
|
42
|
-
// Same network-tab panel real page traffic feeds too (network-capture.js) - this is the
|
|
43
|
-
// page.request side of it (a separate APIRequestContext, never seen by page.on('request')).
|
|
55
|
+
// Shown in the demo's network panel when a demo layer registered a recorder; never fails the Block.
|
|
44
56
|
try {
|
|
45
|
-
|
|
46
|
-
// to page.__wgNetworkHistory (Node-side, survives navigation), so it isn't lost the
|
|
47
|
-
// moment a later step in the same Flow navigates and wipes the panel's DOM.
|
|
48
|
-
const { recordNetworkEntry } = await import("../../runner/network-capture.js");
|
|
49
|
-
await recordNetworkEntry(page, {
|
|
57
|
+
await recordApiCall(page, {
|
|
50
58
|
method: options.method || "GET",
|
|
51
59
|
url: response.url(),
|
|
52
60
|
status: response.status(),
|
|
@@ -63,13 +71,13 @@ export function defineApiBlock(options) {
|
|
|
63
71
|
async observe(_page, mem) {
|
|
64
72
|
return mem.get(API_RESULT_SCRATCH);
|
|
65
73
|
},
|
|
66
|
-
resolve: (observed) =>
|
|
74
|
+
resolve: (observed) => resolve(observed),
|
|
67
75
|
...(options.verify !== undefined ? { verify: options.verify } : {}),
|
|
68
|
-
...(options.stubBefore !== undefined ? { stubBefore: options.stubBefore } : {}),
|
|
69
|
-
...(options.stubAfter !== undefined ? { stubAfter: options.stubAfter } : {}),
|
|
70
|
-
...(options.stubOnError !== undefined ? { stubOnError: options.stubOnError } : {}),
|
|
71
76
|
},
|
|
72
77
|
});
|
|
78
|
+
markRouteOf(built, options);
|
|
73
79
|
Object.defineProperty(built, "__waygraphKind", { value: "api", enumerable: false, configurable: false });
|
|
80
|
+
// Accepted by map().method(), like a Method: one step that lands on a Checkpoint.
|
|
81
|
+
Object.defineProperty(built, "__waygraphSalt", { value: "api", enumerable: false, configurable: false });
|
|
74
82
|
return built;
|
|
75
83
|
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import type { Block,
|
|
2
|
-
import type {
|
|
3
|
-
import type {
|
|
4
|
-
import {
|
|
1
|
+
import type { Block, DefinedBlock } from "../block.js";
|
|
2
|
+
import type { Checkpoint } from "../../checkpoint/checkpoint.js";
|
|
3
|
+
import type { MemKey } from "../../mem/mem.js";
|
|
4
|
+
import type { Trait } from "../../trait/trait.js";
|
|
5
|
+
import type { RoutedBlockBase } from "../../checkpoint/route.js";
|
|
5
6
|
/**
|
|
6
7
|
* TypeScript salt over {@link defineBlock}: same runtime Block, but the type
|
|
7
8
|
* forces `requires` + `instanceOptions` so `waygraph auto` can list one menu
|
|
@@ -10,29 +11,23 @@ import { defineBlock } from "../block.js";
|
|
|
10
11
|
*/
|
|
11
12
|
export type EffectBlock<In extends Checkpoint<string>, Out extends Checkpoint<string>> = Omit<DefinedBlock<In, Out>, "withVerify" | "modVerify" | "modVerifyAll" | "stubBefore" | "stubAfter" | "stubOnError"> & {
|
|
12
13
|
readonly __wgFactory?: "effect";
|
|
13
|
-
requires: readonly MemKey<
|
|
14
|
+
requires: readonly MemKey<unknown>[];
|
|
14
15
|
instanceOptions: NonNullable<Block<In, Out>["instanceOptions"]>;
|
|
15
16
|
withVerify(verify: Trait[] | ((out: Out) => Trait[])): EffectBlock<In, Out>;
|
|
16
17
|
modVerify(nameOrIndex: string | number, newCheck: Trait["check"] | Trait): EffectBlock<In, Out>;
|
|
17
18
|
modVerifyAll(patches: Record<string, Trait["check"] | Trait>): EffectBlock<In, Out>;
|
|
18
|
-
stubBefore(stub: import("../../
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
stubAfter(stub: import("../../highlights.js").StubLifecycleFn<Out>): EffectBlock<In, Out>;
|
|
22
|
-
stubOnError(stub: import("../../highlights.js").HighlightStubPhase): EffectBlock<In, Out>;
|
|
23
|
-
stubOnError(stub: import("../../highlights.js").StubLifecycleFn<Out>): EffectBlock<In, Out>;
|
|
19
|
+
stubBefore(stub: import("../../stub/stub.js").StubLifecycleFn<Out>): EffectBlock<In, Out>;
|
|
20
|
+
stubAfter(stub: import("../../stub/stub.js").StubLifecycleFn<Out>): EffectBlock<In, Out>;
|
|
21
|
+
stubOnError(stub: import("../../stub/stub.js").StubLifecycleFn<Out>): EffectBlock<In, Out>;
|
|
24
22
|
};
|
|
25
|
-
/** @deprecated Prefer {@link EffectBlock} - same type; Mem* was an early name. */
|
|
26
|
-
export type MemEffectBlock<In extends Checkpoint<string>, Out extends Checkpoint<string>> = EffectBlock<In, Out>;
|
|
27
23
|
/**
|
|
28
24
|
* {@link defineBlock} constrained for effect-style instance menus: `requires` +
|
|
29
25
|
* `instanceOptions` are mandatory. Prefer this when the Block adds / removes /
|
|
30
26
|
* toggles a live instance rather than navigating. Runtime result is an ordinary
|
|
31
27
|
* Block - the helper is TypeScript salt only.
|
|
32
28
|
*/
|
|
33
|
-
export
|
|
34
|
-
requires: readonly MemKey<
|
|
29
|
+
export type EffectExtras<In extends Checkpoint<string>, Out extends Checkpoint<string>> = {
|
|
30
|
+
requires: readonly MemKey<unknown>[];
|
|
35
31
|
instanceOptions: NonNullable<Block<In, Out>["instanceOptions"]>;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export declare const defineMemEffectBlock: typeof defineEffectBlock;
|
|
32
|
+
};
|
|
33
|
+
export declare function defineEffectBlock<In extends Checkpoint<string>, Out extends Checkpoint<string>>(base: RoutedBlockBase<In, Out> & EffectExtras<In, Out>): EffectBlock<In, Out>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { defineBlock } from "../block.js";
|
|
2
|
+
import { markRouteOf, routed } from "../../checkpoint/route.js";
|
|
3
|
+
export function defineEffectBlock(base) {
|
|
4
|
+
const built = defineBlock(routed(base));
|
|
5
|
+
markRouteOf(built, base);
|
|
6
|
+
Object.defineProperty(built, "__waygraphMemKind", {
|
|
7
|
+
value: "effect",
|
|
8
|
+
enumerable: false,
|
|
9
|
+
configurable: false,
|
|
10
|
+
});
|
|
11
|
+
Object.defineProperty(built, "__waygraphSalt", {
|
|
12
|
+
value: "effect",
|
|
13
|
+
enumerable: false,
|
|
14
|
+
configurable: false,
|
|
15
|
+
});
|
|
16
|
+
return built;
|
|
17
|
+
}
|