@unotest/web 0.30.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/.claude/skills/write-e2e-test/SKILL.md +12 -0
- package/.claude/skills/write-e2e-test-ground/SKILL.md +12 -0
- package/CHANGELOG.md +383 -0
- package/README.md +66 -2
- package/bin/unotest-web.js +3 -1
- package/dist/config/schema.d.ts +15 -15
- package/dist/config/schema.js +1 -1
- package/dist/driver/index.d.ts +11 -3
- package/dist/driver/index.js +1 -1
- package/dist/dsl/index.d.ts +54 -4
- package/dist/dsl/index.js +1 -1
- package/dist/dsl/web-dsl-language-service.d.ts +22 -2
- package/dist/dsl/web-dsl-language-service.js +1 -1
- package/dist/inspection/page-inject.d.ts +1 -1
- package/dist/{interfaces-BluheUKs.d.ts → interfaces-B34N4rfI.d.ts} +8 -0
- package/dist/legacy-layout-By62PkbP.d.ts +8 -0
- package/dist/linter-Yf4gPe5J.d.ts +36 -0
- package/dist/mcp/server.js +1 -1
- package/dist/runner/cli.d.ts +14 -8
- 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 +190 -14
- package/guides/dsl-reference.md +156 -9
- package/package.json +8 -8
- package/src/mcp/prompts/agent-test-author.md +11 -1
- package/types/unotest-dsl.d.ts +29 -5
- package/dist/linter-CM2CpIyW.d.ts +0 -21
|
@@ -1 +1 @@
|
|
|
1
|
-
const _0x240e79=_0x25e6;(function(_0x1021cd,_0x23d64a){const _0x4d546c={_0x14c545:0x1e9,_0x2063da:0x1d1,_0x1fee5d:0x1f2,_0x3c9a7c:0x1d2,_0x1da06a:0x1e8,_0x19d116:0x1f3},_0x11231d=_0x25e6,_0x5969af=_0x1021cd();while(!![]){try{const _0x445241=-parseInt(_0x11231d(_0x4d546c._0x14c545))/0x1+-parseInt(_0x11231d(0x1e2))/0x2*(-parseInt(_0x11231d(0x1d0))/0x3)+parseInt(_0x11231d(_0x4d546c._0x2063da))/0x4*(parseInt(_0x11231d(_0x4d546c._0x1fee5d))/0x5)+parseInt(_0x11231d(_0x4d546c._0x3c9a7c))/0x6*(parseInt(_0x11231d(_0x4d546c._0x1da06a))/0x7)+-parseInt(_0x11231d(0x1e3))/0x8*(parseInt(_0x11231d(0x1dc))/0x9)+parseInt(_0x11231d(0x1ee))/0xa+-parseInt(_0x11231d(_0x4d546c._0x19d116))/0xb;if(_0x445241===_0x23d64a)break;else _0x5969af['push'](_0x5969af['shift']());}catch(_0x2ac0a9){_0x5969af['push'](_0x5969af['shift']());}}}(_0x41b5,0xe6e42));var __defProp=Object['defineProperty'],__name=(_0x2fb7db,_0x22975e)=>__defProp(_0x2fb7db,_0x240e79(0x1d6),{'value':_0x22975e,'configurable':!![]});import{mkdir,writeFile}from'fs/promises';import{existsSync}from'fs';import{join}from'path';var templates={'jsconfigJson':_0x240e79(0x1e6),'scenarioTemplate':_0x240e79(0x1ea),'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':_0x240e79(0x1d5),'examples':{'01-smoke.js':_0x240e79(0x1f5),'02-form-fill.js':_0x240e79(0x1cf)},'secretsExample':_0x240e79(0x1de),'envExample':_0x240e79(0x1f0)};function unotestConfigMjs(_0x55a1db){const _0x50dc45={_0x2a38c2:0x1d8,_0x11f930:0x1ed},_0x319753=_0x240e79,_0x39ce27=_0x55a1db===void 0x0?_0x319753(0x1df):_0x319753(0x1db)+JSON['stringify'](_0x55a1db)+',';return _0x319753(_0x50dc45._0x2a38c2)+_0x39ce27+_0x319753(_0x50dc45._0x11f930);}__name(unotestConfigMjs,_0x240e79(0x1da));function suitePackageJson(_0x1e7251){const _0x4c41e6=_0x240e79;return JSON['stringify']({'name':_0x4c41e6(0x1e1),'private':!![],'devDependencies':{'@unotest/web':'^'+_0x1e7251}},null,0x2)+'\x0a';}__name(suitePackageJson,_0x240e79(0x1e4));import{readFileSync}from'fs';import{dirname,resolve}from'path';function _0x25e6(_0x211068,_0x34759f){_0x211068=_0x211068-0x1cb;const _0x41b5de=_0x41b5();let _0x25e6be=_0x41b5de[_0x211068];if(_0x25e6['AMWHXl']===undefined){var _0x413613=function(_0x3f49cb){const _0x465543='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x2fb7db='',_0x22975e='';for(let _0x55a1db=0x0,_0x39ce27,_0x1e7251,_0x3e186e=0x0;_0x1e7251=_0x3f49cb['charAt'](_0x3e186e++);~_0x1e7251&&(_0x39ce27=_0x55a1db%0x4?_0x39ce27*0x40+_0x1e7251:_0x1e7251,_0x55a1db++%0x4)?_0x2fb7db+=String['fromCharCode'](0xff&_0x39ce27>>(-0x2*_0x55a1db&0x6)):0x0){_0x1e7251=_0x465543['indexOf'](_0x1e7251);}for(let _0x41b919=0x0,_0x59e4cd=_0x2fb7db['length'];_0x41b919<_0x59e4cd;_0x41b919++){_0x22975e+='%'+('00'+_0x2fb7db['charCodeAt'](_0x41b919)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x22975e);};_0x25e6['zbEVVG']=_0x413613,_0x25e6['DLmGxS']={},_0x25e6['AMWHXl']=!![];}const _0x2cc505=_0x41b5de[0x0],_0x2e4a8b=_0x211068+_0x2cc505,_0x2b537b=_0x25e6['DLmGxS'][_0x2e4a8b];return!_0x2b537b?(_0x25e6be=_0x25e6['zbEVVG'](_0x25e6be),_0x25e6['DLmGxS'][_0x2e4a8b]=_0x25e6be):_0x25e6be=_0x2b537b,_0x25e6be;}import{fileURLToPath}from'url';function readOwnVersion(){const _0xa7d67b={_0xf1abcf:0x1d4,_0x1fda29:0x1d9,_0x13370b:0x1e5,_0x12bcf8:0x1f7},_0x3c0810=_0x240e79,_0x3e186e=dirname(fileURLToPath(import.meta.url)),_0x41b919=resolve(_0x3e186e,_0x3c0810(0x1cb)),_0x59e4cd=readFileSync(_0x41b919,_0x3c0810(_0xa7d67b._0xf1abcf)),_0xde33e3=JSON[_0x3c0810(_0xa7d67b._0x1fda29)](_0x59e4cd);if(typeof _0xde33e3[_0x3c0810(0x1e5)]!==_0x3c0810(0x1d3)||_0xde33e3[_0x3c0810(_0xa7d67b._0x13370b)][_0x3c0810(0x1d7)]===0x0)throw new Error(_0x3c0810(_0xa7d67b._0x12bcf8)+_0x41b919+'\x20has\x20no\x20usable\x20\x22version\x22\x20field');return _0xde33e3['version'];}__name(readOwnVersion,_0x240e79(0x1f1));function _0x41b5(){const _0x2975eb=['nti1wgrYy0n3','mJq5nJGWrNDduwL3','lY8Gtw92zsaRihjLBMfTzsb0AgLZigzPBguGDg8GpgzLyxr1CMu+lZX5B3vYx25HBwu+lMPZicHLlMCUcI8Vigf1DgGVBg9NAw4UANmPigfUzcb0AguGzNvUy3rPB24GyMvSB3CGDg8GDgvZDf88Ew91CL9Uyw1LpIGPlIbty2vUyxjPB3mGBgL2zqOVlYbPBIbMzwf0DxjLihn1yMzVBgrLCNmSie5pvcb0AguGztjLihjVB3qG4OcuihrOzsbSAw50zxiGkgXPBNq6C2nLBMfYAw8TAw4TCM9VDcKklY8GCMvQzwn0CYbHihrLC3qGzMLSzsbWBgfJzwqGzgLYzwn0BhKGAw4GDw5VDgvZDc9LmMuVlIbuAguGBg9HzgvYigrLCML2zxmGDgHLcI8VigvUDhj5ig5HBwuGzNjVBsb0AguGzMLSzsbIyxnLBMfTzsdIGjqGA2vIywiTy2fZzsbKyxnOzxmGyMvJB21LihvUzgvYC2nVCMvZlGOklY8GrxzLCNKGzxHLy3v0ywjSzsbZDgvWig11C3qGC2L0igLUC2LKzsbHihn0zxaOiI4UlIiSicGPid0+ihSG4OcMih0PigjSB2nRlIbuAguklY8GDgL0BguGAxmGysbWBgfPBI1fBMDSAxnOigrLC2nYAxb0Aw9Uig9MihrOzsbNCM91CdSGDgHLihn0zxbZigLUC2LKzsbHCMuklY8GDgHLigLTCgXLBwvUDgf0Aw9UlIbhCM91CcbIEsbPBNrLBNqGkfnLDhvWic8Grw50zxiGlYbby3qGlYbbC3nLCNqGB3iklY8GD2HHDgv2zxiGCMvHzhmGD2vSBcKG4Ocuig9UzsbIBg9JAYbWzxiGBg9NAwnHBcbJAhvUAY4kcMz1BMn0Aw9UihrLC3rFEw91CL9Uyw1Lx2HLCMuOksb7cIaGC3rLCcGIu2vLzcbHigTUB3DUihvZzxiGDMLHiercic8GqvbjigzPEhr1CMvZigzYB20Gx2HLBhbLCNmViIWGkcKGpt4GEWOGicaGlY8GicaGD2LWzv9LmMvFDxnLCNmOktSkicaGic8VicaGihvZzxjFAwqGpsbZzwvKx3vZzxiOj2fSAwnLqgv4yw1WBguUy29TjYWGj3nLy3jLDcCPoWOGih0PoWOkicbZDgvWkcjtAwDUigLUigfZihrOzsbZzwvKzwqGDxnLCIiSicGPid0+ihSkicaGigDVDg8Oj2H0DhbZoI8VEw91CI1HChaUDgvZDc9SB2DPBICPoWOGicaGlY8GicaGzMLSBcHNzxrcEuXHyMvSkcDfBwfPBcCPlcaNywXPy2vazxHHBxbSzs5JB20NktSkicaGic8VicaGigzPBgWOz2v0qNLmywjLBcGNugfZC3DVCMqNksWGj3nLy3jLDcCPoWOGicaGlY8GicaGy2XPy2SOz2v0qNLsB2XLkcDIDxr0B24Nlcb7BMfTztOGj0XVzYbPBID9ksK7cIaGFsK7cGOGihn0zxaOiKfZC2vYDcb0AguGzgfZAgjVyxjKihnOB3DZihrOzsbZAwDUzwqTAw4GDxnLCIiSicGPid0+ihSkicaGic8VicaGigfZC2vYDfvYBcGNl2rHC2HIB2fYzcCPoWOGicaGlY8GicaGyxnZzxj0vgv4DcHNzxrcEvjVBguOj2HLywrPBMCNksWGj1DLBgnVBwuSiefSAwnLjYK7cIaGicaVlYaGicbJB3vUDca9igrIuxvLCNKOj1nftevdvcbJB3vUDcGQksbguK9nihvZzxjZifDirvjfigfJDgL2zsa9ihrYDwuNktSkicaGic8VicaGigfZC2vYDfrYDwuOy291BNqGpIaWlcaNzxHWzwn0zwqGyxqGBgvHC3qGB25LigfJDgL2zsb1C2vYjYK7cIaGFsK7cN0k','zw52rxHHBxbSzq','ChvZAa','cIaGlY8GDMLLD2vYoIb7cIaGlY8GicbWB3j0oIa1mtCZlcaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGic8VigrLzMf1Bhq6ihjHBMrVBsbMCMvLihbVCNqkicaVlYaGigjYB3DZzxi6ihrYDwuSicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGlY8GzgvMyxvSDdOGDhj1zsaOyxv0BY1VCgvUig9Uigb2Awv3zxjGkqOGic8Vih0ScN07cG','mti3mtGYmdbsywPUsLC','CgfJA2fNzs5QC29U','iYb1BM90zxn0lxDLyIdIGjqGy29WAwvKihrVihvUB3rLC3qVlMvUDIbIEsbGAw5PDgaGAwyGBM90ihbYzxnLBNqUcImkiYbgAwXSigLUihzHBhvLCYb0Agf0igfWCgX5ihrVihLVDxiGChjVAMvJDc4GvMfYAwfIBgvZigfYzsbSB2fKzwqGyNKGDgHLcImGCNvUBMvYigf0ihnJzw5HCMLVihn0yxj0lGOJcImGuMvMzxjLBMnLigfUEsb2yxjPywjSzsbMCM9TigeGC2nLBMfYAw8GyNKGAxrZigjHCMuGvvbqrvjFu05bs0uGBMfTzsdIGjqkiYbUBYbLBNyOks9ZzwnYzxqOksb3CMfWCgvYoGOJcImGicbNB3rVkcCVBg9NAw4NktSGicaGicaGicaGicaGicaGicaGicaGicaGicmGCMvSyxrPDMuG4OcuihnLzsbbufbFqKftrv9vuKWkiYaGigzPBgWOz2v0qNLmywjLBcGNrw1HAwWNksWGvevtvf9vu0vsx0vnquLmktSkiWOJifnLy3jLDcb2ywX1zxmGkhbHC3n3B3jKCYWGDg9Rzw5ZksbNBYbPBIb1BM90zxn0lY5ZzwnYzxrZigLUC3rLywqG4OcuihnHBwukiYbMB3jTyxqSigj1DcbTyxnRzwqGAw4GzxzLCNKGBg9NlIbbBIb1BMTUB3DUifvquevsx1noquTfig5HBwuGzMfPBhmGDgHLcImGCNvUihDPDgGGysbJBgvHCIaIywrKigL0ihrVihvUB3rLC3qVlMvUDIiGBwvZC2fNzs4kiWOJievUDMLYB25Tzw50CZOGB3zLCNjPzguGyw55ihzHBhvLihbLCIbLBNzPCM9UBwvUDcb3AxrOig92zxjSyxKGzMLSzxmG4OcucImGDw5VDgvZDc8Uzw52lNn0ywDPBMCSihvUB3rLC3qVlMvUDI5WCM9KDwn0Aw9UicHZzwnYzxrZoIaUC2vJCMv0CY48zw52pIKUcImGu2vSzwn0ig9UztOGyg5WEcbaDw5VDgvZDc93zwiGztjLidXUyw1LpIaTlwvUDIbZDgfNAw5Nyc4GvgHLig92zxjSyxKGBgf5zxjZcImGB3zLCIb0AgLZigjHC2uGzMLSzsaOB3zLCMXHEsb3Aw5ZktSGDgHLihnOzwXSigvUDMLYB25Tzw50ihDPBNmGB3zLCIbIB3rOlGOkiYaTls0GqxbWihvUzgvYihrLC3qGls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0kiYbuAguGyxbWj3mGyMfZzsbvuKWUifjLBgf0AxzLigDVDg8OjY9WyxrOjYKGCMvZB2X2zxmGywDHAw5ZDcbPDcaOD2LYzwqGAw50BWOJifbSyxL3CMLNAhqNCYbIyxnLvvjmigf1Dg9TyxrPy2fSBhKPlcbZBYb3CML0zsbNB3rVkcCVBg9NAw4NksdIGjqGBMv2zxikiYbNB3rVkefquf9cqvnfx1vstcaRicCVBg9NAw4Nks4GqwXZBYb1C2vKigzVCIbHC3nLCNrvCMWGC3vIC3rYAw5Nig1HDgnOAw5NlGOJierLzMf1BhrZihrVihrOzsb1BM90zxn0ihbSyxLNCM91BMqGC28GDgHLigv4yw1WBguGC2nLBMfYAw9Zihj1BIbVDxqGB2yGDgHLcImGyM94oYbWB2LUDcbPDcbHDcb5B3vYig93BIbHChaUcKfquf9cqvnfx1vstd1ODhrWCZOVl3bSyxLNCM91BMqUDw5VDgvZDc5JB20kcImGls0TierHDgfIyxnLic0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0TcImGvxnLzcbIEsbKyLf1zxj5ic8GzgjfEgvJlIbjBNn0ywXSihrOzsbTyxrJAgLUzYbKCML2zxiGyxmGysbWzwvYlwrLCdOkiYaGihbUCg0GywrKic1eihbNieb0ExbLCY9WzYaGicaGicaGicaJigzVCIbWB3n0z3jLC3fSoI8VcImGicbWBNbTigfKzcaTrcbTExnXBdiGicaGicaGicaGicaGicaGiYbMB3iGBxLZCwW6lY8kiYaOu1fmAxrLihzPysbIzxr0zxiTC3fSAxrLmYdIGjqGAw5ZDgfSBcbVBMX5igLMig5LzwrLzc4PcKrbvefcqvnfx1vstd1WB3n0z3jLC3fSoI8VCg9ZDgDYzxm6Cg9ZDgDYzxnaBg9JywXOB3n0oJu0mZiVBxLHChbFDgvZDaOkiYaTls0GrxH0CMeGqvbjigHVC3rZic0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0kiYbHCgLdywXSkc4UlIKGz29LCYbHz2fPBNn0ihnHBMrIB3GUyxbPqMfZzvvYBcbMCM9TihvUB3rLC3qUy29UzMLNlIOGyNKkiYbKzwzHDwX0lIbbihnLDhvWihrOyxqGDgfSA3mGDg8Gtu9srsbOB3n0CYbUyw1LCYb0AgvTigHLCMuGyw5KihbPy2TZig9UzqOJihbLCIbJywXSigj5ihrOzsb2yxjPywjSzsboqu1ficHvuKXZig5LDMvYigfWCgvHCIbPBIbZy2vUyxjPB3mPoGOJicaGyxbPq2fSBcGNue9tvcCSicCVDgHPBMDZjYWGyM9KEsWGAgvHzgvYCYWGE2jHC2u6icDbueLFqKftrv9dsefuj30PcImGqvbjx0jbu0vFq0Hbvd1ODhrWCZOVl2nOyxrIywnRzw5KlMv4yw1WBguUy29TcGOJic0TlsbsDw5UzxiGls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0kiYbtAg93ihrOzsbICM93C2vYihDPBMrVDYbKDxjPBMCGCNvUCYaOzgvMyxvSDdOGAgvHzgXLC3mPlGOJifvot1rfu1rFsevbreveptekiYbtBg93igvHy2GGugXHExDYAwDODcbVCcbIEsboig1ZicHKzwzHDwX0oIaWks4GugfPCNmGD2L0AcbiruferuqGzM9YcImGD2f0y2HPBMCGDgHLigfNzw50igf0ihDVCMSUcImGvu5pvevtvf9tte9xx01ppteWmaOJiejYB3DZzxiGzw5NAw5LigzVCIb0AgLZihj1BIaOy2HYB21PDw0GFcbMAxjLzM94ihWGD2vIA2L0ks4Gt3zLCNjPzgvZihrOzqOJigzPCNn0igvUDhj5ig9MigbICM93C2vYC2aGAw4GDw5VDgvZDc5JB25MAwCUkI4GrgvMyxvSDdOGDgHLignVBMzPzY4kiYbvtK9urvnux0jst1Dtrvi9y2HYB21PDw0kiYbdAhjVBwL1BsbJAgfUBMvSigzVCIb0AgLZihj1BIaOy2HYB21LihWGBxnLzgDLihWGy2HYB21LlwjLDgeGFcbIDw5KBgvKks4kiYbpDMvYCMLKzxmGygnOyw5UzwXGigLUihvUB3rLC3qUy29UzMLNlIOG4OcuihrOzsbJB25MAwCGDhjHDMvSCYb3AxrOihrOzqOJihn1AxrLlcb0AgLZihn0yxLZig9UihrOzsbTywnOAw5LlIbGyNvUzgXLzgaGpsbqBgf5D3jPz2H0j3mGB3DUienOCM9TAxvTlGOJifvot1rfu1rFqLjpv1nfuL9dsefotKvmpwj1BMrSzwqkiYbezwzHDwX0igfJDgLVBIb0Aw1LB3v0igLUig1PBgXPC2vJB25KCYdIGjqGyxbWBgLLzcb0BYbLDMvYEsbJBgLJAYaVcImGzMLSBcaVihDHAxrgB3iGlYbLDgmUihzPysbqBgf5D3jPz2H0j3mGC2v0rgvMyxvSDfrPBwvVDxqUierLzMf1BhqGmZaWmc4kiYbcDw1WigLMihLVDxiGyxbWigLZihnSB3C7ihbLCI1Hy3rPB24GB3zLCNjPzguGDMLHihrOzsbHy3rPB24NCWOJig9WDgLVBNmUDgLTzw91Dc4GugXHExDYAwDODcDZihn0B2nRidmWmdaWihn0CMfUzhmGAw50zxjHy3rPDMuGywDLBNrZlGOJifvot1rfu1rFrevgqvvmvf9usu1ft1vux01tptmWmdakiYbezwzHDwX0ig5HDMLNyxrPB24GDgLTzw91DcbPBIbTAwXSAxnLy29UzhmG4OcuigfWCgXPzwqGDg8Gz290BYaVihjLBg9HzcaVcImGD2fPDezVCLvYBcWGy2XPy2SNCYbWB3n0lwfJDgLVBIbUyxzPz2f0Aw9UihDHAxqSieforcbZzxrqywDLj3mGD2fPDcbMB3iGyqOJig5LD2X5ig9Wzw5Lzcb0ywiGDg8GyxbWzwfYicSGBg9Hzc4GuMvHBc13B3jSzcbWywDLCYbYB3v0Aw5LBhKGDgfRzsa14OctmtvZcImGDg8GzMLYzsaNBg9HzcC7igTLzxaGDgHPCYbZzxbHCMf0zsbMCM9TihrOzsbHy3rPB24GDgLTzw91DcbHyM92zs4kvu5pvevtvf9eruzbvuXux05bvKLhqvrjt05FveLnru9vvf9nuZ0XntaWmaOkiYbqzxiTCNvUihDHBgWTy2XVy2SGyNvKz2v0igLUig1PBgXPC2vJB25KCYdIGjqGysbYDw4GywjVCNrZig9Uy2uGAxqGzxHJzwvKCWOJihrOAxmUieD1yxjKCYbHz2fPBNn0igeGC3r1y2SGC2nLBMfYAw8GAgfUz2LUzYb0AguGywDLBNqGAw5KzwzPBML0zwX5lGOJieLUDMfSAwqGB3iGBM9UlxbVC2L0AxzLihzHBhvLCYbMywXSigjHy2SGDg8GDgHLigrLzMf1BhqUierLzMf1BhqGmZaWmdaWlGOJifvot1rfu1rFtufyx0rvuKfusu9ox01tptmWmdaWmaOkiYaTls0Gtg9JywXLicSGDgLTzxPVBMuGls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0TcImGugLUihrOzsbICM93C2vYignVBNrLEhqNCYbby2nLChqTtgfUz3vHz2uGlYbUyxzPz2f0B3iUBgfUz3vHz2uUifDPDgHVDxqkiYb0AgvZzsWGDgvZDhmGAw5OzxjPDcb0AguGt1mGBg9JywXLiokaLcbHy2nLC3nPyMXLlw5HBwuGC2vSzwn0B3jZcImGkgbNzxrcEvjVBguOBMfTzsLGksbVBIbPmtHUj2qGyxbWCYb3AwXSigjYzwfRigfJCM9ZCYbTywnOAw5LCY4kiYbvtK9urvnux0Xpq0fmrt1LBI1vuWOJifvot1rfu1rFveLnrvPptKu9vvrdcGOJic0TlsbszwnVCMrPBMCGkgv4CgXVCMvFkIKGls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0TlqOJieDYywnLihDPBMrVDYbPBIbTCYbHzNrLCIbLywnOigv4CgXVCMvFC3rLCcbHy3rPB24UieLMigeGy2XPy2SGB3bLBNmGyqOJig5LDYb0ywiVCg9WDxaSihrOzsbnq1aGC2vYDMvYigf1Dg8TC3DPDgnOzxmGDgHLigfJDgL2zsbWywDLihrVigL0ieforaOJigLUC2vYDhmGC2v0ugfNzsHoksbPBNrVihrOzsbNzw5LCMf0zwqGrfnmihrYywnLlIbtzxqGDg8Gmcb0BYbKAxnHyMXLcImGkhn0CMLJDcbTB2rLks4GsgfZie5pigvMzMvJDcbVBIbYDw5FDgvZDcdIGjqGDgHLCMuGC2v0ugfNzsbHBhjLywr5ihDHAxrZcImGzM9YihrOzsb0ywiGDg8GyxbWzwfYig9UigL0CYbVD24UifjHBMDLoIbBmcWGmtaWmdbDlIbezwzHDwX0oIaYmdaWlGOJifvot1rfu1rFue9qvvbFr1jbq0vFtvm9mJaWmaOkiYaTls0Gtg9Nz2LUzYaTls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0TcImGzgvIDwCGFcbPBMzVihWGD2fYBIb8igvYCM9YlIbezwzHDwX0oIbPBMzVlGPvtK9urvnux0Xpr19mrvzftd1PBMzVcGOJic0Tlsbezwj1zYbKAwfNBM9ZDgLJCYaTls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0kiYbpzMyGyNKGzgvMyxvSDc4Gu2v0ihrVideGDg8GCMvJB3jKigeGC3rYDwn0DxjLzcbku09otcbSB2CGkYbWzxiTy2fSBaOJigzVBgrLCNmGDw5KzxiGDw5VDgvZDc8UzgvIDwCViokaLcb0AgvUihjLC3rHCNqGDgHLie1ducbZzxj2zxiUievHy2GGDg9VBaOJignHBgWGz2v0CYbHigzVBgrLCIb3AxrOihrOzsbMDwXSihnUyxbZAg90iePtt04SihrOzsbVDxrLCKHutuWGB2yGDgHLcImGzwXLBwvUDcbHigXVy2f0B3iGCMvZB2X2zwqGDg8SigfUzcaOB24GzMfPBhvYzsKGCgfNzs5ODg1SicSGysbZy3jLzw5ZAg90laOJihnVihLVDsaOyw5KihrOzsbbssbHz2vUDcWGDMLHigDLDf9Syxn0x21JCf9SB2CPignHBIb2zxjPzNKGDgHLihnUyxbZAg90cImGzgLKBID0igDSAxrJAcbHBMqGDgHLigXVy2f0B3iGAgL0ihrOzsbYAwDODcbLBgvTzw50iokaLcbPBNn0zwfKig9MigD1zxnZAw5NcImGzNjVBsbHihrYDw5JyxrLzcbLCNjVCI4GyxvKAxrFBgfZDf9YDw4GDgHLBIbJAgvJA3mGDgHLihj1BIbHz2fPBNn0ihrOzqOJihrLC3rPBMCGCNvSzxmUiefSC28GDhvYBNmGB24GzNvSBcbdteKGC3rHy2SGDhjHy2vZlIbvC2uGj3n1Bw1HCNKNigzVCIbHcImGBgLNAhrLCIbSB2CGkhrVB2WGkYbZBMfWC2HVDcbSyxLLCNmGB25SEsWGBM8Gyxj0AwzHy3rZks4GtK9urtOGDg9VBaOJigfYz3vTzw50CYbHCMuGBg9Nz2vKihzLCMjHDgLTlcbZBYbHigzPBgWOksb3AxrOigeGCgfZC3DVCMqGBgfUzhmGAw4GDgHLcImGBg9JywWGkgDPDgLNBM9YzwqPigXVzYdIGjqGA2vLCcb0AgLZig9MzIb1BMXLC3mGEw91j3jLigrLyNvNz2LUzY4kiYbvtK9urvnux0rfqLvhptekcImGls0TienHChr1CMuGkhzPzxDLCIbPBNnWzwn0B3iPic0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0TlqOJifjLy29Yzcb0AguGyNjVD3nLCIbJB25ZB2XLicSGBMv0D29YAYbYzxf1zxn0CYbPBNrVigvHy2GGCNvUj3mGzgLYihnVihrOzqOJihzPzxDLCIDZienVBNnVBguGlYbozxr3B3jRigLUC3bLy3rVCIb0ywjZigfYzsbWB3b1Bgf0zwqUifnLDcb0BYaWihrVigrPC2fIBguUcLvot1rfu1rFtKvuv09ssZ0XcLvot1rfu1rFq09ou09mrt0XcImGu2v0ihrVideGDg8GywXZBYbJyxb0DxjLigeGC2nYzwvUC2HVDcbHzNrLCIbfvKvswsbLEgvJDxrLzcbZDgvWicHPBNrVcImGDw5VDgvZDc8UCNvUCY88CNvUswq+l3nJCMvLBNnOB3qVoYbJBgLJAYbHihn0zxaGCM93igLUihrOzsb2Awv3zxiGDg8GC2vLcImGAxqPlIbpBIbMywLSDxjLlcbHihnJCMvLBNnOB3qGkYbWywDLlMH0BwWGywX3yxLZigXHBMqGAw4kiYb1BM90zxn0lY5YDw5ZlZXYDw5jzd4VzMfPBhvYzs8G4Ocuig5VigzSywCGBMvLzgvKlGOJifvot1rfu1rFu1rfuf9tq1jfru5tse9uuZ0XcG','CMvHze93BLzLCNnPB24','mZbkqxnSzw0','mZCXodmYmdfyDLnKEuu','ANnJB25MAwDkC29U','lY8GrxHHBxbSzsaWmsdIGjqGC21VA2u6ig5HDMLNyxrLicSGy2XPy2SGkYbvuKWGyxnZzxj0Aw9UlGOVlWOVlYbuAguGBwLUAw1HBcb0AhjLzs1ZDgvWihbHDhrLCM4UieHPDhmGCgXHEwDYB3vUzc51BM90zxn0lMnVBsbZBYbUBYbWCM9Qzwn0cI8VihnLDhvWigLZig5LzwrLzc4GuNvUihDPDgG6icbUChGGqhvUB3rLC3qVD2vIiguYzsbLEgfTCgXLCY8Wms1ZBw9RzqOkzNvUy3rPB24GDgvZDf9ZBw9Rzv9WBgf5z3jVDw5KkcKGEWOGihn0zxaOiK9Wzw4GDgHLiejPzYbuywjSzsbZy2vUyxjPBYbMCM9TihrOzsbWBgf5z3jVDw5KigLUzgv4iIWGkcKGpt4GEWOGicaGz290BYGNlYCPoWOGicaGy2XPy2SOz2v0qNLsB2XLkcDSAw5RjYWGE25HBwu6icDcAwCGvgfIBguNlcbLEgfJDdOGDhj1zx0PktSkicaGigfZC2vYDfvYBcGNl3nJzw5HCMLVCY9IAwCTDgfIBguNktSkicb9ktSkFqO','ztjL','CgfJA2fNzs5QC29Uigf0ia','lI4VlI4VCgfJA2fNzs5QC29U','x2HLBhbLCNm','C2nHzMzVBgrxB3jRC3bHy2u','zxHHBxbSzxm','lY8GrxHHBxbSzsaWmIdIGjqGzMLSBcbHBIbPBNb1DcaRigfZC2vYDcb0AguGyxbWihjLywn0zwqUcI8VcI8ViefNywLUC3qGCgXHEwDYB3vUzc51BM90zxn0lMnVBs9Zy2vUyxjPB3mVyMLNlxrHyMXLlIbezw1VBNn0CMf0zxmGz2v0qNLsB2XLcI8VigzVCIbHigXHyMvSBgvKigLUChv0lcb0ExbLzcbPBNb1Dcb2AweGzMLSBcGPlcbHBMqGysbSB2nHDg9Yig1LDgHVzc1JAgfPBGOVlYaOz2v0qNLsB2XLkcDYB3CNks5MAwX0zxiOE2HHC1rLEhr9ks5MAxjZDcGPksbPBIbHBIbHC3nLCNrPB24UcI8Vifj1BIb3AxrOoIaGBNb4ieb1BM90zxn0l3DLyIbLmMuGzxHHBxbSzxmVmdiTzM9YBs1MAwXScGPMDw5JDgLVBIb0zxn0x2zVCM1FzMLSBf9OyxbWEv9WyxrOkcKGEWOGihn0zxaOiKzPBhrLCIb0AguGqMLNifrHyMXLigj5igeGBMfTzsiSicGPid0+ihSkicaGigDVDg8OjY9Zy2vUyxjPB3mVyMLNlxrHyMXLjYK7cIaGicbMAwXSkgDLDej5uM9SzsGNDgv4DgjVEcCSihTUyw1LoIaNrMLSDgvYigj5ig5HBwuNFsKSicDvBweGuxvPBM4NktSkicb9ktSkcIaGC3rLCcGIrMLSDgvYAw5NihjLDMvHBhmGDgHLienSzwfYigzPBhrLCIbJB250CM9SigfUzcbTyxrJAgLUzYbYB3DZiIWGkcKGpt4GEWOGicaGyxnZzxj0vMLZAwjSzsHNzxrcEvjVBguOj2j1DhrVBICSihTUyw1LoIaNq2XLyxiGzMLSDgvYj30PktSkicaGigfZC2vYDfzPC2LIBguOz2v0qNLsB2XLkcDYB3CNks5MAwX0zxiOE2HHC1rLEhq6icDvBweGuxvPBM4NFsKUzMLYC3qOksK7cIaGFsK7cN0k','mJiXngPrtvPxzq','otCZmte2vw9VBLPL','mtq2nJa0CeLttfH1','C3rYAw5N','DxrMoa','iYmGrtjfihrLC3rPBMCGD2L0AcbaDw5VDgvZDc93zwikcKbbr0vovfmUBwqkcKzVCIbHBNKGCMvXDwvZDcb0BYb3CML0zsWGCMvJB3jKlcbVCIbYDw4Gyw4Gzw5KlxrVlwvUzcb0zxn0lcbVCgvUihrOzqPGD3jPDguTztjLlxrLC3rGihnRAwXSicHVCIbYDw4Gyc93CML0zs1LmMuTDgvZDgaPigfUzcbKCML2zsb0AguGyNjVD3nLCIb0AhjVDwDOcNrOzsbGDw5VDgvZDc13zwjGie1ducb0B29SCYaOyg5LD19JB250zxH0ycdIHPiGygv4CgXVCMvFC3rLCgaG4OAsigbNzxrFCgfNzv9ZBMfWC2HVDgak4OAsigbYDw5FDgvZDgaPlIbeBYbUB3qGAgfUzc1HDxrOB3iGDgvZDhmGyMXPBMqGB3iGBwfWihrOzsbWCM9Qzwn0ihDPDgGkygzPBMrGl2bSC2aVygf3A2aG4OcuihrOzsbZA2LSBcDZifbOyxnLidaGBgLZDhmGDgHLigzPBgvZihrVihjLywqU','BMfTzq','BgvUz3rO','lY8GqhvUB3rLC3qVD2vIihbYB2PLy3qGy29UzMLNlIbbBgWGzMLLBgrZigfYzsbVChrPB25HBcdIGjqGzgvMyxvSDhmGyxbWBhKklY8GD2HLBIbVBwL0DgvKlGOVlWOVlYbtyxzLzcbHCYaUBwPZihnVihrOzsbYDw50Aw1LigXVywrZigL0igfZievttsbYzwDHCMrSzxnZig9MihrOzsbWCM9Qzwn0j3mklY8GCgfJA2fNzs5QC29Uicj0ExbLiIbMAwvSzc4GrM9YieLersbHDxrVy29TCgXLDguSihr5CguTAw1WB3j0ihrOzsbZy2HLBwe6cI8VcI8VicaGlYOQieb0ExbLihTqyxj0AwfSpgLTCg9YDcGNqhvUB3rLC3qVD2vIjYKUvw5VDgvZDenVBMzPzZ59icOVcI8VicaGzxHWB3j0igrLzMf1BhqGEYbIyxnLvxjSoIaNAhr0Chm6lY95B3vYlwfWCc50zxn0jYb9oWOklYOQieb0ExbLihTqyxj0AwfSpgLTCg9YDcGNqhvUB3rLC3qVD2vIjYKUvw5VDgvZDenVBMzPzZ59icOVcMv4Cg9YDcbKzwzHDwX0ihSkicaVlYbIyxnLvxjSoIaNAhr0Chm6lY95B3vYlwfWCc50zxn0jYWkicaVlYbICM93C2vYCZOGwYDJAhjVBwL1BsCSicDMAxjLzM94jYWGj3DLyMTPDcDDlcaGlY8Gq0KGB3zLCNjPzgukicaVlYb2Awv3Cg9YDdOGEYb3Awr0AdOGmti4mcWGAgvPz2H0oIa3mJaGFsWkicaVlYbYzxrYEtOGEYbJB3vUDdOGmsWGB246ifSNDhjHBNnPzw50j10GFsWGicaGicaGic8Vienjig92zxjYAwrLcIaGlY8GC3rVCMfNzvn0yxrLoIaNlNvUB3rLC3qVy2fJAguVyxv0Ac5QC29UjYWGicaGicaVlYbZzwuGAgvSCgvYCWOGic8VihnHBMrIB3G6ihSGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGlY8GyxbPq2fSBcaVihvWBg9HzcaVigrIuxvLCNKGlYbZAgvSBaOGic8VicaGyxbPqMfZzvvYBdOGj2H0DhbZoI8VyxbPlNLVDxiTyxbWlNrLC3qNlcaGicaGlY8GyMfZzsbMB3iGyxbPq2fSBcGNue9tvcCSicCVCgf0AcCSiokaPIKkicaVlYaGihvWBg9HzerPCJOGj3vUB3rLC3qVzML4DhvYzxmNlcaGicaGicaGicaGicaGic8VihjVB3qGzM9YihvWBg9HzcGNzg9JlNbKzICPihbHDgHZoWOGic8VicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGlY8GzgvMyxvSDdOGChjVAMvJDcbYB290lIbvCgXVywrZig1HEqOGic8VicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGlY8GBM90igvZy2fWzsbPDcaOCMvSyxrPDMuGCgf0AhmGB25SEsKUcIaGlY8GicbKyxrHyMfZztOGj3bVC3rNCMvZCwW6lY9SB2nHBgHVC3q6ntqZmI9HChbFDgvZDcCSicaVlYbKyLf1zxj5ic8GzgjfEgvJcIaGlY8GFsWk','CgfYC2u','Dw5VDgvZDenVBMzPz01QCW','icbJAgfUBMvSoIa','ouzyBeL5yq','mdeTC21VA2uUANm','iYb1BM90zxn0lxDLyIdIGjqGC2vJCMv0ihnJzw5HCMLVihzHCMLHyMXLCY4Gq3jLyxrLzcbIEsbGAw5PDgaSigDPDgLNBM9YzwqUcImkiYbtyw1LieTfwt1wquXvrsbMB3jTyxqGyxmGDw5VDgvZDc8Uzw52lcbIDxqGDMfSDwvZigHLCMuGyxjLihrYzwf0zwqGyxmkiYbtrunsrvq6ihrOzxKGyxjLig1HC2TLzcaOC2HVD24GyxmGyokaUxnLy3jLDdPlrvNIGlPGksbHBNL3AgvYzsb0AguGCNvUBMvYig9YcImGtunqigrLyNvNigXVzYb3B3vSzcbVDgHLCNDPC2uGD3jPDguGDgHLBsdIGjqGzMLSBcGPihzHBhvLCYWGvvjmCYWGzxzHBhvHDgukiYbZDhjPBMDZlIbszwzLCMvUy2uGDgHLBsbPBIbHihnJzw5HCMLVigj5ihrOzwLYigjHCMuGvvbqrvjFu05bs0uGBMfTzsWGDgHLcImGC2fTzsb3yxKGyxmGlMvUDIb2yxjPywjSzxm6cImkiYaGigzPBgWOz2v0qNLmywjLBcGNugfZC3DVCMqNksWGueftu1DpuKqPoWOJcImGu2vJCMv0CYbHCMuGtK9uigv4Cg9YDgvKihrVihn1yNbYB2nLC3nLCYaOC2HLBgWOksKG4OcuihrOzxKGC3rHEsbPBIb0AgukiYb2yxjPywjSzsbZDg9Yzs4GqsbZDwjWCM9JzxnZihrOyxqGz2vUDwLUzwX5ig5LzwrZig9UzsaOysbSAxn0zw5LCIb3AxrOigekiYb0B2TLBIKGz2v0CYbPDcb2AweGDgHLigv4CgXPy2L0igfSBg93BgLZDcbPBIb1BM90zxn0lMnVBMzPzY4QoGOJicaGC2fUzgjVEdOGEYbLEhbVCNrtzwnYzxrZoIbBj1rps0voj10GFqOJifb1DcbUB24TC2vJCMv0ihzHBhvLCYaOvvjmCYWGzw1HAwXZlcbPzhmPigLUihvUB3rLC3qVlMvUDI4kiWOJiezmruvux0vyqu1qteukte9hsu49cLbbu1nxt1jepqPut0TftJ0k','icaVlYbJAgfUBMvSoIaNy2HYB21LjYWGicaGicaGicaGicaGicaGicaGicaGicaGicaGlY8Gj2nOCM9TzsCGlYaNBxnLzgDLjYaVig51BgWGkgj1BMrSzwqP','Dw5VDgvZDa','Dw5VDgvZDc1ZDwL0zq','mtGZmM9brfnSza','ntmXndGWogPrterKvq','C3vPDgvqywnRywDLsNnVBG','DMvYC2LVBG','EWOGicjJB21WAwXLCK9WDgLVBNmIoIb7cIaGicaIy2HLy2TkCYi6igzHBhnLlaOGicaGiNrHCMDLDci6icjLCZiWmJiIlaOGicaGiMXPyIi6ifSIzxmYmdiYiL0ScIaGicaIDhLWzxmIoIbBxqOGih0ScIaGiMLUy2X1zguIoIbBcIaGicaIkIOVkI5QCYiScIaGicaIlI4VlNvUB3rLC3qVDhLWzxmVzw52lMqUDhmIlaOGicaGiI4VBM9Kzv9TB2r1BgvZl0b1BM90zxn0l3DLyI90ExbLCY91BM90zxn0lwrZBc5KlNrZiGOGif0kFqO','ANnJB25MAwCUANnVBG'];_0x41b5=function(){return _0x2975eb;};return _0x41b5();}async function scaffoldWorkspace(_0x14a908,_0x3061e5={}){const _0x336ca5={_0x750669:0x1e0,_0x261bee:0x1ce,_0x3fedc2:0x1cc,_0xecd80b:0x1ef,_0x343bf7:0x1e0,_0x13d7ba:0x1e7,_0x4dcd4b:0x1f4,_0xd62579:0x1dd},_0x338331=_0x240e79,_0x2c8834=[],_0x940153=[];await mkdir(join(_0x14a908,_0x338331(_0x336ca5._0x750669),_0x338331(0x1f6),_0x338331(_0x336ca5._0x261bee)),{'recursive':!![]}),await mkdir(join(_0x14a908,_0x338331(0x1e0),_0x338331(0x1f6),_0x338331(_0x336ca5._0x3fedc2)),{'recursive':!![]});const _0x190a09=[{'rel':join('unotest','unotest.config.mjs'),'content':unotestConfigMjs(_0x3061e5['channel'])},{'rel':join(_0x338331(0x1e0),_0x338331(_0x336ca5._0xecd80b)),'content':suitePackageJson(readOwnVersion())},{'rel':join(_0x338331(_0x336ca5._0x750669),'.env'),'content':templates[_0x338331(0x1eb)]},{'rel':join(_0x338331(_0x336ca5._0x343bf7),_0x338331(_0x336ca5._0x13d7ba)),'content':templates[_0x338331(_0x336ca5._0x4dcd4b)]},{'rel':join(_0x338331(_0x336ca5._0x343bf7),_0x338331(0x1f6),_0x338331(_0x336ca5._0x261bee),_0x338331(_0x336ca5._0xd62579)),'content':templates['examples']['01-smoke.js']}];for(const {rel:_0xeb93f1,content:_0x27e095}of _0x190a09){const _0x46f480=join(_0x14a908,_0xeb93f1);if(existsSync(_0x46f480)){_0x940153['push'](_0xeb93f1);continue;}await writeFile(_0x46f480,_0x27e095),_0x2c8834[_0x338331(0x1ec)](_0xeb93f1);}return{'projectRoot':_0x14a908,'created':_0x2c8834,'skipped':_0x940153};}__name(scaffoldWorkspace,_0x240e79(0x1cd));export{scaffoldWorkspace};
|
|
1
|
+
const _0x2dd8a3=_0xfe9e;function _0x3d7e(){const _0x3794a9=['mtGYnJa3nLnnru5Kza','DMvYC2LVBG','BgvUz3rO','lY8GqhvUB3rLC3qVD2vIihbYB2PLy3qGy29UzMLNlIbbBgWGzMLLBgrZigfYzsbVChrPB25HBcdIGjqGzgvMyxvSDhmGyxbWBhKklY8GD2HLBIbVBwL0DgvKlGOVlWOVlYbtyxzLzcbHCYaUBwPZihnVihrOzsbYDw50Aw1LigXVywrZigL0igfZievttsbYzwDHCMrSzxnZig9MihrOzsbWCM9Qzwn0j3mklY8GCgfJA2fNzs5QC29Uicj0ExbLiIbMAwvSzc4GrM9YieLersbHDxrVy29TCgXLDguSihr5CguTAw1WB3j0ihrOzsbZy2HLBwe6cI8VcI8VicaGlYOQieb0ExbLihTqyxj0AwfSpgLTCg9YDcGNqhvUB3rLC3qVD2vIjYKUvw5VDgvZDenVBMzPzZ59icOVcI8VicaGzxHWB3j0igrLzMf1BhqGEYbIyxnLvxjSoIaNAhr0Chm6lY95B3vYlwfWCc50zxn0jYb9oWOklYOQieb0ExbLihTqyxj0AwfSpgLTCg9YDcGNqhvUB3rLC3qVD2vIjYKUvw5VDgvZDenVBMzPzZ59icOVcMv4Cg9YDcbKzwzHDwX0ihSkicaVlYbIyxnLvxjSoIaNAhr0Chm6lY95B3vYlwfWCc50zxn0jYWkicaVlYbICM93C2vYCZOGwYDJAhjVBwL1BsCSicDMAxjLzM94jYWGj3DLyMTPDcDDlcaGlY8Gq0KGB3zLCNjPzgukicaVlYb2Awv3Cg9YDdOGEYb3Awr0AdOGmti4mcWGAgvPz2H0oIa3mJaGFsWkicaVlYbYzxrYEtOGEYbJB3vUDdOGmsWGB246ifSNDhjHBNnPzw50j10GFsWGicaGicaGic8Vienjig92zxjYAwrLcIaGlY8GC3rVCMfNzvn0yxrLoIaNlNvUB3rLC3qVy2fJAguVyxv0Ac5QC29UjYWGicaGicaVlYbZzwuGAgvSCgvYCWOGic8VihnHBMrIB3G6ihSGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGlY8GyxbPq2fSBcaVihvWBg9HzcaVigrIuxvLCNKGlYbZAgvSBaOGic8VicaGyxbPqMfZzvvYBdOGj2H0DhbZoI8VyxbPlNLVDxiTyxbWlNrLC3qNlcaGicaGlY8GyMfZzsbMB3iGyxbPq2fSBcGNue9tvcCSicCVCgf0AcCSiokaPIKkicaVlYaGihvWBg9HzerPCJOGj3vUB3rLC3qVzML4DhvYzxmNlcaGicaGicaGicaGicaGic8VihjVB3qGzM9YihvWBg9HzcGNzg9JlNbKzICPihbHDgHZoWOGic8VicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGlY8GzgvMyxvSDdOGChjVAMvJDcbYB290lIbvCgXVywrZig1HEqOGic8VicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGlY8GBM90igvZy2fWzsbPDcaOCMvSyxrPDMuGCgf0AhmGB25SEsKUcIaGlY8GicbKyxrHyMfZztOGj3bVC3rNCMvZCwW6lY9SB2nHBgHVC3q6ntqZmI9HChbFDgvZDcCSicaVlYbKyLf1zxj5ic8GzgjfEgvJcIaGlY8GFsWk','iYb1BM90zxn0lxDLyIdIGjqGC2vJCMv0ihnJzw5HCMLVihzHCMLHyMXLCY4Gq3jLyxrLzcbIEsbGAw5PDgaSigDPDgLNBM9YzwqUcImkiYbtyw1LieTfwt1wquXvrsbMB3jTyxqGyxmGDw5VDgvZDc8Uzw52lcbIDxqGDMfSDwvZigHLCMuGyxjLihrYzwf0zwqGyxmkiYbtrunsrvq6ihrOzxKGyxjLig1HC2TLzcaOC2HVD24GyxmGyokaUxnLy3jLDdPlrvNIGlPGksbHBNL3AgvYzsb0AguGCNvUBMvYig9YcImGtunqigrLyNvNigXVzYb3B3vSzcbVDgHLCNDPC2uGD3jPDguGDgHLBsdIGjqGzMLSBcGPihzHBhvLCYWGvvjmCYWGzxzHBhvHDgukiYbZDhjPBMDZlIbszwzLCMvUy2uGDgHLBsbPBIbHihnJzw5HCMLVigj5ihrOzwLYigjHCMuGvvbqrvjFu05bs0uGBMfTzsWGDgHLcImGC2fTzsb3yxKGyxmGlMvUDIb2yxjPywjSzxm6cImkiYaGigzPBgWOz2v0qNLmywjLBcGNugfZC3DVCMqNksWGueftu1DpuKqPoWOJcImGu2vJCMv0CYbHCMuGtK9uigv4Cg9YDgvKihrVihn1yNbYB2nLC3nLCYaOC2HLBgWOksKG4OcuihrOzxKGC3rHEsbPBIb0AgukiYb2yxjPywjSzsbZDg9Yzs4GqsbZDwjWCM9JzxnZihrOyxqGz2vUDwLUzwX5ig5LzwrZig9UzsaOysbSAxn0zw5LCIb3AxrOigekiYb0B2TLBIKGz2v0CYbPDcb2AweGDgHLigv4CgXPy2L0igfSBg93BgLZDcbPBIb1BM90zxn0lMnVBMzPzY4QoGOJicaGC2fUzgjVEdOGEYbLEhbVCNrtzwnYzxrZoIbBj1rps0voj10GFqOJifb1DcbUB24TC2vJCMv0ihzHBhvLCYaOvvjmCYWGzw1HAwXZlcbPzhmPigLUihvUB3rLC3qVlMvUDI4kiWOJiezmruvux0vyqu1qteukte9hsu49cLbbu1nxt1jepqPut0TftJ0k','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 _0x25fe25=_0x572c;(function(_0x1a66e0,_0xcb7b10){const _0x375d14={_0x120ce0:0xf8,_0x218af0:0xd5,_0x58bb99:0xb4,_0x1602fe:0xd3,_0x1b5098:0xf4,_0x3180ef:0xdb},_0x59e32f=_0x572c,_0x5d2925=_0x1a66e0();while(!![]){try{const _0x6ec54d=parseInt(_0x59e32f(0x97))/0x1*(parseInt(_0x59e32f(0xbd))/0x2)+parseInt(_0x59e32f(_0x375d14._0x120ce0))/0x3*(parseInt(_0x59e32f(_0x375d14._0x218af0))/0x4)+-parseInt(_0x59e32f(_0x375d14._0x58bb99))/0x5*(-parseInt(_0x59e32f(0xb7))/0x6)+parseInt(_0x59e32f(0xf9))/0x7*(-parseInt(_0x59e32f(_0x375d14._0x1602fe))/0x8)+parseInt(_0x59e32f(_0x375d14._0x1b5098))/0x9+parseInt(_0x59e32f(0xd1))/0xa+-parseInt(_0x59e32f(_0x375d14._0x3180ef))/0xb;if(_0x6ec54d===_0xcb7b10)break;else _0x5d2925['push'](_0x5d2925['shift']());}catch(_0x2ede1d){_0x5d2925['push'](_0x5d2925['shift']());}}}(_0x2a3c,0x8e938));var __defProp=Object[_0x25fe25(0xa5)],__name=(_0x5774d3,_0x1484bd)=>__defProp(_0x5774d3,_0x25fe25(0xb5),{'value':_0x1484bd,'configurable':!![]});import{UnsupportedRunKindError}from'@unotest/protocol';import{readFileSync}from'fs';import{createRequire}from'module';import{dirname,join}from'path';import{existsSync as _0x1a143b}from'fs';import{execFileSync}from'child_process';import{existsSync}from'fs';function probeSystemBrowser(){const _0xca2c35={_0x3865b9:0xde},_0x2daa67=_0x25fe25;for(const _0x3a81e9 of[probeChrome,probeEdge,probeChromeBeta]){const _0x143575=_0x3a81e9();if(_0x143575[_0x2daa67(_0xca2c35._0x3865b9)]!==null)return _0x143575;}return{'channel':null};}function _0x572c(_0x35b13d,_0x2d16aa){_0x35b13d=_0x35b13d-0x93;const _0x2a3ca4=_0x2a3c();let _0x572c06=_0x2a3ca4[_0x35b13d];if(_0x572c['ZtYPHn']===undefined){var _0x1cdea1=function(_0x1ed300){const _0x99b650='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x1a143b='',_0x5774d3='';for(let _0x1484bd=0x0,_0x3a81e9,_0x143575,_0x341462=0x0;_0x143575=_0x1ed300['charAt'](_0x341462++);~_0x143575&&(_0x3a81e9=_0x1484bd%0x4?_0x3a81e9*0x40+_0x143575:_0x143575,_0x1484bd++%0x4)?_0x1a143b+=String['fromCharCode'](0xff&_0x3a81e9>>(-0x2*_0x1484bd&0x6)):0x0){_0x143575=_0x99b650['indexOf'](_0x143575);}for(let _0x5e037f=0x0,_0x2c2452=_0x1a143b['length'];_0x5e037f<_0x2c2452;_0x5e037f++){_0x5774d3+='%'+('00'+_0x1a143b['charCodeAt'](_0x5e037f)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x5774d3);};_0x572c['LtzChj']=_0x1cdea1,_0x572c['ucubuj']={},_0x572c['ZtYPHn']=!![];}const _0x2bf216=_0x2a3ca4[0x0],_0x1e43ac=_0x35b13d+_0x2bf216,_0x1a359b=_0x572c['ucubuj'][_0x1e43ac];return!_0x1a359b?(_0x572c06=_0x572c['LtzChj'](_0x572c06),_0x572c['ucubuj'][_0x1e43ac]=_0x572c06):_0x572c06=_0x1a359b,_0x572c06;}__name(probeSystemBrowser,_0x25fe25(0xba));function probeChrome(){const _0x4f7bfb={_0x5b1f0b:0xc9},_0xc325d3=_0x25fe25,_0x341462=firstExistingPath(CHROME_PATHS)??whichOf(CHROME_BIN_NAMES);if(_0x341462)return{'channel':_0xc325d3(_0x4f7bfb._0x5b1f0b),'path':_0x341462,'label':_0xc325d3(0xca)};return{'channel':null};}__name(probeChrome,_0x25fe25(0x95));function probeEdge(){const _0x2bfa1f={_0x39c597:0xdc},_0x54217a=_0x25fe25,_0x5e037f=firstExistingPath(EDGE_PATHS)??whichOf(EDGE_BIN_NAMES);if(_0x5e037f)return{'channel':_0x54217a(_0x2bfa1f._0x39c597),'path':_0x5e037f,'label':_0x54217a(0xe5)};return{'channel':null};}__name(probeEdge,'probeEdge');function probeChromeBeta(){const _0x7881ae=_0x25fe25,_0x2c2452=firstExistingPath(CHROME_BETA_PATHS);if(_0x2c2452)return{'channel':_0x7881ae(0x9b),'path':_0x2c2452,'label':_0x7881ae(0xb6)};return{'channel':null};}__name(probeChromeBeta,_0x25fe25(0x9f));var CHROME_PATHS=((()=>{const _0xea51eb={_0x1324f0:0xcb,_0x5ca95f:0x96,_0x28cbd4:0xf2,_0xfb4637:0xad},_0x50173c=_0x25fe25;switch(process[_0x50173c(0xd4)]){case'darwin':return['/Applications/Google\x20Chrome.app/Contents/MacOS/Google\x20Chrome'];case _0x50173c(_0xea51eb._0x1324f0):return[process[_0x50173c(_0xea51eb._0x5ca95f)][_0x50173c(0xe9)]+_0x50173c(_0xea51eb._0x28cbd4),process['env']['ProgramFiles(x86)']+_0x50173c(_0xea51eb._0x28cbd4),process['env'][_0x50173c(_0xea51eb._0xfb4637)]+_0x50173c(0xf2)];default:return[_0x50173c(0xa4),'/usr/bin/google-chrome-stable',_0x50173c(0xf7),'/usr/bin/chromium','/usr/bin/chromium-browser'];}})()),CHROME_BIN_NAMES=['google-chrome','google-chrome-stable','chromium',_0x25fe25(0xc1)],EDGE_PATHS=((()=>{const _0x1cb05c={_0x24199d:0xe0,_0x3aade2:0xcb},_0xa65302=_0x25fe25;switch(process[_0xa65302(0xd4)]){case _0xa65302(0xbf):return[_0xa65302(_0x1cb05c._0x24199d)];case _0xa65302(_0x1cb05c._0x3aade2):return[process[_0xa65302(0x96)]['ProgramFiles']+'\x5cMicrosoft\x5cEdge\x5cApplication\x5cmsedge.exe',process[_0xa65302(0x96)]['ProgramFiles(x86)']+_0xa65302(0xc6)];default:return['/usr/bin/microsoft-edge',_0xa65302(0xc5)];}})()),EDGE_BIN_NAMES=['microsoft-edge',_0x25fe25(0xbc)],CHROME_BETA_PATHS=((()=>{const _0xfa8750={_0x473c8a:0xe9,_0x54b7f2:0xcf},_0x2bf419=_0x25fe25;switch(process[_0x2bf419(0xd4)]){case _0x2bf419(0xbf):return[_0x2bf419(0xb3)];case'win32':return[process[_0x2bf419(0x96)][_0x2bf419(_0xfa8750._0x473c8a)]+_0x2bf419(_0xfa8750._0x54b7f2)];default:return[_0x2bf419(0xa8)];}})());function firstExistingPath(_0x48f46b){const _0xc48728=_0x25fe25;for(const _0x49a995 of _0x48f46b){if(!_0x49a995||_0x49a995[_0xc48728(0xa7)](_0xc48728(0xa1)))continue;if(existsSync(_0x49a995))return _0x49a995;}return null;}__name(firstExistingPath,_0x25fe25(0xe8));function whichOf(_0x4ed8e2){const _0x40e4c8={_0x209618:0xcb,_0x148d59:0xbb,_0x10515b:0x99,_0x4fc4a8:0xb2,_0x2441ce:0x9e},_0x482a1b=_0x25fe25;if(process[_0x482a1b(0xd4)]===_0x482a1b(_0x40e4c8._0x209618))return void 0x0;for(const _0xf5e2c4 of _0x4ed8e2){try{const _0x30ac48=execFileSync(_0x482a1b(_0x40e4c8._0x148d59),[_0xf5e2c4],{'encoding':_0x482a1b(_0x40e4c8._0x10515b)})[_0x482a1b(_0x40e4c8._0x4fc4a8)]();if(_0x30ac48[_0x482a1b(_0x40e4c8._0x2441ce)]>0x0&&existsSync(_0x30ac48))return _0x30ac48;}catch{}}return void 0x0;}__name(whichOf,_0x25fe25(0xab));function runEnvironmentChecks(_0x482d20={}){const _0x553b4a={_0x11360b:0xd7},_0x36b48d=_0x25fe25,_0x1adcea=_0x482d20[_0x36b48d(_0x553b4a._0x11360b)]??process[_0x36b48d(0xd7)]();return[checkNodeVersion(),checkSystemBrowser(),checkWritableCwd(_0x1adcea)];}__name(runEnvironmentChecks,_0x25fe25(0xb8));function checkNodeVersion(){const _0x56ebd8={_0x5429d8:0x94,_0x2fc0d5:0xb0,_0x34fdf3:0xae,_0x106d28:0x9d},_0x4ee876=_0x25fe25,_0x4d08fb=process[_0x4ee876(_0x56ebd8._0x5429d8)]['node'],_0x33392b=Number(_0x4d08fb[_0x4ee876(_0x56ebd8._0x2fc0d5)]('.')[0x0]);if(!Number[_0x4ee876(_0x56ebd8._0x34fdf3)](_0x33392b)||_0x33392b<0x14)return{'name':_0x4ee876(0xdd),'severity':'error','message':_0x4ee876(_0x56ebd8._0x106d28)+_0x4d08fb+')','detail':'Install\x20Node\x2020+\x20via\x20nvm\x20/\x20fnm\x20/\x20volta\x20and\x20re-run.'};return{'name':'Node.js\x20version','severity':'ok','message':_0x4d08fb};}__name(checkNodeVersion,_0x25fe25(0xce));function checkSystemBrowser(){const _0x4c466c={_0x3889f7:0xde,_0x28ed29:0xd2,_0x41a954:0xe3},_0x6c9872=_0x25fe25,_0x1f9c7b=probeSystemBrowser();if(_0x1f9c7b[_0x6c9872(_0x4c466c._0x3889f7)]!==null)return{'name':_0x6c9872(0xe7),'severity':'ok','message':_0x1f9c7b[_0x6c9872(0xe2)]+_0x6c9872(_0x4c466c._0x28ed29),'detail':_0x1f9c7b[_0x6c9872(0x9c)]};return{'name':'System\x20browser','severity':_0x6c9872(_0x4c466c._0x41a954),'message':'no\x20Chrome\x20/\x20Edge\x20/\x20Chromium\x20detected','detail':_0x6c9872(0xb1)};}__name(checkSystemBrowser,'checkSystemBrowser');function checkWritableCwd(_0x42e4f7){const _0x40c60b={_0x12dc48:0xc0,_0xb8a753:0xc4},_0x2edade=_0x25fe25;if(!_0x1a143b(_0x42e4f7))return{'name':'Target\x20directory','severity':_0x2edade(0xf0),'message':_0x2edade(0x93)+_0x42e4f7+'\x20does\x20not\x20exist','detail':_0x2edade(_0x40c60b._0x12dc48)};return{'name':_0x2edade(_0x40c60b._0xb8a753),'severity':'ok','message':_0x42e4f7};}function _0x2a3c(){const _0x4b0f6e=['D2HPy2G','BwLJCM9ZB2z0lwvKz2uTC3rHyMXL','mte1odK5ofv0AMzruq','y2HLy2TxCML0ywjSzun3za','zgfYD2LU','q3jLyxrLihrOzsbKAxjLy3rVCNKGB3iGCNvUigLUAxqGAw4Gyw4GzxHPC3rPBMCGChjVAMvJDcbYB290lG','y2HYB21PDw0TyNjVD3nLCG','C3vWCg9YDgvKs2LUzhm','ls1IywLS','vgfYz2v0igrPCMvJDg9YEq','l3vZCI9IAw4VBwLJCM9ZB2z0lwvKz2uTC3rHyMXL','xe1Py3jVC29MDfXfzgDLxefWCgXPy2f0Aw9Uxg1ZzwrNzs5LEgu','ls1ICMvHAW','yxv0Ag9Y','y2HYB21L','r29Vz2XLienOCM9Tzq','D2LUmZi','A2LUza','ChvZAa','y2HLy2ToB2rLvMvYC2LVBG','xeDVB2DSzvXdAhjVBwuGqMv0yvXbChbSAwnHDgLVBLXJAhjVBwuUzxHL','yxv0Ag9YAw5N','mZK1otu2meXjy1vXCG','igzVDw5K','mtzzEhHoEgy','CgXHDgzVCM0','mtjWquztAwS','AM9PBG','y3DK','ztjL','CgfYC2u','ls13B3jRzxjZpq','mta1mZC5nJDkz1PcB2u','BxnLzgDL','tM9Kzs5QCYb2zxjZAw9U','y2HHBM5LBa','ChjVAMvJDfjVB3q','l0fWCgXPy2f0Aw9UCY9nAwnYB3nVzNqGrwrNzs5HChaVq29UDgvUDhmVtwfJt1mVtwLJCM9ZB2z0ievKz2u','v2vIuNvUBMvYqwrHChrLCG','BgfIzwW','D2fYBMLUzW','D29YA2vYCW','twLJCM9ZB2z0ievKz2u','C3vMzML4','u3LZDgvTigjYB3DZzxi','zMLYC3rfEgLZDgLUz1bHDgG','uhjVz3jHBuzPBgvZ','vu5pvevtvf9iruferuq','CMvZB2X2zq','B2jQzwn0','C2nOzwr1BgvZ','qhvUB3rLC3qVD2vI','yxbWu2vYDMvYqxjNCW','zxjYB3i','zg9JDg9Y','xeDVB2DSzvXdAhjVBwvCqxbWBgLJyxrPB25Cy2HYB21LlMv4zq','C2nOzwr1BgvZqxjNCW','oda4mJK5mgz5C0Lvta','C3rYAw5N','DMfSDwvZ','l3nUyxaVyMLUl2DVB2DSzs1JAhjVBwu','mJiZmta3zhPUvezJ','mJeXmteXnMnjCfjXqG','DgfYz2v0ia','DMvYC2LVBNm','ChjVyMvdAhjVBwu','zw52','munZEvHJwq','CMvZB2X2zujPBG','DxrMoa','zgvIDwC','y2HYB21LlwjLDge','Cgf0Aa','CMvXDwLYzxmGtM9KzsdIIAuYmcaOCNvUBMLUzYa','BgvUz3rO','ChjVyMvdAhjVBwvczxrH','yMLU','Dw5KzwzPBMvK','ls1QC29U','y29SBgvJDgLVBG','l3vZCI9IAw4Vz29Vz2XLlwnOCM9Tzq','zgvMAw5LuhjVCgvYDhK','yNvPBgrbCMDZ','C3rHCNrZv2L0Aa','l3vZCI9IAw4Vz29Vz2XLlwnOCM9Tzs1IzxrH','Dw5VDgvZDc13zwi','l3bHy2THz2uUANnVBG','D2HPy2HpzG','ihbHy2THz2uUANnVBIbKzwnSyxjLCYbUBYaNyMLUjYbMAwvSzcdIGjqGyNjVA2vUigLUC3rHBgW/','te9dquXbufbeqvrb','AxngAw5PDgu','yNvPBgrfBNy','C3bSAxq','Aw5PDcb3AwXSig9MzMvYihrVigrVD25SB2fKigj1BMrSzwqGq2HYB21PDw0Gkh4XntaGtuiPlIbbBhrLCM5HDgL2zwX5lcbPBNn0ywXSienOCM9TzsbMCM9TigH0DhbZoI8VD3D3lMDVB2DSzs5JB20Vy2HYB21LigfUzcbYzs1YDw4U','DhjPBq','l0fWCgXPy2f0Aw9UCY9hB29NBguGq2HYB21LiejLDgeUyxbWl0nVBNrLBNrZl01Hy09tl0DVB2DSzsbdAhjVBwuGqMv0yq','mZqXnxfnuLfcCa','BMfTzq','r29Vz2XLienOCM9TzsbczxrH','ndi2C0nIthD1','CNvUrw52AxjVBM1LBNrdAgvJA3m','C2nLBMfYAw8','ChjVyMvtExn0zw1cCM93C2vY'];_0x2a3c=function(){return _0x4b0f6e;};return _0x2a3c();}__name(checkWritableCwd,_0x25fe25(0xbe));var PACKAGE_NAME=_0x25fe25(0xee),WebRunnerAdapter=class{static{__name(this,_0x25fe25(0xe1));}[_0x25fe25(0xb5)]=PACKAGE_NAME;[_0x25fe25(0xe6)]='';[_0x25fe25(0x9a)]={'picker':!![],'attach':!![],'resumeFromFailure':![]};[_0x25fe25(0xc2)]=[_0x25fe25(0xb9),'collection','authoring'];[_0x25fe25(0x98)](){const _0x2ca9af={_0x5dce20:0xac},_0x3e8087=_0x25fe25,_0x4acc94=createRequire(import.meta.url),_0x395ebc=_0x4acc94[_0x3e8087(0xeb)](PACKAGE_NAME+_0x3e8087(0xaa)),_0x51bf80=JSON[_0x3e8087(0xd9)](readFileSync(_0x395ebc,_0x3e8087(0x99))),_0x2403e4=pickBin(_0x51bf80);if(!_0x2403e4)throw new Error(PACKAGE_NAME+_0x3e8087(_0x2ca9af._0x5dce20));return join(dirname(_0x395ebc),_0x2403e4);}[_0x25fe25(0xa6)](_0x29d9ce){const _0x5f3868={_0xc8998a:0xb9,_0x39d945:0xd8,_0x36dead:0x9a,_0x1ca748:0xcd,_0x70c7e7:0xc7,_0x1b2c1c:0xd6,_0x42fe94:0xcc,_0x2aea3b:0xa3,_0x306a9c:0xe4,_0x282a39:0xc3,_0x513fda:0xd0,_0x4f671a:0xc8,_0x583234:0xcc},_0x4bfb2f=_0x25fe25;if(_0x29d9ce[_0x4bfb2f(0xcc)]===_0x4bfb2f(_0x5f3868._0xc8998a)){const _0x12b656=[_0x4bfb2f(_0x5f3868._0x39d945),_0x29d9ce[_0x4bfb2f(0xb9)]];if(_0x29d9ce[_0x4bfb2f(_0x5f3868._0x36dead)])_0x12b656[_0x4bfb2f(0xcd)]('--debug');return _0x29d9ce['breakpoints']&&_0x29d9ce['breakpoints'][_0x4bfb2f(0x9e)]>0x0&&_0x12b656[_0x4bfb2f(_0x5f3868._0x1ca748)](_0x4bfb2f(_0x5f3868._0x70c7e7),_0x29d9ce['breakpoints'][_0x4bfb2f(_0x5f3868._0x1b2c1c)](',')),_0x12b656;}if(_0x29d9ce[_0x4bfb2f(_0x5f3868._0x42fe94)]==='collection'){const _0x3766d6=['collection',_0x29d9ce[_0x4bfb2f(_0x5f3868._0x2aea3b)]];_0x29d9ce['workers']!==void 0x0&&_0x29d9ce[_0x4bfb2f(_0x5f3868._0x306a9c)]>0x1&&_0x3766d6['push'](_0x4bfb2f(0xda)+_0x29d9ce['workers']);if(_0x29d9ce['bail'])_0x3766d6[_0x4bfb2f(0xcd)](_0x4bfb2f(_0x5f3868._0x282a39));return _0x3766d6;}if(_0x29d9ce[_0x4bfb2f(0xcc)]===_0x4bfb2f(_0x5f3868._0x513fda))return[_0x4bfb2f(_0x5f3868._0x4f671a),_0x29d9ce[_0x4bfb2f(0xb9)]];const _0x42b162=_0x29d9ce;throw new UnsupportedRunKindError(_0x42b162[_0x4bfb2f(_0x5f3868._0x583234)],this['name']);}[_0x25fe25(0xaf)](_0x5658cc){const _0x8f8202=_0x25fe25,_0x27789d={};if(_0x5658cc['headed'])_0x27789d[_0x8f8202(0xea)]='1';return _0x27789d;}[_0x25fe25(0xef)](){return['app-server'];}[_0x25fe25(0xf3)](){const _0x403619={_0x257e7d:0xed},_0x13bae6=_0x25fe25;return[_0x13bae6(_0x403619._0x257e7d),_0x13bae6(0xa2)];}async[_0x25fe25(0xf1)](_0x58549c){const _0x4562cf={_0x1ad4e4:0xdf},_0x455340=_0x25fe25;return runEnvironmentChecks({'cwd':_0x58549c[_0x455340(_0x4562cf._0x1ad4e4)]});}},webRunnerAdapter=new WebRunnerAdapter(),web_runner_adapter_default=webRunnerAdapter;function pickBin(_0x1e6698){const _0x2f2546={_0x5ceb13:0xf5,_0x5bd0ce:0xa0,_0x2c121f:0xf6},_0x2ceec6=_0x25fe25;if(typeof _0x1e6698['bin']===_0x2ceec6(_0x2f2546._0x5ceb13))return _0x1e6698['bin'];if(_0x1e6698[_0x2ceec6(0xa0)]&&typeof _0x1e6698[_0x2ceec6(_0x2f2546._0x5bd0ce)]===_0x2ceec6(0xec))return _0x1e6698[_0x2ceec6(0xa0)][_0x2ceec6(0xa9)]??Object[_0x2ceec6(_0x2f2546._0x2c121f)](_0x1e6698['bin'])[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};
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
status: stable
|
|
3
|
-
last_updated: 2026-
|
|
3
|
+
last_updated: 2026-09-03
|
|
4
4
|
---
|
|
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`.
|
|
@@ -309,6 +362,129 @@ effective `baseUrl`. A missing variable error also lists the searched
|
|
|
309
362
|
layers, and every CLI run prints a one-line header with the layers and
|
|
310
363
|
the effective baseUrl.
|
|
311
364
|
|
|
365
|
+
## Watching a collection run
|
|
366
|
+
|
|
367
|
+
An agent that starts `npx @unotest/web collection <name>` in the
|
|
368
|
+
background gets the CLI's per-scenario lines only when the process
|
|
369
|
+
ends — a piped stdout is block-buffered. The run's own journal is the
|
|
370
|
+
progress source, and it is written line by line as the run goes:
|
|
371
|
+
|
|
372
|
+
```
|
|
373
|
+
unotest/.runs/<yyyy>/<mm>/<dd>/col-<name>-<id>/steps.jsonl
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
`.runs` becomes `.runs.<env>` for a `--env <name>` run; the date shard
|
|
377
|
+
is UTC. `col-<name>-` is the collection run's id prefix and the `<id>`
|
|
378
|
+
tail is a timestamp plus random hex, so take the newest directory with
|
|
379
|
+
that prefix once the run has started.
|
|
380
|
+
|
|
381
|
+
The file holds one JSON object per line, four kinds:
|
|
382
|
+
|
|
383
|
+
| `kind` | Fields | When |
|
|
384
|
+
| --- | --- | --- |
|
|
385
|
+
| `collection-run:started` | `runId`, `collection`, `scenarios[]` (in order) | before the first scenario |
|
|
386
|
+
| `collection-run:scenario-started` | `scenario`, `scenarioRunId` | each scenario takes a worker |
|
|
387
|
+
| `collection-run:scenario-finished` | `scenario`, `scenarioRunId`, `outcome` | `completed` / `failed` / `aborted` / `interrupted` |
|
|
388
|
+
| `collection-run:finished` | `outcome` | the run is over — nothing follows |
|
|
389
|
+
|
|
390
|
+
Every line also carries `t` (epoch ms). `scenarioRunId` names the
|
|
391
|
+
scenario's own run directory under the same `.runs` root, where its
|
|
392
|
+
`steps.jsonl` and failure bundle live. A line that does not parse is the
|
|
393
|
+
one being written — retry on the next read, never treat it as the end.
|
|
394
|
+
|
|
395
|
+
```sh
|
|
396
|
+
tail -f unotest/.runs/2026/09/03/col-smoke-*/steps.jsonl \
|
|
397
|
+
| jq -c 'select(.kind | startswith("collection-run:scenario"))
|
|
398
|
+
| {kind, scenario, outcome}'
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
This shape is a published contract: the event types
|
|
402
|
+
(`CollectionRunArtifact`) and the file name (`STEPS_FILE`) are exported
|
|
403
|
+
from `@unotest/protocol` under semver, and the box daemon reads the same
|
|
404
|
+
events for its metrics.
|
|
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
|
+
|
|
312
488
|
## Debug logging
|
|
313
489
|
|
|
314
490
|
Set `UNOTEST_DEBUG=1` in `unotest/.env` and restart the MCP server to
|