@unotest/web 0.10.0 → 0.12.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 +11 -7
- package/.claude/skills/write-e2e-test-ground/SKILL.md +11 -7
- package/CHANGELOG.md +198 -0
- package/dist/config/schema.d.ts +55 -21
- package/dist/config/schema.js +1 -1
- package/dist/driver/index.d.ts +4 -2
- package/dist/driver/index.js +1 -1
- package/dist/dsl/index.d.ts +13 -2
- package/dist/dsl/index.js +1 -1
- package/dist/dsl/web-dsl-language-service.js +1 -1
- package/dist/inspection/page-inject.d.ts +1 -1
- package/dist/{interfaces-BxviHxnr.d.ts → interfaces-XvuefHHC.d.ts} +13 -0
- package/dist/mcp/server.js +1 -1
- package/dist/runner/cli.d.ts +11 -1
- package/dist/runner/cli.js +1 -1
- package/dist/runner/init/chrome-probe.js +1 -1
- package/dist/runner/init.js +1 -1
- package/dist/runner/install-chromium.js +1 -1
- package/dist/runner/prepare-fix.js +1 -1
- package/dist/runner/scaffold-workspace.js +1 -1
- package/dist/runner/serve-fixture.js +1 -1
- package/dist/runner/web-runner-adapter.js +1 -1
- package/guides/agent-integration.md +24 -0
- package/guides/dsl-reference.md +166 -20
- package/package.json +7 -44
- package/src/mcp/prompts/agent-test-author.md +12 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
const _0x359628=_0x1987;(function(_0x583a0a,_0xa33322){const _0x5614c7={_0x5e3e28:0x1eb,_0x3a7bab:0x202,_0x2f6f0c:0x1ee,_0xd32779:0x1f3},_0x87851d=_0x1987,_0x4eef28=_0x583a0a();while(!![]){try{const _0x485172=-parseInt(_0x87851d(0x1fd))/0x1*(-parseInt(_0x87851d(_0x5614c7._0x5e3e28))/0x2)+-parseInt(_0x87851d(0x1e7))/0x3+-parseInt(_0x87851d(_0x5614c7._0x3a7bab))/0x4*(parseInt(_0x87851d(0x1fa))/0x5)+parseInt(_0x87851d(_0x5614c7._0x2f6f0c))/0x6*(parseInt(_0x87851d(0x1ff))/0x7)+parseInt(_0x87851d(0x1f8))/0x8*(-parseInt(_0x87851d(_0x5614c7._0xd32779))/0x9)+-parseInt(_0x87851d(0x201))/0xa+-parseInt(_0x87851d(0x1f4))/0xb*(-parseInt(_0x87851d(0x1f2))/0xc);if(_0x485172===_0xa33322)break;else _0x4eef28['push'](_0x4eef28['shift']());}catch(_0x54ebd9){_0x4eef28['push'](_0x4eef28['shift']());}}}(_0x1dda,0x4b974));var __defProp=Object['defineProperty'],__name=(_0x3cb329,_0x176ad8)=>__defProp(_0x3cb329,_0x359628(0x1f5),{'value':_0x176ad8,'configurable':!![]});import{mkdir,writeFile}from'fs/promises';import{existsSync}from'fs';import{join}from'path';var templates={'scenarioTemplate':'//\x20Move\x20+\x20rename\x20this\x20file\x20to\x20<feature>/<your_name>.js\x20(e.g.\x0a//\x20auth/login.js)\x20and\x20the\x20function\x20below\x20to\x20test_<your_name>().\x20Scenarios\x20live\x0a//\x20in\x20feature\x20subfolders,\x20NOT\x20the\x20e2e\x20root\x20—\x20the\x20linter\x20(lint:scenario-in-root)\x0a//\x20rejects\x20a\x20test\x20file\x20placed\x20directly\x20in\x20unotest/e2e/.\x20The\x20loader\x20derives\x20the\x0a//\x20entry\x20name\x20from\x20the\x20file\x20basename\x20—\x20kebab-case\x20dashes\x20become\x20underscores.\x0a\x0a//\x20Every\x20executable\x20step\x20must\x20sit\x20inside\x20a\x20step(\x22...\x22,\x20()\x20=>\x20{\x20…\x20})\x20block.\x20The\x0a//\x20title\x20is\x20a\x20plain-English\x20description\x20of\x20the\x20group;\x20the\x20steps\x20inside\x20are\x0a//\x20the\x20implementation.\x20Group\x20by\x20intent\x20(Setup\x20/\x20Enter\x20/\x20Act\x20/\x20Assert\x20or\x0a//\x20whatever\x20reads\x20well)\x20—\x20one\x20block\x20per\x20logical\x20chunk.\x0a\x0afunction\x20test_your_name_here()\x20{\x0a\x20\x20step(\x22Seed\x20a\x20known\x20user\x20via\x20DB\x20/\x20API\x20fixtures\x20from\x20_helpers/\x22,\x20()\x20=>\x20{\x0a\x20\x20\x20\x20//\x20\x20\x20\x20wipe_e2e_users();\x0a\x20\x20\x20\x20//\x20\x20\x20\x20user_id\x20=\x20seed_user(\x27alice@example.com\x27,\x20\x27secret\x27);\x0a\x20\x20});\x0a\x0a\x20\x20step(\x22Sign\x20in\x20as\x20the\x20seeded\x20user\x22,\x20()\x20=>\x20{\x0a\x20\x20\x20\x20goto(\x27https://your-app.test/login\x27);\x0a\x20\x20\x20\x20//\x20\x20\x20\x20fill(getByLabel(\x27Email\x27),\x20\x27alice@example.com\x27);\x0a\x20\x20\x20\x20//\x20\x20\x20\x20fill(getByLabel(\x27Password\x27),\x20\x27secret\x27);\x0a\x20\x20\x20\x20//\x20\x20\x20\x20click(getByRole(\x27button\x27,\x20{name:\x20\x27Log\x20in\x27}));\x0a\x20\x20});\x0a\x0a\x20\x20step(\x22Assert\x20the\x20dashboard\x20shows\x20the\x20signed-in\x20user\x22,\x20()\x20=>\x20{\x0a\x20\x20\x20\x20//\x20\x20\x20\x20assertUrl(\x27/dashboard\x27);\x0a\x20\x20\x20\x20//\x20\x20\x20\x20assertText(getByRole(\x27heading\x27),\x20\x27Welcome,\x20Alice\x27);\x0a\x20\x20\x20\x20//\x20\x20\x20\x20count\x20=\x20dbQuery(\x27SELECT\x20count(*)\x20FROM\x20users\x20WHERE\x20active\x20=\x20true\x27);\x0a\x20\x20\x20\x20//\x20\x20\x20\x20assertTrue(count\x20>\x200,\x20\x27expected\x20at\x20least\x20one\x20active\x20user\x27);\x0a\x20\x20});\x0a}\x0a','agentsMd':_0x359628(0x1f0),'claudeMdBody':_0x359628(0x204),'examples':{'01-smoke.js':'//\x20Example\x2001\x20—\x20smoke:\x20navigate\x20+\x20click\x20+\x20URL\x20assertion.\x0a//\x0a//\x20The\x20minimal\x20three-step\x20pattern.\x20Hits\x20playground.unotest.com\x20so\x20no\x20project\x0a//\x20setup\x20is\x20needed.\x20Run\x20with:\x20\x20npx\x20@unotest/web\x20e2e\x20examples/01-smoke\x0a\x0afunction\x20test_smoke_playground()\x20{\x0a\x20\x20step(\x22Open\x20the\x20Big\x20Table\x20scenario\x20from\x20the\x20playground\x20index\x22,\x20()\x20=>\x20{\x0a\x20\x20\x20\x20goto(\x27/\x27);\x0a\x20\x20\x20\x20click(getByRole(\x27link\x27,\x20{name:\x20\x27Big\x20Table\x27,\x20exact:\x20true}));\x0a\x20\x20\x20\x20assertUrl(\x27/scenarios/big-table\x27);\x0a\x20\x20});\x0a}\x0a','02-form-fill.js':_0x359628(0x200)},'secretsExample':'#\x20unotest-web\x20—\x20secret\x20scenario\x20variables.\x20Created\x20by\x20`init`,\x20gitignored.\x0a#\x0a#\x20Same\x20KEY=VALUE\x20format\x20as\x20unotest/.env,\x20but\x20values\x20here\x20are\x20treated\x20as\x0a#\x20SECRET:\x20they\x20are\x20masked\x20(shown\x20as\x20`‹secret:KEY›`)\x20anywhere\x20the\x20runner\x20or\x0a#\x20MCP\x20debug\x20log\x20would\x20otherwise\x20write\x20them\x20—\x20fill()\x20values,\x20URLs,\x20evaluate\x0a#\x20strings.\x20Reference\x20them\x20in\x20a\x20scenario\x20by\x20their\x20bare\x20UPPER_SNAKE\x20name,\x20the\x0a#\x20same\x20way\x20as\x20.env\x20variables:\x0a#\x0a#\x20\x20\x20fill(getByLabel(\x27Password\x27),\x20PASSWORD);\x0a#\x0a#\x20Secrets\x20are\x20NOT\x20exported\x20to\x20subprocesses\x20(shell())\x20—\x20they\x20stay\x20in\x20the\x0a#\x20variable\x20store.\x20Put\x20non-secret\x20values\x20(URLs,\x20emails,\x20ids)\x20in\x20unotest/.env.\x0a#\x0a#\x20FLEET_EXAMPLE\x0aLOGIN=\x0aPASSWORD=\x0aTOKEN=\x0a','envExample':_0x359628(0x1fe)};function unotestConfigMjs(_0x3fe31c){const _0x58972a={_0xf5ad89:0x1ef,_0x5ae6de:0x1e9},_0x49605b=_0x359628,_0x25fb1c=_0x3fe31c===void 0x0?_0x49605b(_0x58972a._0xf5ad89):'\x20\x20channel:\x20'+JSON[_0x49605b(0x1f1)](_0x3fe31c)+',';return'//\x20@unotest/web\x20project\x20config.\x20All\x20fields\x20are\x20optional\x20—\x20defaults\x20apply\x0a//\x20when\x20omitted.\x0a//\x0a//\x20Saved\x20as\x20.mjs\x20so\x20the\x20runtime\x20loads\x20it\x20as\x20ESM\x20regardless\x20of\x20the\x20project\x27s\x0a//\x20package.json\x20\x22type\x22\x20field.\x20For\x20IDE\x20autocomplete,\x20type-import\x20the\x20schema:\x0a//\x0a//\x20\x20\x20/**\x20@type\x20{Partial<import(\x27@unotest/web\x27).UnotestConfig>}\x20*/\x0a//\x20\x20\x20export\x20default\x20{\x20baseUrl:\x20\x27https://your-app.test\x27\x20};\x0a\x0a/**\x20@type\x20{Partial<import(\x27@unotest/web\x27).UnotestConfig>}\x20*/\x0aexport\x20default\x20{\x0a\x20\x20//\x20baseUrl:\x20\x27https://your-app.test\x27,\x0a\x20\x20//\x20browsers:\x20[\x27chromium\x27,\x20\x27firefox\x27,\x20\x27webkit\x27],\x20\x20//\x20CI\x20override\x0a\x20\x20//\x20viewport:\x20{\x20width:\x201280,\x20height:\x20720\x20},\x0a\x20\x20//\x20retry:\x20{\x20count:\x201,\x20on:\x20[\x27transient\x27]\x20},\x20\x20\x20\x20\x20\x20\x20\x20//\x20CI\x20override\x0a\x20\x20//\x20storageState:\x20\x27.unotest/cache/auth.json\x27,\x20\x20\x20\x20\x20\x20//\x20see\x20helpers\x0a'+_0x25fb1c+_0x49605b(_0x58972a._0x5ae6de);}function _0x1987(_0xc68abd,_0x4cf71c){_0xc68abd=_0xc68abd-0x1e7;const _0x1dda49=_0x1dda();let _0x198715=_0x1dda49[_0xc68abd];if(_0x1987['SCphKi']===undefined){var _0x1af656=function(_0x27b556){const _0x191e5d='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x3cb329='',_0x176ad8='';for(let _0x3fe31c=0x0,_0x25fb1c,_0x12cfc2,_0xe6a663=0x0;_0x12cfc2=_0x27b556['charAt'](_0xe6a663++);~_0x12cfc2&&(_0x25fb1c=_0x3fe31c%0x4?_0x25fb1c*0x40+_0x12cfc2:_0x12cfc2,_0x3fe31c++%0x4)?_0x3cb329+=String['fromCharCode'](0xff&_0x25fb1c>>(-0x2*_0x3fe31c&0x6)):0x0){_0x12cfc2=_0x191e5d['indexOf'](_0x12cfc2);}for(let _0x2901ee=0x0,_0x44d515=_0x3cb329['length'];_0x2901ee<_0x44d515;_0x2901ee++){_0x176ad8+='%'+('00'+_0x3cb329['charCodeAt'](_0x2901ee)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x176ad8);};_0x1987['XExIzL']=_0x1af656,_0x1987['Awgbul']={},_0x1987['SCphKi']=!![];}const _0xb6ba43=_0x1dda49[0x0],_0x56a8bc=_0xc68abd+_0xb6ba43,_0x161460=_0x1987['Awgbul'][_0x56a8bc];return!_0x161460?(_0x198715=_0x1987['XExIzL'](_0x198715),_0x1987['Awgbul'][_0x56a8bc]=_0x198715):_0x198715=_0x161460,_0x198715;}__name(unotestConfigMjs,_0x359628(0x203));async function scaffoldWorkspace(_0x12cfc2,_0xe6a663={}){const _0x188de6={_0x381f5a:0x1fb,_0x57068d:0x1fb,_0x1befa6:0x1f9,_0x11c1a3:0x1fb,_0x282aa2:0x1ed,_0x23eeec:0x1fc},_0x4c24d5=_0x359628,_0x2901ee=[],_0x44d515=[];await mkdir(join(_0x12cfc2,_0x4c24d5(0x1f9),_0x4c24d5(_0x188de6._0x381f5a),_0x4c24d5(0x1f6)),{'recursive':!![]}),await mkdir(join(_0x12cfc2,_0x4c24d5(0x1f9),_0x4c24d5(_0x188de6._0x57068d),'_helpers'),{'recursive':!![]});const _0x5e19bf=[{'rel':'unotest.config.mjs','content':unotestConfigMjs(_0xe6a663[_0x4c24d5(0x1e8)])},{'rel':join(_0x4c24d5(_0x188de6._0x1befa6),_0x4c24d5(0x1ea)),'content':templates[_0x4c24d5(0x1ec)]},{'rel':join('unotest',_0x4c24d5(_0x188de6._0x11c1a3),_0x4c24d5(0x1f6),'01-smoke.js'),'content':templates['examples'][_0x4c24d5(_0x188de6._0x282aa2)]}];for(const {rel:_0x2f05f3,content:_0x2d8864}of _0x5e19bf){const _0x5e6217=join(_0x12cfc2,_0x2f05f3);if(existsSync(_0x5e6217)){_0x44d515[_0x4c24d5(_0x188de6._0x23eeec)](_0x2f05f3);continue;}await writeFile(_0x5e6217,_0x2d8864),_0x2901ee[_0x4c24d5(_0x188de6._0x23eeec)](_0x2f05f3);}return{'projectRoot':_0x12cfc2,'created':_0x2901ee,'skipped':_0x44d515};}__name(scaffoldWorkspace,_0x359628(0x1f7));export{scaffoldWorkspace};function _0x1dda(){const _0x4c00c8=['Dw5VDgvZDa','mteWuwH0Cuv6','ztjL','ChvZAa','mJe1ouXNCfzvvG','iYb1BM90zxn0lxDLyIdIGjqGy29WAwvKihrVihvUB3rLC3qVlMvUDIbIEsbGAw5PDgaGAwyGBM90ihbYzxnLBNqUcImkiYbgAwXSigLUihzHBhvLCYb0Agf0igfWCgX5ihrVihLVDxiGChjVAMvJDc4GvMfYAwfIBgvZigfYzsbSB2fKzwqGyNKGDgHLcImGCNvUBMvYigf0ihnJzw5HCMLVihn0yxj0lGOJcImGuMvMzxjLBMnLigfUEsb2yxjPywjSzsbMCM9TigeGC2nLBMfYAw8GyNKGAxrZigjHCMuGvvbqrvjFu05bs0uGBMfTzsdIGjqkiYbUBYbLBNyOks9ZzwnYzxqOksb3CMfWCgvYoGOJcImGicbNB3rVkcCVBg9NAw4NktSGicaGicaGicaGicaGicaGicaGicaGicaGicmGCMvSyxrPDMuG4OcuihnLzsbbufbFqKftrv9vuKWkiYaGigzPBgWOz2v0qNLmywjLBcGNrw1HAwWNksWGvevtvf9vu0vsx0vnquLmktSkiWOJifnLy3jLDcb2ywX1zxmGkhbHC3n3B3jKCYWGDg9Rzw5ZksbNBYbPBIb1BM90zxn0lY5ZzwnYzxrZigLUC3rLywqG4OcuihnHBwukiYbMB3jTyxqSigj1DcbTyxnRzwqGAw4GzxzLCNKGBg9NlIbbBIb1BMTUB3DUifvquevsx1noquTfig5HBwuGzMfPBhmGDgHLcImGCNvUihDPDgGGysbJBgvHCIaIywrKigL0ihrVihvUB3rLC3qVlMvUDIiGBwvZC2fNzs4kiWOJievUDMLYB25Tzw50CZOGB3zLCNjPzguGyw55ihzHBhvLihbLCIbLBNzPCM9UBwvUDcb3AxrOig92zxjSyxKGzMLSzxmG4OcucImGDw5VDgvZDc8Uzw52lNn0ywDPBMCSihvUB3rLC3qVlMvUDI5WCM9KDwn0Aw9UicHZzwnYzxrZoIaUC2vJCMv0CY48zw52pIKUcImGu2vSzwn0ig9UztOGyg5WEcbaDw5VDgvZDc93zwiGztjLidXUyw1LpIaTlwvUDIbZDgfNAw5Nyc4GvgHLig92zxjSyxKGBgf5zxjZcImGB3zLCIb0AgLZigjHC2uGzMLSzsaOB3zLCMXHEsb3Aw5ZktSGDgHLihnOzwXSigvUDMLYB25Tzw50ihDPBNmGB3zLCIbIB3rOlGOkiYaTls0GqxbWihvUzgvYihrLC3qGls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0kiYbuAguGyxbWj3mGyMfZzsbvuKWUifjLBgf0AxzLigDVDg8OjY9WyxrOjYKGCMvZB2X2zxmGywDHAw5ZDcbPDcaOD2LYzwqGAw50BWOJifbSyxL3CMLNAhqNCYbIyxnLvvjmigf1Dg9TyxrPy2fSBhKPlcbZBYb3CML0zsbNB3rVkcCVBg9NAw4NksdIGjqGBMv2zxikiYbNB3rVkefquf9cqvnfx1vstcaRicCVBg9NAw4Nks4GqwXZBYb1C2vKigzVCIbHC3nLCNrvCMWGC3vIC3rYAw5Nig1HDgnOAw5NlGOJierLzMf1BhrZihrVihrOzsb1BM90zxn0ihbSyxLNCM91BMqGC28GDgHLigv4yw1WBguGC2nLBMfYAw9Zihj1BIbVDxqGB2yGDgHLcImGyM94oYbWB2LUDcbPDcbHDcb5B3vYig93BIbHChaUcKfquf9cqvnfx1vstd1ODhrWCZOVl3bSyxLNCM91BMqUDw5VDgvZDc5JB20kcImGls0TierHDgfIyxnLic0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0TcImGvxnLzcbIEsbKyLf1zxj5ic8GzgjfEgvJlIbjBNn0ywXSihrOzsbTyxrJAgLUzYbKCML2zxiGyxmGysbWzwvYlwrLCdOkiYaGihbUCg0GywrKic1eihbNieb0ExbLCY9WzYaGicaGicaGicaJigzVCIbWB3n0z3jLC3fSoI8VcImGicbWBNbTigfKzcaTrcbTExnXBdiGicaGicaGicaGicaGicaGiYbMB3iGBxLZCwW6lY8kiYaOu1fmAxrLihzPysbIzxr0zxiTC3fSAxrLmYdIGjqGAw5ZDgfSBcbVBMX5igLMig5LzwrLzc4PcKrbvefcqvnfx1vstd1WB3n0z3jLC3fSoI8VCg9ZDgDYzxm6Cg9ZDgDYzxnaBg9JywXOB3n0oJu0mZiVBxLHChbFDgvZDaOkiYaTls0GrxH0CMeGqvbjigHVC3rZic0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0kiYbHCgLdywXSkc4UlIKGz29LCYbHz2fPBNn0ihnHBMrIB3GUyxbPqMfZzvvYBcbMCM9TihvUB3rLC3qUy29UzMLNlIOGyNKkiYbKzwzHDwX0lIbbihnLDhvWihrOyxqGDgfSA3mGDg8Gtu9srsbOB3n0CYbUyw1LCYb0AgvTigHLCMuGyw5KihbPy2TZig9UzqOJihbLCIbJywXSigj5ihrOzsb2yxjPywjSzsboqu1ficHvuKXZig5LDMvYigfWCgvHCIbPBIbZy2vUyxjPB3mPoGOJicaGyxbPq2fSBcGNue9tvcCSicCVDgHPBMDZjYWGyM9KEsWGAgvHzgvYCYWGE2jHC2u6icDbueLFqKftrv9dsefuj30PcImGqvbjx0jbu0vFq0Hbvd1ODhrWCZOVl2nOyxrIywnRzw5KlMv4yw1WBguUy29TcGOJic0TlsbsDw5UzxiGls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0kiYbtAg93ihrOzsbICM93C2vYihDPBMrVDYbKDxjPBMCGCNvUCYaOzgvMyxvSDdOGAgvHzgXLC3mPlGOJifvot1rfu1rFsevbreveptekiYbtBg93igvHy2GGugXHExDYAwDODcbVCcbIEsboig1ZicHKzwzHDwX0oIaWks4GugfPCNmGD2L0AcbiruferuqGzM9YcImGD2f0y2HPBMCGDgHLigfNzw50igf0ihDVCMSUcImGvu5pvevtvf9tte9xx01ppteWmaOJiejYB3DZzxiGDxnLzcbIEsb0AguGq0XjicHJAhjVBwL1Bsb8igzPCMvMB3GGFcb3zwjRAxqPlIbezwzHDwX0oIbJAhjVBwL1Bs4kiYbvtK9urvnux0jst1Dtrvi9y2HYB21PDw0kiYbezwzHDwX0igfJDgLVBIb0Aw1LB3v0igLUig1PBgXPC2vJB25KCYdIGjqGyxbWBgLLzcb0BYbLDMvYEsbJBgLJAYaVcImGzMLSBcaVihDHAxrgB3iGlYbLDgmUihzPysbqBgf5D3jPz2H0j3mGC2v0rgvMyxvSDfrPBwvVDxqUierLzMf1BhqGmZaWmc4kiYbcDw1WigLMihLVDxiGyxbWigLZihnSB3C7ihbLCI1Hy3rPB24GB3zLCNjPzguGDMLHihrOzsbHy3rPB24NCWOJig9WDgLVBNmUDgLTzw91Dc4GugXHExDYAwDODcDZihn0B2nRidmWmdaWihn0CMfUzhmGAw50zxjHy3rPDMuGywDLBNrZlGOJifvot1rfu1rFrevgqvvmvf9usu1ft1vux01tptmWmdakiYbezwzHDwX0ig5HDMLNyxrPB24GDgLTzw91DcbPBIbTAwXSAxnLy29UzhmG4OcuigfWCgXPzwqGDg8Gz290BYaVihjLBg9HzcaVcImGD2fPDezVCLvYBcWGy2XPy2SNCYbWB3n0lwfJDgLVBIbUyxzPz2f0Aw9UihDHAxqSieforcbZzxrqywDLj3mGD2fPDcbMB3iGyqOJig5LD2X5ig9Wzw5Lzcb0ywiGDg8GyxbWzwfYicSGBg9Hzc4GuMvHBc13B3jSzcbWywDLCYbYB3v0Aw5LBhKGDgfRzsa14OctmtvZcImGDg8GzMLYzsaNBg9HzcC7igTLzxaGDgHPCYbZzxbHCMf0zsbMCM9TihrOzsbHy3rPB24GDgLTzw91DcbHyM92zs4kvu5pvevtvf9eruzbvuXux05bvKLhqvrjt05FveLnru9vvf9nuZ0XntaWmaOkiYbqzxiTCNvUihDHBgWTy2XVy2SGyNvKz2v0igLUig1PBgXPC2vJB25KCYdIGjqGysbYDw4GywjVCNrZig9Uy2uGAxqGzxHJzwvKCWOJihrOAxmUieD1yxjKCYbHz2fPBNn0igeGC3r1y2SGC2nLBMfYAw8GAgfUz2LUzYb0AguGywDLBNqGAw5KzwzPBML0zwX5lGOJieLUDMfSAwqGB3iGBM9UlxbVC2L0AxzLihzHBhvLCYbMywXSigjHy2SGDg8GDgHLigrLzMf1BhqUierLzMf1BhqGmZaWmdaWlGOJifvot1rfu1rFtufyx0rvuKfusu9ox01tptmWmdaWmaOkiYaTls0Gtg9JywXLicSGDgLTzxPVBMuGls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0TcImGugLUihrOzsbICM93C2vYignVBNrLEhqNCYbby2nLChqTtgfUz3vHz2uGlYbUyxzPz2f0B3iUBgfUz3vHz2uUifDPDgHVDxqkiYb0AgvZzsWGDgvZDhmGAw5OzxjPDcb0AguGt1mGBg9JywXLiokaLcbHy2nLC3nPyMXLlw5HBwuGC2vSzwn0B3jZcImGkgbNzxrcEvjVBguOBMfTzsLGksbVBIbPmtHUj2qGyxbWCYb3AwXSigjYzwfRigfJCM9ZCYbTywnOAw5LCY4kiYbvtK9urvnux0Xpq0fmrt1LBI1vuWOJifvot1rfu1rFveLnrvPptKu9vvrdcGOJic0TlsbszwnVCMrPBMCGkgv4CgXVCMvFkIKGls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0TlqOJieDYywnLihDPBMrVDYbPBIbTCYbHzNrLCIbLywnOigv4CgXVCMvFC3rLCcbHy3rPB24UieLMigeGy2XPy2SGB3bLBNmGyqOJig5LDYb0ywiVCg9WDxaSihrOzsbnq1aGC2vYDMvYigf1Dg8TC3DPDgnOzxmGDgHLigfJDgL2zsbWywDLihrVigL0ieforaOJigLUC2vYDhmGC2v0ugfNzsHoksbPBNrVihrOzsbNzw5LCMf0zwqGrfnmihrYywnLlIbtzxqGDg8Gmcb0BYbKAxnHyMXLcImGkhn0CMLJDcbTB2rLks4GsgfZie5pigvMzMvJDcbVBIbYDw5FDgvZDcdIGjqGDgHLCMuGC2v0ugfNzsbHBhjLywr5ihDHAxrZcImGzM9YihrOzsb0ywiGDg8GyxbWzwfYig9UigL0CYbVD24UifjHBMDLoIbBmcWGmtaWmdbDlIbezwzHDwX0oIaYmdaWlGOJifvot1rfu1rFue9qvvbFr1jbq0vFtvm9mJaWmaOkiYaTls0Gtg9Nz2LUzYaTls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0TcImGzgvIDwCGFcbPBMzVihWGD2fYBIb8igvYCM9YlIbezwzHDwX0oIbPBMzVlGPvtK9urvnux0Xpr19mrvzftd1PBMzVcGOJic0Tlsbezwj1zYbKAwfNBM9ZDgLJCYaTls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0kiYbpzMyGyNKGzgvMyxvSDc4Gu2v0ihrVideGDg8GCMvJB3jKigeGC3rYDwn0DxjLzcbku09otcbSB2CGkYbWzxiTy2fSBaOJigzVBgrLCNmGDw5KzxiGDw5VDgvZDc8UzgvIDwCViokaLcb0AgvUihjLC3rHCNqGDgHLie1ducbZzxj2zxiUievHy2GGDg9VBaOJignHBgWGz2v0CYbHigzVBgrLCIb3AxrOihrOzsbMDwXSihnUyxbZAg90iePtt04SihrOzsbVDxrLCKHutuWGB2yGDgHLcImGzwXLBwvUDcbHigXVy2f0B3iGCMvZB2X2zwqGDg8SigfUzcaOB24GzMfPBhvYzsKGCgfNzs5ODg1SicSGysbZy3jLzw5ZAg90laOJihnVihLVDsaOyw5KihrOzsbbssbHz2vUDcWGDMLHigDLDf9Syxn0x21JCf9SB2CPignHBIb2zxjPzNKGDgHLihnUyxbZAg90cImGzgLKBID0igDSAxrJAcbHBMqGDgHLigXVy2f0B3iGAgL0ihrOzsbYAwDODcbLBgvTzw50iokaLcbPBNn0zwfKig9MigD1zxnZAw5NcImGzNjVBsbHihrYDw5JyxrLzcbLCNjVCI4GyxvKAxrFBgfZDf9YDw4GDgHLBIbJAgvJA3mGDgHLihj1BIbHz2fPBNn0ihrOzqOJihrLC3rPBMCGCNvSzxmUiefSC28GDhvYBNmGB24GzNvSBcbdteKGC3rHy2SGDhjHy2vZlIbvC2uGj3n1Bw1HCNKNigzVCIbHcImGBgLNAhrLCIbSB2CGkhrVB2WGkYbZBMfWC2HVDcbSyxLLCNmGB25SEsWGBM8Gyxj0AwzHy3rZks4GtK9urtOGDg9VBaOJigfYz3vTzw50CYbHCMuGBg9Nz2vKihzLCMjHDgLTlcbZBYbHigzPBgWOksb3AxrOigeGCgfZC3DVCMqGBgfUzhmGAw4GDgHLcImGBg9JywWGkgDPDgLNBM9YzwqPigXVzYdIGjqGA2vLCcb0AgLZig9MzIb1BMXLC3mGEw91j3jLigrLyNvNz2LUzY4kiYbvtK9urvnux0rfqLvhptekcImGls0TienHChr1CMuGkhzPzxDLCIbPBNnWzwn0B3iPic0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0TlqOJifjLy29Yzcb0AguGyNjVD3nLCIbJB25ZB2XLicSGBMv0D29YAYbYzxf1zxn0CYbPBNrVigvHy2GGCNvUj3mGzgLYihnVihrOzqOJihzPzxDLCIDZienVBNnVBguGlYbozxr3B3jRigLUC3bLy3rVCIb0ywjZigfYzsbWB3b1Bgf0zwqUifnLDcb0BYaWihrVigrPC2fIBguUcLvot1rfu1rFtKvuv09ssZ0XcLvot1rfu1rFq09ou09mrt0XcG','mtK5nZG3wvnHtLjN','lY8GrxHHBxbSzsaWmIdIGjqGzMLSBcbHBIbPBNb1DcaRigfZC2vYDcb0AguGyxbWihjLywn0zwqUcI8VcI8ViefNywLUC3qGCgXHEwDYB3vUzc51BM90zxn0lMnVBs9Zy2vUyxjPB3mVyMLNlxrHyMXLlIbezw1VBNn0CMf0zxmGz2v0qNLsB2XLcI8VigzVCIbHigXHyMvSBgvKigLUChv0lcb0ExbLzcbPBNb1Dcb2AweGzMLSBcGPlcbHBMqGysbSB2nHDg9Yig1LDgHVzc1JAgfPBGOVlYaOz2v0qNLsB2XLkcDYB3CNks5MAwX0zxiOE2HHC1rLEhr9ks5MAxjZDcGPksbPBIbHBIbHC3nLCNrPB24UcI8Vifj1BIb3AxrOoIaGBNb4ieb1BM90zxn0l3DLyIbLmMuGzxHHBxbSzxmVmdiTzM9YBs1MAwXScGPMDw5JDgLVBIb0zxn0x2zVCM1FzMLSBf9OyxbWEv9WyxrOkcKGEWOGihn0zxaOiKzPBhrLCIb0AguGqMLNifrHyMXLigj5igeGBMfTzsiSicGPid0+ihSkicaGigDVDg8OjY9Zy2vUyxjPB3mVyMLNlxrHyMXLjYK7cIaGicbMAwXSkgDLDej5uM9SzsGNDgv4DgjVEcCSihTUyw1LoIaNrMLSDgvYigj5ig5HBwuNFsKSicDvBweGuxvPBM4NktSkicb9ktSkcIaGC3rLCcGIrMLSDgvYAw5NihjLDMvHBhmGDgHLienSzwfYigzPBhrLCIbJB250CM9SigfUzcbTyxrJAgLUzYbYB3DZiIWGkcKGpt4GEWOGicaGyxnZzxj0vMLZAwjSzsHNzxrcEvjVBguOj2j1DhrVBICSihTUyw1LoIaNq2XLyxiGzMLSDgvYj30PktSkicaGigfZC2vYDfzPC2LIBguOz2v0qNLsB2XLkcDYB3CNks5MAwX0zxiOE2HHC1rLEhq6icDvBweGuxvPBM4NFsKUzMLYC3qOksK7cIaGFsK7cN0k','ntyZnJG0mhfwwhHIDG','mteXnte2yNvyvLbP','Dw5VDgvZDenVBMzPz01QCW','iYmGrtjfihrLC3rPBMCGD2L0AcbaDw5VDgvZDc93zwikcKbbr0vovfmUBwqkcKzVCIbHBNKGCMvXDwvZDcb0BYb3CML0zsWGCMvJB3jKlcbVCIbYDw4Gyw4Gzw5KlxrVlwvUzcb0zxn0lcbVCgvUihrOzqPGD3jPDguTztjLlxrLC3rGihnRAwXSicHVCIbYDw4Gyc93CML0zs1LmMuTDgvZDgaPigfUzcbKCML2zsb0AguGyNjVD3nLCIb0AhjVDwDOcNrOzsbGDw5VDgvZDc13zwjGie1ducb0B29SCYaOyg5LD19JB250zxH0ycdIHPiGygv4CgXVCMvFC3rLCgaG4OAsigbNzxrFCgfNzv9ZBMfWC2HVDgak4OAsigbYDw5FDgvZDgaPlIbeBYbUB3qGAgfUzc1HDxrOB3iGDgvZDhmGyMXPBMqGB3iGBwfWihrOzsbWCM9Qzwn0ihDPDgGkygzPBMrGl2bSC2aVygf3A2aG4OcuihrOzsbZA2LSBcDZifbOyxnLidaGBgLZDhmGDgHLigzPBgvZihrVihjLywqU','mJqZnJuXz1LPzMHz','y2HHBM5LBa','cIaGlY8GDMLLD2vYoIb7cIaGlY8GicbWB3j0oIa1mtCZlcaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGic8VigrLzMf1Bhq6ihjHBMrVBsbMCMvLihbVCNqkicaVlYaGigjYB3DZzxi6ihrYDwuSicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGlY8GzgvMyxvSDdOGDhj1zsaOyxv0BY1VCgvUig9Uigb2Awv3zxjGkqOGic8Vih0ScN07cG','lMvUDG','mJKYzKHtDK1g','zw52rxHHBxbSzq','mdeTC21VA2uUANm','mti2C05Vzg1P','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','C3rYAw5NAwz5','mZzKwwHADuW','mZy3mtG4m3fbDvbfvG','mZG5mtmYn2jTuNjlrW','BMfTzq','zxHHBxbSzxm','C2nHzMzVBgrxB3jRC3bHy2u','oeT6A3zptG'];_0x1dda=function(){return _0x4c00c8;};return _0x1dda();}
|
|
1
|
+
const _0x192e23=_0x1a6c;function _0x1c08(){const _0x54167b=['ChvZAa','lMvUDG','nLbPBwHOAq','iYmGrtjfihrLC3rPBMCGD2L0AcbaDw5VDgvZDc93zwikcKbbr0vovfmUBwqkcKzVCIbHBNKGCMvXDwvZDcb0BYb3CML0zsWGCMvJB3jKlcbVCIbYDw4Gyw4Gzw5KlxrVlwvUzcb0zxn0lcbVCgvUihrOzqPGD3jPDguTztjLlxrLC3rGihnRAwXSicHVCIbYDw4Gyc93CML0zs1LmMuTDgvZDgaPigfUzcbKCML2zsb0AguGyNjVD3nLCIb0AhjVDwDOcNrOzsbGDw5VDgvZDc13zwjGie1ducb0B29SCYaOyg5LD19JB250zxH0ycdIHPiGygv4CgXVCMvFC3rLCgaG4OAsigbNzxrFCgfNzv9ZBMfWC2HVDgak4OAsigbYDw5FDgvZDgaPlIbeBYbUB3qGAgfUzc1HDxrOB3iGDgvZDhmGyMXPBMqGB3iGBwfWihrOzsbWCM9Qzwn0ihDPDgGkygzPBMrGl2bSC2aVygf3A2aG4OcuihrOzsbZA2LSBcDZifbOyxnLidaGBgLZDhmGDgHLigzPBgvZihrVihjLywqU','y2HHBM5LBa','cIaGlY8GDMLLD2vYoIb7cIaGlY8GicbWB3j0oIa1mtCZlcaGicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGic8VigrLzMf1Bhq6ihjHBMrVBsbMCMvLihbVCNqkicaVlYaGigjYB3DZzxi6ihrYDwuSicaGicaGicaGicaGicaGicaGicaGicaGicaGicaGlY8GzgvMyxvSDdOGDhj1zsaOyxv0BY1VCgvUig9Uigb2Awv3zxjGkqOGic8Vih0ScN07cG','ndCZmhr1wLHpra','Dw5VDgvZDenVBMzPz01QCW','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','mtvZrLDeuuy','zxHHBxbSzxm','lY8GqhvUB3rLC3qVD2vIihbYB2PLy3qGy29UzMLNlIbbBgWGzMLLBgrZigfYzsbVChrPB25HBcdIGjqGzgvMyxvSDhmGyxbWBhKklY8GD2HLBIbVBwL0DgvKlGOVlWOVlYbtyxzLzcbHCYaUBwPZihnVihrOzsbYDw50Aw1LigXVywrZigL0igfZievttsbYzwDHCMrSzxnZig9MihrOzsbWCM9Qzwn0j3mklY8GCgfJA2fNzs5QC29Uicj0ExbLiIbMAwvSzc4GrM9YieLersbHDxrVy29TCgXLDguSihr5CguTAw1WB3j0ihrOzsbZy2HLBwe6cI8VcI8VicaGlYOQieb0ExbLihTqyxj0AwfSpgLTCg9YDcGNqhvUB3rLC3qVD2vIjYKUvw5VDgvZDenVBMzPzZ59icOVcI8VicaGzxHWB3j0igrLzMf1BhqGEYbIyxnLvxjSoIaNAhr0Chm6lY95B3vYlwfWCc50zxn0jYb9oWOklYOQieb0ExbLihTqyxj0AwfSpgLTCg9YDcGNqhvUB3rLC3qVD2vIjYKUvw5VDgvZDenVBMzPzZ59icOVcMv4Cg9YDcbKzwzHDwX0ihSkicaVlYbIyxnLvxjSoIaNAhr0Chm6lY95B3vYlwfWCc50zxn0jYWkicaVlYbICM93C2vYCZOGwYDJAhjVBwL1BsCSicDMAxjLzM94jYWGj3DLyMTPDcDDlcaGlY8Gq0KGB3zLCNjPzgukicaVlYb2Awv3Cg9YDdOGEYb3Awr0AdOGmti4mcWGAgvPz2H0oIa3mJaGFsWkicaVlYbYzxrYEtOGEYbJB3vUDdOGmsWGB246ifSNDhjHBNnPzw50j10GFsWGicaGicaGic8Vienjig92zxjYAwrLcIaGlY8GC3rVCMfNzvn0yxrLoIaNlNvUB3rLC3qVy2fJAguVyxv0Ac5QC29UjYWGicaGicaVlYbZzwuGAgvSCgvYCWO','odi5nZG1ve94suvs','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','mte3mdHXvMnszxm','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','mZe4zLfKsfHH','mZi0oxjur3PJDG','icaVlYbJAgfUBMvSoIaNy2HYB21LjYWGicaGicaGicaGicaGicaGicaGicaGicaGicaGlY8Gj2nOCM9TzsCGlYaNBxnLzgDLjYaVig51BgWGkgj1BMrSzwqP','ztjL','mJC2nZCYmfD3r1bbDW','mdeTC21VA2uUANm','mJuXmZyZn3f2CMLTvq','mJGXmhbyuhrrvG','Dw5VDgvZDa','x2HLBhbLCNm','zw52rxHHBxbSzq','icbJAgfUBMvSoIa','mte0otKXmtr3vKXYsKK','zgvMAw5LuhjVCgvYDhK','lY8GrxHHBxbSzsaWmsdIGjqGC21VA2u6ig5HDMLNyxrLicSGy2XPy2SGkYbvuKWGyxnZzxj0Aw9UlGOVlWOVlYbuAguGBwLUAw1HBcb0AhjLzs1ZDgvWihbHDhrLCM4UieHPDhmGCgXHEwDYB3vUzc51BM90zxn0lMnVBsbZBYbUBYbWCM9Qzwn0cI8VihnLDhvWigLZig5LzwrLzc4GuNvUihDPDgG6icbUChGGqhvUB3rLC3qVD2vIiguYzsbLEgfTCgXLCY8Wms1ZBw9RzqOkzNvUy3rPB24GDgvZDf9ZBw9Rzv9WBgf5z3jVDw5KkcKGEWOGihn0zxaOiK9Wzw4GDgHLiejPzYbuywjSzsbZy2vUyxjPBYbMCM9TihrOzsbWBgf5z3jVDw5KigLUzgv4iIWGkcKGpt4GEWOGicaGz290BYGNlYCPoWOGicaGy2XPy2SOz2v0qNLsB2XLkcDSAw5RjYWGE25HBwu6icDcAwCGvgfIBguNlcbLEgfJDdOGDhj1zx0PktSkicaGigfZC2vYDfvYBcGNl3nJzw5HCMLVCY9IAwCTDgfIBguNktSkicb9ktSkFqO'];_0x1c08=function(){return _0x54167b;};return _0x1c08();}(function(_0x198967,_0x2c9038){const _0x1a1d09={_0x518861:0x141,_0xcb8264:0x13f,_0x333c4d:0x15d,_0x3b9872:0x152,_0x9a1f54:0x145,_0xe7b6b2:0x14d},_0x52033e=_0x1a6c,_0x531273=_0x198967();while(!![]){try{const _0x2cd4c7=parseInt(_0x52033e(0x148))/0x1*(-parseInt(_0x52033e(_0x1a1d09._0x518861))/0x2)+parseInt(_0x52033e(0x15a))/0x3*(parseInt(_0x52033e(_0x1a1d09._0xcb8264))/0x4)+-parseInt(_0x52033e(_0x1a1d09._0x333c4d))/0x5*(parseInt(_0x52033e(_0x1a1d09._0x3b9872))/0x6)+-parseInt(_0x52033e(0x147))/0x7+parseInt(_0x52033e(_0x1a1d09._0x9a1f54))/0x8+parseInt(_0x52033e(0x142))/0x9*(-parseInt(_0x52033e(0x156))/0xa)+parseInt(_0x52033e(_0x1a1d09._0xe7b6b2))/0xb;if(_0x2cd4c7===_0x2c9038)break;else _0x531273['push'](_0x531273['shift']());}catch(_0x1327ac){_0x531273['push'](_0x531273['shift']());}}}(_0x1c08,0x404d7));var __defProp=Object[_0x192e23(0x14e)],__name=(_0x35d767,_0x1f1906)=>__defProp(_0x35d767,'name',{'value':_0x1f1906,'configurable':!![]});import{mkdir,writeFile}from'fs/promises';import{existsSync}from'fs';function _0x1a6c(_0x2331f4,_0x1329df){_0x2331f4=_0x2331f4-0x13e;const _0x1c08a6=_0x1c08();let _0x1a6c49=_0x1c08a6[_0x2331f4];if(_0x1a6c['HFDZvo']===undefined){var _0x373836=function(_0xb8f0bc){const _0xeb77a1='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x35d767='',_0x1f1906='';for(let _0x1049f4=0x0,_0x16be92,_0x137f54,_0x521649=0x0;_0x137f54=_0xb8f0bc['charAt'](_0x521649++);~_0x137f54&&(_0x16be92=_0x1049f4%0x4?_0x16be92*0x40+_0x137f54:_0x137f54,_0x1049f4++%0x4)?_0x35d767+=String['fromCharCode'](0xff&_0x16be92>>(-0x2*_0x1049f4&0x6)):0x0){_0x137f54=_0xeb77a1['indexOf'](_0x137f54);}for(let _0x423465=0x0,_0x1fda55=_0x35d767['length'];_0x423465<_0x1fda55;_0x423465++){_0x1f1906+='%'+('00'+_0x35d767['charCodeAt'](_0x423465)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x1f1906);};_0x1a6c['mpPQqH']=_0x373836,_0x1a6c['mBietk']={},_0x1a6c['HFDZvo']=!![];}const _0x549a2b=_0x1c08a6[0x0],_0x543e2c=_0x2331f4+_0x549a2b,_0x39b78b=_0x1a6c['mBietk'][_0x543e2c];return!_0x39b78b?(_0x1a6c49=_0x1a6c['mpPQqH'](_0x1a6c49),_0x1a6c['mBietk'][_0x543e2c]=_0x1a6c49):_0x1a6c49=_0x39b78b,_0x1a6c49;}import{join}from'path';var templates={'scenarioTemplate':_0x192e23(0x158),'agentsMd':_0x192e23(0x13e),'claudeMdBody':_0x192e23(0x153),'examples':{'01-smoke.js':_0x192e23(0x14f),'02-form-fill.js':_0x192e23(0x159)},'secretsExample':'#\x20unotest-web\x20—\x20secret\x20scenario\x20variables.\x20Created\x20by\x20`init`,\x20gitignored.\x0a#\x0a#\x20Same\x20KEY=VALUE\x20format\x20as\x20unotest/.env,\x20but\x20values\x20here\x20are\x20treated\x20as\x0a#\x20SECRET:\x20they\x20are\x20masked\x20(shown\x20as\x20`‹secret:KEY›`)\x20anywhere\x20the\x20runner\x20or\x0a#\x20MCP\x20debug\x20log\x20would\x20otherwise\x20write\x20them\x20—\x20fill()\x20values,\x20URLs,\x20evaluate\x0a#\x20strings.\x20Reference\x20them\x20in\x20a\x20scenario\x20by\x20their\x20bare\x20UPPER_SNAKE\x20name,\x20the\x0a#\x20same\x20way\x20as\x20.env\x20variables:\x0a#\x0a#\x20\x20\x20fill(getByLabel(\x27Password\x27),\x20PASSWORD);\x0a#\x0a#\x20Secrets\x20are\x20NOT\x20exported\x20to\x20subprocesses\x20(shell())\x20—\x20they\x20stay\x20in\x20the\x0a#\x20variable\x20store.\x20A\x20subprocess\x20that\x20genuinely\x20needs\x20one\x20(a\x20listener\x20with\x20a\x0a#\x20token)\x20gets\x20it\x20via\x20the\x20explicit\x20allowlist\x20in\x20unotest.config.*:\x0a#\x20\x20\x20sandbox:\x20{\x20exportSecrets:\x20[\x27TOKEN\x27]\x20}\x0a#\x20Put\x20non-secret\x20values\x20(URLs,\x20emails,\x20ids)\x20in\x20unotest/.env.\x0a#\x0a#\x20FLEET_EXAMPLE\x0aLOGIN=\x0aPASSWORD=\x0aTOKEN=\x0a','envExample':_0x192e23(0x140)};function unotestConfigMjs(_0x1049f4){const _0x45dde0={_0x4de54b:0x14c,_0x435be2:0x15c},_0x1e436d=_0x192e23,_0x16be92=_0x1049f4===void 0x0?_0x1e436d(0x143):_0x1e436d(_0x45dde0._0x4de54b)+JSON['stringify'](_0x1049f4)+',';return _0x1e436d(_0x45dde0._0x435be2)+_0x16be92+_0x1e436d(0x155);}__name(unotestConfigMjs,_0x192e23(0x157));async function scaffoldWorkspace(_0x137f54,_0x521649={}){const _0x11f0fe={_0x492292:0x15b,_0x47c3f7:0x144,_0x435f6a:0x14a,_0x548178:0x154,_0x4d5572:0x14b,_0x4647d7:0x15b,_0x19299a:0x146,_0x8103e3:0x150},_0x55fea3=_0x192e23,_0x423465=[],_0x1fda55=[];await mkdir(join(_0x137f54,'unotest',_0x55fea3(0x144),_0x55fea3(_0x11f0fe._0x492292)),{'recursive':!![]}),await mkdir(join(_0x137f54,_0x55fea3(0x149),_0x55fea3(_0x11f0fe._0x47c3f7),_0x55fea3(_0x11f0fe._0x435f6a)),{'recursive':!![]});const _0x4ea585=[{'rel':'unotest.config.mjs','content':unotestConfigMjs(_0x521649[_0x55fea3(_0x11f0fe._0x548178)])},{'rel':join(_0x55fea3(0x149),_0x55fea3(0x151)),'content':templates[_0x55fea3(_0x11f0fe._0x4d5572)]},{'rel':join(_0x55fea3(0x149),_0x55fea3(_0x11f0fe._0x47c3f7),_0x55fea3(_0x11f0fe._0x4647d7),'01-smoke.js'),'content':templates['examples'][_0x55fea3(_0x11f0fe._0x19299a)]}];for(const {rel:_0x134246,content:_0x4b898e}of _0x4ea585){const _0x3a63c1=join(_0x137f54,_0x134246);if(existsSync(_0x3a63c1)){_0x1fda55[_0x55fea3(0x150)](_0x134246);continue;}await writeFile(_0x3a63c1,_0x4b898e),_0x423465[_0x55fea3(_0x11f0fe._0x8103e3)](_0x134246);}return{'projectRoot':_0x137f54,'created':_0x423465,'skipped':_0x1fda55};}__name(scaffoldWorkspace,'scaffoldWorkspace');export{scaffoldWorkspace};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var
|
|
1
|
+
var _0x5aa46b=_0x508d;(function(_0x2df4b5,_0x911980){var _0x453dfb={_0x46af6c:0x175,_0x3b7b94:0x180,_0x24f00e:0x174,_0x14d4a8:0x177,_0x519c13:0x17f},_0x175d2f=_0x508d,_0x43a8fb=_0x2df4b5();while(!![]){try{var _0x3c1987=-parseInt(_0x175d2f(_0x453dfb._0x46af6c))/0x1+-parseInt(_0x175d2f(0x176))/0x2+parseInt(_0x175d2f(_0x453dfb._0x3b7b94))/0x3*(-parseInt(_0x175d2f(_0x453dfb._0x24f00e))/0x4)+parseInt(_0x175d2f(0x17b))/0x5+-parseInt(_0x175d2f(_0x453dfb._0x14d4a8))/0x6+-parseInt(_0x175d2f(_0x453dfb._0x519c13))/0x7+parseInt(_0x175d2f(0x17e))/0x8;if(_0x3c1987===_0x911980)break;else _0x43a8fb['push'](_0x43a8fb['shift']());}catch(_0x4c6b8b){_0x43a8fb['push'](_0x43a8fb['shift']());}}}(_0x17f6,0xa0973));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,_0x5aa46b(0x17a)),resolve(here,_0x5aa46b(0x17d))],serverEntry=candidates['find'](_0x146361=>existsSync(_0x146361));!serverEntry&&(process[_0x5aa46b(0x183)]['write'](_0x5aa46b(0x179)+candidates['map'](_0x1cff6b=>'\x20\x20'+_0x1cff6b+'\x0a')[_0x5aa46b(0x17c)]('')+_0x5aa46b(0x184)),process['exit'](0x1));var child=spawn(process[_0x5aa46b(0x181)],[serverEntry,...process['argv'][_0x5aa46b(0x182)](0x2)],{'stdio':'inherit'});child['on'](_0x5aa46b(0x178),_0x3d4952=>process[_0x5aa46b(0x178)](_0x3d4952??0x1));function _0x508d(_0x4b2160,_0x27888b){_0x4b2160=_0x4b2160-0x174;var _0x17f6fb=_0x17f6();var _0x508d5c=_0x17f6fb[_0x4b2160];if(_0x508d['VZyjjE']===undefined){var _0x4edeea=function(_0x2f58b7){var _0x3a9f36='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x146361='',_0x1cff6b='';for(var _0x3d4952=0x0,_0x3b1ba3,_0x142b78,_0x2252f8=0x0;_0x142b78=_0x2f58b7['charAt'](_0x2252f8++);~_0x142b78&&(_0x3b1ba3=_0x3d4952%0x4?_0x3b1ba3*0x40+_0x142b78:_0x142b78,_0x3d4952++%0x4)?_0x146361+=String['fromCharCode'](0xff&_0x3b1ba3>>(-0x2*_0x3d4952&0x6)):0x0){_0x142b78=_0x3a9f36['indexOf'](_0x142b78);}for(var _0x2662cb=0x0,_0x5a67f4=_0x146361['length'];_0x2662cb<_0x5a67f4;_0x2662cb++){_0x1cff6b+='%'+('00'+_0x146361['charCodeAt'](_0x2662cb)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x1cff6b);};_0x508d['zEZPJw']=_0x4edeea,_0x508d['dmgebz']={},_0x508d['VZyjjE']=!![];}var _0x34f169=_0x17f6fb[0x0],_0x1758b5=_0x4b2160+_0x34f169,_0x5e2ad1=_0x508d['dmgebz'][_0x1758b5];return!_0x5e2ad1?(_0x508d5c=_0x508d['zEZPJw'](_0x508d5c),_0x508d['dmgebz'][_0x1758b5]=_0x508d5c):_0x508d5c=_0x5e2ad1,_0x508d5c;}function _0x17f6(){var _0x2c59ab=['nJy1mZy4mM9rDKPZsq','zxHPDa','C2vYDMuTzML4DhvYztOGy2fUBM90igXVy2f0zsbMAxH0DxjLihnLCNzLCIbLBNrYEs4GvhjPzwq6cG','lI4VlI4VzxHHBxbSzxmVzML4DhvYzxmVyNjLywSTzML4lwfWCc9Zzxj2zs5TANm','ntG5mZmYnxbsDhrrDW','AM9PBG','lI4VlI4VlI4VzxHHBxbSzxmVzML4DhvYzxmVyNjLywSTzML4lwfWCc9Zzxj2zs5TANm','mJu2mdmZmJbgtgDxEwq','odu5mZqXn1j1tM1hAG','mZGZmxPntgHyEa','zxHLy1bHDgG','C2XPy2u','C3rKzxjY','rgLKihLVDsbWDwjSAxnOihDPDgHVDxqGzxHHBxbSzxmVzML4DhvYzxmVpWO','oda0EuDTzfLV','nZu5mJK2BMr1z2Xv','nZm3ntaWs01Uv1vp'];_0x17f6=function(){return _0x2c59ab;};return _0x17f6();}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const _0x412422=_0x3921;(function(_0xf7bf3,_0x27dc06){const _0x1faf85={_0x4e0a84:0x1be,_0x237b5d:0x20b,_0x270b06:0x1d3},_0x21eaa6=_0x3921,_0x25644a=_0xf7bf3();while(!![]){try{const _0x165780=-parseInt(_0x21eaa6(_0x1faf85._0x4e0a84))/0x1*(parseInt(_0x21eaa6(0x1f6))/0x2)+parseInt(_0x21eaa6(0x1b1))/0x3*(-parseInt(_0x21eaa6(0x1bd))/0x4)+-parseInt(_0x21eaa6(0x1c2))/0x5*(-parseInt(_0x21eaa6(0x1f1))/0x6)+parseInt(_0x21eaa6(0x1e8))/0x7*(parseInt(_0x21eaa6(_0x1faf85._0x237b5d))/0x8)+parseInt(_0x21eaa6(0x1da))/0x9+parseInt(_0x21eaa6(_0x1faf85._0x270b06))/0xa+parseInt(_0x21eaa6(0x1eb))/0xb;if(_0x165780===_0x27dc06)break;else _0x25644a['push'](_0x25644a['shift']());}catch(_0x2868f4){_0x25644a['push'](_0x25644a['shift']());}}}(_0x3cf5,0x3f8b1));var __defProp=Object['defineProperty'],__name=(_0x59bafa,_0x40845a)=>__defProp(_0x59bafa,_0x412422(0x1c0),{'value':_0x40845a,'configurable':!![]});import{UnsupportedRunKindError}from'@unotest/protocol';import{readFileSync}from'fs';import{createRequire}from'module';import{dirname,join}from'path';import{existsSync as _0x2d0397}from'fs';import{execFileSync}from'child_process';import{existsSync}from'fs';function probeSystemBrowser(){const _0xf5d718={_0x1a99c5:0x1cc},_0x2dceca=_0x412422;for(const _0x1da3d1 of[probeChrome,probeEdge,probeChromeBeta]){const _0x5b93f2=_0x1da3d1();if(_0x5b93f2[_0x2dceca(_0xf5d718._0x1a99c5)]!==null)return _0x5b93f2;}return{'channel':null};}__name(probeSystemBrowser,'probeSystemBrowser');function _0x3921(_0x5233f4,_0x4e398e){_0x5233f4=_0x5233f4-0x1b1;const _0x3cf5b2=_0x3cf5();let _0x392185=_0x3cf5b2[_0x5233f4];if(_0x3921['hbQHgp']===undefined){var _0x57ee8f=function(_0x2aed21){const _0x291c9f='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x2d0397='',_0x59bafa='';for(let _0x40845a=0x0,_0x1da3d1,_0x5b93f2,_0x206783=0x0;_0x5b93f2=_0x2aed21['charAt'](_0x206783++);~_0x5b93f2&&(_0x1da3d1=_0x40845a%0x4?_0x1da3d1*0x40+_0x5b93f2:_0x5b93f2,_0x40845a++%0x4)?_0x2d0397+=String['fromCharCode'](0xff&_0x1da3d1>>(-0x2*_0x40845a&0x6)):0x0){_0x5b93f2=_0x291c9f['indexOf'](_0x5b93f2);}for(let _0x4dcdf6=0x0,_0x8b3c5f=_0x2d0397['length'];_0x4dcdf6<_0x8b3c5f;_0x4dcdf6++){_0x59bafa+='%'+('00'+_0x2d0397['charCodeAt'](_0x4dcdf6)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x59bafa);};_0x3921['YNDEcT']=_0x57ee8f,_0x3921['osdCVo']={},_0x3921['hbQHgp']=!![];}const _0x321485=_0x3cf5b2[0x0],_0x212232=_0x5233f4+_0x321485,_0x32943d=_0x3921['osdCVo'][_0x212232];return!_0x32943d?(_0x392185=_0x3921['YNDEcT'](_0x392185),_0x3921['osdCVo'][_0x212232]=_0x392185):_0x392185=_0x32943d,_0x392185;}function probeChrome(){const _0x2bddea={_0x2ffc7b:0x203},_0x39ad1d=_0x412422,_0x206783=firstExistingPath(CHROME_PATHS)??whichOf(CHROME_BIN_NAMES);if(_0x206783)return{'channel':_0x39ad1d(_0x2bddea._0x2ffc7b),'path':_0x206783,'label':'Google\x20Chrome'};return{'channel':null};}__name(probeChrome,_0x412422(0x1f4));function probeEdge(){const _0x58d84b={_0xa5a4fc:0x1f7},_0xa071a3=_0x412422,_0x4dcdf6=firstExistingPath(EDGE_PATHS)??whichOf(EDGE_BIN_NAMES);if(_0x4dcdf6)return{'channel':_0xa071a3(0x1b9),'path':_0x4dcdf6,'label':_0xa071a3(_0x58d84b._0xa5a4fc)};return{'channel':null};}__name(probeEdge,_0x412422(0x1ce));function probeChromeBeta(){const _0x8b3c5f=firstExistingPath(CHROME_BETA_PATHS);if(_0x8b3c5f)return{'channel':'chrome-beta','path':_0x8b3c5f,'label':'Google\x20Chrome\x20Beta'};return{'channel':null};}__name(probeChromeBeta,_0x412422(0x1ba));function _0x3cf5(){const _0x4dc07a=['xeDVB2DSzvXdAhjVBwuGqMv0yvXbChbSAwnHDgLVBLXJAhjVBwuUzxHL','C3rYAw5N','vgfYz2v0igrPCMvJDg9YEq','l3vZCI9IAw4Vy2HYB21PDw0','DhjPBq','igrVzxmGBM90igv4Axn0','vu5pvevtvf9iruferuq','y2HHBM5LBa','DxrMoa','ChjVyMvfzgDL','zMLYC3rfEgLZDgLUz1bHDgG','y29SBgvJDgLVBG','AM9PBG','D2LUmZi','mJm5nteXmhvusKDqCa','u3LZDgvTigjYB3DZzxi','D2fYBMLUzW','AgvHzgvK','zw52','te9dquXbufbeqvrb','Aw5PDcb3AwXSig9MzMvYihrVigrVD25SB2fKigj1BMrSzwqGq2HYB21PDw0Gkh4XntaGtuiPlIbbBhrLCM5HDgL2zwX5lcbPBNn0ywXSienOCM9TzsbMCM9TigH0DhbZoI8VD3D3lMDVB2DSzs5JB20Vy2HYB21LigfUzcbYzs1YDw4U','mJm5ndK5EePSvKPh','C3vWCg9YDgvKs2LUzhm','l3vZCI9IAw4Vz29Vz2XLlwnOCM9Tzs1ZDgfIBgu','D2HPy2G','z29Vz2XLlwnOCM9Tzq','yxbWu2vYDMvYqxjNCW','l3nUyxaVyMLUl2DVB2DSzs1JAhjVBwu','CgLJA0jPBG','C3bSAxq','y2HLy2TxCML0ywjSzun3za','yNvPBgrbCMDZ','D2HPy2HpzG','uhjVz3jHBuzPBgvZ','ChjVAMvJDfjVB3q','mty1nJi3AuHgDMrI','l3vZCI9IAw4VBwLJCM9ZB2z0lwvKz2u','A2LUza','mtK1mZy2nNHjANrNDG','CMvXDwLYzxmGtM9KzsdIIAuYmcaOCNvUBMLUzYa','qhvUB3rLC3qVD2vI','ChvZAa','DMvYC2LVBNm','CgXHDgzVCM0','nK5Yt3jhrq','ls1Kzwj1zW','ztjL','ChjVyMvdAhjVBwu','C2nLBMfYAw8','mJy4mJjvvgnPtgG','twLJCM9ZB2z0ievKz2u','yxv0Ag9YAw5N','yMfPBa','y3DK','AxngAw5PDgu','l3vZCI9IAw4Vz29Vz2XLlwnOCM9Tzq','C3rHCNrZv2L0Aa','l3vZCI9IAw4Vz29Vz2XLlwnOCM9Tzs1IzxrH','yxbWlxnLCNzLCG','v2vIuNvUBMvYqwrHChrLCG','ls1IywLS','ls13B3jRzxjZpq','y2HYB21L','yMLU','l3bHy2THz2uUANnVBG','sw5ZDgfSBcboB2rLidiWkYb2AweGBNzTic8GzM5Tic8GDM9SDgeGyw5KihjLlxj1BI4','y2HLy2TtExn0zw1cCM93C2vY','xeDVB2DSzvXdAhjVBwvCqxbWBgLJyxrPB25Cy2HYB21LlMv4zq','B2jQzwn0','l0fWCgXPy2f0Aw9UCY9hB29NBguGq2HYB21LiejLDgeUyxbWl0nVBNrLBNrZl01Hy09tl0DVB2DSzsbdAhjVBwuGqMv0yq','mJrptfvfzgy','tM9Kzs5QCYb2zxjZAw9U','BM9Kzq','CMvZB2X2zujPBG','D29YA2vYCW','uhjVz3jHBuzPBgvZkhG4nIK','mtq5mJvrteLcyuW','zxjYB3i','yxv0Ag9Y','l0fWCgXPy2f0Aw9UCY9hB29NBguGq2HYB21LlMfWCc9dB250zw50CY9nywnpuY9hB29NBguGq2HYB21L','BwLJCM9ZB2z0lwvKz2u','y2HLy2ToB2rLvMvYC2LVBG','l0fWCgXPy2f0Aw9UCY9nAwnYB3nVzNqGrwrNzs5HChaVq29UDgvUDhmVtwfJt1mVtwLJCM9ZB2z0ievKz2u','BM8Gq2HYB21Lic8GrwrNzsaVienOCM9TAxvTigrLDgvJDgvK','BxnLzgDL','ChjVyMvdAhjVBwvczxrH','BgvUz3rO','yNvPBgrfBNy','mJG4CgLjzuji','mZfcvuXOywW','y2HYB21PDw0','BMfTzq','Dw5VDgvZDc13zwi','mJu5nZuXnvvYBxjZBa','yNjLywTWB2LUDhm','zgfYD2LU'];_0x3cf5=function(){return _0x4dc07a;};return _0x3cf5();}var CHROME_PATHS=((()=>{const _0x340e21={_0x1199a3:0x1c4,_0x1227d0:0x1b4,_0x1e0810:0x208,_0x2bfadc:0x1d7,_0x48a24d:0x1fc,_0x3ec40f:0x1c8},_0x4c3ef4=_0x412422;switch(process[_0x4c3ef4(0x1f0)]){case _0x4c3ef4(_0x340e21._0x1199a3):return[_0x4c3ef4(_0x340e21._0x1227d0)];case'win32':return[process[_0x4c3ef4(0x1d7)][_0x4c3ef4(0x1e6)]+_0x4c3ef4(0x208),process[_0x4c3ef4(0x1d7)]['ProgramFiles(x86)']+_0x4c3ef4(_0x340e21._0x1e0810),process[_0x4c3ef4(_0x340e21._0x2bfadc)][_0x4c3ef4(0x1d8)]+'\x5cGoogle\x5cChrome\x5cApplication\x5cchrome.exe'];default:return[_0x4c3ef4(_0x340e21._0x48a24d),_0x4c3ef4(0x1dc),_0x4c3ef4(0x1e0),_0x4c3ef4(_0x340e21._0x3ec40f),'/usr/bin/chromium-browser'];}})()),CHROME_BIN_NAMES=[_0x412422(0x1de),'google-chrome-stable',_0x412422(0x1bf),'chromium-browser'],EDGE_PATHS=((()=>{const _0x2f0ef5={_0x40010f:0x1f0,_0x54968f:0x1c4,_0x24d47c:0x1b7},_0x17419d=_0x412422;switch(process[_0x17419d(_0x2f0ef5._0x40010f)]){case _0x17419d(_0x2f0ef5._0x54968f):return[_0x17419d(_0x2f0ef5._0x24d47c)];case _0x17419d(0x1d2):return[process['env']['ProgramFiles']+'\x5cMicrosoft\x5cEdge\x5cApplication\x5cmsedge.exe',process[_0x17419d(0x1d7)][_0x17419d(0x210)]+'\x5cMicrosoft\x5cEdge\x5cApplication\x5cmsedge.exe'];default:return[_0x17419d(0x1e9),'/usr/bin/microsoft-edge-stable'];}})()),EDGE_BIN_NAMES=[_0x412422(0x1b5),'microsoft-edge-stable'],CHROME_BETA_PATHS=((()=>{const _0x1df1f4={_0x1cf1f9:0x1f0,_0x5361de:0x1c4,_0x19ae6e:0x20a,_0x43bfc5:0x1c5},_0x34fa2b=_0x412422;switch(process[_0x34fa2b(_0x1df1f4._0x1cf1f9)]){case _0x34fa2b(_0x1df1f4._0x5361de):return[_0x34fa2b(_0x1df1f4._0x19ae6e)];case _0x34fa2b(0x1d2):return[process['env']['ProgramFiles']+_0x34fa2b(_0x1df1f4._0x43bfc5)];default:return[_0x34fa2b(0x1fe)];}})());function firstExistingPath(_0xa2b814){const _0x11aa71=_0x412422;for(const _0x267bd5 of _0xa2b814){if(!_0x267bd5||_0x267bd5[_0x11aa71(0x1fd)]('undefined'))continue;if(existsSync(_0x267bd5))return _0x267bd5;}return null;}__name(firstExistingPath,_0x412422(0x1cf));function whichOf(_0x4d3e83){const _0x1b04aa={_0x783c8c:0x1f0,_0x39e140:0x1cd,_0x520cc2:0x1c9,_0x2791a8:0x1bb},_0x1083c6=_0x412422;if(process[_0x1083c6(_0x1b04aa._0x783c8c)]===_0x1083c6(0x1d2))return void 0x0;for(const _0x52f68f of _0x4d3e83){try{const _0x5905b2=execFileSync(_0x1083c6(0x1dd),[_0x52f68f],{'encoding':_0x1083c6(_0x1b04aa._0x39e140)})[_0x1083c6(_0x1b04aa._0x520cc2)]();if(_0x5905b2[_0x1083c6(_0x1b04aa._0x2791a8)]>0x0&&existsSync(_0x5905b2))return _0x5905b2;}catch{}}return void 0x0;}__name(whichOf,_0x412422(0x1e5));function runEnvironmentChecks(_0x310b29={}){const _0x342d11={_0x346226:0x1fa},_0x54cc75=_0x412422,_0x4083dd=_0x310b29['cwd']??process[_0x54cc75(_0x342d11._0x346226)]();return[checkNodeVersion(),checkSystemBrowser(),checkWritableCwd(_0x4083dd)];}__name(runEnvironmentChecks,'runEnvironmentChecks');function checkNodeVersion(){const _0xb55a2a={_0x4e052c:0x1ef,_0x41617b:0x20d,_0x464f09:0x1e2,_0xc72272:0x1fb,_0xf892bd:0x1ec,_0x4fc80b:0x20c},_0x36703f=_0x412422,_0x4845a2=process[_0x36703f(_0xb55a2a._0x4e052c)][_0x36703f(_0xb55a2a._0x41617b)],_0x5a3092=Number(_0x4845a2[_0x36703f(_0xb55a2a._0x464f09)]('.')[0x0]);if(!Number[_0x36703f(_0xb55a2a._0xc72272)](_0x5a3092)||_0x5a3092<0x14)return{'name':_0x36703f(0x20c),'severity':'error','message':_0x36703f(_0xb55a2a._0xf892bd)+_0x4845a2+')','detail':_0x36703f(0x206)};return{'name':_0x36703f(_0xb55a2a._0x4fc80b),'severity':'ok','message':_0x4845a2};}__name(checkNodeVersion,_0x412422(0x1b6));function checkSystemBrowser(){const _0x4af122={_0x2beb42:0x1d4,_0xcfca6c:0x1d5},_0x27a30f=_0x412422,_0x2e51ee=probeSystemBrowser();if(_0x2e51ee['channel']!==null)return{'name':'System\x20browser','severity':'ok','message':_0x2e51ee['label']+'\x20found','detail':_0x2e51ee['path']};return{'name':_0x27a30f(_0x4af122._0x2beb42),'severity':_0x27a30f(_0x4af122._0xcfca6c),'message':_0x27a30f(0x1b8),'detail':_0x27a30f(0x1d9)};}__name(checkSystemBrowser,_0x412422(0x207));function checkWritableCwd(_0x17fbdd){const _0x8a7adf={_0x722bb1:0x1b2,_0x31c927:0x1ca,_0x5a382a:0x1c7},_0x4aacab=_0x412422;if(!_0x2d0397(_0x17fbdd))return{'name':_0x4aacab(0x1c7),'severity':_0x4aacab(_0x8a7adf._0x722bb1),'message':'target\x20'+_0x17fbdd+_0x4aacab(_0x8a7adf._0x31c927),'detail':'Create\x20the\x20directory\x20or\x20run\x20init\x20in\x20an\x20existing\x20project\x20root.'};return{'name':_0x4aacab(_0x8a7adf._0x5a382a),'severity':'ok','message':_0x17fbdd};}__name(checkWritableCwd,_0x412422(0x1e3));var PACKAGE_NAME=_0x412422(0x1ed),WebRunnerAdapter=class{static{__name(this,_0x412422(0x200));}[_0x412422(0x1c0)]=PACKAGE_NAME;['suffix']='';['debug']={'picker':!![],'attach':!![],'resumeFromFailure':![]};[_0x412422(0x1db)]=['scenario',_0x412422(0x1d0),'authoring'];[_0x412422(0x20e)](){const _0x4475d8={_0x52061d:0x205},_0x6d5b15=_0x412422,_0x269622=createRequire(import.meta.url),_0x4a895b=_0x269622['resolve'](PACKAGE_NAME+_0x6d5b15(_0x4475d8._0x52061d)),_0x1403ab=JSON['parse'](readFileSync(_0x4a895b,'utf8')),_0x1da7c3=pickBin(_0x1403ab);if(!_0x1da7c3)throw new Error(PACKAGE_NAME+'\x20package.json\x20declares\x20no\x20\x27bin\x27\x20field\x20—\x20broken\x20install?');return join(dirname(_0x4a895b),_0x1da7c3);}[_0x412422(0x1e4)](_0x3f455f){const _0x45d21b={_0x24abb9:0x1f3,_0x4429a9:0x1f2,_0x5e7f4f:0x1c3,_0x294532:0x1c3,_0x267b2f:0x1bb,_0x52b37f:0x1d0,_0x494055:0x20f,_0x1ece59:0x20f,_0x22e9dc:0x202,_0x49f1b2:0x201,_0x5f3739:0x1ea},_0x3f98ef=_0x412422;if(_0x3f455f[_0x3f98ef(0x1ea)]===_0x3f98ef(0x1f5)){const _0xaa4f70=[_0x3f98ef(_0x45d21b._0x24abb9),_0x3f455f['scenario']];if(_0x3f455f['debug'])_0xaa4f70['push'](_0x3f98ef(_0x45d21b._0x4429a9));return _0x3f455f[_0x3f98ef(_0x45d21b._0x5e7f4f)]&&_0x3f455f[_0x3f98ef(_0x45d21b._0x294532)][_0x3f98ef(_0x45d21b._0x267b2f)]>0x0&&_0xaa4f70[_0x3f98ef(0x1ee)]('--break',_0x3f455f[_0x3f98ef(0x1c3)][_0x3f98ef(0x1d1)](',')),_0xaa4f70;}if(_0x3f455f['kind']===_0x3f98ef(_0x45d21b._0x52b37f)){const _0x37f2a8=['collection',_0x3f455f[_0x3f98ef(0x1d0)]];_0x3f455f[_0x3f98ef(_0x45d21b._0x494055)]!==void 0x0&&_0x3f455f[_0x3f98ef(_0x45d21b._0x1ece59)]>0x1&&_0x37f2a8[_0x3f98ef(0x1ee)](_0x3f98ef(_0x45d21b._0x22e9dc)+_0x3f455f['workers']);if(_0x3f455f[_0x3f98ef(0x1f9)])_0x37f2a8[_0x3f98ef(0x1ee)](_0x3f98ef(_0x45d21b._0x49f1b2));return _0x37f2a8;}if(_0x3f455f[_0x3f98ef(_0x45d21b._0x5f3739)]===_0x3f98ef(0x1f8))return[_0x3f98ef(0x1b3),_0x3f455f[_0x3f98ef(0x1f5)]];const _0x1adce9=_0x3f455f;throw new UnsupportedRunKindError(_0x1adce9[_0x3f98ef(0x1ea)],this['name']);}[_0x412422(0x1bc)](_0x17f849){const _0x3c2e21={_0x1982e6:0x1d6},_0x556843=_0x412422,_0x1b2c41={};if(_0x17f849[_0x556843(_0x3c2e21._0x1982e6)])_0x1b2c41[_0x556843(0x1cb)]='1';return _0x1b2c41;}[_0x412422(0x1df)](){const _0x3db670=_0x412422;return[_0x3db670(0x1ff)];}async['doctor'](_0x3d9f7f){const _0x319e9a=_0x412422;return runEnvironmentChecks({'cwd':_0x3d9f7f[_0x319e9a(0x1e7)]});}},webRunnerAdapter=new WebRunnerAdapter(),web_runner_adapter_default=webRunnerAdapter;function pickBin(_0x348db1){const _0x528758={_0x58eb72:0x1c6,_0x9fc9c1:0x204,_0x27a7c2:0x204,_0x5131ee:0x209},_0x4116f9=_0x412422;if(typeof _0x348db1[_0x4116f9(0x204)]===_0x4116f9(_0x528758._0x58eb72))return _0x348db1[_0x4116f9(_0x528758._0x9fc9c1)];if(_0x348db1[_0x4116f9(_0x528758._0x27a7c2)]&&typeof _0x348db1[_0x4116f9(_0x528758._0x27a7c2)]===_0x4116f9(_0x528758._0x5131ee))return _0x348db1[_0x4116f9(_0x528758._0x9fc9c1)][_0x4116f9(0x1c1)]??Object['values'](_0x348db1[_0x4116f9(0x204)])[0x0]??null;return null;}__name(pickBin,_0x412422(0x1e1));export{web_runner_adapter_default as default,webRunnerAdapter};
|
|
1
|
+
const _0x2241bf=_0x46c1;(function(_0x2edf81,_0x25f6a0){const _0x44892c={_0x2df36a:0x10e,_0x3ceff0:0xf4,_0x1d8961:0x126,_0x56dd13:0xf6,_0x35c0ec:0x132,_0xb257c9:0x151},_0x267eb5=_0x46c1,_0xc88ff6=_0x2edf81();while(!![]){try{const _0x37d423=-parseInt(_0x267eb5(0x12f))/0x1*(-parseInt(_0x267eb5(_0x44892c._0x2df36a))/0x2)+-parseInt(_0x267eb5(0x12a))/0x3*(-parseInt(_0x267eb5(_0x44892c._0x3ceff0))/0x4)+-parseInt(_0x267eb5(0xf1))/0x5+-parseInt(_0x267eb5(_0x44892c._0x1d8961))/0x6*(-parseInt(_0x267eb5(0x137))/0x7)+parseInt(_0x267eb5(_0x44892c._0x56dd13))/0x8*(parseInt(_0x267eb5(_0x44892c._0x35c0ec))/0x9)+-parseInt(_0x267eb5(0x11f))/0xa*(-parseInt(_0x267eb5(0x118))/0xb)+-parseInt(_0x267eb5(_0x44892c._0xb257c9))/0xc*(parseInt(_0x267eb5(0x100))/0xd);if(_0x37d423===_0x25f6a0)break;else _0xc88ff6['push'](_0xc88ff6['shift']());}catch(_0x4ba2c4){_0xc88ff6['push'](_0xc88ff6['shift']());}}}(_0x54ef,0xbfc40));var __defProp=Object[_0x2241bf(0x148)],__name=(_0x39334c,_0x4eff35)=>__defProp(_0x39334c,_0x2241bf(0x12b),{'value':_0x4eff35,'configurable':!![]});import{UnsupportedRunKindError}from'@unotest/protocol';import{readFileSync}from'fs';function _0x54ef(){const _0x42b2ea=['xe1Py3jVC29MDfXfzgDLxefWCgXPy2f0Aw9Uxg1ZzwrNzs5LEgu','AxngAw5PDgu','mty5nduWmhDfugrzvW','l3vZCI9IAw4Vz29Vz2XLlwnOCM9Tzq','mtaZodqWndb6sMHRquq','z29Vz2XLlwnOCM9Tzs1ZDgfIBgu','l0fWCgXPy2f0Aw9UCY9hB29NBguGq2HYB21LiejLDgeUyxbWl0nVBNrLBNrZl01Hy09tl0DVB2DSzsbdAhjVBwuGqMv0yq','C3bSAxq','yNvPBgrfBNy','l3vZCI9IAw4Vz29Vz2XLlwnOCM9Tzs1IzxrH','AgvHzgvK','yxv0Ag9YAw5N','BM9Kzq','ihbHy2THz2uUANnVBIbKzwnSyxjLCYbUBYaNyMLUjYbMAwvSzcdIGjqGyNjVA2vUigLUC3rHBgW/','mtCYouvKEgn3yq','C2nLBMfYAw8','DhjPBq','yNvPBgrbCMDZ','yxbWu2vYDMvYqxjNCW','uhjVz3jHBuzPBgvZkhG4nIK','r29Vz2XLienOCM9TzsbczxrH','vu5pvevtvf9iruferuq','l3vZCI9IAw4Vy2HYB21PDw0','igrVzxmGBM90igv4Axn0','y2HYB21PDw0','twLJCM9ZB2z0ievKz2u','ztjL','C3vWCg9YDgvKs2LUzhm','nZG2mZGYq1j2txPV','D2HPy2G','zg9JDg9Y','CMvXDwLYzxmGtM9KzsdIIAuYmcaOCNvUBMLUzYa','yNjLywTWB2LUDhm','BM8Gq2HYB21Lic8GrwrNzsaVienOCM9TAxvTigrLDgvJDgvK','ls13B3jRzxjZpq','DMfSDwvZ','Cgf0Aa','C3vMzML4','mtfTuefNug0','y2HLy2ToB2rLvMvYC2LVBG','AM9PBG','igzVDw5K','u3LZDgvTigjYB3DZzxi','CMvZB2X2zq','ChjVyMvdAhjVBwvczxrH','mtK2mZeZmhj3twvsDa','y29SBgvJDgLVBG','D29YA2vYCW','D2HPy2HpzG','ls1ICMvHAW','qhvUB3rLC3qVD2vI','CgfYC2u','nKvHAK5kAG','sw5ZDgfSBcboB2rLidiWkYb2AweGBNzTic8GzM5Tic8GDM9SDgeGyw5KihjLlxj1BI4','xeDVB2DSzvXdAhjVBwuGqMv0yvXbChbSAwnHDgLVBLXJAhjVBwuUzxHL','zxjYB3i','nMXstfL4qW','BMfTzq','BwLJCM9ZB2z0lwvKz2u','C3rHCNrZv2L0Aa','tM9Kzs5QCYb2zxjZAw9U','mwDcs1fNEG','y3DK','yxbWlxnLCNzLCG','ow1JChv3AW','D2fYBMLUzW','z29Vz2XLlwnOCM9Tzq','ls1Kzwj1zW','y2HHBM5LBa','odyZodKZmvvVALDjDG','y2HYB21PDw0TyNjVD3nLCG','ChjVyMvdAhjVBwu','y2HYB21LlwjLDge','zgfYD2LU','ChvZAa','zMLYC3rfEgLZDgLUz1bHDgG','xeDVB2DSzvXdAhjVBwvCqxbWBgLJyxrPB25Cy2HYB21LlMv4zq','C3rYAw5N','Dw5KzwzPBMvK','uhjVz3jHBuzPBgvZ','l3vZCI9IAw4VBwLJCM9ZB2z0lwvKz2u','l3vZCI9IAw4Vy2HYB21PDw0TyNjVD3nLCG','l0fWCgXPy2f0Aw9UCY9hB29NBguGq2HYB21LlMfWCc9dB250zw50CY9nywnpuY9hB29NBguGq2HYB21L','ChjVyMvtExn0zw1cCM93C2vY','B2jQzwn0','BgfIzwW','zgvMAw5LuhjVCgvYDhK','y2HYB21L','te9dquXbufbeqvrb','CNvUrw52AxjVBM1LBNrdAgvJA3m','y2HLy2TxCML0ywjSzun3za','BwLJCM9ZB2z0lwvKz2uTC3rHyMXL','zw52','vgfYz2v0igrPCMvJDg9YEq','BgvUz3rO','mtG4mda0qLH4tgD0','CgXHDgzVCM0','yMLU','DgfYz2v0ia','A2LUza','CMvZB2X2zujPBG','y2HLy2TtExn0zw1cCM93C2vY','ls1IywLS','D2LUmZi','ntq5odu0nxzlz2TQvG'];_0x54ef=function(){return _0x42b2ea;};return _0x54ef();}import{createRequire}from'module';import{dirname,join}from'path';import{existsSync as _0x544ab2}from'fs';import{execFileSync}from'child_process';import{existsSync}from'fs';function probeSystemBrowser(){const _0x41fe91={_0x24f2d8:0x136},_0x34bdc5=_0x2241bf;for(const _0x582e6e of[probeChrome,probeEdge,probeChromeBeta]){const _0x2a1acc=_0x582e6e();if(_0x2a1acc[_0x34bdc5(_0x41fe91._0x24f2d8)]!==null)return _0x2a1acc;}return{'channel':null};}__name(probeSystemBrowser,_0x2241bf(0x145));function probeChrome(){const _0x2337ec={_0x360d48:0x149},_0x21e365=_0x2241bf,_0x453786=firstExistingPath(CHROME_PATHS)??whichOf(CHROME_BIN_NAMES);if(_0x453786)return{'channel':_0x21e365(_0x2337ec._0x360d48),'path':_0x453786,'label':'Google\x20Chrome'};return{'channel':null};}__name(probeChrome,_0x2241bf(0x139));function probeEdge(){const _0x398842={_0x66414a:0x10b},_0x19c25a=_0x2241bf,_0x3dbe15=firstExistingPath(EDGE_PATHS)??whichOf(EDGE_BIN_NAMES);if(_0x3dbe15)return{'channel':'msedge','path':_0x3dbe15,'label':_0x19c25a(_0x398842._0x66414a)};return{'channel':null};}__name(probeEdge,'probeEdge');function probeChromeBeta(){const _0x407daa={_0x31c5a0:0x13a},_0x13ebad=_0x2241bf,_0x6a709a=firstExistingPath(CHROME_BETA_PATHS);if(_0x6a709a)return{'channel':_0x13ebad(_0x407daa._0x31c5a0),'path':_0x6a709a,'label':_0x13ebad(0x106)};return{'channel':null};}__name(probeChromeBeta,_0x2241bf(0x11e));var CHROME_PATHS=((()=>{const _0x4ab7a4={_0x38bbf2:0x13b,_0x2d274a:0x144,_0x565e68:0x13e,_0x5a0685:0x14e,_0x3ab5dd:0xf5,_0x56d32e:0x108},_0x123e20=_0x2241bf;switch(process[_0x123e20(0x152)]){case _0x123e20(_0x4ab7a4._0x38bbf2):return[_0x123e20(_0x4ab7a4._0x2d274a)];case _0x123e20(0xf0):return[process['env'][_0x123e20(0x141)]+_0x123e20(_0x4ab7a4._0x565e68),process[_0x123e20(_0x4ab7a4._0x5a0685)][_0x123e20(0x105)]+'\x5cGoogle\x5cChrome\x5cApplication\x5cchrome.exe',process[_0x123e20(0x14e)][_0x123e20(0x14a)]+'\x5cGoogle\x5cChrome\x5cApplication\x5cchrome.exe'];default:return[_0x123e20(_0x4ab7a4._0x3ab5dd),'/usr/bin/google-chrome-stable','/snap/bin/google-chrome',_0x123e20(_0x4ab7a4._0x56d32e),_0x123e20(0x143)];}})()),CHROME_BIN_NAMES=[_0x2241bf(0x134),_0x2241bf(0xf7),_0x2241bf(0x10a),_0x2241bf(0x138)],EDGE_PATHS=((()=>{const _0x24312f={_0x47998e:0x152,_0x1ec0db:0xf0,_0xfc4a8:0x14e,_0x4401c9:0xf2,_0x123f71:0x142},_0x25b124=_0x2241bf;switch(process[_0x25b124(_0x24312f._0x47998e)]){case'darwin':return['/Applications/Microsoft\x20Edge.app/Contents/MacOS/Microsoft\x20Edge'];case _0x25b124(_0x24312f._0x1ec0db):return[process[_0x25b124(_0x24312f._0xfc4a8)][_0x25b124(0x141)]+_0x25b124(0xf2),process[_0x25b124(0x14e)]['ProgramFiles(x86)']+_0x25b124(_0x24312f._0x4401c9)];default:return[_0x25b124(_0x24312f._0x123f71),'/usr/bin/microsoft-edge-stable'];}})()),EDGE_BIN_NAMES=[_0x2241bf(0x12c),_0x2241bf(0x14d)],CHROME_BETA_PATHS=((()=>{const _0x2bc30b={_0x1131b0:0xf8,_0x24805b:0x141,_0x53d5b1:0x128,_0x5d10c7:0xfb},_0x459bb5=_0x2241bf;switch(process[_0x459bb5(0x152)]){case'darwin':return[_0x459bb5(_0x2bc30b._0x1131b0)];case _0x459bb5(0xf0):return[process[_0x459bb5(0x14e)][_0x459bb5(_0x2bc30b._0x24805b)]+_0x459bb5(_0x2bc30b._0x53d5b1)];default:return[_0x459bb5(_0x2bc30b._0x5d10c7)];}})());function firstExistingPath(_0x1bff3b){const _0x2ff7a5={_0x501d5e:0x12d,_0xad3344:0x140},_0x278b05=_0x2241bf;for(const _0x3cd7ce of _0x1bff3b){if(!_0x3cd7ce||_0x3cd7ce[_0x278b05(_0x2ff7a5._0x501d5e)](_0x278b05(_0x2ff7a5._0xad3344)))continue;if(existsSync(_0x3cd7ce))return _0x3cd7ce;}return null;}__name(firstExistingPath,_0x2241bf(0x13d));function whichOf(_0x404c4b){const _0x50f790={_0x5baec4:0x10f,_0x1200dc:0x102},_0x344ab4=_0x2241bf;if(process[_0x344ab4(0x152)]==='win32')return void 0x0;for(const _0x1462d8 of _0x404c4b){try{const _0x2cff4c=execFileSync(_0x344ab4(_0x50f790._0x5baec4),[_0x1462d8],{'encoding':'utf8'})[_0x344ab4(_0x50f790._0x1200dc)]();if(_0x2cff4c[_0x344ab4(0x150)]>0x0&&existsSync(_0x2cff4c))return _0x2cff4c;}catch{}}return void 0x0;}__name(whichOf,_0x2241bf(0x122));function runEnvironmentChecks(_0x23ae79={}){const _0xfb6210={_0x50777e:0x130},_0x47aaa6=_0x2241bf,_0x25fa13=_0x23ae79['cwd']??process[_0x47aaa6(_0xfb6210._0x50777e)]();return[checkNodeVersion(),checkSystemBrowser(),checkWritableCwd(_0x25fa13)];}__name(runEnvironmentChecks,_0x2241bf(0x14b));function checkNodeVersion(){const _0x54288b={_0x2df434:0xfe,_0x36af02:0xf9,_0x49dcc4:0xf3,_0x25bb53:0x129,_0x11c118:0x12e},_0x447a57=_0x2241bf,_0x57d40f=process['versions'][_0x447a57(_0x54288b._0x2df434)],_0x33a6c3=Number(_0x57d40f[_0x447a57(_0x54288b._0x36af02)]('.')[0x0]);if(!Number[_0x447a57(_0x54288b._0x49dcc4)](_0x33a6c3)||_0x33a6c3<0x14)return{'name':'Node.js\x20version','severity':_0x447a57(_0x54288b._0x25bb53),'message':_0x447a57(0x111)+_0x57d40f+')','detail':_0x447a57(0x127)};return{'name':_0x447a57(_0x54288b._0x11c118),'severity':'ok','message':_0x57d40f};}__name(checkNodeVersion,_0x2241bf(0x119));function checkSystemBrowser(){const _0x2e1ce8={_0x3067c3:0x136,_0x5c5b6f:0x147,_0x5b92ee:0x11b},_0xa356cc=_0x2241bf,_0x49f4fc=probeSystemBrowser();if(_0x49f4fc[_0xa356cc(_0x2e1ce8._0x3067c3)]!==null)return{'name':_0xa356cc(0x11c),'severity':'ok','message':_0x49f4fc[_0xa356cc(_0x2e1ce8._0x5c5b6f)]+_0xa356cc(_0x2e1ce8._0x5b92ee),'detail':_0x49f4fc[_0xa356cc(0x116)]};return{'name':_0xa356cc(0x11c),'severity':_0xa356cc(0x133),'message':_0xa356cc(0x113),'detail':'init\x20will\x20offer\x20to\x20download\x20bundled\x20Chromium\x20(~150\x20MB).\x20Alternatively,\x20install\x20Chrome\x20from\x20https://www.google.com/chrome\x20and\x20re-run.'};}__name(checkSystemBrowser,_0x2241bf(0xee));function checkWritableCwd(_0x4e8b6f){const _0x32b888={_0x285221:0x14f},_0xea6ccd=_0x2241bf;if(!_0x544ab2(_0x4e8b6f))return{'name':_0xea6ccd(0x14f),'severity':_0xea6ccd(0x129),'message':_0xea6ccd(0xeb)+_0x4e8b6f+_0xea6ccd(0x109),'detail':'Create\x20the\x20directory\x20or\x20run\x20init\x20in\x20an\x20existing\x20project\x20root.'};return{'name':_0xea6ccd(_0x32b888._0x285221),'severity':'ok','message':_0x4e8b6f};}__name(checkWritableCwd,_0x2241bf(0x14c));var PACKAGE_NAME=_0x2241bf(0x124),WebRunnerAdapter=class{static{__name(this,'WebRunnerAdapter');}[_0x2241bf(0x12b)]=PACKAGE_NAME;[_0x2241bf(0x117)]='';['debug']={'picker':!![],'attach':!![],'resumeFromFailure':![]};[_0x2241bf(0x10d)]=[_0x2241bf(0x101),_0x2241bf(0x120),_0x2241bf(0xfd)];[_0x2241bf(0xed)](){const _0xc81ab5={_0x241464:0x125},_0x17cc37=_0x2241bf,_0x17c5a6=createRequire(import.meta.url),_0x4cbfbb=_0x17c5a6[_0x17cc37(0x11d)](PACKAGE_NAME+'/package.json'),_0x4d5f1d=JSON[_0x17cc37(_0xc81ab5._0x241464)](readFileSync(_0x4cbfbb,'utf8')),_0x3fd713=pickBin(_0x4d5f1d);if(!_0x3fd713)throw new Error(PACKAGE_NAME+_0x17cc37(0xff));return join(dirname(_0x4cbfbb),_0x3fd713);}[_0x2241bf(0x103)](_0x238427){const _0x327335={_0x51f442:0xec,_0x2b3661:0x101,_0x59fa2e:0x10c,_0x224f82:0x135,_0x583e38:0x112,_0x2413d8:0x120,_0x4f599d:0x121,_0x52a4e1:0x13c,_0xfa123e:0x12b},_0x2c42b3=_0x2241bf;if(_0x238427[_0x2c42b3(_0x327335._0x51f442)]===_0x2c42b3(_0x327335._0x2b3661)){const _0xf367ae=[_0x2c42b3(_0x327335._0x59fa2e),_0x238427['scenario']];if(_0x238427['debug'])_0xf367ae['push'](_0x2c42b3(_0x327335._0x224f82));return _0x238427[_0x2c42b3(0x112)]&&_0x238427[_0x2c42b3(_0x327335._0x583e38)][_0x2c42b3(0x150)]>0x0&&_0xf367ae[_0x2c42b3(0x13c)](_0x2c42b3(0x123),_0x238427['breakpoints'][_0x2c42b3(0x11a)](',')),_0xf367ae;}if(_0x238427[_0x2c42b3(_0x327335._0x51f442)]===_0x2c42b3(0x120)){const _0x369fd4=[_0x2c42b3(_0x327335._0x2413d8),_0x238427[_0x2c42b3(0x120)]];_0x238427[_0x2c42b3(_0x327335._0x4f599d)]!==void 0x0&&_0x238427[_0x2c42b3(_0x327335._0x4f599d)]>0x1&&_0x369fd4[_0x2c42b3(_0x327335._0x52a4e1)](_0x2c42b3(0x114)+_0x238427[_0x2c42b3(_0x327335._0x4f599d)]);if(_0x238427['bail'])_0x369fd4[_0x2c42b3(_0x327335._0x52a4e1)](_0x2c42b3(0xef));return _0x369fd4;}if(_0x238427['kind']===_0x2c42b3(0xfd))return['author',_0x238427[_0x2c42b3(0x101)]];const _0x238797=_0x238427;throw new UnsupportedRunKindError(_0x238797[_0x2c42b3(_0x327335._0x51f442)],this[_0x2c42b3(_0x327335._0xfa123e)]);}[_0x2241bf(0xfa)](_0x95124d){const _0x151cd0=_0x2241bf,_0xfaed03={};if(_0x95124d[_0x151cd0(0xfc)])_0xfaed03[_0x151cd0(0x107)]='1';return _0xfaed03;}[_0x2241bf(0x104)](){const _0x4fcd22={_0x5f2a45:0x131},_0x207191=_0x2241bf;return[_0x207191(_0x4fcd22._0x5f2a45)];}async[_0x2241bf(0x110)](_0x247216){return runEnvironmentChecks({'cwd':_0x247216['projectRoot']});}},webRunnerAdapter=new WebRunnerAdapter(),web_runner_adapter_default=webRunnerAdapter;function _0x46c1(_0x590181,_0x2c564c){_0x590181=_0x590181-0xea;const _0x54ef51=_0x54ef();let _0x46c1ba=_0x54ef51[_0x590181];if(_0x46c1['TmGbJO']===undefined){var _0x5c2e9e=function(_0x405e96){const _0x123caf='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x544ab2='',_0x39334c='';for(let _0x4eff35=0x0,_0x582e6e,_0x2a1acc,_0x453786=0x0;_0x2a1acc=_0x405e96['charAt'](_0x453786++);~_0x2a1acc&&(_0x582e6e=_0x4eff35%0x4?_0x582e6e*0x40+_0x2a1acc:_0x2a1acc,_0x4eff35++%0x4)?_0x544ab2+=String['fromCharCode'](0xff&_0x582e6e>>(-0x2*_0x4eff35&0x6)):0x0){_0x2a1acc=_0x123caf['indexOf'](_0x2a1acc);}for(let _0x3dbe15=0x0,_0x6a709a=_0x544ab2['length'];_0x3dbe15<_0x6a709a;_0x3dbe15++){_0x39334c+='%'+('00'+_0x544ab2['charCodeAt'](_0x3dbe15)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x39334c);};_0x46c1['aaWuch']=_0x5c2e9e,_0x46c1['NkrNdo']={},_0x46c1['TmGbJO']=!![];}const _0x294589=_0x54ef51[0x0],_0x5c4644=_0x590181+_0x294589,_0x219abe=_0x46c1['NkrNdo'][_0x5c4644];return!_0x219abe?(_0x46c1ba=_0x46c1['aaWuch'](_0x46c1ba),_0x46c1['NkrNdo'][_0x5c4644]=_0x46c1ba):_0x46c1ba=_0x219abe,_0x46c1ba;}function pickBin(_0x564479){const _0x41ece6={_0x54fb81:0xea,_0x383bd8:0x146,_0x26c5c8:0x115,_0x156e2b:0xea},_0x565b27=_0x2241bf;if(typeof _0x564479['bin']===_0x565b27(0x13f))return _0x564479[_0x565b27(0xea)];if(_0x564479[_0x565b27(_0x41ece6._0x54fb81)]&&typeof _0x564479[_0x565b27(_0x41ece6._0x54fb81)]===_0x565b27(_0x41ece6._0x383bd8))return _0x564479[_0x565b27(0xea)]['unotest-web']??Object[_0x565b27(_0x41ece6._0x26c5c8)](_0x564479[_0x565b27(_0x41ece6._0x156e2b)])[0x0]??null;return null;}__name(pickBin,'pickBin');export{web_runner_adapter_default as default,webRunnerAdapter};
|
|
@@ -268,6 +268,30 @@ the last failed call plus recent failing exits. `filter:"layer:resolver"`
|
|
|
268
268
|
`filter:"tool:explore_step"` → recent events for that tool. `limit` caps
|
|
269
269
|
the count (default 50).
|
|
270
270
|
|
|
271
|
+
## Variable environments (dev / staging / prod)
|
|
272
|
+
|
|
273
|
+
Scenario variables come from `unotest/.env` + `unotest/.secrets`.
|
|
274
|
+
Setting `UNOTEST_ENV=<name>` layers `unotest/.env.<name>` /
|
|
275
|
+
`unotest/.secrets.<name>` on top (overlay wins — it holds only the keys
|
|
276
|
+
that differ; ambient shell env beats every file).
|
|
277
|
+
|
|
278
|
+
For MCP sessions the default environment is fixed at server start:
|
|
279
|
+
`run_test` / `explore_*` resolve against the `UNOTEST_ENV` the server
|
|
280
|
+
process inherited — set it in the MCP client's `env` block (e.g.
|
|
281
|
+
`.mcp.json`) and restart the server to switch the default.
|
|
282
|
+
|
|
283
|
+
`run_test` additionally accepts a per-call `env` parameter: the spawned
|
|
284
|
+
runner child gets `UNOTEST_ENV=<env>` for that run only (the server and
|
|
285
|
+
any explore session keep their own). CLI runs take `--env <name>` per
|
|
286
|
+
invocation.
|
|
287
|
+
|
|
288
|
+
You never have to guess the active state: `explore_start` and
|
|
289
|
+
`run_test` replies carry an `environment` field — the active name
|
|
290
|
+
(`null` = base) and every layer file with an `exists` flag — plus the
|
|
291
|
+
effective `baseUrl`. A missing variable error also lists the searched
|
|
292
|
+
layers, and every CLI run prints a one-line header with the layers and
|
|
293
|
+
the effective baseUrl.
|
|
294
|
+
|
|
271
295
|
## Debug logging
|
|
272
296
|
|
|
273
297
|
Set `UNOTEST_DEBUG=1` in `unotest/.env` and restart the MCP server to
|
package/guides/dsl-reference.md
CHANGED
|
@@ -53,8 +53,9 @@ function test_my_scenario() {
|
|
|
53
53
|
- [Multi-context](#multi-context) — multi-tab / iframes
|
|
54
54
|
- [Storage](#storage) — localStorage / cookies
|
|
55
55
|
- [Edge actions](#edge-actions) — drag, upload, paste
|
|
56
|
-
- [Sandbox primitives](#sandbox-primitives) — shell / db / HTTP
|
|
56
|
+
- [Sandbox primitives](#sandbox-primitives) — shell / db / HTTP / files
|
|
57
57
|
- [Typed getters](#typed-getters) — page properties
|
|
58
|
+
- [Generators](#generators) — random fixture data + time
|
|
58
59
|
- [`evaluate`](#evaluate) — escape hatch into the page
|
|
59
60
|
- [Logging](#logging)
|
|
60
61
|
|
|
@@ -330,8 +331,8 @@ assertUrl('https://example.com/checkout')
|
|
|
330
331
|
Generic boolean assert. Throws with `message` when `value` is falsy.
|
|
331
332
|
|
|
332
333
|
```js
|
|
333
|
-
|
|
334
|
-
assertTrue(
|
|
334
|
+
probe = shell('grep', '-q', 'ready', 'app.log', {allowNonZero: true});
|
|
335
|
+
assertTrue(probe.code == 0, 'app.log should contain "ready"');
|
|
335
336
|
```
|
|
336
337
|
|
|
337
338
|
---
|
|
@@ -350,6 +351,22 @@ Empty string when the element has no text node (does not throw).
|
|
|
350
351
|
|
|
351
352
|
### `isVisible(loc)` → `boolean`
|
|
352
353
|
|
|
354
|
+
### `isDisabled(loc)` → `boolean` / `isEnabled(loc)` → `boolean`
|
|
355
|
+
|
|
356
|
+
Disabled = native `:disabled` (covers `<fieldset disabled>` inheritance)
|
|
357
|
+
**or** `aria-disabled="true"`. Use these — not `getAttribute(loc,
|
|
358
|
+
'disabled')`, which cannot distinguish a present boolean attribute from
|
|
359
|
+
an absent one (both read as `""`).
|
|
360
|
+
|
|
361
|
+
```js
|
|
362
|
+
assertTrue(isEnabled(getByRole('button', {name: 'Send'})), 'send button should be active');
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
### `hasAttribute(loc, name)` → `boolean`
|
|
366
|
+
|
|
367
|
+
Whether the attribute is present at all — the honest probe for boolean
|
|
368
|
+
attributes (`disabled`, `readonly`, `required`, …).
|
|
369
|
+
|
|
353
370
|
```js
|
|
354
371
|
n = count(getByRole('row'));
|
|
355
372
|
if (n > 10) {
|
|
@@ -415,6 +432,26 @@ waitForText(/\bhi\b/, {timeout: 60000}); // word-boundary, long poll
|
|
|
415
432
|
|
|
416
433
|
`state: 'hidden'` waits until **no** visible occurrence remains.
|
|
417
434
|
|
|
435
|
+
**Echo trap — wait for the reply, not your own message.** In a chat/feed
|
|
436
|
+
UI the text you just sent is itself on the page, so
|
|
437
|
+
`waitForText('Bot Service')` after
|
|
438
|
+
`fill(box, '@Bot Service what is …')` goes green **before** the bot
|
|
439
|
+
answers — the wait matched your own input. The linter flags this
|
|
440
|
+
statically (`lint:echo-assert`). The robust pattern: count the messages,
|
|
441
|
+
send, then wait for the count to grow — and only then assert on reply
|
|
442
|
+
content:
|
|
443
|
+
|
|
444
|
+
```js
|
|
445
|
+
n = count(locator('[data-message]'));
|
|
446
|
+
fill(getByRole('textbox'), '@Bot Service ' + question);
|
|
447
|
+
press(getByRole('textbox'), 'Enter');
|
|
448
|
+
waitForCount(locator('[data-message]'), n + 2, {timeout: 90000}); // echo + reply
|
|
449
|
+
waitForText(/Ital/i, {timeout: 90000}); // reply content
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
A unique marker (`randomWord(8)`) in the outgoing message plus a wait on
|
|
453
|
+
reply-specific text also works when the feed has no stable item locator.
|
|
454
|
+
|
|
418
455
|
### `waitForCount(loc, count, options?)`
|
|
419
456
|
|
|
420
457
|
Poll until the locator matches **at least** `count` elements. The chat
|
|
@@ -435,14 +472,18 @@ waitForText(/\bshipping\b/i, {timeout: 90000});
|
|
|
435
472
|
### `pause(ms)`
|
|
436
473
|
|
|
437
474
|
Hard sleep. **Avoid** — the linter flags it (`lint:pause-explicit`). Use
|
|
438
|
-
`waitFor` / `waitForText` / assertion polling instead.
|
|
439
|
-
|
|
475
|
+
`waitFor` / `waitForText` / assertion polling instead. A justified
|
|
476
|
+
occurrence is silenced per-line with `// lint-ok: <reason>` (the reason
|
|
477
|
+
is required — a bare `// lint-ok` suppresses nothing):
|
|
440
478
|
|
|
441
479
|
```js
|
|
442
|
-
//
|
|
443
|
-
pause(500);
|
|
480
|
+
pause(500); // lint-ok: third-party widget has no completion signal to hook into
|
|
444
481
|
```
|
|
445
482
|
|
|
483
|
+
`// lint-ok:` works for any warning/info diagnostic on its line (legacy
|
|
484
|
+
helpers with known warnings stop drowning out new ones). Error-severity
|
|
485
|
+
diagnostics are never suppressible.
|
|
486
|
+
|
|
446
487
|
---
|
|
447
488
|
|
|
448
489
|
## Multi-context
|
|
@@ -558,20 +599,76 @@ apiBaseUrl}` — the scenario **cannot** override.
|
|
|
558
599
|
export default {
|
|
559
600
|
sandbox: {
|
|
560
601
|
shellCwd: process.cwd(),
|
|
602
|
+
shellTimeoutMs: 120000, // wall-clock budget per shell() call
|
|
603
|
+
exportSecrets: ['STAND_TOKEN'], // .secrets vars exported to shell() children
|
|
561
604
|
database: 'postgres://app:app@localhost:5432/myapp_test',
|
|
562
605
|
apiBaseUrl: 'http://localhost:3000/api',
|
|
563
606
|
},
|
|
564
607
|
};
|
|
565
608
|
```
|
|
566
609
|
|
|
567
|
-
### `shell(cmd, ...args)` → `{stdout, stderr, code}`
|
|
610
|
+
### `shell(cmd, ...args, options?)` → `{stdout, stderr, code}`
|
|
568
611
|
|
|
569
612
|
`execFile`-style — **no shell interpretation**, no `&&` / `|` /
|
|
570
613
|
redirection. cwd from `sandbox.shellCwd`.
|
|
571
614
|
|
|
615
|
+
Semantics:
|
|
616
|
+
|
|
617
|
+
- **Non-zero exit code fails the step** (typed error with the exit code
|
|
618
|
+
and stderr/stdout tails). To inspect the code yourself — e.g. a probe
|
|
619
|
+
where non-zero is expected — pass `{allowNonZero: true}` as the last
|
|
620
|
+
argument; the call then resolves with `{stdout, stderr, code}`.
|
|
621
|
+
- A missing binary / permission fault is a distinct "failed to start"
|
|
622
|
+
error, never a fake `code: 1`.
|
|
623
|
+
- **Timeout**: each call has a wall-clock budget —
|
|
624
|
+
`sandbox.shellTimeoutMs` (default 120 000 ms) or per-call
|
|
625
|
+
`{timeoutMs}`. On expiry the child is killed and the step fails.
|
|
626
|
+
- Output capture is limited to 10 MiB per stream; exceeding it fails the
|
|
627
|
+
step (write bulk output to a file instead).
|
|
628
|
+
- **Env**: the child inherits the runner's `process.env` (which includes
|
|
629
|
+
`unotest/.env` layers). Secrets from `.secrets*` are **not** inherited;
|
|
630
|
+
export them explicitly via the `sandbox.exportSecrets` allowlist
|
|
631
|
+
(values stay masked in logs).
|
|
632
|
+
|
|
572
633
|
```js
|
|
573
|
-
out = shell('pnpm', 'db:create-user', 'alice');
|
|
574
|
-
|
|
634
|
+
out = shell('pnpm', 'db:create-user', 'alice'); // non-zero exit → step fails
|
|
635
|
+
probe = shell('grep', '-q', 'ready', 'app.log', {allowNonZero: true});
|
|
636
|
+
if (probe.code == 0) { /* … */ }
|
|
637
|
+
```
|
|
638
|
+
|
|
639
|
+
**Background / detached processes.** `shell()` waits for the child's
|
|
640
|
+
stdout/stderr pipes to close, not just for the command to exit. A
|
|
641
|
+
command that spawns a background process (`nohup node listener.js &`
|
|
642
|
+
inside a wrapper script) keeps the pipes open — the call runs until the
|
|
643
|
+
timeout. Recipe: fully detach the worker inside the wrapper script by
|
|
644
|
+
redirecting all its descriptors, then await its output with
|
|
645
|
+
`waitForFile`:
|
|
646
|
+
|
|
647
|
+
```bash
|
|
648
|
+
#!/bin/sh
|
|
649
|
+
# start-listener.sh — detach completely: new session, no inherited fds
|
|
650
|
+
node listener.js < /dev/null > listener.log 2>&1 &
|
|
651
|
+
```
|
|
652
|
+
|
|
653
|
+
```js
|
|
654
|
+
step("Start the listener", () => {
|
|
655
|
+
shell('./scripts/start-listener.sh');
|
|
656
|
+
waitForFile('listener.log', 'listening on', {timeoutMs: 10000});
|
|
657
|
+
});
|
|
658
|
+
```
|
|
659
|
+
|
|
660
|
+
### `waitForFile(path, pattern?, options?)` → `string`
|
|
661
|
+
|
|
662
|
+
The file-side analogue of `waitForText` — polls a file until it exists
|
|
663
|
+
and (optionally) contains `pattern` (substring or regex literal), then
|
|
664
|
+
returns the file content. Relative `path` resolves against
|
|
665
|
+
`sandbox.shellCwd`. `options`: `{timeoutMs}` (default 20 000 ms). On
|
|
666
|
+
expiry the step fails with the file path and the last observed state.
|
|
667
|
+
|
|
668
|
+
```js
|
|
669
|
+
step("Wait for the bot reply in the JSONL feed", () => {
|
|
670
|
+
line = waitForFile('events.jsonl', /"type":"reply"/, {timeoutMs: 30000});
|
|
671
|
+
});
|
|
575
672
|
```
|
|
576
673
|
|
|
577
674
|
### `dbQuery(sql, ...params)` → `rows[]`
|
|
@@ -619,26 +716,31 @@ The variable must hold an http(s) URL; an unknown name fails with the
|
|
|
619
716
|
usual "add it to unotest/.env" message. URLs never appear in the
|
|
620
717
|
scenario — hosts are controlled by project env files only.
|
|
621
718
|
|
|
622
|
-
**Multipart file upload
|
|
623
|
-
|
|
719
|
+
**Multipart file upload — `upload(path, options?)`.** Passing the
|
|
720
|
+
result of `upload(...)` as the body posts `multipart/form-data`:
|
|
624
721
|
|
|
625
722
|
```js
|
|
626
723
|
res = apiCall('POST', '/tenants/t1/documents',
|
|
627
|
-
|
|
724
|
+
upload('fixtures/manual.pdf', {fields: {source: 'e2e'}}),
|
|
628
725
|
{Authorization: BEARER});
|
|
629
726
|
assertTrue(res.status == 202, 'ingestion not accepted');
|
|
630
727
|
```
|
|
631
728
|
|
|
632
|
-
- `
|
|
729
|
+
- `path` — **relative**, resolved against `sandbox.uploadDir`
|
|
633
730
|
(defaults to the project root). Absolute paths and `../` escapes
|
|
634
731
|
out of that root throw.
|
|
635
|
-
- `field` — form part name, default `"file"`.
|
|
636
|
-
parts. The part's content type
|
|
637
|
-
|
|
732
|
+
- `options.field` — form part name, default `"file"`.
|
|
733
|
+
`options.fields` — extra string parts. The part's content type
|
|
734
|
+
derives from the file extension.
|
|
735
|
+
- Don't set a `Content-Type` header with an `upload()` body — `fetch`
|
|
638
736
|
derives the boundary itself; a manual value throws.
|
|
639
|
-
-
|
|
640
|
-
key
|
|
641
|
-
modes
|
|
737
|
+
- Plain JSON bodies are NEVER promoted to multipart — a body with a
|
|
738
|
+
`file` key posts as JSON. (Before 0.11, the exact shape
|
|
739
|
+
`{file, field?, fields?}` switched modes by key name; that magic
|
|
740
|
+
broke JSON APIs with a legitimate `file` field and is gone —
|
|
741
|
+
migrate to `upload(...)`.)
|
|
742
|
+
- `upload(...)` must be the body itself, not a field inside a JSON
|
|
743
|
+
body — extra form fields go in `options.fields`.
|
|
642
744
|
|
|
643
745
|
---
|
|
644
746
|
|
|
@@ -652,6 +754,11 @@ Read page properties directly into a local variable.
|
|
|
652
754
|
href = getAttribute(getByRole('link', {name: 'Docs'}), 'href');
|
|
653
755
|
```
|
|
654
756
|
|
|
757
|
+
Returns `""` when the attribute is missing — which makes it **blind to
|
|
758
|
+
boolean attributes**: `<button disabled>` and a button without the
|
|
759
|
+
attribute both read `""`. For those use `isDisabled(loc)` /
|
|
760
|
+
`hasAttribute(loc, name)`.
|
|
761
|
+
|
|
655
762
|
### `getInnerText(loc)` → `string`
|
|
656
763
|
|
|
657
764
|
Like `textContent` but trimmed and rendered (display-aware).
|
|
@@ -671,6 +778,39 @@ Active page URL.
|
|
|
671
778
|
|
|
672
779
|
---
|
|
673
780
|
|
|
781
|
+
## Generators
|
|
782
|
+
|
|
783
|
+
Random fixture data and time values — no imports, no `Date` / `Math` in
|
|
784
|
+
scenarios.
|
|
785
|
+
|
|
786
|
+
### `randomFirstName()` / `randomLastName()` / `randomEmail()` → `string`
|
|
787
|
+
|
|
788
|
+
### `randomText(length)` → `string`
|
|
789
|
+
|
|
790
|
+
Lorem-style prose cut to `length` characters.
|
|
791
|
+
|
|
792
|
+
### `randomWord(length?)` → `string`
|
|
793
|
+
|
|
794
|
+
Random lowercase letters, default 8 — digit-free unique markers for apps
|
|
795
|
+
whose content filters reject numbers in text.
|
|
796
|
+
|
|
797
|
+
```js
|
|
798
|
+
marker = randomWord(10);
|
|
799
|
+
fill(getByRole('textbox'), 'ping ' + marker);
|
|
800
|
+
waitForText(marker);
|
|
801
|
+
```
|
|
802
|
+
|
|
803
|
+
### `nowMs()` → `number`
|
|
804
|
+
|
|
805
|
+
Current epoch milliseconds — unique numeric suffixes.
|
|
806
|
+
|
|
807
|
+
### `today()` → `string` / `daysFromNow(n)` → `string`
|
|
808
|
+
|
|
809
|
+
Local date as `YYYY-MM-DD`; `daysFromNow` accepts negative `n` for past
|
|
810
|
+
dates.
|
|
811
|
+
|
|
812
|
+
---
|
|
813
|
+
|
|
674
814
|
## `evaluate`
|
|
675
815
|
|
|
676
816
|
`evaluate(js, ...args)` — escape hatch. Runs `js` in the active page
|
|
@@ -714,6 +854,12 @@ screenshot('landing', {fullPage: true}); // full scroll height
|
|
|
714
854
|
- `name` is slugified to `[a-z0-9._-]` (`'Bot Reply!'` → `bot-reply`);
|
|
715
855
|
omitted → `shot`. Files are numbered in capture order.
|
|
716
856
|
- **Options:** `fullPage?` (default `false` — viewport only).
|
|
857
|
+
- Before capturing, the call waits for the network to go quiet and for a
|
|
858
|
+
painted frame (up to 2s). Without it a `screenshot()` right after
|
|
859
|
+
`goto()` would freeze the blank pre-render frame — `goto` resolves on
|
|
860
|
+
`load`, which on a client-rendered app fires before any content is on
|
|
861
|
+
screen. A page that never goes quiet (polling, live feeds) costs the
|
|
862
|
+
2s cap and is then captured as-is.
|
|
717
863
|
- Not a visual assertion: the test does not compare images. In runtimes
|
|
718
864
|
with no artifact dir (exploration) the call logs a warning, returns
|
|
719
865
|
`null` and does NOT fail the run.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@unotest/web",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0",
|
|
4
4
|
"description": "AI-native E2E testing for web applications. MCP server (run_test / step / resume / inspect_runtime / agent_fix) + CLI runner + JavaScript DSL scenarios on a sandboxed AST engine + semantic DOM snapshots.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"publishConfig": {
|
|
@@ -79,54 +79,17 @@
|
|
|
79
79
|
"tsx": "^4.19.2",
|
|
80
80
|
"yaml": "^2.6.0",
|
|
81
81
|
"zod": "^3.23.8",
|
|
82
|
-
"@unotest/core": "^0.
|
|
83
|
-
"@unotest/
|
|
84
|
-
"@unotest/
|
|
85
|
-
"@unotest/
|
|
86
|
-
"@unotest/grounder-client": "^0.
|
|
82
|
+
"@unotest/core": "^0.12.0",
|
|
83
|
+
"@unotest/protocol": "^0.12.0",
|
|
84
|
+
"@unotest/viewer": "^0.12.0",
|
|
85
|
+
"@unotest/dsl": "^0.12.0",
|
|
86
|
+
"@unotest/grounder-client": "^0.12.0"
|
|
87
87
|
},
|
|
88
88
|
"devDependencies": {
|
|
89
89
|
"@types/node": "^22.10.0",
|
|
90
90
|
"javascript-obfuscator": "^4.1.1",
|
|
91
91
|
"tsup": "^8.5.1",
|
|
92
92
|
"typescript": "^5.7.2",
|
|
93
|
-
"@unotest/grounder": "^0.
|
|
94
|
-
},
|
|
95
|
-
"scripts": {
|
|
96
|
-
"typecheck": "tsc --noEmit",
|
|
97
|
-
"design": "npx serve -l 3111 design",
|
|
98
|
-
"test": "node --import tsx --test --test-reporter=spec 'src/**/*.test.ts' 'scripts/**/*.test.mjs' 'evals/**/*.test.ts'",
|
|
99
|
-
"compile": "tsup",
|
|
100
|
-
"compile:all": "pnpm -C ../dsl compile && pnpm compile && pnpm -C ../viewer compile",
|
|
101
|
-
"lint:scenarios": "tsx src/runner/cli.ts lint",
|
|
102
|
-
"smoke:bundle": "node scripts/smoke-bundle.mjs",
|
|
103
|
-
"check:docs-sync": "node scripts/check-docs-sync.mjs",
|
|
104
|
-
"check:no-internal-refs": "node scripts/check-no-internal-refs.mjs",
|
|
105
|
-
"check:no-cyrillic": "node scripts/check-no-cyrillic.mjs",
|
|
106
|
-
"check:surface": "pnpm check:no-internal-refs && pnpm check:no-cyrillic && pnpm check:skill-prompt-sync && pnpm check:skills-built",
|
|
107
|
-
"check:skill-prompt-sync": "node scripts/check-skill-prompt-sync.mjs",
|
|
108
|
-
"check:skills-built": "node scripts/build-skills.mjs --check",
|
|
109
|
-
"build:skills": "node scripts/build-skills.mjs",
|
|
110
|
-
"check:tarball": "node scripts/check-tarball.mjs",
|
|
111
|
-
"check:sibling-versions": "node scripts/check-sibling-versions.mjs",
|
|
112
|
-
"build:guides": "node scripts/build-guides.mjs",
|
|
113
|
-
"prepublish:check": "node scripts/prepublish-check.mjs",
|
|
114
|
-
"evals:chain": "tsx evals/chain.ts",
|
|
115
|
-
"evals:replay": "tsx evals/replay.ts",
|
|
116
|
-
"evals:run": "tsx evals/run.ts",
|
|
117
|
-
"evals:drive": "tsx evals/drive.ts",
|
|
118
|
-
"evals:ground-bench": "tsx evals/ground-bench.ts",
|
|
119
|
-
"evals:prepare": "tsx evals/prepare.ts",
|
|
120
|
-
"evals:check": "tsx evals/check.ts",
|
|
121
|
-
"evals:bless": "tsx evals/bless.ts",
|
|
122
|
-
"evals:diff": "tsx evals/diff.ts",
|
|
123
|
-
"perf:baseline": "node scripts/perf-baseline.mjs",
|
|
124
|
-
"verify": "pnpm typecheck && pnpm lint:scenarios && pnpm check:surface && pnpm test",
|
|
125
|
-
"obfuscate": "node scripts/obfuscate.mjs",
|
|
126
|
-
"build": "pnpm verify && pnpm compile && pnpm obfuscate && pnpm smoke:bundle && pnpm build:guides && pnpm check:tarball",
|
|
127
|
-
"e2e": "tsx src/runner/cli.ts e2e",
|
|
128
|
-
"m1:cross-browser": "node scripts/m1-cross-browser.mjs",
|
|
129
|
-
"mcp": "tsx src/mcp/server.ts",
|
|
130
|
-
"serve-fixture": "node examples/fixtures/break-fix-app/serve.mjs"
|
|
93
|
+
"@unotest/grounder": "^0.12.0"
|
|
131
94
|
}
|
|
132
95
|
}
|
|
@@ -235,6 +235,11 @@ result = evaluate(
|
|
|
235
235
|
);
|
|
236
236
|
```
|
|
237
237
|
|
|
238
|
+
Index access reads data off a **bare variable** only — `obj.prop[i]`
|
|
239
|
+
does not parse; assign the member first:
|
|
240
|
+
`m = state.matches; last = m[m.length - 1];`. `arr[i] = v` stays
|
|
241
|
+
rejected.
|
|
242
|
+
|
|
238
243
|
## Sandbox primitives
|
|
239
244
|
|
|
240
245
|
For test setup / teardown that touches the host machine, the registry
|
|
@@ -246,9 +251,13 @@ exposes four primitives — **but the consumer project's
|
|
|
246
251
|
- **`dbQuery(sql, …params)`** / **`dbExec(sql, …params)`** —
|
|
247
252
|
parameterized SQL against `sandbox.database` (postgres / mysql /
|
|
248
253
|
sqlite, picked by URL scheme).
|
|
249
|
-
- **`apiCall(method, path, body?, headers?)`** — HTTP fetch
|
|
250
|
-
`sandbox.apiBaseUrl`. **Path-only** — absolute URLs throw to
|
|
251
|
-
scenarios from hitting arbitrary hosts.
|
|
254
|
+
- **`apiCall(method, path, body?, headers?, opts?)`** — HTTP fetch
|
|
255
|
+
against `sandbox.apiBaseUrl`. **Path-only** — absolute URLs throw to
|
|
256
|
+
prevent scenarios from hitting arbitrary hosts. Multipart upload:
|
|
257
|
+
pass `upload('fixtures/doc.pdf', {field?, fields?})` as the body
|
|
258
|
+
(relative path inside the project / `sandbox.uploadDir`; don't set
|
|
259
|
+
Content-Type yourself). A JSON body with a `file` key posts as plain
|
|
260
|
+
JSON — there is no key-name magic.
|
|
252
261
|
|
|
253
262
|
If a primitive throws with "sandbox.X is not configured", tell the
|
|
254
263
|
user to add it to `unotest.config.*`. Do not infer secrets from the
|