@unotest/web 0.15.0 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/skills/write-e2e-test/SKILL.md +17 -2
- package/.claude/skills/write-e2e-test-ground/SKILL.md +17 -2
- package/CHANGELOG.md +106 -66
- package/dist/config/schema.d.ts +21 -21
- package/dist/config/schema.js +1 -1
- package/dist/driver/index.d.ts +2 -2
- package/dist/driver/index.js +1 -1
- package/dist/dsl/index.d.ts +2 -2
- package/dist/dsl/index.js +1 -1
- package/dist/dsl/web-dsl-language-service.js +1 -1
- package/dist/inspection/page-inject.d.ts +1 -1
- package/dist/inspection/page-inject.js +5 -0
- package/dist/{interfaces-BaVF0jV-.d.ts → interfaces-elRn0llQ.d.ts} +18 -1
- package/dist/mcp/server.js +1 -1
- package/dist/runner/cli.js +1 -1
- package/dist/runner/init/chrome-probe.js +1 -1
- package/dist/runner/init.js +1 -1
- package/dist/runner/install-chromium.js +1 -1
- package/dist/runner/prepare-fix.js +1 -1
- package/dist/runner/scaffold-workspace.js +1 -1
- package/dist/runner/serve-fixture.js +1 -1
- package/dist/runner/web-runner-adapter.js +1 -1
- package/guides/dsl-reference.md +109 -1
- package/package.json +7 -7
- package/src/mcp/prompts/agent-test-author.md +3 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
function _0x43ab(){const _0x458e63=['lY8Gtw92zsaRihjLBMfTzsb0AgLZigzPBguGDg8GpgzLyxr1CMu+lZX5B3vYx25HBwu+lMPZicHLlMCUcI8Vigf1DgGVBg9NAw4UANmPigfUzcb0AguGzNvUy3rPB24GyMvSB3CGDg8GDgvZDf88Ew91CL9Uyw1LpIGPlIbty2vUyxjPB3mGBgL2zqOVlYbPBIbMzwf0DxjLihn1yMzVBgrLCNmSie5pvcb0AguGztjLihjVB3qG4OcuihrOzsbSAw50zxiGkgXPBNq6C2nLBMfYAw8TAw4TCM9VDcKklY8GCMvQzwn0CYbHihrLC3qGzMLSzsbWBgfJzwqGzgLYzwn0BhKGAw4GDw5VDgvZDc9LmMuVlIbuAguGBg9HzgvYigrLCML2zxmGDgHLcI8VigvUDhj5ig5HBwuGzNjVBsb0AguGzMLSzsbIyxnLBMfTzsdIGjqGA2vIywiTy2fZzsbKyxnOzxmGyMvJB21LihvUzgvYC2nVCMvZlGOklY8GrxzLCNKGzxHLy3v0ywjSzsbZDgvWig11C3qGC2L0igLUC2LKzsbHihn0zxaOiI4UlIiSicGPid0+ihSG4OcMih0PigjSB2nRlIbuAguklY8GDgL0BguGAxmGysbWBgfPBI1fBMDSAxnOigrLC2nYAxb0Aw9Uig9MihrOzsbNCM91CdSGDgHLihn0zxbZigLUC2LKzsbHCMuklY8GDgHLigLTCgXLBwvUDgf0Aw9UlIbhCM91CcbIEsbPBNrLBNqGkfnLDhvWic8Grw50zxiGlYbby3qGlYbbC3nLCNqGB3iklY8GD2HHDgv2zxiGCMvHzhmGD2vSBcKG4Ocuig9UzsbIBg9JAYbWzxiGBg9NAwnHBcbJAhvUAY4kcMz1BMn0Aw9UihrLC3rFEw91CL9Uyw1Lx2HLCMuOksb7cIaGC3rLCcGIu2vLzcbHigTUB3DUihvZzxiGDMLHiercic8GqvbjigzPEhr1CMvZigzYB20Gx2HLBhbLCNmViIWGkcKGpt4GEWOGicaGlY8GicaGD2LWzv9LmMvFDxnLCNmOktSkicaGic8VicaGihvZzxjFAwqGpsbZzwvKx3vZzxiOj2fSAwnLqgv4yw1WBguUy29TjYWGj3nLy3jLDcCPoWOGih0PoWOkicbZDgvWkcjtAwDUigLUigfZihrOzsbZzwvKzwqGDxnLCIiSicGPid0+ihSkicaGigDVDg8Oj2H0DhbZoI8VEw91CI1HChaUDgvZDc9SB2DPBICPoWOGicaGlY8GicaGzMLSBcHNzxrcEuXHyMvSkcDfBwfPBcCPlcaNywXPy2vazxHHBxbSzs5JB20NktSkicaGic8VicaGigzPBgWOz2v0qNLmywjLBcGNugfZC3DVCMqNksWGj3nLy3jLDcCPoWOGicaGlY8GicaGy2XPy2SOz2v0qNLsB2XLkcDIDxr0B24Nlcb7BMfTztOGj0XVzYbPBID9ksK7cIaGFsK7cGOGihn0zxaOiKfZC2vYDcb0AguGzgfZAgjVyxjKihnOB3DZihrOzsbZAwDUzwqTAw4GDxnLCIiSicGPid0+ihSkicaGic8VicaGigfZC2vYDfvYBcGNl2rHC2HIB2fYzcCPoWOGicaGlY8GicaGyxnZzxj0vgv4DcHNzxrcEvjVBguOj2HLywrPBMCNksWGj1DLBgnVBwuSiefSAwnLjYK7cIaGicaVlYaGicbJB3vUDca9igrIuxvLCNKOj1nftevdvcbJB3vUDcGQksbguK9nihvZzxjZifDirvjfigfJDgL2zsa9ihrYDwuNktSkicaGic8VicaGigfZC2vYDfrYDwuOy291BNqGpIaWlcaNzxHWzwn0zwqGyxqGBgvHC3qGB25LigfJDgL2zsb1C2vYjYK7cIaGFsK7cN0k','mZG3mZnnt0L3rgC','zxHHBxbSzxm','mtCXzunJBwPV','cIaGlY8GDMLLD2vYoIb7cIaGlY8GicbWB3j0oIa1mtCZlcaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGic8VigrLzMf1Bhq6ihjHBMrVBsbMCMvLihbVCNqkicaVlYaGigjYB3DZzxi6ihrYDwuSicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGlY8GzgvMyxvSDdOGDhj1zsaOyxv0BY1VCgvUig9Uigb2Awv3zxjGkqOGic8Vih0ScN07cG','iYb1BM90zxn0lxDLyIdIGjqGC2vJCMv0ihnJzw5HCMLVihzHCMLHyMXLCY4Gq3jLyxrLzcbIEsbGAw5PDgaSigDPDgLNBM9YzwqUcImkiYbtyw1LieTfwt1wquXvrsbMB3jTyxqGyxmGDw5VDgvZDc8Uzw52lcbIDxqGDMfSDwvZigHLCMuGyxjLihrYzwf0zwqGyxmkiYbtrunsrvq6ihrOzxKGyxjLig1HC2TLzcaOC2HVD24GyxmGyokaUxnLy3jLDdPlrvNIGlPGksbHBNL3AgvYzsb0AguGCNvUBMvYig9YcImGtunqigrLyNvNigXVzYb3B3vSzcbVDgHLCNDPC2uGD3jPDguGDgHLBsdIGjqGzMLSBcGPihzHBhvLCYWGvvjmCYWGzxzHBhvHDgukiYbZDhjPBMDZlIbszwzLCMvUy2uGDgHLBsbPBIbHihnJzw5HCMLVigj5ihrOzwLYigjHCMuGvvbqrvjFu05bs0uGBMfTzsWGDgHLcImGC2fTzsb3yxKGyxmGlMvUDIb2yxjPywjSzxm6cImkiYaGigzPBgWOz2v0qNLmywjLBcGNugfZC3DVCMqNksWGueftu1DpuKqPoWOJcImGu2vJCMv0CYbHCMuGtK9uigv4Cg9YDgvKihrVihn1yNbYB2nLC3nLCYaOC2HLBgWOksKG4OcuihrOzxKGC3rHEsbPBIb0AgukiYb2yxjPywjSzsbZDg9Yzs4GqsbZDwjWCM9JzxnZihrOyxqGz2vUDwLUzwX5ig5LzwrZig9UzsaOysbSAxn0zw5LCIb3AxrOigekiYb0B2TLBIKGz2v0CYbPDcb2AweGDgHLigv4CgXPy2L0igfSBg93BgLZDcbPBIb1BM90zxn0lMnVBMzPzY4QoGOJicaGC2fUzgjVEdOGEYbLEhbVCNrtzwnYzxrZoIbBj1rps0voj10GFqOJifb1DcbUB24TC2vJCMv0ihzHBhvLCYaOvvjmCYWGzw1HAwXZlcbPzhmPigLUihvUB3rLC3qVlMvUDI4kiWOJiezmruvux0vyqu1qteukte9hsu49cLbbu1nxt1jepqPut0TftJ0k','lY8GrxHHBxbSzsaWmsdIGjqGC21VA2u6ig5HDMLNyxrLicSGy2XPy2SGkYbvuKWGyxnZzxj0Aw9UlGOVlWOVlYbuAguGBwLUAw1HBcb0AhjLzs1ZDgvWihbHDhrLCM4UieHPDhmGCgXHEwDYB3vUzc51BM90zxn0lMnVBsbZBYbUBYbWCM9Qzwn0cI8VihnLDhvWigLZig5LzwrLzc4GuNvUihDPDgG6icbUChGGqhvUB3rLC3qVD2vIiguYzsbLEgfTCgXLCY8Wms1ZBw9RzqOkzNvUy3rPB24GDgvZDf9ZBw9Rzv9WBgf5z3jVDw5KkcKGEWOGihn0zxaOiK9Wzw4GDgHLiejPzYbuywjSzsbZy2vUyxjPBYbMCM9TihrOzsbWBgf5z3jVDw5KigLUzgv4iIWGkcKGpt4GEWOGicaGz290BYGNlYCPoWOGicaGy2XPy2SOz2v0qNLsB2XLkcDSAw5RjYWGE25HBwu6icDcAwCGvgfIBguNlcbLEgfJDdOGDhj1zx0PktSkicaGigfZC2vYDfvYBcGNl3nJzw5HCMLVCY9IAwCTDgfIBguNktSkicb9ktSkFqO','oduWmdG1nffStwr2uW','ntjct3zYAwu','Dw5VDgvZDa','BMfTzq','mdeTC21VA2uUANm','ChvZAa','mJy3mZaXmhjguMzsrq','lY8GrxHHBxbSzsaWmIdIGjqGzMLSBcbHBIbPBNb1DcaRigfZC2vYDcb0AguGyxbWihjLywn0zwqUcI8VcI8ViefNywLUC3qGCgXHEwDYB3vUzc51BM90zxn0lMnVBs9Zy2vUyxjPB3mVyMLNlxrHyMXLlIbezw1VBNn0CMf0zxmGz2v0qNLsB2XLcI8VigzVCIbHigXHyMvSBgvKigLUChv0lcb0ExbLzcbPBNb1Dcb2AweGzMLSBcGPlcbHBMqGysbSB2nHDg9Yig1LDgHVzc1JAgfPBGOVlYaOz2v0qNLsB2XLkcDYB3CNks5MAwX0zxiOE2HHC1rLEhr9ks5MAxjZDcGPksbPBIbHBIbHC3nLCNrPB24UcI8Vifj1BIb3AxrOoIaGBNb4ieb1BM90zxn0l3DLyIbLmMuGzxHHBxbSzxmVmdiTzM9YBs1MAwXScGPMDw5JDgLVBIb0zxn0x2zVCM1FzMLSBf9OyxbWEv9WyxrOkcKGEWOGihn0zxaOiKzPBhrLCIb0AguGqMLNifrHyMXLigj5igeGBMfTzsiSicGPid0+ihSkicaGigDVDg8OjY9Zy2vUyxjPB3mVyMLNlxrHyMXLjYK7cIaGicbMAwXSkgDLDej5uM9SzsGNDgv4DgjVEcCSihTUyw1LoIaNrMLSDgvYigj5ig5HBwuNFsKSicDvBweGuxvPBM4NktSkicb9ktSkcIaGC3rLCcGIrMLSDgvYAw5NihjLDMvHBhmGDgHLienSzwfYigzPBhrLCIbJB250CM9SigfUzcbTyxrJAgLUzYbYB3DZiIWGkcKGpt4GEWOGicaGyxnZzxj0vMLZAwjSzsHNzxrcEvjVBguOj2j1DhrVBICSihTUyw1LoIaNq2XLyxiGzMLSDgvYj30PktSkicaGigfZC2vYDfzPC2LIBguOz2v0qNLsB2XLkcDYB3CNks5MAwX0zxiOE2HHC1rLEhq6icDvBweGuxvPBM4NFsKUzMLYC3qOksK7cIaGFsK7cN0k','ndm1mdq1ruvOvwjW','lMvUDG','icbJAgfUBMvSoIa','x2HLBhbLCNm','nZq1mtq2ywPkB2Tb','ztjL','C3rYAw5NAwz5','mZq2ntzSwhHuzeO','zgvMAw5LuhjVCgvYDhK','lY8GqhvUB3rLC3qVD2vIihbYB2PLy3qGy29UzMLNlIbbBgWGzMLLBgrZigfYzsbVChrPB25HBcdIGjqGzgvMyxvSDhmGyxbWBhKklY8GD2HLBIbVBwL0DgvKlGOVlWOVlYbtyxzLzcbHCYaUBwPZihnVihrOzsbYDw50Aw1LigXVywrZigL0igfZievttsbYzwDHCMrSzxnZig9MihrOzsbWCM9Qzwn0j3mklY8GCgfJA2fNzs5QC29Uicj0ExbLiIbMAwvSzc4GrM9YieLersbHDxrVy29TCgXLDguSihr5CguTAw1WB3j0ihrOzsbZy2HLBwe6cI8VcI8VicaGlYOQieb0ExbLihTqyxj0AwfSpgLTCg9YDcGNqhvUB3rLC3qVD2vIjYKUvw5VDgvZDenVBMzPzZ59icOVcI8VicaGzxHWB3j0igrLzMf1BhqGEYbIyxnLvxjSoIaNAhr0Chm6lY95B3vYlwfWCc50zxn0jYb9oWOklYOQieb0ExbLihTqyxj0AwfSpgLTCg9YDcGNqhvUB3rLC3qVD2vIjYKUvw5VDgvZDenVBMzPzZ59icOVcMv4Cg9YDcbKzwzHDwX0ihSkicaVlYbIyxnLvxjSoIaNAhr0Chm6lY95B3vYlwfWCc50zxn0jYWkicaVlYbICM93C2vYCZOGwYDJAhjVBwL1BsCSicDMAxjLzM94jYWGj3DLyMTPDcDDlcaGlY8Gq0KGB3zLCNjPzgukicaVlYb2Awv3Cg9YDdOGEYb3Awr0AdOGmti4mcWGAgvPz2H0oIa3mJaGFsWkicaVlYbYzxrYEtOGEYbJB3vUDdOGmsWGB246ifSNDhjHBNnPzw50j10GFsWGicaGicaGic8Vienjig92zxjYAwrLcIaGlY8GC3rVCMfNzvn0yxrLoIaNlNvUB3rLC3qVy2fJAguVyxv0Ac5QC29UjYWGicaGicaVlYbZzwuGAgvSCgvYCWO','C2nHzMzVBgrxB3jRC3bHy2u','y2HHBM5LBa','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','mtq0odC5n0rKCwnKtG','ndzmyNb3z0u','zw52rxHHBxbSzq'];_0x43ab=function(){return _0x458e63;};return _0x43ab();}const _0x377128=_0x816e;function _0x816e(_0x2effd4,_0x28785c){_0x2effd4=_0x2effd4-0x9a;const _0x43abce=_0x43ab();let _0x816ef0=_0x43abce[_0x2effd4];if(_0x816e['ZgrOGC']===undefined){var _0x52abe7=function(_0x400139){const _0x56dcad='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x27219e='',_0x15a5c8='';for(let _0x4cd225=0x0,_0x43f0eb,_0xa2fdd9,_0x4b6430=0x0;_0xa2fdd9=_0x400139['charAt'](_0x4b6430++);~_0xa2fdd9&&(_0x43f0eb=_0x4cd225%0x4?_0x43f0eb*0x40+_0xa2fdd9:_0xa2fdd9,_0x4cd225++%0x4)?_0x27219e+=String['fromCharCode'](0xff&_0x43f0eb>>(-0x2*_0x4cd225&0x6)):0x0){_0xa2fdd9=_0x56dcad['indexOf'](_0xa2fdd9);}for(let _0x2bb3fe=0x0,_0x2b998c=_0x27219e['length'];_0x2bb3fe<_0x2b998c;_0x2bb3fe++){_0x15a5c8+='%'+('00'+_0x27219e['charCodeAt'](_0x2bb3fe)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x15a5c8);};_0x816e['bwnhpQ']=_0x52abe7,_0x816e['GGwPRp']={},_0x816e['ZgrOGC']=!![];}const _0x363236=_0x43abce[0x0],_0x3a54dc=_0x2effd4+_0x363236,_0x112b25=_0x816e['GGwPRp'][_0x3a54dc];return!_0x112b25?(_0x816ef0=_0x816e['bwnhpQ'](_0x816ef0),_0x816e['GGwPRp'][_0x3a54dc]=_0x816ef0):_0x816ef0=_0x112b25,_0x816ef0;}(function(_0x258c7e,_0x58bd0f){const _0x38bd0b={_0x5a9648:0xa7,_0x9f705b:0xad,_0x3848a7:0x9c},_0x35682b=_0x816e,_0x4375e6=_0x258c7e();while(!![]){try{const _0x44ad9d=parseInt(_0x35682b(0xb9))/0x1+-parseInt(_0x35682b(0xa4))/0x2*(-parseInt(_0x35682b(_0x38bd0b._0x5a9648))/0x3)+-parseInt(_0x35682b(0xae))/0x4*(parseInt(_0x35682b(0xb5))/0x5)+parseInt(_0x35682b(_0x38bd0b._0x9f705b))/0x6+-parseInt(_0x35682b(0xa3))/0x7+parseInt(_0x35682b(_0x38bd0b._0x3848a7))/0x8*(parseInt(_0x35682b(0xa9))/0x9)+-parseInt(_0x35682b(0xb3))/0xa;if(_0x44ad9d===_0x58bd0f)break;else _0x4375e6['push'](_0x4375e6['shift']());}catch(_0x5630e4){_0x4375e6['push'](_0x4375e6['shift']());}}}(_0x43ab,0xe4793));var __defProp=Object[_0x377128(0x9d)],__name=(_0x27219e,_0x15a5c8)=>__defProp(_0x27219e,_0x377128(0xb0),{'value':_0x15a5c8,'configurable':!![]});import{mkdir,writeFile}from'fs/promises';import{existsSync}from'fs';import{join}from'path';var templates={'scenarioTemplate':_0x377128(0xa6),'agentsMd':_0x377128(0xa1),'claudeMdBody':_0x377128(0xa2),'examples':{'01-smoke.js':_0x377128(0xac),'02-form-fill.js':_0x377128(0xb4)},'secretsExample':_0x377128(0xab),'envExample':'#\x20unotest-web\x20—\x20copied\x20to\x20unotest/.env\x20by\x20`init`\x20if\x20not\x20present.\x0a#\x0a#\x20Fill\x20in\x20values\x20that\x20apply\x20to\x20your\x20project.\x20Variables\x20are\x20loaded\x20by\x20the\x0a#\x20runner\x20at\x20scenario\x20start.\x0a#\x0a#\x20Reference\x20any\x20variable\x20from\x20a\x20scenario\x20by\x20its\x20bare\x20UPPER_SNAKE\x20name\x20—\x0a#\x20no\x20env()/secret()\x20wrapper:\x0a#\x0a#\x20\x20\x20goto(\x27/login\x27);\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20#\x20relative\x20—\x20see\x20APP_BASE_URL\x0a#\x20\x20\x20fill(getByLabel(\x27Email\x27),\x20TEST_USER_EMAIL);\x0a#\x0a#\x20Secret\x20values\x20(passwords,\x20tokens)\x20go\x20in\x20unotest/.secrets\x20instead\x20—\x20same\x0a#\x20format,\x20but\x20masked\x20in\x20every\x20log.\x20An\x20unknown\x20UPPER_SNAKE\x20name\x20fails\x20the\x0a#\x20run\x20with\x20a\x20clear\x20\x22add\x20it\x20to\x20unotest/.env\x22\x20message.\x0a#\x0a#\x20Environments:\x20override\x20any\x20value\x20per\x20environment\x20with\x20overlay\x20files\x20—\x0a#\x20unotest/.env.staging,\x20unotest/.env.production\x20(secrets:\x20.secrets.<env>).\x0a#\x20Select\x20one:\x20`npx\x20@unotest/web\x20e2e\x20<name>\x20--env\x20staging`.\x20The\x20overlay\x20layers\x0a#\x20over\x20this\x20base\x20file\x20(overlay\x20wins);\x20the\x20shell\x20environment\x20wins\x20over\x20both.\x0a\x0a#\x20---\x20App\x20under\x20test\x20--------------------------------------------------------\x0a#\x20The\x20app\x27s\x20base\x20URL.\x20Relative\x20goto(\x27/path\x27)\x20resolves\x20against\x20it\x20(wired\x20into\x0a#\x20Playwright\x27s\x20baseURL\x20automatically),\x20so\x20write\x20goto(\x27/login\x27)\x20—\x20never\x0a#\x20goto(APP_BASE_URL\x20+\x20\x27/login\x27).\x20Also\x20used\x20for\x20assertUrl\x20substring\x20matching.\x0a#\x20Defaults\x20to\x20the\x20unotest\x20playground\x20so\x20the\x20example\x20scenarios\x20run\x20out\x20of\x20the\x0a#\x20box;\x20point\x20it\x20at\x20your\x20own\x20app.\x0aAPP_BASE_URL=https://playground.unotest.com\x0a\x0a#\x20---\x20Database\x20--------------------------------------------------------------\x0a#\x20Used\x20by\x20dbQuery\x20/\x20dbExec.\x20Install\x20the\x20matching\x20driver\x20as\x20a\x20peer-dep:\x0a#\x20\x20\x20pnpm\x20add\x20-D\x20pg\x20@types/pg\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20#\x20for\x20postgresql://\x0a#\x20\x20\x20pnpm\x20add\x20-D\x20mysql2\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20#\x20for\x20mysql://\x0a#\x20(SQLite\x20via\x20better-sqlite3\x20—\x20install\x20only\x20if\x20needed.)\x0aDATABASE_URL=postgresql://postgres:postgres@localhost:5432/myapp_test\x0a\x0a#\x20---\x20Extra\x20API\x20hosts\x20-------------------------------------------------------\x0a#\x20apiCall(...)\x20goes\x20against\x20sandbox.apiBaseUrl\x20from\x20unotest.config.*\x20by\x0a#\x20default.\x20A\x20setup\x20that\x20talks\x20to\x20MORE\x20hosts\x20names\x20them\x20here\x20and\x20picks\x20one\x0a#\x20per\x20call\x20by\x20the\x20variable\x20NAME\x20(URLs\x20never\x20appear\x20in\x20scenarios):\x0a#\x20\x20\x20apiCall(\x27POST\x27,\x20\x27/things\x27,\x20body,\x20headers,\x20{base:\x20\x27API_BASE_CHAT\x27})\x0a#\x20API_BASE_CHAT=https://chatbackend.example.com\x0a\x0a#\x20---\x20Runner\x20--------------------------------------------------------------\x0a#\x20Show\x20the\x20browser\x20window\x20during\x20runs\x20(default:\x20headless).\x0a#\x20UNOTEST_HEADED=1\x0a#\x20Slow\x20each\x20Playwright\x20op\x20by\x20N\x20ms\x20(default:\x200).\x20Pairs\x20with\x20HEADED\x20for\x0a#\x20watching\x20the\x20agent\x20at\x20work.\x0a#\x20UNOTEST_SLOW_MO=100\x0a#\x20Browser\x20used\x20by\x20the\x20CLI\x20(chromium\x20|\x20firefox\x20|\x20webkit).\x20Default:\x20chromium.\x0a#\x20UNOTEST_BROWSER=chromium\x0a#\x20Default\x20action\x20timeout\x20in\x20milliseconds\x20—\x20applied\x20to\x20every\x20click\x20/\x0a#\x20fill\x20/\x20waitFor\x20/\x20etc.\x20via\x20Playwright\x27s\x20setDefaultTimeout.\x20Default\x203000.\x0a#\x20Bump\x20if\x20your\x20app\x20is\x20slow;\x20per-action\x20override\x20via\x20the\x20action\x27s\x0a#\x20options.timeout.\x20Playwright\x27s\x20stock\x2030000\x20strands\x20interactive\x20agents.\x0a#\x20UNOTEST_DEFAULT_TIMEOUT_MS=3000\x0a#\x20Default\x20navigation\x20timeout\x20in\x20milliseconds\x20—\x20applied\x20to\x20goto\x20/\x20reload\x20/\x0a#\x20waitForUrl,\x20click\x27s\x20post-action\x20navigation\x20wait,\x20AND\x20setPage\x27s\x20wait\x20for\x20a\x0a#\x20newly\x20opened\x20tab\x20to\x20appear\x20+\x20load.\x20Real-world\x20pages\x20routinely\x20take\x205–15s\x0a#\x20to\x20fire\x20\x27load\x27;\x20keep\x20this\x20separate\x20from\x20the\x20action\x20timeout\x20above.\x0aUNOTEST_DEFAULT_NAVIGATION_TIMEOUT_MS=15000\x0a\x0a#\x20Per-run\x20wall-clock\x20budget\x20in\x20milliseconds\x20—\x20a\x20run\x20aborts\x20once\x20it\x20exceeds\x0a#\x20this.\x20Guards\x20against\x20a\x20stuck\x20scenario\x20hanging\x20the\x20agent\x20indefinitely.\x0a#\x20Invalid\x20or\x20non-positive\x20values\x20fall\x20back\x20to\x20the\x20default.\x20Default\x20300000.\x0a#\x20UNOTEST_MAX_DURATION_MS=300000\x0a\x0a#\x20---\x20Locale\x20+\x20timezone\x20---------------------------------------------------\x0a#\x20Pin\x20the\x20browser\x20context\x27s\x20Accept-Language\x20/\x20navigator.language.\x20Without\x0a#\x20these,\x20tests\x20inherit\x20the\x20OS\x20locale\x20—\x20accessible-name\x20selectors\x0a#\x20(`getByRole(name)`)\x20on\x20i18n\x27d\x20apps\x20will\x20break\x20across\x20machines.\x0a#\x20UNOTEST_LOCALE=en-US\x0a#\x20UNOTEST_TIMEZONE=UTC\x0a\x0a#\x20---\x20Recording\x20(explore_*)\x20----------------------------------------------\x0a#\x20Grace\x20window\x20in\x20ms\x20after\x20each\x20explore_step\x20action.\x20If\x20a\x20click\x20opens\x20a\x0a#\x20new\x20tab/popup,\x20the\x20MCP\x20server\x20auto-switches\x20the\x20active\x20page\x20to\x20it\x20AND\x0a#\x20inserts\x20setPage(N)\x20into\x20the\x20generated\x20DSL\x20trace.\x20Set\x20to\x200\x20to\x20disable\x0a#\x20(strict\x20mode).\x20Has\x20NO\x20effect\x20on\x20run_test\x20—\x20there\x20setPage\x20already\x20waits\x0a#\x20for\x20the\x20tab\x20to\x20appear\x20on\x20its\x20own.\x20Range:\x20[0,\x2010000].\x20Default:\x202000.\x0a#\x20UNOTEST_POPUP_GRACE_MS=2000\x0a\x0a#\x20---\x20Logging\x20-------------------------------------------------------------\x0a#\x20debug\x20|\x20info\x20|\x20warn\x20|\x20error.\x20Default:\x20info.\x0aUNOTEST_LOG_LEVEL=info\x0a\x0a#\x20---\x20Debug\x20diagnostics\x20---------------------------------------------------\x0a#\x20Off\x20by\x20default.\x20Set\x20to\x201\x20to\x20record\x20a\x20structured\x20JSONL\x20log\x20+\x20per-call\x0a#\x20folders\x20under\x20unotest/.debug/\x20—\x20then\x20restart\x20the\x20MCP\x20server.\x20Each\x20tool\x0a#\x20call\x20gets\x20a\x20folder\x20with\x20the\x20full\x20snapshot\x20JSON,\x20the\x20outerHTML\x20of\x20the\x0a#\x20element\x20a\x20locator\x20resolved\x20to,\x20and\x20(on\x20failure)\x20page.html\x20+\x20a\x20screenshot,\x0a#\x20so\x20you\x20(and\x20the\x20AI\x20agent,\x20via\x20get_last_mcp_log)\x20can\x20verify\x20the\x20snapshot\x0a#\x20didn\x27t\x20glitch\x20and\x20the\x20locator\x20hit\x20the\x20right\x20element\x20—\x20instead\x20of\x20guessing\x0a#\x20from\x20a\x20truncated\x20error.\x20audit_last_run\x20then\x20checks\x20the\x20run\x20against\x20the\x0a#\x20testing\x20rules.\x20Also\x20turns\x20on\x20full\x20CLI\x20stack\x20traces.\x20Use\x20\x27summary\x27\x20for\x20a\x0a#\x20lighter\x20log\x20(tool\x20+\x20snapshot\x20layers\x20only,\x20no\x20artifacts).\x20NOTE:\x20tool\x0a#\x20arguments\x20are\x20logged\x20verbatim,\x20so\x20a\x20fill()\x20with\x20a\x20password\x20lands\x20in\x20the\x0a#\x20local\x20(gitignored)\x20log\x20—\x20keep\x20this\x20off\x20unless\x20you\x27re\x20debugging.\x0a#\x20UNOTEST_DEBUG=1\x0a\x0a#\x20---\x20Capture\x20(viewer\x20inspector)\x20------------------------------------------\x0a#\x20Record\x20the\x20browser\x20console\x20+\x20network\x20requests\x20into\x20each\x20run\x27s\x20dir\x20so\x20the\x0a#\x20viewer\x27s\x20Console\x20/\x20Network\x20inspector\x20tabs\x20are\x20populated.\x20Set\x20to\x200\x20to\x20disable.\x0aUNOTEST_NETWORK=1\x0aUNOTEST_CONSOLE=1\x0a#\x20Set\x20to\x201\x20to\x20also\x20capture\x20a\x20screenshot\x20after\x20EVERY\x20executed\x20step\x20(into\x0a#\x20unotest/.runs/<runId>/screenshot/;\x20click\x20a\x20step\x20row\x20in\x20the\x20viewer\x20to\x20see\x0a#\x20it).\x20On\x20failure,\x20a\x20screenshot\x20+\x20page.html\x20always\x20land\x20in\x0a#\x20unotest/.runs/<runId>/failure/\x20—\x20no\x20flag\x20needed.\x0a#\x20UNOTEST_STEP_SCREENSHOTS=1\x0a'};function unotestConfigMjs(_0x4cd225){const _0x3e9b80={_0x3d045f:0xb7,_0x4f7173:0x9b,_0x49ff0f:0xaa},_0x51cf96=_0x377128,_0x43f0eb=_0x4cd225===void 0x0?'\x20\x20//\x20channel:\x20\x27chrome\x27,\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\x27chrome\x27\x20/\x20\x27msedge\x27\x20/\x20null\x20(bundled)':_0x51cf96(_0x3e9b80._0x3d045f)+JSON[_0x51cf96(_0x3e9b80._0x4f7173)](_0x4cd225)+',';return _0x51cf96(0x9e)+_0x43f0eb+_0x51cf96(_0x3e9b80._0x49ff0f);}__name(unotestConfigMjs,'unotestConfigMjs');async function scaffoldWorkspace(_0xa2fdd9,_0x4b6430={}){const _0x15ae7b={_0x325fe6:0xaf,_0x53de67:0x9a,_0x34ad05:0x9a,_0x26b85f:0xb8,_0x13a549:0xaf,_0x52d911:0xa5,_0x5a7526:0xa8,_0x257980:0xb1,_0x5c671c:0xb1,_0x57eca7:0xb2},_0x4c163b=_0x377128,_0x2bb3fe=[],_0x2b998c=[];await mkdir(join(_0xa2fdd9,_0x4c163b(_0x15ae7b._0x325fe6),_0x4c163b(_0x15ae7b._0x53de67),_0x4c163b(0xa8)),{'recursive':!![]}),await mkdir(join(_0xa2fdd9,'unotest',_0x4c163b(_0x15ae7b._0x34ad05),_0x4c163b(_0x15ae7b._0x26b85f)),{'recursive':!![]});const _0x1dad1e=[{'rel':'unotest.config.mjs','content':unotestConfigMjs(_0x4b6430[_0x4c163b(0xa0)])},{'rel':join(_0x4c163b(_0x15ae7b._0x13a549),_0x4c163b(0xb6)),'content':templates[_0x4c163b(_0x15ae7b._0x52d911)]},{'rel':join(_0x4c163b(0xaf),'e2e',_0x4c163b(_0x15ae7b._0x5a7526),_0x4c163b(_0x15ae7b._0x257980)),'content':templates[_0x4c163b(0xa8)][_0x4c163b(_0x15ae7b._0x5c671c)]}];for(const {rel:_0x12a389,content:_0x22c46f}of _0x1dad1e){const _0x532c01=join(_0xa2fdd9,_0x12a389);if(existsSync(_0x532c01)){_0x2b998c['push'](_0x12a389);continue;}await writeFile(_0x532c01,_0x22c46f),_0x2bb3fe[_0x4c163b(_0x15ae7b._0x57eca7)](_0x12a389);}return{'projectRoot':_0xa2fdd9,'created':_0x2bb3fe,'skipped':_0x2b998c};}__name(scaffoldWorkspace,_0x377128(0x9f));export{scaffoldWorkspace};
|
|
1
|
+
function _0x5857(){const _0x3f1ac3=['zgvMAw5LuhjVCgvYDhK','mZqYDeHjtuD0','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','mZi1mty4oe5rvMr2tW','ztjL','mti4uhzZAwju','Dw5VDgvZDa','C2nHzMzVBgrxB3jRC3bHy2u','BMfTzq','ChvZAa','Dw5VDgvZDc5JB25MAwCUBwPZ','mtq3odjbEMXpufy','mtfivvjYrhq','nJaXnti3meHUBfrUEG','ndaWndK0zMv6u0ns','odiZnZuWvxbcy0zi','cIaGlY8GDMLLD2vYoIb7cIaGlY8GicbWB3j0oIa1mtCZlcaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGic8VigrLzMf1Bhq6ihjHBMrVBsbMCMvLihbVCNqkicaVlYaGigjYB3DZzxi6ihrYDwuSicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGlY8GzgvMyxvSDdOGDhj1zsaOyxv0BY1VCgvUig9Uigb2Awv3zxjGkqOGic8Vih0ScN07cG','Dw5VDgvZDenVBMzPz01QCW','lMvUDG','iYb1BM90zxn0lxDLyIdIGjqGC2vJCMv0ihnJzw5HCMLVihzHCMLHyMXLCY4Gq3jLyxrLzcbIEsbGAw5PDgaSigDPDgLNBM9YzwqUcImkiYbtyw1LieTfwt1wquXvrsbMB3jTyxqGyxmGDw5VDgvZDc8Uzw52lcbIDxqGDMfSDwvZigHLCMuGyxjLihrYzwf0zwqGyxmkiYbtrunsrvq6ihrOzxKGyxjLig1HC2TLzcaOC2HVD24GyxmGyokaUxnLy3jLDdPlrvNIGlPGksbHBNL3AgvYzsb0AguGCNvUBMvYig9YcImGtunqigrLyNvNigXVzYb3B3vSzcbVDgHLCNDPC2uGD3jPDguGDgHLBsdIGjqGzMLSBcGPihzHBhvLCYWGvvjmCYWGzxzHBhvHDgukiYbZDhjPBMDZlIbszwzLCMvUy2uGDgHLBsbPBIbHihnJzw5HCMLVigj5ihrOzwLYigjHCMuGvvbqrvjFu05bs0uGBMfTzsWGDgHLcImGC2fTzsb3yxKGyxmGlMvUDIb2yxjPywjSzxm6cImkiYaGigzPBgWOz2v0qNLmywjLBcGNugfZC3DVCMqNksWGueftu1DpuKqPoWOJcImGu2vJCMv0CYbHCMuGtK9uigv4Cg9YDgvKihrVihn1yNbYB2nLC3nLCYaOC2HLBgWOksKG4OcuihrOzxKGC3rHEsbPBIb0AgukiYb2yxjPywjSzsbZDg9Yzs4GqsbZDwjWCM9JzxnZihrOyxqGz2vUDwLUzwX5ig5LzwrZig9UzsaOysbSAxn0zw5LCIb3AxrOigekiYb0B2TLBIKGz2v0CYbPDcb2AweGDgHLigv4CgXPy2L0igfSBg93BgLZDcbPBIb1BM90zxn0lMnVBMzPzY4QoGOJicaGC2fUzgjVEdOGEYbLEhbVCNrtzwnYzxrZoIbBj1rps0voj10GFqOJifb1DcbUB24TC2vJCMv0ihzHBhvLCYaOvvjmCYWGzw1HAwXZlcbPzhmPigLUihvUB3rLC3qVlMvUDI4kiWOJiezmruvux0vyqu1qteukte9hsu49cLbbu1nxt1jepqPut0TftJ0k','y2HHBM5LBa','nJy3ntGWovzztLfZCa','lY8Gtw92zsaRihjLBMfTzsb0AgLZigzPBguGDg8GpgzLyxr1CMu+lZX5B3vYx25HBwu+lMPZicHLlMCUcI8Vigf1DgGVBg9NAw4UANmPigfUzcb0AguGzNvUy3rPB24GyMvSB3CGDg8GDgvZDf88Ew91CL9Uyw1LpIGPlIbty2vUyxjPB3mGBgL2zqOVlYbPBIbMzwf0DxjLihn1yMzVBgrLCNmSie5pvcb0AguGztjLihjVB3qG4OcuihrOzsbSAw50zxiGkgXPBNq6C2nLBMfYAw8TAw4TCM9VDcKklY8GCMvQzwn0CYbHihrLC3qGzMLSzsbWBgfJzwqGzgLYzwn0BhKGAw4GDw5VDgvZDc9LmMuVlIbuAguGBg9HzgvYigrLCML2zxmGDgHLcI8VigvUDhj5ig5HBwuGzNjVBsb0AguGzMLSzsbIyxnLBMfTzsdIGjqGA2vIywiTy2fZzsbKyxnOzxmGyMvJB21LihvUzgvYC2nVCMvZlGOklY8GrxzLCNKGzxHLy3v0ywjSzsbZDgvWig11C3qGC2L0igLUC2LKzsbHihn0zxaOiI4UlIiSicGPid0+ihSG4OcMih0PigjSB2nRlIbuAguklY8GDgL0BguGAxmGysbWBgfPBI1fBMDSAxnOigrLC2nYAxb0Aw9Uig9MihrOzsbNCM91CdSGDgHLihn0zxbZigLUC2LKzsbHCMuklY8GDgHLigLTCgXLBwvUDgf0Aw9UlIbhCM91CcbIEsbPBNrLBNqGkfnLDhvWic8Grw50zxiGlYbby3qGlYbbC3nLCNqGB3iklY8GD2HHDgv2zxiGCMvHzhmGD2vSBcKG4Ocuig9UzsbIBg9JAYbWzxiGBg9NAwnHBcbJAhvUAY4kcMz1BMn0Aw9UihrLC3rFEw91CL9Uyw1Lx2HLCMuOksb7cIaGC3rLCcGIu2vLzcbHigTUB3DUihvZzxiGDMLHiercic8GqvbjigzPEhr1CMvZigzYB20Gx2HLBhbLCNmViIWGkcKGpt4GEWOGicaGlY8GicaGD2LWzv9LmMvFDxnLCNmOktSkicaGic8VicaGihvZzxjFAwqGpsbZzwvKx3vZzxiOj2fSAwnLqgv4yw1WBguUy29TjYWGj3nLy3jLDcCPoWOGih0PoWOkicbZDgvWkcjtAwDUigLUigfZihrOzsbZzwvKzwqGDxnLCIiSicGPid0+ihSkicaGigDVDg8Oj2H0DhbZoI8VEw91CI1HChaUDgvZDc9SB2DPBICPoWOGicaGlY8GicaGzMLSBcHNzxrcEuXHyMvSkcDfBwfPBcCPlcaNywXPy2vazxHHBxbSzs5JB20NktSkicaGic8VicaGigzPBgWOz2v0qNLmywjLBcGNugfZC3DVCMqNksWGj3nLy3jLDcCPoWOGicaGlY8GicaGy2XPy2SOz2v0qNLsB2XLkcDIDxr0B24Nlcb7BMfTztOGj0XVzYbPBID9ksK7cIaGFsK7cGOGihn0zxaOiKfZC2vYDcb0AguGzgfZAgjVyxjKihnOB3DZihrOzsbZAwDUzwqTAw4GDxnLCIiSicGPid0+ihSkicaGic8VicaGigfZC2vYDfvYBcGNl2rHC2HIB2fYzcCPoWOGicaGlY8GicaGyxnZzxj0vgv4DcHNzxrcEvjVBguOj2HLywrPBMCNksWGj1DLBgnVBwuSiefSAwnLjYK7cIaGicaVlYaGicbJB3vUDca9igrIuxvLCNKOj1nftevdvcbJB3vUDcGQksbguK9nihvZzxjZifDirvjfigfJDgL2zsa9ihrYDwuNktSkicaGic8VicaGigfZC2vYDfrYDwuOy291BNqGpIaWlcaNzxHWzwn0zwqGyxqGBgvHC3qGB25LigfJDgL2zsb1C2vYjYK7cIaGFsK7cN0k','zxHHBxbSzxm','lY8GrxHHBxbSzsaWmIdIGjqGzMLSBcbHBIbPBNb1DcaRigfZC2vYDcb0AguGyxbWihjLywn0zwqUcI8VcI8ViefNywLUC3qGCgXHEwDYB3vUzc51BM90zxn0lMnVBs9Zy2vUyxjPB3mVyMLNlxrHyMXLlIbezw1VBNn0CMf0zxmGz2v0qNLsB2XLcI8VigzVCIbHigXHyMvSBgvKigLUChv0lcb0ExbLzcbPBNb1Dcb2AweGzMLSBcGPlcbHBMqGysbSB2nHDg9Yig1LDgHVzc1JAgfPBGOVlYaOz2v0qNLsB2XLkcDYB3CNks5MAwX0zxiOE2HHC1rLEhr9ks5MAxjZDcGPksbPBIbHBIbHC3nLCNrPB24UcI8Vifj1BIb3AxrOoIaGBNb4ieb1BM90zxn0l3DLyIbLmMuGzxHHBxbSzxmVmdiTzM9YBs1MAwXScGPMDw5JDgLVBIb0zxn0x2zVCM1FzMLSBf9OyxbWEv9WyxrOkcKGEWOGihn0zxaOiKzPBhrLCIb0AguGqMLNifrHyMXLigj5igeGBMfTzsiSicGPid0+ihSkicaGigDVDg8OjY9Zy2vUyxjPB3mVyMLNlxrHyMXLjYK7cIaGicbMAwXSkgDLDej5uM9SzsGNDgv4DgjVEcCSihTUyw1LoIaNrMLSDgvYigj5ig5HBwuNFsKSicDvBweGuxvPBM4NktSkicb9ktSkcIaGC3rLCcGIrMLSDgvYAw5NihjLDMvHBhmGDgHLienSzwfYigzPBhrLCIbJB250CM9SigfUzcbTyxrJAgLUzYbYB3DZiIWGkcKGpt4GEWOGicaGyxnZzxj0vMLZAwjSzsHNzxrcEvjVBguOj2j1DhrVBICSihTUyw1LoIaNq2XLyxiGzMLSDgvYj30PktSkicaGigfZC2vYDfzPC2LIBguOz2v0qNLsB2XLkcDYB3CNks5MAwX0zxiOE2HHC1rLEhq6icDvBweGuxvPBM4NFsKUzMLYC3qOksK7cIaGFsK7cN0k','nZq2mZjxwxn3rei','iYmGrtjfihrLC3rPBMCGD2L0AcbaDw5VDgvZDc93zwikcKbbr0vovfmUBwqkcKzVCIbHBNKGCMvXDwvZDcb0BYb3CML0zsWGCMvJB3jKlcbVCIbYDw4Gyw4Gzw5KlxrVlwvUzcb0zxn0lcbVCgvUihrOzqPGD3jPDguTztjLlxrLC3rGihnRAwXSicHVCIbYDw4Gyc93CML0zs1LmMuTDgvZDgaPigfUzcbKCML2zsb0AguGyNjVD3nLCIb0AhjVDwDOcNrOzsbGDw5VDgvZDc13zwjGie1ducb0B29SCYaOyg5LD19JB250zxH0ycdIHPiGygv4CgXVCMvFC3rLCgaG4OAsigbNzxrFCgfNzv9ZBMfWC2HVDgak4OAsigbYDw5FDgvZDgaPlIbeBYbUB3qGAgfUzc1HDxrOB3iGDgvZDhmGyMXPBMqGB3iGBwfWihrOzsbWCM9Qzwn0ihDPDgGkygzPBMrGl2bSC2aVygf3A2aG4OcuihrOzsbZA2LSBcDZifbOyxnLidaGBgLZDhmGDgHLigzPBgvZihrVihjLywqU','icaVlYbJAgfUBMvSoIaNy2HYB21LjYWGicaGicaGicaGicaGicaGicaGicaGicaGicaGlY8Gj2nOCM9TzsCGlYaNBxnLzgDLjYaVig51BgWGkgj1BMrSzwqP','nfbiugDcAq','mta0CvDuuw5n','nM1twgXgBG','zw52rxHHBxbSzq'];_0x5857=function(){return _0x3f1ac3;};return _0x5857();}function _0x40c2(_0x1a14e8,_0x8060){_0x1a14e8=_0x1a14e8-0xe2;const _0x585740=_0x5857();let _0x40c213=_0x585740[_0x1a14e8];if(_0x40c2['rlkwjw']===undefined){var _0x5f22fd=function(_0x96728){const _0x150442='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0xa7faa4='',_0x296507='';for(let _0xfed815=0x0,_0x29f04e,_0x4be1f3,_0x3c3da6=0x0;_0x4be1f3=_0x96728['charAt'](_0x3c3da6++);~_0x4be1f3&&(_0x29f04e=_0xfed815%0x4?_0x29f04e*0x40+_0x4be1f3:_0x4be1f3,_0xfed815++%0x4)?_0xa7faa4+=String['fromCharCode'](0xff&_0x29f04e>>(-0x2*_0xfed815&0x6)):0x0){_0x4be1f3=_0x150442['indexOf'](_0x4be1f3);}for(let _0x3a6c61=0x0,_0x147e5f=_0xa7faa4['length'];_0x3a6c61<_0x147e5f;_0x3a6c61++){_0x296507+='%'+('00'+_0xa7faa4['charCodeAt'](_0x3a6c61)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x296507);};_0x40c2['NokQWa']=_0x5f22fd,_0x40c2['PyPjbi']={},_0x40c2['rlkwjw']=!![];}const _0x3df17c=_0x585740[0x0],_0x4a324d=_0x1a14e8+_0x3df17c,_0x13c5f0=_0x40c2['PyPjbi'][_0x4a324d];return!_0x13c5f0?(_0x40c213=_0x40c2['NokQWa'](_0x40c213),_0x40c2['PyPjbi'][_0x4a324d]=_0x40c213):_0x40c213=_0x13c5f0,_0x40c213;}const _0x497181=_0x40c2;(function(_0x47ea01,_0x5e3e95){const _0x30b637={_0x273946:0xf3,_0x3b3e9a:0xf5,_0x3f4e6d:0xe9,_0x1c436f:0xf7,_0x54f010:0xf4,_0x5c35e0:0xeb,_0x49b246:0xe5},_0x400ae8=_0x40c2,_0x7c2859=_0x47ea01();while(!![]){try{const _0x2a184d=-parseInt(_0x400ae8(0xed))/0x1*(parseInt(_0x400ae8(_0x30b637._0x273946))/0x2)+-parseInt(_0x400ae8(0xf6))/0x3*(-parseInt(_0x400ae8(0xe4))/0x4)+-parseInt(_0x400ae8(_0x30b637._0x3b3e9a))/0x5+-parseInt(_0x400ae8(0xe6))/0x6*(-parseInt(_0x400ae8(0xfd))/0x7)+-parseInt(_0x400ae8(0x101))/0x8*(parseInt(_0x400ae8(_0x30b637._0x3f4e6d))/0x9)+parseInt(_0x400ae8(_0x30b637._0x1c436f))/0xa*(-parseInt(_0x400ae8(_0x30b637._0x54f010))/0xb)+-parseInt(_0x400ae8(_0x30b637._0x5c35e0))/0xc*(-parseInt(_0x400ae8(_0x30b637._0x49b246))/0xd);if(_0x2a184d===_0x5e3e95)break;else _0x7c2859['push'](_0x7c2859['shift']());}catch(_0x43e833){_0x7c2859['push'](_0x7c2859['shift']());}}}(_0x5857,0xa3546));var __defProp=Object[_0x497181(0xe8)],__name=(_0xa7faa4,_0x296507)=>__defProp(_0xa7faa4,_0x497181(0xf0),{'value':_0x296507,'configurable':!![]});import{mkdir,writeFile}from'fs/promises';import{existsSync}from'fs';import{join}from'path';var templates={'scenarioTemplate':_0x497181(0xfe),'agentsMd':_0x497181(0xea),'claudeMdBody':_0x497181(0xe2),'examples':{'01-smoke.js':'//\x20Example\x2001\x20—\x20smoke:\x20navigate\x20+\x20click\x20+\x20URL\x20assertion.\x0a//\x0a//\x20The\x20minimal\x20three-step\x20pattern.\x20Hits\x20playground.unotest.com\x20so\x20no\x20project\x0a//\x20setup\x20is\x20needed.\x20Run\x20with:\x20\x20npx\x20@unotest/web\x20e2e\x20examples/01-smoke\x0a\x0afunction\x20test_smoke_playground()\x20{\x0a\x20\x20step(\x22Open\x20the\x20Big\x20Table\x20scenario\x20from\x20the\x20playground\x20index\x22,\x20()\x20=>\x20{\x0a\x20\x20\x20\x20goto(\x27/\x27);\x0a\x20\x20\x20\x20click(getByRole(\x27link\x27,\x20{name:\x20\x27Big\x20Table\x27,\x20exact:\x20true}));\x0a\x20\x20\x20\x20assertUrl(\x27/scenarios/big-table\x27);\x0a\x20\x20});\x0a}\x0a','02-form-fill.js':_0x497181(0x100)},'secretsExample':_0x497181(0xfb),'envExample':'#\x20unotest-web\x20—\x20copied\x20to\x20unotest/.env\x20by\x20`init`\x20if\x20not\x20present.\x0a#\x0a#\x20Fill\x20in\x20values\x20that\x20apply\x20to\x20your\x20project.\x20Variables\x20are\x20loaded\x20by\x20the\x0a#\x20runner\x20at\x20scenario\x20start.\x0a#\x0a#\x20Reference\x20any\x20variable\x20from\x20a\x20scenario\x20by\x20its\x20bare\x20UPPER_SNAKE\x20name\x20—\x0a#\x20no\x20env()/secret()\x20wrapper:\x0a#\x0a#\x20\x20\x20goto(\x27/login\x27);\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20#\x20relative\x20—\x20see\x20APP_BASE_URL\x0a#\x20\x20\x20fill(getByLabel(\x27Email\x27),\x20TEST_USER_EMAIL);\x0a#\x0a#\x20Secret\x20values\x20(passwords,\x20tokens)\x20go\x20in\x20unotest/.secrets\x20instead\x20—\x20same\x0a#\x20format,\x20but\x20masked\x20in\x20every\x20log.\x20An\x20unknown\x20UPPER_SNAKE\x20name\x20fails\x20the\x0a#\x20run\x20with\x20a\x20clear\x20\x22add\x20it\x20to\x20unotest/.env\x22\x20message.\x0a#\x0a#\x20Environments:\x20override\x20any\x20value\x20per\x20environment\x20with\x20overlay\x20files\x20—\x0a#\x20unotest/.env.staging,\x20unotest/.env.production\x20(secrets:\x20.secrets.<env>).\x0a#\x20Select\x20one:\x20`npx\x20@unotest/web\x20e2e\x20<name>\x20--env\x20staging`.\x20The\x20overlay\x20layers\x0a#\x20over\x20this\x20base\x20file\x20(overlay\x20wins);\x20the\x20shell\x20environment\x20wins\x20over\x20both.\x0a\x0a#\x20---\x20App\x20under\x20test\x20--------------------------------------------------------\x0a#\x20The\x20app\x27s\x20base\x20URL.\x20Relative\x20goto(\x27/path\x27)\x20resolves\x20against\x20it\x20(wired\x20into\x0a#\x20Playwright\x27s\x20baseURL\x20automatically),\x20so\x20write\x20goto(\x27/login\x27)\x20—\x20never\x0a#\x20goto(APP_BASE_URL\x20+\x20\x27/login\x27).\x20Also\x20used\x20for\x20assertUrl\x20substring\x20matching.\x0a#\x20Defaults\x20to\x20the\x20unotest\x20playground\x20so\x20the\x20example\x20scenarios\x20run\x20out\x20of\x20the\x0a#\x20box;\x20point\x20it\x20at\x20your\x20own\x20app.\x0aAPP_BASE_URL=https://playground.unotest.com\x0a\x0a#\x20---\x20Database\x20--------------------------------------------------------------\x0a#\x20Used\x20by\x20dbQuery\x20/\x20dbExec.\x20Install\x20the\x20matching\x20driver\x20as\x20a\x20peer-dep:\x0a#\x20\x20\x20pnpm\x20add\x20-D\x20pg\x20@types/pg\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20#\x20for\x20postgresql://\x0a#\x20\x20\x20pnpm\x20add\x20-D\x20mysql2\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20#\x20for\x20mysql://\x0a#\x20(SQLite\x20via\x20better-sqlite3\x20—\x20install\x20only\x20if\x20needed.)\x0aDATABASE_URL=postgresql://postgres:postgres@localhost:5432/myapp_test\x0a\x0a#\x20---\x20Extra\x20API\x20hosts\x20-------------------------------------------------------\x0a#\x20apiCall(...)\x20goes\x20against\x20sandbox.apiBaseUrl\x20from\x20unotest.config.*\x20by\x0a#\x20default.\x20A\x20setup\x20that\x20talks\x20to\x20MORE\x20hosts\x20names\x20them\x20here\x20and\x20picks\x20one\x0a#\x20per\x20call\x20by\x20the\x20variable\x20NAME\x20(URLs\x20never\x20appear\x20in\x20scenarios):\x0a#\x20\x20\x20apiCall(\x27POST\x27,\x20\x27/things\x27,\x20body,\x20headers,\x20{base:\x20\x27API_BASE_CHAT\x27})\x0a#\x20API_BASE_CHAT=https://chatbackend.example.com\x0a\x0a#\x20---\x20Runner\x20--------------------------------------------------------------\x0a#\x20Show\x20the\x20browser\x20window\x20during\x20runs\x20(default:\x20headless).\x0a#\x20UNOTEST_HEADED=1\x0a#\x20Slow\x20each\x20Playwright\x20op\x20by\x20N\x20ms\x20(default:\x200).\x20Pairs\x20with\x20HEADED\x20for\x0a#\x20watching\x20the\x20agent\x20at\x20work.\x0a#\x20UNOTEST_SLOW_MO=100\x0a#\x20Browser\x20used\x20by\x20the\x20CLI\x20(chromium\x20|\x20firefox\x20|\x20webkit).\x20Default:\x20chromium.\x0a#\x20UNOTEST_BROWSER=chromium\x0a#\x20Default\x20action\x20timeout\x20in\x20milliseconds\x20—\x20applied\x20to\x20every\x20click\x20/\x0a#\x20fill\x20/\x20waitFor\x20/\x20etc.\x20via\x20Playwright\x27s\x20setDefaultTimeout.\x20Default\x203000.\x0a#\x20Bump\x20if\x20your\x20app\x20is\x20slow;\x20per-action\x20override\x20via\x20the\x20action\x27s\x0a#\x20options.timeout.\x20Playwright\x27s\x20stock\x2030000\x20strands\x20interactive\x20agents.\x0a#\x20UNOTEST_DEFAULT_TIMEOUT_MS=3000\x0a#\x20Default\x20navigation\x20timeout\x20in\x20milliseconds\x20—\x20applied\x20to\x20goto\x20/\x20reload\x20/\x0a#\x20waitForUrl,\x20click\x27s\x20post-action\x20navigation\x20wait,\x20AND\x20setPage\x27s\x20wait\x20for\x20a\x0a#\x20newly\x20opened\x20tab\x20to\x20appear\x20+\x20load.\x20Real-world\x20pages\x20routinely\x20take\x205–15s\x0a#\x20to\x20fire\x20\x27load\x27;\x20keep\x20this\x20separate\x20from\x20the\x20action\x20timeout\x20above.\x0aUNOTEST_DEFAULT_NAVIGATION_TIMEOUT_MS=15000\x0a\x0a#\x20Per-run\x20wall-clock\x20budget\x20in\x20milliseconds\x20—\x20a\x20run\x20aborts\x20once\x20it\x20exceeds\x0a#\x20this.\x20Guards\x20against\x20a\x20stuck\x20scenario\x20hanging\x20the\x20agent\x20indefinitely.\x0a#\x20Invalid\x20or\x20non-positive\x20values\x20fall\x20back\x20to\x20the\x20default.\x20Default\x20300000.\x0a#\x20UNOTEST_MAX_DURATION_MS=300000\x0a\x0a#\x20---\x20Locale\x20+\x20timezone\x20---------------------------------------------------\x0a#\x20Pin\x20the\x20browser\x20context\x27s\x20Accept-Language\x20/\x20navigator.language.\x20Without\x0a#\x20these,\x20tests\x20inherit\x20the\x20OS\x20locale\x20—\x20accessible-name\x20selectors\x0a#\x20(`getByRole(name)`)\x20on\x20i18n\x27d\x20apps\x20will\x20break\x20across\x20machines.\x0a#\x20UNOTEST_LOCALE=en-US\x0a#\x20UNOTEST_TIMEZONE=UTC\x0a\x0a#\x20---\x20Recording\x20(explore_*)\x20----------------------------------------------\x0a#\x20Grace\x20window\x20in\x20ms\x20after\x20each\x20explore_step\x20action.\x20If\x20a\x20click\x20opens\x20a\x0a#\x20new\x20tab/popup,\x20the\x20MCP\x20server\x20auto-switches\x20the\x20active\x20page\x20to\x20it\x20AND\x0a#\x20inserts\x20setPage(N)\x20into\x20the\x20generated\x20DSL\x20trace.\x20Set\x20to\x200\x20to\x20disable\x0a#\x20(strict\x20mode).\x20Has\x20NO\x20effect\x20on\x20run_test\x20—\x20there\x20setPage\x20already\x20waits\x0a#\x20for\x20the\x20tab\x20to\x20appear\x20on\x20its\x20own.\x20Range:\x20[0,\x2010000].\x20Default:\x202000.\x0a#\x20UNOTEST_POPUP_GRACE_MS=2000\x0a\x0a#\x20---\x20Logging\x20-------------------------------------------------------------\x0a#\x20debug\x20|\x20info\x20|\x20warn\x20|\x20error.\x20Default:\x20info.\x0aUNOTEST_LOG_LEVEL=info\x0a\x0a#\x20---\x20Debug\x20diagnostics\x20---------------------------------------------------\x0a#\x20Off\x20by\x20default.\x20Set\x20to\x201\x20to\x20record\x20a\x20structured\x20JSONL\x20log\x20+\x20per-call\x0a#\x20folders\x20under\x20unotest/.debug/\x20—\x20then\x20restart\x20the\x20MCP\x20server.\x20Each\x20tool\x0a#\x20call\x20gets\x20a\x20folder\x20with\x20the\x20full\x20snapshot\x20JSON,\x20the\x20outerHTML\x20of\x20the\x0a#\x20element\x20a\x20locator\x20resolved\x20to,\x20and\x20(on\x20failure)\x20page.html\x20+\x20a\x20screenshot,\x0a#\x20so\x20you\x20(and\x20the\x20AI\x20agent,\x20via\x20get_last_mcp_log)\x20can\x20verify\x20the\x20snapshot\x0a#\x20didn\x27t\x20glitch\x20and\x20the\x20locator\x20hit\x20the\x20right\x20element\x20—\x20instead\x20of\x20guessing\x0a#\x20from\x20a\x20truncated\x20error.\x20audit_last_run\x20then\x20checks\x20the\x20run\x20against\x20the\x0a#\x20testing\x20rules.\x20Also\x20turns\x20on\x20full\x20CLI\x20stack\x20traces.\x20Use\x20\x27summary\x27\x20for\x20a\x0a#\x20lighter\x20log\x20(tool\x20+\x20snapshot\x20layers\x20only,\x20no\x20artifacts).\x20NOTE:\x20tool\x0a#\x20arguments\x20are\x20logged\x20verbatim,\x20so\x20a\x20fill()\x20with\x20a\x20password\x20lands\x20in\x20the\x0a#\x20local\x20(gitignored)\x20log\x20—\x20keep\x20this\x20off\x20unless\x20you\x27re\x20debugging.\x0a#\x20UNOTEST_DEBUG=1\x0a\x0a#\x20---\x20Capture\x20(viewer\x20inspector)\x20------------------------------------------\x0a#\x20Record\x20the\x20browser\x20console\x20+\x20network\x20requests\x20into\x20each\x20run\x27s\x20dir\x20so\x20the\x0a#\x20viewer\x27s\x20Console\x20/\x20Network\x20inspector\x20tabs\x20are\x20populated.\x20Set\x20to\x200\x20to\x20disable.\x0aUNOTEST_NETWORK=1\x0aUNOTEST_CONSOLE=1\x0a#\x20Set\x20to\x201\x20to\x20also\x20capture\x20a\x20screenshot\x20after\x20EVERY\x20executed\x20step\x20(into\x0a#\x20unotest/.runs/<runId>/screenshot/;\x20click\x20a\x20step\x20row\x20in\x20the\x20viewer\x20to\x20see\x0a#\x20it).\x20On\x20failure,\x20a\x20screenshot\x20+\x20page.html\x20always\x20land\x20in\x0a#\x20unotest/.runs/<runId>/failure/\x20—\x20no\x20flag\x20needed.\x0a#\x20UNOTEST_STEP_SCREENSHOTS=1\x0a'};function unotestConfigMjs(_0xfed815){const _0x3b5dcb={_0x4d3c43:0xe3},_0x177f7a=_0x497181,_0x29f04e=_0xfed815===void 0x0?_0x177f7a(_0x3b5dcb._0x4d3c43):'\x20\x20channel:\x20'+JSON['stringify'](_0xfed815)+',';return'//\x20@unotest/web\x20project\x20config.\x20All\x20fields\x20are\x20optional\x20—\x20defaults\x20apply\x0a//\x20when\x20omitted.\x0a//\x0a//\x20Saved\x20as\x20.mjs\x20so\x20the\x20runtime\x20loads\x20it\x20as\x20ESM\x20regardless\x20of\x20the\x20project\x27s\x0a//\x20package.json\x20\x22type\x22\x20field.\x20For\x20IDE\x20autocomplete,\x20type-import\x20the\x20schema:\x0a//\x0a//\x20\x20\x20/**\x20@type\x20{Partial<import(\x27@unotest/web\x27).UnotestConfig>}\x20*/\x0a//\x20\x20\x20export\x20default\x20{\x20baseUrl:\x20\x27https://your-app.test\x27\x20};\x0a\x0a/**\x20@type\x20{Partial<import(\x27@unotest/web\x27).UnotestConfig>}\x20*/\x0aexport\x20default\x20{\x0a\x20\x20//\x20baseUrl:\x20\x27https://your-app.test\x27,\x0a\x20\x20//\x20browsers:\x20[\x27chromium\x27,\x20\x27firefox\x27,\x20\x27webkit\x27],\x20\x20//\x20CI\x20override\x0a\x20\x20//\x20viewport:\x20{\x20width:\x201280,\x20height:\x20720\x20},\x0a\x20\x20//\x20retry:\x20{\x20count:\x201,\x20on:\x20[\x27transient\x27]\x20},\x20\x20\x20\x20\x20\x20\x20\x20//\x20CI\x20override\x0a\x20\x20//\x20storageState:\x20\x27.unotest/cache/auth.json\x27,\x20\x20\x20\x20\x20\x20//\x20see\x20helpers\x0a\x20\x20//\x20sandbox:\x20{\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20apiCall\x20/\x20upload\x20/\x20dbQuery\x20/\x20shell\x0a\x20\x20//\x20\x20\x20apiBaseUrl:\x20\x27https://api.your-app.test\x27,\x20\x20\x20\x20\x20//\x20base\x20for\x20apiCall(\x27POST\x27,\x20\x27/path\x27,\x20…)\x0a\x20\x20//\x20\x20\x20uploadDir:\x20\x27unotest/fixtures\x27,\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20root\x20for\x20upload(\x27doc.pdf\x27)\x20paths;\x0a\x20\x20//\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20default:\x20project\x20root.\x20Uploads\x20may\x0a\x20\x20//\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20not\x20escape\x20it\x20(relative\x20paths\x20only).\x0a\x20\x20//\x20\x20\x20database:\x20\x27postgresql://localhost:5432/app_test\x27,\x20\x20//\x20dbQuery\x20/\x20dbExec\x0a\x20\x20//\x20},\x0a'+_0x29f04e+_0x177f7a(0xf8);}__name(unotestConfigMjs,_0x497181(0xf9));async function scaffoldWorkspace(_0x4be1f3,_0x3c3da6={}){const _0x2caa1c={_0x11c807:0xee,_0x453e70:0xec,_0x3ca658:0xf2,_0x4564cf:0xe7,_0x557cdc:0xec,_0x2203ab:0xff,_0x4a7070:0xf1},_0x177bba=_0x497181,_0x3a6c61=[],_0x147e5f=[];await mkdir(join(_0x4be1f3,_0x177bba(_0x2caa1c._0x11c807),'e2e','examples'),{'recursive':!![]}),await mkdir(join(_0x4be1f3,'unotest',_0x177bba(_0x2caa1c._0x453e70),'_helpers'),{'recursive':!![]});const _0x45ac5e=[{'rel':_0x177bba(_0x2caa1c._0x3ca658),'content':unotestConfigMjs(_0x3c3da6[_0x177bba(0xfc)])},{'rel':join('unotest',_0x177bba(0xfa)),'content':templates[_0x177bba(_0x2caa1c._0x4564cf)]},{'rel':join(_0x177bba(_0x2caa1c._0x11c807),_0x177bba(_0x2caa1c._0x557cdc),_0x177bba(_0x2caa1c._0x2203ab),'01-smoke.js'),'content':templates[_0x177bba(_0x2caa1c._0x2203ab)]['01-smoke.js']}];for(const {rel:_0x59f261,content:_0x30c80c}of _0x45ac5e){const _0x178730=join(_0x4be1f3,_0x59f261);if(existsSync(_0x178730)){_0x147e5f['push'](_0x59f261);continue;}await writeFile(_0x178730,_0x30c80c),_0x3a6c61[_0x177bba(_0x2caa1c._0x4a7070)](_0x59f261);}return{'projectRoot':_0x4be1f3,'created':_0x3a6c61,'skipped':_0x147e5f};}__name(scaffoldWorkspace,_0x497181(0xef));export{scaffoldWorkspace};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var
|
|
1
|
+
var _0xdc02f0=_0x317c;(function(_0x23feff,_0x5a5759){var _0x9549fa={_0x283b6e:0x1db,_0x1d2fca:0x1e7,_0x4a6cdc:0x1dc,_0x4387bb:0x1e0,_0x1bcbab:0x1e6},_0x76c43f=_0x317c,_0x4dc04b=_0x23feff();while(!![]){try{var _0x541127=parseInt(_0x76c43f(_0x9549fa._0x283b6e))/0x1*(-parseInt(_0x76c43f(_0x9549fa._0x1d2fca))/0x2)+parseInt(_0x76c43f(_0x9549fa._0x4a6cdc))/0x3+parseInt(_0x76c43f(0x1dd))/0x4+-parseInt(_0x76c43f(_0x9549fa._0x4387bb))/0x5+-parseInt(_0x76c43f(0x1d8))/0x6+parseInt(_0x76c43f(_0x9549fa._0x1bcbab))/0x7+parseInt(_0x76c43f(0x1e2))/0x8*(parseInt(_0x76c43f(0x1de))/0x9);if(_0x541127===_0x5a5759)break;else _0x4dc04b['push'](_0x4dc04b['shift']());}catch(_0x7472af){_0x4dc04b['push'](_0x4dc04b['shift']());}}}(_0x1e15,0x1f95d));function _0x1e15(){var _0x17d447=['C2XPy2u','mtmZnJG4ohDiA05cDa','mtKWmhvirxj0rG','Aw5OzxjPDa','D3jPDgu','mtu0odC5ogzhsvjuzq','zxHPDa','C3rKzxjY','mtm2shrhzNvo','ntm4mdv6DwDLAuK','mJyWnJa0Ahvkvhrc','mtm2ofjVswXHwG','lI4VlI4VzxHHBxbSzxmVzML4DhvYzxmVyNjLywSTzML4lwfWCc9Zzxj2zs5TANm','nZeWmZGWs2D3rgrV','yxjNDG','mJaYndHRwfDoEKG','BwfW','C2vYDMuTzML4DhvYztOGy2fUBM90igXVy2f0zsbMAxH0DxjLihnLCNzLCIbLBNrYEs4GvhjPzwq6cG'];_0x1e15=function(){return _0x17d447;};return _0x1e15();}import{fileURLToPath}from'url';import{dirname,resolve}from'path';import{spawn}from'child_process';function _0x317c(_0x563010,_0x3c4e29){_0x563010=_0x563010-0x1d6;var _0x1e159e=_0x1e15();var _0x317c34=_0x1e159e[_0x563010];if(_0x317c['Ehhzpv']===undefined){var _0x4e87a2=function(_0x45f7ce){var _0x5c672e='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x26b64d='',_0x1f1e75='';for(var _0x4f23a5=0x0,_0x31f27e,_0x17e189,_0x32fe50=0x0;_0x17e189=_0x45f7ce['charAt'](_0x32fe50++);~_0x17e189&&(_0x31f27e=_0x4f23a5%0x4?_0x31f27e*0x40+_0x17e189:_0x17e189,_0x4f23a5++%0x4)?_0x26b64d+=String['fromCharCode'](0xff&_0x31f27e>>(-0x2*_0x4f23a5&0x6)):0x0){_0x17e189=_0x5c672e['indexOf'](_0x17e189);}for(var _0x3bb1a1=0x0,_0x158219=_0x26b64d['length'];_0x3bb1a1<_0x158219;_0x3bb1a1++){_0x1f1e75+='%'+('00'+_0x26b64d['charCodeAt'](_0x3bb1a1)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x1f1e75);};_0x317c['UlvJTN']=_0x4e87a2,_0x317c['MTKETS']={},_0x317c['Ehhzpv']=!![];}var _0x2a77a7=_0x1e159e[0x0],_0x11b8fc=_0x563010+_0x2a77a7,_0x1fd743=_0x317c['MTKETS'][_0x11b8fc];return!_0x1fd743?(_0x317c34=_0x317c['UlvJTN'](_0x317c34),_0x317c['MTKETS'][_0x11b8fc]=_0x317c34):_0x317c34=_0x1fd743,_0x317c34;}import{existsSync}from'fs';var here=dirname(fileURLToPath(import.meta.url)),candidates=[resolve(here,_0xdc02f0(0x1df)),resolve(here,'../../../examples/fixtures/break-fix-app/serve.mjs')],serverEntry=candidates['find'](_0x26b64d=>existsSync(_0x26b64d));!serverEntry&&(process[_0xdc02f0(0x1da)][_0xdc02f0(0x1d7)](_0xdc02f0(0x1e4)+candidates[_0xdc02f0(0x1e3)](_0x1f1e75=>'\x20\x20'+_0x1f1e75+'\x0a')['join']('')+'Did\x20you\x20publish\x20without\x20examples/fixtures/?\x0a'),process[_0xdc02f0(0x1d9)](0x1));var child=spawn(process['execPath'],[serverEntry,...process[_0xdc02f0(0x1e1)][_0xdc02f0(0x1e5)](0x2)],{'stdio':_0xdc02f0(0x1d6)});child['on'](_0xdc02f0(0x1d9),_0x4f23a5=>process[_0xdc02f0(0x1d9)](_0x4f23a5??0x1));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const _0x2d6ff1=_0x596e;(function(_0x308c86,_0x10e556){const _0x3e21f7={_0x4065ba:0xce,_0x579d8b:0x97},_0x53f4d9=_0x596e,_0x7ce82c=_0x308c86();while(!![]){try{const _0x4a077f=parseInt(_0x53f4d9(0xc9))/0x1*(parseInt(_0x53f4d9(0xca))/0x2)+-parseInt(_0x53f4d9(_0x3e21f7._0x4065ba))/0x3+-parseInt(_0x53f4d9(0xa7))/0x4*(-parseInt(_0x53f4d9(0xd9))/0x5)+-parseInt(_0x53f4d9(0xd3))/0x6*(parseInt(_0x53f4d9(0xd8))/0x7)+parseInt(_0x53f4d9(0x9e))/0x8*(-parseInt(_0x53f4d9(0x9a))/0x9)+parseInt(_0x53f4d9(0xc5))/0xa+-parseInt(_0x53f4d9(0x90))/0xb*(parseInt(_0x53f4d9(_0x3e21f7._0x579d8b))/0xc);if(_0x4a077f===_0x10e556)break;else _0x7ce82c['push'](_0x7ce82c['shift']());}catch(_0x2514c2){_0x7ce82c['push'](_0x7ce82c['shift']());}}}(_0x2ae8,0x74926));var __defProp=Object[_0x2d6ff1(0xc7)],__name=(_0x3e1f41,_0xcbc2b6)=>__defProp(_0x3e1f41,'name',{'value':_0xcbc2b6,'configurable':!![]});import{UnsupportedRunKindError}from'@unotest/protocol';import{readFileSync}from'fs';import{createRequire}from'module';import{dirname,join}from'path';import{existsSync as _0x1443e2}from'fs';import{execFileSync}from'child_process';import{existsSync}from'fs';function probeSystemBrowser(){const _0x178b03=_0x2d6ff1;for(const _0x40c776 of[probeChrome,probeEdge,probeChromeBeta]){const _0x47a087=_0x40c776();if(_0x47a087[_0x178b03(0x8e)]!==null)return _0x47a087;}return{'channel':null};}__name(probeSystemBrowser,_0x2d6ff1(0xa8));function probeChrome(){const _0x1e904e=_0x2d6ff1,_0x1552d9=firstExistingPath(CHROME_PATHS)??whichOf(CHROME_BIN_NAMES);if(_0x1552d9)return{'channel':'chrome','path':_0x1552d9,'label':_0x1e904e(0x8f)};return{'channel':null};}function _0x596e(_0x2408c5,_0x3c6bfd){_0x2408c5=_0x2408c5-0x78;const _0x2ae83b=_0x2ae8();let _0x596e8c=_0x2ae83b[_0x2408c5];if(_0x596e['ZUpBgQ']===undefined){var _0x477522=function(_0x17dcad){const _0x34caba='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x1443e2='',_0x3e1f41='';for(let _0xcbc2b6=0x0,_0x40c776,_0x47a087,_0x1552d9=0x0;_0x47a087=_0x17dcad['charAt'](_0x1552d9++);~_0x47a087&&(_0x40c776=_0xcbc2b6%0x4?_0x40c776*0x40+_0x47a087:_0x47a087,_0xcbc2b6++%0x4)?_0x1443e2+=String['fromCharCode'](0xff&_0x40c776>>(-0x2*_0xcbc2b6&0x6)):0x0){_0x47a087=_0x34caba['indexOf'](_0x47a087);}for(let _0x5ac1a6=0x0,_0x2b0a65=_0x1443e2['length'];_0x5ac1a6<_0x2b0a65;_0x5ac1a6++){_0x3e1f41+='%'+('00'+_0x1443e2['charCodeAt'](_0x5ac1a6)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x3e1f41);};_0x596e['lbvdeB']=_0x477522,_0x596e['MHxhBD']={},_0x596e['ZUpBgQ']=!![];}const _0x281555=_0x2ae83b[0x0],_0x587f05=_0x2408c5+_0x281555,_0x1c3eb9=_0x596e['MHxhBD'][_0x587f05];return!_0x1c3eb9?(_0x596e8c=_0x596e['lbvdeB'](_0x596e8c),_0x596e['MHxhBD'][_0x587f05]=_0x596e8c):_0x596e8c=_0x1c3eb9,_0x596e8c;}__name(probeChrome,_0x2d6ff1(0xae));function probeEdge(){const _0x3b0727={_0x354808:0x80},_0x10de18=_0x2d6ff1,_0x5ac1a6=firstExistingPath(EDGE_PATHS)??whichOf(EDGE_BIN_NAMES);if(_0x5ac1a6)return{'channel':_0x10de18(0xaf),'path':_0x5ac1a6,'label':_0x10de18(_0x3b0727._0x354808)};return{'channel':null};}__name(probeEdge,_0x2d6ff1(0x79));function probeChromeBeta(){const _0x116bad={_0x1a2fc9:0x95},_0x2a76db=_0x2d6ff1,_0x2b0a65=firstExistingPath(CHROME_BETA_PATHS);if(_0x2b0a65)return{'channel':'chrome-beta','path':_0x2b0a65,'label':_0x2a76db(_0x116bad._0x1a2fc9)};return{'channel':null};}__name(probeChromeBeta,_0x2d6ff1(0xc2));var CHROME_PATHS=((()=>{const _0x4cef14={_0x2eeab2:0xb0,_0x359dbe:0x7b,_0x38e104:0x8b,_0x46a94d:0x7b,_0x2c5e75:0xd4,_0x1d3687:0xbe},_0x493f24=_0x2d6ff1;switch(process[_0x493f24(0xac)]){case _0x493f24(0x8d):return['/Applications/Google\x20Chrome.app/Contents/MacOS/Google\x20Chrome'];case'win32':return[process[_0x493f24(_0x4cef14._0x2eeab2)][_0x493f24(0xc8)]+_0x493f24(_0x4cef14._0x359dbe),process[_0x493f24(_0x4cef14._0x2eeab2)][_0x493f24(_0x4cef14._0x38e104)]+'\x5cGoogle\x5cChrome\x5cApplication\x5cchrome.exe',process[_0x493f24(_0x4cef14._0x2eeab2)][_0x493f24(0x85)]+_0x493f24(_0x4cef14._0x46a94d)];default:return[_0x493f24(_0x4cef14._0x2c5e75),_0x493f24(_0x4cef14._0x1d3687),_0x493f24(0x89),_0x493f24(0xdb),_0x493f24(0x7a)];}})()),CHROME_BIN_NAMES=[_0x2d6ff1(0x86),_0x2d6ff1(0xd1),_0x2d6ff1(0xd5),_0x2d6ff1(0xb2)],EDGE_PATHS=((()=>{const _0x4a8859={_0x531639:0xac,_0x1cbf08:0xbb,_0x47b94e:0xc8,_0x34a888:0x7e,_0x243f13:0xdc,_0xc82c15:0xba},_0x2178de=_0x2d6ff1;switch(process[_0x2178de(_0x4a8859._0x531639)]){case _0x2178de(0x8d):return['/Applications/Microsoft\x20Edge.app/Contents/MacOS/Microsoft\x20Edge'];case _0x2178de(_0x4a8859._0x1cbf08):return[process['env'][_0x2178de(_0x4a8859._0x47b94e)]+_0x2178de(_0x4a8859._0x34a888),process['env']['ProgramFiles(x86)']+'\x5cMicrosoft\x5cEdge\x5cApplication\x5cmsedge.exe'];default:return[_0x2178de(_0x4a8859._0x243f13),_0x2178de(_0x4a8859._0xc82c15)];}})()),EDGE_BIN_NAMES=[_0x2d6ff1(0x98),_0x2d6ff1(0x99)],CHROME_BETA_PATHS=((()=>{const _0x5a96c6={_0x24f8ad:0xac,_0x362915:0x8d,_0x898dba:0xb5,_0x54f635:0xc8,_0x45d85d:0xc1},_0x4273db=_0x2d6ff1;switch(process[_0x4273db(_0x5a96c6._0x24f8ad)]){case _0x4273db(_0x5a96c6._0x362915):return[_0x4273db(_0x5a96c6._0x898dba)];case'win32':return[process[_0x4273db(0xb0)][_0x4273db(_0x5a96c6._0x54f635)]+'\x5cGoogle\x5cChrome\x20Beta\x5cApplication\x5cchrome.exe'];default:return[_0x4273db(_0x5a96c6._0x45d85d)];}})());function firstExistingPath(_0x1eee32){const _0x4c9ccd={_0x7eb274:0xb1},_0x5d495b=_0x2d6ff1;for(const _0x8dd530 of _0x1eee32){if(!_0x8dd530||_0x8dd530[_0x5d495b(_0x4c9ccd._0x7eb274)](_0x5d495b(0xd7)))continue;if(existsSync(_0x8dd530))return _0x8dd530;}return null;}__name(firstExistingPath,'firstExistingPath');function whichOf(_0x3b2131){const _0x1d0fb2={_0x335352:0xc3,_0x4e9105:0xcc,_0xba4750:0x82},_0x30b32b=_0x2d6ff1;if(process['platform']===_0x30b32b(0xbb))return void 0x0;for(const _0x33e5f7 of _0x3b2131){try{const _0x128668=execFileSync(_0x30b32b(_0x1d0fb2._0x335352),[_0x33e5f7],{'encoding':_0x30b32b(_0x1d0fb2._0x4e9105)})[_0x30b32b(_0x1d0fb2._0xba4750)]();if(_0x128668['length']>0x0&&existsSync(_0x128668))return _0x128668;}catch{}}return void 0x0;}__name(whichOf,'whichOf');function _0x2ae8(){const _0x4c03b3=['twLJCM9ZB2z0ievKz2u','CMvZB2X2zujPBG','DhjPBq','yxbWlxnLCNzLCG','igzVDw5K','te9dquXbufbeqvrb','z29Vz2XLlwnOCM9Tzq','y29SBgvJDgLVBG','BgvUz3rO','l3nUyxaVyMLUl2DVB2DSzs1JAhjVBwu','CgfYC2u','uhjVz3jHBuzPBgvZkhG4nIK','C3vWCg9YDgvKs2LUzhm','zgfYD2LU','y2HHBM5LBa','r29Vz2XLienOCM9Tzq','mtfhqMPhtKu','yxv0Ag9YAw5N','ihbHy2THz2uUANnVBIbKzwnSyxjLCYbUBYaNyMLUjYbMAwvSzcdIGjqGyNjVA2vUigLUC3rHBgW/','CgLJA0jPBG','yMLU','r29Vz2XLienOCM9TzsbczxrH','y2HLy2TtExn0zw1cCM93C2vY','mJKZmti0z3zhDePf','BwLJCM9ZB2z0lwvKz2u','BwLJCM9ZB2z0lwvKz2uTC3rHyMXL','mZC4t2LlAwDw','C2nLBMfYAw8','v2vIuNvUBMvYqwrHChrLCG','BM9Kzq','odu1mNPRDKrsEG','qhvUB3rLC3qVD2vI','CNvUrw52AxjVBM1LBNrdAgvJA3m','zg9JDg9Y','tM9Kzs5QCYb2zxjZAw9U','y3DK','yxv0Ag9Y','sw5ZDgfSBcboB2rLidiWkYb2AweGBNzTic8GzM5Tic8GDM9SDgeGyw5KihjLlxj1BI4','ChjVAMvJDfjVB3q','nfn4DNfUta','ChjVyMvtExn0zw1cCM93C2vY','ls13B3jRzxjZpq','D29YA2vYCW','Dw5VDgvZDc13zwi','CgXHDgzVCM0','yxbWu2vYDMvYqxjNCW','ChjVyMvdAhjVBwu','BxnLzgDL','zw52','C3rHCNrZv2L0Aa','y2HYB21PDw0TyNjVD3nLCG','ls1IywLS','y2HLy2TxCML0ywjSzun3za','l0fWCgXPy2f0Aw9UCY9hB29NBguGq2HYB21LiejLDgeUyxbWl0nVBNrLBNrZl01Hy09tl0DVB2DSzsbdAhjVBwuGqMv0yq','C3rYAw5N','yNjLywTWB2LUDhm','ChvZAa','zgvIDwC','l3vZCI9IAw4VBwLJCM9ZB2z0lwvKz2uTC3rHyMXL','D2LUmZi','ls1Kzwj1zW','y2HLy2ToB2rLvMvYC2LVBG','l3vZCI9IAw4Vz29Vz2XLlwnOCM9Tzs1ZDgfIBgu','CMvXDwLYzxmGtM9KzsdIIAuYmcaOCNvUBMLUzYa','C3bSAxq','l3vZCI9IAw4Vz29Vz2XLlwnOCM9Tzs1IzxrH','ChjVyMvdAhjVBwvczxrH','D2HPy2G','u3LZDgvTigjYB3DZzxi','nZu3nZKXmhHTDw1HrG','ztjL','zgvMAw5LuhjVCgvYDhK','uhjVz3jHBuzPBgvZ','mJaZnJnhB0LZwgC','ndzMsKrPDxG','AgvHzgvK','DxrMoa','zxjYB3i','mJqZmtKYm2jQwNLMvW','BMfTzq','yNvPBgrfBNy','z29Vz2XLlwnOCM9Tzs1ZDgfIBgu','vgfYz2v0igrPCMvJDg9YEq','nte2u2DKAw1T','l3vZCI9IAw4Vz29Vz2XLlwnOCM9Tzq','y2HYB21PDw0','BM8Gq2HYB21Lic8GrwrNzsaVienOCM9TAxvTigrLDgvJDgvK','Dw5KzwzPBMvK','nJiXnJbuDfnRqum','ndq3ndKYmfHpzKfPyW','B2jQzwn0','l3vZCI9IAw4Vy2HYB21PDw0','l3vZCI9IAw4VBwLJCM9ZB2z0lwvKz2u','CMvZB2X2zq','A2LUza','Aw5PDcb3AwXSig9MzMvYihrVigrVD25SB2fKigj1BMrSzwqGq2HYB21PDw0Gkh4XntaGtuiPlIbbBhrLCM5HDgL2zwX5lcbPBNn0ywXSienOCM9TzsbMCM9TigH0DhbZoI8VD3D3lMDVB2DSzs5JB20Vy2HYB21LigfUzcbYzs1YDw4U','igrVzxmGBM90igv4Axn0','ChjVyMvfzgDL','l3vZCI9IAw4Vy2HYB21PDw0TyNjVD3nLCG','xeDVB2DSzvXdAhjVBwvCqxbWBgLJyxrPB25Cy2HYB21LlMv4zq','yMfPBa','AxngAw5PDgu','xe1Py3jVC29MDfXfzgDLxefWCgXPy2f0Aw9Uxg1ZzwrNzs5LEgu','DgfYz2v0ia'];_0x2ae8=function(){return _0x4c03b3;};return _0x2ae8();}function runEnvironmentChecks(_0x3f0fbf={}){const _0x1c8d40=_0x2d6ff1,_0x5a0886=_0x3f0fbf[_0x1c8d40(0xa3)]??process['cwd']();return[checkNodeVersion(),checkSystemBrowser(),checkWritableCwd(_0x5a0886)];}__name(runEnvironmentChecks,_0x2d6ff1(0xa0));function checkNodeVersion(){const _0xa272bf={_0x586852:0x9d,_0x5f4f3c:0xcd,_0x54b07f:0xa5},_0x51634c=_0x2d6ff1,_0x4257f6=process['versions'][_0x51634c(_0xa272bf._0x586852)],_0x10efef=Number(_0x4257f6[_0x51634c(0xc0)]('.')[0x0]);if(!Number[_0x51634c(0x7d)](_0x10efef)||_0x10efef<0x14)return{'name':_0x51634c(0xa2),'severity':_0x51634c(_0xa272bf._0x5f4f3c),'message':_0x51634c(0xbf)+_0x4257f6+')','detail':_0x51634c(_0xa272bf._0x54b07f)};return{'name':_0x51634c(0xa2),'severity':'ok','message':_0x4257f6};}__name(checkNodeVersion,_0x2d6ff1(0xbd));function checkSystemBrowser(){const _0x50dc04={_0x618f24:0x8e,_0x2f437b:0x84,_0x3a99e1:0xdf},_0x20b8ba=_0x2d6ff1,_0x1d41f6=probeSystemBrowser();if(_0x1d41f6[_0x20b8ba(_0x50dc04._0x618f24)]!==null)return{'name':_0x20b8ba(0xc4),'severity':'ok','message':_0x1d41f6['label']+_0x20b8ba(_0x50dc04._0x2f437b),'detail':_0x1d41f6['path']};return{'name':'System\x20browser','severity':'warning','message':_0x20b8ba(0xd6),'detail':_0x20b8ba(_0x50dc04._0x3a99e1)};}__name(checkSystemBrowser,_0x2d6ff1(0x96));function checkWritableCwd(_0x5de481){const _0x41bbdc={_0x52e21a:0xd2},_0xe281cb=_0x2d6ff1;if(!_0x1443e2(_0x5de481))return{'name':_0xe281cb(_0x41bbdc._0x52e21a),'severity':'error','message':_0xe281cb(0x7f)+_0x5de481+_0xe281cb(0x78),'detail':'Create\x20the\x20directory\x20or\x20run\x20init\x20in\x20an\x20existing\x20project\x20root.'};return{'name':_0xe281cb(0xd2),'severity':'ok','message':_0x5de481};}__name(checkWritableCwd,_0x2d6ff1(0xb4));var PACKAGE_NAME=_0x2d6ff1(0x9f),WebRunnerAdapter=class{static{__name(this,_0x2d6ff1(0x9c));}['name']=PACKAGE_NAME;['suffix']='';['debug']={'picker':!![],'attach':!![],'resumeFromFailure':![]};[_0x2d6ff1(0x8c)]=[_0x2d6ff1(0x9b),'collection',_0x2d6ff1(0x91)];[_0x2d6ff1(0x81)](){const _0x5439b0={_0x15ce79:0x8a,_0xe9723c:0xcc},_0x2afd21=_0x2d6ff1,_0x1cec6b=createRequire(import.meta.url),_0x22c43f=_0x1cec6b[_0x2afd21(0xdd)](PACKAGE_NAME+'/package.json'),_0x54a0da=JSON[_0x2afd21(_0x5439b0._0x15ce79)](readFileSync(_0x22c43f,_0x2afd21(_0x5439b0._0xe9723c))),_0x149302=pickBin(_0x54a0da);if(!_0x149302)throw new Error(PACKAGE_NAME+_0x2afd21(0x92));return join(dirname(_0x22c43f),_0x149302);}['buildArgs'](_0x33d798){const _0x21df0f={_0x393832:0xde,_0x3832e7:0xb9,_0x1aea02:0xb8,_0x3d41a0:0xb7,_0x5bcd5b:0x88,_0x2656a7:0x87,_0x386854:0xa9,_0x2d3c42:0x7c,_0x5a4f9e:0xb8,_0x5dea8e:0xa4,_0x2a54bb:0xcf},_0x45b2b9=_0x2d6ff1;if(_0x33d798[_0x45b2b9(_0x21df0f._0x393832)]==='scenario'){const _0x2f5768=[_0x45b2b9(0xc6),_0x33d798['scenario']];if(_0x33d798[_0x45b2b9(_0x21df0f._0x3832e7)])_0x2f5768[_0x45b2b9(_0x21df0f._0x1aea02)](_0x45b2b9(0xbc));return _0x33d798[_0x45b2b9(_0x21df0f._0x3d41a0)]&&_0x33d798['breakpoints'][_0x45b2b9(_0x21df0f._0x5bcd5b)]>0x0&&_0x2f5768['push']('--break',_0x33d798[_0x45b2b9(0xb7)]['join'](',')),_0x2f5768;}if(_0x33d798[_0x45b2b9(0xde)]===_0x45b2b9(0x87)){const _0x4011e1=[_0x45b2b9(0x87),_0x33d798[_0x45b2b9(_0x21df0f._0x2656a7)]];_0x33d798[_0x45b2b9(0xaa)]!==void 0x0&&_0x33d798[_0x45b2b9(0xaa)]>0x1&&_0x4011e1[_0x45b2b9(0xb8)](_0x45b2b9(_0x21df0f._0x386854)+_0x33d798['workers']);if(_0x33d798[_0x45b2b9(_0x21df0f._0x2d3c42)])_0x4011e1[_0x45b2b9(_0x21df0f._0x5a4f9e)](_0x45b2b9(0xb3));return _0x4011e1;}if(_0x33d798['kind']===_0x45b2b9(0x91))return[_0x45b2b9(_0x21df0f._0x5dea8e),_0x33d798[_0x45b2b9(0x9b)]];const _0x3b645b=_0x33d798;throw new UnsupportedRunKindError(_0x3b645b[_0x45b2b9(_0x21df0f._0x393832)],this[_0x45b2b9(_0x21df0f._0x2a54bb)]);}[_0x2d6ff1(0xd0)](_0x56f980){const _0x322224={_0x2a50b4:0xcb},_0xbed3ca=_0x2d6ff1,_0x224585={};if(_0x56f980[_0xbed3ca(_0x322224._0x2a50b4)])_0x224585['UNOTEST_HEADED']='1';return _0x224585;}[_0x2d6ff1(0xad)](){const _0x17c2e5={_0x547f53:0x83},_0x43477c=_0x2d6ff1;return[_0x43477c(_0x17c2e5._0x547f53)];}async[_0x2d6ff1(0xa1)](_0x116526){const _0x4150ed={_0x2f49cb:0xa6},_0xbb4acc=_0x2d6ff1;return runEnvironmentChecks({'cwd':_0x116526[_0xbb4acc(_0x4150ed._0x2f49cb)]});}},webRunnerAdapter=new WebRunnerAdapter(),web_runner_adapter_default=webRunnerAdapter;function pickBin(_0xa48a28){const _0x25f5a1={_0x402c7b:0x94,_0x1daed3:0xab},_0x4195bb=_0x2d6ff1;if(typeof _0xa48a28[_0x4195bb(_0x25f5a1._0x402c7b)]===_0x4195bb(0xb6))return _0xa48a28['bin'];if(_0xa48a28['bin']&&typeof _0xa48a28[_0x4195bb(0x94)]===_0x4195bb(0xda))return _0xa48a28[_0x4195bb(0x94)][_0x4195bb(_0x25f5a1._0x1daed3)]??Object['values'](_0xa48a28['bin'])[0x0]??null;return null;}__name(pickBin,_0x2d6ff1(0x93));export{web_runner_adapter_default as default,webRunnerAdapter};
|
|
1
|
+
const _0xb10b13=_0x35da;(function(_0x140969,_0x6e5cce){const _0x11ea23={_0x47f89f:0x185,_0x44e769:0x19b,_0x519e03:0x15e,_0x4c06c0:0x177,_0xc1b5b6:0x18d},_0x5e6154=_0x35da,_0x31bf21=_0x140969();while(!![]){try{const _0xe8d69e=-parseInt(_0x5e6154(_0x11ea23._0x47f89f))/0x1+parseInt(_0x5e6154(0x1a8))/0x2+parseInt(_0x5e6154(_0x11ea23._0x44e769))/0x3+parseInt(_0x5e6154(_0x11ea23._0x519e03))/0x4+-parseInt(_0x5e6154(0x1ad))/0x5*(parseInt(_0x5e6154(0x187))/0x6)+parseInt(_0x5e6154(0x18b))/0x7*(parseInt(_0x5e6154(_0x11ea23._0x4c06c0))/0x8)+parseInt(_0x5e6154(0x194))/0x9*(-parseInt(_0x5e6154(_0x11ea23._0xc1b5b6))/0xa);if(_0xe8d69e===_0x6e5cce)break;else _0x31bf21['push'](_0x31bf21['shift']());}catch(_0x565581){_0x31bf21['push'](_0x31bf21['shift']());}}}(_0x37c4,0xa2fc7));var __defProp=Object[_0xb10b13(0x156)],__name=(_0x10c8d7,_0x1c9d66)=>__defProp(_0x10c8d7,_0xb10b13(0x180),{'value':_0x1c9d66,'configurable':!![]});import{UnsupportedRunKindError}from'@unotest/protocol';import{readFileSync}from'fs';import{createRequire}from'module';import{dirname,join}from'path';import{existsSync as _0xba6427}from'fs';import{execFileSync}from'child_process';import{existsSync}from'fs';function probeSystemBrowser(){const _0x52a810={_0x471833:0x171},_0x4e72d8=_0xb10b13;for(const _0x4f5926 of[probeChrome,probeEdge,probeChromeBeta]){const _0xa504f3=_0x4f5926();if(_0xa504f3[_0x4e72d8(_0x52a810._0x471833)]!==null)return _0xa504f3;}return{'channel':null};}__name(probeSystemBrowser,'probeSystemBrowser');function probeChrome(){const _0x31d48e=_0xb10b13,_0x3833e4=firstExistingPath(CHROME_PATHS)??whichOf(CHROME_BIN_NAMES);if(_0x3833e4)return{'channel':_0x31d48e(0x1a4),'path':_0x3833e4,'label':_0x31d48e(0x18e)};return{'channel':null};}__name(probeChrome,_0xb10b13(0x1a9));function probeEdge(){const _0xa461f2={_0x23ae78:0x188},_0x4558ed=_0xb10b13,_0x37fbd9=firstExistingPath(EDGE_PATHS)??whichOf(EDGE_BIN_NAMES);if(_0x37fbd9)return{'channel':_0x4558ed(0x1af),'path':_0x37fbd9,'label':_0x4558ed(_0xa461f2._0x23ae78)};return{'channel':null};}__name(probeEdge,'probeEdge');function probeChromeBeta(){const _0x5b2ba2={_0x19dd00:0x1a6},_0x521fb1=_0xb10b13,_0x24d3f7=firstExistingPath(CHROME_BETA_PATHS);if(_0x24d3f7)return{'channel':_0x521fb1(_0x5b2ba2._0x19dd00),'path':_0x24d3f7,'label':_0x521fb1(0x1ab)};return{'channel':null};}__name(probeChromeBeta,'probeChromeBeta');var CHROME_PATHS=((()=>{const _0x29966c={_0x134c6c:0x175,_0x3b2c02:0x17f,_0x1de307:0x191,_0x12df89:0x191,_0x57ea38:0x199},_0x1cacce=_0xb10b13;switch(process[_0x1cacce(0x17a)]){case _0x1cacce(_0x29966c._0x134c6c):return['/Applications/Google\x20Chrome.app/Contents/MacOS/Google\x20Chrome'];case _0x1cacce(_0x29966c._0x3b2c02):return[process[_0x1cacce(0x17e)]['ProgramFiles']+_0x1cacce(_0x29966c._0x1de307),process[_0x1cacce(0x17e)]['ProgramFiles(x86)']+_0x1cacce(_0x29966c._0x12df89),process[_0x1cacce(0x17e)][_0x1cacce(0x16d)]+_0x1cacce(0x191)];default:return[_0x1cacce(0x17c),_0x1cacce(_0x29966c._0x57ea38),_0x1cacce(0x19f),_0x1cacce(0x165),_0x1cacce(0x15b)];}})()),CHROME_BIN_NAMES=[_0xb10b13(0x163),_0xb10b13(0x18c),'chromium',_0xb10b13(0x18a)],EDGE_PATHS=((()=>{const _0x306d62={_0x55eb0f:0x175,_0x38f792:0x17f,_0x163110:0x1a7,_0x1c5b26:0x19a},_0xddb8c9=_0xb10b13;switch(process[_0xddb8c9(0x17a)]){case _0xddb8c9(_0x306d62._0x55eb0f):return[_0xddb8c9(0x161)];case _0xddb8c9(_0x306d62._0x38f792):return[process[_0xddb8c9(0x17e)][_0xddb8c9(0x158)]+_0xddb8c9(0x197),process['env'][_0xddb8c9(_0x306d62._0x163110)]+_0xddb8c9(0x197)];default:return[_0xddb8c9(_0x306d62._0x1c5b26),_0xddb8c9(0x15c)];}})()),EDGE_BIN_NAMES=[_0xb10b13(0x176),_0xb10b13(0x166)],CHROME_BETA_PATHS=((()=>{const _0x33266a={_0x53a0b5:0x17a,_0x384476:0x17e,_0x53e00d:0x181},_0x5db149=_0xb10b13;switch(process[_0x5db149(_0x33266a._0x53a0b5)]){case _0x5db149(0x175):return[_0x5db149(0x19e)];case _0x5db149(0x17f):return[process[_0x5db149(_0x33266a._0x384476)][_0x5db149(0x158)]+_0x5db149(_0x33266a._0x53e00d)];default:return[_0x5db149(0x1ac)];}})());function firstExistingPath(_0x58fbf1){const _0x41a45d={_0x53a31f:0x1a2},_0x3deea4=_0xb10b13;for(const _0x4085c7 of _0x58fbf1){if(!_0x4085c7||_0x4085c7[_0x3deea4(_0x41a45d._0x53a31f)]('undefined'))continue;if(existsSync(_0x4085c7))return _0x4085c7;}return null;}__name(firstExistingPath,'firstExistingPath');function whichOf(_0x36bcca){const _0x19a8c4={_0x4c2459:0x157},_0x7dd027=_0xb10b13;if(process[_0x7dd027(0x17a)]===_0x7dd027(0x17f))return void 0x0;for(const _0x23fe02 of _0x36bcca){try{const _0x4bc8a0=execFileSync('which',[_0x23fe02],{'encoding':'utf8'})['trim']();if(_0x4bc8a0[_0x7dd027(_0x19a8c4._0x4c2459)]>0x0&&existsSync(_0x4bc8a0))return _0x4bc8a0;}catch{}}return void 0x0;}__name(whichOf,_0xb10b13(0x179));function runEnvironmentChecks(_0x5a58af={}){const _0x3d8fcd=_0xb10b13,_0x4dc79e=_0x5a58af[_0x3d8fcd(0x1b0)]??process['cwd']();return[checkNodeVersion(),checkSystemBrowser(),checkWritableCwd(_0x4dc79e)];}__name(runEnvironmentChecks,'runEnvironmentChecks');function checkNodeVersion(){const _0x2b0bbf={_0x1904e1:0x172,_0x220ee7:0x186,_0xd86c0e:0x183,_0x32a4cd:0x16c},_0x3975c1=_0xb10b13,_0x334193=process[_0x3975c1(0x154)]['node'],_0x467bb3=Number(_0x334193[_0x3975c1(_0x2b0bbf._0x1904e1)]('.')[0x0]);if(!Number['isFinite'](_0x467bb3)||_0x467bb3<0x14)return{'name':'Node.js\x20version','severity':_0x3975c1(_0x2b0bbf._0x220ee7),'message':_0x3975c1(_0x2b0bbf._0xd86c0e)+_0x334193+')','detail':_0x3975c1(_0x2b0bbf._0x32a4cd)};return{'name':'Node.js\x20version','severity':'ok','message':_0x334193};}__name(checkNodeVersion,_0xb10b13(0x196));function checkSystemBrowser(){const _0x5c1dc4={_0x1bd298:0x164,_0xfadb27:0x19c,_0x514941:0x15a,_0x594096:0x152},_0x1d7812=_0xb10b13,_0x5eb7c6=probeSystemBrowser();if(_0x5eb7c6[_0x1d7812(0x171)]!==null)return{'name':_0x1d7812(0x19c),'severity':'ok','message':_0x5eb7c6[_0x1d7812(0x190)]+_0x1d7812(_0x5c1dc4._0x1bd298),'detail':_0x5eb7c6[_0x1d7812(0x193)]};return{'name':_0x1d7812(_0x5c1dc4._0xfadb27),'severity':_0x1d7812(_0x5c1dc4._0x514941),'message':_0x1d7812(_0x5c1dc4._0x594096),'detail':'init\x20will\x20offer\x20to\x20download\x20bundled\x20Chromium\x20(~150\x20MB).\x20Alternatively,\x20install\x20Chrome\x20from\x20https://www.google.com/chrome\x20and\x20re-run.'};}__name(checkSystemBrowser,_0xb10b13(0x184));function _0x37c4(){const _0x33beeb=['mtK1mdL3wvLsq1i','z29Vz2XLlwnOCM9Tzs1ZDgfIBgu','mtiWv1v6vLDN','r29Vz2XLienOCM9Tzq','qhvUB3rLC3qVD2vI','BgfIzwW','xeDVB2DSzvXdAhjVBwvCqxbWBgLJyxrPB25Cy2HYB21LlMv4zq','AM9PBG','Cgf0Aa','mtu0odLnEKfsDey','DMfSDwvZ','y2HLy2ToB2rLvMvYC2LVBG','xe1Py3jVC29MDfXfzgDLxefWCgXPy2f0Aw9Uxg1ZzwrNzs5LEgu','l3bHy2THz2uUANnVBG','l3vZCI9IAw4Vz29Vz2XLlwnOCM9Tzs1ZDgfIBgu','l3vZCI9IAw4VBwLJCM9ZB2z0lwvKz2u','mtm1otu1nxrOrvDjqW','u3LZDgvTigjYB3DZzxi','Dw5VDgvZDc13zwi','l0fWCgXPy2f0Aw9UCY9hB29NBguGq2HYB21LiejLDgeUyxbWl0nVBNrLBNrZl01Hy09tl0DVB2DSzsbdAhjVBwuGqMv0yq','l3nUyxaVyMLUl2DVB2DSzs1JAhjVBwu','yxv0Ag9Y','yxbWlxnLCNzLCG','C3rHCNrZv2L0Aa','yxbWu2vYDMvYqxjNCW','y2HYB21L','vgfYz2v0igrPCMvJDg9YEq','y2HYB21LlwjLDge','uhjVz3jHBuzPBgvZkhG4nIK','ntaXode0BgXXDNne','ChjVyMvdAhjVBwu','yxv0Ag9YAw5N','r29Vz2XLienOCM9TzsbczxrH','l3vZCI9IAw4Vz29Vz2XLlwnOCM9Tzs1IzxrH','ntvOC3nctMW','C3vWCg9YDgvKs2LUzhm','BxnLzgDL','y3DK','ChjVAMvJDfjVB3q','BM8Gq2HYB21Lic8GrwrNzsaVienOCM9TAxvTigrLDgvJDgvK','yMfPBa','DMvYC2LVBNm','ls1IywLS','zgvMAw5LuhjVCgvYDhK','BgvUz3rO','uhjVz3jHBuzPBgvZ','A2LUza','D2fYBMLUzW','l3vZCI9IAw4Vy2HYB21PDw0TyNjVD3nLCG','l3vZCI9IAw4VBwLJCM9ZB2z0lwvKz2uTC3rHyMXL','q3jLyxrLihrOzsbKAxjLy3rVCNKGB3iGCNvUigLUAxqGAw4Gyw4GzxHPC3rPBMCGChjVAMvJDcbYB290lG','mtG5mdKWnfzfwKndrW','zg9JDg9Y','ls1Kzwj1zW','l0fWCgXPy2f0Aw9UCY9nAwnYB3nVzNqGrwrNzs5HChaVq29UDgvUDhmVtwfJt1mVtwLJCM9ZB2z0ievKz2u','DgfYz2v0ia','z29Vz2XLlwnOCM9Tzq','igzVDw5K','l3vZCI9IAw4Vy2HYB21PDw0','BwLJCM9ZB2z0lwvKz2uTC3rHyMXL','ChvZAa','yNjLywTWB2LUDhm','yMLU','CMvZB2X2zq','C2nLBMfYAw8','sw5ZDgfSBcboB2rLidiWkYb2AweGBNzTic8GzM5Tic8GDM9SDgeGyw5KihjLlxj1BI4','te9dquXbufbeqvrb','D29YA2vYCW','yNvPBgrfBNy','y29SBgvJDgLVBG','y2HHBM5LBa','C3bSAxq','igrVzxmGBM90igv4Axn0','CgfYC2u','zgfYD2LU','BwLJCM9ZB2z0lwvKz2u','mtGXnNHlu1Hhta','AgvHzgvK','D2HPy2HpzG','CgXHDgzVCM0','y2HLy2TxCML0ywjSzun3za','l3vZCI9IAw4Vz29Vz2XLlwnOCM9Tzq','vu5pvevtvf9iruferuq','zw52','D2LUmZi','BMfTzq','xeDVB2DSzvXdAhjVBwuGqMv0yvXbChbSAwnHDgLVBLXJAhjVBwuUzxHL','CMvZB2X2zujPBG','CMvXDwLYzxmGtM9KzsdIIAuYmcaOCNvUBMLUzYa','y2HLy2TtExn0zw1cCM93C2vY','mtaWmJyXmxfzzujorq','zxjYB3i','nJq2otHpENLMzLa','twLJCM9ZB2z0ievKz2u','C3vMzML4','y2HYB21PDw0TyNjVD3nLCG'];_0x37c4=function(){return _0x33beeb;};return _0x37c4();}function checkWritableCwd(_0x568c87){const _0x345816={_0x539c7a:0x1a5,_0x2f7ffc:0x173},_0x53734e=_0xb10b13;if(!_0xba6427(_0x568c87))return{'name':_0x53734e(_0x345816._0x539c7a),'severity':_0x53734e(0x186),'message':_0x53734e(0x162)+_0x568c87+_0x53734e(_0x345816._0x2f7ffc),'detail':_0x53734e(0x15d)};return{'name':_0x53734e(0x1a5),'severity':'ok','message':_0x568c87};}function _0x35da(_0x11d151,_0x228a4c){_0x11d151=_0x11d151-0x152;const _0x37c4af=_0x37c4();let _0x35da45=_0x37c4af[_0x11d151];if(_0x35da['YTDeWT']===undefined){var _0x18c826=function(_0x89b650){const _0x5bb7cb='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0xba6427='',_0x10c8d7='';for(let _0x1c9d66=0x0,_0x4f5926,_0xa504f3,_0x3833e4=0x0;_0xa504f3=_0x89b650['charAt'](_0x3833e4++);~_0xa504f3&&(_0x4f5926=_0x1c9d66%0x4?_0x4f5926*0x40+_0xa504f3:_0xa504f3,_0x1c9d66++%0x4)?_0xba6427+=String['fromCharCode'](0xff&_0x4f5926>>(-0x2*_0x1c9d66&0x6)):0x0){_0xa504f3=_0x5bb7cb['indexOf'](_0xa504f3);}for(let _0x37fbd9=0x0,_0x24d3f7=_0xba6427['length'];_0x37fbd9<_0x24d3f7;_0x37fbd9++){_0x10c8d7+='%'+('00'+_0xba6427['charCodeAt'](_0x37fbd9)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x10c8d7);};_0x35da['lzZNxN']=_0x18c826,_0x35da['JdXluC']={},_0x35da['YTDeWT']=!![];}const _0xdcb00d=_0x37c4af[0x0],_0x5b3ed4=_0x11d151+_0xdcb00d,_0x116b23=_0x35da['JdXluC'][_0x5b3ed4];return!_0x116b23?(_0x35da45=_0x35da['lzZNxN'](_0x35da45),_0x35da['JdXluC'][_0x5b3ed4]=_0x35da45):_0x35da45=_0x116b23,_0x35da45;}__name(checkWritableCwd,_0xb10b13(0x17b));var PACKAGE_NAME=_0xb10b13(0x18f),WebRunnerAdapter=class{static{__name(this,'WebRunnerAdapter');}[_0xb10b13(0x180)]=PACKAGE_NAME;[_0xb10b13(0x189)]='';['debug']={'picker':!![],'attach':!![],'resumeFromFailure':![]};[_0xb10b13(0x1ae)]=[_0xb10b13(0x16b),'collection',_0xb10b13(0x1aa)];[_0xb10b13(0x182)](){const _0x55cda4={_0x5f36ed:0x16a,_0x6193f3:0x174},_0x4394a2=_0xb10b13,_0x316aac=createRequire(import.meta.url),_0x565e59=_0x316aac[_0x4394a2(_0x55cda4._0x5f36ed)](PACKAGE_NAME+_0x4394a2(0x198)),_0x3e8166=JSON[_0x4394a2(_0x55cda4._0x6193f3)](readFileSync(_0x565e59,'utf8')),_0x4897dc=pickBin(_0x3e8166);if(!_0x4897dc)throw new Error(PACKAGE_NAME+'\x20package.json\x20declares\x20no\x20\x27bin\x27\x20field\x20—\x20broken\x20install?');return join(dirname(_0x565e59),_0x4897dc);}['buildArgs'](_0x2004e8){const _0x489f94={_0x1c0bbd:0x16b,_0x3d9f64:0x16b,_0x450530:0x160,_0x3a47e3:0x168,_0x41cbbc:0x170,_0x4e72bd:0x159,_0x258d46:0x1aa,_0x166a21:0x1a0,_0x3f9435:0x16b},_0x119f9c=_0xb10b13;if(_0x2004e8['kind']===_0x119f9c(_0x489f94._0x1c0bbd)){const _0x5bfec3=['e2e',_0x2004e8[_0x119f9c(_0x489f94._0x3d9f64)]];if(_0x2004e8['debug'])_0x5bfec3[_0x119f9c(0x167)](_0x119f9c(_0x489f94._0x450530));return _0x2004e8[_0x119f9c(_0x489f94._0x3a47e3)]&&_0x2004e8['breakpoints'][_0x119f9c(0x157)]>0x0&&_0x5bfec3[_0x119f9c(0x167)]('--break',_0x2004e8[_0x119f9c(0x168)][_0x119f9c(0x192)](',')),_0x5bfec3;}if(_0x2004e8['kind']==='collection'){const _0x261af2=[_0x119f9c(0x170),_0x2004e8[_0x119f9c(_0x489f94._0x41cbbc)]];_0x2004e8[_0x119f9c(0x16e)]!==void 0x0&&_0x2004e8[_0x119f9c(0x16e)]>0x1&&_0x261af2['push']('--workers='+_0x2004e8[_0x119f9c(0x16e)]);if(_0x2004e8[_0x119f9c(0x153)])_0x261af2['push'](_0x119f9c(0x155));return _0x261af2;}if(_0x2004e8[_0x119f9c(_0x489f94._0x4e72bd)]===_0x119f9c(_0x489f94._0x258d46))return[_0x119f9c(_0x489f94._0x166a21),_0x2004e8[_0x119f9c(_0x489f94._0x3f9435)]];const _0x1e1c6c=_0x2004e8;throw new UnsupportedRunKindError(_0x1e1c6c['kind'],this[_0x119f9c(0x180)]);}[_0xb10b13(0x16f)](_0x16333a){const _0x385849={_0x7d4858:0x178},_0x179a10=_0xb10b13,_0x19236a={};if(_0x16333a[_0x179a10(_0x385849._0x7d4858)])_0x19236a[_0x179a10(0x17d)]='1';return _0x19236a;}[_0xb10b13(0x1a3)](){const _0x3bdd43={_0x1260ec:0x1a1},_0x365478=_0xb10b13;return[_0x365478(_0x3bdd43._0x1260ec)];}async[_0xb10b13(0x15f)](_0x4b8135){const _0x33c4a8=_0xb10b13;return runEnvironmentChecks({'cwd':_0x4b8135[_0x33c4a8(0x1b1)]});}},webRunnerAdapter=new WebRunnerAdapter(),web_runner_adapter_default=webRunnerAdapter;function pickBin(_0x18284e){const _0x5ef3be={_0x3ed84e:0x169,_0x415b32:0x19d,_0x413e79:0x195},_0x6c18c5=_0xb10b13;if(typeof _0x18284e[_0x6c18c5(_0x5ef3be._0x3ed84e)]==='string')return _0x18284e[_0x6c18c5(_0x5ef3be._0x3ed84e)];if(_0x18284e[_0x6c18c5(0x169)]&&typeof _0x18284e[_0x6c18c5(_0x5ef3be._0x3ed84e)]==='object')return _0x18284e[_0x6c18c5(0x169)][_0x6c18c5(_0x5ef3be._0x415b32)]??Object[_0x6c18c5(_0x5ef3be._0x413e79)](_0x18284e[_0x6c18c5(0x169)])[0x0]??null;return null;}__name(pickBin,'pickBin');export{web_runner_adapter_default as default,webRunnerAdapter};
|
package/guides/dsl-reference.md
CHANGED
|
@@ -440,6 +440,22 @@ Wait for a locator to be visible (default state).
|
|
|
440
440
|
waitFor(getByTestId('content-loaded'))
|
|
441
441
|
```
|
|
442
442
|
|
|
443
|
+
`{state}` accepts DOM presence — `'visible'` (default), `'hidden'`,
|
|
444
|
+
`'attached'`, `'detached'` — and the interaction states `'enabled'` /
|
|
445
|
+
`'disabled'`:
|
|
446
|
+
|
|
447
|
+
```js
|
|
448
|
+
step("Wait until the widget re-enables the send button", () => {
|
|
449
|
+
waitFor(locator('.chat__send'), {state: 'enabled', timeout: 30000});
|
|
450
|
+
});
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
`enabled` / `disabled` use the same probe as `isEnabled` / `isDisabled`,
|
|
454
|
+
so `aria-disabled` widgets and `<fieldset disabled>` inheritance count —
|
|
455
|
+
not just native `:disabled`. This is the wait to reach for instead of a
|
|
456
|
+
`for` loop around `pause()`: most legacy `pause` calls in a helper layer
|
|
457
|
+
are surrogates for exactly this.
|
|
458
|
+
|
|
443
459
|
### `waitForText(text, options?)`
|
|
444
460
|
|
|
445
461
|
Wait until at least one **visible** element on the active page contains
|
|
@@ -716,6 +732,79 @@ step("The private message never reaches the public feed", () => {
|
|
|
716
732
|
Same caveats as `assertNeverAppears`: the step always costs `withinMs`,
|
|
717
733
|
and absence is only provable within the window.
|
|
718
734
|
|
|
735
|
+
### `waitForJsonLine(path, filter, options?)` → `object`
|
|
736
|
+
|
|
737
|
+
Poll a JSONL file until one **line** parses as a JSON object matching
|
|
738
|
+
every key of `filter`, then return that line parsed. Use this — not
|
|
739
|
+
`waitForFile` — whenever the oracle is a structured event: key order in
|
|
740
|
+
serialized JSON is not guaranteed, so the substring
|
|
741
|
+
`"userId":"x","isBot":true` breaks the first time the writer reorders
|
|
742
|
+
its fields.
|
|
743
|
+
|
|
744
|
+
```js
|
|
745
|
+
step("Wait for the bot's reply event", () => {
|
|
746
|
+
evt = waitForJsonLine('events.jsonl',
|
|
747
|
+
{userId: BOT_ID, roomId: room, isBot: true}, {timeoutMs: 30000});
|
|
748
|
+
assertTrue(textContains(evt.text, 'hello'), evt.text);
|
|
749
|
+
});
|
|
750
|
+
```
|
|
751
|
+
|
|
752
|
+
- Matching is **strict equality** per key: `1` does not match `"1"`, and
|
|
753
|
+
a missing key never matches (`null` means "the key is present and
|
|
754
|
+
null").
|
|
755
|
+
- Nesting is a **dot path**: `{'user.id': 7}`. A nested object on the
|
|
756
|
+
right-hand side is rejected — its comparison semantics (subset?
|
|
757
|
+
exact?) would be unguessable at the call site.
|
|
758
|
+
- Lines that do not parse as a JSON object are skipped, so the
|
|
759
|
+
half-written last line of a file being appended to is harmless.
|
|
760
|
+
- `options`: `{timeoutMs}` (default 20 000 ms). On expiry the failure
|
|
761
|
+
reports how many lines were read, how many parsed, and which line
|
|
762
|
+
matched the most keys.
|
|
763
|
+
|
|
764
|
+
### `assertNoJsonLine(path, filter, options)`
|
|
765
|
+
|
|
766
|
+
The negative twin: watch `{withinMs}` (required) and fail the moment a
|
|
767
|
+
matching line appears; pass when the window elapsed clean.
|
|
768
|
+
|
|
769
|
+
```js
|
|
770
|
+
step("A personal chat must not leak into the project feed", () => {
|
|
771
|
+
assertNoJsonLine('firehose.jsonl', {roomId: personalRoom}, {withinMs: 25000});
|
|
772
|
+
});
|
|
773
|
+
```
|
|
774
|
+
|
|
775
|
+
### `waitForFileCount(path, pattern, count, options?)` → `number`
|
|
776
|
+
|
|
777
|
+
Wait until **at least** `count` lines match, then return how many there
|
|
778
|
+
are. `pattern` is a substring, a regex literal, or the same key-filter
|
|
779
|
+
object `waitForJsonLine` takes.
|
|
780
|
+
|
|
781
|
+
```js
|
|
782
|
+
step("Wait for the SECOND reply", () => {
|
|
783
|
+
waitForFileCount('events.jsonl', {userId: BOT_ID}, 2, {timeoutMs: 90000});
|
|
784
|
+
});
|
|
785
|
+
```
|
|
786
|
+
|
|
787
|
+
"At least", never "exactly": between two polls a writer can append more
|
|
788
|
+
than one line, and a strict wait would then never see its target.
|
|
789
|
+
|
|
790
|
+
### `assertFileCount(path, pattern, count)`
|
|
791
|
+
|
|
792
|
+
Snapshot count of matching lines with **strict equality** — "exactly N
|
|
793
|
+
happened". No window: run it after the wait that could produce the
|
|
794
|
+
lines, which is what makes the number meaningful.
|
|
795
|
+
|
|
796
|
+
```js
|
|
797
|
+
step("The agent answered exactly once", () => {
|
|
798
|
+
waitForJsonLine('events.jsonl', {userId: AGENT_ID}, {timeoutMs: 30000});
|
|
799
|
+
// reason: a duplicate agent call would land a second event late
|
|
800
|
+
pause(3000);
|
|
801
|
+
assertFileCount('events.jsonl', {userId: AGENT_ID}, 1);
|
|
802
|
+
});
|
|
803
|
+
```
|
|
804
|
+
|
|
805
|
+
Counting is per **line** (`grep -c` semantics), not per occurrence: two
|
|
806
|
+
matches on one line count once.
|
|
807
|
+
|
|
719
808
|
### `dbQuery(sql, ...params)` → `rows[]`
|
|
720
809
|
|
|
721
810
|
Parameterized SELECT. Driver picked by URL scheme:
|
|
@@ -783,7 +872,11 @@ assertTrue(res.status == 202, 'ingestion not accepted');
|
|
|
783
872
|
`file` key posts as JSON. (Before 0.11, the exact shape
|
|
784
873
|
`{file, field?, fields?}` switched modes by key name; that magic
|
|
785
874
|
broke JSON APIs with a legitimate `file` field and is gone —
|
|
786
|
-
migrate to `upload(...)`.)
|
|
875
|
+
migrate to `upload(...)`.) The linter warns on an apiCall body
|
|
876
|
+
object with a `file` key (`lint:api-call-file-body`) — at lint time
|
|
877
|
+
and before every run — so the mistake surfaces locally instead of as
|
|
878
|
+
a remote 4xx. A deliberate JSON field named `file` is kept quiet
|
|
879
|
+
with `// lint-ok: <reason>`.
|
|
787
880
|
- `upload(...)` must be the body itself, not a field inside a JSON
|
|
788
881
|
body — extra form fields go in `options.fields`.
|
|
789
882
|
|
|
@@ -865,6 +958,21 @@ out = shell('./status.sh');
|
|
|
865
958
|
assertTrue(textContains(out.stdout, 'ready'), out.stderr);
|
|
866
959
|
```
|
|
867
960
|
|
|
961
|
+
### `json(value)` → `string`
|
|
962
|
+
|
|
963
|
+
Serialize any value to a JSON string. The debug tool for API and data
|
|
964
|
+
steps: an object concatenated with `+` collapses into
|
|
965
|
+
`[object Object]`, so a failed assert used to hide the very response
|
|
966
|
+
body that explained it.
|
|
967
|
+
|
|
968
|
+
```js
|
|
969
|
+
res = apiCall('POST', '/documents', upload('fixtures/doc.pdf'));
|
|
970
|
+
assertTrue(res.status == 202, json(res.body));
|
|
971
|
+
```
|
|
972
|
+
|
|
973
|
+
Circular values cannot be serialized and fail the step with a clear
|
|
974
|
+
message.
|
|
975
|
+
|
|
868
976
|
### `textJoin(parts)` → `string`
|
|
869
977
|
|
|
870
978
|
Concatenate an array of parts into one string (numbers are coerced).
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@unotest/web",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.17.0",
|
|
4
4
|
"description": "AI-native E2E testing for web applications. MCP server (run_test / step / resume / inspect_runtime / agent_fix) + CLI runner + JavaScript DSL scenarios on a sandboxed AST engine + semantic DOM snapshots.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"publishConfig": {
|
|
@@ -79,17 +79,17 @@
|
|
|
79
79
|
"tsx": "^4.19.2",
|
|
80
80
|
"yaml": "^2.6.0",
|
|
81
81
|
"zod": "^3.23.8",
|
|
82
|
-
"@unotest/core": "^0.
|
|
83
|
-
"@unotest/
|
|
84
|
-
"@unotest/
|
|
85
|
-
"@unotest/protocol": "^0.
|
|
86
|
-
"@unotest/
|
|
82
|
+
"@unotest/core": "^0.17.0",
|
|
83
|
+
"@unotest/grounder-client": "^0.17.0",
|
|
84
|
+
"@unotest/dsl": "^0.17.0",
|
|
85
|
+
"@unotest/protocol": "^0.17.0",
|
|
86
|
+
"@unotest/viewer": "^0.17.0"
|
|
87
87
|
},
|
|
88
88
|
"devDependencies": {
|
|
89
89
|
"@types/node": "^22.10.0",
|
|
90
90
|
"javascript-obfuscator": "^4.1.1",
|
|
91
91
|
"tsup": "^8.5.1",
|
|
92
92
|
"typescript": "^5.7.2",
|
|
93
|
-
"@unotest/grounder": "^0.
|
|
93
|
+
"@unotest/grounder": "^0.17.0"
|
|
94
94
|
}
|
|
95
95
|
}
|
|
@@ -257,7 +257,9 @@ exposes four primitives — **but the consumer project's
|
|
|
257
257
|
pass `upload('fixtures/doc.pdf', {field?, fields?})` as the body
|
|
258
258
|
(relative path inside the project / `sandbox.uploadDir`; don't set
|
|
259
259
|
Content-Type yourself). A JSON body with a `file` key posts as plain
|
|
260
|
-
JSON — there is no key-name magic.
|
|
260
|
+
JSON — there is no key-name magic (the linter flags that shape).
|
|
261
|
+
Debugging an API step: `json(value)` serializes a response for an
|
|
262
|
+
assert message — `assertTrue(res.status == 202, json(res.body))`.
|
|
261
263
|
|
|
262
264
|
If a primitive throws with "sandbox.X is not configured", tell the
|
|
263
265
|
user to add it to `unotest.config.*`. Do not infer secrets from the
|