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
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
[14:00:36.038] waygraph pilot: stub.before ctx.title("Signing in · mobile")
|
|
2
|
-
[14:00:36.038] waygraph pilot: stub.before ctx.todos n=6 index=0
|
|
3
|
-
[14:00:36.038] waygraph pilot: stub.before ctx.device(mobile)
|
|
4
|
-
[14:00:36.038] waygraph pilot: stub.before ctx.zoom(1.35)
|
|
5
|
-
[14:00:36.039] waygraph pilot: stub.before ring #user-name tone=info label="Username"
|
|
6
|
-
[14:00:37.012] waygraph pilot: stub.after ctx.todos n=6 index=1
|
|
7
|
-
[14:00:38.516] waygraph pilot: stub.before ring #password tone=planned label="Password"
|
|
8
|
-
[14:00:38.588] waygraph pilot: stub.after ctx.todos n=6 index=2
|
|
9
|
-
[14:00:39.825] waygraph pilot: stub.before ring #login-button tone=warning label="Login"
|
|
10
|
-
[14:00:40.139] waygraph pilot: stub.after ctx.title("Inventory · landscape")
|
|
11
|
-
[14:00:40.139] waygraph pilot: stub.after ctx.todos n=6 index=3
|
|
12
|
-
[14:00:40.139] waygraph pilot: stub.after ctx.device(mobile)
|
|
13
|
-
[14:00:40.139] waygraph pilot: stub.after ring .inventory_list tone=success label="Product shelf"
|
|
14
|
-
[14:00:43.111] waygraph pilot: stub.before ctx.title("Open cart · landscape")
|
|
15
|
-
[14:00:43.111] waygraph pilot: stub.before ctx.todos n=6 index=5
|
|
16
|
-
[14:00:43.111] waygraph pilot: stub.before ctx.device(mobile)
|
|
17
|
-
[14:00:43.111] waygraph pilot: stub.before ctx.zoom(1.4)
|
|
18
|
-
[14:00:43.111] waygraph pilot: stub.before ring .shopping_cart_link tone=planned label="Cart"
|
|
19
|
-
[14:00:43.323] waygraph pilot: stub.after ctx.title("Your cart · desktop")
|
|
20
|
-
[14:00:43.323] waygraph pilot: stub.after ring .cart_item tone=success label="Cart items"
|
|
File without changes
|
|
File without changes
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
[18:20:03.075] waygraph pilot: stub.before ctx.title("Signing in · mobile")
|
|
2
|
-
[18:20:03.076] waygraph pilot: stub.before ctx.todos n=6 index=0
|
|
3
|
-
[18:20:03.077] waygraph pilot: stub.before ctx.device(mobile)
|
|
4
|
-
[18:20:03.077] waygraph pilot: stub.before ctx.zoom(1.35)
|
|
5
|
-
[18:20:03.077] waygraph pilot: stub.before ring #user-name tone=info label="Username"
|
|
6
|
-
[18:20:04.426] waygraph pilot: stub.after ctx.todos n=6 index=1
|
|
7
|
-
[18:20:06.573] waygraph pilot: stub.before ring #password tone=planned label="Password"
|
|
8
|
-
[18:20:06.738] waygraph pilot: stub.after ctx.todos n=6 index=2
|
|
9
|
-
[18:20:08.639] waygraph pilot: stub.before ring #login-button tone=warning label="Login"
|
|
10
|
-
[18:20:08.736] waygraph pilot: stub.after ctx.title("Inventory · landscape")
|
|
11
|
-
[18:20:08.736] waygraph pilot: stub.after ctx.todos n=6 index=3
|
|
12
|
-
[18:20:08.736] waygraph pilot: stub.after ctx.device(mobile)
|
|
13
|
-
[18:20:08.736] waygraph pilot: stub.after ring .inventory_list tone=success label="Product shelf"
|
|
14
|
-
[18:20:11.298] waygraph pilot: stub.before ctx.title("Pick a product · tablet")
|
|
15
|
-
[18:20:11.298] waygraph pilot: stub.before ctx.todos n=6 index=3
|
|
16
|
-
[18:20:11.298] waygraph pilot: stub.before ctx.device(tablet)
|
|
17
|
-
[18:20:11.298] waygraph pilot: stub.before ctx.zoom(1.35)
|
|
18
|
-
[18:20:11.298] waygraph pilot: stub.before ring div.inventory_item:has(button[data-test="add-to-cart-sauce-labs-backpack"], button[data-test="remove-sauce-labs-backpack"]) .inventory_item_name tone=info label="Sauce Labs Backpack"
|
|
19
|
-
[18:20:11.298] waygraph pilot: stub.before ring [data-test="add-to-cart-sauce-labs-backpack"] tone=success label="Add to cart"
|
|
20
|
-
[18:20:11.986] waygraph pilot: stub.after ctx.title("In the cart")
|
|
21
|
-
[18:20:11.986] waygraph pilot: stub.after ctx.todos n=6 index=4
|
|
22
|
-
[18:20:11.986] waygraph pilot: stub.after ring .shopping_cart_badge tone=success label="Cart badge"
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
[17:11:21.484] waygraph pilot: highlight ctx.todos n=3 index=0
|
|
2
|
-
[17:11:21.486] waygraph pilot: highlight ring #user-name tone=planned label="Username"
|
|
3
|
-
[17:11:21.487] waygraph pilot: highlight ring #password tone=info label="Password"
|
|
4
|
-
[17:11:25.138] waygraph pilot: highlight ring #no-such-element-waygraph tone=danger label="Gone"
|
|
5
|
-
[17:11:26.947] waygraph pilot: highlight ring #login-button tone=success label="Login"
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
[18:19:57.299] waygraph pilot: stub.before ctx.title("Signing in · mobile")
|
|
2
|
-
[18:19:57.300] waygraph pilot: stub.before ctx.todos n=6 index=0
|
|
3
|
-
[18:19:57.300] waygraph pilot: stub.before ctx.device(mobile)
|
|
4
|
-
[18:19:57.300] waygraph pilot: stub.before ctx.zoom(1.35)
|
|
5
|
-
[18:19:57.300] waygraph pilot: stub.before ring #user-name tone=info label="Username"
|
|
6
|
-
[18:19:58.498] waygraph pilot: stub.after ctx.todos n=6 index=1
|
|
7
|
-
[18:19:59.896] waygraph pilot: stub.before ring #password tone=planned label="Password"
|
|
8
|
-
[18:20:00.105] waygraph pilot: stub.after ctx.todos n=6 index=2
|
|
9
|
-
[18:20:01.394] waygraph pilot: stub.before ring #login-button tone=warning label="Login"
|
|
10
|
-
[18:20:01.596] waygraph pilot: stub.after ctx.title("Inventory · landscape")
|
|
11
|
-
[18:20:01.597] waygraph pilot: stub.after ctx.todos n=6 index=3
|
|
12
|
-
[18:20:01.597] waygraph pilot: stub.after ctx.device(mobile)
|
|
13
|
-
[18:20:01.597] waygraph pilot: stub.after ring .inventory_list tone=success label="Product shelf"
|
|
14
|
-
[18:20:04.415] waygraph pilot: stub.before ctx.title("Open cart · landscape")
|
|
15
|
-
[18:20:04.415] waygraph pilot: stub.before ctx.todos n=6 index=5
|
|
16
|
-
[18:20:04.415] waygraph pilot: stub.before ctx.device(mobile)
|
|
17
|
-
[18:20:04.415] waygraph pilot: stub.before ctx.zoom(1.4)
|
|
18
|
-
[18:20:04.415] waygraph pilot: stub.before ring .shopping_cart_link tone=planned label="Cart"
|
|
19
|
-
[18:20:04.708] waygraph pilot: stub.after ctx.title("Your cart · desktop")
|
|
20
|
-
[18:20:04.708] waygraph pilot: stub.after ring .cart_item tone=success label="Cart items"
|
|
21
|
-
[18:20:04.740] waygraph pilot: ring not painted - selector matched nothing (or a zero-size element): .cart_item
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
[16:12:39.604] waygraph pilot: stub.before ctx.title("Signing in · mobile")
|
|
2
|
-
[16:12:39.605] waygraph pilot: stub.before ctx.todos n=6 index=0
|
|
3
|
-
[16:12:39.605] waygraph pilot: stub.before ctx.device(mobile)
|
|
4
|
-
[16:12:39.605] waygraph pilot: stub.before ctx.zoom(1.35)
|
|
5
|
-
[16:12:39.605] waygraph pilot: stub.before ring #user-name tone=info label="Username"
|
|
6
|
-
[16:12:40.582] waygraph pilot: stub.after ctx.todos n=6 index=1
|
|
7
|
-
[16:12:42.304] waygraph pilot: stub.before ring #password tone=planned label="Password"
|
|
8
|
-
[16:12:42.445] waygraph pilot: stub.after ctx.todos n=6 index=2
|
|
9
|
-
[16:12:44.041] waygraph pilot: stub.before ring #login-button tone=warning label="Login"
|
|
10
|
-
[16:12:44.385] waygraph pilot: stub.after ctx.title("Inventory · landscape")
|
|
11
|
-
[16:12:44.385] waygraph pilot: stub.after ctx.todos n=6 index=3
|
|
12
|
-
[16:12:44.385] waygraph pilot: stub.after ctx.device(mobile)
|
|
13
|
-
[16:12:44.385] waygraph pilot: stub.after ring .inventory_list tone=success label="Product shelf"
|
|
14
|
-
[16:12:47.747] waygraph pilot: stub.before ctx.title("Open cart · landscape")
|
|
15
|
-
[16:12:47.747] waygraph pilot: stub.before ctx.todos n=6 index=5
|
|
16
|
-
[16:12:47.747] waygraph pilot: stub.before ctx.device(mobile)
|
|
17
|
-
[16:12:47.747] waygraph pilot: stub.before ctx.zoom(1.4)
|
|
18
|
-
[16:12:47.747] waygraph pilot: stub.before ring .shopping_cart_link tone=planned label="Cart"
|
|
19
|
-
[16:12:48.104] waygraph pilot: stub.after ctx.title("Your cart · desktop")
|
|
20
|
-
[16:12:48.104] waygraph pilot: stub.after ring .cart_item tone=success label="Cart items"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
[16:13:18.032] waygraph pilot: stub.before ctx.title("Signing in · mobile")
|
|
2
|
-
[16:13:18.033] waygraph pilot: stub.before ctx.todos n=6 index=0
|
|
3
|
-
[16:13:18.033] waygraph pilot: stub.before ctx.device(mobile)
|
|
4
|
-
[16:13:18.033] waygraph pilot: stub.before ctx.zoom(1.35)
|
|
5
|
-
[16:13:18.033] waygraph pilot: stub.before ring #user-name tone=info label="Username"
|
|
6
|
-
[16:13:19.279] waygraph pilot: stub.after ctx.todos n=6 index=1
|
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
import { chromium } from "@playwright/test";
|
|
2
|
-
import { join, dirname } from "node:path";
|
|
3
|
-
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
4
|
-
import { createRequire } from "node:module";
|
|
5
|
-
|
|
6
|
-
const require = createRequire(import.meta.url);
|
|
7
|
-
const tsxEsm = require.resolve("tsx/esm");
|
|
8
|
-
await import(tsxEsm);
|
|
9
|
-
|
|
10
|
-
const { buildExploreContext, buildExploreMenu } = await import(
|
|
11
|
-
pathToFileURL(join(dirname(fileURLToPath(import.meta.url)), "../../../dist/auto-explore.js")).href
|
|
12
|
-
);
|
|
13
|
-
const { locate } = await import(
|
|
14
|
-
pathToFileURL(join(dirname(fileURLToPath(import.meta.url)), "../../../dist/index.js")).href
|
|
15
|
-
);
|
|
16
|
-
|
|
17
|
-
const projectDir = join(dirname(fileURLToPath(import.meta.url)), "..");
|
|
18
|
-
const outDir = join(projectDir, "../../.tmp/waygraph-auto");
|
|
19
|
-
const exe = process.env.CHROME_PATH || process.env.CHROMIUM_PATH;
|
|
20
|
-
|
|
21
|
-
const PANEL_CSS =
|
|
22
|
-
"#wg-auto-panel{position:fixed;z-index:2147483647;left:50%;bottom:12px;transform:translateX(-50%);" +
|
|
23
|
-
"max-width:min(92vw,720px);max-height:calc(100vh - 24px);overflow-y:auto;box-sizing:border-box;" +
|
|
24
|
-
"background:rgba(20,10,40,.94);color:#fff;border-radius:14px;padding:16px 20px;" +
|
|
25
|
-
"font:14px/1.4 system-ui,sans-serif;box-shadow:0 12px 30px rgba(0,0,0,.35);}" +
|
|
26
|
-
"#wg-auto-panel h3{margin:0 0 10px;font-size:16px;}" +
|
|
27
|
-
"#wg-auto-panel .wg-here{color:#c9a6ff;margin-bottom:12px;}" +
|
|
28
|
-
"#wg-auto-panel .wg-actions{display:flex;flex-direction:column;gap:8px;}" +
|
|
29
|
-
"#wg-auto-panel button.wg-act{text-align:left;padding:10px 12px;border-radius:10px;border:1px solid #5b3aa8;" +
|
|
30
|
-
"background:#2a1450;color:#fff;font:13px/1.3 system-ui,sans-serif;cursor:pointer;}" +
|
|
31
|
-
"#wg-auto-panel .wg-section{margin:12px 0 6px;font-size:11px;font-weight:700;color:#a78bfa;text-transform:uppercase;}" +
|
|
32
|
-
"#wg-auto-panel .wg-map{margin:8px 0 12px;padding:8px 10px;border-radius:8px;background:rgba(0,0,0,.25);font-size:11px;line-height:1.5;}" +
|
|
33
|
-
"#wg-auto-panel .wg-map .wg-cp{opacity:.55;}#wg-auto-panel .wg-map .wg-cp-here{color:#fff;opacity:1;font-weight:700;}";
|
|
34
|
-
|
|
35
|
-
function esc(s) {
|
|
36
|
-
return s.replace(/&/g, "&").replace(/</g, "<").replace(/"/g, """);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
function panelHtml(menu, nodeNames, library) {
|
|
40
|
-
const here = menu.here;
|
|
41
|
-
const hereLabel = here ?? "Unknown — pick Start here";
|
|
42
|
-
const chips = nodeNames
|
|
43
|
-
.map((cp) => {
|
|
44
|
-
const cls = cp === here ? "wg-cp wg-cp-here" : "wg-cp";
|
|
45
|
-
return `<span class="${cls}">${esc(cp)}${cp === here ? " (here)" : ""}</span>`;
|
|
46
|
-
})
|
|
47
|
-
.join(" · ");
|
|
48
|
-
let html =
|
|
49
|
-
`<style>${PANEL_CSS}</style><div id="wg-auto-panel">` +
|
|
50
|
-
`<h3>waygraph auto</h3><div class="wg-here">You are here: <strong>${esc(hereLabel)}</strong></div>` +
|
|
51
|
-
`<div class="wg-actions">`;
|
|
52
|
-
for (const section of menu.sections) {
|
|
53
|
-
html += `<div class="wg-section">${esc(section.title)}</div>`;
|
|
54
|
-
for (const c of section.edges) {
|
|
55
|
-
const entry = library.get(c.block);
|
|
56
|
-
const desc = entry?.description ? `<br><span style="opacity:.85">${esc(entry.description)}</span>` : "";
|
|
57
|
-
html +=
|
|
58
|
-
`<button class="wg-act"><span class="wg-kind">${esc(c.kind)}</span> ` +
|
|
59
|
-
`<strong>${esc(c.block)}</strong> → ${esc(c.to)}${desc}</button>`;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
html += `</div><div class="wg-map"><strong>Screens:</strong> ${chips}</div></div>`;
|
|
63
|
-
return html;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
async function capture(label, page, menu, nodeNames, library) {
|
|
67
|
-
await page.evaluate((inner) => {
|
|
68
|
-
let host = document.getElementById("wg-auto-host");
|
|
69
|
-
if (!host) {
|
|
70
|
-
host = document.createElement("div");
|
|
71
|
-
host.id = "wg-auto-host";
|
|
72
|
-
document.documentElement.appendChild(host);
|
|
73
|
-
}
|
|
74
|
-
host.innerHTML = inner;
|
|
75
|
-
}, panelHtml(menu, nodeNames, library));
|
|
76
|
-
const path = join(outDir, `headful-${label}.png`);
|
|
77
|
-
await page.screenshot({ path, fullPage: false });
|
|
78
|
-
console.log(path);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
const { graph, library } = await buildExploreContext(projectDir);
|
|
82
|
-
const nodeNames = graph.nodes.map((n) => n.checkpoint);
|
|
83
|
-
const navTags = library.navBlocks.map((n) => n.block);
|
|
84
|
-
|
|
85
|
-
const browser = await chromium.launch({
|
|
86
|
-
headless: true,
|
|
87
|
-
...(exe ? { executablePath: exe, args: ["--no-sandbox", "--disable-dev-shm-usage"] } : {}),
|
|
88
|
-
});
|
|
89
|
-
const context = await browser.newContext({
|
|
90
|
-
viewport: { width: 1280, height: 900 },
|
|
91
|
-
baseURL: "https://www.saucedemo.com",
|
|
92
|
-
});
|
|
93
|
-
const page = await context.newPage();
|
|
94
|
-
await page.goto("/", { waitUntil: "load" });
|
|
95
|
-
|
|
96
|
-
async function hereNow(p) {
|
|
97
|
-
const path = new URL(p.url()).pathname;
|
|
98
|
-
if (path.includes("inventory.html") && !path.includes("inventory-item")) return "LoggedIn";
|
|
99
|
-
if (path.includes("inventory-item.html")) return "ItemDetailPage";
|
|
100
|
-
if (path.includes("cart.html")) return "CartPage";
|
|
101
|
-
if (path === "/" || path === "") {
|
|
102
|
-
if (await p.locator("#login-button").isVisible({ timeout: 500 }).catch(() => false)) return "LoginPage";
|
|
103
|
-
}
|
|
104
|
-
return locate(p, navTags, { timeoutMs: 1500 });
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
const here1 = await hereNow(page);
|
|
108
|
-
const menu1 = await buildExploreMenu(page, graph, library, here1);
|
|
109
|
-
await capture("login", page, menu1, nodeNames, library.byName);
|
|
110
|
-
|
|
111
|
-
await page.locator("#user-name").fill("standard_user");
|
|
112
|
-
await page.locator("#password").fill("secret_sauce");
|
|
113
|
-
await page.locator("#login-button").click();
|
|
114
|
-
await page.waitForURL(/inventory\.html/);
|
|
115
|
-
|
|
116
|
-
const here2 = await hereNow(page);
|
|
117
|
-
const menu2 = await buildExploreMenu(page, graph, library, here2);
|
|
118
|
-
await capture("logged-in", page, menu2, nodeNames, library.byName);
|
|
119
|
-
|
|
120
|
-
await browser.close();
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
import { chromium } from "@playwright/test";
|
|
2
|
-
import { join, dirname } from "node:path";
|
|
3
|
-
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
4
|
-
import { createRequire } from "node:module";
|
|
5
|
-
|
|
6
|
-
const require = createRequire(import.meta.url);
|
|
7
|
-
await import(require.resolve("tsx/esm"));
|
|
8
|
-
|
|
9
|
-
const root = join(dirname(fileURLToPath(import.meta.url)), "..");
|
|
10
|
-
const outDir = join(root, "../../.tmp/waygraph-auto");
|
|
11
|
-
const waygraphDist = join(root, "../../dist");
|
|
12
|
-
|
|
13
|
-
const { buildExploreContext, buildExploreMenu } = await import(
|
|
14
|
-
pathToFileURL(join(waygraphDist, "auto-explore.js")).href
|
|
15
|
-
);
|
|
16
|
-
const { Engine, start, end, MemPage } = await import(pathToFileURL(join(waygraphDist, "index.js")).href);
|
|
17
|
-
|
|
18
|
-
const exe = process.env.CHROME_PATH || process.env.CHROMIUM_PATH;
|
|
19
|
-
|
|
20
|
-
const PANEL_CSS =
|
|
21
|
-
"#wg-auto-panel{position:fixed;z-index:2147483647;left:50%;bottom:12px;transform:translateX(-50%);" +
|
|
22
|
-
"max-width:min(92vw,720px);max-height:calc(100vh - 24px);overflow-y:auto;box-sizing:border-box;" +
|
|
23
|
-
"background:rgba(20,10,40,.94);color:#fff;border-radius:14px;padding:16px 20px;" +
|
|
24
|
-
"font:14px/1.4 system-ui,sans-serif;box-shadow:0 12px 30px rgba(0,0,0,.35);}" +
|
|
25
|
-
"#wg-auto-panel h3{margin:0 0 10px;font-size:16px;}" +
|
|
26
|
-
"#wg-auto-panel .wg-here{color:#c9a6ff;margin-bottom:12px;}" +
|
|
27
|
-
"#wg-auto-panel .wg-actions{display:flex;flex-direction:column;gap:8px;}" +
|
|
28
|
-
"#wg-auto-panel button.wg-act{text-align:left;padding:10px 12px;border-radius:10px;border:1px solid #5b3aa8;" +
|
|
29
|
-
"background:#2a1450;color:#fff;font:13px/1.3 system-ui,sans-serif;cursor:pointer;}" +
|
|
30
|
-
"#wg-auto-panel .wg-section{margin:12px 0 6px;font-size:11px;font-weight:700;color:#a78bfa;text-transform:uppercase;}" +
|
|
31
|
-
"#wg-auto-panel .wg-map{margin:8px 0 12px;padding:8px 10px;border-radius:8px;background:rgba(0,0,0,.25);font-size:11px;line-height:1.5;}" +
|
|
32
|
-
"#wg-auto-panel .wg-map .wg-cp{opacity:.55;}#wg-auto-panel .wg-map .wg-cp-here{color:#fff;opacity:1;font-weight:700;}";
|
|
33
|
-
|
|
34
|
-
function esc(s) {
|
|
35
|
-
return s.replace(/&/g, "&").replace(/</g, "<").replace(/"/g, """);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function panelHtml(menu, nodeNames, library, note) {
|
|
39
|
-
const here = menu.here;
|
|
40
|
-
const hereLabel = here ?? "Unknown";
|
|
41
|
-
const chips = nodeNames
|
|
42
|
-
.map((cp) => {
|
|
43
|
-
const cls = cp === here ? "wg-cp wg-cp-here" : "wg-cp";
|
|
44
|
-
return `<span class="${cls}">${esc(cp)}${cp === here ? " (here)" : ""}</span>`;
|
|
45
|
-
})
|
|
46
|
-
.join(" · ");
|
|
47
|
-
let html =
|
|
48
|
-
`<style>${PANEL_CSS}</style><div id="wg-auto-panel">` +
|
|
49
|
-
`<h3>waygraph auto</h3>` +
|
|
50
|
-
(note ? `<div style="color:#fca5a5;margin-bottom:8px;font-size:12px">${esc(note)}</div>` : "") +
|
|
51
|
-
`<div class="wg-here">You are here: <strong>${esc(hereLabel)}</strong></div>` +
|
|
52
|
-
`<div class="wg-actions">`;
|
|
53
|
-
for (const section of menu.sections) {
|
|
54
|
-
html += `<div class="wg-section">${esc(section.title)}</div>`;
|
|
55
|
-
for (const c of section.edges) {
|
|
56
|
-
const entry = library.get(c.block);
|
|
57
|
-
const desc = entry?.description ? `<br><span style="opacity:.85">${esc(entry.description)}</span>` : "";
|
|
58
|
-
html +=
|
|
59
|
-
`<button class="wg-act"><span class="wg-kind">${esc(c.kind)}</span> ` +
|
|
60
|
-
`<strong>${esc(c.block)}</strong> → ${esc(c.to)}${desc}</button>`;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
html += `</div><div class="wg-map"><strong>Screens:</strong> ${chips}</div></div>`;
|
|
64
|
-
return html;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
async function paintPanel(page, menu, nodeNames, library, note) {
|
|
68
|
-
await page.evaluate((inner) => {
|
|
69
|
-
let host = document.getElementById("wg-auto-host");
|
|
70
|
-
if (!host) {
|
|
71
|
-
host = document.createElement("div");
|
|
72
|
-
host.id = "wg-auto-host";
|
|
73
|
-
document.documentElement.appendChild(host);
|
|
74
|
-
}
|
|
75
|
-
host.innerHTML = inner;
|
|
76
|
-
}, panelHtml(menu, nodeNames, library, note));
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
async function snap(page, name) {
|
|
80
|
-
const path = join(outDir, name);
|
|
81
|
-
await page.screenshot({ path, fullPage: false });
|
|
82
|
-
console.log(path);
|
|
83
|
-
return path;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
const { graph, library } = await buildExploreContext(root);
|
|
87
|
-
const nodeNames = graph.nodes.map((n) => n.checkpoint);
|
|
88
|
-
|
|
89
|
-
const { NavLoginBlock } = await import(pathToFileURL(join(root, "src/blocks/saucedemo-web/nav-login.block.js")).href);
|
|
90
|
-
const { FillUsernameBlock } = await import(
|
|
91
|
-
pathToFileURL(join(root, "src/blocks/saucedemo-web/methods/fill-username.method.block.js")).href
|
|
92
|
-
);
|
|
93
|
-
const { FillPasswordBlock } = await import(
|
|
94
|
-
pathToFileURL(join(root, "src/blocks/saucedemo-web/methods/fill-password.method.block.js")).href
|
|
95
|
-
);
|
|
96
|
-
const { SubmitLoginBlock } = await import(
|
|
97
|
-
pathToFileURL(join(root, "src/blocks/saucedemo-web/methods/submit-login.method.block.js")).href
|
|
98
|
-
);
|
|
99
|
-
const { LoginCreds } = await import(pathToFileURL(join(root, "src/states/checkout.mem-keys.js")).href);
|
|
100
|
-
|
|
101
|
-
const browser = await chromium.launch({
|
|
102
|
-
headless: true,
|
|
103
|
-
...(exe ? { executablePath: exe, args: ["--no-sandbox", "--disable-dev-shm-usage"] } : {}),
|
|
104
|
-
});
|
|
105
|
-
const context = await browser.newContext({
|
|
106
|
-
viewport: { width: 1280, height: 900 },
|
|
107
|
-
baseURL: "https://www.saucedemo.com",
|
|
108
|
-
});
|
|
109
|
-
const page = await context.newPage();
|
|
110
|
-
const engine = new Engine({ headless: true });
|
|
111
|
-
const mem = new MemPage();
|
|
112
|
-
|
|
113
|
-
await page.goto("/", { waitUntil: "load" });
|
|
114
|
-
|
|
115
|
-
const menuBefore = await buildExploreMenu(page, graph, library, "LoginPage");
|
|
116
|
-
await paintPanel(page, menuBefore, nodeNames, library.byName, "Mem: standard_user / wrong-password (intentional)");
|
|
117
|
-
await snap(page, "wrong-login-1-before.png");
|
|
118
|
-
|
|
119
|
-
mem.set(LoginCreds({ username: "standard_user", password: "wrong-password" }));
|
|
120
|
-
const flow = engine.defineFlow([start, NavLoginBlock, FillUsernameBlock, FillPasswordBlock, SubmitLoginBlock, end]);
|
|
121
|
-
const runOut = await flow.run(context, mem, { page, closeOnFinish: false });
|
|
122
|
-
const result = runOut && typeof runOut === "object" && "result" in runOut ? runOut.result : runOut;
|
|
123
|
-
|
|
124
|
-
if (result.__state !== "LoginPage") {
|
|
125
|
-
throw new Error(`expected LoginPage after bad password, got ${result?.__state}`);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
await page.locator('[data-test="error"]').waitFor({ state: "visible" });
|
|
129
|
-
|
|
130
|
-
const menuAfter = await buildExploreMenu(page, graph, library, "LoginPage");
|
|
131
|
-
await paintPanel(
|
|
132
|
-
page,
|
|
133
|
-
menuAfter,
|
|
134
|
-
nodeNames,
|
|
135
|
-
library.byName,
|
|
136
|
-
"submit-login finished → LoginPage (branch on auth failure, not LoggedIn)",
|
|
137
|
-
);
|
|
138
|
-
await snap(page, "wrong-login-2-after.png");
|
|
139
|
-
|
|
140
|
-
console.log("PASS: wrong password stayed on LoginPage with error banner");
|
|
141
|
-
await browser.close();
|
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Headed visual demo: mobile -> tablet -> desktop with toast + seamless lerp.
|
|
3
|
-
* Usage (from examples/saucedemo): WG_DEVICE_HOLD_MS=5000 node scripts/demo-device-presets.mjs
|
|
4
|
-
*/
|
|
5
|
-
import { chromium } from "playwright";
|
|
6
|
-
import { mkdirSync } from "node:fs";
|
|
7
|
-
import { join, dirname } from "node:path";
|
|
8
|
-
import { fileURLToPath } from "node:url";
|
|
9
|
-
|
|
10
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
11
|
-
const outDir = join(__dirname, "../.tmp/device-demo");
|
|
12
|
-
mkdirSync(outDir, { recursive: true });
|
|
13
|
-
|
|
14
|
-
const PRESETS = {
|
|
15
|
-
mobile: {
|
|
16
|
-
preset: "mobile",
|
|
17
|
-
viewport: { width: 390, height: 844 },
|
|
18
|
-
touchMode: true,
|
|
19
|
-
title: "Now in mobile mode",
|
|
20
|
-
},
|
|
21
|
-
tablet: {
|
|
22
|
-
preset: "tablet",
|
|
23
|
-
viewport: { width: 768, height: 1024 },
|
|
24
|
-
touchMode: true,
|
|
25
|
-
title: "Now in tablet mode",
|
|
26
|
-
},
|
|
27
|
-
desktop: {
|
|
28
|
-
preset: "desktop",
|
|
29
|
-
viewport: { width: 1280, height: 720 },
|
|
30
|
-
touchMode: false,
|
|
31
|
-
title: "Back to desktop",
|
|
32
|
-
},
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
const CSS = `
|
|
36
|
-
#wg-device-toast{position:fixed;z-index:2147483647;top:14px;right:14px;
|
|
37
|
-
display:flex;align-items:center;gap:10px;min-width:200px;max-width:min(92vw,320px);
|
|
38
|
-
padding:12px 14px;border-radius:14px;background:rgba(20,10,40,.96);color:#f0e8ff;
|
|
39
|
-
border:1px solid rgba(124,58,237,.55);box-shadow:0 10px 28px rgba(0,0,0,.4);
|
|
40
|
-
font:600 13px/1.35 system-ui,sans-serif;pointer-events:none;
|
|
41
|
-
opacity:0;transform:translateX(18px) scale(.96);
|
|
42
|
-
transition:opacity .35s ease,transform .45s cubic-bezier(.22,1,.36,1);}
|
|
43
|
-
#wg-device-toast.wg-in{opacity:1;transform:translateX(0) scale(1);}
|
|
44
|
-
#wg-device-toast.wg-out{opacity:0;transform:translateX(12px) scale(.98);}
|
|
45
|
-
#wg-device-toast[data-preset=mobile]{border-color:#3B82F6;}
|
|
46
|
-
#wg-device-toast[data-preset=tablet]{border-color:#22C55E;}
|
|
47
|
-
#wg-device-toast[data-preset=desktop]{border-color:#9CA3AF;}
|
|
48
|
-
#wg-device-toast .wg-dev-icon{flex:0 0 auto;width:36px;height:36px;border-radius:10px;
|
|
49
|
-
display:flex;align-items:center;justify-content:center;background:rgba(124,58,237,.28);}
|
|
50
|
-
#wg-device-toast[data-preset=mobile] .wg-dev-icon{background:rgba(59,130,246,.28);}
|
|
51
|
-
#wg-device-toast[data-preset=tablet] .wg-dev-icon{background:rgba(34,197,94,.28);}
|
|
52
|
-
#wg-device-toast[data-preset=desktop] .wg-dev-icon{background:rgba(156,163,175,.28);}
|
|
53
|
-
#wg-device-toast .wg-dev-icon svg{width:22px;height:22px;display:block;}
|
|
54
|
-
#wg-device-toast .wg-dev-title{font:800 13px/1.2 system-ui,sans-serif;color:#fff;}
|
|
55
|
-
#wg-device-toast .wg-dev-sub{margin-top:3px;font:600 11px/1.3 system-ui,sans-serif;color:#c9a6ff;}
|
|
56
|
-
#wg-device-badge{position:fixed;z-index:2147483646;top:14px;right:14px;
|
|
57
|
-
display:inline-flex;align-items:center;gap:6px;padding:6px 10px 6px 8px;
|
|
58
|
-
border-radius:999px;background:rgba(20,10,40,.92);color:#f0e8ff;
|
|
59
|
-
border:1px solid rgba(124,58,237,.5);font:700 11px/1.2 system-ui,sans-serif;
|
|
60
|
-
letter-spacing:.04em;text-transform:uppercase;pointer-events:none;
|
|
61
|
-
box-shadow:0 4px 14px rgba(0,0,0,.3);opacity:0;transition:opacity .3s ease;}
|
|
62
|
-
#wg-device-badge.wg-in{opacity:1;}
|
|
63
|
-
#wg-device-badge[data-preset=mobile]{border-color:#3B82F6;}
|
|
64
|
-
#wg-device-badge[data-preset=tablet]{border-color:#22C55E;}
|
|
65
|
-
#wg-device-badge .wg-dev-icon svg{width:14px;height:14px;display:block;}
|
|
66
|
-
`;
|
|
67
|
-
|
|
68
|
-
const ICONS = {
|
|
69
|
-
mobile:
|
|
70
|
-
'<svg viewBox="0 0 24 24" fill="none" stroke="#fff" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><rect x="7" y="2.5" width="10" height="19" rx="2.2"/><circle cx="12" cy="18.2" r="1.1" fill="#fff" stroke="none"/></svg>',
|
|
71
|
-
tablet:
|
|
72
|
-
'<svg viewBox="0 0 24 24" fill="none" stroke="#fff" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><rect x="3.5" y="4" width="17" height="16" rx="2"/><circle cx="12" cy="17.2" r="1" fill="#fff" stroke="none"/></svg>',
|
|
73
|
-
desktop:
|
|
74
|
-
'<svg viewBox="0 0 24 24" fill="none" stroke="#fff" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><rect x="2.5" y="3.5" width="19" height="12.5" rx="1.5"/><path d="M8 20h8M12 16v4"/></svg>',
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
async function lerpViewport(page, to, ms = 520) {
|
|
78
|
-
const from = page.viewportSize() || { width: 1280, height: 720 };
|
|
79
|
-
const steps = 14;
|
|
80
|
-
const stepMs = Math.max(12, Math.floor(ms / steps));
|
|
81
|
-
for (let i = 1; i <= steps; i++) {
|
|
82
|
-
const t = i / steps;
|
|
83
|
-
const e = t * t * (3 - 2 * t);
|
|
84
|
-
await page.setViewportSize({
|
|
85
|
-
width: Math.round(from.width + (to.width - from.width) * e),
|
|
86
|
-
height: Math.round(from.height + (to.height - from.height) * e),
|
|
87
|
-
});
|
|
88
|
-
if (i < steps) await page.waitForTimeout(stepMs);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
async function applyPreset(page, key) {
|
|
93
|
-
const d = PRESETS[key];
|
|
94
|
-
await lerpViewport(page, d.viewport, 520);
|
|
95
|
-
await page.evaluate(
|
|
96
|
-
({ d, css, icons, key }) => {
|
|
97
|
-
let style = document.getElementById("wg-device-demo-style");
|
|
98
|
-
if (!style) {
|
|
99
|
-
style = document.createElement("style");
|
|
100
|
-
style.id = "wg-device-demo-style";
|
|
101
|
-
style.textContent = css;
|
|
102
|
-
document.documentElement.appendChild(style);
|
|
103
|
-
}
|
|
104
|
-
let toast = document.getElementById("wg-device-toast");
|
|
105
|
-
if (toast && toast._wgTimer) clearTimeout(toast._wgTimer);
|
|
106
|
-
if (!toast) {
|
|
107
|
-
toast = document.createElement("div");
|
|
108
|
-
toast.id = "wg-device-toast";
|
|
109
|
-
document.documentElement.appendChild(toast);
|
|
110
|
-
}
|
|
111
|
-
const badge = document.getElementById("wg-device-badge");
|
|
112
|
-
if (badge) badge.classList.remove("wg-in");
|
|
113
|
-
toast.dataset.preset = d.preset;
|
|
114
|
-
const sub =
|
|
115
|
-
d.viewport.width +
|
|
116
|
-
"\u00d7" +
|
|
117
|
-
d.viewport.height +
|
|
118
|
-
(d.touchMode ? " \u00b7 touch" : " \u00b7 mouse");
|
|
119
|
-
toast.innerHTML =
|
|
120
|
-
'<span class="wg-dev-icon">' +
|
|
121
|
-
icons[d.preset] +
|
|
122
|
-
'</span><span class="wg-dev-copy"><div class="wg-dev-title">' +
|
|
123
|
-
d.title +
|
|
124
|
-
'</div><div class="wg-dev-sub">' +
|
|
125
|
-
sub +
|
|
126
|
-
"</div></span>";
|
|
127
|
-
toast.classList.remove("wg-out");
|
|
128
|
-
void toast.offsetWidth;
|
|
129
|
-
toast.classList.add("wg-in");
|
|
130
|
-
toast._wgTimer = setTimeout(() => {
|
|
131
|
-
toast.classList.add("wg-out");
|
|
132
|
-
toast.classList.remove("wg-in");
|
|
133
|
-
setTimeout(() => {
|
|
134
|
-
if (d.preset === "desktop" && !d.touchMode) {
|
|
135
|
-
const b = document.getElementById("wg-device-badge");
|
|
136
|
-
if (b) b.remove();
|
|
137
|
-
return;
|
|
138
|
-
}
|
|
139
|
-
let chip = document.getElementById("wg-device-badge");
|
|
140
|
-
if (!chip) {
|
|
141
|
-
chip = document.createElement("div");
|
|
142
|
-
chip.id = "wg-device-badge";
|
|
143
|
-
document.documentElement.appendChild(chip);
|
|
144
|
-
}
|
|
145
|
-
chip.dataset.preset = d.preset;
|
|
146
|
-
chip.innerHTML =
|
|
147
|
-
'<span class="wg-dev-icon">' +
|
|
148
|
-
icons[d.preset] +
|
|
149
|
-
'</span><span>' +
|
|
150
|
-
d.preset +
|
|
151
|
-
" \u00b7 remain</span>";
|
|
152
|
-
chip.classList.add("wg-in");
|
|
153
|
-
}, 380);
|
|
154
|
-
}, 2200);
|
|
155
|
-
},
|
|
156
|
-
{ d, css: CSS, icons: ICONS, key },
|
|
157
|
-
);
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
const holdMs = Number(process.env.WG_DEVICE_HOLD_MS || 4500);
|
|
161
|
-
const executablePath = process.env.CHROME_PATH || process.env.CHROMIUM_PATH || undefined;
|
|
162
|
-
|
|
163
|
-
const browser = await chromium.launch({
|
|
164
|
-
headless: false,
|
|
165
|
-
...(executablePath ? { executablePath } : {}),
|
|
166
|
-
});
|
|
167
|
-
const context = await browser.newContext({
|
|
168
|
-
hasTouch: true,
|
|
169
|
-
viewport: { width: 1280, height: 720 },
|
|
170
|
-
});
|
|
171
|
-
const page = await context.newPage();
|
|
172
|
-
await page.goto("https://www.saucedemo.com/", { waitUntil: "domcontentloaded" });
|
|
173
|
-
|
|
174
|
-
const shots = [];
|
|
175
|
-
for (const key of ["mobile", "tablet", "desktop"]) {
|
|
176
|
-
console.log("device demo:", key);
|
|
177
|
-
await applyPreset(page, key);
|
|
178
|
-
await page.waitForTimeout(900);
|
|
179
|
-
const shot = join(outDir, `device-${key}.png`);
|
|
180
|
-
await page.screenshot({ path: shot, fullPage: false });
|
|
181
|
-
shots.push(shot);
|
|
182
|
-
console.log(" shot:", shot);
|
|
183
|
-
await page.waitForTimeout(holdMs);
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
console.log("DEVICE_DEMO_DONE", JSON.stringify(shots));
|
|
187
|
-
await page.waitForTimeout(1500);
|
|
188
|
-
await browser.close();
|