waygraph 0.15.53 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -3
- package/bin/waygraph +2 -2
- package/dist/analysis/check.d.ts +38 -0
- package/dist/analysis/check.js +87 -0
- package/dist/analysis/coverage-gap.d.ts +1 -1
- package/dist/analysis/coverage-gap.js +14 -37
- package/dist/analysis/flow-source.d.ts +9 -0
- package/dist/analysis/flow-source.js +25 -0
- package/dist/analysis/graph.d.ts +13 -14
- package/dist/analysis/graph.js +48 -371
- package/dist/analysis/map-check.js +4 -39
- package/dist/analysis/practices-check.d.ts +1 -1
- package/dist/analysis/practices-check.js +24 -45
- package/dist/cli/args.d.ts +23 -0
- package/dist/cli/args.js +20 -0
- package/dist/{cli.d.ts → cli/cli.d.ts} +0 -1
- package/dist/{cli.js → cli/cli.js} +10 -9
- package/dist/{commands → cli/commands}/agent-dive-scaffold.js +35 -64
- package/dist/cli/commands/agent-dive.js +42 -0
- package/dist/{commands → cli/commands}/check.d.ts +0 -1
- package/dist/cli/commands/check.js +104 -0
- package/dist/cli/commands/codemod-checkpoints.d.ts +18 -0
- package/dist/cli/commands/codemod-checkpoints.js +186 -0
- package/dist/cli/commands/codemod-flows.d.ts +18 -0
- package/dist/cli/commands/codemod-flows.js +284 -0
- package/dist/cli/commands/codemod-stubs.d.ts +10 -0
- package/dist/cli/commands/codemod-stubs.js +187 -0
- package/dist/{commands → cli/commands}/extensions.js +5 -4
- package/dist/{commands → cli/commands}/init.js +1 -2
- package/dist/{commands → cli/commands}/list.js +9 -7
- package/dist/cli/commands/manifest.d.ts +2 -0
- package/dist/cli/commands/manifest.js +20 -0
- package/dist/cli/commands/map.js +57 -0
- package/dist/{commands → cli/commands}/run.d.ts +0 -1
- package/dist/cli/commands/run.js +64 -0
- package/dist/{commands → cli/commands}/session.js +61 -88
- package/dist/{commands → cli/commands}/test.js +11 -14
- package/dist/cli/commands/traverse.js +105 -0
- package/dist/{commands → cli/commands}/try.js +29 -25
- package/dist/{commands → cli/commands}/upgrade.js +40 -4
- package/dist/cli/flags.d.ts +193 -16
- package/dist/cli/flags.js +179 -234
- package/dist/cli/run-chain.d.ts +1 -0
- package/dist/cli/run-chain.js +42 -7
- package/dist/cli/usage.d.ts +1 -1
- package/dist/cli/usage.js +21 -53
- package/dist/cli/util.d.ts +2 -2
- package/dist/cli/util.js +2 -3
- package/dist/{highlights → demo/narration}/css.d.ts +1 -1
- package/dist/{highlights → demo/narration}/css.js +2 -3
- package/dist/{highlights → demo/narration}/demo-pace.d.ts +7 -11
- package/dist/{highlights → demo/narration}/demo-pace.js +9 -11
- package/dist/{highlights → demo/narration}/device.d.ts +4 -2
- package/dist/{highlights → demo/narration}/device.js +3 -1
- package/dist/demo/narration/merge.d.ts +8 -0
- package/dist/demo/narration/merge.js +71 -0
- package/dist/{highlights/run-phase.d.ts → demo/narration/narration.d.ts} +10 -14
- package/dist/{highlights/run-phase.js → demo/narration/narration.js} +25 -94
- package/dist/{highlights → demo/narration}/shorthand.d.ts +1 -1
- package/dist/demo/narration/stub-ctx.d.ts +8 -0
- package/dist/demo/narration/stub-ctx.js +164 -0
- package/dist/{highlights → demo/narration}/style.d.ts +1 -7
- package/dist/{highlights → demo/narration}/style.js +1 -41
- package/dist/{highlights → demo/narration}/todo-dock.d.ts +3 -3
- package/dist/{highlights → demo/narration}/todo-dock.js +13 -30
- package/dist/demo/overlay/auto-chrome.d.ts +7 -0
- package/dist/demo/overlay/auto-chrome.js +97 -0
- package/dist/{session/overlay-beacon.d.ts → demo/overlay/beacon.d.ts} +7 -0
- package/dist/{session/overlay-beacon.js → demo/overlay/beacon.js} +5 -0
- package/dist/demo/overlay/cursor.d.ts +12 -0
- package/dist/demo/overlay/cursor.js +142 -0
- package/dist/demo/overlay/device-stage.d.ts +13 -0
- package/dist/demo/overlay/device-stage.js +396 -0
- package/dist/demo/overlay/inpage/banner.d.ts +1 -0
- package/dist/demo/overlay/inpage/banner.js +160 -0
- package/dist/demo/overlay/inpage/caption.d.ts +2 -0
- package/dist/demo/overlay/inpage/caption.js +24 -0
- package/dist/demo/overlay/inpage/core.d.ts +1 -0
- package/dist/demo/overlay/inpage/core.js +345 -0
- package/dist/demo/overlay/inpage/device-chip.d.ts +1 -0
- package/dist/demo/overlay/inpage/device-chip.js +191 -0
- package/dist/demo/overlay/inpage/network.d.ts +9 -0
- package/dist/demo/overlay/inpage/network.js +200 -0
- package/dist/demo/overlay/inpage/panel-chrome.d.ts +1 -0
- package/dist/demo/overlay/inpage/panel-chrome.js +203 -0
- package/dist/demo/overlay/inpage/stamp.d.ts +1 -0
- package/dist/demo/overlay/inpage/stamp.js +46 -0
- package/dist/demo/overlay/inpage/swipe-zoom.d.ts +1 -0
- package/dist/demo/overlay/inpage/swipe-zoom.js +220 -0
- package/dist/demo/overlay/inpage/todos.d.ts +1 -0
- package/dist/demo/overlay/inpage/todos.js +294 -0
- package/dist/demo/overlay/locator-theater.d.ts +25 -0
- package/dist/demo/overlay/locator-theater.js +76 -0
- package/dist/demo/overlay/network-capture.d.ts +22 -0
- package/dist/demo/overlay/network-capture.js +127 -0
- package/dist/demo/overlay/overlay-css.d.ts +3 -0
- package/dist/demo/overlay/overlay-css.js +369 -0
- package/dist/demo/overlay/overlay-stage.d.ts +23 -0
- package/dist/demo/overlay/overlay-stage.js +106 -0
- package/dist/demo/overlay/overlay.d.ts +10 -0
- package/dist/demo/overlay/overlay.js +89 -0
- package/dist/{pilot-overlay/overlay-fixtures.d.ts → demo/overlay/phase-fixtures.d.ts} +2 -2
- package/dist/{pilot-overlay/overlay-fixtures.js → demo/overlay/phase-fixtures.js} +2 -2
- package/dist/{pilot-overlay/action-ring.js → demo/overlay/pilot/actions.js} +2 -1
- package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.d.ts +6 -5
- package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.js +19 -18
- package/dist/{pilot-overlay → demo/overlay/pilot}/shell.d.ts +2 -2
- package/dist/{pilot-overlay → demo/overlay/pilot}/shell.js +13 -22
- package/dist/demo/overlay/reattach.d.ts +7 -0
- package/dist/demo/overlay/reattach.js +23 -0
- package/dist/demo/overlay/rings.d.ts +33 -0
- package/dist/demo/overlay/rings.js +448 -0
- package/dist/{ui → demo/overlay/ui}/components/ring.js +2 -2
- package/dist/{ui → demo/overlay/ui}/overlay.css +4 -4
- package/dist/{ui → demo/overlay/ui}/shadow.d.ts +1 -1
- package/dist/{ui → demo/overlay/ui}/shadow.js +39 -2
- package/dist/demo/stepper/after.d.ts +3 -0
- package/dist/demo/stepper/after.js +113 -0
- package/dist/demo/stepper/banner-log.d.ts +37 -0
- package/dist/demo/stepper/banner-log.js +63 -0
- package/dist/demo/stepper/before.d.ts +4 -0
- package/dist/demo/stepper/before.js +110 -0
- package/dist/demo/stepper/demo-log.d.ts +31 -0
- package/dist/demo/stepper/demo-log.js +309 -0
- package/dist/demo/stepper/gate.d.ts +11 -0
- package/dist/demo/stepper/gate.js +78 -0
- package/dist/demo/stepper/interaction-patch.d.ts +3 -0
- package/dist/demo/stepper/interaction-patch.js +323 -0
- package/dist/demo/stepper/pacing.d.ts +21 -0
- package/dist/demo/stepper/pacing.js +23 -0
- package/dist/demo/stepper/slides.d.ts +11 -0
- package/dist/demo/stepper/slides.js +233 -0
- package/dist/demo/stepper/step-panels.d.ts +21 -0
- package/dist/demo/stepper/step-panels.js +589 -0
- package/dist/demo/stepper/stepper.d.ts +24 -0
- package/dist/demo/stepper/stepper.js +122 -0
- package/dist/demo/stepper/teardown.d.ts +48 -0
- package/dist/demo/stepper/teardown.js +179 -0
- package/dist/demo/stepper/todo-advance.d.ts +14 -0
- package/dist/demo/stepper/todo-advance.js +110 -0
- package/dist/demo/stepper/view.d.ts +68 -0
- package/dist/demo/stepper/view.js +31 -0
- package/dist/demo/types.d.ts +17 -0
- package/dist/demo/verbose-log.js +15 -0
- package/dist/{types.d.ts → engine/block/block.d.ts} +106 -91
- package/dist/{core → engine/block}/block.js +10 -53
- package/dist/{core → engine/block}/compose.d.ts +10 -7
- package/dist/{core → engine/block}/compose.js +1 -1
- package/dist/{core/blocks → engine/block/kinds}/api.d.ts +17 -12
- package/dist/{core/blocks → engine/block/kinds}/api.js +26 -18
- package/dist/{core/blocks → engine/block/kinds}/effect.d.ts +13 -18
- package/dist/engine/block/kinds/effect.js +17 -0
- package/dist/{core/blocks → engine/block/kinds}/method.d.ts +19 -29
- package/dist/{core/blocks → engine/block/kinds}/method.js +7 -21
- package/dist/{core/blocks → engine/block/kinds}/nav.d.ts +22 -31
- package/dist/{core/blocks → engine/block/kinds}/nav.js +6 -12
- package/dist/{core/blocks → engine/block/kinds}/page.d.ts +15 -20
- package/dist/{core/blocks → engine/block/kinds}/page.js +5 -7
- package/dist/engine/checkpoint/checkpoint.d.ts +22 -0
- package/dist/engine/checkpoint/checkpoint.js +8 -0
- package/dist/engine/checkpoint/route.d.ts +28 -0
- package/dist/engine/checkpoint/route.js +28 -0
- package/dist/{core → engine}/config.d.ts +7 -2
- package/dist/engine/config.js +6 -0
- package/dist/engine/engine.d.ts +45 -0
- package/dist/{core → engine}/engine.js +6 -10
- package/dist/engine/env.d.ts +59 -0
- package/dist/engine/env.js +83 -0
- package/dist/{errors.d.ts → engine/errors.d.ts} +23 -22
- package/dist/{errors.js → engine/errors.js} +22 -22
- package/dist/{core → engine/flow}/branch-regression.d.ts +8 -7
- package/dist/{core → engine/flow}/branch-regression.js +4 -3
- package/dist/engine/flow/flow.d.ts +162 -0
- package/dist/engine/flow/flow.js +244 -0
- package/dist/{core → engine/flow}/map-builder.d.ts +42 -40
- package/dist/{core → engine/flow}/map-builder.js +46 -48
- package/dist/{core → engine}/locate.d.ts +1 -1
- package/dist/{core → engine}/locate.js +1 -2
- package/dist/{mem-stub.d.ts → engine/mem/mem-stub.d.ts} +9 -8
- package/dist/{mem-stub.js → engine/mem/mem-stub.js} +2 -2
- package/dist/{mem-page.d.ts → engine/mem/mem.d.ts} +1 -1
- package/dist/{mem-page.js → engine/mem/mem.js} +2 -1
- package/dist/engine/page-gone.d.ts +5 -0
- package/dist/engine/page-gone.js +20 -0
- package/dist/engine/run/connect.d.ts +28 -0
- package/dist/{types.js → engine/run/connect.js} +11 -10
- package/dist/engine/run/events.d.ts +67 -0
- package/dist/engine/run/events.js +90 -0
- package/dist/engine/run/hooks.d.ts +16 -0
- package/dist/engine/run/hooks.js +8 -0
- package/dist/engine/run/launch.d.ts +13 -0
- package/dist/engine/run/launch.js +27 -0
- package/dist/{core/run-graph.d.ts → engine/run/run.d.ts} +9 -11
- package/dist/{core/run-graph.js → engine/run/run.js} +22 -11
- package/dist/engine/stub/pace.d.ts +12 -0
- package/dist/engine/stub/pace.js +2 -0
- package/dist/engine/stub/ring.d.ts +130 -0
- package/dist/engine/stub/ring.js +41 -0
- package/dist/engine/stub/stub.d.ts +268 -0
- package/dist/engine/stub/stub.js +1 -0
- package/dist/engine/stub/todos.d.ts +104 -0
- package/dist/engine/stub/todos.js +2 -0
- package/dist/engine/stub/viewport.d.ts +26 -0
- package/dist/engine/stub/viewport.js +2 -0
- package/dist/{trait.d.ts → engine/trait/trait.d.ts} +1 -1
- package/dist/index.d.ts +84 -36
- package/dist/index.js +44 -19
- package/dist/{session/auto-explore-run.d.ts → live/auto/auto.d.ts} +10 -16
- package/dist/{session/auto-explore-run.js → live/auto/auto.js} +164 -248
- package/dist/{session/auto-explore.d.ts → live/auto/explore.d.ts} +4 -14
- package/dist/{session/auto-explore.js → live/auto/explore.js} +21 -127
- package/dist/{auto-session/session.d.ts → live/auto-session/auto-session.d.ts} +1 -1
- package/dist/{auto-session/session.js → live/auto-session/auto-session.js} +27 -24
- package/dist/{auto-session → live/auto-session}/helpers.d.ts +16 -5
- package/dist/{auto-session → live/auto-session}/helpers.js +1 -1
- package/dist/{session/auto-session-ipc.d.ts → live/auto-session/ipc.d.ts} +7 -5
- package/dist/{session/auto-session-ipc.js → live/auto-session/ipc.js} +31 -16
- package/dist/{session/browser.d.ts → live/auto-session/start.d.ts} +1 -2
- package/dist/{session/browser.js → live/auto-session/start.js} +2 -3
- package/dist/{pilot-overlay → live/pilot}/panel.d.ts +1 -1
- package/dist/{pilot-overlay → live/pilot}/panel.js +23 -31
- package/dist/{session → live/pilot}/pilot.d.ts +4 -3
- package/dist/{session → live/pilot}/pilot.js +4 -4
- package/dist/{traverse → live/traverse}/coverage.d.ts +4 -0
- package/dist/{traverse → live/traverse}/coverage.js +3 -0
- package/dist/{traverse → live/traverse}/lease.d.ts +1 -0
- package/dist/{traverse → live/traverse}/lease.js +1 -0
- package/dist/{traverse/run.d.ts → live/traverse/traverse.d.ts} +4 -1
- package/dist/{traverse/run.js → live/traverse/traverse.js} +26 -43
- package/dist/manifest/manifest.d.ts +52 -0
- package/dist/manifest/manifest.js +93 -0
- package/dist/manifest/map-imports.d.ts +7 -0
- package/dist/manifest/map-imports.js +22 -0
- package/dist/manifest/maps.d.ts +33 -0
- package/dist/manifest/maps.js +62 -0
- package/dist/manifest/pack.d.ts +21 -0
- package/dist/manifest/pack.js +109 -0
- package/dist/manifest/project.d.ts +60 -0
- package/dist/manifest/project.js +101 -0
- package/dist/{session/block-inject.js → manifest/roots.js} +1 -18
- package/dist/manifest/scan.d.ts +19 -0
- package/dist/manifest/scan.js +57 -0
- package/dist/{blocks-select.d.ts → manifest/select.d.ts} +3 -0
- package/dist/{blocks-select.js → manifest/select.js} +2 -0
- package/dist/manifest/source.d.ts +23 -0
- package/dist/manifest/source.js +86 -0
- package/dist/runner/mode.d.ts +71 -0
- package/dist/runner/mode.js +1 -0
- package/dist/runner/modes/branches.d.ts +5 -0
- package/dist/runner/modes/branches.js +37 -0
- package/dist/runner/modes/demo.d.ts +3 -0
- package/dist/runner/modes/demo.js +13 -0
- package/dist/runner/modes/report.d.ts +2 -0
- package/dist/runner/modes/report.js +54 -0
- package/dist/runner/modes/run.d.ts +2 -0
- package/dist/runner/modes/run.js +3 -0
- package/dist/runner/options.d.ts +31 -0
- package/dist/runner/options.js +42 -0
- package/dist/runner/plan/find.d.ts +18 -0
- package/dist/runner/plan/find.js +65 -0
- package/dist/runner/plan/plan.d.ts +11 -0
- package/dist/runner/plan/plan.js +97 -0
- package/dist/runner/plan/seed-mem.d.ts +12 -0
- package/dist/runner/plan/seed-mem.js +98 -0
- package/dist/runner/plan/spec.d.ts +5 -0
- package/dist/runner/plan/spec.js +17 -0
- package/dist/runner/play-steps.d.ts +2 -0
- package/dist/runner/play-steps.js +59 -0
- package/dist/runner/runner.d.ts +4 -0
- package/dist/runner/runner.js +64 -0
- package/dist/runner/session.d.ts +9 -0
- package/dist/runner/session.js +87 -0
- package/dist/{browser.js → runtime/browser.js} +4 -2
- package/dist/{env-file.js → runtime/env-file.js} +7 -12
- package/dist/{extensions.d.ts → runtime/extensions.d.ts} +2 -5
- package/dist/{extensions.js → runtime/extensions.js} +3 -1
- package/dist/runtime/full-launch.d.ts +1 -0
- package/dist/runtime/full-launch.js +34 -0
- package/dist/runtime/global-flag.d.ts +5 -0
- package/dist/runtime/global-flag.js +18 -0
- package/dist/{playwright-config.d.ts → runtime/playwright-config.d.ts} +1 -1
- package/dist/{playwright.config.js → runtime/playwright.config.js} +3 -2
- package/dist/runtime/run-log.d.ts +2 -0
- package/dist/runtime/run-log.js +17 -0
- package/dist/{video-dir.js → runtime/video-dir.js} +3 -2
- package/dist/{config.d.ts → runtime/waygraph-config.d.ts} +8 -9
- package/dist/{config.js → runtime/waygraph-config.js} +21 -51
- package/dist/{webserver.js → runtime/webserver.js} +5 -30
- package/examples/routed-demo/config/waygraph.config.ts +20 -0
- package/examples/routed-demo/package.json +1 -4
- package/examples/routed-demo/scripts/fixture-server.mjs +1 -1
- package/examples/routed-demo/src/flows/routed-demo-map.flow.ts +2 -4
- package/examples/routed-demo/src/flows/routed-demo.flow.ts +2 -3
- package/examples/routed-demo/src/map/(app_base)/dashboard/_methods/click-widget.block.ts +5 -4
- package/examples/routed-demo/src/map/(app_base)/dashboard/_nav.block.ts +3 -3
- package/examples/routed-demo/src/map/(app_base)/dashboard/_page.block.ts +3 -3
- package/examples/routed-demo/src/map/(external)/docs/_nav.block.ts +3 -3
- package/examples/routed-demo/src/map/(external)/docs/_page.block.ts +3 -3
- package/examples/routed-demo/src/states/routed-demo.states.ts +5 -3
- package/examples/routed-demo/tests/routed-demo.spec.ts +4 -4
- package/examples/routed-demo/tsconfig.json +1 -1
- package/examples/saucedemo/README.md +11 -12
- package/examples/saucedemo/config/waygraph.config.ts +17 -0
- package/examples/saucedemo/docs/CONVENTION.md +5 -7
- package/examples/saucedemo/docs/HELPERS.md +12 -12
- package/examples/saucedemo/package-lock.json +10 -3
- package/examples/saucedemo/package.json +12 -29
- package/examples/saucedemo/src/blocks/SITE-MAP.md +0 -1
- package/examples/saucedemo/src/blocks/saucedemo-web/NAV.md +1 -5
- package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -52
- package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +21 -27
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -9
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +10 -76
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -29
- package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -48
- package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +13 -77
- package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
- package/examples/saucedemo/src/flows/api-demo.flow.ts +26 -18
- package/examples/saucedemo/src/flows/cart-bulk.flow.ts +19 -14
- package/examples/saucedemo/src/flows/cart-continue.flow.ts +10 -8
- package/examples/saucedemo/src/flows/cart-mem.flow.ts +7 -7
- package/examples/saucedemo/src/flows/catalog-logout.flow.ts +13 -8
- package/examples/saucedemo/src/flows/checkout-then-browse-again.flow.ts +26 -48
- package/examples/saucedemo/src/flows/checkout.flow.ts +70 -86
- package/examples/saucedemo/src/flows/device-showcase.flow.ts +24 -25
- package/examples/saucedemo/src/flows/login.flow.ts +11 -18
- package/examples/saucedemo/src/flows/mem-stub-demo.flow.ts +9 -20
- package/examples/saucedemo/src/flows/shop.flow.ts +15 -20
- package/examples/saucedemo/src/flows/smoke.flow.ts +12 -27
- package/examples/saucedemo/src/flows/stub-on-error.flow.ts +24 -43
- package/examples/saucedemo/src/flows/viewer-blocked.flow.ts +26 -34
- package/examples/saucedemo/src/states/checkout.mem-stubs.ts +11 -0
- package/examples/saucedemo/src/states/checkout.states.ts +21 -11
- package/examples/saucedemo/src/stubs/device-showcase.ts +191 -0
- package/examples/saucedemo/src/stubs/login.ts +37 -0
- package/examples/saucedemo/tests/auto-graph.spec.ts +4 -12
- package/examples/saucedemo/tests/chain-flow-episodes.spec.ts +7 -9
- package/examples/saucedemo/tests/submit-login-branch.spec.ts +18 -5
- package/package.json +12 -7
- package/templates/agents/waygraph-planner.agent.md +2 -2
- package/templates/quickstart/README.md +4 -7
- package/templates/quickstart/config/waygraph.config.ts +17 -0
- package/templates/quickstart/docs/CONVENTION.md +5 -6
- package/templates/quickstart/docs/HELPERS.md +11 -9
- package/templates/quickstart/package.json +14 -17
- package/templates/quickstart/src/blocks/SITE-MAP.md +13 -3
- package/templates/quickstart/src/blocks/saucedemo-web/NAV.md +1 -5
- package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -52
- package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +21 -27
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -9
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +10 -76
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -29
- package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -48
- package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +13 -77
- package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
- package/templates/quickstart/src/flows/api-demo.flow.ts +45 -0
- package/templates/quickstart/src/flows/cart-bulk.flow.ts +19 -14
- package/templates/quickstart/src/flows/cart-continue.flow.ts +10 -8
- package/templates/quickstart/src/flows/cart-mem.flow.ts +7 -7
- package/templates/quickstart/src/flows/catalog-logout.flow.ts +13 -8
- package/templates/quickstart/src/flows/checkout-then-browse-again.flow.ts +26 -48
- package/templates/quickstart/src/flows/checkout.flow.ts +70 -63
- package/templates/quickstart/src/flows/device-showcase.flow.ts +24 -25
- package/templates/quickstart/src/flows/login.flow.ts +11 -18
- package/templates/quickstart/src/flows/mem-stub-demo.flow.ts +12 -0
- package/templates/quickstart/src/flows/shop.flow.ts +15 -20
- package/templates/quickstart/src/flows/smoke.flow.ts +12 -27
- package/templates/quickstart/src/flows/stub-on-error.flow.ts +31 -0
- package/templates/quickstart/src/flows/viewer-blocked.flow.ts +26 -34
- package/templates/quickstart/src/states/checkout.mem-stubs.ts +11 -0
- package/templates/quickstart/src/states/checkout.states.ts +21 -11
- package/templates/quickstart/src/stubs/device-showcase.ts +191 -0
- package/templates/quickstart/src/stubs/login.ts +37 -0
- package/templates/quickstart/tests/chain-flow.spec.ts +7 -10
- package/templates/scaffold/README.md +2 -1
- package/templates/scaffold/STRUCTURE.md +5 -4
- package/templates/scaffold/config/waygraph.config.ts +1 -0
- package/templates/scaffold/gitignore +1 -0
- package/templates/scaffold/src/flows/README.md +2 -2
- package/templates/scaffold/src/map/(app_base)/docs/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/docs/_page.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/_methods/add-item.effect.block.ts +4 -4
- package/templates/scaffold/src/map/(app_base)/home/_methods/assert-hello.method.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/_methods/assert-item-added.method.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/_methods/clear-cart.method.block.ts +5 -4
- package/templates/scaffold/src/map/(app_base)/home/_methods/remove-item.effect.block.ts +4 -4
- package/templates/scaffold/src/map/(app_base)/home/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/_page.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/nav-verification-link.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_keys.ts +21 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-body.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-header.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-status.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/pick-extension-interceptor.method.block.ts +5 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-body.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-headers.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/send-request.method.block.ts +5 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-bearer-token.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-headers.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-json-body.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-method.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-query-params.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-url.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/hoppscotch/_page.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/hoppscotch/_states.ts +6 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/settings/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/mailpit/_keys.ts +13 -0
- package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-content.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-received.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/mailpit/_methods/extract-email-link.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/mailpit/_methods/open-message.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/mailpit/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/mailpit/_page.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/mailpit/_states.ts +9 -0
- package/templates/scaffold/src/map/README.md +7 -0
- package/templates/scaffold/src/states/README.md +4 -1
- package/templates/scaffold/src/states/demo.mem-keys.ts +1 -29
- package/templates/scaffold/src/states/demo.states.ts +14 -20
- package/templates/scaffold/tests/hoppscotch.spec.ts +1 -11
- package/templates/scaffold/tests/mail-verify.spec.ts +2 -2
- package/templates/skills/waygraph-blind-pilot.skill.md +2 -6
- package/templates/skills/waygraph-convention.skill.md +23 -14
- package/templates/skills/waygraph-pilot.skill.md +7 -4
- package/dist/auto-session/verbose-log.js +0 -16
- package/dist/auto-session.d.ts +0 -2
- package/dist/auto-session.js +0 -3
- package/dist/cli/discover.d.ts +0 -40
- package/dist/cli/discover.js +0 -148
- package/dist/commands/agent-dive.js +0 -52
- package/dist/commands/check.js +0 -192
- package/dist/commands/map.js +0 -29
- package/dist/commands/run.js +0 -104
- package/dist/commands/traverse.js +0 -177
- package/dist/core/block.d.ts +0 -109
- package/dist/core/blocks/effect.js +0 -23
- package/dist/core/config.js +0 -17
- package/dist/core/engine.d.ts +0 -198
- package/dist/core/flow.d.ts +0 -293
- package/dist/core/flow.js +0 -432
- package/dist/core.d.ts +0 -14
- package/dist/core.js +0 -15
- package/dist/highlights/merge.d.ts +0 -8
- package/dist/highlights/merge.js +0 -173
- package/dist/highlights/stub-ctx.d.ts +0 -10
- package/dist/highlights/stub-ctx.js +0 -331
- package/dist/highlights/types.d.ts +0 -607
- package/dist/highlights.d.ts +0 -9
- package/dist/highlights.js +0 -10
- package/dist/pilot-overlay.d.ts +0 -5
- package/dist/pilot-overlay.js +0 -6
- package/dist/runner/banner-log.js +0 -63
- package/dist/runner/chain-run.js +0 -102
- package/dist/runner/cursor.js +0 -140
- package/dist/runner/demo-log.js +0 -316
- package/dist/runner/device-stage.d.ts +0 -9
- package/dist/runner/device-stage.js +0 -420
- package/dist/runner/discovery.js +0 -105
- package/dist/runner/index.js +0 -2
- package/dist/runner/inpage/banner.d.ts +0 -21
- package/dist/runner/inpage/banner.js +0 -156
- package/dist/runner/inpage/caption.d.ts +0 -3
- package/dist/runner/inpage/caption.js +0 -23
- package/dist/runner/inpage/core.d.ts +0 -4
- package/dist/runner/inpage/core.js +0 -316
- package/dist/runner/inpage/device.d.ts +0 -3
- package/dist/runner/inpage/device.js +0 -211
- package/dist/runner/inpage/network.d.ts +0 -15
- package/dist/runner/inpage/network.js +0 -217
- package/dist/runner/inpage/panel-chrome.js +0 -192
- package/dist/runner/inpage/stamp.js +0 -46
- package/dist/runner/inpage/swipe-zoom.js +0 -220
- package/dist/runner/inpage/todos.js +0 -337
- package/dist/runner/interaction-patch.js +0 -384
- package/dist/runner/main.js +0 -469
- package/dist/runner/network-capture.d.ts +0 -9
- package/dist/runner/network-capture.js +0 -126
- package/dist/runner/overlay-css.d.ts +0 -3
- package/dist/runner/overlay-css.js +0 -377
- package/dist/runner/overlay-install.js +0 -90
- package/dist/runner/overlay-stage.js +0 -110
- package/dist/runner/rings.js +0 -514
- package/dist/runner/seed-mem.js +0 -110
- package/dist/runner/slides.js +0 -278
- package/dist/runner/step-mode.js +0 -703
- package/dist/runner/step-panels.js +0 -729
- package/dist/runner/teardown.js +0 -202
- package/dist/runner/todo-dock.js +0 -142
- package/dist/session/step-overlay.d.ts +0 -37
- package/dist/session/step-overlay.js +0 -244
- package/examples/routed-demo/playwright.config.ts +0 -21
- package/examples/saucedemo/playwright.config.ts +0 -19
- package/examples/saucedemo/scripts/drive-auto-cli.mjs +0 -93
- package/examples/saucedemo/scripts/prove-add-to-cart-menu.mjs +0 -126
- package/examples/saucedemo/scripts/prove-auto-graph.mjs +0 -92
- package/examples/saucedemo/scripts/prove-wrong-login-runtime.mjs +0 -63
- package/examples/saucedemo/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
- package/templates/quickstart/playwright.config.ts +0 -14
- package/templates/quickstart/scripts/drive-auto-cli.mjs +0 -93
- package/templates/quickstart/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
- /package/dist/{commands → cli/commands}/agent-dive-scaffold.d.ts +0 -0
- /package/dist/{commands → cli/commands}/agent-dive.d.ts +0 -0
- /package/dist/{commands → cli/commands}/extensions.d.ts +0 -0
- /package/dist/{commands → cli/commands}/init.d.ts +0 -0
- /package/dist/{commands → cli/commands}/list.d.ts +0 -0
- /package/dist/{commands → cli/commands}/map.d.ts +0 -0
- /package/dist/{commands → cli/commands}/session.d.ts +0 -0
- /package/dist/{commands → cli/commands}/test.d.ts +0 -0
- /package/dist/{commands → cli/commands}/traverse.d.ts +0 -0
- /package/dist/{commands → cli/commands}/try.d.ts +0 -0
- /package/dist/{commands → cli/commands}/upgrade.d.ts +0 -0
- /package/dist/{highlights → demo/narration}/shorthand.js +0 -0
- /package/dist/{pilot-overlay/action-ring.d.ts → demo/overlay/pilot/actions.d.ts} +0 -0
- /package/dist/{ui → demo/overlay/ui}/components/ring.d.ts +0 -0
- /package/dist/{ui → demo/overlay/ui}/stylesheet.d.ts +0 -0
- /package/dist/{ui → demo/overlay/ui}/stylesheet.js +0 -0
- /package/dist/{ui → demo/overlay/ui}/tokens.d.ts +0 -0
- /package/dist/{ui → demo/overlay/ui}/tokens.js +0 -0
- /package/dist/{highlights → demo}/types.js +0 -0
- /package/dist/{auto-session → demo}/verbose-log.d.ts +0 -0
- /package/dist/{selector.d.ts → engine/trait/selector.d.ts} +0 -0
- /package/dist/{selector.js → engine/trait/selector.js} +0 -0
- /package/dist/{trait.js → engine/trait/trait.js} +0 -0
- /package/dist/{session/block-inject.d.ts → manifest/roots.d.ts} +0 -0
- /package/dist/{browser.d.ts → runtime/browser.d.ts} +0 -0
- /package/dist/{env-file.d.ts → runtime/env-file.d.ts} +0 -0
- /package/dist/{playwright-config.js → runtime/playwright-config.js} +0 -0
- /package/dist/{playwright.config.d.ts → runtime/playwright.config.d.ts} +0 -0
- /package/dist/{video-dir.d.ts → runtime/video-dir.d.ts} +0 -0
- /package/dist/{webserver.d.ts → runtime/webserver.d.ts} +0 -0
|
@@ -28,9 +28,10 @@
|
|
|
28
28
|
* hand-picking indices from each status response) that proved this needs no
|
|
29
29
|
* new execution primitive.
|
|
30
30
|
*/
|
|
31
|
-
import { type WaygraphGraph } from "
|
|
32
|
-
import { type BrowserStartInit } from "
|
|
33
|
-
import type { SessionSnapshot } from "../auto-session.js";
|
|
31
|
+
import { type WaygraphGraph } from "../../analysis/graph.js";
|
|
32
|
+
import { type BrowserStartInit } from "../auto-session/start.js";
|
|
33
|
+
import type { SessionSnapshot } from "../auto-session/helpers.js";
|
|
34
|
+
/** What `pilotStart` returns: the session id, socket path and first snapshot. */
|
|
34
35
|
export interface PilotStartResult {
|
|
35
36
|
sessionId: string;
|
|
36
37
|
socketPath: string;
|
|
@@ -28,9 +28,9 @@
|
|
|
28
28
|
* hand-picking indices from each status response) that proved this needs no
|
|
29
29
|
* new execution primitive.
|
|
30
30
|
*/
|
|
31
|
-
import { discoverGraph } from "
|
|
32
|
-
import { requestSession, resolveSessionMeta, } from "
|
|
33
|
-
import { browserStart } from "
|
|
31
|
+
import { discoverGraph } from "../../analysis/graph.js";
|
|
32
|
+
import { requestSession, resolveSessionMeta, } from "../auto-session/ipc.js";
|
|
33
|
+
import { browserStart } from "../auto-session/start.js";
|
|
34
34
|
/**
|
|
35
35
|
* Starts a detached session and reads back its own graph + starting
|
|
36
36
|
* snapshot in one call, so an agent bootstraps with everything it needs
|
|
@@ -39,7 +39,7 @@ import { browserStart } from "./browser.js";
|
|
|
39
39
|
* --detach` and `waygraph graph` itself.
|
|
40
40
|
*/
|
|
41
41
|
export async function pilotStart(init) {
|
|
42
|
-
const { resolveInjectRoots } = await import("
|
|
42
|
+
const { resolveInjectRoots } = await import("../../manifest/roots.js");
|
|
43
43
|
const exploreInject = init.inject ??
|
|
44
44
|
(init.injectTokens?.length ? resolveInjectRoots(init.injectTokens, init.projectDir) : undefined);
|
|
45
45
|
const started = await browserStart({
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/** The edge-coverage report `traverse` writes: which graph edges were walked. */
|
|
1
2
|
export interface TraverseCoverageReport {
|
|
2
3
|
version: 1;
|
|
3
4
|
generatedAt: string;
|
|
@@ -41,6 +42,7 @@ export declare function normalizeHitKey(hitKey: string, graphKeys: ReadonlySet<s
|
|
|
41
42
|
* Returns 0-1 fraction, or null when unset/invalid.
|
|
42
43
|
*/
|
|
43
44
|
export declare function parseMinEdgeCoverage(raw: unknown): number | null;
|
|
45
|
+
/** Builds the `traverse` coverage report from the edges walked and the graph's edges. */
|
|
44
46
|
export declare function buildCoverageReport(opts: {
|
|
45
47
|
projectDir: string;
|
|
46
48
|
parallel: number;
|
|
@@ -51,5 +53,7 @@ export declare function buildCoverageReport(opts: {
|
|
|
51
53
|
}): TraverseCoverageReport;
|
|
52
54
|
/** Greppable one-liner for agents/CI. */
|
|
53
55
|
export declare function formatCoverageLine(report: TraverseCoverageReport): string;
|
|
56
|
+
/** Where `traverse` writes its coverage report by default. */
|
|
54
57
|
export declare function defaultCoverageOutPath(projectDir: string): string;
|
|
58
|
+
/** Writes the `traverse` coverage report to disk. */
|
|
55
59
|
export declare function writeCoverageReport(path: string, report: TraverseCoverageReport): void;
|
|
@@ -68,6 +68,7 @@ export function parseMinEdgeCoverage(raw) {
|
|
|
68
68
|
return n / 100;
|
|
69
69
|
return null;
|
|
70
70
|
}
|
|
71
|
+
/** Builds the `traverse` coverage report from the edges walked and the graph's edges. */
|
|
71
72
|
export function buildCoverageReport(opts) {
|
|
72
73
|
const all = [...new Set(opts.allEdgeKeys)].sort();
|
|
73
74
|
const graphSet = new Set(all);
|
|
@@ -118,9 +119,11 @@ export function formatCoverageLine(report) {
|
|
|
118
119
|
: "";
|
|
119
120
|
return `[Coverage edges=${report.edgesHit}/${report.edgesTotal} ratio=${pct}%${minPart}]`;
|
|
120
121
|
}
|
|
122
|
+
/** Where `traverse` writes its coverage report by default. */
|
|
121
123
|
export function defaultCoverageOutPath(projectDir) {
|
|
122
124
|
return join(projectDir, ".waygraph-traverse", "coverage.json");
|
|
123
125
|
}
|
|
126
|
+
/** Writes the `traverse` coverage report to disk. */
|
|
124
127
|
export function writeCoverageReport(path, report) {
|
|
125
128
|
mkdirSync(dirname(path), { recursive: true });
|
|
126
129
|
writeFileSync(path, JSON.stringify(report, null, 2) + "\n", "utf-8");
|
|
@@ -2,6 +2,7 @@ export interface EdgeLeaseRecord {
|
|
|
2
2
|
workerId: string;
|
|
3
3
|
claimedAt: number;
|
|
4
4
|
}
|
|
5
|
+
/** Hands out graph edges to parallel `traverse` workers so no two workers walk the same edge. */
|
|
5
6
|
export declare class EdgeLeaseCoordinator {
|
|
6
7
|
private readonly held;
|
|
7
8
|
private readonly dir;
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
7
7
|
import { join } from "node:path";
|
|
8
|
+
/** Hands out graph edges to parallel `traverse` workers so no two workers walk the same edge. */
|
|
8
9
|
export class EdgeLeaseCoordinator {
|
|
9
10
|
held = new Map();
|
|
10
11
|
dir;
|
|
@@ -1,10 +1,13 @@
|
|
|
1
|
+
/** How `traverse` workers share a browser: one session, or a clone per worker. */
|
|
1
2
|
export type TraverseSessionMode = "clone" | "inherit";
|
|
3
|
+
/** What one `traverse` worker did: edges walked and failures. */
|
|
2
4
|
export interface TraverseWorkerResult {
|
|
3
5
|
exitCode: number;
|
|
4
6
|
steps: number;
|
|
5
7
|
edgesHit: string[];
|
|
6
8
|
leaf?: string;
|
|
7
9
|
}
|
|
10
|
+
/** Options for `runTraverse`: workers, session mode, step limit, coverage gate. */
|
|
8
11
|
export interface TraverseOptions {
|
|
9
12
|
baseURL?: string;
|
|
10
13
|
startUrl?: string;
|
|
@@ -25,7 +28,7 @@ export interface TraverseOptions {
|
|
|
25
28
|
/** Traverse id for greppable lines (default traverse-1). */
|
|
26
29
|
traverseId?: string;
|
|
27
30
|
/** Phase C: glob / regex / bare `--blocks` file select. */
|
|
28
|
-
blocksSelect?: import("
|
|
31
|
+
blocksSelect?: import("../../manifest/select.js").BlocksSelect;
|
|
29
32
|
/** Phase D: parallel workers (default 1). Cap 4. */
|
|
30
33
|
parallel?: number;
|
|
31
34
|
/** Phase D: clone (default) or inherit. Inherit refused when parallel > 1. */
|
|
@@ -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>;
|