@unotest/web 0.13.0 → 0.14.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.
@@ -1 +1 @@
1
- const _0x36726a=_0x2f30;(function(_0x3110ff,_0x31f147){const _0x1cd54c={_0x11f4f5:0x101,_0x532b22:0xf9,_0x2877e6:0xf1,_0x6d264f:0x106,_0x283f52:0xea,_0x369df1:0xec,_0x228f4e:0xfe},_0x216b1c=_0x2f30,_0x430716=_0x3110ff();while(!![]){try{const _0x402b7e=-parseInt(_0x216b1c(0xf7))/0x1*(-parseInt(_0x216b1c(_0x1cd54c._0x11f4f5))/0x2)+parseInt(_0x216b1c(_0x1cd54c._0x532b22))/0x3*(-parseInt(_0x216b1c(_0x1cd54c._0x2877e6))/0x4)+parseInt(_0x216b1c(_0x1cd54c._0x6d264f))/0x5*(parseInt(_0x216b1c(0xed))/0x6)+parseInt(_0x216b1c(0x105))/0x7+-parseInt(_0x216b1c(_0x1cd54c._0x283f52))/0x8*(parseInt(_0x216b1c(_0x1cd54c._0x369df1))/0x9)+-parseInt(_0x216b1c(_0x1cd54c._0x228f4e))/0xa+parseInt(_0x216b1c(0xf0))/0xb;if(_0x402b7e===_0x31f147)break;else _0x430716['push'](_0x430716['shift']());}catch(_0x2ced05){_0x430716['push'](_0x430716['shift']());}}}(_0x467b,0xeb8f6));var __defProp=Object['defineProperty'],__name=(_0x1677cf,_0x29d865)=>__defProp(_0x1677cf,_0x36726a(0xff),{'value':_0x29d865,'configurable':!![]});import{mkdir,writeFile}from'fs/promises';import{existsSync}from'fs';function _0x467b(){const _0x573fd8=['BMfTzq','lY8GrxHHBxbSzsaWmsdIGjqGC21VA2u6ig5HDMLNyxrLicSGy2XPy2SGkYbvuKWGyxnZzxj0Aw9UlGOVlWOVlYbuAguGBwLUAw1HBcb0AhjLzs1ZDgvWihbHDhrLCM4UieHPDhmGCgXHEwDYB3vUzc51BM90zxn0lMnVBsbZBYbUBYbWCM9Qzwn0cI8VihnLDhvWigLZig5LzwrLzc4GuNvUihDPDgG6icbUChGGqhvUB3rLC3qVD2vIiguYzsbLEgfTCgXLCY8Wms1ZBw9RzqOkzNvUy3rPB24GDgvZDf9ZBw9Rzv9WBgf5z3jVDw5KkcKGEWOGihn0zxaOiK9Wzw4GDgHLiejPzYbuywjSzsbZy2vUyxjPBYbMCM9TihrOzsbWBgf5z3jVDw5KigLUzgv4iIWGkcKGpt4GEWOGicaGz290BYGNlYCPoWOGicaGy2XPy2SOz2v0qNLsB2XLkcDSAw5RjYWGE25HBwu6icDcAwCGvgfIBguNlcbLEgfJDdOGDhj1zx0PktSkicaGigfZC2vYDfvYBcGNl3nJzw5HCMLVCY9IAwCTDgfIBguNktSkicb9ktSkFqO','mNfuwxzmwq','mdeTC21VA2uUANm','zxHHBxbSzxm','cIaGlY8GDMLLD2vYoIb7cIaGlY8GicbWB3j0oIa1mtCZlcaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGic8VigrLzMf1Bhq6ihjHBMrVBsbMCMvLihbVCNqkicaVlYaGigjYB3DZzxi6ihrYDwuSicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGlY8GzgvMyxvSDdOGDhj1zsaOyxv0BY1VCgvUig9Uigb2Awv3zxjGkqOGic8Vih0ScN07cG','mZa2nJa1nK9xC2zxuq','nuXvEgDJCa','ztjL','mtm4nZeXmMn1uhnHBa','lMvUDG','nJnvCgXmENG','ode1ndz0BeDABeW','x2HLBhbLCNm','zw52rxHHBxbSzq','mZaXotiWmdHdAe9PEMi','nJq0zgnSu0Do','Dw5VDgvZDenVBMzPz01QCW','lY8Gtw92zsaRihjLBMfTzsb0AgLZigzPBguGDg8GpgzLyxr1CMu+lZX5B3vYx25HBwu+lMPZicHLlMCUcI8Vigf1DgGVBg9NAw4UANmPigfUzcb0AguGzNvUy3rPB24GyMvSB3CGDg8GDgvZDf88Ew91CL9Uyw1LpIGPlIbty2vUyxjPB3mGBgL2zqOVlYbPBIbMzwf0DxjLihn1yMzVBgrLCNmSie5pvcb0AguGztjLihjVB3qG4OcuihrOzsbSAw50zxiGkgXPBNq6C2nLBMfYAw8TAw4TCM9VDcKklY8GCMvQzwn0CYbHihrLC3qGzMLSzsbWBgfJzwqGzgLYzwn0BhKGAw4GDw5VDgvZDc9LmMuVlIbuAguGBg9HzgvYigrLCML2zxmGDgHLcI8VigvUDhj5ig5HBwuGzNjVBsb0AguGzMLSzsbIyxnLBMfTzsdIGjqGA2vIywiTy2fZzsbKyxnOzxmGyMvJB21LihvUzgvYC2nVCMvZlGOklY8GrxzLCNKGzxHLy3v0ywjSzsbZDgvWig11C3qGC2L0igLUC2LKzsbHihn0zxaOiI4UlIiSicGPid0+ihSG4OcMih0PigjSB2nRlIbuAguklY8GDgL0BguGAxmGysbWBgfPBI1fBMDSAxnOigrLC2nYAxb0Aw9Uig9MihrOzsbNCM91CdSGDgHLihn0zxbZigLUC2LKzsbHCMuklY8GDgHLigLTCgXLBwvUDgf0Aw9UlIbhCM91CcbIEsbPBNrLBNqGkfnLDhvWic8Grw50zxiGlYbby3qGlYbbC3nLCNqGB3iklY8GD2HHDgv2zxiGCMvHzhmGD2vSBcKG4Ocuig9UzsbIBg9JAYbWzxiGBg9NAwnHBcbJAhvUAY4kcMz1BMn0Aw9UihrLC3rFEw91CL9Uyw1Lx2HLCMuOksb7cIaGC3rLCcGIu2vLzcbHigTUB3DUihvZzxiGDMLHiercic8GqvbjigzPEhr1CMvZigzYB20Gx2HLBhbLCNmViIWGkcKGpt4GEWOGicaGlY8GicaGD2LWzv9LmMvFDxnLCNmOktSkicaGic8VicaGihvZzxjFAwqGpsbZzwvKx3vZzxiOj2fSAwnLqgv4yw1WBguUy29TjYWGj3nLy3jLDcCPoWOGih0PoWOkicbZDgvWkcjtAwDUigLUigfZihrOzsbZzwvKzwqGDxnLCIiSicGPid0+ihSkicaGigDVDg8Oj2H0DhbZoI8VEw91CI1HChaUDgvZDc9SB2DPBICPoWOGicaGlY8GicaGzMLSBcHNzxrcEuXHyMvSkcDfBwfPBcCPlcaNywXPy2vazxHHBxbSzs5JB20NktSkicaGic8VicaGigzPBgWOz2v0qNLmywjLBcGNugfZC3DVCMqNksWGj3nLy3jLDcCPoWOGicaGlY8GicaGy2XPy2SOz2v0qNLsB2XLkcDIDxr0B24Nlcb7BMfTztOGj0XVzYbPBID9ksK7cIaGFsK7cGOGihn0zxaOiKfZC2vYDcb0AguGzgfZAgjVyxjKihnOB3DZihrOzsbZAwDUzwqTAw4GDxnLCIiSicGPid0+ihSkicaGic8VicaGigfZC2vYDfvYBcGNl2rHC2HIB2fYzcCPoWOGicaGlY8GicaGyxnZzxj0vgv4DcHNzxrcEvjVBguOj2HLywrPBMCNksWGj1DLBgnVBwuSiefSAwnLjYK7cIaGicaVlYaGicbJB3vUDca9igrIuxvLCNKOj1nftevdvcbJB3vUDcGQksbguK9nihvZzxjZifDirvjfigfJDgL2zsa9ihrYDwuNktSkicaGic8VicaGigfZC2vYDfrYDwuOy291BNqGpIaWlcaNzxHWzwn0zwqGyxqGBgvHC3qGB25LigfJDgL2zsb1C2vYjYK7cIaGFsK7cN0k','C3rYAw5NAwz5','iYb1BM90zxn0lxDLyIdIGjqGC2vJCMv0ihnJzw5HCMLVihzHCMLHyMXLCY4Gq3jLyxrLzcbIEsbGAw5PDgaSigDPDgLNBM9YzwqUcImkiYbtyw1LieTfwt1wquXvrsbMB3jTyxqGyxmGDw5VDgvZDc8Uzw52lcbIDxqGDMfSDwvZigHLCMuGyxjLihrYzwf0zwqGyxmkiYbtrunsrvq6ihrOzxKGyxjLig1HC2TLzcaOC2HVD24GyxmGyokaUxnLy3jLDdPlrvNIGlPGksbHBNL3AgvYzsb0AguGCNvUBMvYig9YcImGtunqigrLyNvNigXVzYb3B3vSzcbVDgHLCNDPC2uGD3jPDguGDgHLBsdIGjqGzMLSBcGPihzHBhvLCYWGvvjmCYWGzxzHBhvHDgukiYbZDhjPBMDZlIbszwzLCMvUy2uGDgHLBsbPBIbHihnJzw5HCMLVigj5ihrOzwLYigjHCMuGvvbqrvjFu05bs0uGBMfTzsWGDgHLcImGC2fTzsb3yxKGyxmGlMvUDIb2yxjPywjSzxm6cImkiYaGigzPBgWOz2v0qNLmywjLBcGNugfZC3DVCMqNksWGueftu1DpuKqPoWOJcImGu2vJCMv0CYbHCMuGtK9uigv4Cg9YDgvKihrVihn1yNbYB2nLC3nLCYaOC2HLBgWOksKG4OcuihrOzxKGC3rHEsbPBIb0AgukiYb2yxjPywjSzsbZDg9Yzs4GqsbZDwjWCM9JzxnZihrOyxqGz2vUDwLUzwX5ig5LzwrZig9UzsaOysbSAxn0zw5LCIb3AxrOigekiYb0B2TLBIKGz2v0CYbPDcb2AweGDgHLigv4CgXPy2L0igfSBg93BgLZDcbPBIb1BM90zxn0lMnVBMzPzY4QoGOJicaGC2fUzgjVEdOGEYbLEhbVCNrtzwnYzxrZoIbBj1rps0voj10GFqOJifb1DcbUB24TC2vJCMv0ihzHBhvLCYaOvvjmCYWGzw1HAwXZlcbPzhmPigLUihvUB3rLC3qVlMvUDI4kiWOJiezmruvux0vyqu1qteukte9hsu49cLbbu1nxt1jepqPut0TftJ0k','Dw5VDgvZDc5JB25MAwCUBwPZ','otuWoduZthLfDeXg','icbJAgfUBMvSoIa','mJa3ndvvv3LXs1e','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','ChvZAa','y2HHBM5LBa','Dw5VDgvZDa','odu1mJG4merYu1LAzq'];_0x467b=function(){return _0x573fd8;};return _0x467b();}import{join}from'path';var templates={'scenarioTemplate':_0x36726a(0xf3),'agentsMd':_0x36726a(0xfa),'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':_0x36726a(0x100),'02-form-fill.js':'//\x20Example\x2002\x20—\x20fill\x20an\x20input\x20+\x20assert\x20the\x20app\x20reacted.\x0a//\x0a//\x20Against\x20playground.unotest.com/scenarios/big-table.\x20Demonstrates\x20getByRole\x0a//\x20for\x20a\x20labelled\x20input,\x20typed\x20input\x20via\x20fill(),\x20and\x20a\x20locator\x20method-chain\x0a//\x20(getByRole(\x27row\x27).filter({hasText}).first())\x20in\x20an\x20assertion.\x0a//\x20Run\x20with:\x20\x20npx\x20@unotest/web\x20e2e\x20examples/02-form-fill\x0a\x0afunction\x20test_form_fill_happy_path()\x20{\x0a\x20\x20step(\x22Filter\x20the\x20Big\x20Table\x20by\x20a\x20name\x22,\x20()\x20=>\x20{\x0a\x20\x20\x20\x20goto(\x27/scenarios/big-table\x27);\x0a\x20\x20\x20\x20fill(getByRole(\x27textbox\x27,\x20{name:\x20\x27Filter\x20by\x20name\x27}),\x20\x27Uma\x20Quinn\x27);\x0a\x20\x20});\x0a\x0a\x20\x20step(\x22Filtering\x20reveals\x20the\x20Clear\x20filter\x20control\x20and\x20matching\x20rows\x22,\x20()\x20=>\x20{\x0a\x20\x20\x20\x20assertVisible(getByRole(\x27button\x27,\x20{name:\x20\x27Clear\x20filter\x27}));\x0a\x20\x20\x20\x20assertVisible(getByRole(\x27row\x27).filter({hasText:\x20\x27Uma\x20Quinn\x27}).first());\x0a\x20\x20});\x0a}\x0a'},'secretsExample':_0x36726a(0xf5),'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 _0x2f30(_0x12eb2c,_0x169852){_0x12eb2c=_0x12eb2c-0xe9;const _0x467b57=_0x467b();let _0x2f3037=_0x467b57[_0x12eb2c];if(_0x2f30['bmLLCk']===undefined){var _0x16e063=function(_0x43aa4a){const _0x523a4a='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x1677cf='',_0x29d865='';for(let _0x16acb6=0x0,_0x1b25d5,_0x4b1232,_0xa95bdd=0x0;_0x4b1232=_0x43aa4a['charAt'](_0xa95bdd++);~_0x4b1232&&(_0x1b25d5=_0x16acb6%0x4?_0x1b25d5*0x40+_0x4b1232:_0x4b1232,_0x16acb6++%0x4)?_0x1677cf+=String['fromCharCode'](0xff&_0x1b25d5>>(-0x2*_0x16acb6&0x6)):0x0){_0x4b1232=_0x523a4a['indexOf'](_0x4b1232);}for(let _0xa73159=0x0,_0x29a174=_0x1677cf['length'];_0xa73159<_0x29a174;_0xa73159++){_0x29d865+='%'+('00'+_0x1677cf['charCodeAt'](_0xa73159)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x29d865);};_0x2f30['HGPiVR']=_0x16e063,_0x2f30['jHbggR']={},_0x2f30['bmLLCk']=!![];}const _0x30dc32=_0x467b57[0x0],_0x1ad19f=_0x12eb2c+_0x30dc32,_0x275472=_0x2f30['jHbggR'][_0x1ad19f];return!_0x275472?(_0x2f3037=_0x2f30['HGPiVR'](_0x2f3037),_0x2f30['jHbggR'][_0x1ad19f]=_0x2f3037):_0x2f3037=_0x275472,_0x2f3037;}function unotestConfigMjs(_0x16acb6){const _0x17be92={_0xf5bbaa:0xf8,_0x2a1a5b:0xf4,_0x7c3aa7:0x104},_0x1212f3=_0x36726a,_0x1b25d5=_0x16acb6===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)':_0x1212f3(_0x17be92._0xf5bbaa)+JSON[_0x1212f3(_0x17be92._0x2a1a5b)](_0x16acb6)+',';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'+_0x1b25d5+_0x1212f3(_0x17be92._0x7c3aa7);}__name(unotestConfigMjs,_0x36726a(0xf2));async function scaffoldWorkspace(_0x4b1232,_0xa95bdd={}){const _0x3e08bc={_0x22d232:0xe9,_0xe7d0d8:0xee,_0x5c8457:0xfc,_0x3da873:0xfd,_0x5d4b50:0xeb,_0x530bc7:0x103,_0x591248:0x102,_0x49a9c4:0xfb},_0x4dd94a=_0x36726a,_0xa73159=[],_0x29a174=[];await mkdir(join(_0x4b1232,'unotest',_0x4dd94a(_0x3e08bc._0x22d232),_0x4dd94a(0x103)),{'recursive':!![]}),await mkdir(join(_0x4b1232,_0x4dd94a(0xfd),_0x4dd94a(0xe9),_0x4dd94a(_0x3e08bc._0xe7d0d8)),{'recursive':!![]});const _0x1630e8=[{'rel':_0x4dd94a(0xf6),'content':unotestConfigMjs(_0xa95bdd[_0x4dd94a(_0x3e08bc._0x5c8457)])},{'rel':join(_0x4dd94a(_0x3e08bc._0x3da873),_0x4dd94a(_0x3e08bc._0x5d4b50)),'content':templates[_0x4dd94a(0xef)]},{'rel':join(_0x4dd94a(_0x3e08bc._0x3da873),_0x4dd94a(_0x3e08bc._0x22d232),_0x4dd94a(_0x3e08bc._0x530bc7),_0x4dd94a(_0x3e08bc._0x591248)),'content':templates['examples'][_0x4dd94a(0x102)]}];for(const {rel:_0xa0d412,content:_0x131ef1}of _0x1630e8){const _0x540f64=join(_0x4b1232,_0xa0d412);if(existsSync(_0x540f64)){_0x29a174[_0x4dd94a(0xfb)](_0xa0d412);continue;}await writeFile(_0x540f64,_0x131ef1),_0xa73159[_0x4dd94a(_0x3e08bc._0x49a9c4)](_0xa0d412);}return{'projectRoot':_0x4b1232,'created':_0xa73159,'skipped':_0x29a174};}__name(scaffoldWorkspace,'scaffoldWorkspace');export{scaffoldWorkspace};
1
+ const _0x222602=_0x5df7;(function(_0x45d6d7,_0x5c5188){const _0x456aea={_0xdf5a2f:0x1df,_0xba5e41:0x1d1,_0x2bd491:0x1c7},_0x699b53=_0x5df7,_0x4da037=_0x45d6d7();while(!![]){try{const _0x515acd=-parseInt(_0x699b53(0x1c8))/0x1*(parseInt(_0x699b53(0x1cd))/0x2)+parseInt(_0x699b53(0x1d5))/0x3+-parseInt(_0x699b53(0x1ce))/0x4*(-parseInt(_0x699b53(_0x456aea._0xdf5a2f))/0x5)+parseInt(_0x699b53(0x1d7))/0x6*(parseInt(_0x699b53(_0x456aea._0xba5e41))/0x7)+-parseInt(_0x699b53(0x1d8))/0x8+-parseInt(_0x699b53(_0x456aea._0x2bd491))/0x9+parseInt(_0x699b53(0x1cb))/0xa;if(_0x515acd===_0x5c5188)break;else _0x4da037['push'](_0x4da037['shift']());}catch(_0x539f26){_0x4da037['push'](_0x4da037['shift']());}}}(_0x55f9,0x22676));function _0x55f9(){const _0x1b645f=['Dw5VDgvZDa','C3rYAw5NAwz5','nJiZodC3quz0DMrU','lY8Gtw92zsaRihjLBMfTzsb0AgLZigzPBguGDg8GpgzLyxr1CMu+lZX5B3vYx25HBwu+lMPZicHLlMCUcI8Vigf1DgGVBg9NAw4UANmPigfUzcb0AguGzNvUy3rPB24GyMvSB3CGDg8GDgvZDf88Ew91CL9Uyw1LpIGPlIbty2vUyxjPB3mGBgL2zqOVlYbPBIbMzwf0DxjLihn1yMzVBgrLCNmSie5pvcb0AguGztjLihjVB3qG4OcuihrOzsbSAw50zxiGkgXPBNq6C2nLBMfYAw8TAw4TCM9VDcKklY8GCMvQzwn0CYbHihrLC3qGzMLSzsbWBgfJzwqGzgLYzwn0BhKGAw4GDw5VDgvZDc9LmMuVlIbuAguGBg9HzgvYigrLCML2zxmGDgHLcI8VigvUDhj5ig5HBwuGzNjVBsb0AguGzMLSzsbIyxnLBMfTzsdIGjqGA2vIywiTy2fZzsbKyxnOzxmGyMvJB21LihvUzgvYC2nVCMvZlGOklY8GrxzLCNKGzxHLy3v0ywjSzsbZDgvWig11C3qGC2L0igLUC2LKzsbHihn0zxaOiI4UlIiSicGPid0+ihSG4OcMih0PigjSB2nRlIbuAguklY8GDgL0BguGAxmGysbWBgfPBI1fBMDSAxnOigrLC2nYAxb0Aw9Uig9MihrOzsbNCM91CdSGDgHLihn0zxbZigLUC2LKzsbHCMuklY8GDgHLigLTCgXLBwvUDgf0Aw9UlIbhCM91CcbIEsbPBNrLBNqGkfnLDhvWic8Grw50zxiGlYbby3qGlYbbC3nLCNqGB3iklY8GD2HHDgv2zxiGCMvHzhmGD2vSBcKG4Ocuig9UzsbIBg9JAYbWzxiGBg9NAwnHBcbJAhvUAY4kcMz1BMn0Aw9UihrLC3rFEw91CL9Uyw1Lx2HLCMuOksb7cIaGC3rLCcGIu2vLzcbHigTUB3DUihvZzxiGDMLHiercic8GqvbjigzPEhr1CMvZigzYB20Gx2HLBhbLCNmViIWGkcKGpt4GEWOGicaGlY8GicaGD2LWzv9LmMvFDxnLCNmOktSkicaGic8VicaGihvZzxjFAwqGpsbZzwvKx3vZzxiOj2fSAwnLqgv4yw1WBguUy29TjYWGj3nLy3jLDcCPoWOGih0PoWOkicbZDgvWkcjtAwDUigLUigfZihrOzsbZzwvKzwqGDxnLCIiSicGPid0+ihSkicaGigDVDg8Oj2H0DhbZoI8VEw91CI1HChaUDgvZDc9SB2DPBICPoWOGicaGlY8GicaGzMLSBcHNzxrcEuXHyMvSkcDfBwfPBcCPlcaNywXPy2vazxHHBxbSzs5JB20NktSkicaGic8VicaGigzPBgWOz2v0qNLmywjLBcGNugfZC3DVCMqNksWGj3nLy3jLDcCPoWOGicaGlY8GicaGy2XPy2SOz2v0qNLsB2XLkcDIDxr0B24Nlcb7BMfTztOGj0XVzYbPBID9ksK7cIaGFsK7cGOGihn0zxaOiKfZC2vYDcb0AguGzgfZAgjVyxjKihnOB3DZihrOzsbZAwDUzwqTAw4GDxnLCIiSicGPid0+ihSkicaGic8VicaGigfZC2vYDfvYBcGNl2rHC2HIB2fYzcCPoWOGicaGlY8GicaGyxnZzxj0vgv4DcHNzxrcEvjVBguOj2HLywrPBMCNksWGj1DLBgnVBwuSiefSAwnLjYK7cIaGicaVlYaGicbJB3vUDca9igrIuxvLCNKOj1nftevdvcbJB3vUDcGQksbguK9nihvZzxjZifDirvjfigfJDgL2zsa9ihrYDwuNktSkicaGic8VicaGigfZC2vYDfrYDwuOy291BNqGpIaWlcaNzxHWzwn0zwqGyxqGBgvHC3qGB25LigfJDgL2zsb1C2vYjYK7cIaGFsK7cN0k','mZbHt1v5wK0','mteYotmXmNncDe9HAq','mdeTC21VA2uUANm','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','icaVlYbJAgfUBMvSoIaNy2HYB21LjYWGicaGicaGicaGicaGicaGicaGicaGicaGicaGlY8Gj2nOCM9TzsCGlYaNBxnLzgDLjYaVig51BgWGkgj1BMrSzwqP','iYmGrtjfihrLC3rPBMCGD2L0AcbaDw5VDgvZDc93zwikcKbbr0vovfmUBwqkcKzVCIbHBNKGCMvXDwvZDcb0BYb3CML0zsWGCMvJB3jKlcbVCIbYDw4Gyw4Gzw5KlxrVlwvUzcb0zxn0lcbVCgvUihrOzqPGD3jPDguTztjLlxrLC3rGihnRAwXSicHVCIbYDw4Gyc93CML0zs1LmMuTDgvZDgaPigfUzcbKCML2zsb0AguGyNjVD3nLCIb0AhjVDwDOcNrOzsbGDw5VDgvZDc13zwjGie1ducb0B29SCYaOyg5LD19JB250zxH0ycdIHPiGygv4CgXVCMvFC3rLCgaG4OAsigbNzxrFCgfNzv9ZBMfWC2HVDgak4OAsigbYDw5FDgvZDgaPlIbeBYbUB3qGAgfUzc1HDxrOB3iGDgvZDhmGyMXPBMqGB3iGBwfWihrOzsbWCM9Qzwn0ihDPDgGkygzPBMrGl2bSC2aVygf3A2aG4OcuihrOzsbZA2LSBcDZifbOyxnLidaGBgLZDhmGDgHLigzPBgvZihrVihjLywqU','icbJAgfUBMvSoIa','nxjjzMvdwa','C2nHzMzVBgrxB3jRC3bHy2u','zxHHBxbSzxm','lY8GrxHHBxbSzsaWmsdIGjqGC21VA2u6ig5HDMLNyxrLicSGy2XPy2SGkYbvuKWGyxnZzxj0Aw9UlGOVlWOVlYbuAguGBwLUAw1HBcb0AhjLzs1ZDgvWihbHDhrLCM4UieHPDhmGCgXHEwDYB3vUzc51BM90zxn0lMnVBsbZBYbUBYbWCM9Qzwn0cI8VihnLDhvWigLZig5LzwrLzc4GuNvUihDPDgG6icbUChGGqhvUB3rLC3qVD2vIiguYzsbLEgfTCgXLCY8Wms1ZBw9RzqOkzNvUy3rPB24GDgvZDf9ZBw9Rzv9WBgf5z3jVDw5KkcKGEWOGihn0zxaOiK9Wzw4GDgHLiejPzYbuywjSzsbZy2vUyxjPBYbMCM9TihrOzsbWBgf5z3jVDw5KigLUzgv4iIWGkcKGpt4GEWOGicaGz290BYGNlYCPoWOGicaGy2XPy2SOz2v0qNLsB2XLkcDSAw5RjYWGE25HBwu6icDcAwCGvgfIBguNlcbLEgfJDdOGDhj1zx0PktSkicaGigfZC2vYDfvYBcGNl3nJzw5HCMLVCY9IAwCTDgfIBguNktSkicb9ktSkFqO','nZe5odiWAwHODe9n','mtuZn29yq2r4yW','zw52rxHHBxbSzq','ztjL','mtyZnJq2mgnOEM5iqq','zgvMAw5LuhjVCgvYDhK','nJjJtLrtBNm','mti2mZu2t2PRyKH2','Dw5VDgvZDc5JB25MAwCUBwPZ','BMfTzq','oteYmvbtuwLAAq','ChvZAa'];_0x55f9=function(){return _0x1b645f;};return _0x55f9();}function _0x5df7(_0x2a7edb,_0x1e5255){_0x2a7edb=_0x2a7edb-0x1c7;const _0x55f933=_0x55f9();let _0x5df785=_0x55f933[_0x2a7edb];if(_0x5df7['ZdwtJx']===undefined){var _0x2d25ef=function(_0x178aaa){const _0xe3dba0='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x5bd084='',_0x213c51='';for(let _0x48791e=0x0,_0x1e86bd,_0x2f4436,_0x47a0ac=0x0;_0x2f4436=_0x178aaa['charAt'](_0x47a0ac++);~_0x2f4436&&(_0x1e86bd=_0x48791e%0x4?_0x1e86bd*0x40+_0x2f4436:_0x2f4436,_0x48791e++%0x4)?_0x5bd084+=String['fromCharCode'](0xff&_0x1e86bd>>(-0x2*_0x48791e&0x6)):0x0){_0x2f4436=_0xe3dba0['indexOf'](_0x2f4436);}for(let _0x3cc6b8=0x0,_0x37af8f=_0x5bd084['length'];_0x3cc6b8<_0x37af8f;_0x3cc6b8++){_0x213c51+='%'+('00'+_0x5bd084['charCodeAt'](_0x3cc6b8)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x213c51);};_0x5df7['eILWib']=_0x2d25ef,_0x5df7['GRulWI']={},_0x5df7['ZdwtJx']=!![];}const _0x5ae6d7=_0x55f933[0x0],_0x576049=_0x2a7edb+_0x5ae6d7,_0x5e8a4a=_0x5df7['GRulWI'][_0x576049];return!_0x5e8a4a?(_0x5df785=_0x5df7['eILWib'](_0x5df785),_0x5df7['GRulWI'][_0x576049]=_0x5df785):_0x5df785=_0x5e8a4a,_0x5df785;}var __defProp=Object[_0x222602(0x1cc)],__name=(_0x5bd084,_0x213c51)=>__defProp(_0x5bd084,_0x222602(0x1d0),{'value':_0x213c51,'configurable':!![]});import{mkdir,writeFile}from'fs/promises';import{existsSync}from'fs';import{join}from'path';var templates={'scenarioTemplate':_0x222602(0x1d6),'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':_0x222602(0x1dd),'examples':{'01-smoke.js':_0x222602(0x1e2),'02-form-fill.js':'//\x20Example\x2002\x20—\x20fill\x20an\x20input\x20+\x20assert\x20the\x20app\x20reacted.\x0a//\x0a//\x20Against\x20playground.unotest.com/scenarios/big-table.\x20Demonstrates\x20getByRole\x0a//\x20for\x20a\x20labelled\x20input,\x20typed\x20input\x20via\x20fill(),\x20and\x20a\x20locator\x20method-chain\x0a//\x20(getByRole(\x27row\x27).filter({hasText}).first())\x20in\x20an\x20assertion.\x0a//\x20Run\x20with:\x20\x20npx\x20@unotest/web\x20e2e\x20examples/02-form-fill\x0a\x0afunction\x20test_form_fill_happy_path()\x20{\x0a\x20\x20step(\x22Filter\x20the\x20Big\x20Table\x20by\x20a\x20name\x22,\x20()\x20=>\x20{\x0a\x20\x20\x20\x20goto(\x27/scenarios/big-table\x27);\x0a\x20\x20\x20\x20fill(getByRole(\x27textbox\x27,\x20{name:\x20\x27Filter\x20by\x20name\x27}),\x20\x27Uma\x20Quinn\x27);\x0a\x20\x20});\x0a\x0a\x20\x20step(\x22Filtering\x20reveals\x20the\x20Clear\x20filter\x20control\x20and\x20matching\x20rows\x22,\x20()\x20=>\x20{\x0a\x20\x20\x20\x20assertVisible(getByRole(\x27button\x27,\x20{name:\x20\x27Clear\x20filter\x27}));\x0a\x20\x20\x20\x20assertVisible(getByRole(\x27row\x27).filter({hasText:\x20\x27Uma\x20Quinn\x27}).first());\x0a\x20\x20});\x0a}\x0a'},'secretsExample':_0x222602(0x1db),'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(_0x48791e){const _0xa2a968={_0x312f5e:0x1de},_0x7b3e0b=_0x222602,_0x1e86bd=_0x48791e===void 0x0?_0x7b3e0b(0x1dc):_0x7b3e0b(_0xa2a968._0x312f5e)+JSON[_0x7b3e0b(0x1d4)](_0x48791e)+',';return _0x7b3e0b(0x1da)+_0x1e86bd+'\x0a\x20\x20//\x20viewer:\x20{\x0a\x20\x20//\x20\x20\x20port:\x205173,\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:\x20random\x20free\x20port\x0a\x20\x20//\x20\x20\x20browser:\x20true,\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:\x20true\x20(auto-open\x20on\x20`viewer`)\x0a\x20\x20//\x20},\x0a};\x0a';}__name(unotestConfigMjs,'unotestConfigMjs');async function scaffoldWorkspace(_0x2f4436,_0x47a0ac={}){const _0x3c15b1={_0x5cd430:0x1e1,_0x52816b:0x1ca,_0x1ac4bc:0x1c9,_0x1060b1:0x1d3,_0x21308f:0x1d2},_0x21638d=_0x222602,_0x3cc6b8=[],_0x37af8f=[];await mkdir(join(_0x2f4436,'unotest','e2e',_0x21638d(_0x3c15b1._0x5cd430)),{'recursive':!![]}),await mkdir(join(_0x2f4436,_0x21638d(0x1d3),_0x21638d(_0x3c15b1._0x52816b),'_helpers'),{'recursive':!![]});const _0x5ca532=[{'rel':_0x21638d(0x1cf),'content':unotestConfigMjs(_0x47a0ac['channel'])},{'rel':join(_0x21638d(0x1d3),'.env'),'content':templates[_0x21638d(_0x3c15b1._0x1ac4bc)]},{'rel':join(_0x21638d(_0x3c15b1._0x1060b1),'e2e',_0x21638d(_0x3c15b1._0x5cd430),_0x21638d(0x1d9)),'content':templates[_0x21638d(0x1e1)]['01-smoke.js']}];for(const {rel:_0x45274e,content:_0x3316fb}of _0x5ca532){const _0x258344=join(_0x2f4436,_0x45274e);if(existsSync(_0x258344)){_0x37af8f[_0x21638d(_0x3c15b1._0x21308f)](_0x45274e);continue;}await writeFile(_0x258344,_0x3316fb),_0x3cc6b8[_0x21638d(0x1d2)](_0x45274e);}return{'projectRoot':_0x2f4436,'created':_0x3cc6b8,'skipped':_0x37af8f};}__name(scaffoldWorkspace,_0x222602(0x1e0));export{scaffoldWorkspace};
@@ -1 +1 @@
1
- var _0x54cd77=_0xcb77;function _0xcb77(_0x56fffd,_0x5d4acf){_0x56fffd=_0x56fffd-0x6a;var _0x56dfcb=_0x56df();var _0xcb77d7=_0x56dfcb[_0x56fffd];if(_0xcb77['iwGvxI']===undefined){var _0x5f1214=function(_0x345a5c){var _0xdc6539='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0xf9dcbe='',_0x17a350='';for(var _0x46a2ab=0x0,_0x436840,_0x4ddf4e,_0x88f26=0x0;_0x4ddf4e=_0x345a5c['charAt'](_0x88f26++);~_0x4ddf4e&&(_0x436840=_0x46a2ab%0x4?_0x436840*0x40+_0x4ddf4e:_0x4ddf4e,_0x46a2ab++%0x4)?_0xf9dcbe+=String['fromCharCode'](0xff&_0x436840>>(-0x2*_0x46a2ab&0x6)):0x0){_0x4ddf4e=_0xdc6539['indexOf'](_0x4ddf4e);}for(var _0x20f043=0x0,_0x4926b1=_0xf9dcbe['length'];_0x20f043<_0x4926b1;_0x20f043++){_0x17a350+='%'+('00'+_0xf9dcbe['charCodeAt'](_0x20f043)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x17a350);};_0xcb77['dALbhe']=_0x5f1214,_0xcb77['zaIoES']={},_0xcb77['iwGvxI']=!![];}var _0x594e26=_0x56dfcb[0x0],_0x47afe4=_0x56fffd+_0x594e26,_0x55125=_0xcb77['zaIoES'][_0x47afe4];return!_0x55125?(_0xcb77d7=_0xcb77['dALbhe'](_0xcb77d7),_0xcb77['zaIoES'][_0x47afe4]=_0xcb77d7):_0xcb77d7=_0x55125,_0xcb77d7;}(function(_0x1c5855,_0x3d4f72){var _0x1b4269={_0xada5f6:0x78,_0x5d932b:0x6b,_0x7fede2:0x73,_0xf16bca:0x7d,_0x915bed:0x77},_0x520136=_0xcb77,_0x557dae=_0x1c5855();while(!![]){try{var _0x12cc08=-parseInt(_0x520136(_0x1b4269._0xada5f6))/0x1*(-parseInt(_0x520136(_0x1b4269._0x5d932b))/0x2)+-parseInt(_0x520136(0x74))/0x3+-parseInt(_0x520136(0x70))/0x4+parseInt(_0x520136(0x71))/0x5+-parseInt(_0x520136(_0x1b4269._0x7fede2))/0x6*(parseInt(_0x520136(_0x1b4269._0xf16bca))/0x7)+-parseInt(_0x520136(0x7b))/0x8*(-parseInt(_0x520136(0x75))/0x9)+parseInt(_0x520136(_0x1b4269._0x915bed))/0xa;if(_0x12cc08===_0x3d4f72)break;else _0x557dae['push'](_0x557dae['shift']());}catch(_0x248c9e){_0x557dae['push'](_0x557dae['shift']());}}}(_0x56df,0xb3b6c));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,_0x54cd77(0x72)),resolve(here,_0x54cd77(0x6a))],serverEntry=candidates[_0x54cd77(0x6c)](_0xf9dcbe=>existsSync(_0xf9dcbe));!serverEntry&&(process[_0x54cd77(0x6d)]['write']('serve-fixture:\x20cannot\x20locate\x20fixture\x20server\x20entry.\x20Tried:\x0a'+candidates[_0x54cd77(0x6e)](_0x17a350=>'\x20\x20'+_0x17a350+'\x0a')[_0x54cd77(0x7a)]('')+'Did\x20you\x20publish\x20without\x20examples/fixtures/?\x0a'),process['exit'](0x1));var child=spawn(process[_0x54cd77(0x7e)],[serverEntry,...process[_0x54cd77(0x6f)][_0x54cd77(0x7c)](0x2)],{'stdio':_0x54cd77(0x79)});child['on'](_0x54cd77(0x76),_0x46a2ab=>process[_0x54cd77(0x76)](_0x46a2ab??0x1));function _0x56df(){var _0x1be9c7=['yxjNDG','mtGYmtC4me5sC0HQzq','mZKZmte0mgziqK5era','lI4VlI4VzxHHBxbSzxmVzML4DhvYzxmVyNjLywSTzML4lwfWCc9Zzxj2zs5TANm','nda2ofr1CerAsq','ndm2nZK3ow1eq3nkwG','mtaWmJeWntLYsxDryw8','zxHPDa','mtaXnZi3nJbbrfDHAfK','ntDdBwPZAuW','Aw5OzxjPDa','AM9PBG','offMwwnIqq','C2XPy2u','mti0mdrrrgfVy04','zxHLy1bHDgG','lI4VlI4VlI4VzxHHBxbSzxmVzML4DhvYzxmVyNjLywSTzML4lwfWCc9Zzxj2zs5TANm','mZi3mdjou3jNuw8','zMLUza','C3rKzxjY','BwfW'];_0x56df=function(){return _0x1be9c7;};return _0x56df();}
1
+ var _0x3c5310=_0x763a;(function(_0x582050,_0x2819b9){var _0x1c114d={_0x140054:0x113,_0x51845f:0x11f,_0x11e6ed:0x11c,_0x396699:0x11a,_0xa15c09:0x116},_0x4426de=_0x763a,_0x532a12=_0x582050();while(!![]){try{var _0x38de67=-parseInt(_0x4426de(0x11e))/0x1*(parseInt(_0x4426de(_0x1c114d._0x140054))/0x2)+-parseInt(_0x4426de(0x11d))/0x3*(-parseInt(_0x4426de(_0x1c114d._0x51845f))/0x4)+-parseInt(_0x4426de(0x119))/0x5+parseInt(_0x4426de(0x127))/0x6+-parseInt(_0x4426de(_0x1c114d._0x11e6ed))/0x7+parseInt(_0x4426de(0x118))/0x8*(-parseInt(_0x4426de(_0x1c114d._0x396699))/0x9)+parseInt(_0x4426de(_0x1c114d._0xa15c09))/0xa*(parseInt(_0x4426de(0x121))/0xb);if(_0x38de67===_0x2819b9)break;else _0x532a12['push'](_0x532a12['shift']());}catch(_0x2a571b){_0x532a12['push'](_0x532a12['shift']());}}}(_0x4777,0xada3a));function _0x4777(){var _0xd59a2d=['zxHPDa','lI4VlI4VlI4VzxHHBxbSzxmVzML4DhvYzxmVyNjLywSTzML4lwfWCc9Zzxj2zs5TANm','C2XPy2u','mJG2nJu3mKLzA25bBW','Aw5OzxjPDa','lI4VlI4VzxHHBxbSzxmVzML4DhvYzxmVyNjLywSTzML4lwfWCc9Zzxj2zs5TANm','mMDvy1v5wG','zxHLy1bHDgG','zMLUza','mZaXotmWzK5muLPq','D3jPDgu','ndC4nhrgDK1qAq','nJaYnti5nuHAAfbeAW','ndmXmwzUy1jJwq','C3rKzxjY','ote3mtuZm3HwsMnMta','mJm3vhntAgXz','ndK4nZC5sKPyu25g','ndq0mdrSCwjbEeC','AM9PBG','oty4rMfNzLj5','rgLKihLVDsbWDwjSAxnOihDPDgHVDxqGzxHHBxbSzxmVzML4DhvYzxmVpWO','yxjNDG'];_0x4777=function(){return _0xd59a2d;};return _0x4777();}import{fileURLToPath}from'url';import{dirname,resolve}from'path';import{spawn}from'child_process';function _0x763a(_0x30e848,_0x64d388){_0x30e848=_0x30e848-0x112;var _0x47774d=_0x4777();var _0x763afa=_0x47774d[_0x30e848];if(_0x763a['JZQOVw']===undefined){var _0x1a9f1b=function(_0x40a52f){var _0xa8e6fc='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x7e8813='',_0x37e38a='';for(var _0x3b28ee=0x0,_0x40c556,_0x1ef850,_0x4d1573=0x0;_0x1ef850=_0x40a52f['charAt'](_0x4d1573++);~_0x1ef850&&(_0x40c556=_0x3b28ee%0x4?_0x40c556*0x40+_0x1ef850:_0x1ef850,_0x3b28ee++%0x4)?_0x7e8813+=String['fromCharCode'](0xff&_0x40c556>>(-0x2*_0x3b28ee&0x6)):0x0){_0x1ef850=_0xa8e6fc['indexOf'](_0x1ef850);}for(var _0x74bdbc=0x0,_0x3fb3d8=_0x7e8813['length'];_0x74bdbc<_0x3fb3d8;_0x74bdbc++){_0x37e38a+='%'+('00'+_0x7e8813['charCodeAt'](_0x74bdbc)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x37e38a);};_0x763a['PXecmH']=_0x1a9f1b,_0x763a['mBXVXg']={},_0x763a['JZQOVw']=!![];}var _0x50c92c=_0x47774d[0x0],_0x4ee13a=_0x30e848+_0x50c92c,_0x5acf16=_0x763a['mBXVXg'][_0x4ee13a];return!_0x5acf16?(_0x763afa=_0x763a['PXecmH'](_0x763afa),_0x763a['mBXVXg'][_0x4ee13a]=_0x763afa):_0x763afa=_0x5acf16,_0x763afa;}import{existsSync}from'fs';var here=dirname(fileURLToPath(import.meta.url)),candidates=[resolve(here,_0x3c5310(0x112)),resolve(here,_0x3c5310(0x125))],serverEntry=candidates[_0x3c5310(0x115)](_0x7e8813=>existsSync(_0x7e8813));!serverEntry&&(process[_0x3c5310(0x11b)][_0x3c5310(0x117)]('serve-fixture:\x20cannot\x20locate\x20fixture\x20server\x20entry.\x20Tried:\x0a'+candidates['map'](_0x37e38a=>'\x20\x20'+_0x37e38a+'\x0a')[_0x3c5310(0x120)]('')+_0x3c5310(0x122)),process[_0x3c5310(0x124)](0x1));var child=spawn(process[_0x3c5310(0x114)],[serverEntry,...process[_0x3c5310(0x123)][_0x3c5310(0x126)](0x2)],{'stdio':_0x3c5310(0x128)});child['on'](_0x3c5310(0x124),_0x3b28ee=>process['exit'](_0x3b28ee??0x1));
@@ -1 +1 @@
1
- function _0x3ddf(_0x4f5781,_0x26fbaa){_0x4f5781=_0x4f5781-0x190;const _0x41f04e=_0x41f0();let _0x3ddf89=_0x41f04e[_0x4f5781];if(_0x3ddf['zmSIfH']===undefined){var _0x59644f=function(_0x499549){const _0x36df2f='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x42dba8='',_0x24e765='';for(let _0x543b72=0x0,_0x2497c0,_0x47e3f5,_0x204ac3=0x0;_0x47e3f5=_0x499549['charAt'](_0x204ac3++);~_0x47e3f5&&(_0x2497c0=_0x543b72%0x4?_0x2497c0*0x40+_0x47e3f5:_0x47e3f5,_0x543b72++%0x4)?_0x42dba8+=String['fromCharCode'](0xff&_0x2497c0>>(-0x2*_0x543b72&0x6)):0x0){_0x47e3f5=_0x36df2f['indexOf'](_0x47e3f5);}for(let _0x38325c=0x0,_0x5b3246=_0x42dba8['length'];_0x38325c<_0x5b3246;_0x38325c++){_0x24e765+='%'+('00'+_0x42dba8['charCodeAt'](_0x38325c)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x24e765);};_0x3ddf['lDxuHg']=_0x59644f,_0x3ddf['oAdCSY']={},_0x3ddf['zmSIfH']=!![];}const _0x9cfa99=_0x41f04e[0x0],_0x2d6a36=_0x4f5781+_0x9cfa99,_0x3f75b9=_0x3ddf['oAdCSY'][_0x2d6a36];return!_0x3f75b9?(_0x3ddf89=_0x3ddf['lDxuHg'](_0x3ddf89),_0x3ddf['oAdCSY'][_0x2d6a36]=_0x3ddf89):_0x3ddf89=_0x3f75b9,_0x3ddf89;}const _0x5b16b4=_0x3ddf;(function(_0x16b456,_0x4ad11c){const _0x434c5d={_0x5aa8b9:0x1df,_0x443697:0x190,_0x5ab978:0x1c1,_0x324253:0x194,_0x128f43:0x1a7},_0x5ad448=_0x3ddf,_0x9105c4=_0x16b456();while(!![]){try{const _0x85daa7=parseInt(_0x5ad448(0x1ef))/0x1*(parseInt(_0x5ad448(_0x434c5d._0x5aa8b9))/0x2)+parseInt(_0x5ad448(0x1eb))/0x3*(parseInt(_0x5ad448(0x199))/0x4)+-parseInt(_0x5ad448(_0x434c5d._0x443697))/0x5+-parseInt(_0x5ad448(_0x434c5d._0x5ab978))/0x6+parseInt(_0x5ad448(0x1d5))/0x7+-parseInt(_0x5ad448(_0x434c5d._0x324253))/0x8+-parseInt(_0x5ad448(_0x434c5d._0x128f43))/0x9;if(_0x85daa7===_0x4ad11c)break;else _0x9105c4['push'](_0x9105c4['shift']());}catch(_0xc52dd2){_0x9105c4['push'](_0x9105c4['shift']());}}}(_0x41f0,0xd9b41));function _0x41f0(){const _0x584067=['y3DK','mJG0nJbqq1zJwvK','D2HPy2HpzG','l0fWCgXPy2f0Aw9UCY9hB29NBguGq2HYB21LlMfWCc9dB250zw50CY9nywnpuY9hB29NBguGq2HYB21L','vgfYz2v0igrPCMvJDg9YEq','ChjVyMvtExn0zw1cCM93C2vY','CgfYC2u','DhjPBq','D2LUmZi','y2HLy2TtExn0zw1cCM93C2vY','twLJCM9ZB2z0ievKz2u','Dw5VDgvZDc13zwi','BwLJCM9ZB2z0lwvKz2uTC3rHyMXL','mtHSvwzxD0K','C3rYAw5N','uhjVz3jHBuzPBgvZ','vu5pvevtvf9iruferuq','odLSAuXPBu8','C3rHCNrZv2L0Aa','ls1ICMvHAW','ztjL','l3vZCI9IAw4Vz29Vz2XLlwnOCM9Tzq','mta2mteYnuXMBfzPAG','D2HPy2G','r29Vz2XLienOCM9Tzq','l3bHy2THz2uUANnVBG','mtaXmJe3ntjZCxPHzey','BgfIzwW','zxjYB3i','l3vZCI9IAw4VBwLJCM9ZB2z0lwvKz2uTC3rHyMXL','zgvIDwC','nZy2mZe2q3zWwLLs','yNjLywTWB2LUDhm','B2jQzwn0','xeDVB2DSzvXdAhjVBwvCqxbWBgLJyxrPB25Cy2HYB21LlMv4zq','ChvZAa','qhvUB3rLC3qVD2vI','uhjVz3jHBuzPBgvZkhG4nIK','C3bSAxq','yxv0Ag9YAw5N','C2nLBMfYAw8','BgvUz3rO','yMLU','D2fYBMLUzW','yNvPBgrfBNy','ndaWndC4nezxqLrOza','l3vZCI9IAw4Vy2HYB21PDw0TyNjVD3nLCG','BwLJCM9ZB2z0lwvKz2u','z29Vz2XLlwnOCM9Tzq','CgLJA0jPBG','y2HHBM5LBa','AxngAw5PDgu','BM8Gq2HYB21Lic8GrwrNzsaVienOCM9TAxvTigrLDgvJDgvK','yMfPBa','C3vMzML4','y2HYB21PDw0TyNjVD3nLCG','sw5ZDgfSBcboB2rLidiWkYb2AweGBNzTic8GzM5Tic8GDM9SDgeGyw5KihjLlxj1BI4','yxv0Ag9Y','CMvZB2X2zujPBG','ihbHy2THz2uUANnVBIbKzwnSyxjLCYbUBYaNyMLUjYbMAwvSzcdIGjqGyNjVA2vUigLUC3rHBgW/','l3vZCI9IAw4VBwLJCM9ZB2z0lwvKz2u','xe1Py3jVC29MDfXfzgDLxefWCgXPy2f0Aw9Uxg1ZzwrNzs5LEgu','te9dquXbufbeqvrb','yxbWu2vYDMvYqxjNCW','tM9Kzs5QCYb2zxjZAw9U','igzVDw5K','CgXHDgzVCM0','l3nUyxaVyMLUl2DVB2DSzs1JAhjVBwu','l0fWCgXPy2f0Aw9UCY9nAwnYB3nVzNqGrwrNzs5HChaVq29UDgvUDhmVtwfJt1mVtwLJCM9ZB2z0ievKz2u','D29YA2vYCW','zg9JDg9Y','nteZodeWnKnvDKXOzq','ls1Kzwj1zW','DxrMoa','DMfSDwvZ','ChjVAMvJDfjVB3q','v2vIuNvUBMvYqwrHChrLCG','CMvZB2X2zq','zw52','ls13B3jRzxjZpq','CNvUrw52AxjVBM1LBNrdAgvJA3m','yxbWlxnLCNzLCG','BMfTzq','CMvXDwLYzxmGtM9KzsdIIAuYmcaOCNvUBMLUzYa','A2LUza','ChjVyMvdAhjVBwu','DMvYC2LVBNm','Aw5PDcb3AwXSig9MzMvYihrVigrVD25SB2fKigj1BMrSzwqGq2HYB21PDw0Gkh4XntaGtuiPlIbbBhrLCM5HDgL2zwX5lcbPBNn0ywXSienOCM9TzsbMCM9TigH0DhbZoI8VD3D3lMDVB2DSzs5JB20Vy2HYB21LigfUzcbYzs1YDw4U','BxnLzgDL','zgfYD2LU','ls1IywLS','odC4mtC4me5eDMrbAG','AM9PBG','z29Vz2XLlwnOCM9Tzs1ZDgfIBgu','y29SBgvJDgLVBG','y2HYB21LlwjLDge','u3LZDgvTigjYB3DZzxi','igrVzxmGBM90igv4Axn0','l0fWCgXPy2f0Aw9UCY9hB29NBguGq2HYB21LiejLDgeUyxbWl0nVBNrLBNrZl01Hy09tl0DVB2DSzsbdAhjVBwuGqMv0yq','Cgf0Aa'];_0x41f0=function(){return _0x584067;};return _0x41f0();}var __defProp=Object['defineProperty'],__name=(_0x24e765,_0x543b72)=>__defProp(_0x24e765,_0x5b16b4(0x1cc),{'value':_0x543b72,'configurable':!![]});import{UnsupportedRunKindError}from'@unotest/protocol';import{readFileSync}from'fs';import{createRequire}from'module';import{dirname,join}from'path';import{existsSync as _0x42dba8}from'fs';import{execFileSync}from'child_process';import{existsSync}from'fs';function probeSystemBrowser(){for(const _0x2497c0 of[probeChrome,probeEdge,probeChromeBeta]){const _0x47e3f5=_0x2497c0();if(_0x47e3f5['channel']!==null)return _0x47e3f5;}return{'channel':null};}__name(probeSystemBrowser,_0x5b16b4(0x1e3));function probeChrome(){const _0x346552={_0xbcbb59:0x192},_0xb04f05=_0x5b16b4,_0x204ac3=firstExistingPath(CHROME_PATHS)??whichOf(CHROME_BIN_NAMES);if(_0x204ac3)return{'channel':'chrome','path':_0x204ac3,'label':_0xb04f05(_0x346552._0xbcbb59)};return{'channel':null};}__name(probeChrome,_0x5b16b4(0x1cf));function probeEdge(){const _0x26203b={_0x45e04c:0x1d2},_0x516f0e=_0x5b16b4,_0x38325c=firstExistingPath(EDGE_PATHS)??whichOf(EDGE_BIN_NAMES);if(_0x38325c)return{'channel':_0x516f0e(_0x26203b._0x45e04c),'path':_0x38325c,'label':_0x516f0e(0x1e8)};return{'channel':null};}__name(probeEdge,'probeEdge');function probeChromeBeta(){const _0x4e06e9={_0x52e0c3:0x1d9},_0x2ae084=_0x5b16b4,_0x5b3246=firstExistingPath(CHROME_BETA_PATHS);if(_0x5b3246)return{'channel':_0x2ae084(_0x4e06e9._0x52e0c3),'path':_0x5b3246,'label':'Google\x20Chrome\x20Beta'};return{'channel':null};}__name(probeChromeBeta,'probeChromeBeta');var CHROME_PATHS=((()=>{const _0xab427b={_0x4aa304:0x1bc,_0x20c3db:0x1c8,_0x463e26:0x1ed,_0x4023c7:0x19c,_0x1aa61d:0x1a8},_0x24c5fe=_0x5b16b4;switch(process[_0x24c5fe(_0xab427b._0x4aa304)]){case _0x24c5fe(0x1d3):return[_0x24c5fe(0x1e1)];case _0x24c5fe(0x1e6):return[process[_0x24c5fe(_0xab427b._0x20c3db)][_0x24c5fe(_0xab427b._0x463e26)]+_0x24c5fe(0x19c),process['env'][_0x24c5fe(0x19f)]+_0x24c5fe(0x19c),process['env'][_0x24c5fe(0x1b8)]+_0x24c5fe(_0xab427b._0x4023c7)];default:return[_0x24c5fe(0x1f3),'/usr/bin/google-chrome-stable',_0x24c5fe(0x1bd),'/usr/bin/chromium',_0x24c5fe(_0xab427b._0x1aa61d)];}})()),CHROME_BIN_NAMES=[_0x5b16b4(0x1aa),_0x5b16b4(0x1d7),'chromium',_0x5b16b4(0x1b1)],EDGE_PATHS=((()=>{const _0x2bbf21={_0x3c044c:0x1bc,_0x239a44:0x1be,_0x517cd8:0x1c8,_0x32a9af:0x1ed,_0x1361bc:0x1b7,_0x1140eb:0x19f,_0x1124ee:0x197},_0x1094e5=_0x5b16b4;switch(process[_0x1094e5(_0x2bbf21._0x3c044c)]){case _0x1094e5(0x1d3):return[_0x1094e5(_0x2bbf21._0x239a44)];case'win32':return[process[_0x1094e5(_0x2bbf21._0x517cd8)][_0x1094e5(_0x2bbf21._0x32a9af)]+_0x1094e5(_0x2bbf21._0x1361bc),process[_0x1094e5(0x1c8)][_0x1094e5(_0x2bbf21._0x1140eb)]+'\x5cMicrosoft\x5cEdge\x5cApplication\x5cmsedge.exe'];default:return[_0x1094e5(0x1b6),_0x1094e5(_0x2bbf21._0x1124ee)];}})()),EDGE_BIN_NAMES=[_0x5b16b4(0x1a9),_0x5b16b4(0x1ea)],CHROME_BETA_PATHS=((()=>{const _0x16f068={_0x46dca1:0x1bc,_0x4725f4:0x1e6,_0x4b030f:0x1c8,_0x518b7c:0x1ed},_0x296b47=_0x5b16b4;switch(process[_0x296b47(_0x16f068._0x46dca1)]){case _0x296b47(0x1d3):return[_0x296b47(0x1dc)];case _0x296b47(_0x16f068._0x4725f4):return[process[_0x296b47(_0x16f068._0x4b030f)][_0x296b47(_0x16f068._0x518b7c)]+'\x5cGoogle\x5cChrome\x20Beta\x5cApplication\x5cchrome.exe'];default:return['/usr/bin/google-chrome-beta'];}})());function firstExistingPath(_0x52278c){const _0x3b16e3={_0x1203c5:0x1f0},_0x3dbe2b=_0x5b16b4;for(const _0x48e802 of _0x52278c){if(!_0x48e802||_0x48e802[_0x3dbe2b(_0x3b16e3._0x1203c5)]('undefined'))continue;if(existsSync(_0x48e802))return _0x48e802;}return null;}__name(firstExistingPath,'firstExistingPath');function whichOf(_0x5b51ee){const _0x3f9c58={_0x46b5ba:0x1bc,_0x519be1:0x1a3},_0x9d08f2=_0x5b16b4;if(process[_0x9d08f2(_0x3f9c58._0x46b5ba)]===_0x9d08f2(0x1e6))return void 0x0;for(const _0x502df7 of _0x5b51ee){try{const _0x4a8bc0=execFileSync(_0x9d08f2(0x191),[_0x502df7],{'encoding':_0x9d08f2(0x1c3)})[_0x9d08f2(0x1e5)]();if(_0x4a8bc0[_0x9d08f2(_0x3f9c58._0x519be1)]>0x0&&existsSync(_0x4a8bc0))return _0x4a8bc0;}catch{}}return void 0x0;}__name(whichOf,_0x5b16b4(0x1e0));function runEnvironmentChecks(_0x54bdbf={}){const _0x5a2214={_0x5184b1:0x1de},_0x5e2b8b=_0x5b16b4,_0x3fba7d=_0x54bdbf[_0x5e2b8b(_0x5a2214._0x5184b1)]??process[_0x5e2b8b(0x1de)]();return[checkNodeVersion(),checkSystemBrowser(),checkWritableCwd(_0x3fba7d)];}__name(runEnvironmentChecks,_0x5b16b4(0x1ca));function checkNodeVersion(){const _0x47f579={_0x206924:0x1d0,_0x4e424f:0x1a0,_0x2850f2:0x196},_0x4410c1=_0x5b16b4,_0xa1c747=process[_0x4410c1(_0x47f579._0x206924)]['node'],_0xf45dcb=Number(_0xa1c747[_0x4410c1(_0x47f579._0x4e424f)]('.')[0x0]);if(!Number[_0x4410c1(0x1ad)](_0xf45dcb)||_0xf45dcb<0x14)return{'name':_0x4410c1(0x1ba),'severity':_0x4410c1(_0x47f579._0x2850f2),'message':_0x4410c1(0x1cd)+_0xa1c747+')','detail':_0x4410c1(0x1b2)};return{'name':'Node.js\x20version','severity':'ok','message':_0xa1c747};}__name(checkNodeVersion,'checkNodeVersion');function checkSystemBrowser(){const _0x710c60={_0x34fbef:0x1dd,_0x5c4179:0x1a5,_0x562c68:0x1ae,_0x1223f2:0x1d1},_0x47d575=_0x5b16b4,_0x669d25=probeSystemBrowser();if(_0x669d25[_0x47d575(0x1ac)]!==null)return{'name':'System\x20browser','severity':'ok','message':_0x669d25[_0x47d575(0x195)]+_0x47d575(0x1bb),'detail':_0x669d25[_0x47d575(_0x710c60._0x34fbef)]};return{'name':_0x47d575(0x1da),'severity':_0x47d575(_0x710c60._0x5c4179),'message':_0x47d575(_0x710c60._0x562c68),'detail':_0x47d575(_0x710c60._0x1223f2)};}__name(checkSystemBrowser,_0x5b16b4(0x1e7));function checkWritableCwd(_0x462164){const _0x44198a={_0x20ab49:0x1e2},_0xdd8ff2=_0x5b16b4;if(!_0x42dba8(_0x462164))return{'name':_0xdd8ff2(_0x44198a._0x20ab49),'severity':'error','message':'target\x20'+_0x462164+_0xdd8ff2(0x1db),'detail':'Create\x20the\x20directory\x20or\x20run\x20init\x20in\x20an\x20existing\x20project\x20root.'};return{'name':_0xdd8ff2(0x1e2),'severity':'ok','message':_0x462164};}__name(checkWritableCwd,'checkWritableCwd');var PACKAGE_NAME=_0x5b16b4(0x19e),WebRunnerAdapter=class{static{__name(this,_0x5b16b4(0x1c6));}[_0x5b16b4(0x1cc)]=PACKAGE_NAME;[_0x5b16b4(0x1b0)]='';[_0x5b16b4(0x198)]={'picker':!![],'attach':!![],'resumeFromFailure':![]};['supportedKinds']=['scenario',_0x5b16b4(0x1d8),'authoring'];[_0x5b16b4(0x1b4)](){const _0x44fe9d={_0x3e2f63:0x1c7,_0x5b8a00:0x193,_0x1748a7:0x1b5},_0xf66d00=_0x5b16b4,_0x4cdb9c=createRequire(import.meta.url),_0x293623=_0x4cdb9c[_0xf66d00(_0x44fe9d._0x3e2f63)](PACKAGE_NAME+_0xf66d00(_0x44fe9d._0x5b8a00)),_0x1867a8=JSON[_0xf66d00(0x1e4)](readFileSync(_0x293623,_0xf66d00(0x1c3))),_0x5b3883=pickBin(_0x1867a8);if(!_0x5b3883)throw new Error(PACKAGE_NAME+_0xf66d00(_0x44fe9d._0x1748a7));return join(dirname(_0x293623),_0x5b3883);}['buildArgs'](_0x102b2f){const _0x2fbf53={_0x34aef7:0x1ce,_0x4e286c:0x1a2,_0x5fd618:0x1c2,_0x5939cb:0x1d6,_0x4ad0df:0x1ce,_0x3fd33a:0x1d8,_0x50fa75:0x1bf,_0x5c474b:0x19d,_0x1d94e1:0x1c9,_0x42cc4f:0x1af,_0x3cac17:0x1d4,_0x193339:0x1b3},_0x1c4f09=_0x5b16b4;if(_0x102b2f[_0x1c4f09(_0x2fbf53._0x34aef7)]===_0x1c4f09(_0x2fbf53._0x4e286c)){const _0x29cc9a=[_0x1c4f09(0x1f2),_0x102b2f[_0x1c4f09(_0x2fbf53._0x4e286c)]];if(_0x102b2f['debug'])_0x29cc9a[_0x1c4f09(0x19d)](_0x1c4f09(_0x2fbf53._0x5fd618));return _0x102b2f[_0x1c4f09(0x19a)]&&_0x102b2f['breakpoints'][_0x1c4f09(0x1a3)]>0x0&&_0x29cc9a[_0x1c4f09(0x19d)](_0x1c4f09(0x1f1),_0x102b2f['breakpoints'][_0x1c4f09(_0x2fbf53._0x5939cb)](',')),_0x29cc9a;}if(_0x102b2f[_0x1c4f09(_0x2fbf53._0x4ad0df)]==='collection'){const _0x97697f=[_0x1c4f09(0x1d8),_0x102b2f[_0x1c4f09(_0x2fbf53._0x3fd33a)]];_0x102b2f[_0x1c4f09(_0x2fbf53._0x50fa75)]!==void 0x0&&_0x102b2f[_0x1c4f09(_0x2fbf53._0x50fa75)]>0x1&&_0x97697f[_0x1c4f09(_0x2fbf53._0x5c474b)](_0x1c4f09(_0x2fbf53._0x1d94e1)+_0x102b2f[_0x1c4f09(0x1bf)]);if(_0x102b2f[_0x1c4f09(_0x2fbf53._0x42cc4f)])_0x97697f[_0x1c4f09(0x19d)](_0x1c4f09(_0x2fbf53._0x3cac17));return _0x97697f;}if(_0x102b2f[_0x1c4f09(0x1ce)]===_0x1c4f09(0x1a1))return[_0x1c4f09(_0x2fbf53._0x193339),_0x102b2f[_0x1c4f09(0x1a2)]];const _0x141e5f=_0x102b2f;throw new UnsupportedRunKindError(_0x141e5f[_0x1c4f09(0x1ce)],this[_0x1c4f09(0x1cc)]);}[_0x5b16b4(0x1a6)](_0x4925bc){const _0x473354={_0x271f0d:0x1ee},_0x10e3bb=_0x5b16b4,_0x2655e3={};if(_0x4925bc['headed'])_0x2655e3[_0x10e3bb(_0x473354._0x271f0d)]='1';return _0x2655e3;}[_0x5b16b4(0x1b9)](){const _0x19f414={_0x54e36d:0x1cb},_0x51f5d8=_0x5b16b4;return[_0x51f5d8(_0x19f414._0x54e36d)];}async[_0x5b16b4(0x1c0)](_0x43b5d9){const _0x35fc42={_0x3b8093:0x1c5},_0x54e913=_0x5b16b4;return runEnvironmentChecks({'cwd':_0x43b5d9[_0x54e913(_0x35fc42._0x3b8093)]});}},webRunnerAdapter=new WebRunnerAdapter(),web_runner_adapter_default=webRunnerAdapter;function pickBin(_0x123857){const _0x304242={_0x10dfd7:0x1a4,_0x4b3142:0x1ec,_0x32df3c:0x1a4,_0x359cac:0x1c4,_0x528ffb:0x1a4},_0x4c3b09=_0x5b16b4;if(typeof _0x123857[_0x4c3b09(_0x304242._0x10dfd7)]===_0x4c3b09(_0x304242._0x4b3142))return _0x123857[_0x4c3b09(_0x304242._0x10dfd7)];if(_0x123857['bin']&&typeof _0x123857['bin']===_0x4c3b09(0x19b))return _0x123857[_0x4c3b09(_0x304242._0x32df3c)][_0x4c3b09(0x1e9)]??Object[_0x4c3b09(_0x304242._0x359cac)](_0x123857[_0x4c3b09(_0x304242._0x528ffb)])[0x0]??null;return null;}__name(pickBin,_0x5b16b4(0x1ab));export{web_runner_adapter_default as default,webRunnerAdapter};
1
+ const _0x52cadc=_0x1133;(function(_0x91b6a5,_0x5b3e5b){const _0x51e00c={_0x3c2a4f:0x12d,_0x54e7ef:0x12c,_0x92724a:0x11a,_0x17a9d8:0x10e},_0x47de9a=_0x1133,_0x2fa336=_0x91b6a5();while(!![]){try{const _0x3c9fb1=-parseInt(_0x47de9a(0x14e))/0x1+-parseInt(_0x47de9a(0x101))/0x2*(-parseInt(_0x47de9a(_0x51e00c._0x3c2a4f))/0x3)+-parseInt(_0x47de9a(_0x51e00c._0x54e7ef))/0x4+-parseInt(_0x47de9a(_0x51e00c._0x92724a))/0x5+-parseInt(_0x47de9a(0x15b))/0x6+-parseInt(_0x47de9a(0xfb))/0x7+parseInt(_0x47de9a(_0x51e00c._0x17a9d8))/0x8*(parseInt(_0x47de9a(0xfe))/0x9);if(_0x3c9fb1===_0x5b3e5b)break;else _0x2fa336['push'](_0x2fa336['shift']());}catch(_0xab3de){_0x2fa336['push'](_0x2fa336['shift']());}}}(_0x21e4,0xd9cf6));var __defProp=Object[_0x52cadc(0x102)],__name=(_0xdc531c,_0x46edbf)=>__defProp(_0xdc531c,_0x52cadc(0x114),{'value':_0x46edbf,'configurable':!![]});import{UnsupportedRunKindError}from'@unotest/protocol';function _0x21e4(){const _0x181e14=['DxrMoa','Dw5KzwzPBMvK','nta1mdG1tMLIs01b','BwLJCM9ZB2z0lwvKz2u','z29Vz2XLlwnOCM9Tzs1ZDgfIBgu','mtqWotrgEfblDee','xeDVB2DSzvXdAhjVBwvCqxbWBgLJyxrPB25Cy2HYB21LlMv4zq','yNjLywTWB2LUDhm','ntHmwvvjv0G','zgvMAw5LuhjVCgvYDhK','l3vZCI9IAw4Vz29Vz2XLlwnOCM9Tzs1IzxrH','yxv0Ag9YAw5N','l3vZCI9IAw4Vz29Vz2XLlwnOCM9Tzs1ZDgfIBgu','C3vMzML4','vgfYz2v0igrPCMvJDg9YEq','ls13B3jRzxjZpq','BwLJCM9ZB2z0lwvKz2uTC3rHyMXL','l3vZCI9IAw4VBwLJCM9ZB2z0lwvKz2uTC3rHyMXL','ChjVyMvdAhjVBwvczxrH','y3DK','q3jLyxrLihrOzsbKAxjLy3rVCNKGB3iGCNvUigLUAxqGAw4Gyw4GzxHPC3rPBMCGChjVAMvJDcbYB290lG','mJq2odHMvxvWEu0','D29YA2vYCW','r29Vz2XLienOCM9Tzq','AgvHzgvK','yMLU','vu5pvevtvf9iruferuq','BMfTzq','y2HYB21LlwjLDge','y2HLy2TtExn0zw1cCM93C2vY','CgXHDgzVCM0','te9dquXbufbeqvrb','BM8Gq2HYB21Lic8GrwrNzsaVienOCM9TAxvTigrLDgvJDgvK','nJi1mJy4nxrvAePICq','BxnLzgDL','tM9Kzs5QCYb2zxjZAw9U','Aw5PDcb3AwXSig9MzMvYihrVigrVD25SB2fKigj1BMrSzwqGq2HYB21PDw0Gkh4XntaGtuiPlIbbBhrLCM5HDgL2zwX5lcbPBNn0ywXSienOCM9TzsbMCM9TigH0DhbZoI8VD3D3lMDVB2DSzs5JB20Vy2HYB21LigfUzcbYzs1YDw4U','BM9Kzq','l3vZCI9IAw4VBwLJCM9ZB2z0lwvKz2u','zgvIDwC','l0fWCgXPy2f0Aw9UCY9hB29NBguGq2HYB21LlMfWCc9dB250zw50CY9nywnpuY9hB29NBguGq2HYB21L','AxngAw5PDgu','l3nUyxaVyMLUl2DVB2DSzs1JAhjVBwu','ChjVAMvJDfjVB3q','C2nLBMfYAw8','ChjVyMvdAhjVBwu','BgvUz3rO','ls1IywLS','D2fYBMLUzW','xe1Py3jVC29MDfXfzgDLxefWCgXPy2f0Aw9Uxg1ZzwrNzs5LEgu','v2vIuNvUBMvYqwrHChrLCG','nJu0nJu2nerPwLHryq','mtuZnZCXq2vqy1zW','ls1ICMvHAW','Cgf0Aa','BgfIzwW','uhjVz3jHBuzPBgvZ','C3bSAxq','u3LZDgvTigjYB3DZzxi','xeDVB2DSzvXdAhjVBwuGqMv0yvXbChbSAwnHDgLVBLXJAhjVBwuUzxHL','DMvYC2LVBNm','D2HPy2G','y29SBgvJDgLVBG','ChvZAa','zgfYD2LU','DgfYz2v0ia','DhjPBq','igzVDw5K','Dw5VDgvZDc13zwi','zg9JDg9Y','CNvUrw52AxjVBM1LBNrdAgvJA3m','CgLJA0jPBG','A2LUza','y2HLy2TxCML0ywjSzun3za','ihbHy2THz2uUANnVBIbKzwnSyxjLCYbUBYaNyMLUjYbMAwvSzcdIGjqGyNjVA2vUigLUC3rHBgW/','z29Vz2XLlwnOCM9Tzq','yxv0Ag9Y','ztjL','CMvXDwLYzxmGtM9KzsdIIAuYmcaOCNvUBMLUzYa','l3vZCI9IAw4Vy2HYB21PDw0','igrVzxmGBM90igv4Axn0','l3vZCI9IAw4Vy2HYB21PDw0TyNjVD3nLCG','r29Vz2XLienOCM9TzsbczxrH','zw52','zxjYB3i','nZiYnZaXswHsy0rK','yxbWu2vYDMvYqxjNCW','y2HYB21PDw0','D2HPy2HpzG','y2HHBM5LBa','yMfPBa','D2LUmZi','uhjVz3jHBuzPBgvZkhG4nIK','AM9PBG','y2HYB21L','yNvPBgrfBNy','yNvPBgrbCMDZ','CMvZB2X2zujPBG','mta0nJK2nZbUrKLmAKq','l0fWCgXPy2f0Aw9UCY9hB29NBguGq2HYB21LiejLDgeUyxbWl0nVBNrLBNrZl01Hy09tl0DVB2DSzsbdAhjVBwuGqMv0yq','ls1Kzwj1zW','B2jQzwn0'];_0x21e4=function(){return _0x181e14;};return _0x21e4();}import{readFileSync}from'fs';import{createRequire}from'module';import{dirname,join}from'path';import{existsSync as _0x5dd0c9}from'fs';import{execFileSync}from'child_process';import{existsSync}from'fs';function probeSystemBrowser(){for(const _0x30684b of[probeChrome,probeEdge,probeChromeBeta]){const _0x1235af=_0x30684b();if(_0x1235af['channel']!==null)return _0x1235af;}return{'channel':null};}__name(probeSystemBrowser,'probeSystemBrowser');function probeChrome(){const _0x524672={_0x360a5d:0x157},_0x51d4fc=_0x52cadc,_0x1d67af=firstExistingPath(CHROME_PATHS)??whichOf(CHROME_BIN_NAMES);if(_0x1d67af)return{'channel':_0x51d4fc(_0x524672._0x360a5d),'path':_0x1d67af,'label':_0x51d4fc(0x110)};return{'channel':null};}__name(probeChrome,_0x52cadc(0x126));function _0x1133(_0x19388c,_0x3da235){_0x19388c=_0x19388c-0xf6;const _0x21e4bb=_0x21e4();let _0x113385=_0x21e4bb[_0x19388c];if(_0x1133['XaoIom']===undefined){var _0x35c363=function(_0xc85334){const _0x589dcb='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x5dd0c9='',_0xdc531c='';for(let _0x46edbf=0x0,_0x30684b,_0x1235af,_0x1d67af=0x0;_0x1235af=_0xc85334['charAt'](_0x1d67af++);~_0x1235af&&(_0x30684b=_0x46edbf%0x4?_0x30684b*0x40+_0x1235af:_0x1235af,_0x46edbf++%0x4)?_0x5dd0c9+=String['fromCharCode'](0xff&_0x30684b>>(-0x2*_0x46edbf&0x6)):0x0){_0x1235af=_0x589dcb['indexOf'](_0x1235af);}for(let _0x788e1d=0x0,_0x50709a=_0x5dd0c9['length'];_0x788e1d<_0x50709a;_0x788e1d++){_0xdc531c+='%'+('00'+_0x5dd0c9['charCodeAt'](_0x788e1d)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0xdc531c);};_0x1133['gHmJLP']=_0x35c363,_0x1133['ZyzHPN']={},_0x1133['XaoIom']=!![];}const _0x2cf1a8=_0x21e4bb[0x0],_0x3e7dc2=_0x19388c+_0x2cf1a8,_0x17d51f=_0x1133['ZyzHPN'][_0x3e7dc2];return!_0x17d51f?(_0x113385=_0x1133['gHmJLP'](_0x113385),_0x1133['ZyzHPN'][_0x3e7dc2]=_0x113385):_0x113385=_0x17d51f,_0x113385;}function probeEdge(){const _0x283a01={_0x3674a3:0x11b},_0x3fa5f1=_0x52cadc,_0x788e1d=firstExistingPath(EDGE_PATHS)??whichOf(EDGE_BIN_NAMES);if(_0x788e1d)return{'channel':_0x3fa5f1(_0x283a01._0x3674a3),'path':_0x788e1d,'label':'Microsoft\x20Edge'};return{'channel':null};}__name(probeEdge,'probeEdge');function probeChromeBeta(){const _0x1352b3={_0x4020c4:0x115},_0x1a9b44=_0x52cadc,_0x50709a=firstExistingPath(CHROME_BETA_PATHS);if(_0x50709a)return{'channel':_0x1a9b44(_0x1352b3._0x4020c4),'path':_0x50709a,'label':_0x1a9b44(0x14b)};return{'channel':null};}__name(probeChromeBeta,_0x52cadc(0x10b));var CHROME_PATHS=((()=>{const _0x27e828={_0x157c17:0x154,_0x2e258f:0x131,_0x2425af:0x14c,_0x3efe00:0xff,_0x48a132:0x14c,_0x3ef40c:0x118,_0xfc5bcf:0x105,_0x3622d5:0x123,_0x1800cf:0x148},_0x339624=_0x52cadc;switch(process[_0x339624(0x117)]){case _0x339624(0x139):return[_0x339624(0x121)];case _0x339624(_0x27e828._0x157c17):return[process['env'][_0x339624(_0x27e828._0x2e258f)]+'\x5cGoogle\x5cChrome\x5cApplication\x5cchrome.exe',process[_0x339624(_0x27e828._0x2425af)][_0x339624(0x155)]+_0x339624(_0x27e828._0x3efe00),process[_0x339624(_0x27e828._0x48a132)][_0x339624(_0x27e828._0x3ef40c)]+'\x5cGoogle\x5cChrome\x5cApplication\x5cchrome.exe'];default:return['/usr/bin/google-chrome',_0x339624(_0x27e828._0xfc5bcf),_0x339624(_0x27e828._0x3622d5),_0x339624(_0x27e828._0x1800cf),_0x339624(0x14a)];}})()),CHROME_BIN_NAMES=[_0x52cadc(0x144),_0x52cadc(0xfd),_0x52cadc(0x150),'chromium-browser'],EDGE_PATHS=((()=>{const _0x28f562={_0x5aa6f5:0x117,_0x322ca2:0x155,_0x225c67:0x10a},_0x24031c=_0x52cadc;switch(process[_0x24031c(_0x28f562._0x5aa6f5)]){case _0x24031c(0x139):return['/Applications/Microsoft\x20Edge.app/Contents/MacOS/Microsoft\x20Edge'];case _0x24031c(0x154):return[process['env'][_0x24031c(0x131)]+_0x24031c(0x12a),process[_0x24031c(0x14c)][_0x24031c(_0x28f562._0x322ca2)]+_0x24031c(0x12a)];default:return[_0x24031c(0x11f),_0x24031c(_0x28f562._0x225c67)];}})()),EDGE_BIN_NAMES=[_0x52cadc(0xfc),_0x52cadc(0x109)],CHROME_BETA_PATHS=((()=>{const _0x3cdb51={_0x415c95:0x117,_0x319445:0xf6,_0x5110a9:0x154},_0x3062b6=_0x52cadc;switch(process[_0x3062b6(_0x3cdb51._0x415c95)]){case _0x3062b6(0x139):return[_0x3062b6(_0x3cdb51._0x319445)];case _0x3062b6(_0x3cdb51._0x5110a9):return[process[_0x3062b6(0x14c)]['ProgramFiles']+_0x3062b6(0x134)];default:return[_0x3062b6(0x103)];}})());function firstExistingPath(_0x4d7da5){const _0x435138=_0x52cadc;for(const _0x1db1ca of _0x4d7da5){if(!_0x1db1ca||_0x1db1ca['startsWith'](_0x435138(0xfa)))continue;if(existsSync(_0x1db1ca))return _0x1db1ca;}return null;}__name(firstExistingPath,'firstExistingPath');function whichOf(_0x47b386){const _0x3213cb={_0x1beddb:0x136,_0x2969f1:0xf9,_0x1951a7:0x127},_0x34d02c=_0x52cadc;if(process[_0x34d02c(0x117)]===_0x34d02c(0x154))return void 0x0;for(const _0x1554a0 of _0x47b386){try{const _0x3d4560=execFileSync(_0x34d02c(_0x3213cb._0x1beddb),[_0x1554a0],{'encoding':_0x34d02c(_0x3213cb._0x2969f1)})[_0x34d02c(0x13b)]();if(_0x3d4560[_0x34d02c(_0x3213cb._0x1951a7)]>0x0&&existsSync(_0x3d4560))return _0x3d4560;}catch{}}return void 0x0;}__name(whichOf,_0x52cadc(0x151));function runEnvironmentChecks(_0x45b5e1={}){const _0x1eeea9={_0x4e491f:0x10c},_0x2122b5=_0x52cadc,_0x48b331=_0x45b5e1[_0x2122b5(_0x1eeea9._0x4e491f)]??process['cwd']();return[checkNodeVersion(),checkSystemBrowser(),checkWritableCwd(_0x48b331)];}__name(runEnvironmentChecks,_0x52cadc(0x13f));function checkNodeVersion(){const _0x4d6c6e={_0x370275:0x11e,_0x3aa500:0x122,_0x4605d2:0x11c},_0x454872=_0x52cadc,_0x447cfe=process[_0x454872(0x135)][_0x454872(_0x4d6c6e._0x370275)],_0x2da5b3=Number(_0x447cfe[_0x454872(0x132)]('.')[0x0]);if(!Number[_0x454872(_0x4d6c6e._0x3aa500)](_0x2da5b3)||_0x2da5b3<0x14)return{'name':_0x454872(_0x4d6c6e._0x4605d2),'severity':'error','message':_0x454872(0x147)+_0x447cfe+')','detail':'Install\x20Node\x2020+\x20via\x20nvm\x20/\x20fnm\x20/\x20volta\x20and\x20re-run.'};return{'name':'Node.js\x20version','severity':'ok','message':_0x447cfe};}__name(checkNodeVersion,'checkNodeVersion');function checkSystemBrowser(){const _0x15d7d8={_0x27947e:0x152,_0x5945e0:0x133,_0x2450c9:0x13c,_0x3021c:0x12f,_0x3abbdb:0x11d},_0x854fd2=_0x52cadc,_0x51275b=probeSystemBrowser();if(_0x51275b[_0x854fd2(_0x15d7d8._0x27947e)]!==null)return{'name':_0x854fd2(_0x15d7d8._0x5945e0),'severity':'ok','message':_0x51275b[_0x854fd2(0x130)]+_0x854fd2(_0x15d7d8._0x2450c9),'detail':_0x51275b[_0x854fd2(_0x15d7d8._0x3021c)]};return{'name':'System\x20browser','severity':_0x854fd2(0x129),'message':_0x854fd2(0x119),'detail':_0x854fd2(_0x15d7d8._0x3abbdb)};}__name(checkSystemBrowser,_0x52cadc(0x116));function checkWritableCwd(_0x4e4030){const _0x4e5363={_0x360405:0x149,_0x18ba60:0x10d,_0x5a0ef0:0x107},_0x5b7816=_0x52cadc;if(!_0x5dd0c9(_0x4e4030))return{'name':_0x5b7816(0x107),'severity':_0x5b7816(0x14d),'message':_0x5b7816(0x13a)+_0x4e4030+_0x5b7816(_0x4e5363._0x360405),'detail':_0x5b7816(_0x4e5363._0x18ba60)};return{'name':_0x5b7816(_0x4e5363._0x5a0ef0),'severity':'ok','message':_0x4e4030};}__name(checkWritableCwd,_0x52cadc(0x142));var PACKAGE_NAME='@unotest/web',WebRunnerAdapter=class{static{__name(this,_0x52cadc(0x12b));}[_0x52cadc(0x114)]=PACKAGE_NAME;[_0x52cadc(0x106)]='';[_0x52cadc(0x120)]={'picker':!![],'attach':!![],'resumeFromFailure':![]};['supportedKinds']=['scenario',_0x52cadc(0x137),_0x52cadc(0x104)];[_0x52cadc(0x15a)](){const _0x1c89fb=_0x52cadc,_0x209777=createRequire(import.meta.url),_0x5855ba=_0x209777['resolve'](PACKAGE_NAME+'/package.json'),_0x243702=JSON['parse'](readFileSync(_0x5855ba,_0x1c89fb(0xf9))),_0x4f849e=pickBin(_0x243702);if(!_0x4f849e)throw new Error(PACKAGE_NAME+_0x1c89fb(0x143));return join(dirname(_0x5855ba),_0x4f849e);}[_0x52cadc(0x159)](_0x1bc6c1){const _0x2ef50c={_0x39d363:0x125,_0x4074d9:0x146,_0x5c9b0e:0x120,_0xfd74a5:0x138,_0x681815:0x10f},_0x3088ac=_0x52cadc;if(_0x1bc6c1['kind']===_0x3088ac(_0x2ef50c._0x39d363)){const _0x3d49ae=[_0x3088ac(_0x2ef50c._0x4074d9),_0x1bc6c1[_0x3088ac(_0x2ef50c._0x39d363)]];if(_0x1bc6c1[_0x3088ac(_0x2ef50c._0x5c9b0e)])_0x3d49ae['push'](_0x3088ac(0xf7));return _0x1bc6c1[_0x3088ac(0x100)]&&_0x1bc6c1[_0x3088ac(0x100)][_0x3088ac(0x127)]>0x0&&_0x3d49ae[_0x3088ac(_0x2ef50c._0xfd74a5)](_0x3088ac(0x12e),_0x1bc6c1['breakpoints'][_0x3088ac(0x156)](',')),_0x3d49ae;}if(_0x1bc6c1[_0x3088ac(0x141)]===_0x3088ac(0x137)){const _0x5b3716=[_0x3088ac(0x137),_0x1bc6c1[_0x3088ac(0x137)]];_0x1bc6c1[_0x3088ac(_0x2ef50c._0x681815)]!==void 0x0&&_0x1bc6c1[_0x3088ac(0x10f)]>0x1&&_0x5b3716['push'](_0x3088ac(0x108)+_0x1bc6c1['workers']);if(_0x1bc6c1[_0x3088ac(0x153)])_0x5b3716[_0x3088ac(_0x2ef50c._0xfd74a5)](_0x3088ac(0x128));return _0x5b3716;}if(_0x1bc6c1['kind']===_0x3088ac(0x104))return[_0x3088ac(0x145),_0x1bc6c1[_0x3088ac(0x125)]];const _0x1157fb=_0x1bc6c1;throw new UnsupportedRunKindError(_0x1157fb[_0x3088ac(0x141)],this[_0x3088ac(0x114)]);}[_0x52cadc(0x158)](_0x5024b2){const _0x2de0cb=_0x52cadc,_0x5d0446={};if(_0x5024b2[_0x2de0cb(0x111)])_0x5d0446[_0x2de0cb(0x113)]='1';return _0x5d0446;}[_0x52cadc(0x14f)](){return['app-server'];}async[_0x52cadc(0x13e)](_0x3435e3){const _0x469781=_0x52cadc;return runEnvironmentChecks({'cwd':_0x3435e3[_0x469781(0x124)]});}},webRunnerAdapter=new WebRunnerAdapter(),web_runner_adapter_default=webRunnerAdapter;function pickBin(_0x4f71a0){const _0x1ae52b={_0x329325:0x112,_0x389e3c:0x112,_0xe258b3:0x13d},_0xe014d5=_0x52cadc;if(typeof _0x4f71a0[_0xe014d5(_0x1ae52b._0x329325)]==='string')return _0x4f71a0[_0xe014d5(0x112)];if(_0x4f71a0[_0xe014d5(_0x1ae52b._0x329325)]&&typeof _0x4f71a0[_0xe014d5(_0x1ae52b._0x389e3c)]===_0xe014d5(0xf8))return _0x4f71a0[_0xe014d5(0x112)][_0xe014d5(_0x1ae52b._0xe258b3)]??Object['values'](_0x4f71a0[_0xe014d5(0x112)])[0x0]??null;return null;}__name(pickBin,_0x52cadc(0x140));export{web_runner_adapter_default as default,webRunnerAdapter};
@@ -304,6 +304,24 @@ assertVisible(getByTestId('toast'))
304
304
  assertHidden(getByTestId('spinner'))
305
305
  ```
306
306
 
307
+ ### `assertNeverAppears(loc, options)`
308
+
309
+ Negative window assertion: watch for `withinMs` (required) and **fail
310
+ the moment** the locator becomes visible; pass only when the whole
311
+ window elapsed with zero sightings. The opposite of every `waitFor*` —
312
+ use it for "must NOT happen" requirements (a private message must not
313
+ leak into a public feed, a disabled bot must not reply).
314
+
315
+ ```js
316
+ assertNeverAppears(getByText(privateMarker), {withinMs: 5000});
317
+ ```
318
+
319
+ Caveats: the step always costs `withinMs` of wall-clock time, and
320
+ absence is only provable within the window — pick it from how fast the
321
+ system under test could realistically react. Unlike `assertHidden`
322
+ (a poll that PASSES as soon as the element is gone), this one watches
323
+ the whole window.
324
+
307
325
  ### `assertValue(loc, expected, options?)`
308
326
 
309
327
  Compares `inputValue()` (`<input>`, `<textarea>`, native `<select>`).
@@ -681,6 +699,23 @@ step("Wait for the bot reply in the JSONL feed", () => {
681
699
  });
682
700
  ```
683
701
 
702
+ ### `assertNoFile(path, pattern?, options)`
703
+
704
+ The mirror of `waitForFile` with inverted polarity: watch the window
705
+ `{withinMs}` (required) and **fail the moment** the file exists (and,
706
+ with `pattern`, matches it); pass when the window elapsed clean. The
707
+ file-side `assertNeverAppears` — "the firehose must NOT receive this
708
+ event".
709
+
710
+ ```js
711
+ step("The private message never reaches the public feed", () => {
712
+ assertNoFile('firehose.jsonl', privateMarker, {withinMs: 5000});
713
+ });
714
+ ```
715
+
716
+ Same caveats as `assertNeverAppears`: the step always costs `withinMs`,
717
+ and absence is only provable within the window.
718
+
684
719
  ### `dbQuery(sql, ...params)` → `rows[]`
685
720
 
686
721
  Parameterized SELECT. Driver picked by URL scheme:
@@ -799,6 +834,16 @@ scenarios.
799
834
 
800
835
  Lorem-style prose cut to `length` characters.
801
836
 
837
+ ### `randomNth(loc)` → `locator`
838
+
839
+ A random one of the matches — for flows where any item will do (open some
840
+ product, pick some row). Non-deterministic by design: assert on what the
841
+ flow produced, not on which element it picked.
842
+
843
+ ```js
844
+ click(randomNth(getByRole('listitem')));
845
+ ```
846
+
802
847
  ### `randomWord(length?)` → `string`
803
848
 
804
849
  Random lowercase letters, default 8 — digit-free unique markers for apps
@@ -810,16 +855,31 @@ fill(getByRole('textbox'), textJoin(['ping ', marker]));
810
855
  waitForText(marker);
811
856
  ```
812
857
 
858
+ ### `textContains(haystack, needle)` → `boolean`
859
+
860
+ Substring probe for data that came back as a string — shell stdout,
861
+ apiCall bodies. The read-side counterpart of `textJoin`.
862
+
863
+ ```js
864
+ out = shell('./status.sh');
865
+ assertTrue(textContains(out.stdout, 'ready'), out.stderr);
866
+ ```
867
+
813
868
  ### `textJoin(parts)` → `string`
814
869
 
815
870
  Concatenate an array of parts into one string (numbers are coerced).
816
- This is THE string-concatenation primitive — `+` on strings is rejected
817
- by the validator and points here.
818
871
 
819
872
  ```js
820
873
  goto(textJoin(['/list?page=', pageNo, '&q=', query]));
821
874
  ```
822
875
 
876
+ `+` with a string **literal** on either side also concatenates and
877
+ lints clean (`'prefix-' + name`). The validator rejects only
878
+ literal-free string addition (`a + b` where both sides are variables /
879
+ calls known to be strings) — that shape is indistinguishable from
880
+ arithmetic at a glance, and the error points here. Existing
881
+ literal-based `+` code needs no rewrite.
882
+
823
883
  ### `nowMs()` → `number`
824
884
 
825
885
  Current epoch milliseconds — unique numeric suffixes.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unotest/web",
3
- "version": "0.13.0",
3
+ "version": "0.14.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.13.0",
83
- "@unotest/dsl": "^0.13.0",
84
- "@unotest/protocol": "^0.13.0",
85
- "@unotest/grounder-client": "^0.13.0",
86
- "@unotest/viewer": "^0.13.0"
82
+ "@unotest/core": "^0.14.0",
83
+ "@unotest/dsl": "^0.14.0",
84
+ "@unotest/protocol": "^0.14.0",
85
+ "@unotest/grounder-client": "^0.14.0",
86
+ "@unotest/viewer": "^0.14.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.13.0"
93
+ "@unotest/grounder": "^0.14.0"
94
94
  }
95
95
  }