@unotest/web 0.31.0 → 0.32.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/CHANGELOG.md +117 -0
- package/README.md +66 -2
- package/dist/config/schema.d.ts +6 -6
- package/dist/config/schema.js +1 -1
- package/dist/driver/index.js +1 -1
- package/dist/dsl/index.d.ts +20 -0
- package/dist/dsl/index.js +1 -1
- package/dist/dsl/web-dsl-language-service.js +1 -1
- package/dist/mcp/server.js +1 -1
- package/dist/runner/cli.d.ts +1 -6
- 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/agent-integration.md +148 -13
- package/package.json +8 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
const _0x1ad552=_0x5b12;(function(_0x177992,_0x2d74bf){const _0x1598d5={_0x3fa744:0x179,_0x4cd730:0x162,_0xb1cbb0:0x15f},_0x49a3b0=_0x5b12,_0x123839=_0x177992();while(!![]){try{const _0x1209aa=-parseInt(_0x49a3b0(0x178))/0x1+-parseInt(_0x49a3b0(_0x1598d5._0x3fa744))/0x2+-parseInt(_0x49a3b0(0x17e))/0x3+parseInt(_0x49a3b0(_0x1598d5._0x4cd730))/0x4+parseInt(_0x49a3b0(0x168))/0x5*(parseInt(_0x49a3b0(0x173))/0x6)+parseInt(_0x49a3b0(0x16b))/0x7*(-parseInt(_0x49a3b0(0x174))/0x8)+parseInt(_0x49a3b0(_0x1598d5._0xb1cbb0))/0x9;if(_0x1209aa===_0x2d74bf)break;else _0x123839['push'](_0x123839['shift']());}catch(_0x4eb0fc){_0x123839['push'](_0x123839['shift']());}}}(_0x226f,0x5da5c));function _0x5b12(_0x52052d,_0x50bcd1){_0x52052d=_0x52052d-0x158;const _0x226fa1=_0x226f();let _0x5b1268=_0x226fa1[_0x52052d];if(_0x5b12['Gcfexk']===undefined){var _0x413626=function(_0xeddaaa){const _0x799597='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x3f51f4='',_0x3ffe18='';for(let _0x39a290=0x0,_0x530e43,_0x4bef55,_0x4d5aa2=0x0;_0x4bef55=_0xeddaaa['charAt'](_0x4d5aa2++);~_0x4bef55&&(_0x530e43=_0x39a290%0x4?_0x530e43*0x40+_0x4bef55:_0x4bef55,_0x39a290++%0x4)?_0x3f51f4+=String['fromCharCode'](0xff&_0x530e43>>(-0x2*_0x39a290&0x6)):0x0){_0x4bef55=_0x799597['indexOf'](_0x4bef55);}for(let _0x356f27=0x0,_0x128f96=_0x3f51f4['length'];_0x356f27<_0x128f96;_0x356f27++){_0x3ffe18+='%'+('00'+_0x3f51f4['charCodeAt'](_0x356f27)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x3ffe18);};_0x5b12['BsvTnB']=_0x413626,_0x5b12['lPoeik']={},_0x5b12['Gcfexk']=!![];}const _0x2daff5=_0x226fa1[0x0],_0x13a54a=_0x52052d+_0x2daff5,_0x1b50d7=_0x5b12['lPoeik'][_0x13a54a];return!_0x1b50d7?(_0x5b1268=_0x5b12['BsvTnB'](_0x5b1268),_0x5b12['lPoeik'][_0x13a54a]=_0x5b1268):_0x5b1268=_0x1b50d7,_0x5b1268;}var __defProp=Object[_0x1ad552(0x16e)],__name=(_0x3f51f4,_0x3ffe18)=>__defProp(_0x3f51f4,_0x1ad552(0x17f),{'value':_0x3ffe18,'configurable':!![]});import{mkdir,writeFile}from'fs/promises';import{existsSync}from'fs';function _0x226f(){const _0x4b401b=['mtC4mda4ChLuyK9t','DMvYC2LVBG','C2nHzMzVBgrxB3jRC3bHy2u','lY8GqhvUB3rLC3qVD2vIihbYB2PLy3qGy29UzMLNlIbbBgWGzMLLBgrZigfYzsbVChrPB25HBcdIGjqGzgvMyxvSDhmGyxbWBhKklY8GD2HLBIbVBwL0DgvKlGOVlWOVlYbtyxzLzcbHCYaUBwPZihnVihrOzsbYDw50Aw1LigXVywrZigL0igfZievttsbYzwDHCMrSzxnZig9MihrOzsbWCM9Qzwn0j3mklY8GCgfJA2fNzs5QC29Uicj0ExbLiIbMAwvSzc4GrM9YieLersbHDxrVy29TCgXLDguSihr5CguTAw1WB3j0ihrOzsbZy2HLBwe6cI8VcI8VicaGlYOQieb0ExbLihTqyxj0AwfSpgLTCg9YDcGNqhvUB3rLC3qVD2vIjYKUvw5VDgvZDenVBMzPzZ59icOVcI8VicaGzxHWB3j0igrLzMf1BhqGEYbIyxnLvxjSoIaNAhr0Chm6lY95B3vYlwfWCc50zxn0jYb9oWOklYOQieb0ExbLihTqyxj0AwfSpgLTCg9YDcGNqhvUB3rLC3qVD2vIjYKUvw5VDgvZDenVBMzPzZ59icOVcMv4Cg9YDcbKzwzHDwX0ihSkicaVlYbIyxnLvxjSoIaNAhr0Chm6lY95B3vYlwfWCc50zxn0jYWkicaVlYbICM93C2vYCZOGwYDJAhjVBwL1BsCSicDMAxjLzM94jYWGj3DLyMTPDcDDlcaGlY8Gq0KGB3zLCNjPzgukicaVlYb2Awv3Cg9YDdOGEYb3Awr0AdOGmti4mcWGAgvPz2H0oIa3mJaGFsWkicaVlYbYzxrYEtOGEYbJB3vUDdOGmsWGB246ifSNDhjHBNnPzw50j10GFsWGicaGicaGic8Vienjig92zxjYAwrLcIaGlY8GC3rVCMfNzvn0yxrLoIaNlNvUB3rLC3qVy2fJAguVyxv0Ac5QC29UjYWGicaGicaVlYbZzwuGAgvSCgvYCWOGic8VihnHBMrIB3G6ihSGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGlY8GyxbPq2fSBcaVihvWBg9HzcaVigrIuxvLCNKGlYbZAgvSBaOGic8VicaGyxbPqMfZzvvYBdOGj2H0DhbZoI8VyxbPlNLVDxiTyxbWlNrLC3qNlcaGicaGlY8GyMfZzsbMB3iGyxbPq2fSBcGNue9tvcCSicCVCgf0AcCSiokaPIKkicaVlYaGihvWBg9HzerPCJOGj3vUB3rLC3qVzML4DhvYzxmNlcaGicaGicaGicaGicaGic8VihjVB3qGzM9YihvWBg9HzcGNzg9JlNbKzICPihbHDgHZoWOGic8VicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGlY8GzgvMyxvSDdOGChjVAMvJDcbYB290lIbvCgXVywrZig1HEqOGic8VicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGlY8GBM90igvZy2fWzsbPDcaOCMvSyxrPDMuGCgf0AhmGB25SEsKUcIaGlY8GicbKyxrHyMfZztOGj3bVC3rNCMvZCwW6lY9SB2nHBgHVC3q6ntqZmI9HChbFDgvZDcCSicaVlYbKyLf1zxj5ic8GzgjfEgvJcIaGlY8GFsWk','mJmYmtm1t1HhrhjX','mZK0ntqYChr1yvPz','zw52rxHHBxbSzq','mdeTC21VA2uUANm','ztjL','lY8GrxHHBxbSzsaWmIdIGjqGzMLSBcbHBIbPBNb1DcaRigfZC2vYDcb0AguGyxbWihjLywn0zwqUcI8VcI8ViefNywLUC3qGCgXHEwDYB3vUzc51BM90zxn0lMnVBs9Zy2vUyxjPB3mVyMLNlxrHyMXLlIbezw1VBNn0CMf0zxmGz2v0qNLsB2XLcI8VigzVCIbHigXHyMvSBgvKigLUChv0lcb0ExbLzcbPBNb1Dcb2AweGzMLSBcGPlcbHBMqGysbSB2nHDg9Yig1LDgHVzc1JAgfPBGOVlYaOz2v0qNLsB2XLkcDYB3CNks5MAwX0zxiOE2HHC1rLEhr9ks5MAxjZDcGPksbPBIbHBIbHC3nLCNrPB24UcI8Vifj1BIb3AxrOoIaGBNb4ieb1BM90zxn0l3DLyIbLmMuGzxHHBxbSzxmVmdiTzM9YBs1MAwXScGPMDw5JDgLVBIb0zxn0x2zVCM1FzMLSBf9OyxbWEv9WyxrOkcKGEWOGihn0zxaOiKzPBhrLCIb0AguGqMLNifrHyMXLigj5igeGBMfTzsiSicGPid0+ihSkicaGigDVDg8OjY9Zy2vUyxjPB3mVyMLNlxrHyMXLjYK7cIaGicbMAwXSkgDLDej5uM9SzsGNDgv4DgjVEcCSihTUyw1LoIaNrMLSDgvYigj5ig5HBwuNFsKSicDvBweGuxvPBM4NktSkicb9ktSkcIaGC3rLCcGIrMLSDgvYAw5NihjLDMvHBhmGDgHLienSzwfYigzPBhrLCIbJB250CM9SigfUzcbTyxrJAgLUzYbYB3DZiIWGkcKGpt4GEWOGicaGyxnZzxj0vMLZAwjSzsHNzxrcEvjVBguOj2j1DhrVBICSihTUyw1LoIaNq2XLyxiGzMLSDgvYj30PktSkicaGigfZC2vYDfzPC2LIBguOz2v0qNLsB2XLkcDYB3CNks5MAwX0zxiOE2HHC1rLEhq6icDvBweGuxvPBM4NFsKUzMLYC3qOksK7cIaGFsK7cN0k','mtu2mde2mMLdB3L6uG','BMfTzq','DxrMoa','Dw5VDgvZDenVBMzPz01QCW','ChvZAa','ANnJB25MAwCUANnVBG','lY8GrxHHBxbSzsaWmsdIGjqGC21VA2u6ig5HDMLNyxrLicSGy2XPy2SGkYbvuKWGyxnZzxj0Aw9UlGOVlWOVlYbuAguGBwLUAw1HBcb0AhjLzs1ZDgvWihbHDhrLCM4UieHPDhmGCgXHEwDYB3vUzc51BM90zxn0lMnVBsbZBYbUBYbWCM9Qzwn0cI8VihnLDhvWigLZig5LzwrLzc4GuNvUihDPDgG6icbUChGGqhvUB3rLC3qVD2vIiguYzsbLEgfTCgXLCY8Wms1ZBw9RzqOkzNvUy3rPB24GDgvZDf9ZBw9Rzv9WBgf5z3jVDw5KkcKGEWOGihn0zxaOiK9Wzw4GDgHLiejPzYbuywjSzsbZy2vUyxjPBYbMCM9TihrOzsbWBgf5z3jVDw5KigLUzgv4iIWGkcKGpt4GEWOGicaGz290BYGNlYCPoWOGicaGy2XPy2SOz2v0qNLsB2XLkcDSAw5RjYWGE25HBwu6icDcAwCGvgfIBguNlcbLEgfJDdOGDhj1zx0PktSkicaGigfZC2vYDfvYBcGNl3nJzw5HCMLVCY9IAwCTDgfIBguNktSkicb9ktSkFqO','igHHCYbUBYb1C2fIBguGiNzLCNnPB24IigzPzwXK','Dw5VDgvZDa','nJa0odm2mfPSqKTptG','CgfJA2fNzs5QC29U','x2HLBhbLCNm','nJGXnZq0CKT0yvLS','Dw5VDgvZDc1ZDwL0zq','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','CMvHze93BLzLCNnPB24','zxHHBxbSzxm','C3rYAw5N','nwT6Euz2uG','EWOGicjJB21WAwXLCK9WDgLVBNmIoIb7cIaGicaIy2HLy2TkCYi6igzHBhnLlaOGicaGiNrHCMDLDci6icjLCZiWmJiIlaOGicaGiMXPyIi6ifSIzxmYmdiYiL0ScIaGicaIDhLWzxmIoIbBxqOGih0ScIaGiMLUy2X1zguIoIbBcIaGicaIkIOVkI5QCYiScIaGicaIlI4VlNvUB3rLC3qVDhLWzxmVzw52lMqUDhmIlaOGicaGiI4VBM9Kzv9TB2r1BgvZl0b1BM90zxn0l3DLyI90ExbLCY91BM90zxn0lwrZBc5KlNrZiGOGif0kFqO','C3rYAw5NAwz5','mZvYAfHYAKi','iYmGrtjfihrLC3rPBMCGD2L0AcbaDw5VDgvZDc93zwikcKbbr0vovfmUBwqkcKzVCIbHBNKGCMvXDwvZDcb0BYb3CML0zsWGCMvJB3jKlcbVCIbYDw4Gyw4Gzw5KlxrVlwvUzcb0zxn0lcbVCgvUihrOzqPGD3jPDguTztjLlxrLC3rGihnRAwXSicHVCIbYDw4Gyc93CML0zs1LmMuTDgvZDgaPigfUzcbKCML2zsb0AguGyNjVD3nLCIb0AhjVDwDOcNrOzsbGDw5VDgvZDc13zwjGie1ducb0B29SCYaOyg5LD19JB250zxH0ycdIHPiGygv4CgXVCMvFC3rLCgaG4OAsigbNzxrFCgfNzv9ZBMfWC2HVDgak4OAsigbYDw5FDgvZDgaPlIbeBYbUB3qGAgfUzc1HDxrOB3iGDgvZDhmGyMXPBMqGB3iGBwfWihrOzsbWCM9Qzwn0ihDPDgGkygzPBMrGl2bSC2aVygf3A2aG4OcuihrOzsbZA2LSBcDZifbOyxnLidaGBgLZDhmGDgHLigzPBgvZihrVihjLywqU','icaVlYbJAgfUBMvSoIaNy2HYB21LjYWGicaGicaGicaGicaGicaGicaGicaGicaGicaGlY8Gj2nOCM9TzsCGlYaNBxnLzgDLjYaVig51BgWGkgj1BMrSzwqP','zgvMAw5LuhjVCgvYDhK','cIaGlY8GDMLLD2vYoIb7cIaGlY8GicbWB3j0oIa1mtCZlcaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGic8VigrLzMf1Bhq6ihjHBMrVBsbMCMvLihbVCNqkicaVlYaGigjYB3DZzxi6ihrYDwuSicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGlY8GzgvMyxvSDdOGDhj1zsaOyxv0BY1VCgvUig9Uigb2Awv3zxjGkqOGic8Vih0ScN07cG','CgfJA2fNzs5QC29Uigf0ia','iYb1BM90zxn0lxDLyIdIGjqGC2vJCMv0ihnJzw5HCMLVihzHCMLHyMXLCY4Gq3jLyxrLzcbIEsbGAw5PDgaSigDPDgLNBM9YzwqUcImkiYbtyw1LieTfwt1wquXvrsbMB3jTyxqGyxmGDw5VDgvZDc8Uzw52lcbIDxqGDMfSDwvZigHLCMuGyxjLihrYzwf0zwqGyxmkiYbtrunsrvq6ihrOzxKGyxjLig1HC2TLzcaOC2HVD24GyxmGyokaUxnLy3jLDdPlrvNIGlPGksbHBNL3AgvYzsb0AguGCNvUBMvYig9YcImGtunqigrLyNvNigXVzYb3B3vSzcbVDgHLCNDPC2uGD3jPDguGDgHLBsdIGjqGzMLSBcGPihzHBhvLCYWGvvjmCYWGzxzHBhvHDgukiYbZDhjPBMDZlIbszwzLCMvUy2uGDgHLBsbPBIbHihnJzw5HCMLVigj5ihrOzwLYigjHCMuGvvbqrvjFu05bs0uGBMfTzsWGDgHLcImGC2fTzsb3yxKGyxmGlMvUDIb2yxjPywjSzxm6cImkiYaGigzPBgWOz2v0qNLmywjLBcGNugfZC3DVCMqNksWGueftu1DpuKqPoWOJcImGu2vJCMv0CYbHCMuGtK9uigv4Cg9YDgvKihrVihn1yNbYB2nLC3nLCYaOC2HLBgWOksKG4OcuihrOzxKGC3rHEsbPBIb0AgukiYb2yxjPywjSzsbZDg9Yzs4GqsbZDwjWCM9JzxnZihrOyxqGz2vUDwLUzwX5ig5LzwrZig9UzsaOysbSAxn0zw5LCIb3AxrOigekiYb0B2TLBIKGz2v0CYbPDcb2AweGDgHLigv4CgXPy2L0igfSBg93BgLZDcbPBIb1BM90zxn0lMnVBMzPzY4QoGOJicaGC2fUzgjVEdOGEYbLEhbVCNrtzwnYzxrZoIbBj1rps0voj10GFqOJifb1DcbUB24TC2vJCMv0ihzHBhvLCYaOvvjmCYWGzw1HAwXZlcbPzhmPigLUihvUB3rLC3qVlMvUDI4kiWOJiezmruvux0vyqu1qteukte9hsu49cLbbu1nxt1jepqPut0TftJ0k','BgvUz3rO','mZyXmdKXngnpC1nLuG'];_0x226f=function(){return _0x4b401b;};return _0x226f();}import{join}from'path';var templates={'jsconfigJson':_0x1ad552(0x169),'scenarioTemplate':'//\x20Move\x20+\x20rename\x20this\x20file\x20to\x20<feature>/<your_name>.js\x20(e.g.\x0a//\x20auth/login.js)\x20and\x20the\x20function\x20below\x20to\x20test_<your_name>().\x20Scenarios\x20live\x0a//\x20in\x20feature\x20subfolders,\x20NOT\x20the\x20e2e\x20root\x20—\x20the\x20linter\x20(lint:scenario-in-root)\x0a//\x20rejects\x20a\x20test\x20file\x20placed\x20directly\x20in\x20unotest/e2e/.\x20The\x20loader\x20derives\x20the\x0a//\x20entry\x20name\x20from\x20the\x20file\x20basename\x20—\x20kebab-case\x20dashes\x20become\x20underscores.\x0a\x0a//\x20Every\x20executable\x20step\x20must\x20sit\x20inside\x20a\x20step(\x22...\x22,\x20()\x20=>\x20{\x20…\x20})\x20block.\x20The\x0a//\x20title\x20is\x20a\x20plain-English\x20description\x20of\x20the\x20group;\x20the\x20steps\x20inside\x20are\x0a//\x20the\x20implementation.\x20Group\x20by\x20intent\x20(Setup\x20/\x20Enter\x20/\x20Act\x20/\x20Assert\x20or\x0a//\x20whatever\x20reads\x20well)\x20—\x20one\x20block\x20per\x20logical\x20chunk.\x0a\x0afunction\x20test_your_name_here()\x20{\x0a\x20\x20step(\x22Seed\x20a\x20known\x20user\x20via\x20DB\x20/\x20API\x20fixtures\x20from\x20_helpers/\x22,\x20()\x20=>\x20{\x0a\x20\x20\x20\x20//\x20\x20\x20\x20wipe_e2e_users();\x0a\x20\x20\x20\x20//\x20\x20\x20\x20user_id\x20=\x20seed_user(\x27alice@example.com\x27,\x20\x27secret\x27);\x0a\x20\x20});\x0a\x0a\x20\x20step(\x22Sign\x20in\x20as\x20the\x20seeded\x20user\x22,\x20()\x20=>\x20{\x0a\x20\x20\x20\x20goto(\x27https://your-app.test/login\x27);\x0a\x20\x20\x20\x20//\x20\x20\x20\x20fill(getByLabel(\x27Email\x27),\x20\x27alice@example.com\x27);\x0a\x20\x20\x20\x20//\x20\x20\x20\x20fill(getByLabel(\x27Password\x27),\x20\x27secret\x27);\x0a\x20\x20\x20\x20//\x20\x20\x20\x20click(getByRole(\x27button\x27,\x20{name:\x20\x27Log\x20in\x27}));\x0a\x20\x20});\x0a\x0a\x20\x20step(\x22Assert\x20the\x20dashboard\x20shows\x20the\x20signed-in\x20user\x22,\x20()\x20=>\x20{\x0a\x20\x20\x20\x20//\x20\x20\x20\x20assertUrl(\x27/dashboard\x27);\x0a\x20\x20\x20\x20//\x20\x20\x20\x20assertText(getByRole(\x27heading\x27),\x20\x27Welcome,\x20Alice\x27);\x0a\x20\x20\x20\x20//\x20\x20\x20\x20count\x20=\x20dbQuery(\x27SELECT\x20count(*)\x20FROM\x20users\x20WHERE\x20active\x20=\x20true\x27);\x0a\x20\x20\x20\x20//\x20\x20\x20\x20assertTrue(count\x20>\x200,\x20\x27expected\x20at\x20least\x20one\x20active\x20user\x27);\x0a\x20\x20});\x0a}\x0a','agentsMd':_0x1ad552(0x164),'claudeMdBody':_0x1ad552(0x16c),'examples':{'01-smoke.js':_0x1ad552(0x15c),'02-form-fill.js':_0x1ad552(0x17d)},'secretsExample':_0x1ad552(0x171),'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\x20engine\x20for\x20this\x20run\x20(chromium\x20|\x20firefox\x20|\x20webkit).\x20Overrides\x20the\x0a#\x20first\x20entry\x20of\x20`browsers`\x20in\x20unotest.config.*.\x20Default:\x20the\x20config.\x0a#\x20UNOTEST_BROWSER=chromium\x0a#\x20Chromium\x20channel\x20for\x20this\x20run\x20(chrome\x20|\x20msedge\x20|\x20chrome-beta\x20|\x20bundled).\x0a#\x20Overrides\x20`channel`\x20in\x20unotest.config.*\x20—\x20the\x20config\x20travels\x20with\x20the\x0a#\x20suite,\x20this\x20stays\x20on\x20the\x20machine.\x20`bundled`\x20=\x20Playwright\x27s\x20own\x20Chromium.\x0a#\x20UNOTEST_BROWSER_CHANNEL=bundled\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(_0x39a290){const _0x14b2c3={_0x10b57d:0x16d,_0x3cb792:0x16f},_0x14d470=_0x1ad552,_0x530e43=_0x39a290===void 0x0?_0x14d470(_0x14b2c3._0x10b57d):'\x20\x20channel:\x20'+JSON[_0x14d470(0x16a)](_0x39a290)+',';return _0x14d470(0x177)+_0x530e43+_0x14d470(_0x14b2c3._0x3cb792);}__name(unotestConfigMjs,_0x1ad552(0x159));function suitePackageJson(_0x4bef55){const _0x4a2064=_0x1ad552;return JSON['stringify']({'name':_0x4a2064(0x163),'private':!![],'devDependencies':{'@unotest/web':'^'+_0x4bef55}},null,0x2)+'\x0a';}__name(suitePackageJson,'suitePackageJson');import{readFileSync}from'fs';import{dirname,resolve}from'path';import{fileURLToPath}from'url';function readOwnVersion(){const _0x47228c={_0x52479d:0x175},_0x512a6c=_0x1ad552,_0x4d5aa2=dirname(fileURLToPath(import.meta.url)),_0x356f27=resolve(_0x4d5aa2,'../../package.json'),_0x128f96=readFileSync(_0x356f27,_0x512a6c(0x158)),_0xd3e750=JSON['parse'](_0x128f96);if(typeof _0xd3e750['version']!==_0x512a6c(0x167)||_0xd3e750[_0x512a6c(_0x47228c._0x52479d)][_0x512a6c(0x172)]===0x0)throw new Error(_0x512a6c(0x170)+_0x356f27+_0x512a6c(0x15d));return _0xd3e750['version'];}__name(readOwnVersion,_0x1ad552(0x165));async function scaffoldWorkspace(_0x1de613,_0x14c5a8={}){const _0xd95db8={_0x1c9ae8:0x15e,_0x432969:0x166,_0xdf58c8:0x15e,_0x29ad:0x17c,_0x3092b5:0x161,_0x48c327:0x15e,_0x2699c1:0x15b,_0x475770:0x17b,_0x25fe4d:0x166},_0x3d74fd=_0x1ad552,_0x6c8f74=[],_0x4d85bc=[];await mkdir(join(_0x1de613,_0x3d74fd(_0xd95db8._0x1c9ae8),_0x3d74fd(0x17c),_0x3d74fd(_0xd95db8._0x432969)),{'recursive':!![]}),await mkdir(join(_0x1de613,_0x3d74fd(_0xd95db8._0xdf58c8),_0x3d74fd(_0xd95db8._0x29ad),_0x3d74fd(_0xd95db8._0x3092b5)),{'recursive':!![]});const _0x5dd14b=[{'rel':join(_0x3d74fd(_0xd95db8._0xdf58c8),'unotest.config.mjs'),'content':unotestConfigMjs(_0x14c5a8['channel'])},{'rel':join(_0x3d74fd(_0xd95db8._0x48c327),_0x3d74fd(0x160)),'content':suitePackageJson(readOwnVersion())},{'rel':join('unotest','.env'),'content':templates[_0x3d74fd(0x17a)]},{'rel':join(_0x3d74fd(0x15e),_0x3d74fd(_0xd95db8._0x2699c1)),'content':templates['jsconfigJson']},{'rel':join(_0x3d74fd(0x15e),_0x3d74fd(0x17c),_0x3d74fd(0x166),_0x3d74fd(_0xd95db8._0x475770)),'content':templates[_0x3d74fd(_0xd95db8._0x25fe4d)][_0x3d74fd(0x17b)]}];for(const {rel:_0x263bf4,content:_0x4a9430}of _0x5dd14b){const _0x263d20=join(_0x1de613,_0x263bf4);if(existsSync(_0x263d20)){_0x4d85bc[_0x3d74fd(0x15a)](_0x263bf4);continue;}await writeFile(_0x263d20,_0x4a9430),_0x6c8f74['push'](_0x263bf4);}return{'projectRoot':_0x1de613,'created':_0x6c8f74,'skipped':_0x4d85bc};}__name(scaffoldWorkspace,_0x1ad552(0x176));export{scaffoldWorkspace};
|
|
1
|
+
const _0x2dd8a3=_0xfe9e;function _0x3d7e(){const _0x3794a9=['mtGYnJa3nLnnru5Kza','DMvYC2LVBG','BgvUz3rO','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','Dw5VDgvZDenVBMzPz01QCW','C2nHzMzVBgrxB3jRC3bHy2u','DxrMoa','Dw5VDgvZDc5JB25MAwCUBwPZ','icaVlYbJAgfUBMvSoIaNy2HYB21LjYWGicaGicaGicaGicaGicaGicaGicaGicaGicaGlY8Gj2nOCM9TzsCGlYaNBxnLzgDLjYaVig51BgWGkgj1BMrSzwqP','mte3uLvlD0P6','lMvUDG','C3rYAw5N','lY8GrxHHBxbSzsaWmsdIGjqGC21VA2u6ig5HDMLNyxrLicSGy2XPy2SGkYbvuKWGyxnZzxj0Aw9UlGOVlWOVlYbuAguGBwLUAw1HBcb0AhjLzs1ZDgvWihbHDhrLCM4UieHPDhmGCgXHEwDYB3vUzc51BM90zxn0lMnVBsbZBYbUBYbWCM9Qzwn0cI8VihnLDhvWigLZig5LzwrLzc4GuNvUihDPDgG6icbUChGGqhvUB3rLC3qVD2vIiguYzsbLEgfTCgXLCY8Wms1ZBw9RzqOkzNvUy3rPB24GDgvZDf9ZBw9Rzv9WBgf5z3jVDw5KkcKGEWOGihn0zxaOiK9Wzw4GDgHLiejPzYbuywjSzsbZy2vUyxjPBYbMCM9TihrOzsbWBgf5z3jVDw5KigLUzgv4iIWGkcKGpt4GEWOGicaGz290BYGNlYCPoWOGicaGy2XPy2SOz2v0qNLsB2XLkcDSAw5RjYWGE25HBwu6icDcAwCGvgfIBguNlcbLEgfJDdOGDhj1zx0PktSkicaGigfZC2vYDfvYBcGNl3nJzw5HCMLVCY9IAwCTDgfIBguNktSkicb9ktSkFqO','zxHHBxbSzxm','nda3ntq0mffJD0PVEG','CgfJA2fNzs5QC29Uigf0ia','lI4VlI4VCgfJA2fNzs5QC29U','C3vPDgvqywnRywDLsNnVBG','ztjL','cIaGlY8GDMLLD2vYoIb7cIaGlY8GicbWB3j0oIa1mtCZlcaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGic8VigrLzMf1Bhq6ihjHBMrVBsbMCMvLihbVCNqkicaVlYaGigjYB3DZzxi6ihrYDwuSicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGlY8GzgvMyxvSDdOGDhj1zsaOyxv0BY1VCgvUig9Uigb2Awv3zxjGkqOGic8Vih0ScN07cG','Dw5VDgvZDc1ZDwL0zq','x2HLBhbLCNm','C3rYAw5NAwz5','mJaYmZq0uhDJy3HK','ndb2y0XUCKi','ANnJB25MAwCUANnVBG','ChvZAa','BMfTzq','ota5mde2wwL6uuf2','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','ANnJB25MAwDkC29U','nND0thnhDa','Dw5VDgvZDa','mdeTC21VA2uUANm','mta1mJGYAunJwwzJ','mtbOq1nOB28','CMvHze93BLzLCNnPB24','nZu4odL4A3rMDgC','y2HHBM5LBa','mtyYndGXovHyuLjTrq','CgfYC2u','EWOGicjJB21WAwXLCK9WDgLVBNmIoIb7cIaGicaIy2HLy2TkCYi6igzHBhnLlaOGicaGiNrHCMDLDci6icjLCZiWmJiIlaOGicaGiMXPyIi6ifSIzxmYmdiYiL0ScIaGicaIDhLWzxmIoIbBxqOGih0ScIaGiMLUy2X1zguIoIbBcIaGicaIkIOVkI5QCYiScIaGicaIlI4VlNvUB3rLC3qVDhLWzxmVzw52lMqUDhmIlaOGicaGiI4VBM9Kzv9TB2r1BgvZl0b1BM90zxn0l3DLyI90ExbLCY91BM90zxn0lwrZBc5KlNrZiGOGif0kFqO'];_0x3d7e=function(){return _0x3794a9;};return _0x3d7e();}(function(_0x1816d6,_0x59a68f){const _0x5efd3c={_0x178810:0x9f,_0x20f313:0x90,_0x19c395:0x9c,_0x4f362f:0x8b,_0x3061e5:0xa9,_0x501d22:0x8c,_0x13a821:0x9a},_0x3d8c00=_0xfe9e,_0x39eab4=_0x1816d6();while(!![]){try{const _0x47018f=parseInt(_0x3d8c00(0x98))/0x1*(parseInt(_0x3d8c00(0x97))/0x2)+parseInt(_0x3d8c00(_0x5efd3c._0x178810))/0x3+parseInt(_0x3d8c00(_0x5efd3c._0x20f313))/0x4+-parseInt(_0x3d8c00(0xae))/0x5+parseInt(_0x3d8c00(0x94))/0x6*(parseInt(_0x3d8c00(_0x5efd3c._0x19c395))/0x7)+-parseInt(_0x3d8c00(_0x5efd3c._0x4f362f))/0x8*(parseInt(_0x3d8c00(_0x5efd3c._0x3061e5))/0x9)+parseInt(_0x3d8c00(_0x5efd3c._0x501d22))/0xa*(-parseInt(_0x3d8c00(_0x5efd3c._0x13a821))/0xb);if(_0x47018f===_0x59a68f)break;else _0x39eab4['push'](_0x39eab4['shift']());}catch(_0x500045){_0x39eab4['push'](_0x39eab4['shift']());}}}(_0x3d7e,0x67444));var __defProp=Object['defineProperty'],__name=(_0x461488,_0x3abd19)=>__defProp(_0x461488,_0x2dd8a3(0x8f),{'value':_0x3abd19,'configurable':!![]});import{mkdir,writeFile}from'fs/promises';import{existsSync}from'fs';import{join}from'path';var templates={'jsconfigJson':_0x2dd8a3(0x9e),'scenarioTemplate':_0x2dd8a3(0x92),'agentsMd':'#\x20@unotest/web\x20—\x20guide\x20for\x20AI\x20agents\x20(and\x20humans)\x0a\x0aThis\x20project\x20uses\x20[`@unotest/web`](https://www.npmjs.com/package/@unotest/web)\x0afor\x20end-to-end\x20testing\x20of\x20web\x20applications.\x0a\x0a##\x20Writing\x20a\x20test\x20—\x20use\x20the\x20skill\x20+\x20MCP\x0a\x0aFor\x20ANY\x20request\x20to\x20write,\x20record,\x20or\x20run\x20an\x20e2e\x20test:\x0a\x0a1.\x20Open\x20the\x20**`write-e2e-test`**\x20skill\x20—\x20`.claude/skills/write-e2e-test/SKILL.md`\x0a\x20\x20\x20(in\x20Claude\x20Code\x20you\x20can\x20also\x20run\x20`/write-e2e-test`)\x20—\x20and\x20follow\x20it.\x0a2.\x20Drive\x20the\x20browser\x20through\x20the\x20**`unotest-web`\x20MCP\x20tools**:\x20`new_context`\x20→\x0a\x20\x20\x20`explore_start`\x20→\x20`explore_step`\x20→\x20`get_page_snapshot`\x20→\x20`run_test`.\x0a\x0aDo\x20NOT\x20hand-author\x20tests\x20blind\x20or\x20map\x20the\x20project\x20with\x20`find`/`ls`/`awk`\x20—\x20the\x0askill\x27s\x20Phase\x200\x20names\x20the\x20exact\x20files\x20to\x20read.\x20Runnable,\x20copy-pasteable\x0aexamples\x20live\x20in\x20`unotest/e2e/examples/`.\x0a\x0a##\x20Layout\x0a\x0a-\x20`unotest/e2e/<feature>/<name>.js`\x20—\x20test\x20scenarios,\x20grouped\x20by\x20feature/page\x0a\x20\x20(one\x20`test_*`\x20function\x20per\x20file).\x20**Required:**\x20every\x20scenario\x20lives\x20in\x20a\x0a\x20\x20feature\x20subfolder.\x20A\x20test\x20file\x20placed\x20directly\x20in\x20`unotest/e2e/`\x20is\x20rejected\x0a\x20\x20by\x20the\x20linter\x20(`lint:scenario-in-root`).\x0a-\x20`unotest/e2e/_helpers/`\x20—\x20project-specific\x20helpers\x20(visible\x20to\x20all\x20scenarios)\x0a-\x20`unotest/e2e/_template.js`\x20—\x20starting-point\x20template\x20(copy\x20into\x20a\x20feature\x20folder)\x0a\x0a##\x20DSL\x20conventions\x0a\x0aThe\x20DSL\x20is\x20a\x20strict\x20JS\x20subset\x20parsed\x20by\x20@unotest/dsl.\x20Method\x20chains,\x20options-\x0aobjects,\x20and\x20variables\x20are\x20allowed.\x20Multi-line\x20strings\x20use\x0abackticks\x20but\x20`${...}`\x20interpolation\x20is\x20forbidden\x20(sandbox\x20boundary\x20—\x0apass\x20values\x20via\x20positional\x20args).\x0a\x0a**Every\x20step\x20must\x20sit\x20inside\x20a\x20`step(\x22description\x22,\x20()\x20=>\x20{\x20…\x20})`\x20block\x20(linter\x0aenforces).**\x20The\x20title\x20is\x20plain-English\x20intent;\x20the\x20steps\x20inside\x20are\x20the\x0aimplementation.\x20When\x20a\x20step\x20later\x20breaks\x20(selector\x20drift),\x20you\x20read\x20the\x0atitle\x20to\x20understand\x20what\x20the\x20group\x20was\x20trying\x20to\x20do\x20and\x20repair\x20it.\x20Group\x20by\x0aintent,\x20one\x20block\x20per\x20logical\x20chunk:\x0a\x0a```js\x0afunction\x20test_login()\x20{\x0a\x20\x20step(\x22Sign\x20in\x20as\x20the\x20demo\x20user\x22,\x20()\x20=>\x20{\x0a\x20\x20\x20\x20goto(\x27https://app.example.com/login\x27);\x0a\x20\x20\x20\x20fill(getByLabel(\x27Email\x27),\x20\x27demo@example.com\x27);\x0a\x20\x20\x20\x20click(getByRole(\x27button\x27,\x20{name:\x20\x27Log\x20in\x27}));\x0a\x20\x20});\x0a\x0a\x20\x20step(\x22Dashboard\x20shows\x20the\x20signed-in\x20user\x22,\x20()\x20=>\x20{\x0a\x20\x20\x20\x20assertText(getByRole(\x27heading\x27),\x20\x27Welcome\x27);\x0a\x20\x20});\x0a}\x0a```\x0a\x0a**Base\x20URL\x20—\x20write\x20relative\x20paths.**\x20`APP_BASE_URL`\x20(in\x20`unotest/.env`)\x20is\x20the\x0aapp\x27s\x20base;\x20`goto(\x27/login\x27)`\x20resolves\x20against\x20it.\x20Don\x27t\x20concatenate\x0a(`goto(APP_BASE_URL\x20+\x20\x27/login\x27)`)\x20—\x20just\x20pass\x20the\x20path:\x0a\x0a```js\x0agoto(\x27/login\x27);\x0afill(getByLabel(\x27Password\x27),\x20TEST_USER_PASSWORD);\x0a```\x0a\x0a**Environments.**\x20Override\x20`APP_BASE_URL`\x20(and\x20any\x20var)\x20per\x20environment\x20with\x0aoverlay\x20files\x20—\x20`unotest/.env.staging`,\x20`unotest/.env.production`\x20(secrets:\x0a`unotest/.secrets.<env>`).\x20Select\x20one\x20at\x20run\x20time:\x20`npx\x20@unotest/web\x20e2e\x20<name>\x0a--env\x20staging`.\x20The\x20overlay\x20layers\x20over\x20the\x20base\x20`.env`\x20(overlay\x20wins).\x0a\x0a**External\x20variables\x20&\x20secrets:**\x20reference\x20logins\x20/\x20tokens\x20by\x20a\x20bare\x0a`UPPER_SNAKE`\x20name\x20—\x20resolved\x20from\x20`unotest/.env`\x20(normal)\x20or\x20`unotest/.secrets`\x0a(secret,\x20masked\x20in\x20logs).\x20No\x20`env()`/`secret()`\x20wrapper.\x20A\x20lowercase\x20name\x20is\x20an\x0ain-scenario\x20binding;\x20an\x20unknown\x20`UPPER_SNAKE`\x20fails\x20the\x20run\x20asking\x20you\x20to\x20add\x20it\x0ato\x20`unotest/.env`.\x0a\x0a**Selector\x20hierarchy\x20(D-22\x20—\x20linter\x20enforces):**\x0a1.\x20`getByTestId(id)`\x20—\x20most\x20stable\x0a2.\x20`getByRole(role,\x20{name})`\x20—\x20semantic,\x20a11y-aware\x0a3.\x20`getByLabel(text)`\x20—\x20for\x20form\x20fields\x0a4.\x20`getByText(text)`\x20—\x20for\x20unique\x20text\x0a5.\x20`locator(css)`\x20—\x20last\x20resort\x20(linter\x20warns)\x0a\x0aFull\x20reference\x20shipped\x20with\x20the\x20package:\x0a-\x20`node_modules/@unotest/web/guides/dsl-reference.md`\x20—\x20DSL\x20functions\x20+\x20linter\x20codes\x0a\x0a##\x20Running\x20(CLI)\x0a\x0a-\x20`npx\x20@unotest/web\x20e2e\x20<feature>/<name>`\x20—\x20run\x20a\x20scenario\x20by\x20name\x0a-\x20`npx\x20@unotest/web\x20lint`\x20—\x20static\x20check\x20of\x20all\x20scenarios\x20+\x20helpers\x0a-\x20`npx\x20@unotest/web\x20mcp`\x20—\x20start\x20the\x20MCP\x20server\x20for\x20agent\x20control\x0a\x0a##\x20Via\x20MCP\x20(Claude\x20Code\x20/\x20Claude\x20Desktop\x20/\x20Cursor)\x0a\x0aThe\x20MCP\x20server\x20exposes:\x0a-\x20`run_test\x20name=\x22<name>\x22\x20mode=\x22step\x22\x20pauseOnFailure=true`\x20—\x20run\x20with\x20step-mode\x0a-\x20`step`\x20/\x20`resume`\x20—\x20advance\x20one\x20AST\x20node\x20/\x20run\x20until\x20next\x20pause\x0a-\x20`inspect_runtime`\x20—\x20current\x20state,\x20last\x20error,\x20locals\x20dump\x0a-\x20`abort_runtime`\x20—\x20kill\x20a\x20paused\x20runtime\x0a\x0aFor\x20agent-fix\x20workflows\x20on\x20flaky\x20tests:\x20`agent_fix\x20testId=\x22<id>\x22`\x20returns\x20a\x0astructured\x20context\x20bundle\x20(see\x20D-25\x20—\x20we\x20never\x20call\x20LLMs\x20or\x20auto-apply\x0adiffs,\x20the\x20diff\x20comes\x20from\x20your\x20MCP-host\x20agent).\x0a','claudeMdBody':'##\x20E2E\x20testing\x20with\x20@unotest/web\x0a\x0a@AGENTS.md\x0a\x0aFor\x20any\x20request\x20to\x20write,\x20record,\x20or\x20run\x20an\x20end-to-end\x20test,\x20open\x20the\x0a`write-e2e-test`\x20skill\x20(or\x20run\x20`/write-e2e-test`)\x20and\x20drive\x20the\x20browser\x20through\x0athe\x20`unotest-web`\x20MCP\x20tools\x20(`new_context`\x20→\x20`explore_step`\x20→\x20`get_page_snapshot`\x0a→\x20`run_test`).\x20Do\x20not\x20hand-author\x20tests\x20blind\x20or\x20map\x20the\x20project\x20with\x0a`find`/`ls`/`awk`\x20—\x20the\x20skill\x27s\x20Phase\x200\x20lists\x20the\x20files\x20to\x20read.','examples':{'01-smoke.js':_0x2dd8a3(0xac),'02-form-fill.js':_0x2dd8a3(0x91)},'secretsExample':_0x2dd8a3(0xa3),'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\x20engine\x20for\x20this\x20run\x20(chromium\x20|\x20firefox\x20|\x20webkit).\x20Overrides\x20the\x0a#\x20first\x20entry\x20of\x20`browsers`\x20in\x20unotest.config.*.\x20Default:\x20the\x20config.\x0a#\x20UNOTEST_BROWSER=chromium\x0a#\x20Chromium\x20channel\x20for\x20this\x20run\x20(chrome\x20|\x20msedge\x20|\x20chrome-beta\x20|\x20bundled).\x0a#\x20Overrides\x20`channel`\x20in\x20unotest.config.*\x20—\x20the\x20config\x20travels\x20with\x20the\x0a#\x20suite,\x20this\x20stays\x20on\x20the\x20machine.\x20`bundled`\x20=\x20Playwright\x27s\x20own\x20Chromium.\x0a#\x20UNOTEST_BROWSER_CHANNEL=bundled\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(_0x452e7c){const _0x4bad8e={_0x3769d4:0xa8,_0x2f78d2:0xa2,_0x5d4f86:0x87},_0x11e723=_0x2dd8a3,_0x3a597f=_0x452e7c===void 0x0?_0x11e723(_0x4bad8e._0x3769d4):'\x20\x20channel:\x20'+JSON['stringify'](_0x452e7c)+',';return _0x11e723(_0x4bad8e._0x2f78d2)+_0x3a597f+_0x11e723(_0x4bad8e._0x5d4f86);}__name(unotestConfigMjs,_0x2dd8a3(0xa4));function suitePackageJson(_0x5a9bea){const _0x1ecca2={_0x4b4d11:0x88},_0x506d0c=_0x2dd8a3;return JSON[_0x506d0c(0x8a)]({'name':_0x506d0c(_0x1ecca2._0x4b4d11),'private':!![],'devDependencies':{'@unotest/web':'^'+_0x5a9bea}},null,0x2)+'\x0a';}__name(suitePackageJson,_0x2dd8a3(0xb1));import{readFileSync}from'fs';import{dirname,resolve}from'path';import{fileURLToPath}from'url';function readOwnVersion(){const _0x18879d={_0x4588bf:0xb0,_0x442366:0xa6,_0x23d79d:0x9d,_0x508ef6:0xa0,_0x44fd00:0xa0,_0x1412fe:0xa1,_0x6ec61c:0xaf},_0x37dcba=_0x2dd8a3,_0x593dba=dirname(fileURLToPath(import.meta.url)),_0x1fb53a=resolve(_0x593dba,_0x37dcba(_0x18879d._0x4588bf)),_0xab4005=readFileSync(_0x1fb53a,_0x37dcba(_0x18879d._0x442366)),_0x35223a=JSON[_0x37dcba(_0x18879d._0x23d79d)](_0xab4005);if(typeof _0x35223a[_0x37dcba(_0x18879d._0x508ef6)]!==_0x37dcba(0xab)||_0x35223a[_0x37dcba(_0x18879d._0x44fd00)][_0x37dcba(_0x18879d._0x1412fe)]===0x0)throw new Error(_0x37dcba(_0x18879d._0x6ec61c)+_0x1fb53a+'\x20has\x20no\x20usable\x20\x22version\x22\x20field');return _0x35223a['version'];}__name(readOwnVersion,_0x2dd8a3(0x99));async function scaffoldWorkspace(_0x2313d2,_0x10cf01={}){const _0x2cf790={_0x7beffc:0x86,_0x420706:0x95,_0x2ba59e:0xa7,_0x218591:0x95,_0x585873:0xaa,_0x4a9d73:0x95,_0x42318a:0x96,_0x24c753:0xad,_0x4acc19:0x8e},_0x1e9789=_0x2dd8a3,_0x197e7b=[],_0x926a2b=[];await mkdir(join(_0x2313d2,_0x1e9789(0x95),_0x1e9789(_0x2cf790._0x7beffc),'examples'),{'recursive':!![]}),await mkdir(join(_0x2313d2,_0x1e9789(_0x2cf790._0x420706),_0x1e9789(0x86),_0x1e9789(0x89)),{'recursive':!![]});const _0x53956a=[{'rel':join(_0x1e9789(_0x2cf790._0x420706),_0x1e9789(_0x2cf790._0x2ba59e)),'content':unotestConfigMjs(_0x10cf01[_0x1e9789(0x9b)])},{'rel':join(_0x1e9789(_0x2cf790._0x218591),'package.json'),'content':suitePackageJson(readOwnVersion())},{'rel':join('unotest',_0x1e9789(_0x2cf790._0x585873)),'content':templates['envExample']},{'rel':join(_0x1e9789(0x95),_0x1e9789(0x8d)),'content':templates[_0x1e9789(0x93)]},{'rel':join(_0x1e9789(_0x2cf790._0x4a9d73),_0x1e9789(_0x2cf790._0x7beffc),_0x1e9789(0xad),_0x1e9789(_0x2cf790._0x42318a)),'content':templates[_0x1e9789(_0x2cf790._0x24c753)][_0x1e9789(0x96)]}];for(const {rel:_0x5f4a40,content:_0x3ac34a}of _0x53956a){const _0xc00f71=join(_0x2313d2,_0x5f4a40);if(existsSync(_0xc00f71)){_0x926a2b['push'](_0x5f4a40);continue;}await writeFile(_0xc00f71,_0x3ac34a),_0x197e7b[_0x1e9789(_0x2cf790._0x4acc19)](_0x5f4a40);}return{'projectRoot':_0x2313d2,'created':_0x197e7b,'skipped':_0x926a2b};}function _0xfe9e(_0x5a6f63,_0x4c8e5c){_0x5a6f63=_0x5a6f63-0x86;const _0x3d7e97=_0x3d7e();let _0xfe9ea6=_0x3d7e97[_0x5a6f63];if(_0xfe9e['rIBwfC']===undefined){var _0x1fecdd=function(_0x175a65){const _0x5afa09='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x461488='',_0x3abd19='';for(let _0x452e7c=0x0,_0x3a597f,_0x5a9bea,_0x593dba=0x0;_0x5a9bea=_0x175a65['charAt'](_0x593dba++);~_0x5a9bea&&(_0x3a597f=_0x452e7c%0x4?_0x3a597f*0x40+_0x5a9bea:_0x5a9bea,_0x452e7c++%0x4)?_0x461488+=String['fromCharCode'](0xff&_0x3a597f>>(-0x2*_0x452e7c&0x6)):0x0){_0x5a9bea=_0x5afa09['indexOf'](_0x5a9bea);}for(let _0x1fb53a=0x0,_0xab4005=_0x461488['length'];_0x1fb53a<_0xab4005;_0x1fb53a++){_0x3abd19+='%'+('00'+_0x461488['charCodeAt'](_0x1fb53a)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x3abd19);};_0xfe9e['wBjOyn']=_0x1fecdd,_0xfe9e['RYNMqf']={},_0xfe9e['rIBwfC']=!![];}const _0x6bb9e=_0x3d7e97[0x0],_0x468562=_0x5a6f63+_0x6bb9e,_0x36014b=_0xfe9e['RYNMqf'][_0x468562];return!_0x36014b?(_0xfe9ea6=_0xfe9e['wBjOyn'](_0xfe9ea6),_0xfe9e['RYNMqf'][_0x468562]=_0xfe9ea6):_0xfe9ea6=_0x36014b,_0xfe9ea6;}__name(scaffoldWorkspace,_0x2dd8a3(0xa5));export{scaffoldWorkspace};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
function _0x2cb1(_0x2f53c4,_0x2f8c27){_0x2f53c4=_0x2f53c4-0x197;var _0x488435=_0x4884();var _0x2cb1b9=_0x488435[_0x2f53c4];if(_0x2cb1['hzBVJw']===undefined){var _0xab9ec7=function(_0xc8ba29){var _0x106b9b='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x4838ff='',_0x4e6351='';for(var _0xe7d241=0x0,_0x2544b3,_0x4bf744,_0x329d63=0x0;_0x4bf744=_0xc8ba29['charAt'](_0x329d63++);~_0x4bf744&&(_0x2544b3=_0xe7d241%0x4?_0x2544b3*0x40+_0x4bf744:_0x4bf744,_0xe7d241++%0x4)?_0x4838ff+=String['fromCharCode'](0xff&_0x2544b3>>(-0x2*_0xe7d241&0x6)):0x0){_0x4bf744=_0x106b9b['indexOf'](_0x4bf744);}for(var _0x547fba=0x0,_0x40cdd6=_0x4838ff['length'];_0x547fba<_0x40cdd6;_0x547fba++){_0x4e6351+='%'+('00'+_0x4838ff['charCodeAt'](_0x547fba)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x4e6351);};_0x2cb1['lURvpn']=_0xab9ec7,_0x2cb1['bZthqP']={},_0x2cb1['hzBVJw']=!![];}var _0x55e31d=_0x488435[0x0],_0x25a52a=_0x2f53c4+_0x55e31d,_0x1f384a=_0x2cb1['bZthqP'][_0x25a52a];return!_0x1f384a?(_0x2cb1b9=_0x2cb1['lURvpn'](_0x2cb1b9),_0x2cb1['bZthqP'][_0x25a52a]=_0x2cb1b9):_0x2cb1b9=_0x1f384a,_0x2cb1b9;}var _0x3264ab=_0x2cb1;function _0x4884(){var _0x5582c5=['mta5oti3mLrREg9Lvq','mtK4otC4m1j6zLr3Aq','nJu1mZC1sgjsqKH2','lI4VlI4VlI4VzxHHBxbSzxmVzML4DhvYzxmVyNjLywSTzML4lwfWCc9Zzxj2zs5TANm','mteWodGYCwLOz2fs','mJiYmtbly1DeyMq','D3jPDgu','zMLUza','zxHPDa','zxHLy1bHDgG','C3rKzxjY','mJKYsufrBhn3','Aw5OzxjPDa','lI4VlI4VzxHHBxbSzxmVzML4DhvYzxmVyNjLywSTzML4lwfWCc9Zzxj2zs5TANm','mZjStwDXALi','AM9PBG','mJa5mJe5ne9mCeThtG','ntm1nZm0Cu9iBuXq'];_0x4884=function(){return _0x5582c5;};return _0x4884();}(function(_0x40d440,_0x5e1cc8){var _0x24d50b={_0x25a481:0x1a2,_0x1b3722:0x19c,_0x3e1887:0x197,_0x2c07fe:0x199,_0x46c69b:0x198},_0xe12437=_0x2cb1,_0x2502c3=_0x40d440();while(!![]){try{var _0x20384a=parseInt(_0xe12437(0x1a8))/0x1+parseInt(_0xe12437(0x19b))/0x2+parseInt(_0xe12437(0x1a7))/0x3+-parseInt(_0xe12437(_0x24d50b._0x25a481))/0x4*(-parseInt(_0xe12437(_0x24d50b._0x1b3722))/0x5)+-parseInt(_0xe12437(_0x24d50b._0x3e1887))/0x6+-parseInt(_0xe12437(_0x24d50b._0x2c07fe))/0x7+parseInt(_0xe12437(0x1a5))/0x8*(-parseInt(_0xe12437(_0x24d50b._0x46c69b))/0x9);if(_0x20384a===_0x5e1cc8)break;else _0x2502c3['push'](_0x2502c3['shift']());}catch(_0x37ecd2){_0x2502c3['push'](_0x2502c3['shift']());}}}(_0x4884,0x6e446));import{fileURLToPath}from'url';import{dirname,resolve}from'path';import{spawn}from'child_process';import{existsSync}from'fs';var here=dirname(fileURLToPath(import.meta.url)),candidates=[resolve(here,_0x3264ab(0x1a4)),resolve(here,_0x3264ab(0x19a))],serverEntry=candidates[_0x3264ab(0x19e)](_0x4838ff=>existsSync(_0x4838ff));!serverEntry&&(process[_0x3264ab(0x1a1)][_0x3264ab(0x19d)]('serve-fixture:\x20cannot\x20locate\x20fixture\x20server\x20entry.\x20Tried:\x0a'+candidates['map'](_0x4e6351=>'\x20\x20'+_0x4e6351+'\x0a')[_0x3264ab(0x1a6)]('')+'Did\x20you\x20publish\x20without\x20examples/fixtures/?\x0a'),process[_0x3264ab(0x19f)](0x1));var child=spawn(process[_0x3264ab(0x1a0)],[serverEntry,...process['argv']['slice'](0x2)],{'stdio':_0x3264ab(0x1a3)});child['on'](_0x3264ab(0x19f),_0xe7d241=>process[_0x3264ab(0x19f)](_0xe7d241??0x1));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const _0x8fe9bb=_0x515c;(function(_0x4c4c9b,_0x1968ca){const _0x370a39={_0x1ed841:0x1b8,_0x17e18a:0x18d,_0x450f50:0x18c,_0x20410c:0x189,_0x72bf94:0x1c2},_0x5b35df=_0x515c,_0x422a24=_0x4c4c9b();while(!![]){try{const _0x1f14f7=parseInt(_0x5b35df(0x1b2))/0x1*(parseInt(_0x5b35df(_0x370a39._0x1ed841))/0x2)+parseInt(_0x5b35df(0x1b3))/0x3*(-parseInt(_0x5b35df(0x19c))/0x4)+-parseInt(_0x5b35df(0x162))/0x5*(parseInt(_0x5b35df(0x190))/0x6)+-parseInt(_0x5b35df(_0x370a39._0x17e18a))/0x7+-parseInt(_0x5b35df(0x174))/0x8*(-parseInt(_0x5b35df(_0x370a39._0x450f50))/0x9)+-parseInt(_0x5b35df(_0x370a39._0x20410c))/0xa+-parseInt(_0x5b35df(0x1ae))/0xb*(-parseInt(_0x5b35df(_0x370a39._0x72bf94))/0xc);if(_0x1f14f7===_0x1968ca)break;else _0x422a24['push'](_0x422a24['shift']());}catch(_0x468fe7){_0x422a24['push'](_0x422a24['shift']());}}}(_0xed3b,0x9badf));var __defProp=Object[_0x8fe9bb(0x1c0)],__name=(_0x431c63,_0x19bc98)=>__defProp(_0x431c63,_0x8fe9bb(0x1b4),{'value':_0x19bc98,'configurable':!![]});import{UnsupportedRunKindError}from'@unotest/protocol';import{readFileSync}from'fs';function _0x515c(_0x14df0f,_0x2de924){_0x14df0f=_0x14df0f-0x15b;const _0xed3b6d=_0xed3b();let _0x515cbe=_0xed3b6d[_0x14df0f];if(_0x515c['zzertE']===undefined){var _0x381bbf=function(_0x690e31){const _0x5306d7='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x136f58='',_0x431c63='';for(let _0x19bc98=0x0,_0x3dbb9b,_0x929070,_0x50a6ab=0x0;_0x929070=_0x690e31['charAt'](_0x50a6ab++);~_0x929070&&(_0x3dbb9b=_0x19bc98%0x4?_0x3dbb9b*0x40+_0x929070:_0x929070,_0x19bc98++%0x4)?_0x136f58+=String['fromCharCode'](0xff&_0x3dbb9b>>(-0x2*_0x19bc98&0x6)):0x0){_0x929070=_0x5306d7['indexOf'](_0x929070);}for(let _0x5eccdd=0x0,_0x110d6c=_0x136f58['length'];_0x5eccdd<_0x110d6c;_0x5eccdd++){_0x431c63+='%'+('00'+_0x136f58['charCodeAt'](_0x5eccdd)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x431c63);};_0x515c['QmvnjN']=_0x381bbf,_0x515c['XDgJvL']={},_0x515c['zzertE']=!![];}const _0x25c2ae=_0xed3b6d[0x0],_0x55aebc=_0x14df0f+_0x25c2ae,_0x5f590c=_0x515c['XDgJvL'][_0x55aebc];return!_0x5f590c?(_0x515cbe=_0x515c['QmvnjN'](_0x515cbe),_0x515c['XDgJvL'][_0x55aebc]=_0x515cbe):_0x515cbe=_0x5f590c,_0x515cbe;}import{createRequire}from'module';import{dirname,join}from'path';import{existsSync as _0x136f58}from'fs';import{execFileSync}from'child_process';import{existsSync}from'fs';function probeSystemBrowser(){const _0x3f7039={_0xb12709:0x17c},_0x26800c=_0x8fe9bb;for(const _0x3dbb9b of[probeChrome,probeEdge,probeChromeBeta]){const _0x929070=_0x3dbb9b();if(_0x929070[_0x26800c(_0x3f7039._0xb12709)]!==null)return _0x929070;}return{'channel':null};}__name(probeSystemBrowser,_0x8fe9bb(0x1b6));function probeChrome(){const _0x5dfb62={_0xf6c944:0x164},_0xb10358=_0x8fe9bb,_0x50a6ab=firstExistingPath(CHROME_PATHS)??whichOf(CHROME_BIN_NAMES);if(_0x50a6ab)return{'channel':_0xb10358(_0x5dfb62._0xf6c944),'path':_0x50a6ab,'label':'Google\x20Chrome'};return{'channel':null};}__name(probeChrome,_0x8fe9bb(0x183));function probeEdge(){const _0x49eaf2={_0x325253:0x175},_0x2c5d16=_0x8fe9bb,_0x5eccdd=firstExistingPath(EDGE_PATHS)??whichOf(EDGE_BIN_NAMES);if(_0x5eccdd)return{'channel':_0x2c5d16(_0x49eaf2._0x325253),'path':_0x5eccdd,'label':_0x2c5d16(0x15e)};return{'channel':null};}__name(probeEdge,_0x8fe9bb(0x177));function probeChromeBeta(){const _0x110d6c=firstExistingPath(CHROME_BETA_PATHS);if(_0x110d6c)return{'channel':'chrome-beta','path':_0x110d6c,'label':'Google\x20Chrome\x20Beta'};return{'channel':null};}__name(probeChromeBeta,'probeChromeBeta');var CHROME_PATHS=((()=>{const _0x4d915c={_0x456165:0x176,_0x3ac9c8:0x18b,_0x2be53c:0x195,_0xb2279:0x1ab,_0x45b0a3:0x171,_0x3a9ee6:0x1ac,_0x29094e:0x197,_0x25ec39:0x17d},_0x431418=_0x8fe9bb;switch(process['platform']){case _0x431418(_0x4d915c._0x456165):return['/Applications/Google\x20Chrome.app/Contents/MacOS/Google\x20Chrome'];case _0x431418(_0x4d915c._0x3ac9c8):return[process[_0x431418(0x1ab)]['ProgramFiles']+_0x431418(0x1ac),process[_0x431418(0x1ab)][_0x431418(_0x4d915c._0x2be53c)]+_0x431418(0x1ac),process[_0x431418(_0x4d915c._0xb2279)][_0x431418(_0x4d915c._0x45b0a3)]+_0x431418(_0x4d915c._0x3a9ee6)];default:return[_0x431418(0x1a4),_0x431418(0x1b9),_0x431418(_0x4d915c._0x29094e),_0x431418(_0x4d915c._0x25ec39),_0x431418(0x18f)];}})()),CHROME_BIN_NAMES=[_0x8fe9bb(0x16b),_0x8fe9bb(0x168),_0x8fe9bb(0x19d),_0x8fe9bb(0x1bb)],EDGE_PATHS=((()=>{const _0x53dcf3={_0x22adf3:0x176,_0x27a161:0x18b,_0x10eb5b:0x1ab,_0x1620d9:0x166,_0x1ad4e1:0x1a3},_0x43f56b=_0x8fe9bb;switch(process['platform']){case _0x43f56b(_0x53dcf3._0x22adf3):return[_0x43f56b(0x1ba)];case _0x43f56b(_0x53dcf3._0x27a161):return[process[_0x43f56b(_0x53dcf3._0x10eb5b)][_0x43f56b(_0x53dcf3._0x1620d9)]+_0x43f56b(0x15f),process[_0x43f56b(0x1ab)]['ProgramFiles(x86)']+'\x5cMicrosoft\x5cEdge\x5cApplication\x5cmsedge.exe'];default:return[_0x43f56b(_0x53dcf3._0x1ad4e1),'/usr/bin/microsoft-edge-stable'];}})()),EDGE_BIN_NAMES=[_0x8fe9bb(0x1b0),_0x8fe9bb(0x1aa)],CHROME_BETA_PATHS=((()=>{const _0x4f8734={_0x4f350a:0x1b5,_0xe26f2d:0x18b},_0x54f3d7=_0x8fe9bb;switch(process[_0x54f3d7(0x15b)]){case'darwin':return[_0x54f3d7(_0x4f8734._0x4f350a)];case _0x54f3d7(_0x4f8734._0xe26f2d):return[process['env'][_0x54f3d7(0x166)]+'\x5cGoogle\x5cChrome\x20Beta\x5cApplication\x5cchrome.exe'];default:return[_0x54f3d7(0x1bc)];}})());function _0xed3b(){const _0x3d1c05=['l3vZCI9IAw4Vz29Vz2XLlwnOCM9Tzs1IzxrH','y3DK','Cgf0Aa','ls1IywLS','zgvMAw5LuhjVCgvYDhK','DxrMoa','mteXnKHqwNDRCG','zMLYC3rfEgLZDgLUz1bHDgG','ls1QC29U','igzVDw5K','CgXHDgzVCM0','CMvXDwLYzxmGtM9KzsdIIAuYmcaOCNvUBMLUzYa','y2HLy2TxCML0ywjSzun3za','twLJCM9ZB2z0ievKz2u','xe1Py3jVC29MDfXfzgDLxefWCgXPy2f0Aw9Uxg1ZzwrNzs5LEgu','BM9Kzq','yMfPBa','mtyZmdq2nvPAqxHhvG','AM9PBG','y2HYB21L','v2vIuNvUBMvYqwrHChrLCG','uhjVz3jHBuzPBgvZ','ls1ICMvHAW','z29Vz2XLlwnOCM9Tzs1ZDgfIBgu','yNvPBgrfBNy','ls13B3jRzxjZpq','z29Vz2XLlwnOCM9Tzq','vgfYz2v0igrPCMvJDg9YEq','CMvZB2X2zq','zxjYB3i','C3vWCg9YDgvKs2LUzhm','AgvHzgvK','te9dquXbufbeqvrb','Dw5VDgvZDc13zwi','vu5pvevtvf9iruferuq','nZqYodHoqNHZr2u','BxnLzgDL','zgfYD2LU','ChjVyMvfzgDL','DhjPBq','C2nLBMfYAw8','u3LZDgvTigjYB3DZzxi','yxbWu2vYDMvYqxjNCW','y2HHBM5LBa','l3vZCI9IAw4Vy2HYB21PDw0','yNjLywTWB2LUDhm','l3bHy2THz2uUANnVBG','tM9Kzs5QCYb2zxjZAw9U','y2HLy2TtExn0zw1cCM93C2vY','BgvUz3rO','ChjVyMvdAhjVBwu','C3bSAxq','Aw5PDcb3AwXSig9MzMvYihrVigrVD25SB2fKigj1BMrSzwqGq2HYB21PDw0Gkh4XntaGtuiPlIbbBhrLCM5HDgL2zwX5lcbPBNn0ywXSienOCM9TzsbMCM9TigH0DhbZoI8VD3D3lMDVB2DSzs5JB20Vy2HYB21LigfUzcbYzs1YDw4U','C3rHCNrZv2L0Aa','sw5ZDgfSBcboB2rLidiWkYb2AweGBNzTic8GzM5Tic8GDM9SDgeGyw5KihjLlxj1BI4','BgfIzwW','ndq2ndm3mfzPrwDStW','DgfYz2v0ia','D2LUmZi','nJntAMHfz3a','mJmYodi4nfjwAuPiwG','yMLU','l3vZCI9IAw4Vy2HYB21PDw0TyNjVD3nLCG','mtjbvgDxy1O','igrVzxmGBM90igv4Axn0','A2LUza','C3rYAw5N','ihbHy2THz2uUANnVBIbKzwnSyxjLCYbUBYaNyMLUjYbMAwvSzcdIGjqGyNjVA2vUigLUC3rHBgW/','uhjVz3jHBuzPBgvZkhG4nIK','yxbWlxnLCNzLCG','l3nUyxaVyMLUl2DVB2DSzs1JAhjVBwu','D29YA2vYCW','B2jQzwn0','CgfYC2u','y29SBgvJDgLVBG','mtzLv2DyBNm','y2HYB21PDw0','D2HPy2G','D2fYBMLUzW','D2HPy2HpzG','zgvIDwC','ChvZAa','l3vZCI9IAw4VBwLJCM9ZB2z0lwvKz2u','l3vZCI9IAw4Vz29Vz2XLlwnOCM9Tzq','ls1Kzwj1zW','q3jLyxrLihrOzsbKAxjLy3rVCNKGB3iGCNvUigLUAxqGAw4Gyw4GzxHPC3rPBMCGChjVAMvJDcbYB290lG','CMvZB2X2zujPBG','yxv0Ag9Y','CNvUrw52AxjVBM1LBNrdAgvJA3m','BwLJCM9ZB2z0lwvKz2uTC3rHyMXL','zw52','xeDVB2DSzvXdAhjVBwvCqxbWBgLJyxrPB25Cy2HYB21LlMv4zq','y2HLy2ToB2rLvMvYC2LVBG','mZuYmdG4rgjWsMzZ','ztjL','BwLJCM9ZB2z0lwvKz2u','qhvUB3rLC3qVD2vI','mJK0mZG4svnzvMDV','otuWndi3sKTpCgPp','BMfTzq','l0fWCgXPy2f0Aw9UCY9hB29NBguGq2HYB21LiejLDgeUyxbWl0nVBNrLBNrZl01Hy09tl0DVB2DSzsbdAhjVBwuGqMv0yq','ChjVyMvtExn0zw1cCM93C2vY','yNvPBgrbCMDZ','mLriEeTzzG','l3vZCI9IAw4Vz29Vz2XLlwnOCM9Tzs1ZDgfIBgu','l0fWCgXPy2f0Aw9UCY9nAwnYB3nVzNqGrwrNzs5HChaVq29UDgvUDhmVtwfJt1mVtwLJCM9ZB2z0ievKz2u','y2HYB21PDw0TyNjVD3nLCG'];_0xed3b=function(){return _0x3d1c05;};return _0xed3b();}function firstExistingPath(_0x412b6f){const _0x4a671f=_0x8fe9bb;for(const _0x3b711c of _0x412b6f){if(!_0x3b711c||_0x3b711c[_0x4a671f(0x186)]('undefined'))continue;if(existsSync(_0x3b711c))return _0x3b711c;}return null;}__name(firstExistingPath,_0x8fe9bb(0x1c3));function whichOf(_0x47fada){const _0x2dc17c={_0x1d1750:0x19e,_0x128192:0x1c1,_0x291819:0x182},_0x225e56=_0x8fe9bb;if(process['platform']==='win32')return void 0x0;for(const _0x1cb82c of _0x47fada){try{const _0xacf910=execFileSync(_0x225e56(_0x2dc17c._0x1d1750),[_0x1cb82c],{'encoding':_0x225e56(_0x2dc17c._0x128192)})[_0x225e56(0x178)]();if(_0xacf910[_0x225e56(_0x2dc17c._0x291819)]>0x0&&existsSync(_0xacf910))return _0xacf910;}catch{}}return void 0x0;}__name(whichOf,_0x8fe9bb(0x1a0));function runEnvironmentChecks(_0x2665b4={}){const _0x8d1511={_0x552113:0x1bd},_0xed080d=_0x8fe9bb,_0x5f16f6=_0x2665b4[_0xed080d(_0x8d1511._0x552113)]??process[_0xed080d(_0x8d1511._0x552113)]();return[checkNodeVersion(),checkSystemBrowser(),checkWritableCwd(_0x5f16f6)];}__name(runEnvironmentChecks,_0x8fe9bb(0x1a9));function checkNodeVersion(){const _0x54e5e1={_0x1e2b47:0x184,_0x295030:0x16e,_0xd8c92f:0x187},_0x333f95=_0x8fe9bb,_0x5cb5ff=process['versions'][_0x333f95(0x160)],_0x394c7f=Number(_0x5cb5ff[_0x333f95(_0x54e5e1._0x1e2b47)]('.')[0x0]);if(!Number['isFinite'](_0x394c7f)||_0x394c7f<0x14)return{'name':'Node.js\x20version','severity':_0x333f95(_0x54e5e1._0x295030),'message':_0x333f95(0x15c)+_0x5cb5ff+')','detail':_0x333f95(_0x54e5e1._0xd8c92f)};return{'name':_0x333f95(0x180),'severity':'ok','message':_0x5cb5ff};}__name(checkNodeVersion,_0x8fe9bb(0x1ad));function checkSystemBrowser(){const _0x33e335={_0x429b30:0x17c,_0x32c4a2:0x17a,_0x1fd13d:0x1c5,_0x5e409d:0x17a,_0x25164b:0x19f,_0x309bdb:0x185},_0x1d6ba1=_0x8fe9bb,_0x214a31=probeSystemBrowser();if(_0x214a31[_0x1d6ba1(_0x33e335._0x429b30)]!==null)return{'name':_0x1d6ba1(_0x33e335._0x32c4a2),'severity':'ok','message':_0x214a31[_0x1d6ba1(0x188)]+_0x1d6ba1(_0x33e335._0x1fd13d),'detail':_0x214a31[_0x1d6ba1(0x1be)]};return{'name':_0x1d6ba1(_0x33e335._0x5e409d),'severity':_0x1d6ba1(_0x33e335._0x25164b),'message':'no\x20Chrome\x20/\x20Edge\x20/\x20Chromium\x20detected','detail':_0x1d6ba1(_0x33e335._0x309bdb)};}__name(checkSystemBrowser,_0x8fe9bb(0x181));function checkWritableCwd(_0x413879){const _0x20438e={_0x1cf799:0x18a,_0x259fc3:0x16c},_0x38457d=_0x8fe9bb;if(!_0x136f58(_0x413879))return{'name':_0x38457d(0x16c),'severity':'error','message':_0x38457d(_0x20438e._0x1cf799)+_0x413879+_0x38457d(0x191),'detail':_0x38457d(0x1a6)};return{'name':_0x38457d(_0x20438e._0x259fc3),'severity':'ok','message':_0x413879};}__name(checkWritableCwd,_0x8fe9bb(0x15d));var PACKAGE_NAME=_0x8fe9bb(0x1b1),WebRunnerAdapter=class{static{__name(this,_0x8fe9bb(0x165));}[_0x8fe9bb(0x1b4)]=PACKAGE_NAME;['suffix']='';[_0x8fe9bb(0x1a1)]={'picker':!![],'attach':!![],'resumeFromFailure':![]};[_0x8fe9bb(0x16f)]=[_0x8fe9bb(0x179),_0x8fe9bb(0x19b),'authoring'];[_0x8fe9bb(0x1a7)](){const _0x48026c={_0x307cdc:0x16d,_0xe62af4:0x194},_0x4d9f27=_0x8fe9bb,_0xa7e903=createRequire(import.meta.url),_0x2f4e4a=_0xa7e903[_0x4d9f27(_0x48026c._0x307cdc)](PACKAGE_NAME+_0x4d9f27(0x17f)),_0x2a47e6=JSON[_0x4d9f27(0x19a)](readFileSync(_0x2f4e4a,_0x4d9f27(0x1c1))),_0x16c901=pickBin(_0x2a47e6);if(!_0x16c901)throw new Error(PACKAGE_NAME+_0x4d9f27(_0x48026c._0xe62af4));return join(dirname(_0x2f4e4a),_0x16c901);}[_0x8fe9bb(0x1b7)](_0x2c5b2e){const _0x595ec4={_0x5063d1:0x192,_0xc340a5:0x179,_0x76c7f7:0x17e,_0xb0a0a7:0x182,_0x16a921:0x1a2,_0x2e3ccf:0x19b,_0x605c04:0x198,_0x5239b4:0x16a,_0x1cb08a:0x161,_0x298fc7:0x1a2,_0x205492:0x1bf,_0x327a05:0x1a8,_0x4bb9c7:0x1b4},_0x57af38=_0x8fe9bb;if(_0x2c5b2e[_0x57af38(_0x595ec4._0x5063d1)]===_0x57af38(_0x595ec4._0xc340a5)){const _0x508cbb=[_0x57af38(0x1af),_0x2c5b2e['scenario']];if(_0x2c5b2e['debug'])_0x508cbb['push'](_0x57af38(0x1a5));return _0x2c5b2e['breakpoints']&&_0x2c5b2e[_0x57af38(_0x595ec4._0x76c7f7)][_0x57af38(_0x595ec4._0xb0a0a7)]>0x0&&_0x508cbb[_0x57af38(_0x595ec4._0x16a921)](_0x57af38(0x167),_0x2c5b2e[_0x57af38(0x17e)][_0x57af38(0x163)](',')),_0x508cbb;}if(_0x2c5b2e[_0x57af38(0x192)]===_0x57af38(_0x595ec4._0x2e3ccf)){const _0x8f709f=[_0x57af38(0x19b),_0x2c5b2e[_0x57af38(0x19b)]];_0x2c5b2e[_0x57af38(0x198)]!==void 0x0&&_0x2c5b2e[_0x57af38(_0x595ec4._0x605c04)]>0x1&&_0x8f709f[_0x57af38(0x1a2)](_0x57af38(_0x595ec4._0x5239b4)+_0x2c5b2e[_0x57af38(_0x595ec4._0x605c04)]);if(_0x2c5b2e[_0x57af38(_0x595ec4._0x1cb08a)])_0x8f709f[_0x57af38(_0x595ec4._0x298fc7)](_0x57af38(_0x595ec4._0x205492));return _0x8f709f;}if(_0x2c5b2e[_0x57af38(_0x595ec4._0x5063d1)]==='authoring')return[_0x57af38(_0x595ec4._0x327a05),_0x2c5b2e['scenario']];const _0x43d860=_0x2c5b2e;throw new UnsupportedRunKindError(_0x43d860['kind'],this[_0x57af38(_0x595ec4._0x4bb9c7)]);}[_0x8fe9bb(0x169)](_0x32b388){const _0xbdd4e9=_0x8fe9bb,_0x3989c7={};if(_0x32b388[_0xbdd4e9(0x170)])_0x3989c7[_0xbdd4e9(0x173)]='1';return _0x3989c7;}[_0x8fe9bb(0x17b)](){const _0x185c6c={_0x5d722f:0x196},_0x5fc1e=_0x8fe9bb;return[_0x5fc1e(_0x185c6c._0x5d722f)];}['schedulesArgs'](){const _0x45cc0f={_0x12c2d2:0x1c4},_0x5e24cc=_0x8fe9bb;return['schedules',_0x5e24cc(_0x45cc0f._0x12c2d2)];}async['doctor'](_0x241d06){return runEnvironmentChecks({'cwd':_0x241d06['projectRoot']});}},webRunnerAdapter=new WebRunnerAdapter(),web_runner_adapter_default=webRunnerAdapter;function pickBin(_0xacd148){const _0x1addc7={_0x5d51e3:0x193,_0x5609d3:0x18e,_0x578600:0x199,_0x4a8438:0x172},_0x5e3dcf=_0x8fe9bb;if(typeof _0xacd148[_0x5e3dcf(0x18e)]===_0x5e3dcf(_0x1addc7._0x5d51e3))return _0xacd148[_0x5e3dcf(_0x1addc7._0x5609d3)];if(_0xacd148[_0x5e3dcf(_0x1addc7._0x5609d3)]&&typeof _0xacd148[_0x5e3dcf(0x18e)]===_0x5e3dcf(_0x1addc7._0x578600))return _0xacd148[_0x5e3dcf(0x18e)][_0x5e3dcf(_0x1addc7._0x4a8438)]??Object['values'](_0xacd148[_0x5e3dcf(0x18e)])[0x0]??null;return null;}__name(pickBin,'pickBin');export{web_runner_adapter_default as default,webRunnerAdapter};
|
|
1
|
+
const _0x5b719e=_0x1c71;(function(_0x25f1af,_0x48b7d1){const _0x26598={_0x2c66dd:0x132,_0x99b28e:0x134,_0x2ae345:0x139,_0x476a8b:0x127,_0x5073d4:0x14f},_0xbef82d=_0x1c71,_0x4fdaee=_0x25f1af();while(!![]){try{const _0x57deb8=parseInt(_0xbef82d(0x184))/0x1*(parseInt(_0xbef82d(0x163))/0x2)+parseInt(_0xbef82d(_0x26598._0x2c66dd))/0x3*(parseInt(_0xbef82d(0x11b))/0x4)+parseInt(_0xbef82d(0x16e))/0x5*(-parseInt(_0xbef82d(0x16a))/0x6)+-parseInt(_0xbef82d(0x155))/0x7*(parseInt(_0xbef82d(_0x26598._0x99b28e))/0x8)+parseInt(_0xbef82d(0x159))/0x9*(-parseInt(_0xbef82d(0x142))/0xa)+parseInt(_0xbef82d(_0x26598._0x2ae345))/0xb*(parseInt(_0xbef82d(_0x26598._0x476a8b))/0xc)+parseInt(_0xbef82d(_0x26598._0x5073d4))/0xd;if(_0x57deb8===_0x48b7d1)break;else _0x4fdaee['push'](_0x4fdaee['shift']());}catch(_0x5d765e){_0x4fdaee['push'](_0x4fdaee['shift']());}}}(_0x5534,0x7103a));var __defProp=Object[_0x5b719e(0x147)],__name=(_0xa51c42,_0x17a880)=>__defProp(_0xa51c42,_0x5b719e(0x149),{'value':_0x17a880,'configurable':!![]});import{UnsupportedRunKindError}from'@unotest/protocol';import{readFileSync}from'fs';import{createRequire}from'module';function _0x5534(){const _0x557b89=['D2HPy2G','yxv0Ag9Y','l3vZCI9IAw4VBwLJCM9ZB2z0lwvKz2uTC3rHyMXL','Dw5VDgvZDc13zwi','ChjVAMvJDfjVB3q','mZe0EefPtNvu','ihbHy2THz2uUANnVBIbKzwnSyxjLCYbUBYaNyMLUjYbMAwvSzcdIGjqGyNjVA2vUigLUC3rHBgW/','ls1IywLS','q3jLyxrLihrOzsbKAxjLy3rVCNKGB3iGCNvUigLUAxqGAw4Gyw4GzxHPC3rPBMCGChjVAMvJDcbYB290lG','AxngAw5PDgu','yMLU','AM9PBG','mZG0sMXOEgTi','l3vZCI9IAw4Vy2HYB21PDw0TyNjVD3nLCG','C2nOzwr1BgvZqxjNCW','u3LZDgvTigjYB3DZzxi','ntmZmtvZAgPrCuS','yNjLywTWB2LUDhm','l0fWCgXPy2f0Aw9UCY9hB29NBguGq2HYB21LlMfWCc9dB250zw50CY9nywnpuY9hB29NBguGq2HYB21L','l3bHy2THz2uUANnVBG','C3rYAw5N','xeDVB2DSzvXdAhjVBwvCqxbWBgLJyxrPB25Cy2HYB21LlMv4zq','yNvPBgrfBNy','Aw5PDcb3AwXSig9MzMvYihrVigrVD25SB2fKigj1BMrSzwqGq2HYB21PDw0Gkh4XntaGtuiPlIbbBhrLCM5HDgL2zwX5lcbPBNn0ywXSienOCM9TzsbMCM9TigH0DhbZoI8VD3D3lMDVB2DSzs5JB20Vy2HYB21LigfUzcbYzs1YDw4U','CgfYC2u','ChjVyMvdAhjVBwvczxrH','y2HHBM5LBa','C2nLBMfYAw8','BwLJCM9ZB2z0lwvKz2uTC3rHyMXL','vgfYz2v0igrPCMvJDg9YEq','ChjVyMvfzgDL','zxjYB3i','r29Vz2XLienOCM9Tzq','A2LUza','Dw5KzwzPBMvK','y2HYB21PDw0','v2vIuNvUBMvYqwrHChrLCG','igzVDw5K','mti5n2H1EKjYCG','z29Vz2XLlwnOCM9Tzq','l3vZCI9IAw4Vz29Vz2XLlwnOCM9Tzs1ZDgfIBgu','ndG0nJrhzLHcDeC','zgfYD2LU','C2nOzwr1BgvZ','yMfPBa','BgvUz3rO','l3vZCI9IAw4VBwLJCM9ZB2z0lwvKz2u','uhjVz3jHBuzPBgvZkhG4nIK','l0fWCgXPy2f0Aw9UCY9nAwnYB3nVzNqGrwrNzs5HChaVq29UDgvUDhmVtwfJt1mVtwLJCM9ZB2z0ievKz2u','CMvZB2X2zq','l3vZCI9IAw4Vy2HYB21PDw0','y2HYB21PDw0TyNjVD3nLCG','Cgf0Aa','mJG2nZi4v1j3AeL4','yxv0Ag9YAw5N','zg9JDg9Y','BwLJCM9ZB2z0lwvKz2u','y29SBgvJDgLVBG','y3DK','zgvIDwC','ChjVyMvdAhjVBwu','y2HYB21L','C3rHCNrZv2L0Aa','xe1Py3jVC29MDfXfzgDLxefWCgXPy2f0Aw9Uxg1ZzwrNzs5LEgu','m0DIzK1rCa','yxbWu2vYDMvYqxjNCW','mJmYrLfSrwvS','z29Vz2XLlwnOCM9Tzs1ZDgfIBgu','l3nUyxaVyMLUl2DVB2DSzs1JAhjVBwu','l0fWCgXPy2f0Aw9UCY9hB29NBguGq2HYB21LiejLDgeUyxbWl0nVBNrLBNrZl01Hy09tl0DVB2DSzsbdAhjVBwuGqMv0yq','BM9Kzq','mJK3EgDKBfvR','ls13B3jRzxjZpq','D2HPy2HpzG','r29Vz2XLienOCM9TzsbczxrH','ztjL','y2HYB21LlwjLDge','CMvZB2X2zujPBG','BgfIzwW','vu5pvevtvf9iruferuq','mJb0qNzmDKC','xeDVB2DSzvXdAhjVBwuGqMv0yvXbChbSAwnHDgLVBLXJAhjVBwuUzxHL','CMvXDwLYzxmGtM9KzsdIIAuYmcaOCNvUBMLUzYa','uhjVz3jHBuzPBgvZ','D2fYBMLUzW','zgvMAw5LuhjVCgvYDhK','AgvHzgvK','BMfTzq','zMLYC3rfEgLZDgLUz1bHDgG','ChvZAa','yNvPBgrbCMDZ','ls1Kzwj1zW','sw5ZDgfSBcboB2rLidiWkYb2AweGBNzTic8GzM5Tic8GDM9SDgeGyw5KihjLlxj1BI4','nJi4nZK3mhP1qLnkBa','igrVzxmGBM90igv4Axn0','zw52','y2HLy2TtExn0zw1cCM93C2vY','CgXHDgzVCM0','D29YA2vYCW','mZaXnJnYtxD4tg8','D2LUmZi','tM9Kzs5QCYb2zxjZAw9U','yxbWlxnLCNzLCG','mZm0mJmZCLHOrerT','qhvUB3rLC3qVD2vI','DgfYz2v0ia','ls1ICMvHAW','l3vZCI9IAw4Vz29Vz2XLlwnOCM9Tzs1IzxrH'];_0x5534=function(){return _0x557b89;};return _0x5534();}import{dirname,join}from'path';function _0x1c71(_0x4e53e3,_0x612063){_0x4e53e3=_0x4e53e3-0x11a;const _0x553403=_0x5534();let _0x1c7187=_0x553403[_0x4e53e3];if(_0x1c71['UldvyA']===undefined){var _0x32c6b8=function(_0x4bfb6b){const _0x13ddd4='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x35eddf='',_0xa51c42='';for(let _0x17a880=0x0,_0x38f8cb,_0x197dc5,_0x1f661f=0x0;_0x197dc5=_0x4bfb6b['charAt'](_0x1f661f++);~_0x197dc5&&(_0x38f8cb=_0x17a880%0x4?_0x38f8cb*0x40+_0x197dc5:_0x197dc5,_0x17a880++%0x4)?_0x35eddf+=String['fromCharCode'](0xff&_0x38f8cb>>(-0x2*_0x17a880&0x6)):0x0){_0x197dc5=_0x13ddd4['indexOf'](_0x197dc5);}for(let _0x48554c=0x0,_0x21c999=_0x35eddf['length'];_0x48554c<_0x21c999;_0x48554c++){_0xa51c42+='%'+('00'+_0x35eddf['charCodeAt'](_0x48554c)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0xa51c42);};_0x1c71['yNEcCU']=_0x32c6b8,_0x1c71['ibECiC']={},_0x1c71['UldvyA']=!![];}const _0x4093ea=_0x553403[0x0],_0x3cd030=_0x4e53e3+_0x4093ea,_0x5e7491=_0x1c71['ibECiC'][_0x3cd030];return!_0x5e7491?(_0x1c7187=_0x1c71['yNEcCU'](_0x1c7187),_0x1c71['ibECiC'][_0x3cd030]=_0x1c7187):_0x1c7187=_0x5e7491,_0x1c7187;}import{existsSync as _0x35eddf}from'fs';import{execFileSync}from'child_process';import{existsSync}from'fs';function probeSystemBrowser(){const _0x572f2b={_0x104095:0x178},_0x729dc7=_0x5b719e;for(const _0x38f8cb of[probeChrome,probeEdge,probeChromeBeta]){const _0x197dc5=_0x38f8cb();if(_0x197dc5[_0x729dc7(_0x572f2b._0x104095)]!==null)return _0x197dc5;}return{'channel':null};}__name(probeSystemBrowser,'probeSystemBrowser');function probeChrome(){const _0x5265bd={_0x5a1e3c:0x17e},_0x39f54d=_0x5b719e,_0x1f661f=firstExistingPath(CHROME_PATHS)??whichOf(CHROME_BIN_NAMES);if(_0x1f661f)return{'channel':_0x39f54d(0x12f),'path':_0x1f661f,'label':_0x39f54d(_0x5265bd._0x5a1e3c)};return{'channel':null};}__name(probeChrome,_0x5b719e(0x12e));function probeEdge(){const _0x48554c=firstExistingPath(EDGE_PATHS)??whichOf(EDGE_BIN_NAMES);if(_0x48554c)return{'channel':'msedge','path':_0x48554c,'label':'Microsoft\x20Edge'};return{'channel':null};}__name(probeEdge,_0x5b719e(0x17c));function probeChromeBeta(){const _0x5400f6={_0x4da1cb:0x13e,_0x422d5d:0x13c},_0x4d3c75=_0x5b719e,_0x21c999=firstExistingPath(CHROME_BETA_PATHS);if(_0x21c999)return{'channel':_0x4d3c75(_0x5400f6._0x4da1cb),'path':_0x21c999,'label':_0x4d3c75(_0x5400f6._0x422d5d)};return{'channel':null};}__name(probeChromeBeta,_0x5b719e(0x177));var CHROME_PATHS=((()=>{const _0x3afaeb={_0x437bd6:0x170,_0x26b783:0x156,_0x20e332:0x145,_0x1624cd:0x173,_0x120f81:0x124,_0x1e0a93:0x16b},_0xdb6b88=_0x5b719e;switch(process[_0xdb6b88(0x153)]){case _0xdb6b88(0x11c):return[_0xdb6b88(_0x3afaeb._0x437bd6)];case _0xdb6b88(_0x3afaeb._0x26b783):return[process['env'][_0xdb6b88(_0x3afaeb._0x20e332)]+'\x5cGoogle\x5cChrome\x5cApplication\x5cchrome.exe',process['env']['ProgramFiles(x86)']+_0xdb6b88(_0x3afaeb._0x1624cd),process[_0xdb6b88(0x151)]['LOCALAPPDATA']+_0xdb6b88(0x173)];default:return['/usr/bin/google-chrome',_0xdb6b88(0x11a),_0xdb6b88(0x136),_0xdb6b88(_0x3afaeb._0x120f81),_0xdb6b88(_0x3afaeb._0x1e0a93)];}})()),CHROME_BIN_NAMES=[_0x5b719e(0x185),_0x5b719e(0x135),_0x5b719e(0x181),_0x5b719e(0x125)],EDGE_PATHS=((()=>{const _0x31c652={_0x214fb3:0x11c,_0x1c7160:0x122,_0x4c9a60:0x121,_0x54cf62:0x131,_0x220e74:0x160},_0x57522d=_0x5b719e;switch(process['platform']){case _0x57522d(_0x31c652._0x214fb3):return[_0x57522d(_0x31c652._0x1c7160)];case _0x57522d(0x156):return[process[_0x57522d(0x151)][_0x57522d(0x145)]+_0x57522d(0x131),process['env'][_0x57522d(_0x31c652._0x4c9a60)]+_0x57522d(_0x31c652._0x54cf62)];default:return[_0x57522d(0x120),_0x57522d(_0x31c652._0x220e74)];}})()),EDGE_BIN_NAMES=[_0x5b719e(0x12a),_0x5b719e(0x17a)],CHROME_BETA_PATHS=((()=>{const _0x1b6359={_0x3e7da8:0x153,_0x124671:0x137,_0x2b33e2:0x145,_0x48da09:0x143,_0x28a591:0x15d},_0x47e44f=_0x5b719e;switch(process[_0x47e44f(_0x1b6359._0x3e7da8)]){case'darwin':return[_0x47e44f(_0x1b6359._0x124671)];case'win32':return[process['env'][_0x47e44f(_0x1b6359._0x2b33e2)]+_0x47e44f(_0x1b6359._0x48da09)];default:return[_0x47e44f(_0x1b6359._0x28a591)];}})());function firstExistingPath(_0x268ed5){const _0x38c5c8=_0x5b719e;for(const _0x27ce8c of _0x268ed5){if(!_0x27ce8c||_0x27ce8c[_0x38c5c8(0x130)](_0x38c5c8(0x180)))continue;if(existsSync(_0x27ce8c))return _0x27ce8c;}return null;}__name(firstExistingPath,_0x5b719e(0x14a));function whichOf(_0x5578f4){const _0x275be4=_0x5b719e;if(process['platform']===_0x275be4(0x156))return void 0x0;for(const _0x2f02bd of _0x5578f4){try{const _0x2495cf=execFileSync(_0x275be4(0x15e),[_0x2f02bd],{'encoding':'utf8'})['trim']();if(_0x2495cf[_0x275be4(0x11f)]>0x0&&existsSync(_0x2495cf))return _0x2495cf;}catch{}}return void 0x0;}__name(whichOf,_0x5b719e(0x13b));function runEnvironmentChecks(_0x120661={}){const _0x144381={_0x391257:0x12c},_0x9fee0e=_0x5b719e,_0x4dede7=_0x120661[_0x9fee0e(0x12c)]??process[_0x9fee0e(_0x144381._0x391257)]();return[checkNodeVersion(),checkSystemBrowser(),checkWritableCwd(_0x4dede7)];}__name(runEnvironmentChecks,'runEnvironmentChecks');function checkNodeVersion(){const _0xf19d15={_0x5d61e0:0x138,_0x30539d:0x167,_0x3658af:0x17d,_0xd816cc:0x14e,_0x104e6d:0x157},_0x5c836b=_0x5b719e,_0x5aea2f=process['versions'][_0x5c836b(_0xf19d15._0x5d61e0)],_0x2fb5aa=Number(_0x5aea2f['split']('.')[0x0]);if(!Number[_0x5c836b(_0xf19d15._0x30539d)](_0x2fb5aa)||_0x2fb5aa<0x14)return{'name':_0x5c836b(0x157),'severity':_0x5c836b(_0xf19d15._0x3658af),'message':_0x5c836b(0x144)+_0x5aea2f+')','detail':_0x5c836b(_0xf19d15._0xd816cc)};return{'name':_0x5c836b(_0xf19d15._0x104e6d),'severity':'ok','message':_0x5aea2f};}__name(checkNodeVersion,'checkNodeVersion');function checkSystemBrowser(){const _0x3b9f43={_0x3b266e:0x16d,_0x3a1ec7:0x140,_0x130379:0x146,_0x1dcab4:0x175},_0x2a0a95=_0x5b719e,_0x170bb1=probeSystemBrowser();if(_0x170bb1['channel']!==null)return{'name':_0x2a0a95(_0x3b9f43._0x3b266e),'severity':'ok','message':_0x170bb1[_0x2a0a95(_0x3b9f43._0x3a1ec7)]+_0x2a0a95(0x183),'detail':_0x170bb1[_0x2a0a95(0x126)]};return{'name':'System\x20browser','severity':_0x2a0a95(_0x3b9f43._0x130379),'message':'no\x20Chrome\x20/\x20Edge\x20/\x20Chromium\x20detected','detail':_0x2a0a95(_0x3b9f43._0x1dcab4)};}__name(checkSystemBrowser,_0x5b719e(0x152));function checkWritableCwd(_0x325421){const _0x459cec={_0x2ec11b:0x17d,_0x2cac6e:0x166},_0x2bd390=_0x5b719e;if(!_0x35eddf(_0x325421))return{'name':'Target\x20directory','severity':_0x2bd390(_0x459cec._0x2ec11b),'message':_0x2bd390(0x15b)+_0x325421+_0x2bd390(0x150),'detail':_0x2bd390(_0x459cec._0x2cac6e)};return{'name':_0x2bd390(0x17b),'severity':'ok','message':_0x325421};}__name(checkWritableCwd,'checkWritableCwd');var PACKAGE_NAME=_0x5b719e(0x15a),WebRunnerAdapter=class{static{__name(this,_0x5b719e(0x182));}[_0x5b719e(0x149)]=PACKAGE_NAME;['suffix']='';[_0x5b719e(0x12d)]={'picker':!![],'attach':!![],'resumeFromFailure':![]};['supportedKinds']=[_0x5b719e(0x179),_0x5b719e(0x12b),'authoring'];[_0x5b719e(0x13f)](){const _0x5dd629={_0x3b6301:0x171,_0x1375c7:0x176,_0x2061c8:0x164},_0xeb47c1=_0x5b719e,_0x554182=createRequire(import.meta.url),_0x2e72d4=_0x554182[_0xeb47c1(0x123)](PACKAGE_NAME+_0xeb47c1(_0x5dd629._0x3b6301)),_0xa8183c=JSON[_0xeb47c1(_0x5dd629._0x1375c7)](readFileSync(_0x2e72d4,'utf8')),_0x4038af=pickBin(_0xa8183c);if(!_0x4038af)throw new Error(PACKAGE_NAME+_0xeb47c1(_0x5dd629._0x2061c8));return join(dirname(_0x2e72d4),_0x4038af);}[_0x5b719e(0x14c)](_0x2c4d31){const _0x713ab3={_0x462b3d:0x13d,_0x4a4fef:0x179,_0x1273e3:0x14b,_0x55922d:0x14d,_0x933e0c:0x16f,_0x2d77d7:0x11f,_0x19b876:0x15c,_0x5aaa45:0x169,_0x5cfe68:0x12b,_0x45a3d2:0x154,_0x5d4fe9:0x14b,_0x3ccbd2:0x128,_0x49a0d0:0x15f,_0x189e01:0x17f},_0x53e366=_0x5b719e;if(_0x2c4d31['kind']===_0x53e366(0x179)){const _0x24143d=[_0x53e366(_0x713ab3._0x462b3d),_0x2c4d31[_0x53e366(_0x713ab3._0x4a4fef)]];if(_0x2c4d31[_0x53e366(0x12d)])_0x24143d[_0x53e366(_0x713ab3._0x1273e3)](_0x53e366(_0x713ab3._0x55922d));return _0x2c4d31[_0x53e366(_0x713ab3._0x933e0c)]&&_0x2c4d31[_0x53e366(_0x713ab3._0x933e0c)][_0x53e366(_0x713ab3._0x2d77d7)]>0x0&&_0x24143d[_0x53e366(0x14b)](_0x53e366(_0x713ab3._0x19b876),_0x2c4d31[_0x53e366(0x16f)][_0x53e366(_0x713ab3._0x5aaa45)](',')),_0x24143d;}if(_0x2c4d31[_0x53e366(0x17f)]===_0x53e366(_0x713ab3._0x5cfe68)){const _0x2986f2=[_0x53e366(_0x713ab3._0x5cfe68),_0x2c4d31[_0x53e366(0x12b)]];_0x2c4d31[_0x53e366(_0x713ab3._0x45a3d2)]!==void 0x0&&_0x2c4d31[_0x53e366(0x154)]>0x1&&_0x2986f2[_0x53e366(_0x713ab3._0x5d4fe9)](_0x53e366(0x13a)+_0x2c4d31[_0x53e366(0x154)]);if(_0x2c4d31[_0x53e366(0x11e)])_0x2986f2['push'](_0x53e366(0x165));return _0x2986f2;}if(_0x2c4d31[_0x53e366(0x17f)]===_0x53e366(_0x713ab3._0x3ccbd2))return[_0x53e366(_0x713ab3._0x49a0d0),_0x2c4d31[_0x53e366(0x179)]];const _0x51811b=_0x2c4d31;throw new UnsupportedRunKindError(_0x51811b[_0x53e366(_0x713ab3._0x189e01)],this[_0x53e366(0x149)]);}[_0x5b719e(0x174)](_0x12db07){const _0x436030={_0x464cc7:0x148,_0x5eafe8:0x141},_0x3f3438=_0x5b719e,_0x4c4b39={};if(_0x12db07[_0x3f3438(_0x436030._0x464cc7)])_0x4c4b39[_0x3f3438(_0x436030._0x5eafe8)]='1';return _0x4c4b39;}[_0x5b719e(0x133)](){const _0x53dbbe=_0x5b719e;return[_0x53dbbe(0x158)];}[_0x5b719e(0x16c)](){const _0x538f0d=_0x5b719e;return[_0x538f0d(0x11d),'--json'];}async[_0x5b719e(0x129)](_0x2b6e98){const _0x3ece3e={_0x421382:0x162},_0x4d67ef=_0x5b719e;return runEnvironmentChecks({'cwd':_0x2b6e98[_0x4d67ef(_0x3ece3e._0x421382)]});}},webRunnerAdapter=new WebRunnerAdapter(),web_runner_adapter_default=webRunnerAdapter;function pickBin(_0x57b68e){const _0x460d06={_0x65a93a:0x168,_0x763a38:0x172},_0x36d7a6=_0x5b719e;if(typeof _0x57b68e[_0x36d7a6(_0x460d06._0x65a93a)]===_0x36d7a6(_0x460d06._0x763a38))return _0x57b68e['bin'];if(_0x57b68e[_0x36d7a6(_0x460d06._0x65a93a)]&&typeof _0x57b68e['bin']==='object')return _0x57b68e['bin'][_0x36d7a6(0x161)]??Object['values'](_0x57b68e[_0x36d7a6(0x168)])[0x0]??null;return null;}__name(pickBin,'pickBin');export{web_runner_adapter_default as default,webRunnerAdapter};
|
|
@@ -5,7 +5,7 @@ last_updated: 2026-09-03
|
|
|
5
5
|
|
|
6
6
|
# Agent integration
|
|
7
7
|
|
|
8
|
-
`@unotest/web` ships an MCP server with **
|
|
8
|
+
`@unotest/web` ships an MCP server with **50 tools**. This manual covers
|
|
9
9
|
how to wire it into common MCP clients and what the agent can do once
|
|
10
10
|
connected.
|
|
11
11
|
|
|
@@ -27,7 +27,7 @@ connected.
|
|
|
27
27
|
```
|
|
28
28
|
|
|
29
29
|
Claude Code prompts for approval on first start. After approve, the
|
|
30
|
-
|
|
30
|
+
50 `mcp__unotest-web__*` tools appear in the agent's tool surface.
|
|
31
31
|
|
|
32
32
|
### Claude Desktop
|
|
33
33
|
|
|
@@ -56,22 +56,30 @@ echo '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' \
|
|
|
56
56
|
| npx @unotest/web mcp
|
|
57
57
|
```
|
|
58
58
|
|
|
59
|
-
Should return JSON with `tools: [...
|
|
59
|
+
Should return JSON with `tools: [...50 entries]` (default env: full
|
|
60
60
|
toolset, snapshots on, grounder off).
|
|
61
61
|
|
|
62
62
|
## Tool catalog
|
|
63
63
|
|
|
64
|
-
### Core
|
|
64
|
+
### Core lifecycle and observers (9)
|
|
65
65
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
manual setup).
|
|
66
|
+
Open and close the browser, and read what the agent "sees" — a semantic
|
|
67
|
+
outline, not pixels.
|
|
69
68
|
|
|
70
|
-
`new_context`, `close_context`, `
|
|
71
|
-
`
|
|
72
|
-
`
|
|
73
|
-
|
|
74
|
-
`
|
|
69
|
+
`new_context`, `close_context`, `get_url`, `get_title`,
|
|
70
|
+
`get_page_snapshot`, `get_frame_snapshot`, `get_aria_snapshot`,
|
|
71
|
+
`find_element`, `check_locator`.
|
|
72
|
+
|
|
73
|
+
There is deliberately **no `click` / `fill` / `goto` tool**. Acting on the
|
|
74
|
+
page goes through `explore_step` (below), which performs the action AND
|
|
75
|
+
records it, so an exploration is always a thing that can be turned into a
|
|
76
|
+
scenario. Per-action tools existed until the recording-mode change and
|
|
77
|
+
were removed: an action nobody recorded left the agent with a page it
|
|
78
|
+
could not explain how it reached.
|
|
79
|
+
|
|
80
|
+
`check_locator({locator, limit?})` evaluates a locator written exactly as
|
|
81
|
+
it appears in a scenario against the live page and reports what it really
|
|
82
|
+
matches — verifying a selector without re-running the test.
|
|
75
83
|
|
|
76
84
|
`get_page_snapshot` / `get_frame_snapshot` return a compact outline of
|
|
77
85
|
**interactive** elements (action surface). `get_aria_snapshot` returns
|
|
@@ -114,7 +122,25 @@ driver runs `core` from the same code. Typical matrices:
|
|
|
114
122
|
# local-model driver: UNOTEST_TOOLSET=core UNOTEST_SNAPSHOT=0 UNOTEST_GROUNDER_MODE=local
|
|
115
123
|
```
|
|
116
124
|
|
|
117
|
-
###
|
|
125
|
+
### Exploration (10)
|
|
126
|
+
|
|
127
|
+
The recording loop: every action is performed and written down in one
|
|
128
|
+
call, so the exploration is a draft scenario from the first step.
|
|
129
|
+
|
|
130
|
+
- `explore_start` — begin a session (it opens the browser context itself)
|
|
131
|
+
- `explore_step` — perform ONE action and record it; intent locators are
|
|
132
|
+
resolved here
|
|
133
|
+
- `explore_steps` — several actions in one call, `autoRun` to run the
|
|
134
|
+
result immediately
|
|
135
|
+
- `explore_state` / `explore_steps` — what has been recorded so far
|
|
136
|
+
- `explore_record` — add a step without performing it
|
|
137
|
+
- `explore_remove_step` — drop a recorded step
|
|
138
|
+
- `explore_run_flow` — replay a `flow_*` helper inside the session
|
|
139
|
+
- `explore_stop` — end the session
|
|
140
|
+
- `generate_dsl_from_exploration` — the recording as DSL text
|
|
141
|
+
- `save_exploration_as_test` — write it to `unotest/e2e/<name>.js`
|
|
142
|
+
|
|
143
|
+
### Debugger (11)
|
|
118
144
|
|
|
119
145
|
The reason most agents pick this package over driving Playwright
|
|
120
146
|
directly. Detailed workflow in `debugger-tools.md`.
|
|
@@ -137,6 +163,11 @@ directly. Detailed workflow in `debugger-tools.md`.
|
|
|
137
163
|
event, last failure (with line/col + error), and all local variables.
|
|
138
164
|
- `abort_runtime` — kill the runtime, release the browser context.
|
|
139
165
|
- `list_runtimes` — recover a lost `runtimeId`.
|
|
166
|
+
- `record_action` — append an action to a live debug session.
|
|
167
|
+
- `attach_debug_session` / `detach_debug_session` — join the run a human
|
|
168
|
+
is already driving in the viewer, instead of opening a second browser.
|
|
169
|
+
- `take_wheel` / `release_wheel` — take control of that shared session,
|
|
170
|
+
and hand it back.
|
|
140
171
|
|
|
141
172
|
### Multi-context (4)
|
|
142
173
|
|
|
@@ -187,6 +218,21 @@ Auto-switch runs **only** under `explore_step` (recording / ad-hoc).
|
|
|
187
218
|
- `get_failure_network` — HAR (tier 3 — not yet wired, see
|
|
188
219
|
`KNOWN_ISSUES.md`)
|
|
189
220
|
|
|
221
|
+
### Reading a box (6)
|
|
222
|
+
|
|
223
|
+
The route these belong to is above, under
|
|
224
|
+
[Reading a run that happened on a box](#reading-a-run-that-happened-on-a-box);
|
|
225
|
+
this is the list.
|
|
226
|
+
|
|
227
|
+
- `box_envs` — environments this read token may look at
|
|
228
|
+
- `box_runs` — run history in one of them (`latest` / `running` /
|
|
229
|
+
`scenario` / `limit`)
|
|
230
|
+
- `box_run` — what happened in one run
|
|
231
|
+
- `box_run_download` — fetch it and unpack its failure bundle into
|
|
232
|
+
`.unotest/failures/`, where the tools above read from
|
|
233
|
+
- `box_queue` — who is waiting, who is running
|
|
234
|
+
- `box_screenshot` — one frame the run captured, as an image
|
|
235
|
+
|
|
190
236
|
### `ground_element` (1, experimental, off by default)
|
|
191
237
|
|
|
192
238
|
Registered when `UNOTEST_GROUNDER_MODE` is `local` or `remote` for the
|
|
@@ -277,6 +323,13 @@ the last failed call plus recent failing exits. `filter:"layer:resolver"`
|
|
|
277
323
|
`filter:"tool:explore_step"` → recent events for that tool. `limit` caps
|
|
278
324
|
the count (default 50).
|
|
279
325
|
|
|
326
|
+
### `open_viewer` (1)
|
|
327
|
+
|
|
328
|
+
Start the local viewer, or return the URL of the one already running (it
|
|
329
|
+
reads the lockfile rather than opening a second). Hand that URL to the
|
|
330
|
+
person you are working with when the answer is easier to look at than to
|
|
331
|
+
describe — a run's step tree, a screenshot strip, a diff of sources.
|
|
332
|
+
|
|
280
333
|
## Variable environments (dev / staging / prod)
|
|
281
334
|
|
|
282
335
|
Scenario variables come from `unotest/.env` + `unotest/.secrets`.
|
|
@@ -350,6 +403,88 @@ This shape is a published contract: the event types
|
|
|
350
403
|
from `@unotest/protocol` under semver, and the box daemon reads the same
|
|
351
404
|
events for its metrics.
|
|
352
405
|
|
|
406
|
+
## Reading a run that happened on a box
|
|
407
|
+
|
|
408
|
+
The journal above is on your machine. A run ordered with `bundle push
|
|
409
|
+
--run` is not: the box answers with run ids and hangs up, because a suite
|
|
410
|
+
takes minutes and a request held open that long is a timeout, not a
|
|
411
|
+
result. These six tools read the answer back.
|
|
412
|
+
|
|
413
|
+
**The route, end to end.** You pushed and ordered a run:
|
|
414
|
+
|
|
415
|
+
```sh
|
|
416
|
+
npx @unotest/web bundle push --run --env test --collection smoke
|
|
417
|
+
# → { "runs": [{ "runId": "checkout-mqf3pwr1", ... }] }
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
1. `box_run { environment: "acme/test", runId: "checkout-mqf3pwr1" }` —
|
|
421
|
+
status, the failure that ended the run, the results of soft steps, the
|
|
422
|
+
judge's verdicts, notes and logs. For most failures this is the whole
|
|
423
|
+
answer and you stop here.
|
|
424
|
+
2. It failed and you want the artifacts:
|
|
425
|
+
`box_run_download { environment, runId }`. The run's zip lands in
|
|
426
|
+
`.unotest/box/`, and its failure bundle is unpacked into
|
|
427
|
+
`.unotest/failures/<runId>/<testFn>/` — the directory the reply names.
|
|
428
|
+
3. From there it is the loop you already know:
|
|
429
|
+
`get_failure_trace { testId: "<that directory>" }`, then
|
|
430
|
+
`get_failure_console`, `get_failure_a11y`, `get_failure_screenshot`,
|
|
431
|
+
and `agent_fix` when you have a fix to propose. **Nothing about them
|
|
432
|
+
changes** — a box failure is debugged with the same tools as a local
|
|
433
|
+
one, which is the entire point of unpacking to that path.
|
|
434
|
+
|
|
435
|
+
Where the route starts differently:
|
|
436
|
+
|
|
437
|
+
- **No run id?** `box_runs { environment }` lists recent runs;
|
|
438
|
+
`{ latest: true }` collapses them to the last run per scenario with its
|
|
439
|
+
failing streak — the answer a single status cannot give. `{ running:
|
|
440
|
+
true }` shows what is in flight.
|
|
441
|
+
- **No environment name?** `box_envs` lists them as
|
|
442
|
+
`<project>/<environment>`, with the bundle each is serving.
|
|
443
|
+
- **The run never started?** `box_queue { environment }` — it is probably
|
|
444
|
+
behind someone else's.
|
|
445
|
+
- **You want to see the page**, not read about it: `box_screenshot
|
|
446
|
+
{ environment, runId }` returns a frame as an image. Frames exist when
|
|
447
|
+
the scenario called `screenshot()` or the environment runs with
|
|
448
|
+
`UNOTEST_STEP_SCREENSHOTS=1`; without `step` you get the last one,
|
|
449
|
+
which on a failed run is usually the state that failed.
|
|
450
|
+
|
|
451
|
+
**Credentials.** Reading uses a *personal* read token —
|
|
452
|
+
`UNOTEST_BOX_READ_TOKEN` alongside `UNOTEST_BOX_URL`. It is read-only
|
|
453
|
+
whatever its owner's role on the box, it is revocable, and it is minted
|
|
454
|
+
by a person for themselves on the box's guard. `UNOTEST_BOX_TOKEN` is the
|
|
455
|
+
project's push credential and cannot read runs; without a read token
|
|
456
|
+
every `box_*` tool refuses with a message saying where to get one, rather
|
|
457
|
+
than failing in some way you have to interpret.
|
|
458
|
+
|
|
459
|
+
The token lives in **`unotest/.secrets`**:
|
|
460
|
+
|
|
461
|
+
```
|
|
462
|
+
UNOTEST_BOX_READ_TOKEN=ubr_...
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
and the box address in `unotest/.env` as `UNOTEST_BOX_URL`. This matters
|
|
466
|
+
for an agent specifically: your MCP server is started by your editor, so
|
|
467
|
+
a token exported in a shell is a token the server was never handed —
|
|
468
|
+
you would have to edit the editor's own JSON config and reconnect.
|
|
469
|
+
|
|
470
|
+
Both values are resolved on **every call**, not once when the server
|
|
471
|
+
starts: a token minted and written into `unotest/.secrets` mid-session is
|
|
472
|
+
used by the next `box_*` call, with nothing to restart. An exported value
|
|
473
|
+
still wins when there is one.
|
|
474
|
+
|
|
475
|
+
`unotest/.env` is never read for the token: that file travels inside a
|
|
476
|
+
pushed bundle, while `.secrets` does not (it is gitignored, excluded from
|
|
477
|
+
the bundle, and `env push` leaves `UNOTEST_*` at home).
|
|
478
|
+
|
|
479
|
+
**Two answers worth reading carefully.** `unavailable` means the
|
|
480
|
+
environment's viewer is still starting or its bundle failed to install —
|
|
481
|
+
wait and retry, the address is fine. `rate-limited` means wait and send
|
|
482
|
+
the *same* token again; it never means the token is bad.
|
|
483
|
+
|
|
484
|
+
Size: a run with a frame per step is mostly PNGs. `box_run_download
|
|
485
|
+
{ screenshots: false }` asks the box to leave them out, so the download
|
|
486
|
+
shrinks rather than just the unpacking.
|
|
487
|
+
|
|
353
488
|
## Debug logging
|
|
354
489
|
|
|
355
490
|
Set `UNOTEST_DEBUG=1` in `unotest/.env` and restart the MCP server to
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@unotest/web",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.32.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": {
|
|
@@ -83,18 +83,18 @@
|
|
|
83
83
|
"tsx": "^4.19.2",
|
|
84
84
|
"yaml": "^2.6.0",
|
|
85
85
|
"zod": "^3.23.8",
|
|
86
|
-
"@unotest/core": "^0.
|
|
87
|
-
"@unotest/
|
|
88
|
-
"@unotest/
|
|
89
|
-
"@unotest/
|
|
90
|
-
"@unotest/
|
|
86
|
+
"@unotest/core": "^0.32.0",
|
|
87
|
+
"@unotest/protocol": "^0.32.0",
|
|
88
|
+
"@unotest/grounder-client": "^0.32.0",
|
|
89
|
+
"@unotest/dsl": "^0.32.0",
|
|
90
|
+
"@unotest/viewer": "^0.32.0"
|
|
91
91
|
},
|
|
92
92
|
"devDependencies": {
|
|
93
93
|
"@types/node": "^22.10.0",
|
|
94
94
|
"javascript-obfuscator": "^4.1.1",
|
|
95
95
|
"tsup": "^8.5.1",
|
|
96
96
|
"typescript": "^5.7.2",
|
|
97
|
-
"@unotest/
|
|
98
|
-
"@unotest/
|
|
97
|
+
"@unotest/grounder": "^0.32.0",
|
|
98
|
+
"@unotest/judge": "^0.32.0"
|
|
99
99
|
}
|
|
100
100
|
}
|