waygraph 0.15.49 → 0.15.51
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/map-check.js +5 -2
- package/dist/analysis/practices-check.js +17 -4
- package/dist/auto-session/session.js +3 -2
- package/dist/browser-path.d.ts +5 -0
- package/dist/browser-path.js +18 -0
- package/dist/cli/flags.d.ts +7 -5
- package/dist/cli/flags.js +9 -32
- package/dist/cli/run-chain.js +2 -1
- package/dist/commands/check.js +1 -1
- package/dist/commands/init.js +5 -0
- package/dist/commands/run.js +4 -4
- package/dist/commands/session.js +7 -7
- package/dist/config.d.ts +34 -0
- package/dist/config.js +94 -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 +0 -3
- package/dist/core/blocks/page.d.ts +0 -3
- package/dist/core/flow.js +3 -6
- package/dist/env-file.d.ts +10 -0
- package/dist/env-file.js +58 -0
- package/dist/highlights/types.d.ts +9 -8
- package/dist/index.d.ts +5 -0
- package/dist/index.js +3 -0
- package/dist/runner/inpage/banner.js +10 -2
- package/dist/runner/inpage/caption.js +2 -2
- package/dist/runner/main.js +10 -6
- package/dist/session/auto-explore-run.d.ts +4 -1
- package/dist/session/auto-explore-run.js +18 -28
- package/dist/traverse/run.js +4 -22
- package/dist/types.d.ts +0 -3
- package/dist/webserver.d.ts +14 -0
- package/dist/webserver.js +91 -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 +5 -3
- package/templates/scaffold/STRUCTURE.md +3 -4
- package/templates/scaffold/package.json +8 -12
- package/templates/scaffold/playwright.config.ts +2 -18
- package/templates/scaffold/src/flows/shop.flow.ts +42 -27
- package/templates/scaffold/src/map/(app_base)/docs/_nav.block.ts +1 -1
- 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 +12 -13
- package/templates/scaffold/src/map/(app_base)/home/_methods/assert-hello.method.block.ts +19 -22
- package/templates/scaffold/src/map/(app_base)/home/_methods/clear-cart.method.block.ts +7 -8
- package/templates/scaffold/src/map/(app_base)/home/_methods/remove-item.effect.block.ts +4 -8
- package/templates/scaffold/src/map/(app_base)/home/_nav.block.ts +10 -10
- package/templates/scaffold/src/map/(app_base)/home/_sel.ts +2 -4
- package/templates/scaffold/src/map/(app_base)/index.html +17 -0
- package/templates/scaffold/src/states/demo.states.ts +2 -0
- package/templates/scaffold/tests/README.md +3 -2
- package/templates/scaffold/tsconfig.json +1 -1
- package/templates/skills/waygraph-convention.skill.md +5 -3
- package/templates/skills/waygraph-pilot.skill.md +1 -1
- 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/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/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/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/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/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/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/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/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/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
|
@@ -6,6 +6,7 @@ import { chromium } from "@playwright/test";
|
|
|
6
6
|
import { join, dirname } from "node:path";
|
|
7
7
|
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
8
8
|
import { createRequire } from "node:module";
|
|
9
|
+
import { chromiumExecutablePath } from "waygraph";
|
|
9
10
|
|
|
10
11
|
const require = createRequire(import.meta.url);
|
|
11
12
|
await import(require.resolve("tsx/esm"));
|
|
@@ -18,7 +19,7 @@ const { buildExploreContext, buildExploreMenu } = await import(
|
|
|
18
19
|
);
|
|
19
20
|
const { MemPage, Engine, start, end } = await import(pathToFileURL(join(waygraphDist, "index.js")).href);
|
|
20
21
|
|
|
21
|
-
const exe =
|
|
22
|
+
const exe = chromiumExecutablePath();
|
|
22
23
|
|
|
23
24
|
async function runBlock(engine, entry, context, page, mem) {
|
|
24
25
|
const flow = engine.defineFlow([start, entry.block, end]);
|
|
@@ -2,6 +2,7 @@ import { chromium } from "@playwright/test";
|
|
|
2
2
|
import { join, dirname } from "node:path";
|
|
3
3
|
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
4
4
|
import { createRequire } from "node:module";
|
|
5
|
+
import { chromiumExecutablePath } from "waygraph";
|
|
5
6
|
|
|
6
7
|
const require = createRequire(import.meta.url);
|
|
7
8
|
await import(require.resolve("tsx/esm"));
|
|
@@ -15,7 +16,7 @@ const { buildExploreContext, buildExploreMenu } = await import(
|
|
|
15
16
|
);
|
|
16
17
|
const { locate, MemPage, Engine, start, end } = await import(pathToFileURL(join(waygraphDist, "index.js")).href);
|
|
17
18
|
|
|
18
|
-
const exe =
|
|
19
|
+
const exe = chromiumExecutablePath();
|
|
19
20
|
|
|
20
21
|
async function snap(page, name) {
|
|
21
22
|
const path = join(outDir, `graph-proof-${name}.png`);
|
|
@@ -6,6 +6,7 @@ import { chromium } from "@playwright/test";
|
|
|
6
6
|
import { join, dirname } from "node:path";
|
|
7
7
|
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
8
8
|
import { createRequire } from "node:module";
|
|
9
|
+
import { chromiumExecutablePath } from "waygraph";
|
|
9
10
|
|
|
10
11
|
const require = createRequire(import.meta.url);
|
|
11
12
|
await import(require.resolve("tsx/esm"));
|
|
@@ -25,7 +26,7 @@ const { SubmitLoginBlock } = await import(
|
|
|
25
26
|
);
|
|
26
27
|
const { LoginCreds } = await import(pathToFileURL(join(root, "src/states/checkout.mem-keys.js")).href);
|
|
27
28
|
|
|
28
|
-
const exe =
|
|
29
|
+
const exe = chromiumExecutablePath();
|
|
29
30
|
const baseURL = "https://www.saucedemo.com";
|
|
30
31
|
|
|
31
32
|
console.log("RUNTIME: headless browser (wrong password test)...");
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { test, expect } from "@playwright/test";
|
|
2
2
|
import { MemPage, checkpoint, Trait } from "waygraph";
|
|
3
3
|
import { checkoutFlow } from "../src/flows/checkout.flow.js";
|
|
4
|
-
import { FfOwnerAuthBlock } from "../src/blocks/saucedemo-web/ff-owner-auth.block.js";
|
|
5
4
|
import { LoginCreds, SelectedItem } from "../src/states/checkout.mem-keys.js";
|
|
6
5
|
|
|
7
6
|
// checkoutFlow.withBlockVerify/modBlockVerify - a spec that only imports the
|
|
@@ -31,12 +30,8 @@ test("withBlockVerify: replacing login's verify with an extra real check still p
|
|
|
31
30
|
mem.set(LoginCreds({ username: "standard_user", password: "secret_sauce" }));
|
|
32
31
|
mem.set(SelectedItem({ id: "sauce-labs-backpack", name: "Sauce Labs Backpack" }));
|
|
33
32
|
|
|
34
|
-
//
|
|
35
|
-
|
|
36
|
-
// drives login through the ff-owner-auth FFCompose step (collapsed
|
|
37
|
-
// nav-login + fill-username + fill-password + submit-login), not a bare
|
|
38
|
-
// SubmitLoginBlock reference, so that's the Block whose verify this patches.
|
|
39
|
-
const patched = checkoutFlow.withBlockVerify(FfOwnerAuthBlock, [
|
|
33
|
+
// checkoutFlow's login steps are one inline `{ ff: true }` group, auto-named "ff-1".
|
|
34
|
+
const patched = checkoutFlow.withBlockVerify("ff-1", [
|
|
40
35
|
Trait.url({ pathname: "/inventory.html" }),
|
|
41
36
|
Trait.visible(".inventory_list"),
|
|
42
37
|
]);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "waygraph",
|
|
3
|
-
"version": "0.15.
|
|
3
|
+
"version": "0.15.51",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "A typed graph of reusable Blocks for driving a browser through E2E flows.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -30,7 +30,15 @@
|
|
|
30
30
|
"!examples/**/.waygraph-traverse/**",
|
|
31
31
|
"!examples/**/.waygraph-videos",
|
|
32
32
|
"!examples/**/.waygraph-videos/**",
|
|
33
|
-
"!**/*.webm"
|
|
33
|
+
"!**/*.webm",
|
|
34
|
+
"!**/.waygraph-auto",
|
|
35
|
+
"!**/.waygraph-auto/**",
|
|
36
|
+
"!**/test-results",
|
|
37
|
+
"!**/test-results/**",
|
|
38
|
+
"!**/playwright-report",
|
|
39
|
+
"!**/playwright-report/**",
|
|
40
|
+
"!**/.waygraph-chain-*.mjs",
|
|
41
|
+
"!**/*.log"
|
|
34
42
|
],
|
|
35
43
|
"repository": {
|
|
36
44
|
"type": "git",
|
|
@@ -10,11 +10,5 @@ export default defineConfig({
|
|
|
10
10
|
headless: true,
|
|
11
11
|
baseURL: "https://www.saucedemo.com",
|
|
12
12
|
trace: "retain-on-failure",
|
|
13
|
-
launchOptions: {
|
|
14
|
-
// Canonical Chromium on this machine is the Flatpak install - never let
|
|
15
|
-
// Playwright download its own bundled binary. See .agent/manager-agent.md.
|
|
16
|
-
executablePath: process.env.CHROME_PATH || process.env.CHROMIUM_PATH,
|
|
17
|
-
args: ["--no-sandbox", "--disable-dev-shm-usage"],
|
|
18
|
-
},
|
|
19
13
|
},
|
|
20
14
|
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# __PROJECT_NAME__
|
|
2
2
|
|
|
3
3
|
A waygraph project on the **Waygraph Map** layout: `src/map/` folders mirror your app's URLs.
|
|
4
|
-
Runs fully offline -
|
|
4
|
+
Runs fully offline - the demo pages open directly via `file://`, no server or network needed.
|
|
5
5
|
|
|
6
6
|
## Run it
|
|
7
7
|
|
|
@@ -24,7 +24,9 @@ one Block per action, flows in `src/flows/`.
|
|
|
24
24
|
|
|
25
25
|
## Point it at your real app
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
Change each `_nav.block.ts`'s `url` from the local `file://` path to a real one, and set a real
|
|
28
|
+
`baseUrl` if your Nav Blocks use relative paths (`waygraph.config.ts`, a `.env`, or
|
|
29
|
+
`package.json`'s `"waygraph"` field - see the main docs' "Project config" section). Keep each
|
|
30
|
+
`src/map/` folder matching the URL it represents (`waygraph map` enforces this).
|
|
29
31
|
|
|
30
32
|
Docs: https://deviate-dv8.github.io/waygraph/
|
|
@@ -9,12 +9,12 @@ Next.js route groups) and never appear in a URL or Checkpoint name.
|
|
|
9
9
|
├── package.json
|
|
10
10
|
├── src/
|
|
11
11
|
│ ├── map/
|
|
12
|
-
│ │ ├── (app_base)/ # your app (
|
|
13
|
-
│ │ │ ├── home/ # URL /home
|
|
12
|
+
│ │ ├── (app_base)/ # your app (opened via file:// here)
|
|
13
|
+
│ │ │ ├── home/ # URL /home
|
|
14
14
|
│ │ │ │ ├── _nav.block.ts # how to get here
|
|
15
15
|
│ │ │ │ ├── _page.block.ts # "you have arrived" hub
|
|
16
16
|
│ │ │ │ ├── _sel.ts # every selector for this page
|
|
17
|
-
│ │ │ │ ├──
|
|
17
|
+
│ │ │ │ ├── index.html # offline fixture page
|
|
18
18
|
│ │ │ │ └── _methods/ # one action per Block
|
|
19
19
|
│ │ │ │ ├── add-item.effect.block.ts # + instanceOptions (auto menu)
|
|
20
20
|
│ │ │ │ ├── remove-item.effect.block.ts
|
|
@@ -25,7 +25,6 @@ Next.js route groups) and never appear in a URL or Checkpoint name.
|
|
|
25
25
|
│ │ └── (external)/mailpit/ # a different origin (mail catcher)
|
|
26
26
|
│ ├── states/ # Checkpoint types + mem keys
|
|
27
27
|
│ └── flows/ # example / shop / mail-verify
|
|
28
|
-
├── scripts/ # local fixture server
|
|
29
28
|
└── tests/example.spec.ts
|
|
30
29
|
```
|
|
31
30
|
|
|
@@ -7,22 +7,18 @@
|
|
|
7
7
|
"typecheck": "waygraph typecheck .",
|
|
8
8
|
"test": "waygraph test",
|
|
9
9
|
"test:ui": "waygraph test ui",
|
|
10
|
-
"fixture": "node scripts/fixture-server.mjs",
|
|
11
10
|
"list": "waygraph list",
|
|
12
11
|
"check": "waygraph check",
|
|
13
12
|
"graph": "waygraph graph",
|
|
14
13
|
"graph:mermaid": "waygraph graph --mermaid",
|
|
15
|
-
"auto": "
|
|
16
|
-
"auto:cli": "
|
|
17
|
-
"demo": "
|
|
18
|
-
"demo:auto-next": "
|
|
19
|
-
"demo:shop": "
|
|
20
|
-
"demo:shop:auto-next": "
|
|
21
|
-
"run": "
|
|
22
|
-
"run:shop": "
|
|
23
|
-
},
|
|
24
|
-
"waygraph": {
|
|
25
|
-
"baseUrl": "http://127.0.0.1:4177"
|
|
14
|
+
"auto": "waygraph auto",
|
|
15
|
+
"auto:cli": "waygraph auto --cli",
|
|
16
|
+
"demo": "waygraph demo --blocks exampleFlow",
|
|
17
|
+
"demo:auto-next": "waygraph demo --blocks exampleFlow --auto-next",
|
|
18
|
+
"demo:shop": "waygraph demo --blocks shopFlow",
|
|
19
|
+
"demo:shop:auto-next": "waygraph demo --blocks shopFlow --auto-next",
|
|
20
|
+
"run": "waygraph run --blocks exampleFlow",
|
|
21
|
+
"run:shop": "waygraph run --blocks shopFlow"
|
|
26
22
|
},
|
|
27
23
|
"dependencies": {
|
|
28
24
|
"waygraph": "^0.12.20"
|
|
@@ -1,28 +1,12 @@
|
|
|
1
1
|
import { defineConfig } from "@playwright/test";
|
|
2
2
|
|
|
3
|
-
const FIXTURE_PORT = process.env.WAYGRAPH_FIXTURE_PORT || "4177";
|
|
4
|
-
const FIXTURE_HOST = process.env.WAYGRAPH_FIXTURE_HOST || "127.0.0.1";
|
|
5
|
-
const FIXTURE_ORIGIN = `http://${FIXTURE_HOST}:${FIXTURE_PORT}`;
|
|
6
|
-
|
|
7
3
|
export default defineConfig({
|
|
8
4
|
testDir: "./tests",
|
|
9
5
|
fullyParallel: true,
|
|
10
6
|
reporter: [["list"], ["html", { open: "never" }]],
|
|
11
7
|
use: {
|
|
12
|
-
|
|
8
|
+
// Demo pages open via file:// - no server. Filled in by `waygraph init`.
|
|
9
|
+
baseURL: "__APP_BASE_URL__",
|
|
13
10
|
trace: "retain-on-failure",
|
|
14
|
-
launchOptions: {
|
|
15
|
-
executablePath: process.env.CHROME_PATH || process.env.CHROMIUM_PATH,
|
|
16
|
-
},
|
|
17
|
-
},
|
|
18
|
-
webServer: {
|
|
19
|
-
command: "node scripts/fixture-server.mjs",
|
|
20
|
-
url: `${FIXTURE_ORIGIN}/home.html`,
|
|
21
|
-
reuseExistingServer: !process.env.CI,
|
|
22
|
-
env: {
|
|
23
|
-
WAYGRAPH_FIXTURE_PORT: FIXTURE_PORT,
|
|
24
|
-
WAYGRAPH_FIXTURE_HOST: FIXTURE_HOST,
|
|
25
|
-
WAYGRAPH_FIXTURE_QUIET: "1",
|
|
26
|
-
},
|
|
27
11
|
},
|
|
28
12
|
});
|
|
@@ -5,21 +5,34 @@ import {
|
|
|
5
5
|
withTitle,
|
|
6
6
|
withHighlightFixtures,
|
|
7
7
|
withSessionReset,
|
|
8
|
+
withMemStub,
|
|
9
|
+
registerMemStub,
|
|
8
10
|
} from "waygraph";
|
|
9
11
|
import { NavHomeBlock } from "../map/(app_base)/home/_nav.block.js";
|
|
10
12
|
import { AddItemBlock } from "../map/(app_base)/home/_methods/add-item.effect.block.js";
|
|
11
13
|
import { AssertItemAddedBlock } from "../map/(app_base)/home/_methods/assert-item-added.method.block.js";
|
|
12
14
|
import { RemoveItemBlock } from "../map/(app_base)/home/_methods/remove-item.effect.block.js";
|
|
13
15
|
import { ClearCartBlock } from "../map/(app_base)/home/_methods/clear-cart.method.block.js";
|
|
16
|
+
import { SelectedItem } from "../states/demo.mem-keys.js";
|
|
14
17
|
import "../map/(app_base)/home/_page.block.js";
|
|
15
18
|
|
|
16
19
|
const engine = new Engine();
|
|
17
20
|
|
|
18
21
|
/**
|
|
19
|
-
*
|
|
20
|
-
*
|
|
22
|
+
* memStub: a real fixture row (`alpha`/`Alpha`), registered once so this Flow never needs
|
|
23
|
+
* --data at all. Still override-able - `--data '{"demo.selectedItem":{"id":"beta",...}}'`
|
|
24
|
+
* wins over this registration, same as any other memStub (see docs/REFERENCE.md's own
|
|
25
|
+
* "memStub - fake values for requires" section).
|
|
26
|
+
*/
|
|
27
|
+
registerMemStub(SelectedItem.key, () => ({ id: "alpha", name: "Alpha" }));
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Effect + Method demo. `requires: [SelectedItem.key]` (on `add-item`) is filled automatically
|
|
31
|
+
* by the memStub registration above - no --data needed. Override it with real data, or use
|
|
32
|
+
* `waygraph auto` which fills SelectedItem via instanceOptions instead:
|
|
21
33
|
*
|
|
22
|
-
* waygraph demo --blocks shopFlow
|
|
34
|
+
* waygraph demo --blocks shopFlow # memStub fills it
|
|
35
|
+
* waygraph demo --blocks shopFlow --data '{"demo.selectedItem":{"id":"beta","name":"Beta"}}'
|
|
23
36
|
* waygraph auto # after landing on home, pick Add Alpha / Add Beta / Remove ...
|
|
24
37
|
*
|
|
25
38
|
* Add -> assert it actually landed (mem-matched Remove button + cart count,
|
|
@@ -28,32 +41,34 @@ const engine = new Engine();
|
|
|
28
41
|
* Clear cart (bulk Method, `clear-cart`) - keeps both the per-item and bulk
|
|
29
42
|
* clear paths atomic and each wired into a real flow, not orphaned.
|
|
30
43
|
*/
|
|
31
|
-
export const shopFlow =
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
+
export const shopFlow = withMemStub(
|
|
45
|
+
withHighlightFixtures(
|
|
46
|
+
withTitle(
|
|
47
|
+
withSessionReset(
|
|
48
|
+
engine.defineFlow([
|
|
49
|
+
start,
|
|
50
|
+
NavHomeBlock,
|
|
51
|
+
AddItemBlock,
|
|
52
|
+
AssertItemAddedBlock,
|
|
53
|
+
RemoveItemBlock,
|
|
54
|
+
AddItemBlock,
|
|
55
|
+
ClearCartBlock,
|
|
56
|
+
end,
|
|
57
|
+
]),
|
|
58
|
+
),
|
|
59
|
+
"Scaffold: Shop (Effect + clear)",
|
|
44
60
|
),
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
duration: true,
|
|
61
|
+
{
|
|
62
|
+
"add-item": {
|
|
63
|
+
stubAfter: {
|
|
64
|
+
cart: {
|
|
65
|
+
label: "AC · item in cart",
|
|
66
|
+
detail: "Cart count bumped after Add.",
|
|
67
|
+
tag: "AC",
|
|
68
|
+
duration: true,
|
|
69
|
+
},
|
|
55
70
|
},
|
|
56
71
|
},
|
|
57
72
|
},
|
|
58
|
-
|
|
73
|
+
),
|
|
59
74
|
);
|
|
@@ -6,7 +6,7 @@ import { DocsSel, DOCS_URL } from "./_sel.js";
|
|
|
6
6
|
* Kind: Nav
|
|
7
7
|
* Route: (app_base)/docs/
|
|
8
8
|
*
|
|
9
|
-
* Same
|
|
9
|
+
* Same shape as home/ (its own file:// page, no server) - lives
|
|
10
10
|
* under (app_base), not (external). See docs/REFERENCE.md "Waygraph Map" and
|
|
11
11
|
* openspec/changes/waygraph-map. `(app_base)` is purely organizational
|
|
12
12
|
* (Next.js route-group style) - never part of the Checkpoint tag.
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
`http://${process.env.WAYGRAPH_FIXTURE_HOST || "127.0.0.1"}:${process.env.WAYGRAPH_FIXTURE_PORT || "4177"}/docs.html`;
|
|
1
|
+
// Relative to playwright.config.ts's baseURL (the (app_base) folder, set by `waygraph init`).
|
|
2
|
+
export const DOCS_URL = "docs/index.html";
|
|
4
3
|
|
|
5
4
|
export const DocsSel = {
|
|
6
5
|
heading: "#docs-heading",
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
defineEffectBlock,
|
|
3
3
|
checkpoint,
|
|
4
|
-
type Checkpoint,
|
|
5
4
|
type WaygraphInstanceOption,
|
|
6
5
|
} from "waygraph";
|
|
7
|
-
import type { ItemInCart } from "../../../../states/demo.states.js";
|
|
6
|
+
import type { CanAddItem, ItemInCart } from "../../../../states/demo.states.js";
|
|
8
7
|
import { SelectedItem } from "../../../../states/demo.mem-keys.js";
|
|
9
8
|
import { DemoSel } from "../_sel.js";
|
|
10
9
|
|
|
@@ -16,7 +15,7 @@ import { DemoSel } from "../_sel.js";
|
|
|
16
15
|
* Mutates one catalog row from mem. `waygraph auto` lists one "Add …" row per
|
|
17
16
|
* live Add button via instanceOptions.
|
|
18
17
|
*/
|
|
19
|
-
export const AddItemBlock = defineEffectBlock<
|
|
18
|
+
export const AddItemBlock = defineEffectBlock<CanAddItem, ItemInCart>({
|
|
20
19
|
name: "add-item",
|
|
21
20
|
description: "Adds the mem-selected catalog item to the cart.",
|
|
22
21
|
requires: [SelectedItem.key],
|
|
@@ -35,15 +34,6 @@ export const AddItemBlock = defineEffectBlock<Checkpoint<string>, ItemInCart>({
|
|
|
35
34
|
},
|
|
36
35
|
},
|
|
37
36
|
],
|
|
38
|
-
stubBefore: {
|
|
39
|
-
add: { selector: DemoSel.catalog, label: "Catalog" },
|
|
40
|
-
},
|
|
41
|
-
stubAfter: {
|
|
42
|
-
cart: { selector: DemoSel.cartCount, label: "Cart count", duration: true },
|
|
43
|
-
},
|
|
44
|
-
stubOnError: {
|
|
45
|
-
cart: { selector: DemoSel.cartCount, label: "Cart at failure", tag: "FAIL" },
|
|
46
|
-
},
|
|
47
37
|
},
|
|
48
38
|
async instanceOptions(page): Promise<readonly WaygraphInstanceOption[]> {
|
|
49
39
|
const buttons = page.locator("button.add:not([hidden])");
|
|
@@ -65,4 +55,13 @@ export const AddItemBlock = defineEffectBlock<Checkpoint<string>, ItemInCart>({
|
|
|
65
55
|
}
|
|
66
56
|
return out;
|
|
67
57
|
},
|
|
68
|
-
})
|
|
58
|
+
})
|
|
59
|
+
.stubBefore((ctx) => {
|
|
60
|
+
ctx.ring("add", { selector: DemoSel.catalog, label: "Catalog" });
|
|
61
|
+
})
|
|
62
|
+
.stubAfter((ctx) => {
|
|
63
|
+
ctx.ring("cart", { selector: DemoSel.cartCount, label: "Cart count", duration: true });
|
|
64
|
+
})
|
|
65
|
+
.stubOnError((ctx) => {
|
|
66
|
+
ctx.ring("cart", { selector: DemoSel.cartCount, label: "Cart at failure", tag: "FAIL" });
|
|
67
|
+
});
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { defineAssertBlock, Trait } from "waygraph";
|
|
2
|
+
import type { Home } from "../../../../states/demo.states.js";
|
|
2
3
|
import { DemoSel } from "../_sel.js";
|
|
3
4
|
|
|
4
5
|
/**
|
|
@@ -10,31 +11,12 @@ import { DemoSel } from "../_sel.js";
|
|
|
10
11
|
* act/resolve to accidentally do a second thing. Same-URL assert after nav,
|
|
11
12
|
* with stubs + fixtures + a YAP slide.
|
|
12
13
|
*/
|
|
13
|
-
export const AssertHelloBlock = defineAssertBlock({
|
|
14
|
+
export const AssertHelloBlock = defineAssertBlock<Home>({
|
|
14
15
|
name: "assert-hello",
|
|
15
16
|
description: "Confirms the hello heading is still visible after arrival.",
|
|
16
|
-
checkpoint: "
|
|
17
|
+
checkpoint: "Home",
|
|
17
18
|
waitForHeading: "Hello Waygraph",
|
|
18
19
|
verify: [Trait.text(DemoSel.title, "Hello Waygraph"), Trait.visible(DemoSel.sub)],
|
|
19
|
-
stubBefore: {
|
|
20
|
-
title: { selector: DemoSel.title, label: "Heading about to check" },
|
|
21
|
-
},
|
|
22
|
-
stubAfter: {
|
|
23
|
-
title: {
|
|
24
|
-
selector: DemoSel.title,
|
|
25
|
-
label: "Hello confirmed",
|
|
26
|
-
detail: "Offline scaffold proof point.",
|
|
27
|
-
duration: true,
|
|
28
|
-
},
|
|
29
|
-
sub: { selector: DemoSel.sub, label: "Subcopy", duration: 1500 },
|
|
30
|
-
},
|
|
31
|
-
stubOnError: {
|
|
32
|
-
title: {
|
|
33
|
-
selector: DemoSel.title,
|
|
34
|
-
label: "Heading at failure",
|
|
35
|
-
tag: "FAIL",
|
|
36
|
-
},
|
|
37
|
-
},
|
|
38
20
|
slides: [
|
|
39
21
|
{
|
|
40
22
|
caption: "Scaffold covers auto + narration",
|
|
@@ -43,4 +25,19 @@ export const AssertHelloBlock = defineAssertBlock({
|
|
|
43
25
|
duration: true,
|
|
44
26
|
},
|
|
45
27
|
],
|
|
46
|
-
})
|
|
28
|
+
})
|
|
29
|
+
.stubBefore((ctx) => {
|
|
30
|
+
ctx.ring("title", { selector: DemoSel.title, label: "Heading about to check" });
|
|
31
|
+
})
|
|
32
|
+
.stubAfter((ctx) => {
|
|
33
|
+
ctx.ring("title", {
|
|
34
|
+
selector: DemoSel.title,
|
|
35
|
+
label: "Hello confirmed",
|
|
36
|
+
detail: "Offline scaffold proof point.",
|
|
37
|
+
duration: true,
|
|
38
|
+
});
|
|
39
|
+
ctx.ring("sub", { selector: DemoSel.sub, label: "Subcopy", duration: 1500 });
|
|
40
|
+
})
|
|
41
|
+
.stubOnError((ctx) => {
|
|
42
|
+
ctx.ring("title", { selector: DemoSel.title, label: "Heading at failure", tag: "FAIL" });
|
|
43
|
+
});
|
|
@@ -21,12 +21,11 @@ export const ClearCartBlock = defineMethodBlock<ItemInCart, CartEmpty>({
|
|
|
21
21
|
},
|
|
22
22
|
resolve: () => checkpoint("CartEmpty"),
|
|
23
23
|
verify: [Trait.text(DemoSel.cartCount, "0")],
|
|
24
|
-
stubBefore: {
|
|
25
|
-
clear: { selector: DemoSel.clear, label: "Clear cart" },
|
|
26
|
-
},
|
|
27
|
-
stubAfter: {
|
|
28
|
-
cart: { selector: DemoSel.cartCount, label: "Empty cart", duration: true },
|
|
29
|
-
},
|
|
30
|
-
stubOnError: {},
|
|
31
24
|
},
|
|
32
|
-
})
|
|
25
|
+
})
|
|
26
|
+
.stubBefore((ctx) => {
|
|
27
|
+
ctx.ring("clear", { selector: DemoSel.clear, label: "Clear cart" });
|
|
28
|
+
})
|
|
29
|
+
.stubAfter((ctx) => {
|
|
30
|
+
ctx.ring("cart", { selector: DemoSel.cartCount, label: "Empty cart", duration: true });
|
|
31
|
+
});
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
defineEffectBlock,
|
|
3
3
|
checkpoint,
|
|
4
|
-
type Checkpoint,
|
|
5
4
|
type WaygraphInstanceOption,
|
|
6
5
|
} from "waygraph";
|
|
7
|
-
import type { CartEmpty } from "../../../../states/demo.states.js";
|
|
6
|
+
import type { CartEmpty, ItemInCart } from "../../../../states/demo.states.js";
|
|
8
7
|
import { SelectedItem } from "../../../../states/demo.mem-keys.js";
|
|
9
8
|
import { DemoSel } from "../_sel.js";
|
|
10
9
|
|
|
@@ -15,7 +14,7 @@ import { DemoSel } from "../_sel.js";
|
|
|
15
14
|
*
|
|
16
15
|
* Removes one in-cart row. Auto menus one row per visible Remove button.
|
|
17
16
|
*/
|
|
18
|
-
export const RemoveItemBlock = defineEffectBlock<
|
|
17
|
+
export const RemoveItemBlock = defineEffectBlock<ItemInCart, CartEmpty>({
|
|
19
18
|
name: "remove-item",
|
|
20
19
|
description: "Removes the mem-selected catalog item from the cart.",
|
|
21
20
|
requires: [SelectedItem.key],
|
|
@@ -34,11 +33,6 @@ export const RemoveItemBlock = defineEffectBlock<Checkpoint<string>, CartEmpty>(
|
|
|
34
33
|
},
|
|
35
34
|
},
|
|
36
35
|
],
|
|
37
|
-
stubBefore: {},
|
|
38
|
-
stubAfter: {
|
|
39
|
-
cart: { selector: DemoSel.cartCount, label: "Cart count", duration: true },
|
|
40
|
-
},
|
|
41
|
-
stubOnError: {},
|
|
42
36
|
},
|
|
43
37
|
async instanceOptions(page): Promise<readonly WaygraphInstanceOption[]> {
|
|
44
38
|
const buttons = page.locator("button.remove:not([hidden])");
|
|
@@ -60,4 +54,6 @@ export const RemoveItemBlock = defineEffectBlock<Checkpoint<string>, CartEmpty>(
|
|
|
60
54
|
}
|
|
61
55
|
return out;
|
|
62
56
|
},
|
|
57
|
+
}).stubAfter((ctx) => {
|
|
58
|
+
ctx.ring("cart", { selector: DemoSel.cartCount, label: "Cart count", duration: true });
|
|
63
59
|
});
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { defineNavBlock, Trait } from "waygraph";
|
|
2
|
+
import type { Home } from "../../../states/demo.states.js";
|
|
2
3
|
import { DemoSel, HOME_URL } from "./_sel.js";
|
|
3
4
|
|
|
4
5
|
/**
|
|
@@ -6,17 +7,16 @@ import { DemoSel, HOME_URL } from "./_sel.js";
|
|
|
6
7
|
* Helper: defineNavBlock
|
|
7
8
|
* Route: (app_base)/home/ (synthetic "/")
|
|
8
9
|
*/
|
|
9
|
-
export const NavHomeBlock = defineNavBlock({
|
|
10
|
+
export const NavHomeBlock = defineNavBlock<Home>({
|
|
10
11
|
name: "nav-home",
|
|
11
|
-
description: "Opens the offline catalog page (
|
|
12
|
+
description: "Opens the offline catalog page (file://, no server).",
|
|
12
13
|
checkpoint: "Home",
|
|
13
14
|
url: HOME_URL,
|
|
14
15
|
verify: [Trait.text(DemoSel.title, "Hello Waygraph"), Trait.visible(DemoSel.catalog)],
|
|
15
|
-
|
|
16
|
-
stubAfter
|
|
17
|
-
title
|
|
18
|
-
}
|
|
19
|
-
stubOnError
|
|
20
|
-
title
|
|
21
|
-
}
|
|
22
|
-
});
|
|
16
|
+
})
|
|
17
|
+
.stubAfter((ctx) => {
|
|
18
|
+
ctx.ring("title", { selector: DemoSel.title, label: "Home heading", duration: true });
|
|
19
|
+
})
|
|
20
|
+
.stubOnError((ctx) => {
|
|
21
|
+
ctx.ring("title", { selector: DemoSel.title, label: "Home heading at failure" });
|
|
22
|
+
});
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
export const HOME_URL =
|
|
3
|
-
process.env.WAYGRAPH_HOME_URL ??
|
|
4
|
-
`http://${process.env.WAYGRAPH_FIXTURE_HOST || "127.0.0.1"}:${process.env.WAYGRAPH_FIXTURE_PORT || "4177"}/home.html`;
|
|
1
|
+
// Relative to playwright.config.ts's baseURL (the (app_base) folder, set by `waygraph init`).
|
|
2
|
+
export const HOME_URL = "home/index.html";
|
|
5
3
|
|
|
6
4
|
export const DemoSel = {
|
|
7
5
|
title: "h1",
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<title>Waygraph scaffold demo</title>
|
|
6
|
+
<style>
|
|
7
|
+
body { font-family: system-ui, sans-serif; margin: 6rem 2rem 2rem; }
|
|
8
|
+
</style>
|
|
9
|
+
</head>
|
|
10
|
+
<body>
|
|
11
|
+
<h1>Waygraph scaffold demo</h1>
|
|
12
|
+
<ul>
|
|
13
|
+
<li><a href="home/index.html">Home</a></li>
|
|
14
|
+
<li><a href="docs/index.html">Docs</a></li>
|
|
15
|
+
</ul>
|
|
16
|
+
</body>
|
|
17
|
+
</html>
|
|
@@ -4,6 +4,8 @@ export type Home = Checkpoint<"Home">;
|
|
|
4
4
|
export type HomeVerified = Checkpoint<"HomeVerified">;
|
|
5
5
|
export type ItemInCart = Checkpoint<"ItemInCart">;
|
|
6
6
|
export type CartEmpty = Checkpoint<"CartEmpty">;
|
|
7
|
+
/** Anywhere an item can be added from: fresh on Home, or after the cart was emptied. */
|
|
8
|
+
export type CanAddItem = Home | CartEmpty;
|
|
7
9
|
|
|
8
10
|
// --- Mailpit (external tool surface, src/map/(external)/mailpit/) ---
|
|
9
11
|
|
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
Real `@playwright/test` specs, run through `waygraph test` (an alias for `playwright test`,
|
|
4
4
|
plus `waygraph test ui`/`report`/`show-trace` for Playwright's own UI Mode/HTML report/trace
|
|
5
|
-
viewer). These run against the offline fixture
|
|
6
|
-
network - that's what makes `npm test` green immediately after
|
|
5
|
+
viewer). These run against the offline fixture pages under `src/map/` (opened directly via `file://`,
|
|
6
|
+
no server), not a live network - that's what makes `npm test` green immediately after
|
|
7
|
+
`waygraph init`.
|
|
7
8
|
|
|
8
9
|
A spec here typically runs a `*.flow.ts` from `src/flows/` and asserts on its result, rather
|
|
9
10
|
than driving the page directly - the flow already encodes the real path and its own `verify`
|
|
@@ -42,9 +42,11 @@ against a live site, use `--skill-pilot-blind`.
|
|
|
42
42
|
hand-supplied every time, `registerMemStub(key, fake)` + `withMemStub(flow)` (or
|
|
43
43
|
`--mem-stub`) fills it from a registry instead - a key with no registration still fails
|
|
44
44
|
preflight exactly as before, so this narrows what needs real input, never removes the guard.
|
|
45
|
-
6. **Keep Checkpoints typed
|
|
46
|
-
|
|
47
|
-
|
|
45
|
+
6. **Keep Checkpoints typed.** Block helpers take concrete Checkpoint types from `src/states/`
|
|
46
|
+
(e.g. `defineMethodBlock<LoginPage, LoggedIn>`). A Block's **output** must never be
|
|
47
|
+
`Checkpoint<string>` — `waygraph check` / `waygraph typecheck` warn. When a Block runs from a
|
|
48
|
+
few known states, name them as a union in `src/states/` (`type CanAddItem = Home | CartEmpty`);
|
|
49
|
+
a `Checkpoint<string>` **input** is only for a Block that's genuinely reachable from anywhere.
|
|
48
50
|
Same for `defineAssertBlock({…})` without an explicit type arg — use
|
|
49
51
|
`defineAssertBlock<YourCheckpoint>({…})`.
|
|
50
52
|
7. **One input/action per Method Block.** No block that `.fill()`s two fields or `.fill()` + `.click()` in one
|