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,13 +1,16 @@
|
|
|
1
|
-
import { Engine
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
1
|
+
import { Engine } from "../../engine/engine.js";
|
|
2
|
+
import { buildFlow } from "../../engine/flow/flow.js";
|
|
3
|
+
import { MemPage } from "../../engine/mem/mem.js";
|
|
4
|
+
import { buildExploreContext, buildExploreMenu, } from "../auto/explore.js";
|
|
5
|
+
import { detectHere, memStubValue } from "../auto/auto.js";
|
|
6
|
+
import { resolveBaseUrl } from "../../runtime/waygraph-config.js";
|
|
6
7
|
import { EdgeLeaseCoordinator } from "./lease.js";
|
|
7
8
|
import { buildCoverageReport, collectGraphEdgeKeys, defaultCoverageOutPath, formatCoverageLine, writeCoverageReport, } from "./coverage.js";
|
|
8
|
-
import { chromiumExecutablePath } from "
|
|
9
|
+
import { chromiumExecutablePath } from "../../runtime/browser.js";
|
|
10
|
+
import { envFlag, envString } from "../../engine/env.js";
|
|
11
|
+
import { ignorePageGone, ignoreTimeout } from "../../engine/page-gone.js";
|
|
9
12
|
function seedMem(library, mem, dataJson) {
|
|
10
|
-
const raw = dataJson ??
|
|
13
|
+
const raw = dataJson ?? envString("WAYGRAPH_DATA") ?? envString("WAYGRAPH_AUTO_MEM");
|
|
11
14
|
let envParsed = {};
|
|
12
15
|
if (raw) {
|
|
13
16
|
try {
|
|
@@ -25,7 +28,7 @@ function seedMem(library, mem, dataJson) {
|
|
|
25
28
|
mem.set(k, envParsed[k.name]);
|
|
26
29
|
continue;
|
|
27
30
|
}
|
|
28
|
-
const def =
|
|
31
|
+
const def = memStubValue(k);
|
|
29
32
|
if (def !== undefined)
|
|
30
33
|
mem.set(k, def);
|
|
31
34
|
}
|
|
@@ -36,12 +39,7 @@ function snapshotMem(library, mem) {
|
|
|
36
39
|
for (const entry of library.values()) {
|
|
37
40
|
for (const k of entry.block.requires ?? []) {
|
|
38
41
|
if (mem.has(k) && !(k.name in out)) {
|
|
39
|
-
|
|
40
|
-
out[k.name] = mem.get(k);
|
|
41
|
-
}
|
|
42
|
-
catch {
|
|
43
|
-
/* skip */
|
|
44
|
-
}
|
|
42
|
+
out[k.name] = mem.get(k);
|
|
45
43
|
}
|
|
46
44
|
}
|
|
47
45
|
}
|
|
@@ -71,23 +69,8 @@ function edgeKey(edge) {
|
|
|
71
69
|
const id = edge.instanceOption?.id;
|
|
72
70
|
return id ? `${edge.block}::${id}` : edge.block;
|
|
73
71
|
}
|
|
74
|
-
async function detectHere(page, navBlocks) {
|
|
75
|
-
try {
|
|
76
|
-
const url = page.url();
|
|
77
|
-
if (url.includes("/login"))
|
|
78
|
-
return "PiaLogin";
|
|
79
|
-
if (url.includes("mailpit") || url.includes(":54324") || url.includes("/mailhog")) {
|
|
80
|
-
return "PiaMailpitGui";
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
catch {
|
|
84
|
-
/* ignore */
|
|
85
|
-
}
|
|
86
|
-
const tags = navBlocks.map((n) => n.block);
|
|
87
|
-
return locate(page, tags, { timeoutMs: 1500 });
|
|
88
|
-
}
|
|
89
72
|
async function runOneBlock(engine, entry, context, page, mem) {
|
|
90
|
-
const flow =
|
|
73
|
+
const flow = buildFlow([entry.block], engine.config);
|
|
91
74
|
const BLOCK_TIMEOUT_MS = 45_000;
|
|
92
75
|
let timer;
|
|
93
76
|
try {
|
|
@@ -131,7 +114,7 @@ async function runTraverseWorker(opts) {
|
|
|
131
114
|
if (page.isClosed()) {
|
|
132
115
|
page = await context.newPage();
|
|
133
116
|
if (startUrl) {
|
|
134
|
-
await page.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(
|
|
117
|
+
await page.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(ignorePageGone);
|
|
135
118
|
}
|
|
136
119
|
}
|
|
137
120
|
const detected = await detectHere(page, library.navBlocks);
|
|
@@ -238,8 +221,8 @@ export async function runTraverse(projectDir, options = {}) {
|
|
|
238
221
|
const maxVisitsPerNode = options.maxVisitsPerNode ?? 2;
|
|
239
222
|
const maxVisitsPerEdge = options.maxVisitsPerEdge ?? 1;
|
|
240
223
|
const timeoutMs = options.timeoutMs ?? 15 * 60_000;
|
|
241
|
-
const headed = options.headed === true ||
|
|
242
|
-
const baseURL = options.baseURL ?? (await resolveBaseUrl(projectDir)) ??
|
|
224
|
+
const headed = options.headed === true || envFlag("WAYGRAPH_HEADED");
|
|
225
|
+
const baseURL = options.baseURL ?? (await resolveBaseUrl(projectDir)) ?? envString("WAYGRAPH_BASE_URL");
|
|
243
226
|
const startUrl = options.startUrl ?? baseURL;
|
|
244
227
|
const minEdgeCoverage = options.minEdgeCoverage != null && Number.isFinite(options.minEdgeCoverage)
|
|
245
228
|
? options.minEdgeCoverage
|
|
@@ -253,7 +236,7 @@ export async function runTraverse(projectDir, options = {}) {
|
|
|
253
236
|
const allEdgeKeys = collectGraphEdgeKeys(graph.edges);
|
|
254
237
|
const leases = new EdgeLeaseCoordinator({ projectDir, persist: parallel > 1 });
|
|
255
238
|
const engine = new Engine({ headless: !headed, slowMo: headed ? 100 : 0 });
|
|
256
|
-
if (
|
|
239
|
+
if (envString("WAYGRAPH_EXTENSIONS"))
|
|
257
240
|
console.error("waygraph traverse: extensions are not loaded (workers use plain contexts)");
|
|
258
241
|
const { chromium } = await import("@playwright/test");
|
|
259
242
|
const executablePath = chromiumExecutablePath();
|
|
@@ -318,8 +301,8 @@ export async function runTraverse(projectDir, options = {}) {
|
|
|
318
301
|
const mem = new MemPage();
|
|
319
302
|
seedMem(library.byName, mem, options.data);
|
|
320
303
|
if (startUrl) {
|
|
321
|
-
await page.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(
|
|
322
|
-
await page.waitForLoadState("load").catch(
|
|
304
|
+
await page.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(ignorePageGone);
|
|
305
|
+
await page.waitForLoadState("load").catch(ignoreTimeout);
|
|
323
306
|
}
|
|
324
307
|
const traverseId = options.traverseId ?? "traverse-1";
|
|
325
308
|
const result = await runTraverseWorker({
|
|
@@ -342,7 +325,7 @@ export async function runTraverse(projectDir, options = {}) {
|
|
|
342
325
|
mem,
|
|
343
326
|
leases,
|
|
344
327
|
});
|
|
345
|
-
await context.close().catch(
|
|
328
|
+
await context.close().catch(ignorePageGone);
|
|
346
329
|
const coverageCode = emitCoverage([{ traverseId, result }]);
|
|
347
330
|
if (result.exitCode !== 0)
|
|
348
331
|
return result.exitCode;
|
|
@@ -359,12 +342,12 @@ export async function runTraverse(projectDir, options = {}) {
|
|
|
359
342
|
const bootMem = new MemPage();
|
|
360
343
|
seedMem(library.byName, bootMem, options.data);
|
|
361
344
|
if (startUrl) {
|
|
362
|
-
await bootPage.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(
|
|
363
|
-
await bootPage.waitForLoadState("load").catch(
|
|
345
|
+
await bootPage.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(ignorePageGone);
|
|
346
|
+
await bootPage.waitForLoadState("load").catch(ignoreTimeout);
|
|
364
347
|
}
|
|
365
348
|
const storageState = await bootContext.storageState();
|
|
366
349
|
const memSnap = snapshotMem(library.byName, bootMem);
|
|
367
|
-
await bootContext.close().catch(
|
|
350
|
+
await bootContext.close().catch(ignorePageGone);
|
|
368
351
|
console.error(`waygraph traverse: forked ${parallel} clone workers (storageState + mem snapshot)`);
|
|
369
352
|
const workerMeta = await Promise.all(Array.from({ length: parallel }, async (_, i) => {
|
|
370
353
|
const traverseId = `traverse-${i + 1}`;
|
|
@@ -379,7 +362,7 @@ export async function runTraverse(projectDir, options = {}) {
|
|
|
379
362
|
const mem = new MemPage();
|
|
380
363
|
restoreMem(library.byName, mem, memSnap, options.data);
|
|
381
364
|
if (startUrl) {
|
|
382
|
-
await page.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(
|
|
365
|
+
await page.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(ignorePageGone);
|
|
383
366
|
}
|
|
384
367
|
try {
|
|
385
368
|
const result = await runTraverseWorker({
|
|
@@ -405,7 +388,7 @@ export async function runTraverse(projectDir, options = {}) {
|
|
|
405
388
|
return { traverseId, result };
|
|
406
389
|
}
|
|
407
390
|
finally {
|
|
408
|
-
await context.close().catch(
|
|
391
|
+
await context.close().catch(ignorePageGone);
|
|
409
392
|
}
|
|
410
393
|
}));
|
|
411
394
|
const results = workerMeta.map((w) => w.result);
|
|
@@ -418,6 +401,6 @@ export async function runTraverse(projectDir, options = {}) {
|
|
|
418
401
|
return coverageCode;
|
|
419
402
|
}
|
|
420
403
|
finally {
|
|
421
|
-
await browser.close().catch(
|
|
404
|
+
await browser.close().catch(ignorePageGone);
|
|
422
405
|
}
|
|
423
406
|
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { BlockKind, ProjectScan, ScanOptions } from "./project.js";
|
|
2
|
+
export declare const MANIFEST_VERSION = 1;
|
|
3
|
+
export interface ManifestBlock {
|
|
4
|
+
/** `file#exportName`, unique across the project. */
|
|
5
|
+
id: string;
|
|
6
|
+
name: string;
|
|
7
|
+
exportName: string;
|
|
8
|
+
kind: BlockKind;
|
|
9
|
+
description: string;
|
|
10
|
+
from: string[];
|
|
11
|
+
to: string[];
|
|
12
|
+
requires: string[];
|
|
13
|
+
file: string;
|
|
14
|
+
/** The `src/map/` group folder the Block lives in (e.g. `(external)/hoppscotch`), or the map package it came from. */
|
|
15
|
+
map?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface ManifestFlow {
|
|
18
|
+
/** `file#exportName`. */
|
|
19
|
+
id: string;
|
|
20
|
+
exportName: string;
|
|
21
|
+
file: string;
|
|
22
|
+
/** The folders under `src/flows/` (the page or `(user-story)` it belongs to) and the file's name (the outcome). */
|
|
23
|
+
useCase: {
|
|
24
|
+
path: string[];
|
|
25
|
+
outcome: string;
|
|
26
|
+
};
|
|
27
|
+
/** Block names in run order, nested flows flattened. */
|
|
28
|
+
steps: string[];
|
|
29
|
+
settings: {
|
|
30
|
+
memStub?: true;
|
|
31
|
+
expectedFailure?: string;
|
|
32
|
+
sessionReset?: true;
|
|
33
|
+
demoPace?: unknown;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export interface Manifest {
|
|
37
|
+
version: number;
|
|
38
|
+
project: {
|
|
39
|
+
name: string;
|
|
40
|
+
dir: string;
|
|
41
|
+
waygraph: string;
|
|
42
|
+
};
|
|
43
|
+
checkpoints: string[];
|
|
44
|
+
maps: string[];
|
|
45
|
+
blocks: ManifestBlock[];
|
|
46
|
+
flows: ManifestFlow[];
|
|
47
|
+
skipped: ProjectScan["skipped"];
|
|
48
|
+
}
|
|
49
|
+
/** Builds the manifest from a scan. */
|
|
50
|
+
export declare function manifestFromScan(scan: ProjectScan): Manifest;
|
|
51
|
+
/** Scans the project and returns its manifest. */
|
|
52
|
+
export declare function buildManifest(projectDir: string, opts?: ScanOptions): Promise<Manifest>;
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// The manifest: everything a project defines, as plain JSON. `waygraph manifest` prints it; Waygraph UI and map packages
|
|
2
|
+
// read it instead of importing the project.
|
|
3
|
+
import { readFileSync } from "node:fs";
|
|
4
|
+
import { dirname, join } from "node:path";
|
|
5
|
+
import { scanProject } from "./project.js";
|
|
6
|
+
export const MANIFEST_VERSION = 1;
|
|
7
|
+
function packageVersion() {
|
|
8
|
+
try {
|
|
9
|
+
return JSON.parse(readFileSync(join(dirname(new URL(import.meta.url).pathname), "..", "..", "package.json"), "utf8")).version;
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return "unknown";
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function projectName(dir) {
|
|
16
|
+
try {
|
|
17
|
+
return JSON.parse(readFileSync(join(dir, "package.json"), "utf8")).name ?? dir;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return dir;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/** `(external)/hoppscotch` for `src/map/(external)/hoppscotch/_methods/x.block.ts`: the group plus its first folder. */
|
|
24
|
+
function mapGroupOf(file) {
|
|
25
|
+
const parts = file.split(/[\\/]/);
|
|
26
|
+
const i = parts.indexOf("map");
|
|
27
|
+
if (i < 0 || parts[i - 1] !== "src")
|
|
28
|
+
return undefined;
|
|
29
|
+
const rest = parts.slice(i + 1, -1);
|
|
30
|
+
if (rest.length === 0)
|
|
31
|
+
return undefined;
|
|
32
|
+
return /^\(.*\)$/.test(rest[0]) && rest[1] && !rest[1].startsWith("_") ? `${rest[0]}/${rest[1]}` : rest[0];
|
|
33
|
+
}
|
|
34
|
+
function useCaseOf(file) {
|
|
35
|
+
const parts = file.split(/[\\/]/);
|
|
36
|
+
const i = parts.indexOf("flows");
|
|
37
|
+
const folders = i >= 0 ? parts.slice(i + 1, -1) : [];
|
|
38
|
+
return { path: folders, outcome: parts[parts.length - 1].replace(/\.flow\.ts$/, "") };
|
|
39
|
+
}
|
|
40
|
+
/** Builds the manifest from a scan. */
|
|
41
|
+
export function manifestFromScan(scan) {
|
|
42
|
+
const checkpoints = new Set();
|
|
43
|
+
const maps = new Set();
|
|
44
|
+
const blocks = scan.blocks.map((b) => {
|
|
45
|
+
for (const t of [...b.from, ...b.to])
|
|
46
|
+
if (t !== "*")
|
|
47
|
+
checkpoints.add(t);
|
|
48
|
+
const map = b.map ?? mapGroupOf(b.file);
|
|
49
|
+
if (map)
|
|
50
|
+
maps.add(map);
|
|
51
|
+
return {
|
|
52
|
+
id: `${b.file}#${b.exportName}`,
|
|
53
|
+
name: b.name,
|
|
54
|
+
exportName: b.exportName,
|
|
55
|
+
kind: b.kind,
|
|
56
|
+
description: b.description,
|
|
57
|
+
from: b.from,
|
|
58
|
+
to: b.to,
|
|
59
|
+
requires: b.requires,
|
|
60
|
+
file: b.file,
|
|
61
|
+
...(map ? { map } : {}),
|
|
62
|
+
};
|
|
63
|
+
});
|
|
64
|
+
const flows = scan.flows.map((f) => {
|
|
65
|
+
const flow = f.flow;
|
|
66
|
+
return {
|
|
67
|
+
id: `${f.file}#${f.exportName}`,
|
|
68
|
+
exportName: f.exportName,
|
|
69
|
+
file: f.file,
|
|
70
|
+
useCase: useCaseOf(f.file),
|
|
71
|
+
steps: flow.blocks().map((s) => s.name),
|
|
72
|
+
settings: {
|
|
73
|
+
...(flow.memStub ? { memStub: true } : {}),
|
|
74
|
+
...(flow.expectedFailureReason ? { expectedFailure: flow.expectedFailureReason } : {}),
|
|
75
|
+
...(flow.resetSession ? { sessionReset: true } : {}),
|
|
76
|
+
...(flow.demoPace !== undefined ? { demoPace: flow.demoPace } : {}),
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
});
|
|
80
|
+
return {
|
|
81
|
+
version: MANIFEST_VERSION,
|
|
82
|
+
project: { name: projectName(scan.projectDir), dir: scan.projectDir, waygraph: packageVersion() },
|
|
83
|
+
checkpoints: [...checkpoints].sort(),
|
|
84
|
+
maps: [...maps].sort(),
|
|
85
|
+
blocks,
|
|
86
|
+
flows,
|
|
87
|
+
skipped: scan.skipped,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/** Scans the project and returns its manifest. */
|
|
91
|
+
export async function buildManifest(projectDir, opts = {}) {
|
|
92
|
+
return manifestFromScan(await scanProject(projectDir, opts));
|
|
93
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// The rule that makes a map group packable: its files import only waygraph, Playwright, `node:` modules and each other.
|
|
2
|
+
import { dirname, resolve, sep } from "node:path";
|
|
3
|
+
import { walkDir } from "./scan.js";
|
|
4
|
+
import { importSpecifiers, parseSource } from "./source.js";
|
|
5
|
+
const ALLOWED_BARE = /^(waygraph|@playwright\/test|playwright|playwright-core)(\/.*)?$|^node:/;
|
|
6
|
+
/** Imports in a group that reach outside it. */
|
|
7
|
+
export function mapGroupImportProblems(group) {
|
|
8
|
+
const problems = [];
|
|
9
|
+
for (const file of walkDir(group.dir, /\.ts$/)) {
|
|
10
|
+
for (const spec of importSpecifiers(parseSource(file))) {
|
|
11
|
+
if (spec.startsWith(".")) {
|
|
12
|
+
const target = resolve(dirname(file), spec);
|
|
13
|
+
if (target === group.dir || target.startsWith(group.dir + sep))
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
else if (ALLOWED_BARE.test(spec))
|
|
17
|
+
continue;
|
|
18
|
+
problems.push({ file, spec });
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return problems;
|
|
22
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export interface MapGroup {
|
|
2
|
+
/** Path under `src/map/`, e.g. `(external)/hoppscotch`. */
|
|
3
|
+
group: string;
|
|
4
|
+
dir: string;
|
|
5
|
+
}
|
|
6
|
+
/** Every packable group: a folder under `src/map/` with its own `_states.ts`. */
|
|
7
|
+
export declare function mapGroups(projectDir: string): MapGroup[];
|
|
8
|
+
/** Finds a group by its full path (`(external)/hoppscotch`) or its last folder (`hoppscotch`). */
|
|
9
|
+
export declare function findMapGroup(projectDir: string, name: string): MapGroup | undefined;
|
|
10
|
+
export interface MapPackageJson {
|
|
11
|
+
version: number;
|
|
12
|
+
name: string;
|
|
13
|
+
group: string;
|
|
14
|
+
checkpoints: string[];
|
|
15
|
+
blocks: {
|
|
16
|
+
name: string;
|
|
17
|
+
exportName: string;
|
|
18
|
+
kind: string;
|
|
19
|
+
from: string[];
|
|
20
|
+
to: string[];
|
|
21
|
+
requires: string[];
|
|
22
|
+
file: string;
|
|
23
|
+
}[];
|
|
24
|
+
}
|
|
25
|
+
export interface InstalledMapPackage {
|
|
26
|
+
name: string;
|
|
27
|
+
dir: string;
|
|
28
|
+
map: MapPackageJson;
|
|
29
|
+
}
|
|
30
|
+
/** Map packages the project depends on: dependencies whose root holds a `waygraph.map.json`. */
|
|
31
|
+
export declare function installedMapPackages(projectDir: string): InstalledMapPackage[];
|
|
32
|
+
/** The compiled Block files of an installed map package. */
|
|
33
|
+
export declare function mapPackageBlockFiles(pkg: InstalledMapPackage): string[];
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// Map groups as packages. A group is a `src/map/` folder that owns its Checkpoints (`_states.ts`); it may import only
|
|
2
|
+
// `waygraph`, Playwright, `node:` modules and its own files, so it can be packed (`waygraph map pack`) and installed in
|
|
3
|
+
// another project, where the scanner finds it by its `waygraph.map.json`.
|
|
4
|
+
import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
|
|
5
|
+
import { dirname, join, relative, resolve, sep } from "node:path";
|
|
6
|
+
import { walkDir } from "./scan.js";
|
|
7
|
+
/** Every packable group: a folder under `src/map/` with its own `_states.ts`. */
|
|
8
|
+
export function mapGroups(projectDir) {
|
|
9
|
+
const mapRoot = join(resolve(projectDir), "src", "map");
|
|
10
|
+
if (!existsSync(mapRoot))
|
|
11
|
+
return [];
|
|
12
|
+
return walkDir(mapRoot, /^_states\.ts$/)
|
|
13
|
+
.map((f) => dirname(f))
|
|
14
|
+
.map((dir) => ({ group: relative(mapRoot, dir).split(sep).join("/"), dir }))
|
|
15
|
+
.sort((a, b) => a.group.localeCompare(b.group));
|
|
16
|
+
}
|
|
17
|
+
/** Finds a group by its full path (`(external)/hoppscotch`) or its last folder (`hoppscotch`). */
|
|
18
|
+
export function findMapGroup(projectDir, name) {
|
|
19
|
+
const groups = mapGroups(projectDir);
|
|
20
|
+
return groups.find((g) => g.group === name) ?? groups.find((g) => g.group.split("/").pop() === name);
|
|
21
|
+
}
|
|
22
|
+
/** Map packages the project depends on: dependencies whose root holds a `waygraph.map.json`. */
|
|
23
|
+
export function installedMapPackages(projectDir) {
|
|
24
|
+
let pkg;
|
|
25
|
+
try {
|
|
26
|
+
pkg = JSON.parse(readFileSync(join(projectDir, "package.json"), "utf8"));
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return [];
|
|
30
|
+
}
|
|
31
|
+
const out = [];
|
|
32
|
+
for (const name of Object.keys({ ...pkg.dependencies, ...pkg.devDependencies }).sort()) {
|
|
33
|
+
const dir = join(projectDir, "node_modules", name);
|
|
34
|
+
const file = join(dir, "waygraph.map.json");
|
|
35
|
+
if (!existsSync(file))
|
|
36
|
+
continue;
|
|
37
|
+
try {
|
|
38
|
+
out.push({ name, dir, map: JSON.parse(readFileSync(file, "utf8")) });
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
/* a broken waygraph.map.json is skipped, like a Block file that fails to import */
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return out;
|
|
45
|
+
}
|
|
46
|
+
/** The compiled Block files of an installed map package. */
|
|
47
|
+
export function mapPackageBlockFiles(pkg) {
|
|
48
|
+
const files = [];
|
|
49
|
+
const walk = (dir) => {
|
|
50
|
+
for (const name of readdirSync(dir)) {
|
|
51
|
+
const p = join(dir, name);
|
|
52
|
+
if (name === "node_modules")
|
|
53
|
+
continue;
|
|
54
|
+
if (statSync(p).isDirectory())
|
|
55
|
+
walk(p);
|
|
56
|
+
else if (/\.block\.js$/.test(name))
|
|
57
|
+
files.push(p);
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
walk(pkg.dir);
|
|
61
|
+
return files.sort();
|
|
62
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { MapImportProblem } from "./map-imports.js";
|
|
2
|
+
export interface PackOptions {
|
|
3
|
+
/** Output folder. Default `.waygraph/packages/<group>`. */
|
|
4
|
+
out?: string | undefined;
|
|
5
|
+
/** Package name. Default `waygraph-map-<group>`. */
|
|
6
|
+
name?: string | undefined;
|
|
7
|
+
version?: string | undefined;
|
|
8
|
+
}
|
|
9
|
+
export type PackResult = {
|
|
10
|
+
ok: true;
|
|
11
|
+
name: string;
|
|
12
|
+
dir: string;
|
|
13
|
+
group: string;
|
|
14
|
+
blocks: number;
|
|
15
|
+
} | {
|
|
16
|
+
ok: false;
|
|
17
|
+
reason: string;
|
|
18
|
+
problems?: MapImportProblem[];
|
|
19
|
+
};
|
|
20
|
+
/** Packs a map group (by `(external)/hoppscotch` or `hoppscotch`) into an installable package folder. */
|
|
21
|
+
export declare function packMapGroup(projectDir: string, groupName: string, opts?: PackOptions): Promise<PackResult>;
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
// `waygraph map pack <group>`: compiles one map group with the project's own TypeScript into an installable package
|
|
2
|
+
// (JavaScript + types, an index re-exporting everything, and `waygraph.map.json` for the scanner and Waygraph UI).
|
|
3
|
+
import { spawnSync } from "node:child_process";
|
|
4
|
+
import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
5
|
+
import { createRequire } from "node:module";
|
|
6
|
+
import { dirname, join, relative, resolve, sep } from "node:path";
|
|
7
|
+
import { fileURLToPath } from "node:url";
|
|
8
|
+
import { findMapGroup, mapGroups } from "./maps.js";
|
|
9
|
+
import { mapGroupImportProblems } from "./map-imports.js";
|
|
10
|
+
import { MANIFEST_VERSION } from "./manifest.js";
|
|
11
|
+
import { scanProject } from "./project.js";
|
|
12
|
+
import { walkDir } from "./scan.js";
|
|
13
|
+
function waygraphVersion() {
|
|
14
|
+
const pkg = join(dirname(fileURLToPath(import.meta.url)), "..", "..", "package.json");
|
|
15
|
+
return JSON.parse(readFileSync(pkg, "utf8")).version;
|
|
16
|
+
}
|
|
17
|
+
function compile(projectDir, group, out) {
|
|
18
|
+
let tsc;
|
|
19
|
+
try {
|
|
20
|
+
tsc = createRequire(join(projectDir, "package.json")).resolve("typescript/bin/tsc");
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return "TypeScript is not installed in this project (npm i -D typescript)";
|
|
24
|
+
}
|
|
25
|
+
const base = join(projectDir, "tsconfig.json");
|
|
26
|
+
const config = join(out, "tsconfig.pack.json");
|
|
27
|
+
writeFileSync(config, JSON.stringify({
|
|
28
|
+
...(existsSync(base) ? { extends: base } : {}),
|
|
29
|
+
compilerOptions: {
|
|
30
|
+
...(existsSync(base) ? {} : { target: "ES2022", module: "NodeNext", moduleResolution: "NodeNext", strict: true, skipLibCheck: true }),
|
|
31
|
+
noEmit: false,
|
|
32
|
+
declaration: true,
|
|
33
|
+
rootDir: group.dir,
|
|
34
|
+
outDir: out,
|
|
35
|
+
},
|
|
36
|
+
include: [join(group.dir, "**", "*.ts")],
|
|
37
|
+
exclude: [],
|
|
38
|
+
}, null, 2));
|
|
39
|
+
const run = spawnSync(process.execPath, [tsc, "-p", config], { cwd: projectDir, encoding: "utf8" });
|
|
40
|
+
rmSync(config, { force: true });
|
|
41
|
+
if (run.status !== 0)
|
|
42
|
+
return `tsc failed:\n${run.stdout}${run.stderr}`;
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
/** Packs a map group (by `(external)/hoppscotch` or `hoppscotch`) into an installable package folder. */
|
|
46
|
+
export async function packMapGroup(projectDir, groupName, opts = {}) {
|
|
47
|
+
const group = findMapGroup(projectDir, groupName);
|
|
48
|
+
if (!group) {
|
|
49
|
+
const known = mapGroups(projectDir).map((g) => g.group);
|
|
50
|
+
return {
|
|
51
|
+
ok: false,
|
|
52
|
+
reason: `no map group "${groupName}" (a src/map/ folder with its own _states.ts)${known.length ? `; groups: ${known.join(", ")}` : ""}`,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
const problems = mapGroupImportProblems(group);
|
|
56
|
+
if (problems.length > 0)
|
|
57
|
+
return { ok: false, reason: `${group.group} imports files outside the group`, problems };
|
|
58
|
+
const slug = group.group.split("/").pop().replace(/[()]/g, "");
|
|
59
|
+
const name = opts.name ?? `waygraph-map-${slug}`;
|
|
60
|
+
const out = resolve(projectDir, opts.out ?? join(".waygraph", "packages", slug));
|
|
61
|
+
rmSync(out, { recursive: true, force: true });
|
|
62
|
+
mkdirSync(out, { recursive: true });
|
|
63
|
+
const failed = compile(projectDir, group, out);
|
|
64
|
+
if (failed)
|
|
65
|
+
return { ok: false, reason: failed };
|
|
66
|
+
const scan = await scanProject(projectDir, { flows: false, maps: false });
|
|
67
|
+
const blocks = scan.blocks.filter((b) => b.absFile.startsWith(group.dir + sep));
|
|
68
|
+
const checkpoints = new Set();
|
|
69
|
+
for (const b of blocks)
|
|
70
|
+
for (const t of [...b.from, ...b.to])
|
|
71
|
+
if (t !== "*")
|
|
72
|
+
checkpoints.add(t);
|
|
73
|
+
const map = {
|
|
74
|
+
version: MANIFEST_VERSION,
|
|
75
|
+
name,
|
|
76
|
+
group: group.group,
|
|
77
|
+
checkpoints: [...checkpoints].sort(),
|
|
78
|
+
blocks: blocks.map((b) => ({
|
|
79
|
+
name: b.name,
|
|
80
|
+
exportName: b.exportName,
|
|
81
|
+
kind: b.kind,
|
|
82
|
+
from: b.from,
|
|
83
|
+
to: b.to,
|
|
84
|
+
requires: b.requires,
|
|
85
|
+
file: relative(group.dir, b.absFile).split(sep).join("/").replace(/\.ts$/, ".js"),
|
|
86
|
+
})),
|
|
87
|
+
};
|
|
88
|
+
writeFileSync(join(out, "waygraph.map.json"), JSON.stringify(map, null, 2) + "\n");
|
|
89
|
+
const modules = walkDir(out, /\.js$/)
|
|
90
|
+
.map((f) => "./" + relative(out, f).split(sep).join("/"))
|
|
91
|
+
.filter((f) => f !== "./index.js")
|
|
92
|
+
.sort();
|
|
93
|
+
const index = modules.map((m) => `export * from "${m}";`).join("\n") + "\n";
|
|
94
|
+
writeFileSync(join(out, "index.js"), index);
|
|
95
|
+
writeFileSync(join(out, "index.d.ts"), index);
|
|
96
|
+
writeFileSync(join(out, "package.json"), JSON.stringify({
|
|
97
|
+
name,
|
|
98
|
+
version: opts.version ?? "0.1.0",
|
|
99
|
+
description: `waygraph map: ${group.group}`,
|
|
100
|
+
type: "module",
|
|
101
|
+
main: "./index.js",
|
|
102
|
+
types: "./index.d.ts",
|
|
103
|
+
exports: { ".": { types: "./index.d.ts", default: "./index.js" }, "./*": "./*" },
|
|
104
|
+
files: ["**/*.js", "**/*.d.ts", "waygraph.map.json"],
|
|
105
|
+
keywords: ["waygraph", "waygraph-map"],
|
|
106
|
+
peerDependencies: { waygraph: `^${waygraphVersion()}` },
|
|
107
|
+
}, null, 2) + "\n");
|
|
108
|
+
return { ok: true, name, dir: out, group: group.group, blocks: blocks.length };
|
|
109
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { BlocksSelect } from "./select.js";
|
|
2
|
+
import type { AnyBlock } from "./scan.js";
|
|
3
|
+
export type BlockKind = "nav" | "page" | "assert" | "method" | "effect" | "api" | "block";
|
|
4
|
+
export interface ScannedBlock {
|
|
5
|
+
block: AnyBlock;
|
|
6
|
+
name: string;
|
|
7
|
+
exportName: string;
|
|
8
|
+
kind: BlockKind;
|
|
9
|
+
description: string;
|
|
10
|
+
/** Checkpoint tags it runs from (`"*"` = anywhere) and lands on. Empty `to` = route unknown (see `skipped`). */
|
|
11
|
+
from: string[];
|
|
12
|
+
to: string[];
|
|
13
|
+
requires: string[];
|
|
14
|
+
/** Project-relative path; Blocks from an injected library are tagged `@label/...`. */
|
|
15
|
+
file: string;
|
|
16
|
+
absFile: string;
|
|
17
|
+
/** The installed map package it came from (its `file` is then `<package>/<path>`). */
|
|
18
|
+
map?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface ScannedFlow {
|
|
21
|
+
flow: {
|
|
22
|
+
run: (...args: unknown[]) => Promise<unknown>;
|
|
23
|
+
blocks: () => unknown[];
|
|
24
|
+
};
|
|
25
|
+
exportName: string;
|
|
26
|
+
file: string;
|
|
27
|
+
absFile: string;
|
|
28
|
+
}
|
|
29
|
+
/** A Block as the live menus (auto, pilot) hold it: navigation or action. */
|
|
30
|
+
export interface BlockEntry {
|
|
31
|
+
block: AnyBlock;
|
|
32
|
+
exportName: string;
|
|
33
|
+
file: string;
|
|
34
|
+
kind: "nav" | "action";
|
|
35
|
+
description: string;
|
|
36
|
+
}
|
|
37
|
+
export interface ProjectScan {
|
|
38
|
+
projectDir: string;
|
|
39
|
+
blocks: ScannedBlock[];
|
|
40
|
+
flows: ScannedFlow[];
|
|
41
|
+
skipped: {
|
|
42
|
+
block: string;
|
|
43
|
+
file: string;
|
|
44
|
+
reason: string;
|
|
45
|
+
}[];
|
|
46
|
+
}
|
|
47
|
+
export interface ScanOptions {
|
|
48
|
+
blocksSelect?: BlocksSelect | undefined;
|
|
49
|
+
inject?: string[] | undefined;
|
|
50
|
+
/** Also import `*.flow.ts` files. Default true. */
|
|
51
|
+
flows?: boolean;
|
|
52
|
+
/** Also scan installed map packages (dependencies with a `waygraph.map.json`). Default true. */
|
|
53
|
+
maps?: boolean;
|
|
54
|
+
/** Called when a file fails to import (default: a one-line warning for Playwright double-install errors). */
|
|
55
|
+
onImportError?: (relFile: string, err: unknown) => void;
|
|
56
|
+
}
|
|
57
|
+
/** A file that fails to import is left out of the scan, and said so: a silent skip reads as "nothing there". */
|
|
58
|
+
export declare function reportImportError(relFile: string, err: unknown): void;
|
|
59
|
+
/** Imports every `*.block.ts` (and `*.flow.ts`) under the project and its injected roots. */
|
|
60
|
+
export declare function scanProject(projectDir: string, opts?: ScanOptions): Promise<ProjectScan>;
|