waygraph 0.15.50 → 0.15.52
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/dist/analysis/graph.d.ts +1 -1
- package/dist/analysis/graph.js +10 -15
- package/dist/analysis/map-check.js +5 -2
- package/dist/analysis/practices-check.d.ts +0 -1
- package/dist/analysis/practices-check.js +17 -17
- package/dist/auto-session/session.d.ts +1 -1
- package/dist/auto-session/session.js +14 -8
- package/dist/blocks-select.d.ts +7 -4
- package/dist/blocks-select.js +0 -14
- package/dist/browser.d.ts +27 -0
- package/dist/browser.js +62 -0
- package/dist/cli/run-chain.js +5 -0
- package/dist/cli/usage.js +14 -1
- package/dist/cli.js +10 -1
- package/dist/commands/agent-dive-scaffold.d.ts +5 -0
- package/dist/commands/agent-dive-scaffold.js +7 -0
- package/dist/commands/extensions.d.ts +1 -0
- package/dist/commands/extensions.js +22 -0
- package/dist/commands/init.js +45 -2
- package/dist/commands/test.js +16 -2
- package/dist/commands/try.js +2 -1
- package/dist/commands/upgrade.d.ts +6 -0
- package/dist/commands/upgrade.js +107 -0
- package/dist/config.d.ts +47 -3
- package/dist/config.js +45 -12
- package/dist/core/block.d.ts +12 -0
- package/dist/core/block.js +36 -0
- package/dist/core/blocks/effect.d.ts +0 -3
- package/dist/core/blocks/method.d.ts +0 -6
- package/dist/core/blocks/nav.d.ts +11 -3
- package/dist/core/blocks/nav.js +8 -0
- package/dist/core/blocks/page.d.ts +0 -3
- package/dist/core/config.d.ts +5 -0
- package/dist/core/engine.d.ts +17 -16
- package/dist/core/engine.js +3 -3
- package/dist/core/flow.d.ts +17 -0
- package/dist/core/flow.js +44 -24
- package/dist/core/map-builder.d.ts +3 -3
- package/dist/core/map-builder.js +3 -3
- package/dist/env-file.d.ts +7 -7
- package/dist/env-file.js +29 -16
- package/dist/extensions.d.ts +21 -0
- package/dist/extensions.js +178 -0
- package/dist/highlights/types.d.ts +3 -2
- package/dist/index.d.ts +8 -3
- package/dist/index.js +4 -1
- package/dist/pilot-overlay/overlay-fixtures.d.ts +0 -7
- package/dist/pilot-overlay/overlay-fixtures.js +0 -45
- package/dist/playwright-config.d.ts +4 -0
- package/dist/playwright-config.js +15 -0
- package/dist/playwright.config.d.ts +2 -0
- package/dist/playwright.config.js +6 -0
- package/dist/runner/demo-log.js +1 -7
- package/dist/runner/inpage/banner.js +10 -2
- package/dist/runner/inpage/core.d.ts +1 -1
- package/dist/runner/inpage/core.js +8 -7
- package/dist/runner/main.js +27 -15
- package/dist/runner/rings.js +0 -49
- package/dist/session/auto-explore-run.js +21 -6
- package/dist/session/auto-explore.js +6 -4
- package/dist/session/step-overlay.js +3 -1
- package/dist/traverse/run.js +4 -1
- package/dist/types.d.ts +0 -3
- package/dist/ui/components/ring.js +1 -0
- package/dist/ui/overlay.css +1 -0
- package/dist/ui/shadow.d.ts +1 -3
- package/dist/ui/shadow.js +0 -4
- package/dist/ui/tokens.d.ts +0 -11
- package/dist/ui/tokens.js +0 -5
- package/dist/video-dir.d.ts +8 -0
- package/dist/video-dir.js +60 -0
- package/dist/webserver.d.ts +14 -0
- package/dist/webserver.js +95 -0
- package/examples/routed-demo/package.json +3 -3
- package/examples/routed-demo/playwright.config.ts +8 -8
- package/examples/routed-demo/scripts/fixture-server.mjs +12 -31
- package/examples/routed-demo/src/map/(app_base)/dashboard/_sel.ts +1 -3
- package/examples/routed-demo/src/map/(external)/docs/_sel.ts +1 -3
- package/examples/routed-demo/src/pages/dashboard.html +1 -1
- package/examples/routed-demo/src/pages/docs.html +1 -1
- package/examples/saucedemo/playwright.config.ts +2 -3
- package/examples/saucedemo/scripts/prove-add-to-cart-menu.mjs +2 -1
- package/examples/saucedemo/scripts/prove-auto-graph.mjs +2 -1
- package/examples/saucedemo/scripts/prove-wrong-login-runtime.mjs +2 -1
- package/examples/saucedemo/tests/flow-block-verify.spec.ts +2 -7
- package/package.json +10 -2
- package/templates/quickstart/playwright.config.ts +0 -6
- package/templates/scaffold/README.md +7 -3
- package/templates/scaffold/STRUCTURE.md +8 -6
- package/templates/scaffold/config/waygraph.config.ts +26 -0
- package/templates/scaffold/package.json +9 -13
- package/templates/scaffold/src/flows/README.md +5 -5
- package/templates/scaffold/src/flows/example.flow.ts +31 -17
- package/templates/scaffold/src/flows/hoppscotch-auth.flow.ts +35 -0
- package/templates/scaffold/src/flows/hoppscotch-get.flow.ts +23 -0
- package/templates/scaffold/src/flows/hoppscotch-post.flow.ts +33 -0
- package/templates/scaffold/src/flows/mail-verify.flow.ts +36 -75
- package/templates/scaffold/src/flows/shop.flow.ts +41 -65
- package/templates/scaffold/src/map/(app_base)/docs/_nav.block.ts +0 -9
- package/templates/scaffold/src/map/(app_base)/docs/_page.block.ts +0 -5
- package/templates/scaffold/src/map/(app_base)/docs/_sel.ts +2 -3
- package/templates/scaffold/src/map/(app_base)/docs/{docs.html → index.html} +1 -1
- package/templates/scaffold/src/map/(app_base)/home/_methods/add-item.effect.block.ts +4 -21
- package/templates/scaffold/src/map/(app_base)/home/_methods/assert-hello.method.block.ts +4 -30
- package/templates/scaffold/src/map/(app_base)/home/_methods/assert-item-added.method.block.ts +2 -19
- package/templates/scaffold/src/map/(app_base)/home/_methods/clear-cart.method.block.ts +0 -17
- package/templates/scaffold/src/map/(app_base)/home/_methods/remove-item.effect.block.ts +3 -16
- package/templates/scaffold/src/map/(app_base)/home/_nav.block.ts +3 -14
- package/templates/scaffold/src/map/(app_base)/home/_page.block.ts +0 -9
- package/templates/scaffold/src/map/(app_base)/home/_sel.ts +4 -4
- package/templates/scaffold/src/map/(app_base)/home/nav-verification-link.block.ts +1 -23
- package/templates/scaffold/src/map/(app_base)/index.html +17 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-body.method.block.ts +21 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-header.method.block.ts +19 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-status.method.block.ts +20 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/pick-extension-interceptor.method.block.ts +18 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-body.method.block.ts +21 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-headers.method.block.ts +21 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/send-request.method.block.ts +15 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-bearer-token.method.block.ts +20 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-headers.method.block.ts +23 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-json-body.method.block.ts +36 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-method.method.block.ts +17 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-query-params.method.block.ts +22 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-url.method.block.ts +18 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_nav.block.ts +11 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_page.block.ts +36 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_sel.ts +27 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/settings/_nav.block.ts +10 -0
- package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-content.method.block.ts +2 -27
- package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-received.method.block.ts +2 -21
- package/templates/scaffold/src/map/(external)/mailpit/_methods/extract-email-link.method.block.ts +1 -19
- package/templates/scaffold/src/map/(external)/mailpit/_methods/open-message.method.block.ts +1 -11
- package/templates/scaffold/src/map/(external)/mailpit/_nav.block.ts +1 -9
- package/templates/scaffold/src/map/(external)/mailpit/_page.block.ts +0 -11
- package/templates/scaffold/src/states/demo.mem-keys.ts +20 -19
- package/templates/scaffold/src/states/demo.mem-stubs.ts +4 -0
- package/templates/scaffold/src/states/demo.states.ts +7 -1
- package/templates/scaffold/tests/README.md +3 -2
- package/templates/scaffold/tests/example.spec.ts +2 -3
- package/templates/scaffold/tests/hoppscotch.spec.ts +97 -0
- package/templates/scaffold/tests/mail-verify.spec.ts +2 -11
- package/templates/scaffold/tsconfig.json +1 -1
- package/templates/skills/waygraph-convention.skill.md +37 -6
- package/templates/skills/waygraph-pilot.skill.md +5 -6
- package/dist/runner/overlay-present.d.ts +0 -8
- package/dist/runner/overlay-present.js +0 -57
- package/dist/ui/components/banner.d.ts +0 -2
- package/dist/ui/components/banner.js +0 -10
- package/dist/ui/components/cursor.d.ts +0 -2
- package/dist/ui/components/cursor.js +0 -19
- package/examples/routed-demo/.waygraph-auto/4d4902b7.log +0 -0
- package/examples/routed-demo/.waygraph-auto/51ef462e.log +0 -0
- package/examples/routed-demo/.waygraph-auto/71527ad9.log +0 -0
- package/examples/routed-demo/.waygraph-auto/ca16778e.log +0 -0
- package/examples/routed-demo/scripts/with-fixture.mjs +0 -70
- package/examples/saucedemo/.waygraph-auto/00b0c55c.log +0 -22
- package/examples/saucedemo/.waygraph-auto/00d147d1.log +0 -21
- package/examples/saucedemo/.waygraph-auto/00e5d037.log +0 -5
- package/examples/saucedemo/.waygraph-auto/015be8f6.log +0 -6
- package/examples/saucedemo/.waygraph-auto/026e188e.log +0 -0
- package/examples/saucedemo/.waygraph-auto/02f7dd22.log +0 -20
- package/examples/saucedemo/.waygraph-auto/03df352d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/0402cfcf.log +0 -6
- package/examples/saucedemo/.waygraph-auto/050e5b55.log +0 -0
- package/examples/saucedemo/.waygraph-auto/05d76fc3.log +0 -0
- package/examples/saucedemo/.waygraph-auto/062b581f.log +0 -20
- package/examples/saucedemo/.waygraph-auto/0681582b.log +0 -6
- package/examples/saucedemo/.waygraph-auto/07845ed1.log +0 -0
- package/examples/saucedemo/.waygraph-auto/07f3e964.log +0 -6
- package/examples/saucedemo/.waygraph-auto/0868ae4d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/0924ddaa.log +0 -22
- package/examples/saucedemo/.waygraph-auto/092d6173.log +0 -5
- package/examples/saucedemo/.waygraph-auto/096fea05.log +0 -20
- package/examples/saucedemo/.waygraph-auto/09924510.log +0 -0
- package/examples/saucedemo/.waygraph-auto/0998c941.log +0 -21
- package/examples/saucedemo/.waygraph-auto/0a8c3719.log +0 -0
- package/examples/saucedemo/.waygraph-auto/0bf74300.log +0 -21
- package/examples/saucedemo/.waygraph-auto/0c01fd29.log +0 -4
- package/examples/saucedemo/.waygraph-auto/0c19e232.log +0 -5
- package/examples/saucedemo/.waygraph-auto/0c302590.log +0 -0
- package/examples/saucedemo/.waygraph-auto/0dee62d6.log +0 -5
- package/examples/saucedemo/.waygraph-auto/0eb4c081.log +0 -5
- package/examples/saucedemo/.waygraph-auto/0f0cb120.log +0 -0
- package/examples/saucedemo/.waygraph-auto/102c38ca.log +0 -0
- package/examples/saucedemo/.waygraph-auto/10fd431c.log +0 -0
- package/examples/saucedemo/.waygraph-auto/1122c13c.log +0 -0
- package/examples/saucedemo/.waygraph-auto/123d1cad.log +0 -5
- package/examples/saucedemo/.waygraph-auto/12ed8e28.log +0 -0
- package/examples/saucedemo/.waygraph-auto/13c6fe3c.log +0 -0
- package/examples/saucedemo/.waygraph-auto/1581b677.log +0 -0
- package/examples/saucedemo/.waygraph-auto/161cc8dd.log +0 -22
- package/examples/saucedemo/.waygraph-auto/164761a5.log +0 -6
- package/examples/saucedemo/.waygraph-auto/1905ceb2.log +0 -0
- package/examples/saucedemo/.waygraph-auto/1b1d55c6.log +0 -0
- package/examples/saucedemo/.waygraph-auto/1b80fd24.log +0 -6
- package/examples/saucedemo/.waygraph-auto/1bd7b7bf.log +0 -0
- package/examples/saucedemo/.waygraph-auto/1c30a3c2.log +0 -0
- package/examples/saucedemo/.waygraph-auto/1c58a174.log +0 -0
- package/examples/saucedemo/.waygraph-auto/1cb6f44c.log +0 -5
- package/examples/saucedemo/.waygraph-auto/1d90aa9a.log +0 -0
- package/examples/saucedemo/.waygraph-auto/1de7d889.log +0 -0
- package/examples/saucedemo/.waygraph-auto/1f233a4c.log +0 -6
- package/examples/saucedemo/.waygraph-auto/1fdb2100.log +0 -0
- package/examples/saucedemo/.waygraph-auto/20e66801.log +0 -0
- package/examples/saucedemo/.waygraph-auto/20e91af6.log +0 -5
- package/examples/saucedemo/.waygraph-auto/20ffdb77.log +0 -0
- package/examples/saucedemo/.waygraph-auto/22048fff.log +0 -4
- package/examples/saucedemo/.waygraph-auto/222d1d09.log +0 -0
- package/examples/saucedemo/.waygraph-auto/22f1a704.log +0 -5
- package/examples/saucedemo/.waygraph-auto/2324269a.log +0 -0
- package/examples/saucedemo/.waygraph-auto/232a1d81.log +0 -0
- package/examples/saucedemo/.waygraph-auto/239cced3.log +0 -20
- package/examples/saucedemo/.waygraph-auto/25204b46.log +0 -4
- package/examples/saucedemo/.waygraph-auto/2553d107.log +0 -0
- package/examples/saucedemo/.waygraph-auto/25e2e90f.log +0 -0
- package/examples/saucedemo/.waygraph-auto/2708455e.log +0 -22
- package/examples/saucedemo/.waygraph-auto/272a96fd.log +0 -20
- package/examples/saucedemo/.waygraph-auto/28d7be5d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/2a577961.log +0 -0
- package/examples/saucedemo/.waygraph-auto/2a6a8266.log +0 -6
- package/examples/saucedemo/.waygraph-auto/2b3401cf.log +0 -20
- package/examples/saucedemo/.waygraph-auto/2b831907.log +0 -6
- package/examples/saucedemo/.waygraph-auto/2b9b56fc.log +0 -20
- package/examples/saucedemo/.waygraph-auto/2c79c73a.log +0 -0
- package/examples/saucedemo/.waygraph-auto/2c94a05b.log +0 -0
- package/examples/saucedemo/.waygraph-auto/2ceccd6d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/2e2069e7.log +0 -0
- package/examples/saucedemo/.waygraph-auto/2e6bc35e.log +0 -6
- package/examples/saucedemo/.waygraph-auto/2efd1983.log +0 -0
- package/examples/saucedemo/.waygraph-auto/2f1b0c13.log +0 -6
- package/examples/saucedemo/.waygraph-auto/2f4f531e.log +0 -0
- package/examples/saucedemo/.waygraph-auto/2f8d4073.log +0 -6
- package/examples/saucedemo/.waygraph-auto/2fdbd916.log +0 -0
- package/examples/saucedemo/.waygraph-auto/30739278.log +0 -6
- package/examples/saucedemo/.waygraph-auto/30a5c848.log +0 -20
- package/examples/saucedemo/.waygraph-auto/31cb2e80.log +0 -0
- package/examples/saucedemo/.waygraph-auto/322d63cd.log +0 -0
- package/examples/saucedemo/.waygraph-auto/3239aa8a.log +0 -6
- package/examples/saucedemo/.waygraph-auto/326d87b7.log +0 -6
- package/examples/saucedemo/.waygraph-auto/331c6e8e.log +0 -0
- package/examples/saucedemo/.waygraph-auto/3351c0b6.log +0 -0
- package/examples/saucedemo/.waygraph-auto/33a50dc0.log +0 -0
- package/examples/saucedemo/.waygraph-auto/33df0770.log +0 -0
- package/examples/saucedemo/.waygraph-auto/340d624d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/36367ccf.log +0 -0
- package/examples/saucedemo/.waygraph-auto/372536a5.log +0 -6
- package/examples/saucedemo/.waygraph-auto/37b56184.log +0 -0
- package/examples/saucedemo/.waygraph-auto/38f6799d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/3a208bb8.log +0 -20
- package/examples/saucedemo/.waygraph-auto/3a412f3c.log +0 -0
- package/examples/saucedemo/.waygraph-auto/3a859bd7.log +0 -0
- package/examples/saucedemo/.waygraph-auto/3a8674d5.log +0 -6
- package/examples/saucedemo/.waygraph-auto/3bdb2f5a.log +0 -0
- package/examples/saucedemo/.waygraph-auto/3c1e5fe0.log +0 -22
- package/examples/saucedemo/.waygraph-auto/3cb0add7.log +0 -0
- package/examples/saucedemo/.waygraph-auto/3e3c0f3b.log +0 -0
- package/examples/saucedemo/.waygraph-auto/3e42f0d8.log +0 -0
- package/examples/saucedemo/.waygraph-auto/3f088138.log +0 -0
- package/examples/saucedemo/.waygraph-auto/401177a3.log +0 -0
- package/examples/saucedemo/.waygraph-auto/413d934d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/4144071d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/4176a3c6.log +0 -0
- package/examples/saucedemo/.waygraph-auto/41d0793d.log +0 -4
- package/examples/saucedemo/.waygraph-auto/41e6feae.log +0 -0
- package/examples/saucedemo/.waygraph-auto/424b4d5d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/42e014d1.log +0 -0
- package/examples/saucedemo/.waygraph-auto/43253aba.log +0 -0
- package/examples/saucedemo/.waygraph-auto/432d09e3.log +0 -22
- package/examples/saucedemo/.waygraph-auto/438c6c53.log +0 -22
- package/examples/saucedemo/.waygraph-auto/4477db12.log +0 -0
- package/examples/saucedemo/.waygraph-auto/47247959.log +0 -0
- package/examples/saucedemo/.waygraph-auto/476cff76.log +0 -0
- package/examples/saucedemo/.waygraph-auto/4a1258b7.log +0 -0
- package/examples/saucedemo/.waygraph-auto/4ad09ece.log +0 -0
- package/examples/saucedemo/.waygraph-auto/4adcd179.log +0 -20
- package/examples/saucedemo/.waygraph-auto/4c9d9b16.log +0 -21
- package/examples/saucedemo/.waygraph-auto/4cebc228.log +0 -20
- package/examples/saucedemo/.waygraph-auto/4da39c36.log +0 -6
- package/examples/saucedemo/.waygraph-auto/4dbefa7e.log +0 -5
- package/examples/saucedemo/.waygraph-auto/4efa7035.log +0 -6
- package/examples/saucedemo/.waygraph-auto/505affdc.log +0 -4
- package/examples/saucedemo/.waygraph-auto/51bcb60a.log +0 -0
- package/examples/saucedemo/.waygraph-auto/527b6d76.log +0 -0
- package/examples/saucedemo/.waygraph-auto/5291bc78.log +0 -22
- package/examples/saucedemo/.waygraph-auto/535e8922.log +0 -0
- package/examples/saucedemo/.waygraph-auto/54274c39.log +0 -5
- package/examples/saucedemo/.waygraph-auto/5440ce7e.log +0 -0
- package/examples/saucedemo/.waygraph-auto/5738175f.log +0 -22
- package/examples/saucedemo/.waygraph-auto/573abedd.log +0 -0
- package/examples/saucedemo/.waygraph-auto/57ce5643.log +0 -22
- package/examples/saucedemo/.waygraph-auto/5984426b.log +0 -6
- package/examples/saucedemo/.waygraph-auto/5a682e7c.log +0 -22
- package/examples/saucedemo/.waygraph-auto/5b79320c.log +0 -21
- package/examples/saucedemo/.waygraph-auto/5b838485.log +0 -0
- package/examples/saucedemo/.waygraph-auto/5c55aaac.log +0 -21
- package/examples/saucedemo/.waygraph-auto/5d13bdde.log +0 -0
- package/examples/saucedemo/.waygraph-auto/5d285cd3.log +0 -0
- package/examples/saucedemo/.waygraph-auto/5ed00b16.log +0 -4
- package/examples/saucedemo/.waygraph-auto/60b9c066.log +0 -6
- package/examples/saucedemo/.waygraph-auto/610dd127.log +0 -0
- package/examples/saucedemo/.waygraph-auto/61105500.log +0 -5
- package/examples/saucedemo/.waygraph-auto/61333142.log +0 -5
- package/examples/saucedemo/.waygraph-auto/6134afe8.log +0 -20
- package/examples/saucedemo/.waygraph-auto/61937e83.log +0 -22
- package/examples/saucedemo/.waygraph-auto/625e7f65.log +0 -5
- package/examples/saucedemo/.waygraph-auto/62a0bdc9.log +0 -22
- package/examples/saucedemo/.waygraph-auto/6376fc15.log +0 -0
- package/examples/saucedemo/.waygraph-auto/63b0f4cd.log +0 -0
- package/examples/saucedemo/.waygraph-auto/6599cbca.log +0 -22
- package/examples/saucedemo/.waygraph-auto/6706ead4.log +0 -0
- package/examples/saucedemo/.waygraph-auto/67aaca30.log +0 -0
- package/examples/saucedemo/.waygraph-auto/685714af.log +0 -0
- package/examples/saucedemo/.waygraph-auto/68b10298.log +0 -0
- package/examples/saucedemo/.waygraph-auto/68be5e12.log +0 -0
- package/examples/saucedemo/.waygraph-auto/68df05a6.log +0 -22
- package/examples/saucedemo/.waygraph-auto/68fa0682.log +0 -0
- package/examples/saucedemo/.waygraph-auto/693f67c4.log +0 -20
- package/examples/saucedemo/.waygraph-auto/69ae030a.log +0 -6
- package/examples/saucedemo/.waygraph-auto/69e73f35.log +0 -6
- package/examples/saucedemo/.waygraph-auto/6b2333b0.log +0 -5
- package/examples/saucedemo/.waygraph-auto/6c4c3817.log +0 -0
- package/examples/saucedemo/.waygraph-auto/6c954911.log +0 -0
- package/examples/saucedemo/.waygraph-auto/6d65a439.log +0 -5
- package/examples/saucedemo/.waygraph-auto/6d700055.log +0 -0
- package/examples/saucedemo/.waygraph-auto/6ead848f.log +0 -0
- package/examples/saucedemo/.waygraph-auto/6f05bdc1.log +0 -0
- package/examples/saucedemo/.waygraph-auto/70279fc3.log +0 -0
- package/examples/saucedemo/.waygraph-auto/70c97639.log +0 -0
- package/examples/saucedemo/.waygraph-auto/72675b2d.log +0 -6
- package/examples/saucedemo/.waygraph-auto/731a14bd.log +0 -0
- package/examples/saucedemo/.waygraph-auto/733dd260.log +0 -5
- package/examples/saucedemo/.waygraph-auto/73a41843.log +0 -0
- package/examples/saucedemo/.waygraph-auto/75016486.log +0 -0
- package/examples/saucedemo/.waygraph-auto/752b01c6.log +0 -22
- package/examples/saucedemo/.waygraph-auto/75675227.log +0 -6
- package/examples/saucedemo/.waygraph-auto/756fd326.log +0 -20
- package/examples/saucedemo/.waygraph-auto/75e2e658.log +0 -0
- package/examples/saucedemo/.waygraph-auto/76128a2d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/76ac1a86.log +0 -0
- package/examples/saucedemo/.waygraph-auto/77605295.log +0 -0
- package/examples/saucedemo/.waygraph-auto/7773a809.log +0 -0
- package/examples/saucedemo/.waygraph-auto/78043767.log +0 -20
- package/examples/saucedemo/.waygraph-auto/792671f4.log +0 -22
- package/examples/saucedemo/.waygraph-auto/796ab578.log +0 -0
- package/examples/saucedemo/.waygraph-auto/79915adb.log +0 -20
- package/examples/saucedemo/.waygraph-auto/7a398774.log +0 -6
- package/examples/saucedemo/.waygraph-auto/7a72f66e.log +0 -6
- package/examples/saucedemo/.waygraph-auto/7a984334.log +0 -4
- package/examples/saucedemo/.waygraph-auto/7b226350.log +0 -5
- package/examples/saucedemo/.waygraph-auto/7c6ee793.log +0 -20
- package/examples/saucedemo/.waygraph-auto/7c726dc4.log +0 -22
- package/examples/saucedemo/.waygraph-auto/7c72e8a5.log +0 -4
- package/examples/saucedemo/.waygraph-auto/7c99674f.log +0 -0
- package/examples/saucedemo/.waygraph-auto/7dbee625.log +0 -22
- package/examples/saucedemo/.waygraph-auto/7df66956.log +0 -0
- package/examples/saucedemo/.waygraph-auto/7e053160.log +0 -0
- package/examples/saucedemo/.waygraph-auto/7e8a6b62.log +0 -0
- package/examples/saucedemo/.waygraph-auto/7effd5b2.log +0 -20
- package/examples/saucedemo/.waygraph-auto/7f1b4864.log +0 -0
- package/examples/saucedemo/.waygraph-auto/7f94fd02.log +0 -0
- package/examples/saucedemo/.waygraph-auto/7fcb512f.log +0 -22
- package/examples/saucedemo/.waygraph-auto/7fdd47ee.log +0 -2
- package/examples/saucedemo/.waygraph-auto/802a0b5b.log +0 -0
- package/examples/saucedemo/.waygraph-auto/80322e0b.log +0 -0
- package/examples/saucedemo/.waygraph-auto/80a4978e.log +0 -6
- package/examples/saucedemo/.waygraph-auto/81257bf0.log +0 -0
- package/examples/saucedemo/.waygraph-auto/81cfe480.log +0 -22
- package/examples/saucedemo/.waygraph-auto/832f5add.log +0 -0
- package/examples/saucedemo/.waygraph-auto/8337b6ad.log +0 -0
- package/examples/saucedemo/.waygraph-auto/8481aa1c.log +0 -0
- package/examples/saucedemo/.waygraph-auto/8493928e.log +0 -0
- package/examples/saucedemo/.waygraph-auto/849ed45d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/84dc6480.log +0 -6
- package/examples/saucedemo/.waygraph-auto/853bde43.log +0 -0
- package/examples/saucedemo/.waygraph-auto/8598b4c0.log +0 -0
- package/examples/saucedemo/.waygraph-auto/859a261d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/86350ea6.log +0 -22
- package/examples/saucedemo/.waygraph-auto/86bb598a.log +0 -0
- package/examples/saucedemo/.waygraph-auto/86d09876.log +0 -22
- package/examples/saucedemo/.waygraph-auto/878ad01b.log +0 -4
- package/examples/saucedemo/.waygraph-auto/87c88ba5.log +0 -0
- package/examples/saucedemo/.waygraph-auto/87cb80ff.log +0 -0
- package/examples/saucedemo/.waygraph-auto/880b2e78.log +0 -6
- package/examples/saucedemo/.waygraph-auto/88527936.log +0 -5
- package/examples/saucedemo/.waygraph-auto/88eda676.log +0 -0
- package/examples/saucedemo/.waygraph-auto/893023ea.log +0 -5
- package/examples/saucedemo/.waygraph-auto/89416718.log +0 -0
- package/examples/saucedemo/.waygraph-auto/8996a857.log +0 -6
- package/examples/saucedemo/.waygraph-auto/8a08b68d.log +0 -6
- package/examples/saucedemo/.waygraph-auto/8a64ba0f.log +0 -6
- package/examples/saucedemo/.waygraph-auto/8b1cc2aa.log +0 -6
- package/examples/saucedemo/.waygraph-auto/8b73d13e.log +0 -6
- package/examples/saucedemo/.waygraph-auto/8be93021.log +0 -0
- package/examples/saucedemo/.waygraph-auto/8d960d31.log +0 -1
- package/examples/saucedemo/.waygraph-auto/8d9e5cd2.log +0 -21
- package/examples/saucedemo/.waygraph-auto/8e12e34f.log +0 -22
- package/examples/saucedemo/.waygraph-auto/8ec7d260.log +0 -0
- package/examples/saucedemo/.waygraph-auto/8ed43279.log +0 -0
- package/examples/saucedemo/.waygraph-auto/93acae32.log +0 -5
- package/examples/saucedemo/.waygraph-auto/94221b2b.log +0 -0
- package/examples/saucedemo/.waygraph-auto/96321a08.log +0 -0
- package/examples/saucedemo/.waygraph-auto/9742b6c2.log +0 -6
- package/examples/saucedemo/.waygraph-auto/9761c4c4.log +0 -6
- package/examples/saucedemo/.waygraph-auto/976394cd.log +0 -20
- package/examples/saucedemo/.waygraph-auto/982138cf.log +0 -0
- package/examples/saucedemo/.waygraph-auto/99cc93eb.log +0 -6
- package/examples/saucedemo/.waygraph-auto/9a26134c.log +0 -20
- package/examples/saucedemo/.waygraph-auto/9cbfbedc.log +0 -0
- package/examples/saucedemo/.waygraph-auto/9d827954.log +0 -20
- package/examples/saucedemo/.waygraph-auto/9dc147d2.log +0 -22
- package/examples/saucedemo/.waygraph-auto/9dd78c5e.log +0 -0
- package/examples/saucedemo/.waygraph-auto/a1ab5d29.log +0 -0
- package/examples/saucedemo/.waygraph-auto/a215a395.log +0 -22
- package/examples/saucedemo/.waygraph-auto/a23b7086.log +0 -4
- package/examples/saucedemo/.waygraph-auto/a35bd5ec.log +0 -0
- package/examples/saucedemo/.waygraph-auto/a4b36275.log +0 -0
- package/examples/saucedemo/.waygraph-auto/a4f8d355.log +0 -20
- package/examples/saucedemo/.waygraph-auto/a68995e9.log +0 -22
- package/examples/saucedemo/.waygraph-auto/a6e4f936.log +0 -22
- package/examples/saucedemo/.waygraph-auto/a7da862b.log +0 -0
- package/examples/saucedemo/.waygraph-auto/a82e2a48.log +0 -0
- package/examples/saucedemo/.waygraph-auto/a8645294.log +0 -0
- package/examples/saucedemo/.waygraph-auto/a94738b7.log +0 -0
- package/examples/saucedemo/.waygraph-auto/a952eb91.log +0 -0
- package/examples/saucedemo/.waygraph-auto/a9559653.log +0 -5
- package/examples/saucedemo/.waygraph-auto/aa1beafb.log +0 -0
- package/examples/saucedemo/.waygraph-auto/aa226dd0.log +0 -22
- package/examples/saucedemo/.waygraph-auto/aa478de2.log +0 -0
- package/examples/saucedemo/.waygraph-auto/aa7323f8.log +0 -20
- package/examples/saucedemo/.waygraph-auto/aaae4fb0.log +0 -20
- package/examples/saucedemo/.waygraph-auto/ac350fc7.log +0 -20
- package/examples/saucedemo/.waygraph-auto/ac5dde3d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/acc1b63a.log +0 -0
- package/examples/saucedemo/.waygraph-auto/ad0bfad9.log +0 -5
- package/examples/saucedemo/.waygraph-auto/ad12d191.log +0 -0
- package/examples/saucedemo/.waygraph-auto/ae3a9b06.log +0 -0
- package/examples/saucedemo/.waygraph-auto/af2fae12.log +0 -0
- package/examples/saucedemo/.waygraph-auto/b04638f4.log +0 -6
- package/examples/saucedemo/.waygraph-auto/b0752c49.log +0 -0
- package/examples/saucedemo/.waygraph-auto/b14811d7.log +0 -6
- package/examples/saucedemo/.waygraph-auto/b2d2dbb2.log +0 -22
- package/examples/saucedemo/.waygraph-auto/b3d172f3.log +0 -0
- package/examples/saucedemo/.waygraph-auto/b48863e5.log +0 -22
- package/examples/saucedemo/.waygraph-auto/b5569336.log +0 -0
- package/examples/saucedemo/.waygraph-auto/b56968e1.log +0 -6
- package/examples/saucedemo/.waygraph-auto/b57921c5.log +0 -0
- package/examples/saucedemo/.waygraph-auto/b64e0620.log +0 -20
- package/examples/saucedemo/.waygraph-auto/b75168f7.log +0 -1
- package/examples/saucedemo/.waygraph-auto/b86a6218.log +0 -6
- package/examples/saucedemo/.waygraph-auto/b8e9e956.log +0 -22
- package/examples/saucedemo/.waygraph-auto/b9ab0983.log +0 -0
- package/examples/saucedemo/.waygraph-auto/b9b310ff.log +0 -21
- package/examples/saucedemo/.waygraph-auto/bb0e0e46.log +0 -0
- package/examples/saucedemo/.waygraph-auto/bc111745.log +0 -22
- package/examples/saucedemo/.waygraph-auto/bf7a77a2.log +0 -0
- package/examples/saucedemo/.waygraph-auto/bf85a598.log +0 -0
- package/examples/saucedemo/.waygraph-auto/bf8693e7.log +0 -0
- package/examples/saucedemo/.waygraph-auto/c0d6f353.log +0 -21
- package/examples/saucedemo/.waygraph-auto/c0febcf2.log +0 -20
- package/examples/saucedemo/.waygraph-auto/c4c52998.log +0 -6
- package/examples/saucedemo/.waygraph-auto/c52bac6d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/c60cc55e.log +0 -0
- package/examples/saucedemo/.waygraph-auto/c809ceb4.log +0 -22
- package/examples/saucedemo/.waygraph-auto/c851cc53.log +0 -6
- package/examples/saucedemo/.waygraph-auto/c8987b67.log +0 -0
- package/examples/saucedemo/.waygraph-auto/c9d76e32.log +0 -0
- package/examples/saucedemo/.waygraph-auto/ca6de7e7.log +0 -0
- package/examples/saucedemo/.waygraph-auto/ca8561bc.log +0 -0
- package/examples/saucedemo/.waygraph-auto/cae91469.log +0 -0
- package/examples/saucedemo/.waygraph-auto/cb05d223.log +0 -0
- package/examples/saucedemo/.waygraph-auto/cb86d45b.log +0 -0
- package/examples/saucedemo/.waygraph-auto/cb9a1978.log +0 -6
- package/examples/saucedemo/.waygraph-auto/cbbc689c.log +0 -6
- package/examples/saucedemo/.waygraph-auto/cc989184.log +0 -20
- package/examples/saucedemo/.waygraph-auto/cd88364b.log +0 -0
- package/examples/saucedemo/.waygraph-auto/cd919e1d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/ce584949.log +0 -5
- package/examples/saucedemo/.waygraph-auto/cf34b895.log +0 -2
- package/examples/saucedemo/.waygraph-auto/cfff9eef.log +0 -20
- package/examples/saucedemo/.waygraph-auto/d0f59b21.log +0 -4
- package/examples/saucedemo/.waygraph-auto/d1195079.log +0 -20
- package/examples/saucedemo/.waygraph-auto/d2ef067a.log +0 -5
- package/examples/saucedemo/.waygraph-auto/d37719a6.log +0 -0
- package/examples/saucedemo/.waygraph-auto/d425471f.log +0 -6
- package/examples/saucedemo/.waygraph-auto/d4afe93f.log +0 -5
- package/examples/saucedemo/.waygraph-auto/d50e58f0.log +0 -0
- package/examples/saucedemo/.waygraph-auto/d5293921.log +0 -0
- package/examples/saucedemo/.waygraph-auto/d62a22c2.log +0 -21
- package/examples/saucedemo/.waygraph-auto/d6d1761f.log +0 -22
- package/examples/saucedemo/.waygraph-auto/d6d5f411.log +0 -22
- package/examples/saucedemo/.waygraph-auto/d6df2771.log +0 -6
- package/examples/saucedemo/.waygraph-auto/d7075012.log +0 -21
- package/examples/saucedemo/.waygraph-auto/d846cd78.log +0 -0
- package/examples/saucedemo/.waygraph-auto/d934da78.log +0 -0
- package/examples/saucedemo/.waygraph-auto/d9ddc297.log +0 -0
- package/examples/saucedemo/.waygraph-auto/da0a06bf.log +0 -0
- package/examples/saucedemo/.waygraph-auto/da6ebb31.log +0 -0
- package/examples/saucedemo/.waygraph-auto/db4ac845.log +0 -0
- package/examples/saucedemo/.waygraph-auto/db6d7774.log +0 -0
- package/examples/saucedemo/.waygraph-auto/db81ba7d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/db839827.log +0 -5
- package/examples/saucedemo/.waygraph-auto/dc58eb72.log +0 -0
- package/examples/saucedemo/.waygraph-auto/dddd057c.log +0 -20
- package/examples/saucedemo/.waygraph-auto/dde5e859.log +0 -22
- package/examples/saucedemo/.waygraph-auto/ddf975e6.log +0 -0
- package/examples/saucedemo/.waygraph-auto/de8cac58.log +0 -0
- package/examples/saucedemo/.waygraph-auto/de8cb83d.log +0 -6
- package/examples/saucedemo/.waygraph-auto/ded5511a.log +0 -6
- package/examples/saucedemo/.waygraph-auto/dedfcb18.log +0 -0
- package/examples/saucedemo/.waygraph-auto/def4d9b1.log +0 -0
- package/examples/saucedemo/.waygraph-auto/e03cfd8e.log +0 -0
- package/examples/saucedemo/.waygraph-auto/e1549e40.log +0 -0
- package/examples/saucedemo/.waygraph-auto/e1b0676d.log +0 -21
- package/examples/saucedemo/.waygraph-auto/e230f24e.log +0 -0
- package/examples/saucedemo/.waygraph-auto/e5111463.log +0 -0
- package/examples/saucedemo/.waygraph-auto/e5127c03.log +0 -22
- package/examples/saucedemo/.waygraph-auto/e5fc1d7c.log +0 -5
- package/examples/saucedemo/.waygraph-auto/e6fd2202.log +0 -0
- package/examples/saucedemo/.waygraph-auto/eb38d92e.log +0 -22
- package/examples/saucedemo/.waygraph-auto/edaa806d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/edaf33de.log +0 -0
- package/examples/saucedemo/.waygraph-auto/edd40cbb.log +0 -20
- package/examples/saucedemo/.waygraph-auto/eddfbffc.log +0 -6
- package/examples/saucedemo/.waygraph-auto/ee86203e.log +0 -0
- package/examples/saucedemo/.waygraph-auto/ee9fa1ad.log +0 -5
- package/examples/saucedemo/.waygraph-auto/ef319474.log +0 -22
- package/examples/saucedemo/.waygraph-auto/f1f38eeb.log +0 -22
- package/examples/saucedemo/.waygraph-auto/f24b2915.log +0 -0
- package/examples/saucedemo/.waygraph-auto/f28eee8d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/f2943898.log +0 -0
- package/examples/saucedemo/.waygraph-auto/f33bde90.log +0 -0
- package/examples/saucedemo/.waygraph-auto/f43de83c.log +0 -0
- package/examples/saucedemo/.waygraph-auto/f6ba7cb4.log +0 -6
- package/examples/saucedemo/.waygraph-auto/f7ac4d62.log +0 -20
- package/examples/saucedemo/.waygraph-auto/f86224c6.log +0 -0
- package/examples/saucedemo/.waygraph-auto/f929bb79.log +0 -0
- package/examples/saucedemo/.waygraph-auto/f92d4c6c.log +0 -22
- package/examples/saucedemo/.waygraph-auto/f92faf40.log +0 -5
- package/examples/saucedemo/.waygraph-auto/fa784369.log +0 -21
- package/examples/saucedemo/.waygraph-auto/fb55f723.log +0 -20
- package/examples/saucedemo/.waygraph-auto/fba3b738.log +0 -0
- package/examples/saucedemo/.waygraph-auto/fc917c18.log +0 -0
- package/examples/saucedemo/.waygraph-auto/fdf66b74.log +0 -0
- package/examples/saucedemo/.waygraph-auto/fe83305d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/ff616932.log +0 -0
- package/examples/saucedemo/.waygraph-auto/ffdf2854.log +0 -6
- package/examples/saucedemo/scripts/capture-auto-headful.mjs +0 -120
- package/examples/saucedemo/scripts/capture-wrong-login.mjs +0 -141
- package/examples/saucedemo/scripts/demo-device-presets.mjs +0 -188
- package/examples/saucedemo/scripts/demo-orientation-gestures-video.mjs +0 -262
- package/examples/saucedemo/scripts/show-add-to-cart-menu.mjs +0 -123
- package/examples/saucedemo/scripts/show-auto-menu.mjs +0 -72
- package/templates/scaffold/playwright.config.ts +0 -28
- package/templates/scaffold/scripts/README.md +0 -13
- package/templates/scaffold/scripts/fixture-server.mjs +0 -50
- package/templates/scaffold/scripts/with-fixture.mjs +0 -69
- package/templates/scaffold/test-results/.last-run.json +0 -4
- /package/templates/scaffold/src/map/(app_base)/home/{home.html → index.html} +0 -0
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { basename, join, relative, resolve, dirname } from "node:path";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
4
|
+
import { spawnSync } from "node:child_process";
|
|
5
|
+
import { packageRoot } from "../cli/util.js";
|
|
6
|
+
import { agentSkillFiles } from "./agent-dive-scaffold.js";
|
|
7
|
+
// Filled in per project at init, so they never compare equal to the template.
|
|
8
|
+
const SKIP = new Set(["package.json", join("config", "waygraph.config.ts")]);
|
|
9
|
+
function walk(dir, base = dir) {
|
|
10
|
+
return readdirSync(dir).flatMap((name) => {
|
|
11
|
+
const full = join(dir, name);
|
|
12
|
+
return statSync(full).isDirectory() ? walk(full, base) : [relative(base, full)];
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
const targetName = (rel) => (rel === "gitignore" ? ".gitignore" : rel);
|
|
16
|
+
const major = (v) => v.replace(/^[^\d]*/, "").split(".").map((n) => parseInt(n, 10) || 0);
|
|
17
|
+
const isOlder = (a, b) => {
|
|
18
|
+
for (let i = 0; i < 3; i++)
|
|
19
|
+
if ((a[i] ?? 0) !== (b[i] ?? 0))
|
|
20
|
+
return (a[i] ?? 0) < (b[i] ?? 0);
|
|
21
|
+
return false;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* `waygraph upgrade [project] [paths...] [--apply] [--overwrite] [--diff]`
|
|
25
|
+
* Compares the project with the scaffold shipped in this waygraph. Dry run by default.
|
|
26
|
+
* Only the paths you name are copied, because a real project deliberately drops parts of the demo.
|
|
27
|
+
*/
|
|
28
|
+
export async function upgradeCase(args) {
|
|
29
|
+
const flags = new Set(args.filter((a) => a.startsWith("--")));
|
|
30
|
+
const positional = args.slice(1).filter((a) => !a.startsWith("--"));
|
|
31
|
+
const first = positional[0];
|
|
32
|
+
const hasProject = first !== undefined && existsSync(join(resolve(first), "package.json"));
|
|
33
|
+
const proj = resolve(hasProject ? first : process.cwd());
|
|
34
|
+
const paths = hasProject ? positional.slice(1) : positional;
|
|
35
|
+
const templateDir = join(packageRoot(), "templates", "scaffold");
|
|
36
|
+
const ownVersion = JSON.parse(readFileSync(join(packageRoot(), "package.json"), "utf-8")).version;
|
|
37
|
+
const pkgPath = join(proj, "package.json");
|
|
38
|
+
if (!existsSync(pkgPath)) {
|
|
39
|
+
console.error(`waygraph upgrade: no package.json in ${proj}`);
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
const added = [];
|
|
43
|
+
const differing = [];
|
|
44
|
+
// Every shipped file as [path in the project, content]: the scaffold tree plus the agent skills.
|
|
45
|
+
const shipped = new Map();
|
|
46
|
+
for (const rel of walk(templateDir))
|
|
47
|
+
if (!SKIP.has(rel))
|
|
48
|
+
shipped.set(rel, readFileSync(join(templateDir, rel)));
|
|
49
|
+
for (const { rel, text } of agentSkillFiles())
|
|
50
|
+
shipped.set(rel, Buffer.from(text));
|
|
51
|
+
for (const [rel, content] of shipped) {
|
|
52
|
+
const dest = join(proj, targetName(rel));
|
|
53
|
+
if (!existsSync(dest))
|
|
54
|
+
added.push(rel);
|
|
55
|
+
else if (!readFileSync(dest).equals(content))
|
|
56
|
+
differing.push(rel);
|
|
57
|
+
}
|
|
58
|
+
const selected = (rel) => paths.some((p) => rel === p || rel.startsWith(p.replace(/\/?$/, "/")));
|
|
59
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
60
|
+
const current = pkg.dependencies?.waygraph;
|
|
61
|
+
const depStale = current !== undefined && !current.startsWith("file:") && isOlder(major(current), major(ownVersion));
|
|
62
|
+
console.log(`waygraph upgrade: ${proj} (waygraph ${current ?? "not a dependency"} -> ${ownVersion})`);
|
|
63
|
+
if (depStale)
|
|
64
|
+
console.log(` dependency waygraph ${current} -> ^${ownVersion}`);
|
|
65
|
+
for (const rel of added)
|
|
66
|
+
console.log(` new ${rel}`);
|
|
67
|
+
for (const rel of differing)
|
|
68
|
+
console.log(` differs ${rel}`);
|
|
69
|
+
if (!depStale && added.length === 0 && differing.length === 0)
|
|
70
|
+
console.log(" up to date");
|
|
71
|
+
const legacy = ["ts", "mts", "js", "mjs", "cjs"].find((e) => existsSync(join(proj, `playwright.config.${e}`)));
|
|
72
|
+
if (legacy) {
|
|
73
|
+
console.log(` deprecated playwright.config.${legacy} - move its settings into config/waygraph.config.ts (testDir, webServer, playwright: { ... })`);
|
|
74
|
+
}
|
|
75
|
+
if (flags.has("--diff")) {
|
|
76
|
+
for (const rel of differing.filter((r) => paths.length === 0 || selected(r))) {
|
|
77
|
+
const shippedCopy = join(tmpdir(), `waygraph-upgrade-${process.pid}-${basename(rel)}`);
|
|
78
|
+
writeFileSync(shippedCopy, shipped.get(rel));
|
|
79
|
+
spawnSync("diff", ["-u", join(proj, targetName(rel)), shippedCopy], { stdio: "inherit" });
|
|
80
|
+
rmSync(shippedCopy, { force: true });
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (!flags.has("--apply")) {
|
|
84
|
+
if (added.length + differing.length > 0) {
|
|
85
|
+
console.log("\nDry run. Copy files with: waygraph upgrade <paths...> --apply (add --overwrite to replace differing files)");
|
|
86
|
+
}
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
if (depStale) {
|
|
90
|
+
pkg.dependencies.waygraph = `^${ownVersion}`;
|
|
91
|
+
writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + "\n");
|
|
92
|
+
console.log("updated package.json - run npm install");
|
|
93
|
+
}
|
|
94
|
+
if (paths.length === 0 && added.length + differing.length > 0) {
|
|
95
|
+
console.log("no paths given, so no files were copied (e.g. waygraph upgrade \"src/map/(external)/hoppscotch\" --apply)");
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const copy = [...added, ...(flags.has("--overwrite") ? differing : [])].filter(selected);
|
|
99
|
+
for (const rel of copy) {
|
|
100
|
+
const dest = join(proj, targetName(rel));
|
|
101
|
+
mkdirSync(dirname(dest), { recursive: true });
|
|
102
|
+
writeFileSync(dest, shipped.get(rel));
|
|
103
|
+
console.log(` wrote ${rel}`);
|
|
104
|
+
}
|
|
105
|
+
if (copy.length === 0 && paths.length > 0)
|
|
106
|
+
console.log("nothing matched those paths");
|
|
107
|
+
}
|
package/dist/config.d.ts
CHANGED
|
@@ -1,10 +1,47 @@
|
|
|
1
|
+
import type { PlaywrightTestConfig } from "@playwright/test";
|
|
2
|
+
import type { ExtensionSpec } from "./extensions.js";
|
|
3
|
+
import type { WebServerConfig } from "./webserver.js";
|
|
1
4
|
export interface WaygraphConfig {
|
|
2
5
|
/** Same value `resolveBaseUrl` would otherwise read from package.json's `waygraph.baseUrl`. */
|
|
3
6
|
baseUrl?: string;
|
|
7
|
+
/** Chromium extensions to load in every run: `"hoppscotch"`, a Chrome Web Store id, or `{ path }` to an unpacked one. */
|
|
8
|
+
extensions?: ExtensionSpec[];
|
|
9
|
+
/** Recording with `--video` (`waygraph run` / `demo`). */
|
|
10
|
+
video?: {
|
|
11
|
+
/** Where recordings are saved: absolute, `~/…`, or relative to the project. Default `~/Downloads/waygraph-videos/<project>` (the project's `.waygraph-videos/` where there is no Downloads folder, and on CI). */
|
|
12
|
+
dir?: string;
|
|
13
|
+
/** Recording size, e.g. `"1920x1080"` (demo default) or `"1280x720"` (run default). */
|
|
14
|
+
viewport?: string;
|
|
15
|
+
};
|
|
16
|
+
/** Milliseconds to pause before each browser action in `run` / `demo`, to make it watchable. */
|
|
17
|
+
slowMo?: number;
|
|
18
|
+
/** Show the browser window. Default: `demo` and `auto` are headed, `run` is headless. */
|
|
19
|
+
headed?: boolean;
|
|
20
|
+
/** `waygraph demo` defaults. */
|
|
21
|
+
demo?: {
|
|
22
|
+
/** Advance steps automatically instead of waiting for Next. */
|
|
23
|
+
autoNext?: boolean;
|
|
24
|
+
/** Blitz through fast-forward steps. */
|
|
25
|
+
fast?: boolean;
|
|
26
|
+
};
|
|
27
|
+
/** Folder of test files, relative to the project. Default `"tests"`. */
|
|
28
|
+
testDir?: string;
|
|
29
|
+
/** App to start around `waygraph test`, `run`, `demo` and `auto` (same fields as Playwright's `webServer`). */
|
|
30
|
+
webServer?: WebServerConfig | WebServerConfig[];
|
|
31
|
+
/** Anything else for the test runner, e.g. `workers`, `timeout`, `reporter`, `use: { video: "on" }`. Merged over waygraph's defaults. */
|
|
32
|
+
playwright?: PlaywrightTestConfig;
|
|
4
33
|
}
|
|
5
|
-
/**
|
|
6
|
-
|
|
7
|
-
|
|
34
|
+
/** What a config function receives: the env mode and the environment with `.env` files already loaded. */
|
|
35
|
+
export interface ConfigContext {
|
|
36
|
+
mode: string;
|
|
37
|
+
env: Record<string, string | undefined>;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Typed identity helper, like `defineConfig` in `vite.config.ts`. Pass an object, or a function when values come
|
|
41
|
+
* from `.env` files (`.env`, `.env.local`, `.env.<mode>`; pick the mode with `--env <mode>`):
|
|
42
|
+
* @example export default defineConfig(({ env }) => ({ baseUrl: env.BASE_URL }))
|
|
43
|
+
*/
|
|
44
|
+
export declare function defineConfig(config: WaygraphConfig | ((context: ConfigContext) => WaygraphConfig)): WaygraphConfig;
|
|
8
45
|
/**
|
|
9
46
|
* Looks for the first `waygraph.config.*` in `projectDir` and imports it - `.ts` works
|
|
10
47
|
* unmodified because `bin/waygraph` already registers `tsx/esm` before `dist/cli.js` ever runs
|
|
@@ -32,3 +69,10 @@ export declare function loadWaygraphConfig(projectDir: string): Promise<Waygraph
|
|
|
32
69
|
* as a side effect, which resolving a URL string has no business doing).
|
|
33
70
|
*/
|
|
34
71
|
export declare function resolveBaseUrl(projectDir: string): Promise<string | undefined>;
|
|
72
|
+
/** Unpacked extension directories for a run: `WAYGRAPH_EXTENSIONS` if set, else the config file's `extensions` (fetched on first use). */
|
|
73
|
+
export declare function configuredExtensions(projectDir: string): Promise<string[]>;
|
|
74
|
+
/**
|
|
75
|
+
* Applies the config's run settings as the `WAYGRAPH_*` variables the runner reads. A flag, a shell variable or a `.env`
|
|
76
|
+
* value that is already set always wins, so the config only supplies defaults.
|
|
77
|
+
*/
|
|
78
|
+
export declare function applyConfigEnv(config: WaygraphConfig | undefined): void;
|
package/dist/config.js
CHANGED
|
@@ -5,19 +5,23 @@
|
|
|
5
5
|
import { existsSync, readFileSync } from "node:fs";
|
|
6
6
|
import { join } from "node:path";
|
|
7
7
|
import { pathToFileURL } from "node:url";
|
|
8
|
-
import {
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
import { extensionPathsFromEnv } from "./browser.js";
|
|
9
|
+
import { envMode, loadEnvFiles } from "./env-file.js";
|
|
10
|
+
import { resolveExtensions } from "./extensions.js";
|
|
11
|
+
/**
|
|
12
|
+
* Typed identity helper, like `defineConfig` in `vite.config.ts`. Pass an object, or a function when values come
|
|
13
|
+
* from `.env` files (`.env`, `.env.local`, `.env.<mode>`; pick the mode with `--env <mode>`):
|
|
14
|
+
* @example export default defineConfig(({ env }) => ({ baseUrl: env.BASE_URL }))
|
|
15
|
+
*/
|
|
11
16
|
export function defineConfig(config) {
|
|
12
|
-
|
|
17
|
+
if (typeof config !== "function")
|
|
18
|
+
return config;
|
|
19
|
+
loadEnvFiles(process.cwd());
|
|
20
|
+
return config({ mode: envMode(), env: process.env });
|
|
13
21
|
}
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
"waygraph.config.mjs",
|
|
18
|
-
"waygraph.config.js",
|
|
19
|
-
"waygraph.config.cjs",
|
|
20
|
-
];
|
|
22
|
+
const CONFIG_NAMES = ["waygraph.config.ts", "waygraph.config.mts", "waygraph.config.mjs", "waygraph.config.js", "waygraph.config.cjs"];
|
|
23
|
+
/** `config/` first, then the project root. */
|
|
24
|
+
const CONFIG_FILENAMES = [...CONFIG_NAMES.map((n) => join("config", n)), ...CONFIG_NAMES];
|
|
21
25
|
/**
|
|
22
26
|
* Looks for the first `waygraph.config.*` in `projectDir` and imports it - `.ts` works
|
|
23
27
|
* unmodified because `bin/waygraph` already registers `tsx/esm` before `dist/cli.js` ever runs
|
|
@@ -27,6 +31,7 @@ const CONFIG_FILENAMES = [
|
|
|
27
31
|
* anything" instead of "your config file has a bug."
|
|
28
32
|
*/
|
|
29
33
|
export async function loadWaygraphConfig(projectDir) {
|
|
34
|
+
loadEnvFiles(projectDir);
|
|
30
35
|
for (const name of CONFIG_FILENAMES) {
|
|
31
36
|
const p = join(projectDir, name);
|
|
32
37
|
if (!existsSync(p))
|
|
@@ -38,7 +43,9 @@ export async function loadWaygraphConfig(projectDir) {
|
|
|
38
43
|
catch (err) {
|
|
39
44
|
throw new Error(`waygraph: failed to load ${name}: ${err instanceof Error ? err.message : String(err)}`);
|
|
40
45
|
}
|
|
41
|
-
|
|
46
|
+
const loaded = mod.default ?? mod;
|
|
47
|
+
applyConfigEnv(loaded);
|
|
48
|
+
return loaded;
|
|
42
49
|
}
|
|
43
50
|
return undefined;
|
|
44
51
|
}
|
|
@@ -92,3 +99,29 @@ export async function resolveBaseUrl(projectDir) {
|
|
|
92
99
|
}
|
|
93
100
|
return undefined;
|
|
94
101
|
}
|
|
102
|
+
/** Unpacked extension directories for a run: `WAYGRAPH_EXTENSIONS` if set, else the config file's `extensions` (fetched on first use). */
|
|
103
|
+
export async function configuredExtensions(projectDir) {
|
|
104
|
+
const fromEnv = extensionPathsFromEnv();
|
|
105
|
+
if (fromEnv.length > 0)
|
|
106
|
+
return fromEnv;
|
|
107
|
+
loadEnvFiles(projectDir);
|
|
108
|
+
return resolveExtensions((await loadWaygraphConfig(projectDir))?.extensions, projectDir);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Applies the config's run settings as the `WAYGRAPH_*` variables the runner reads. A flag, a shell variable or a `.env`
|
|
112
|
+
* value that is already set always wins, so the config only supplies defaults.
|
|
113
|
+
*/
|
|
114
|
+
export function applyConfigEnv(config) {
|
|
115
|
+
if (!config)
|
|
116
|
+
return;
|
|
117
|
+
const set = (name, value) => {
|
|
118
|
+
if (value !== undefined && process.env[name] === undefined)
|
|
119
|
+
process.env[name] = value;
|
|
120
|
+
};
|
|
121
|
+
set("WAYGRAPH_VIDEO_DIR", config.video?.dir);
|
|
122
|
+
set("WAYGRAPH_VIDEO_VIEWPORT", config.video?.viewport);
|
|
123
|
+
set("WAYGRAPH_SLOWMO", config.slowMo === undefined ? undefined : String(config.slowMo));
|
|
124
|
+
set("WAYGRAPH_HEADED", config.headed === undefined ? undefined : config.headed ? "1" : "0");
|
|
125
|
+
set("WAYGRAPH_AUTOPLAY", config.demo?.autoNext === undefined ? undefined : config.demo.autoNext ? "1" : "0");
|
|
126
|
+
set("WAYGRAPH_DEMO_FAST", config.demo?.fast ? "1" : undefined);
|
|
127
|
+
}
|
package/dist/core/block.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ActionPage, Block, Checkpoint, DefinedBlock, Instruction } from "../types.js";
|
|
2
2
|
import { MemPage } from "../mem-page.js";
|
|
3
|
+
import type { MemKey } from "../mem-page.js";
|
|
3
4
|
import type { Trait } from "../trait.js";
|
|
4
5
|
export declare function findBlockIndex(middle: readonly Block<any, any>[], block: Block<any, any> | string | number): number;
|
|
5
6
|
/**
|
|
@@ -65,6 +66,17 @@ export declare function withStubBefore<B extends Block<any, any>>(block: B, stub
|
|
|
65
66
|
export declare function withStubAfter<B extends Block<any, any>>(block: B, stub: StubPhaseFn<any>): B;
|
|
66
67
|
/** @see {@link withStubBefore} */
|
|
67
68
|
export declare function withStubOnError<B extends Block<any, any>>(block: B, stub: StubPhaseFn<any>): B;
|
|
69
|
+
/**
|
|
70
|
+
* Answers the browser's own dialog (`confirm`, `alert`, `prompt`, `beforeunload`) that this Block's action
|
|
71
|
+
* triggers. A dialog freezes the page until it is answered, so the answer has to be armed before the click -
|
|
72
|
+
* this does that without folding it into the Block's own `act`. The dialog's text can be kept in mem.
|
|
73
|
+
* @example withDialog(CancelBlock, { accept: true, into: LeaveWarning })
|
|
74
|
+
*/
|
|
75
|
+
export declare function withDialog<B extends Block<any, any>>(block: B, options?: {
|
|
76
|
+
accept?: boolean;
|
|
77
|
+
into?: MemKey<string>;
|
|
78
|
+
promptText?: string;
|
|
79
|
+
}): B;
|
|
68
80
|
/**
|
|
69
81
|
* Replaces one Trait inside `block`'s verify list, leaving every other check
|
|
70
82
|
* untouched - the v1/v2/legacy-variant case, where one check needs a different
|
package/dist/core/block.js
CHANGED
|
@@ -213,6 +213,42 @@ export function withStubAfter(block, stub) {
|
|
|
213
213
|
export function withStubOnError(block, stub) {
|
|
214
214
|
return withStubPhase(block, "stubOnError", stub);
|
|
215
215
|
}
|
|
216
|
+
/**
|
|
217
|
+
* Answers the browser's own dialog (`confirm`, `alert`, `prompt`, `beforeunload`) that this Block's action
|
|
218
|
+
* triggers. A dialog freezes the page until it is answered, so the answer has to be armed before the click -
|
|
219
|
+
* this does that without folding it into the Block's own `act`. The dialog's text can be kept in mem.
|
|
220
|
+
* @example withDialog(CancelBlock, { accept: true, into: LeaveWarning })
|
|
221
|
+
*/
|
|
222
|
+
export function withDialog(block, options = {}) {
|
|
223
|
+
const base = stripMethods(block);
|
|
224
|
+
const act = base.instruction.act.bind(base.instruction);
|
|
225
|
+
const next = defineBlock({
|
|
226
|
+
...base,
|
|
227
|
+
instruction: {
|
|
228
|
+
...base.instruction,
|
|
229
|
+
async act(page, input, mem) {
|
|
230
|
+
const answer = async (dialog) => {
|
|
231
|
+
if (options.into)
|
|
232
|
+
mem.set(options.into, dialog.message());
|
|
233
|
+
if (options.accept === false)
|
|
234
|
+
await dialog.dismiss();
|
|
235
|
+
else
|
|
236
|
+
await dialog.accept(options.promptText);
|
|
237
|
+
};
|
|
238
|
+
const raw = page;
|
|
239
|
+
raw.once("dialog", answer);
|
|
240
|
+
try {
|
|
241
|
+
await act(page, input, mem);
|
|
242
|
+
}
|
|
243
|
+
finally {
|
|
244
|
+
raw.off("dialog", answer);
|
|
245
|
+
}
|
|
246
|
+
},
|
|
247
|
+
},
|
|
248
|
+
});
|
|
249
|
+
copyWaygraphRuntime(block, next);
|
|
250
|
+
return next;
|
|
251
|
+
}
|
|
216
252
|
/**
|
|
217
253
|
* Replaces one Trait inside `block`'s verify list, leaving every other check
|
|
218
254
|
* untouched - the v1/v2/legacy-variant case, where one check needs a different
|
|
@@ -17,13 +17,10 @@ export type EffectBlock<In extends Checkpoint<string>, Out extends Checkpoint<st
|
|
|
17
17
|
modVerifyAll(patches: Record<string, Trait["check"] | Trait>): EffectBlock<In, Out>;
|
|
18
18
|
stubBefore(stub: import("../../highlights.js").HighlightStubPhase): EffectBlock<In, Out>;
|
|
19
19
|
stubBefore(stub: import("../../highlights.js").StubLifecycleFn<Out>): EffectBlock<In, Out>;
|
|
20
|
-
stubBefore(stub: (out: Out) => import("../../highlights.js").HighlightStubPhase): EffectBlock<In, Out>;
|
|
21
20
|
stubAfter(stub: import("../../highlights.js").HighlightStubPhase): EffectBlock<In, Out>;
|
|
22
21
|
stubAfter(stub: import("../../highlights.js").StubLifecycleFn<Out>): EffectBlock<In, Out>;
|
|
23
|
-
stubAfter(stub: (out: Out) => import("../../highlights.js").HighlightStubPhase): EffectBlock<In, Out>;
|
|
24
22
|
stubOnError(stub: import("../../highlights.js").HighlightStubPhase): EffectBlock<In, Out>;
|
|
25
23
|
stubOnError(stub: import("../../highlights.js").StubLifecycleFn<Out>): EffectBlock<In, Out>;
|
|
26
|
-
stubOnError(stub: (out: Out) => import("../../highlights.js").HighlightStubPhase): EffectBlock<In, Out>;
|
|
27
24
|
};
|
|
28
25
|
/** @deprecated Prefer {@link EffectBlock} - same type; Mem* was an early name. */
|
|
29
26
|
export type MemEffectBlock<In extends Checkpoint<string>, Out extends Checkpoint<string>> = EffectBlock<In, Out>;
|
|
@@ -17,13 +17,10 @@ export type MethodBlock<In extends Checkpoint<string>, Out extends Checkpoint<st
|
|
|
17
17
|
modVerifyAll(patches: Record<string, Trait["check"] | Trait>): MethodBlock<In, Out>;
|
|
18
18
|
stubBefore(stub: import("../../highlights.js").HighlightStubPhase): MethodBlock<In, Out>;
|
|
19
19
|
stubBefore(stub: import("../../highlights.js").StubLifecycleFn<Out>): MethodBlock<In, Out>;
|
|
20
|
-
stubBefore(stub: (out: Out) => import("../../highlights.js").HighlightStubPhase): MethodBlock<In, Out>;
|
|
21
20
|
stubAfter(stub: import("../../highlights.js").HighlightStubPhase): MethodBlock<In, Out>;
|
|
22
21
|
stubAfter(stub: import("../../highlights.js").StubLifecycleFn<Out>): MethodBlock<In, Out>;
|
|
23
|
-
stubAfter(stub: (out: Out) => import("../../highlights.js").HighlightStubPhase): MethodBlock<In, Out>;
|
|
24
22
|
stubOnError(stub: import("../../highlights.js").HighlightStubPhase): MethodBlock<In, Out>;
|
|
25
23
|
stubOnError(stub: import("../../highlights.js").StubLifecycleFn<Out>): MethodBlock<In, Out>;
|
|
26
|
-
stubOnError(stub: (out: Out) => import("../../highlights.js").HighlightStubPhase): MethodBlock<In, Out>;
|
|
27
24
|
};
|
|
28
25
|
/** @deprecated Prefer {@link MethodBlock} - same type; Action was the 0.7 name. */
|
|
29
26
|
export type ActionBlock<In extends Checkpoint<string>, Out extends Checkpoint<string>> = MethodBlock<In, Out>;
|
|
@@ -80,11 +77,8 @@ export type AssertBlock<Out extends Checkpoint<string>> = Omit<DefinedBlock<Out,
|
|
|
80
77
|
modVerifyAll(patches: Record<string, Trait["check"] | Trait>): AssertBlock<Out>;
|
|
81
78
|
stubBefore(stub: import("../../highlights.js").HighlightStubPhase): AssertBlock<Out>;
|
|
82
79
|
stubBefore(stub: import("../../highlights.js").StubLifecycleFn<Out>): AssertBlock<Out>;
|
|
83
|
-
stubBefore(stub: (out: Out) => import("../../highlights.js").HighlightStubPhase): AssertBlock<Out>;
|
|
84
80
|
stubAfter(stub: import("../../highlights.js").HighlightStubPhase): AssertBlock<Out>;
|
|
85
81
|
stubAfter(stub: import("../../highlights.js").StubLifecycleFn<Out>): AssertBlock<Out>;
|
|
86
|
-
stubAfter(stub: (out: Out) => import("../../highlights.js").HighlightStubPhase): AssertBlock<Out>;
|
|
87
82
|
stubOnError(stub: import("../../highlights.js").HighlightStubPhase): AssertBlock<Out>;
|
|
88
83
|
stubOnError(stub: import("../../highlights.js").StubLifecycleFn<Out>): AssertBlock<Out>;
|
|
89
|
-
stubOnError(stub: (out: Out) => import("../../highlights.js").HighlightStubPhase): AssertBlock<Out>;
|
|
90
84
|
};
|
|
@@ -22,13 +22,10 @@ export type NavBlock<Out extends Checkpoint<string>> = Omit<DefinedBlock<Checkpo
|
|
|
22
22
|
modVerifyAll(patches: Record<string, Trait["check"] | Trait>): NavBlock<Out>;
|
|
23
23
|
stubBefore(stub: import("../../highlights.js").HighlightStubPhase): NavBlock<Out>;
|
|
24
24
|
stubBefore(stub: import("../../highlights.js").StubLifecycleFn<Out>): NavBlock<Out>;
|
|
25
|
-
stubBefore(stub: (out: Out) => import("../../highlights.js").HighlightStubPhase): NavBlock<Out>;
|
|
26
25
|
stubAfter(stub: import("../../highlights.js").HighlightStubPhase): NavBlock<Out>;
|
|
27
26
|
stubAfter(stub: import("../../highlights.js").StubLifecycleFn<Out>): NavBlock<Out>;
|
|
28
|
-
stubAfter(stub: (out: Out) => import("../../highlights.js").HighlightStubPhase): NavBlock<Out>;
|
|
29
27
|
stubOnError(stub: import("../../highlights.js").HighlightStubPhase): NavBlock<Out>;
|
|
30
28
|
stubOnError(stub: import("../../highlights.js").StubLifecycleFn<Out>): NavBlock<Out>;
|
|
31
|
-
stubOnError(stub: (out: Out) => import("../../highlights.js").HighlightStubPhase): NavBlock<Out>;
|
|
32
29
|
};
|
|
33
30
|
/**
|
|
34
31
|
* `defineNavBlock`'s own options - exactly one of `url`/`click` required,
|
|
@@ -42,6 +39,15 @@ export type NavBlockOptions<Out extends Checkpoint<string>> = {
|
|
|
42
39
|
name: string;
|
|
43
40
|
description?: string;
|
|
44
41
|
checkpoint: Out["__state"];
|
|
42
|
+
/**
|
|
43
|
+
* Checkpoint tags this Nav can run from. Omit (the default) = reachable from anywhere. Set it for
|
|
44
|
+
* a page that only exists after something else - e.g. every in-app page after sign-in - so route
|
|
45
|
+
* finding (`auto --blocks`, `pilot reach`, `traverse`) goes through the sign-in steps instead of
|
|
46
|
+
* jumping straight there from the login page.
|
|
47
|
+
* @example const SIGNED_IN = ["Dashboard", "CommandCenter"] as const; // src/states/
|
|
48
|
+
* defineNavBlock({ ..., from: SIGNED_IN })
|
|
49
|
+
*/
|
|
50
|
+
from?: readonly string[];
|
|
45
51
|
requires?: readonly MemKey<any>[];
|
|
46
52
|
verify?: Trait[] | ((out: Out) => Trait[]);
|
|
47
53
|
stubBefore?: import("../../highlights.js").HighlightStubPhaseOrFn<Out>;
|
|
@@ -106,6 +112,8 @@ export type NavClickBlockOptions<Out extends Checkpoint<string>> = {
|
|
|
106
112
|
description?: string;
|
|
107
113
|
checkpoint: Out["__state"];
|
|
108
114
|
click: string | ((mem: MemPage) => string);
|
|
115
|
+
/** See {@link NavBlockOptions.from}. */
|
|
116
|
+
from?: readonly string[];
|
|
109
117
|
requires?: readonly MemKey<any>[];
|
|
110
118
|
verify?: Trait[] | ((out: Out) => Trait[]);
|
|
111
119
|
stubBefore?: import("../../highlights.js").HighlightStubPhaseOrFn<Out>;
|
package/dist/core/blocks/nav.js
CHANGED
|
@@ -54,6 +54,13 @@ export function defineNavBlock(options) {
|
|
|
54
54
|
});
|
|
55
55
|
// Demo/step tooling: remember the click selector (or factory) so
|
|
56
56
|
// overlays can label "nav click" without re-parsing source.
|
|
57
|
+
if (options.from && options.from.length > 0) {
|
|
58
|
+
Object.defineProperty(built, "__waygraphNavFrom", {
|
|
59
|
+
value: [...options.from],
|
|
60
|
+
enumerable: false,
|
|
61
|
+
configurable: false,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
57
64
|
if (options.click !== undefined) {
|
|
58
65
|
Object.defineProperty(built, "__waygraphNavClick", {
|
|
59
66
|
value: options.click,
|
|
@@ -83,6 +90,7 @@ export function defineNavClickBlock(options) {
|
|
|
83
90
|
name: options.name,
|
|
84
91
|
checkpoint: options.checkpoint,
|
|
85
92
|
click: options.click,
|
|
93
|
+
...(options.from ? { from: options.from } : {}),
|
|
86
94
|
...(options.description ? { description: options.description } : {}),
|
|
87
95
|
...(options.requires ? { requires: options.requires } : {}),
|
|
88
96
|
...(options.verify ? { verify: options.verify } : {}),
|
|
@@ -47,13 +47,10 @@ export type PageBlock<Out extends Checkpoint<string>> = Omit<DefinedBlock<Checkp
|
|
|
47
47
|
modVerifyAll(patches: Record<string, Trait["check"] | Trait>): PageBlock<Out>;
|
|
48
48
|
stubBefore(stub: import("../../highlights.js").HighlightStubPhase): PageBlock<Out>;
|
|
49
49
|
stubBefore(stub: import("../../highlights.js").StubLifecycleFn<Out>): PageBlock<Out>;
|
|
50
|
-
stubBefore(stub: (out: Out) => import("../../highlights.js").HighlightStubPhase): PageBlock<Out>;
|
|
51
50
|
stubAfter(stub: import("../../highlights.js").HighlightStubPhase): PageBlock<Out>;
|
|
52
51
|
stubAfter(stub: import("../../highlights.js").StubLifecycleFn<Out>): PageBlock<Out>;
|
|
53
|
-
stubAfter(stub: (out: Out) => import("../../highlights.js").HighlightStubPhase): PageBlock<Out>;
|
|
54
52
|
stubOnError(stub: import("../../highlights.js").HighlightStubPhase): PageBlock<Out>;
|
|
55
53
|
stubOnError(stub: import("../../highlights.js").StubLifecycleFn<Out>): PageBlock<Out>;
|
|
56
|
-
stubOnError(stub: (out: Out) => import("../../highlights.js").HighlightStubPhase): PageBlock<Out>;
|
|
57
54
|
};
|
|
58
55
|
/** @see {@link PageBlockOptions} */
|
|
59
56
|
export declare function definePageBlock<Out extends Checkpoint<string>>(options: PageBlockOptions<Out>): PageBlock<Out>;
|
package/dist/core/config.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { BrowserType } from "@playwright/test";
|
|
2
2
|
import type { Layout } from "./run-graph.js";
|
|
3
|
+
import type { ExtensionSpec } from "../extensions.js";
|
|
3
4
|
/**
|
|
4
5
|
* Resolves which `BrowserType` actually launches for a `mem`-only run (no
|
|
5
6
|
* caller-supplied context) - `config.browsers[browserName]` if given,
|
|
@@ -52,4 +53,8 @@ export interface EngineConfig {
|
|
|
52
53
|
* @example new Engine({ layouts: [AppShellLayout] })
|
|
53
54
|
*/
|
|
54
55
|
layouts?: readonly Layout[];
|
|
56
|
+
/** Chromium extensions to load: names, store ids or paths (see `extensions` in `waygraph.config.ts`). Default `WAYGRAPH_EXTENSIONS`. */
|
|
57
|
+
extensions?: readonly ExtensionSpec[];
|
|
58
|
+
/** Resolves relative `url`s in Nav Blocks when the Engine launches its own browser. Default `WAYGRAPH_BASE_URL`. */
|
|
59
|
+
baseUrl?: string;
|
|
55
60
|
}
|
package/dist/core/engine.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Block, Checkpoint } from "../types.js";
|
|
2
2
|
import type { EngineConfig } from "./config.js";
|
|
3
3
|
import type { EndMarker, StartMarker } from "./run-graph.js";
|
|
4
|
-
import type { Flow } from "./flow.js";
|
|
4
|
+
import type { Flow, FlowOptions } from "./flow.js";
|
|
5
5
|
import { MapBuilder } from "./map-builder.js";
|
|
6
6
|
import type { MapBuilderOptions } from "./map-builder.js";
|
|
7
7
|
type S = Checkpoint<"__start__">;
|
|
@@ -22,12 +22,13 @@ export declare class Engine {
|
|
|
22
22
|
* calls. Overloaded for 2-9 array slots (1-8 real Blocks between `start`/`end`)
|
|
23
23
|
* rather than one fully-generic recursive tuple type, so each arity is as
|
|
24
24
|
* reliably checked as `connect<A,B,C>` itself.
|
|
25
|
-
*
|
|
25
|
+
* Options go in the second argument instead of wrapping the result in `withTitle(withMemStub(...))`.
|
|
26
|
+
* @example engine.defineFlow([start, LoginBlock, AddToCartBlock, end], { title: "Login", memStub: true })
|
|
26
27
|
*/
|
|
27
|
-
defineFlow<B extends Checkpoint<string>>(blocks: readonly [StartMarker, Block<S, B>, EndMarker]): Flow<B>;
|
|
28
|
-
defineFlow<B extends Checkpoint<string>, C extends Checkpoint<string>>(blocks: readonly [StartMarker, Block<S, B>, Block<B, C>, EndMarker]): Flow<C>;
|
|
29
|
-
defineFlow<B extends Checkpoint<string>, C extends Checkpoint<string>, D extends Checkpoint<string>>(blocks: readonly [StartMarker, Block<S, B>, Block<B, C>, Block<C, D>, EndMarker]): Flow<D>;
|
|
30
|
-
defineFlow<B extends Checkpoint<string>, C extends Checkpoint<string>, D extends Checkpoint<string>, E extends Checkpoint<string>>(blocks: readonly [StartMarker, Block<S, B>, Block<B, C>, Block<C, D>, Block<D, E>, EndMarker]): Flow<E>;
|
|
28
|
+
defineFlow<B extends Checkpoint<string>>(blocks: readonly [StartMarker, Block<S, B>, EndMarker], options?: FlowOptions): Flow<B>;
|
|
29
|
+
defineFlow<B extends Checkpoint<string>, C extends Checkpoint<string>>(blocks: readonly [StartMarker, Block<S, B>, Block<B, C>, EndMarker], options?: FlowOptions): Flow<C>;
|
|
30
|
+
defineFlow<B extends Checkpoint<string>, C extends Checkpoint<string>, D extends Checkpoint<string>>(blocks: readonly [StartMarker, Block<S, B>, Block<B, C>, Block<C, D>, EndMarker], options?: FlowOptions): Flow<D>;
|
|
31
|
+
defineFlow<B extends Checkpoint<string>, C extends Checkpoint<string>, D extends Checkpoint<string>, E extends Checkpoint<string>>(blocks: readonly [StartMarker, Block<S, B>, Block<B, C>, Block<C, D>, Block<D, E>, EndMarker], options?: FlowOptions): Flow<E>;
|
|
31
32
|
defineFlow<B extends Checkpoint<string>, C extends Checkpoint<string>, D extends Checkpoint<string>, E extends Checkpoint<string>, F extends Checkpoint<string>>(blocks: readonly [
|
|
32
33
|
StartMarker,
|
|
33
34
|
Block<S, B>,
|
|
@@ -36,7 +37,7 @@ export declare class Engine {
|
|
|
36
37
|
Block<D, E>,
|
|
37
38
|
Block<E, F>,
|
|
38
39
|
EndMarker
|
|
39
|
-
]): Flow<F>;
|
|
40
|
+
], options?: FlowOptions): Flow<F>;
|
|
40
41
|
defineFlow<B extends Checkpoint<string>, C extends Checkpoint<string>, D extends Checkpoint<string>, E extends Checkpoint<string>, F extends Checkpoint<string>, G extends Checkpoint<string>>(blocks: readonly [
|
|
41
42
|
StartMarker,
|
|
42
43
|
Block<S, B>,
|
|
@@ -46,7 +47,7 @@ export declare class Engine {
|
|
|
46
47
|
Block<E, F>,
|
|
47
48
|
Block<F, G>,
|
|
48
49
|
EndMarker
|
|
49
|
-
]): Flow<G>;
|
|
50
|
+
], options?: FlowOptions): Flow<G>;
|
|
50
51
|
defineFlow<B extends Checkpoint<string>, C extends Checkpoint<string>, D extends Checkpoint<string>, E extends Checkpoint<string>, F extends Checkpoint<string>, G extends Checkpoint<string>, H extends Checkpoint<string>>(blocks: readonly [
|
|
51
52
|
StartMarker,
|
|
52
53
|
Block<S, B>,
|
|
@@ -57,7 +58,7 @@ export declare class Engine {
|
|
|
57
58
|
Block<F, G>,
|
|
58
59
|
Block<G, H>,
|
|
59
60
|
EndMarker
|
|
60
|
-
]): Flow<H>;
|
|
61
|
+
], options?: FlowOptions): Flow<H>;
|
|
61
62
|
defineFlow<B extends Checkpoint<string>, C extends Checkpoint<string>, D extends Checkpoint<string>, E extends Checkpoint<string>, F extends Checkpoint<string>, G extends Checkpoint<string>, H extends Checkpoint<string>, I extends Checkpoint<string>>(blocks: readonly [
|
|
62
63
|
StartMarker,
|
|
63
64
|
Block<S, B>,
|
|
@@ -69,7 +70,7 @@ export declare class Engine {
|
|
|
69
70
|
Block<G, H>,
|
|
70
71
|
Block<H, I>,
|
|
71
72
|
EndMarker
|
|
72
|
-
]): Flow<I>;
|
|
73
|
+
], options?: FlowOptions): Flow<I>;
|
|
73
74
|
defineFlow<B extends Checkpoint<string>, C extends Checkpoint<string>, D extends Checkpoint<string>, E extends Checkpoint<string>, F extends Checkpoint<string>, G extends Checkpoint<string>, H extends Checkpoint<string>, I extends Checkpoint<string>, J extends Checkpoint<string>>(blocks: readonly [
|
|
74
75
|
StartMarker,
|
|
75
76
|
Block<S, B>,
|
|
@@ -82,7 +83,7 @@ export declare class Engine {
|
|
|
82
83
|
Block<H, I>,
|
|
83
84
|
Block<I, J>,
|
|
84
85
|
EndMarker
|
|
85
|
-
]): Flow<J>;
|
|
86
|
+
], options?: FlowOptions): Flow<J>;
|
|
86
87
|
defineFlow<B extends Checkpoint<string>, C extends Checkpoint<string>, D extends Checkpoint<string>, E extends Checkpoint<string>, F extends Checkpoint<string>, G extends Checkpoint<string>, H extends Checkpoint<string>, I extends Checkpoint<string>, J extends Checkpoint<string>, K extends Checkpoint<string>>(blocks: readonly [
|
|
87
88
|
StartMarker,
|
|
88
89
|
Block<S, B>,
|
|
@@ -96,7 +97,7 @@ export declare class Engine {
|
|
|
96
97
|
Block<I, J>,
|
|
97
98
|
Block<J, K>,
|
|
98
99
|
EndMarker
|
|
99
|
-
]): Flow<K>;
|
|
100
|
+
], options?: FlowOptions): Flow<K>;
|
|
100
101
|
defineFlow<B extends Checkpoint<string>, C extends Checkpoint<string>, D extends Checkpoint<string>, E extends Checkpoint<string>, F extends Checkpoint<string>, G extends Checkpoint<string>, H extends Checkpoint<string>, I extends Checkpoint<string>, J extends Checkpoint<string>, K extends Checkpoint<string>, L extends Checkpoint<string>>(blocks: readonly [
|
|
101
102
|
StartMarker,
|
|
102
103
|
Block<S, B>,
|
|
@@ -111,7 +112,7 @@ export declare class Engine {
|
|
|
111
112
|
Block<J, K>,
|
|
112
113
|
Block<K, L>,
|
|
113
114
|
EndMarker
|
|
114
|
-
]): Flow<L>;
|
|
115
|
+
], options?: FlowOptions): Flow<L>;
|
|
115
116
|
defineFlow<B extends Checkpoint<string>, C extends Checkpoint<string>, D extends Checkpoint<string>, E extends Checkpoint<string>, F extends Checkpoint<string>, G extends Checkpoint<string>, H extends Checkpoint<string>, I extends Checkpoint<string>, J extends Checkpoint<string>, K extends Checkpoint<string>, L extends Checkpoint<string>, M extends Checkpoint<string>>(blocks: readonly [
|
|
116
117
|
StartMarker,
|
|
117
118
|
Block<S, B>,
|
|
@@ -127,7 +128,7 @@ export declare class Engine {
|
|
|
127
128
|
Block<K, L>,
|
|
128
129
|
Block<L, M>,
|
|
129
130
|
EndMarker
|
|
130
|
-
]): Flow<M>;
|
|
131
|
+
], options?: FlowOptions): Flow<M>;
|
|
131
132
|
defineFlow<B extends Checkpoint<string>, C extends Checkpoint<string>, D extends Checkpoint<string>, E extends Checkpoint<string>, F extends Checkpoint<string>, G extends Checkpoint<string>, H extends Checkpoint<string>, I extends Checkpoint<string>, J extends Checkpoint<string>, K extends Checkpoint<string>, L extends Checkpoint<string>, M extends Checkpoint<string>, N extends Checkpoint<string>>(blocks: readonly [
|
|
132
133
|
StartMarker,
|
|
133
134
|
Block<S, B>,
|
|
@@ -144,7 +145,7 @@ export declare class Engine {
|
|
|
144
145
|
Block<L, M>,
|
|
145
146
|
Block<M, N>,
|
|
146
147
|
EndMarker
|
|
147
|
-
]): Flow<N>;
|
|
148
|
+
], options?: FlowOptions): Flow<N>;
|
|
148
149
|
defineFlow<B extends Checkpoint<string>, C extends Checkpoint<string>, D extends Checkpoint<string>, E extends Checkpoint<string>, F extends Checkpoint<string>, G extends Checkpoint<string>, H extends Checkpoint<string>, I extends Checkpoint<string>, J extends Checkpoint<string>, K extends Checkpoint<string>, L extends Checkpoint<string>, M extends Checkpoint<string>, N extends Checkpoint<string>, O extends Checkpoint<string>>(blocks: readonly [
|
|
149
150
|
StartMarker,
|
|
150
151
|
Block<S, B>,
|
|
@@ -162,7 +163,7 @@ export declare class Engine {
|
|
|
162
163
|
Block<M, N>,
|
|
163
164
|
Block<N, O>,
|
|
164
165
|
EndMarker
|
|
165
|
-
]): Flow<O>;
|
|
166
|
+
], options?: FlowOptions): Flow<O>;
|
|
166
167
|
/**
|
|
167
168
|
* Fluent, kind-checked alternative to `defineFlow([start, ...blocks, end])` -
|
|
168
169
|
* see {@link MapBuilder}. Real, direct request this responds to: pia/zsign's
|
package/dist/core/engine.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { buildFlow } from "./flow.js";
|
|
1
|
+
import { applyFlowOptions, buildFlow } from "./flow.js";
|
|
2
2
|
import { MapBuilder } from "./map-builder.js";
|
|
3
3
|
/**
|
|
4
4
|
* Holds engine-level configuration shared across every flow defined from it -
|
|
@@ -12,8 +12,8 @@ export class Engine {
|
|
|
12
12
|
constructor(config = {}) {
|
|
13
13
|
this.config = config;
|
|
14
14
|
}
|
|
15
|
-
defineFlow(blocks) {
|
|
16
|
-
return buildFlow(blocks.slice(1, -1), this.config);
|
|
15
|
+
defineFlow(blocks, options) {
|
|
16
|
+
return applyFlowOptions(buildFlow(blocks.slice(1, -1), this.config), options);
|
|
17
17
|
}
|
|
18
18
|
/**
|
|
19
19
|
* Fluent, kind-checked alternative to `defineFlow([start, ...blocks, end])` -
|
package/dist/core/flow.d.ts
CHANGED
|
@@ -245,6 +245,23 @@ export declare function withExpectedFailure<Out extends Checkpoint<string>>(flow
|
|
|
245
245
|
* @example withHighlightFixtures(issueFlow, { "submit-login": { stubBefore: { email: { label: "AC-1" } } } })
|
|
246
246
|
*/
|
|
247
247
|
export declare function withHighlightFixtures<Out extends Checkpoint<string>>(flow: Flow<Out>, fixtures: import("../highlights.js").HighlightFixtureMap): Flow<Out>;
|
|
248
|
+
/** Everything a `with*` wrapper can set, given up front: `engine.defineFlow([...], { title, memStub, ... })`. */
|
|
249
|
+
export interface FlowOptions {
|
|
250
|
+
/** Shown as the banner while the Flow runs (`withTitle`). */
|
|
251
|
+
title?: string;
|
|
252
|
+
/** Fill missing `requires` keys from `registerMemStub` (`withMemStub`). */
|
|
253
|
+
memStub?: boolean;
|
|
254
|
+
/** Clear cookies and storage before this Flow's first Block when chained after another (`withSessionReset`). */
|
|
255
|
+
sessionReset?: boolean;
|
|
256
|
+
/** `withDemoPace`. */
|
|
257
|
+
demoPace?: DemoPace;
|
|
258
|
+
/** `withHighlightStyle`. */
|
|
259
|
+
highlightStyle?: HighlightStyleDefaults;
|
|
260
|
+
/** Marks a Flow that is supposed to throw, with the reason (`withExpectedFailure`). */
|
|
261
|
+
expectedFailure?: string;
|
|
262
|
+
}
|
|
263
|
+
/** Applies each set option through its `with*` wrapper, so both spellings produce the same Flow. */
|
|
264
|
+
export declare function applyFlowOptions<Out extends Checkpoint<string>>(flow: Flow<Out>, options: FlowOptions | undefined): Flow<Out>;
|
|
248
265
|
/**
|
|
249
266
|
* Runs several complete, independent Flows one after another, reusing the
|
|
250
267
|
* same page/context/mem in order - each remains its own validated
|