ms-vite-plugin 1.4.81 → 1.4.83

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/dist/build.js CHANGED
@@ -1 +1 @@
1
- "use strict";var F=Object.create;var J=Object.defineProperty;var $=Object.getOwnPropertyDescriptor;var N=Object.getOwnPropertyNames;var q=Object.getPrototypeOf,z=Object.prototype.hasOwnProperty;var C=(t,e,o,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of N(e))!z.call(t,r)&&r!==o&&J(t,r,{get:()=>e[r],enumerable:!(s=$(e,r))||s.enumerable});return t};var W=(t,e,o)=>(o=t!=null?F(q(t)):{},C(e||!t||!t.__esModule?J(o,"default",{value:t,enumerable:!0}):o,t));var K=exports&&exports.__createBinding||(Object.create?(function(t,e,o,s){s===void 0&&(s=o);var r=Object.getOwnPropertyDescriptor(e,o);(!r||("get"in r?!e.__esModule:r.writable||r.configurable))&&(r={enumerable:!0,get:function(){return e[o]}}),Object.defineProperty(t,s,r)}):(function(t,e,o,s){s===void 0&&(s=o),t[s]=e[o]})),T=exports&&exports.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),E=exports&&exports.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(o){var s=[];for(var r in o)Object.prototype.hasOwnProperty.call(o,r)&&(s[s.length]=r);return s},t(e)};return function(e){if(e&&e.__esModule)return e;var o={};if(e!=null)for(var s=t(e),r=0;r<s.length;r++)s[r]!=="default"&&K(o,e,s[r]);return T(o,e),o}})(),L=exports&&exports.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.buildAll=void 0;const A=L(require("archiver")),P=require("child_process"),i=E(require("fs-extra")),M=E(require("os")),n=E(require("path")),B=require("./stopGuardPlugin"),G=require("./luaBundle"),x=require("./scriptProtect"),H=L(require("vite-plugin-bundle-obfuscator"));async function R(t,e){const o=(0,A.default)("zip",{zlib:{level:9}}),s=i.createWriteStream(e);return new Promise((r,c)=>{o.directory(t,!1).on("error",a=>c(a)).pipe(s),s.on("close",()=>r()),o.finalize()})}function I(t){const e=n.join(t,"node_modules","typescript","lib","tsc.js");return i.pathExistsSync(e)?e:void 0}function Q(t){const e=n.join(t,"tsconfig.json");i.pathExistsSync(e)||(console.error("\u274C \u672A\u627E\u5230 tsconfig.json\uFF0C\u65E0\u6CD5\u8FDB\u884C\u7C7B\u578B\u6821\u9A8C"),process.exit(1));const o=I(t);o||(console.error("\u274C \u672A\u627E\u5230 typescript\uFF0C\u8BF7\u5B89\u88C5\u540E\u91CD\u8BD5"),process.exit(1)),console.log("\u{1F50E} \u6B63\u5728\u8FDB\u884C\u7C7B\u578B\u6821\u9A8C...");const s=(0,P.spawnSync)(process.execPath,[o,"--noEmit","--pretty","--allowJs","--checkJs"],{cwd:t,stdio:"inherit"});s.status!==0&&(console.error("\u274C \u7C7B\u578B\u6821\u9A8C\u5931\u8D25"),process.exit(s.status??1)),console.log("\u2705 \u7C7B\u578B\u6821\u9A8C\u901A\u8FC7")}async function U(t,e){const o=[];async function s(r){const c=await i.readdir(r,{withFileTypes:!0});for(const a of c){const f=n.resolve(r,a.name);a.isDirectory()?await s(f):a.isFile()&&(/^main\.(js|ts)$/.test(a.name)||/_thread\.(js|ts)$/.test(a.name))&&o.push(n.relative(e,f))}}return await s(t),o}function V(){const t=[{cmd:n.join(M.homedir(),".KuaiJSDevloper","python","python.exe"),args:["--version"]},{cmd:n.join(M.homedir(),".KuaiJSDevloper","python","bin","python"),args:["--version"]},{cmd:"python",args:["--version"]},{cmd:"python3",args:["--version"]},{cmd:"python3.14",args:["--version"]}];for(const e of t)try{const o=(0,P.spawnSync)(e.cmd,e.args,{encoding:"utf8"}),s=(o.stdout||o.stderr||"").trim();if(s&&/Python\s+3\.14(\.\d+)?/i.test(s))return{ok:!0,path:e.cmd,version:s}}catch{}return{ok:!1}}async function X(t){async function e(o){const s=await i.readdir(o,{withFileTypes:!0});for(const r of s){const c=n.join(o,r.name);if(r.isDirectory())if(r.name==="__pycache__"){const a=await i.readdir(c,{withFileTypes:!0});for(const f of a){const S=n.join(c,f.name);if(f.isFile()&&f.name.endsWith(".cpython-314.pyc")){const O=n.dirname(c),b=f.name.replace(/\.cpython-314\.pyc$/,".pyc"),w=n.join(O,b);await i.move(S,w,{overwrite:!0})}}try{await i.remove(c)}catch{}}else await e(c);else if(r.isFile())if(r.name.endsWith(".cpython-314.pyc")){const a=c.replace(".cpython-314.pyc",".pyc");await i.move(c,a,{overwrite:!0})}else r.name.endsWith(".py")&&await i.remove(c)}}await e(t)}const Y=["Minify","Weak","Medium","Strong"];async function Z(t){const e=n.join(t,"obfuscator.json");if(!await i.pathExists(e))return{enabled:!0,preset:"Medium",bundle:!0};try{const o=await i.readJSON(e),s=o?.enabled!==!1,r=o?.bundle!==!1,c=k(o?.preset);return{enabled:s,preset:c,bundle:r}}catch(o){return console.error("\u274C \u65E0\u6CD5\u8BFB\u53D6 obfuscator.json"),console.error(o instanceof Error?o.message:String(o)),process.exit(1),{enabled:!0,preset:"Medium",bundle:!0}}}function k(t){if(typeof t!="string")return"Medium";const e=Y.find(o=>o.toLowerCase()===t.trim().toLowerCase());return e||(console.warn(`\u26A0\uFE0F obfuscator.json \u7684 preset \u65E0\u6548: ${t}\uFF0C\u5DF2\u6539\u7528 Medium`),"Medium")}function ee(t){return[n.join(t,"node_modules/@gamely/prometheus-cli/bin/cli.js"),n.join(t,"node_modules/ms-vite-plugin/node_modules/@gamely/prometheus-cli/bin/cli.js"),n.resolve(process.cwd(),"node_modules/@gamely/prometheus-cli/bin/cli.js")].find(o=>i.pathExistsSync(o))}const te=async(t=!0,e)=>{const o=n.join(e,"scripts"),s=await i.pathExists(n.join(o,"main.js"))||await i.pathExists(n.join(o,"main.ts")),r=await i.pathExists(n.join(o,"main.py")),c=await i.pathExists(n.join(o,"main.lua"));if(s){console.log("\u{1F680} \u5F00\u59CB\u6784\u5EFAJavaScript\u9879\u76EE..."),Q(e);const{build:l}=await import("vite"),u=n.join(e,"obfuscator.json");await i.pathExists(u)||(console.error("\u274C \u9519\u8BEF: \u5F53\u524D\u76EE\u5F55\u4E0D\u662F\u6709\u6548\u7684 \u5FEB\u70B9JS \u9879\u76EE"),console.error("\u8BF7\u786E\u4FDD\u76EE\u5F55\u5305\u542B\u4EE5\u4E0B\u6587\u4EF6:"),console.error(" - obfuscator.json"),process.exit(1));const j=await i.readJSON(u),m=j.scriptProtect===!0,{enabled:_,scriptProtect:y,...p}=j,d=n.join(e,t?"dist":"msbundle"),h=await U(o,o);await i.remove(d);const g=!t&&m?(0,x.createScriptProtectHelpers)():[];!t&&m&&console.log("\u{1F510} \u5DF2\u542F\u7528 JS \u539F\u751F\u4FDD\u62A4\uFF08scriptProtect=true\uFF09");for(const v of h)await l({root:e,build:{lib:{entry:{[n.basename(v,n.extname(v))]:`./scripts/${v}`},fileName:()=>v.replace(/\.ts$/,".js"),formats:["iife"],name:"KuaiJS"},outDir:t?"dist/scripts":"msbundle/scripts",emptyOutDir:!1,sourcemap:t,minify:!t,target:"safari15"},plugins:[(0,B.createStopGuardPlugin)(),...t?[]:[...m?[(0,x.createScriptProtectPlugin)(g)]:[],_?(0,H.default)({autoExcludeNodeModules:!0,threadPool:!0,options:{...p,target:"browser",debugProtection:!1,disableConsoleOutput:!1,domainLock:[],selfDefending:!1,renameGlobals:!1,renameProperties:!1,reservedNames:[...p.reservedNames||[],...g]}}):[],...m?[(0,x.createKjstEmbedPlugin)()]:[]]]})}if(t)return;const a=n.join(e,"msbundle");if(await i.ensureDir(a),(r||c)&&await i.copy(n.join(e,"scripts"),n.join(a,"scripts")),r){const l=V();if(l.ok){console.log(`\u2705 \u68C0\u6D4B\u5230 ${l.version} (${l.path})`);const u=(0,P.spawnSync)(l.path,["-m","compileall","scripts"],{encoding:"utf8",cwd:a});u.status===0?(console.log("\u2705 \u6210\u529F\u7F16\u8BD1\u6240\u6709 Python \u6587\u4EF6"),await X(n.join(a,"scripts"))):(console.error("\u274C \u7F16\u8BD1 Python \u6587\u4EF6\u5931\u8D25"),console.error(u.stderr),process.exit(1))}else console.warn("\u26A0\uFE0F \u672A\u68C0\u6D4B\u5230 Python 3.14\uFF0C\u8BF7\u786E\u4FDD\u5728\u76EE\u6807\u8FD0\u884C\u73AF\u5883\u5B89\u88C5 Python 3.14")}else if(c){const l=await Z(e),u=n.join(a,"scripts");if(l.bundle?await(0,G.bundleLuaScripts)(u):console.log("\u2139\uFE0F \u5DF2\u5173\u95ED Lua \u5355\u6587\u4EF6\u5408\u5E76\uFF08obfuscator.json bundle=false\uFF09"),!l.enabled)console.log("\u2139\uFE0F \u5DF2\u5173\u95ED Lua \u6DF7\u6DC6\uFF08obfuscator.json enabled=false\uFF09");else{const j=[],m=async y=>{const p=await i.readdir(y,{withFileTypes:!0});for(const d of p){const h=n.join(y,d.name);d.isDirectory()?await m(h):d.isFile()&&d.name.endsWith(".lua")&&j.push(h)}};await m(u);const _=ee(e);_||(console.error("\u274C \u672A\u627E\u5230 @gamely/prometheus-cli\uFF0C\u65E0\u6CD5\u6DF7\u6DC6 Lua"),process.exit(1));for(const y of j){const p=n.relative(u,y);console.log(`\u{1F6E0}\uFE0F \u6DF7\u6DC6 Lua: ${p} (preset=${l.preset})`);const d=(0,P.spawnSync)(process.execPath,[_,p,"--preset",l.preset],{cwd:u,encoding:"utf8"});d.status!==0&&(console.error("\u274C \u6DF7\u6DC6 Lua \u5931\u8D25:",p),console.error(d.stderr||d.stdout||""),process.exit(1));const h=p.replace(/\.lua$/,".obfuscated.lua"),g=n.join(u,h);await i.pathExists(g)&&(await i.remove(y),await i.move(g,y,{overwrite:!0}))}console.log("\u2705 Lua \u6DF7\u6DC6\u5B8C\u6210")}}await i.copy(n.join(e,"res"),n.join(a,"res")),await i.copy(n.join(e,"ui"),n.join(a,"ui"));for(const l of["logo.jpg","logo.png"]){const u=n.join(e,l);await i.pathExists(u)&&await i.copy(u,n.join(a,l))}const f=n.join(e,"dist"),S=n.join(e,"package.json"),O=n.join(a,"package.json"),b=await i.readJSON(S);delete b.scripts,delete b.devDependencies,delete b.dependencies,await i.writeJSON(O,b,{spaces:2}),await i.emptyDir(f);const w=n.join(f,"ms.zip"),D=n.join(f,"ms.msbundle");await R(a,w),await i.rename(w,D),await i.remove(a)};exports.buildAll=te;
1
+ "use strict";var F=Object.create;var L=Object.defineProperty;var $=Object.getOwnPropertyDescriptor;var N=Object.getOwnPropertyNames;var q=Object.getPrototypeOf,z=Object.prototype.hasOwnProperty;var C=(t,e,o,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of N(e))!z.call(t,s)&&s!==o&&L(t,s,{get:()=>e[s],enumerable:!(i=$(e,s))||i.enumerable});return t};var W=(t,e,o)=>(o=t!=null?F(q(t)):{},C(e||!t||!t.__esModule?L(o,"default",{value:t,enumerable:!0}):o,t));var K=exports&&exports.__createBinding||(Object.create?(function(t,e,o,i){i===void 0&&(i=o);var s=Object.getOwnPropertyDescriptor(e,o);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[o]}}),Object.defineProperty(t,i,s)}):(function(t,e,o,i){i===void 0&&(i=o),t[i]=e[o]})),T=exports&&exports.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),E=exports&&exports.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(o){var i=[];for(var s in o)Object.prototype.hasOwnProperty.call(o,s)&&(i[i.length]=s);return i},t(e)};return function(e){if(e&&e.__esModule)return e;var o={};if(e!=null)for(var i=t(e),s=0;s<i.length;s++)i[s]!=="default"&&K(o,e,i[s]);return T(o,e),o}})(),M=exports&&exports.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.buildAll=void 0;const A=M(require("archiver")),P=require("child_process"),r=E(require("fs-extra")),x=E(require("os")),n=E(require("path")),B=require("./stopGuardPlugin"),G=require("./luaBundle"),J=require("./scriptProtect"),H=M(require("vite-plugin-bundle-obfuscator"));async function R(t,e){const o=(0,A.default)("zip",{zlib:{level:9}}),i=r.createWriteStream(e);return new Promise((s,c)=>{o.directory(t,!1).on("error",a=>c(a)).pipe(i),i.on("close",()=>s()),o.finalize()})}function I(t){const e=n.join(t,"node_modules","typescript","lib","tsc.js");return r.pathExistsSync(e)?e:void 0}function Q(t){const e=n.join(t,"tsconfig.json");r.pathExistsSync(e)||(console.error("\u274C \u672A\u627E\u5230 tsconfig.json\uFF0C\u65E0\u6CD5\u8FDB\u884C\u7C7B\u578B\u6821\u9A8C"),process.exit(1));const o=I(t);o||(console.error("\u274C \u672A\u627E\u5230 typescript\uFF0C\u8BF7\u5B89\u88C5\u540E\u91CD\u8BD5"),process.exit(1));const i=n.join(x.tmpdir(),`kuaijs-tsconfig-${process.pid}.json`),s=c=>c.replace(/\\/g,"/");r.writeJsonSync(i,{extends:s(e),include:[s(n.join(t,"env.d.ts")),s(n.join(t,"scripts/**/*"))],exclude:["node_modules","dist","msbundle","ui","res"].map(c=>s(n.join(t,c))),compilerOptions:{noEmit:!0,allowJs:!0,checkJs:!0,skipLibCheck:!0}}),console.log("\u{1F50E} \u6B63\u5728\u8FDB\u884C\u7C7B\u578B\u6821\u9A8C...");try{const c=(0,P.spawnSync)(process.execPath,[o,"--noEmit","--pretty","-p",i],{cwd:t,stdio:"inherit"});c.status!==0&&(console.error("\u274C \u7C7B\u578B\u6821\u9A8C\u5931\u8D25"),process.exit(c.status??1))}finally{r.removeSync(i)}console.log("\u2705 \u7C7B\u578B\u6821\u9A8C\u901A\u8FC7")}async function U(t,e){const o=[];async function i(s){const c=await r.readdir(s,{withFileTypes:!0});for(const a of c){const f=n.resolve(s,a.name);a.isDirectory()?await i(f):a.isFile()&&(/^main\.(js|ts)$/.test(a.name)||/_thread\.(js|ts)$/.test(a.name))&&o.push(n.relative(e,f))}}return await i(t),o}function V(){const t=[{cmd:n.join(x.homedir(),".KuaiJSDevloper","python","python.exe"),args:["--version"]},{cmd:n.join(x.homedir(),".KuaiJSDevloper","python","bin","python"),args:["--version"]},{cmd:"python",args:["--version"]},{cmd:"python3",args:["--version"]},{cmd:"python3.14",args:["--version"]}];for(const e of t)try{const o=(0,P.spawnSync)(e.cmd,e.args,{encoding:"utf8"}),i=(o.stdout||o.stderr||"").trim();if(i&&/Python\s+3\.14(\.\d+)?/i.test(i))return{ok:!0,path:e.cmd,version:i}}catch{}return{ok:!1}}async function X(t){async function e(o){const i=await r.readdir(o,{withFileTypes:!0});for(const s of i){const c=n.join(o,s.name);if(s.isDirectory())if(s.name==="__pycache__"){const a=await r.readdir(c,{withFileTypes:!0});for(const f of a){const S=n.join(c,f.name);if(f.isFile()&&f.name.endsWith(".cpython-314.pyc")){const O=n.dirname(c),b=f.name.replace(/\.cpython-314\.pyc$/,".pyc"),w=n.join(O,b);await r.move(S,w,{overwrite:!0})}}try{await r.remove(c)}catch{}}else await e(c);else if(s.isFile())if(s.name.endsWith(".cpython-314.pyc")){const a=c.replace(".cpython-314.pyc",".pyc");await r.move(c,a,{overwrite:!0})}else s.name.endsWith(".py")&&await r.remove(c)}}await e(t)}const Y=["Minify","Weak","Medium","Strong"];async function Z(t){const e=n.join(t,"obfuscator.json");if(!await r.pathExists(e))return{enabled:!0,preset:"Medium",bundle:!0};try{const o=await r.readJSON(e),i=o?.enabled!==!1,s=o?.bundle!==!1,c=k(o?.preset);return{enabled:i,preset:c,bundle:s}}catch(o){return console.error("\u274C \u65E0\u6CD5\u8BFB\u53D6 obfuscator.json"),console.error(o instanceof Error?o.message:String(o)),process.exit(1),{enabled:!0,preset:"Medium",bundle:!0}}}function k(t){if(typeof t!="string")return"Medium";const e=Y.find(o=>o.toLowerCase()===t.trim().toLowerCase());return e||(console.warn(`\u26A0\uFE0F obfuscator.json \u7684 preset \u65E0\u6548: ${t}\uFF0C\u5DF2\u6539\u7528 Medium`),"Medium")}function ee(t){return[n.join(t,"node_modules/@gamely/prometheus-cli/bin/cli.js"),n.join(t,"node_modules/ms-vite-plugin/node_modules/@gamely/prometheus-cli/bin/cli.js"),n.resolve(process.cwd(),"node_modules/@gamely/prometheus-cli/bin/cli.js")].find(o=>r.pathExistsSync(o))}const te=async(t=!0,e)=>{const o=n.join(e,"scripts"),i=await r.pathExists(n.join(o,"main.js"))||await r.pathExists(n.join(o,"main.ts")),s=await r.pathExists(n.join(o,"main.py")),c=await r.pathExists(n.join(o,"main.lua"));if(i){console.log("\u{1F680} \u5F00\u59CB\u6784\u5EFAJavaScript\u9879\u76EE..."),Q(e);const{build:l}=await import("vite"),u=n.join(e,"obfuscator.json");await r.pathExists(u)||(console.error("\u274C \u9519\u8BEF: \u5F53\u524D\u76EE\u5F55\u4E0D\u662F\u6709\u6548\u7684 \u5FEB\u70B9JS \u9879\u76EE"),console.error("\u8BF7\u786E\u4FDD\u76EE\u5F55\u5305\u542B\u4EE5\u4E0B\u6587\u4EF6:"),console.error(" - obfuscator.json"),process.exit(1));const h=await r.readJSON(u),m=h.scriptProtect===!0,{enabled:_,scriptProtect:y,...p}=h,d=n.join(e,t?"dist":"msbundle"),j=await U(o,o);await r.remove(d);const g=!t&&m?(0,J.createScriptProtectHelpers)():[];!t&&m&&console.log("\u{1F510} \u5DF2\u542F\u7528 JS \u539F\u751F\u4FDD\u62A4\uFF08scriptProtect=true\uFF09");for(const v of j)await l({root:e,build:{lib:{entry:{[n.basename(v,n.extname(v))]:`./scripts/${v}`},fileName:()=>v.replace(/\.ts$/,".js"),formats:["iife"],name:"KuaiJS"},outDir:t?"dist/scripts":"msbundle/scripts",emptyOutDir:!1,sourcemap:t,minify:!t,target:"safari15"},plugins:[(0,B.createStopGuardPlugin)(),...t?[]:[...m?[(0,J.createScriptProtectPlugin)(g)]:[],_?(0,H.default)({autoExcludeNodeModules:!0,threadPool:!0,options:{...p,target:"browser",debugProtection:!1,disableConsoleOutput:!1,domainLock:[],selfDefending:!1,renameGlobals:!1,renameProperties:!1,reservedNames:[...p.reservedNames||[],...g]}}):[],...m?[(0,J.createKjstEmbedPlugin)()]:[]]]})}if(t)return;const a=n.join(e,"msbundle");if(await r.ensureDir(a),(s||c)&&await r.copy(n.join(e,"scripts"),n.join(a,"scripts")),s){const l=V();if(l.ok){console.log(`\u2705 \u68C0\u6D4B\u5230 ${l.version} (${l.path})`);const u=(0,P.spawnSync)(l.path,["-m","compileall","scripts"],{encoding:"utf8",cwd:a});u.status===0?(console.log("\u2705 \u6210\u529F\u7F16\u8BD1\u6240\u6709 Python \u6587\u4EF6"),await X(n.join(a,"scripts"))):(console.error("\u274C \u7F16\u8BD1 Python \u6587\u4EF6\u5931\u8D25"),console.error(u.stderr),process.exit(1))}else console.warn("\u26A0\uFE0F \u672A\u68C0\u6D4B\u5230 Python 3.14\uFF0C\u8BF7\u786E\u4FDD\u5728\u76EE\u6807\u8FD0\u884C\u73AF\u5883\u5B89\u88C5 Python 3.14")}else if(c){const l=await Z(e),u=n.join(a,"scripts");if(l.bundle?await(0,G.bundleLuaScripts)(u):console.log("\u2139\uFE0F \u5DF2\u5173\u95ED Lua \u5355\u6587\u4EF6\u5408\u5E76\uFF08obfuscator.json bundle=false\uFF09"),!l.enabled)console.log("\u2139\uFE0F \u5DF2\u5173\u95ED Lua \u6DF7\u6DC6\uFF08obfuscator.json enabled=false\uFF09");else{const h=[],m=async y=>{const p=await r.readdir(y,{withFileTypes:!0});for(const d of p){const j=n.join(y,d.name);d.isDirectory()?await m(j):d.isFile()&&d.name.endsWith(".lua")&&h.push(j)}};await m(u);const _=ee(e);_||(console.error("\u274C \u672A\u627E\u5230 @gamely/prometheus-cli\uFF0C\u65E0\u6CD5\u6DF7\u6DC6 Lua"),process.exit(1));for(const y of h){const p=n.relative(u,y);console.log(`\u{1F6E0}\uFE0F \u6DF7\u6DC6 Lua: ${p} (preset=${l.preset})`);const d=(0,P.spawnSync)(process.execPath,[_,p,"--preset",l.preset],{cwd:u,encoding:"utf8"});d.status!==0&&(console.error("\u274C \u6DF7\u6DC6 Lua \u5931\u8D25:",p),console.error(d.stderr||d.stdout||""),process.exit(1));const j=p.replace(/\.lua$/,".obfuscated.lua"),g=n.join(u,j);await r.pathExists(g)&&(await r.remove(y),await r.move(g,y,{overwrite:!0}))}console.log("\u2705 Lua \u6DF7\u6DC6\u5B8C\u6210")}}await r.copy(n.join(e,"res"),n.join(a,"res")),await r.copy(n.join(e,"ui"),n.join(a,"ui"));for(const l of["logo.jpg","logo.png"]){const u=n.join(e,l);await r.pathExists(u)&&await r.copy(u,n.join(a,l))}const f=n.join(e,"dist"),S=n.join(e,"package.json"),O=n.join(a,"package.json"),b=await r.readJSON(S);delete b.scripts,delete b.devDependencies,delete b.dependencies,await r.writeJSON(O,b,{spaces:2}),await r.emptyDir(f);const w=n.join(f,"ms.zip"),D=n.join(f,"ms.msbundle");await R(a,w),await r.rename(w,D),await r.remove(a)};exports.buildAll=te;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.addVararg=c;function s(o){o.vararg=!0,t(o.body.body)}function a(o){switch(o.type){case"FuncExpr":s(o);break;case"UnaryExpr":a(o.arg);break;case"BinaryExpr":a(o.left),a(o.right);break;case"TableExpr":for(const e of o.fields)e.kind==="index"&&a(e.key),a(e.value);break;case"IndexExpr":a(o.object),a(o.index);break;case"MemberExpr":a(o.object);break;case"CallExpr":a(o.callee);for(const e of o.args)a(e);break;case"MethodCallExpr":a(o.object);for(const e of o.args)a(e);break;case"ParenExpr":a(o.exp);break;default:break}}function t(o){for(const e of o)switch(e.type){case"DoStat":case"WhileStat":case"RepeatStat":case"ForNumStat":case"ForInStat":if(e.type==="WhileStat"&&a(e.cond),e.type==="RepeatStat"&&a(e.cond),e.type==="ForNumStat"&&(a(e.start),a(e.end),e.step&&a(e.step)),e.type==="ForInStat")for(const r of e.exps)a(r);t(e.body.body);break;case"IfStat":for(const r of e.clauses)a(r.cond),t(r.body.body);e.elseBody&&t(e.elseBody.body);break;case"FuncStat":case"LocalFuncStat":s(e.func);break;case"LocalStat":if(e.exps)for(const r of e.exps)a(r);break;case"AssignStat":for(const r of e.vars)a(r);for(const r of e.exps)a(r);break;case"CallStat":a(e.exp);break;case"ReturnStat":for(const r of e.exps)a(r);break;default:break}}function c(o){t(o.body)}
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.addVararg=c;function s(r){r.vararg=!0,t(r.body.body)}function a(r){switch(r.type){case"FuncExpr":s(r);break;case"UnaryExpr":a(r.arg);break;case"BinaryExpr":a(r.left),a(r.right);break;case"TableExpr":for(const e of r.fields)e.kind==="index"&&a(e.key),a(e.value);break;case"IndexExpr":a(r.object),a(r.index);break;case"MemberExpr":a(r.object);break;case"CallExpr":a(r.callee);for(const e of r.args)a(e);break;case"MethodCallExpr":a(r.object);for(const e of r.args)a(e);break;case"ParenExpr":a(r.exp);break;default:break}}function t(r){for(const e of r)switch(e.type){case"DoStat":case"WhileStat":case"RepeatStat":case"ForNumStat":case"ForInStat":if(e.type==="WhileStat"&&a(e.cond),e.type==="RepeatStat"&&a(e.cond),e.type==="ForNumStat"&&(a(e.start),a(e.end),e.step&&a(e.step)),e.type==="ForInStat")for(const o of e.exps)a(o);t(e.body.body);break;case"IfStat":for(const o of e.clauses)a(o.cond),t(o.body.body);e.elseBody&&t(e.elseBody.body);break;case"FuncStat":case"LocalFuncStat":s(e.func);break;case"LocalStat":if(e.exps)for(const o of e.exps)a(o);break;case"AssignStat":for(const o of e.vars)a(o);for(const o of e.exps)a(o);break;case"CallStat":a(e.exp);break;case"ReturnStat":for(const o of e.exps)a(o);break;default:break}}function c(r){t(r.body)}
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.flattenControlFlow=C;function m(t){return{type:"NumberLiteral",raw:String(t),value:t}}function p(t){return{type:"NameExpr",name:t}}function f(t,o){return{type:"AssignStat",vars:t.map(e=>p(e)),exps:o}}function u(t,o){return f([t.stateName],[typeof o=="number"?m(o):o])}function k(t,o,e){return{type:"BinaryExpr",op:"or",left:{type:"BinaryExpr",op:"and",left:p(t),right:m(o)},right:m(e)}}function E(t,o,e){return{type:"BinaryExpr",op:t,left:o,right:e}}function S(t){const o=`__t${t.nextTemp}`;return t.nextTemp+=1,t.temps.push(o),o}function x(t){const o=t.nextState;return t.nextState+=1,t.states.set(o,[]),o}function s(t,o,e){t.states.get(o).push(e)}function F(t,o){for(const e of t)if(e.type==="LocalStat")for(const a of e.names)o.push(a.name);else if(e.type==="LocalFuncStat")o.push(e.name);else if(e.type==="ForNumStat")o.push(e.name),F(e.body.body,o);else if(e.type==="ForInStat")o.push(...e.names),F(e.body.body,o);else if(e.type==="DoStat"||e.type==="WhileStat"||e.type==="RepeatStat")F(e.body.body,o);else if(e.type==="IfStat"){for(const a of e.clauses)F(a.body.body,o);e.elseBody&&F(e.elseBody.body,o)}}function h(t,o,e,a){if(t.length===0)return o;const y=t.map(()=>x(e));for(let n=0;n<t.length;n+=1){const r=t[n];r.type==="LabelStat"&&e.userLabels.set(r.name,y[n])}for(let n=0;n<t.length;n+=1){const r=n+1<t.length?y[n+1]:o;I(e,y[n],t[n],r,a)}return y[0]}function I(t,o,e,a,y){switch(e.type){case"EmptyStat":case"LabelStat":s(t,o,u(t,a));return;case"AssignStat":case"CallStat":case"FuncStat":s(t,o,e),s(t,o,u(t,a));return;case"LocalStat":e.exps&&e.exps.length>0&&s(t,o,f(e.names.map(n=>n.name),e.exps)),s(t,o,u(t,a));return;case"LocalFuncStat":s(t,o,f([e.name],[e.func])),s(t,o,u(t,a));return;case"ReturnStat":s(t,o,e);return;case"BreakStat":s(t,o,u(t,y));return;case"GotoStat":{const n=t.userLabels.get(e.name);if(n===void 0)throw new Error(`goto \u672A\u5B9A\u4E49\u6807\u7B7E ::${e.name}::`);s(t,o,u(t,n));return}case"DoStat":s(t,o,u(t,h(e.body.body,a,t,y)));return;case"IfStat":{const n=S(t);let r=o;for(let l=0;l<e.clauses.length;l+=1){const b=l===e.clauses.length-1,d=h(e.clauses[l].body.body,a,t,y);let i=a;b?e.elseBody&&(i=h(e.elseBody.body,a,t,y)):i=x(t),s(t,r,f([n],[e.clauses[l].cond])),s(t,r,u(t,k(n,d,i))),b||(r=i)}e.clauses.length===0&&s(t,o,u(t,a));return}case"WhileStat":{const n=S(t),r=h(e.body.body,o,t,a);s(t,o,f([n],[e.cond])),s(t,o,u(t,k(n,r,a)));return}case"RepeatStat":{const n=S(t),r=x(t),l=h(e.body.body,r,t,a);s(t,o,u(t,l)),s(t,r,f([n],[e.cond])),s(t,r,u(t,k(n,a,l)));return}case"ForNumStat":{const n=e.name,r=S(t),l=S(t),b=S(t),d=x(t),i=x(t),L=x(t),g=x(t),N=h(e.body.body,g,t,a);s(t,o,f([n],[e.start])),s(t,o,f([r],[e.end])),s(t,o,f([l],[e.step??m(1)])),s(t,o,u(t,d)),s(t,d,f([b],[E(">=",p(l),m(0))])),s(t,d,u(t,k(b,i,L))),s(t,i,f([b],[E("<=",p(n),p(r))])),s(t,i,u(t,k(b,N,a))),s(t,L,f([b],[E(">=",p(n),p(r))])),s(t,L,u(t,k(b,N,a))),s(t,g,f([n],[E("+",p(n),p(l))])),s(t,g,u(t,d));return}case"ForInStat":{const n=S(t),r=S(t),l=S(t),b=S(t),d=x(t),i=[f([l],[p(e.names[0])]),...e.body.body],L=h(i,d,t,a),g=e.exps.slice();for(;g.length<3;)g.push({type:"NilLiteral"});s(t,o,f([n,r,l],g.slice(0,3))),s(t,o,u(t,d)),s(t,d,{type:"AssignStat",vars:e.names.map(N=>p(N)),exps:[{type:"CallExpr",callee:p(n),args:[p(r),p(l)]}]}),s(t,d,f([b],[E("~=",p(e.names[0]),{type:"NilLiteral"})])),s(t,d,u(t,k(b,L,a)));return}default:s(t,o,u(t,a))}}function v(t,o){const e=t.slice();let a=o>>>0||1;for(let y=e.length-1;y>0;y-=1){a=Math.imul(a,1664525)+1013904223>>>0;const n=a%(y+1),r=e[y];e[y]=e[n],e[n]=r}return e}function w(t,o){if(t.length===0)return t;const e={states:new Map,temps:[],nextState:1,nextTemp:1,stateName:"__s",userLabels:new Map},a=[];F(t,a);const y=h(t,0,e,0),n=[...new Set([...a,...e.temps,e.stateName])],r=v([...e.states.keys()],o).map(l=>({cond:E("==",p(e.stateName),m(l)),body:{type:"Block",body:e.states.get(l)}}));return[{type:"LocalStat",names:n.map(l=>({name:l}))},f([e.stateName],[m(y)]),{type:"WhileStat",cond:E("~=",p(e.stateName),m(0)),body:{type:"Block",body:[{type:"IfStat",clauses:r}]}}]}function c(t,o){switch(t.type){case"FuncExpr":B(t.body.body,o),t.body.body=w(t.body.body,o);break;case"UnaryExpr":c(t.arg,o);break;case"BinaryExpr":c(t.left,o),c(t.right,o);break;case"TableExpr":for(const e of t.fields)e.kind==="index"&&c(e.key,o),c(e.value,o);break;case"IndexExpr":c(t.object,o),c(t.index,o);break;case"MemberExpr":c(t.object,o);break;case"CallExpr":c(t.callee,o);for(const e of t.args)c(e,o);break;case"MethodCallExpr":c(t.object,o);for(const e of t.args)c(e,o);break;case"ParenExpr":c(t.exp,o);break;default:break}}function B(t,o){for(const e of t)switch(e.type){case"DoStat":case"WhileStat":case"RepeatStat":case"ForNumStat":case"ForInStat":if((e.type==="WhileStat"||e.type==="RepeatStat")&&c(e.cond,o),e.type==="ForNumStat"&&(c(e.start,o),c(e.end,o),e.step&&c(e.step,o)),e.type==="ForInStat")for(const a of e.exps)c(a,o);B(e.body.body,o);break;case"IfStat":for(const a of e.clauses)c(a.cond,o),B(a.body.body,o);e.elseBody&&B(e.elseBody.body,o);break;case"FuncStat":case"LocalFuncStat":B(e.func.body.body,o),e.func.body.body=w(e.func.body.body,o);break;case"LocalStat":if(e.exps)for(const a of e.exps)c(a,o);break;case"AssignStat":for(const a of e.vars)c(a,o);for(const a of e.exps)c(a,o);break;case"CallStat":c(e.exp,o);break;case"ReturnStat":for(const a of e.exps)c(a,o);break;default:break}}function C(t,o){B(t.body,o),t.body=w(t.body,o)}
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.flattenControlFlow=C;function m(t){return{type:"NumberLiteral",raw:String(t),value:t}}function p(t){return{type:"NameExpr",name:t}}function f(t,s){return{type:"AssignStat",vars:t.map(e=>p(e)),exps:s}}function u(t,s){return f([t.stateName],[typeof s=="number"?m(s):s])}function k(t,s,e){return{type:"BinaryExpr",op:"or",left:{type:"BinaryExpr",op:"and",left:p(t),right:m(s)},right:m(e)}}function E(t,s,e){return{type:"BinaryExpr",op:t,left:s,right:e}}function S(t){const s=`__t${t.nextTemp}`;return t.nextTemp+=1,t.temps.push(s),s}function x(t){const s=t.nextState;return t.nextState+=1,t.states.set(s,[]),s}function n(t,s,e){t.states.get(s).push(e)}function F(t,s){for(const e of t)if(e.type==="LocalStat")for(const a of e.names)s.push(a.name);else if(e.type==="LocalFuncStat")s.push(e.name);else if(e.type==="ForNumStat")s.push(e.name),F(e.body.body,s);else if(e.type==="ForInStat")s.push(...e.names),F(e.body.body,s);else if(e.type==="DoStat"||e.type==="WhileStat"||e.type==="RepeatStat")F(e.body.body,s);else if(e.type==="IfStat"){for(const a of e.clauses)F(a.body.body,s);e.elseBody&&F(e.elseBody.body,s)}}function h(t,s,e,a){if(t.length===0)return s;const y=t.map(()=>x(e));for(let o=0;o<t.length;o+=1){const r=t[o];r.type==="LabelStat"&&e.userLabels.set(r.name,y[o])}for(let o=0;o<t.length;o+=1){const r=o+1<t.length?y[o+1]:s;I(e,y[o],t[o],r,a)}return y[0]}function I(t,s,e,a,y){switch(e.type){case"EmptyStat":case"LabelStat":n(t,s,u(t,a));return;case"AssignStat":case"CallStat":case"FuncStat":n(t,s,e),n(t,s,u(t,a));return;case"LocalStat":e.exps&&e.exps.length>0&&n(t,s,f(e.names.map(o=>o.name),e.exps)),n(t,s,u(t,a));return;case"LocalFuncStat":n(t,s,f([e.name],[e.func])),n(t,s,u(t,a));return;case"ReturnStat":n(t,s,e);return;case"BreakStat":n(t,s,u(t,y));return;case"GotoStat":{const o=t.userLabels.get(e.name);if(o===void 0)throw new Error(`goto \u672A\u5B9A\u4E49\u6807\u7B7E ::${e.name}::`);n(t,s,u(t,o));return}case"DoStat":n(t,s,u(t,h(e.body.body,a,t,y)));return;case"IfStat":{const o=S(t);let r=s;for(let l=0;l<e.clauses.length;l+=1){const b=l===e.clauses.length-1,d=h(e.clauses[l].body.body,a,t,y);let i=a;b?e.elseBody&&(i=h(e.elseBody.body,a,t,y)):i=x(t),n(t,r,f([o],[e.clauses[l].cond])),n(t,r,u(t,k(o,d,i))),b||(r=i)}e.clauses.length===0&&n(t,s,u(t,a));return}case"WhileStat":{const o=S(t),r=h(e.body.body,s,t,a);n(t,s,f([o],[e.cond])),n(t,s,u(t,k(o,r,a)));return}case"RepeatStat":{const o=S(t),r=x(t),l=h(e.body.body,r,t,a);n(t,s,u(t,l)),n(t,r,f([o],[e.cond])),n(t,r,u(t,k(o,a,l)));return}case"ForNumStat":{const o=e.name,r=S(t),l=S(t),b=S(t),d=x(t),i=x(t),L=x(t),g=x(t),N=h(e.body.body,g,t,a);n(t,s,f([o],[e.start])),n(t,s,f([r],[e.end])),n(t,s,f([l],[e.step??m(1)])),n(t,s,u(t,d)),n(t,d,f([b],[E(">=",p(l),m(0))])),n(t,d,u(t,k(b,i,L))),n(t,i,f([b],[E("<=",p(o),p(r))])),n(t,i,u(t,k(b,N,a))),n(t,L,f([b],[E(">=",p(o),p(r))])),n(t,L,u(t,k(b,N,a))),n(t,g,f([o],[E("+",p(o),p(l))])),n(t,g,u(t,d));return}case"ForInStat":{const o=S(t),r=S(t),l=S(t),b=S(t),d=x(t),i=[f([l],[p(e.names[0])]),...e.body.body],L=h(i,d,t,a),g=e.exps.slice();for(;g.length<3;)g.push({type:"NilLiteral"});n(t,s,f([o,r,l],g.slice(0,3))),n(t,s,u(t,d)),n(t,d,{type:"AssignStat",vars:e.names.map(N=>p(N)),exps:[{type:"CallExpr",callee:p(o),args:[p(r),p(l)]}]}),n(t,d,f([b],[E("~=",p(e.names[0]),{type:"NilLiteral"})])),n(t,d,u(t,k(b,L,a)));return}default:n(t,s,u(t,a))}}function v(t,s){const e=t.slice();let a=s>>>0||1;for(let y=e.length-1;y>0;y-=1){a=Math.imul(a,1664525)+1013904223>>>0;const o=a%(y+1),r=e[y];e[y]=e[o],e[o]=r}return e}function w(t,s){if(t.length===0)return t;const e={states:new Map,temps:[],nextState:1,nextTemp:1,stateName:"__s",userLabels:new Map},a=[];F(t,a);const y=h(t,0,e,0),o=[...new Set([...a,...e.temps,e.stateName])],r=v([...e.states.keys()],s).map(l=>({cond:E("==",p(e.stateName),m(l)),body:{type:"Block",body:e.states.get(l)}}));return[{type:"LocalStat",names:o.map(l=>({name:l}))},f([e.stateName],[m(y)]),{type:"WhileStat",cond:E("~=",p(e.stateName),m(0)),body:{type:"Block",body:[{type:"IfStat",clauses:r}]}}]}function c(t,s){switch(t.type){case"FuncExpr":B(t.body.body,s),t.body.body=w(t.body.body,s);break;case"UnaryExpr":c(t.arg,s);break;case"BinaryExpr":c(t.left,s),c(t.right,s);break;case"TableExpr":for(const e of t.fields)e.kind==="index"&&c(e.key,s),c(e.value,s);break;case"IndexExpr":c(t.object,s),c(t.index,s);break;case"MemberExpr":c(t.object,s);break;case"CallExpr":c(t.callee,s);for(const e of t.args)c(e,s);break;case"MethodCallExpr":c(t.object,s);for(const e of t.args)c(e,s);break;case"ParenExpr":c(t.exp,s);break;default:break}}function B(t,s){for(const e of t)switch(e.type){case"DoStat":case"WhileStat":case"RepeatStat":case"ForNumStat":case"ForInStat":if((e.type==="WhileStat"||e.type==="RepeatStat")&&c(e.cond,s),e.type==="ForNumStat"&&(c(e.start,s),c(e.end,s),e.step&&c(e.step,s)),e.type==="ForInStat")for(const a of e.exps)c(a,s);B(e.body.body,s);break;case"IfStat":for(const a of e.clauses)c(a.cond,s),B(a.body.body,s);e.elseBody&&B(e.elseBody.body,s);break;case"FuncStat":case"LocalFuncStat":B(e.func.body.body,s),e.func.body.body=w(e.func.body.body,s);break;case"LocalStat":if(e.exps)for(const a of e.exps)c(a,s);break;case"AssignStat":for(const a of e.vars)c(a,s);for(const a of e.exps)c(a,s);break;case"CallStat":c(e.exp,s);break;case"ReturnStat":for(const a of e.exps)c(a,s);break;default:break}}function C(t,s){B(t.body,s),t.body=w(t.body,s)}
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.shortName=r,exports.renameLocals=c;const u=require("./reserved"),d=require("./scope"),l="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";function r(a){let e=a,t="";do t=l[e%l.length]+t,e=Math.floor(e/l.length)-1;while(e>=0);return u.luaKeywords.has(t)?`_${t}`:t}function c(a){let e=0;const t=new Set;(0,d.collectAndRename)(a,(o,s)=>{if(o.newName!==o.original)return;let n=r(e);for(e+=1;s.has(n)||t.has(n)||u.luaKeywords.has(n);)n=r(e),e+=1;o.newName=n,t.add(n),s.add(n)})}
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.shortName=a,exports.renameLocals=c;const u=require("./reserved"),d=require("./scope"),l="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";function a(r){let e=r,t="";do t=l[e%l.length]+t,e=Math.floor(e/l.length)-1;while(e>=0);return u.luaKeywords.has(t)?`_${t}`:t}function c(r){let e=0;const t=new Set;(0,d.collectAndRename)(r,(o,s)=>{if(o.newName!==o.original)return;let n=a(e);for(e+=1;s.has(n)||t.has(n)||u.luaKeywords.has(n);)n=a(e),e+=1;o.newName=n,t.add(n),s.add(n)})}
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.resolveLocal=i,exports.collectAndRename=x;function i(t,o){let r=t;for(;r;){const e=r.locals.get(o);if(e)return e;r=r.parent}}function s(t){return{parent:t,locals:new Map}}function f(t,o){const r=t.locals.get(o);if(r)return r;const e={original:o,newName:o};return t.locals.set(o,e),e}function x(t,o){const r=new Set,e={locals:new Map};d(t.body,e,r,o)}function l(t,o,r,e){d(t.body,o,r,e)}function d(t,o,r,e){for(const c of t)b(c,o,r,e)}function m(t,o,r,e){const c=s(o),a=t.params.slice();for(let u=0;u<a.length;u+=1){const p=f(c,a[u]);e(p,r),t.params[u]=p.newName}l(t.body,c,r,e)}function b(t,o,r,e){switch(t.type){case"EmptyStat":case"BreakStat":case"GotoStat":case"LabelStat":return;case"DoStat":l(t.body,s(o),r,e);return;case"WhileStat":n(t.cond,o,r,e),l(t.body,s(o),r,e);return;case"RepeatStat":{const c=s(o);l(t.body,c,r,e),n(t.cond,c,r,e);return}case"IfStat":for(const c of t.clauses)n(c.cond,o,r,e),l(c.body,s(o),r,e);t.elseBody&&l(t.elseBody,s(o),r,e);return;case"ForNumStat":{n(t.start,o,r,e),n(t.end,o,r,e),t.step&&n(t.step,o,r,e);const c=s(o),a=f(c,t.name);e(a,r),t.name=a.newName,l(t.body,c,r,e);return}case"ForInStat":{for(const a of t.exps)n(a,o,r,e);const c=s(o);for(let a=0;a<t.names.length;a+=1){const u=f(c,t.names[a]);e(u,r),t.names[a]=u.newName}l(t.body,c,r,e);return}case"FuncStat":{const c=i(o,t.name.base);c&&(t.name.base=c.newName),m(t.func,o,r,e);return}case"LocalFuncStat":{const c=f(o,t.name);e(c,r),t.name=c.newName,m(t.func,o,r,e);return}case"LocalStat":if(t.exps)for(const c of t.exps)n(c,o,r,e);for(let c=0;c<t.names.length;c+=1){const a=f(o,t.names[c].name);e(a,r),t.names[c].name=a.newName}return;case"AssignStat":for(const c of t.vars)n(c,o,r,e);for(const c of t.exps)n(c,o,r,e);return;case"CallStat":n(t.exp,o,r,e);return;case"ReturnStat":for(const c of t.exps)n(c,o,r,e);return}}function n(t,o,r,e){switch(t.type){case"NilLiteral":case"BoolLiteral":case"NumberLiteral":case"StringLiteral":case"VarargExpr":return;case"NameExpr":{const c=i(o,t.name);c&&(t.name=c.newName);return}case"UnaryExpr":n(t.arg,o,r,e);return;case"BinaryExpr":n(t.left,o,r,e),n(t.right,o,r,e);return;case"FuncExpr":m(t,o,r,e);return;case"TableExpr":for(const c of t.fields)c.kind==="index"&&n(c.key,o,r,e),n(c.value,o,r,e);return;case"IndexExpr":n(t.object,o,r,e),n(t.index,o,r,e);return;case"MemberExpr":n(t.object,o,r,e);return;case"CallExpr":n(t.callee,o,r,e);for(const c of t.args)n(c,o,r,e);return;case"MethodCallExpr":n(t.object,o,r,e);for(const c of t.args)n(c,o,r,e);return;case"ParenExpr":n(t.exp,o,r,e);return}}
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.resolveLocal=i,exports.collectAndRename=x;function i(t,s){let r=t;for(;r;){const e=r.locals.get(s);if(e)return e;r=r.parent}}function c(t){return{parent:t,locals:new Map}}function f(t,s){const r=t.locals.get(s);if(r)return r;const e={original:s,newName:s};return t.locals.set(s,e),e}function x(t,s){const r=new Set,e={locals:new Map};d(t.body,e,r,s)}function l(t,s,r,e){d(t.body,s,r,e)}function d(t,s,r,e){for(const o of t)b(o,s,r,e)}function m(t,s,r,e){const o=c(s),a=t.params.slice();for(let u=0;u<a.length;u+=1){const p=f(o,a[u]);e(p,r),t.params[u]=p.newName}l(t.body,o,r,e)}function b(t,s,r,e){switch(t.type){case"EmptyStat":case"BreakStat":case"GotoStat":case"LabelStat":return;case"DoStat":l(t.body,c(s),r,e);return;case"WhileStat":n(t.cond,s,r,e),l(t.body,c(s),r,e);return;case"RepeatStat":{const o=c(s);l(t.body,o,r,e),n(t.cond,o,r,e);return}case"IfStat":for(const o of t.clauses)n(o.cond,s,r,e),l(o.body,c(s),r,e);t.elseBody&&l(t.elseBody,c(s),r,e);return;case"ForNumStat":{n(t.start,s,r,e),n(t.end,s,r,e),t.step&&n(t.step,s,r,e);const o=c(s),a=f(o,t.name);e(a,r),t.name=a.newName,l(t.body,o,r,e);return}case"ForInStat":{for(const a of t.exps)n(a,s,r,e);const o=c(s);for(let a=0;a<t.names.length;a+=1){const u=f(o,t.names[a]);e(u,r),t.names[a]=u.newName}l(t.body,o,r,e);return}case"FuncStat":{const o=i(s,t.name.base);o&&(t.name.base=o.newName),m(t.func,s,r,e);return}case"LocalFuncStat":{const o=f(s,t.name);e(o,r),t.name=o.newName,m(t.func,s,r,e);return}case"LocalStat":if(t.exps)for(const o of t.exps)n(o,s,r,e);for(let o=0;o<t.names.length;o+=1){const a=f(s,t.names[o].name);e(a,r),t.names[o].name=a.newName}return;case"AssignStat":for(const o of t.vars)n(o,s,r,e);for(const o of t.exps)n(o,s,r,e);return;case"CallStat":n(t.exp,s,r,e);return;case"ReturnStat":for(const o of t.exps)n(o,s,r,e);return}}function n(t,s,r,e){switch(t.type){case"NilLiteral":case"BoolLiteral":case"NumberLiteral":case"StringLiteral":case"VarargExpr":return;case"NameExpr":{const o=i(s,t.name);o&&(t.name=o.newName);return}case"UnaryExpr":n(t.arg,s,r,e);return;case"BinaryExpr":n(t.left,s,r,e),n(t.right,s,r,e);return;case"FuncExpr":m(t,s,r,e);return;case"TableExpr":for(const o of t.fields)o.kind==="index"&&n(o.key,s,r,e),n(o.value,s,r,e);return;case"IndexExpr":n(t.object,s,r,e),n(t.index,s,r,e);return;case"MemberExpr":n(t.object,s,r,e);return;case"CallExpr":n(t.callee,s,r,e);for(const o of t.args)n(o,s,r,e);return;case"MethodCallExpr":n(t.object,s,r,e);for(const o of t.args)n(o,s,r,e);return;case"ParenExpr":n(t.exp,s,r,e);return}}
@@ -0,0 +1,10 @@
1
+ export type RgbaImage = {
2
+ data: Buffer;
3
+ width: number;
4
+ height: number;
5
+ };
6
+ export declare function decodeImageToRgba(input: string | Buffer): Promise<RgbaImage>;
7
+ export declare function cropRgbaImage(image: RgbaImage, x: number, y: number, width: number, height: number): RgbaImage;
8
+ export declare function encodeRgbaToPngFile(image: RgbaImage, outputPath: string): Promise<{
9
+ size: number;
10
+ }>;
@@ -0,0 +1 @@
1
+ "use strict";var l=exports&&exports.__createBinding||(Object.create?(function(e,t,n,r){r===void 0&&(r=n);var a=Object.getOwnPropertyDescriptor(t,n);(!a||("get"in a?!t.__esModule:a.writable||a.configurable))&&(a={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,a)}):(function(e,t,n,r){r===void 0&&(r=n),e[r]=t[n]})),s=exports&&exports.__setModuleDefault||(Object.create?(function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}):function(e,t){e.default=t}),g=exports&&exports.__importStar||(function(){var e=function(t){return e=Object.getOwnPropertyNames||function(n){var r=[];for(var a in n)Object.prototype.hasOwnProperty.call(n,a)&&(r[r.length]=a);return r},e(t)};return function(t){if(t&&t.__esModule)return t;var n={};if(t!=null)for(var r=e(t),a=0;a<r.length;a++)r[a]!=="default"&&l(n,t,r[a]);return s(n,t),n}})(),h=exports&&exports.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.decodeImageToRgba=y,exports.cropRgbaImage=P,exports.encodeRgbaToPngFile=v;const f=g(require("fs-extra")),_=h(require("jpeg-js")),o=require("pngjs");function w(e){return e.length>=8&&e[0]===137&&e[1]===80&&e[2]===78&&e[3]===71&&e[4]===13&&e[5]===10&&e[6]===26&&e[7]===10}function p(e){return e.length>=3&&e[0]===255&&e[1]===216&&e[2]===255}function d(e){return Buffer.isBuffer(e)?e:Buffer.from(e)}async function y(e){const t=typeof e=="string"?await f.readFile(e):e;if(t.length===0)throw new Error("\u56FE\u7247\u5185\u5BB9\u4E3A\u7A7A");if(w(t)){const n=o.PNG.sync.read(t);return{data:d(n.data),width:n.width,height:n.height}}if(p(t)){const n=_.default.decode(t,{formatAsRGBA:!0,maxMemoryUsageInMB:256});return{data:d(n.data),width:n.width,height:n.height}}throw new Error("\u4EC5\u652F\u6301 PNG / JPEG \u56FE\u7247")}function P(e,t,n,r,a){if(t+r>e.width||n+a>e.height)throw new Error(`\u88C1\u5207\u8303\u56F4\u8D85\u51FA\u56FE\u7247\u5C3A\u5BF8: image=${e.width}x${e.height}, crop=${t},${n},${r},${a}`);const c=Buffer.alloc(r*a*4);for(let i=0;i<a;i+=1){const u=((n+i)*e.width+t)*4;e.data.copy(c,i*r*4,u,u+r*4)}return{data:c,width:r,height:a}}async function v(e,t){const n=new o.PNG({width:e.width,height:e.height});e.data.copy(n.data);const r=o.PNG.sync.write(n);return await f.outputFile(t,r),{size:r.length}}
@@ -1,8 +1,5 @@
1
- "use strict";var B=exports&&exports.__createBinding||(Object.create?(function(r,t,e,n){n===void 0&&(n=e);var i=Object.getOwnPropertyDescriptor(t,e);(!i||("get"in i?!t.__esModule:i.writable||i.configurable))&&(i={enumerable:!0,get:function(){return t[e]}}),Object.defineProperty(r,n,i)}):(function(r,t,e,n){n===void 0&&(n=e),r[n]=t[e]})),G=exports&&exports.__setModuleDefault||(Object.create?(function(r,t){Object.defineProperty(r,"default",{enumerable:!0,value:t})}):function(r,t){r.default=t}),v=exports&&exports.__importStar||(function(){var r=function(t){return r=Object.getOwnPropertyNames||function(e){var n=[];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(n[n.length]=i);return n},r(t)};return function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var n=r(t),i=0;i<n.length;i++)n[i]!=="default"&&B(e,t,n[i]);return G(e,t),e}})(),L=exports&&exports.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.cropLocalImage=H,exports.cropDeviceScreen=k,exports.pickLocalImageColor=E,exports.pickDeviceScreenColor=F,exports.makeLocalImageTransparent=N,exports.registerImageTools=W;const b=v(require("fs-extra")),q=v(require("os")),h=v(require("path")),d=L(require("sharp")),l=v(require("zod/v4")),C=require("../project"),f=require("./tool-utils");function R(r,t,e){if(t&&t.trim())return h.resolve(t.trim());const n=h.parse(h.resolve(r));return h.join(n.dir,`${n.name}-${e}.png`)}function D(r,t,e){return r&&r.trim()?h.resolve(r.trim()):h.join(q.tmpdir(),`${t}-${Date.now()}-${Math.random().toString(36).slice(2,8)}.${e}`)}async function _(r){const t=h.resolve(r.trim());if(!await b.pathExists(t))throw new Error(`\u56FE\u7247\u4E0D\u5B58\u5728: ${t}`);return t}function I(r){const t=r.trim().replace(/^#/,"");if(!/^[0-9a-fA-F]{6}$/.test(t))throw new Error("transparentColor \u5FC5\u987B\u662F #RRGGBB \u6216 RRGGBB \u683C\u5F0F\u3002");return{r:Number.parseInt(t.slice(0,2),16),g:Number.parseInt(t.slice(2,4),16),b:Number.parseInt(t.slice(4,6),16)}}function j(r){return`#${r.r.toString(16).padStart(2,"0")}${r.g.toString(16).padStart(2,"0")}${r.b.toString(16).padStart(2,"0")}`}function M(r,t,e,n){const i=n==="topRight"||n==="bottomRight"?t-1:0,a=((n==="bottomLeft"||n==="bottomRight"?e-1:0)*t+i)*4;return{r:r[a]??0,g:r[a+1]??0,b:r[a+2]??0}}function z(r,t,e,n){const i=(r[t]??0)-e.r,o=(r[t+1]??0)-e.g,a=(r[t+2]??0)-e.b;return Math.sqrt(i*i+o*o+a*a)<=n}async function T(r){const{data:t,info:e}=await(0,d.default)(r).ensureAlpha().raw().toBuffer({resolveWithObject:!0});return{data:t,width:e.width,height:e.height}}function S(r,t,e,n,i,o){if(n>=t||i>=e)throw new Error(`\u5750\u6807\u8D85\u51FA\u56FE\u7247\u8303\u56F4: image=${t}x${e}, point=${n},${i}`);const a=Math.max(0,n-o),s=Math.min(t-1,n+o),c=Math.max(0,i-o),u=Math.min(e-1,i+o);let p=0,m=0,g=0,$=0,w=0;for(let y=c;y<=u;y+=1)for(let O=a;O<=s;O+=1){const P=(y*t+O)*4;p+=r[P]??0,m+=r[P+1]??0,g+=r[P+2]??0,$+=r[P+3]??0,w+=1}return{color:{r:Math.round(p/w),g:Math.round(m/w),b:Math.round(g/w),a:Math.round($/w)},sampleCount:w}}function x(r,t,e,n,i,o,a,s){return["\u53D6\u8272\u6210\u529F",`source: ${r}`,`image: ${i}x${o}`,`point: x=${t}, y=${e}`,`radius: ${n}`,`samplePixels: ${s}`,`hex: ${j(a)}`,`rgb: ${a.r},${a.g},${a.b}`,`rgba: ${a.r},${a.g},${a.b},${a.a}`].join(`
2
- `)}async function H(r,t,e,n,i,o){const a=await _(r),s=R(a,o,"crop"),c=await(0,d.default)(a).metadata(),u=c.width??0,p=c.height??0;if(t+n>u||e+i>p)throw new Error(`\u88C1\u5207\u8303\u56F4\u8D85\u51FA\u56FE\u7247\u5C3A\u5BF8: image=${u}x${p}, crop=${t},${e},${n},${i}`);await b.ensureDir(h.dirname(s));const m=await(0,d.default)(a).extract({left:t,top:e,width:n,height:i}).png().toFile(s);return["\u56FE\u7247\u88C1\u5207\u6210\u529F",`input: ${a}`,`output: ${s}`,`crop: x=${t}, y=${e}, width=${n}, height=${i}`,`size: ${m.size} bytes`].join(`
3
- `)}async function k(r,t,e,n,i,o){const a=await(0,C.getScreenshotOnDevice)({ip:r.ip,port:r.port,transport:"http"}),s=await(0,d.default)(a).metadata(),c=s.width??0,u=s.height??0;if(t+n>c||e+i>u)throw new Error(`\u88C1\u5207\u8303\u56F4\u8D85\u51FA\u622A\u56FE\u5C3A\u5BF8: image=${c}x${u}, crop=${t},${e},${n},${i}`);const p=D(o,"ms-mcp-screen-crop","png");await b.ensureDir(h.dirname(p));const m=await(0,d.default)(a).extract({left:t,top:e,width:n,height:i}).png().toFile(p);return["\u5C4F\u5E55\u88C1\u56FE\u6210\u529F",`device: ${r.label}`,`output: ${p}`,`screen: ${c}x${u}`,`crop: x=${t}, y=${e}, width=${n}, height=${i}`,`size: ${m.size} bytes`].join(`
4
- `)}async function E(r,t,e,n){const i=await _(r),o=await T(i),a=S(o.data,o.width,o.height,t,e,n);return x(i,t,e,n,o.width,o.height,a.color,a.sampleCount)}async function F(r,t,e,n){const i=await(0,C.getScreenshotOnDevice)({ip:r.ip,port:r.port,transport:"http"}),o=await T(i),a=S(o.data,o.width,o.height,t,e,n);return x(r.label,t,e,n,o.width,o.height,a.color,a.sampleCount)}async function N(r,t,e,n,i){const o=await _(r),a=R(o,t,"transparent"),{data:s,info:c}=await(0,d.default)(o).ensureAlpha().raw().toBuffer({resolveWithObject:!0}),u=e?I(e):M(s,c.width,c.height,n);let p=0;for(let g=0;g<s.length;g+=4)z(s,g,u,i)&&(s[g+3]=0,p+=1);await b.ensureDir(h.dirname(a));const m=await(0,d.default)(s,{raw:{width:c.width,height:c.height,channels:4}}).png().toFile(a);return["\u900F\u660E\u56FE\u5236\u4F5C\u6210\u529F",`input: ${o}`,`output: ${a}`,`image: ${c.width}x${c.height}`,`transparentColor: ${j(u)}`,`tolerance: ${i}`,`transparentPixels: ${p}`,`size: ${m.size} bytes`].join(`
5
- `)}function W(r){r.registerTool("image_crop",{title:"Image Crop",description:"\u88C1\u5207\u672C\u5730\u56FE\u7247\u5E76\u8F93\u51FA PNG \u6587\u4EF6\uFF0C\u9002\u5408\u4ECE\u622A\u56FE\u4E2D\u88C1\u51FA\u627E\u56FE\u6A21\u677F\u3002",inputSchema:{imagePath:l.string().min(1).describe("\u8F93\u5165\u56FE\u7247\u8DEF\u5F84"),x:l.number().int().min(0).describe("\u88C1\u5207\u8D77\u70B9 x"),y:l.number().int().min(0).describe("\u88C1\u5207\u8D77\u70B9 y"),width:l.number().int().min(1).describe("\u88C1\u5207\u5BBD\u5EA6"),height:l.number().int().min(1).describe("\u88C1\u5207\u9AD8\u5EA6"),outputPath:l.string().min(1).optional().describe("\u53EF\u9009\u8F93\u51FA\u8DEF\u5F84\uFF1B\u4E0D\u4F20\u5219\u5728\u8F93\u5165\u56FE\u7247\u540C\u76EE\u5F55\u751F\u6210 *-crop.png")}},async({imagePath:t,x:e,y:n,width:i,height:o,outputPath:a})=>{const s=await _(t),c=R(s,a,"crop"),u=await(0,d.default)(s).metadata(),p=u.width??0,m=u.height??0;if(e+i>p||n+o>m)return(0,f.createTextToolResult)(`\u88C1\u5207\u8303\u56F4\u8D85\u51FA\u56FE\u7247\u5C3A\u5BF8: image=${p}x${m}, crop=${e},${n},${i},${o}`,!0);await b.ensureDir(h.dirname(c));const g=await(0,d.default)(s).extract({left:e,top:n,width:i,height:o}).png().toFile(c);return(0,f.createTextToolResult)(["\u56FE\u7247\u88C1\u5207\u6210\u529F",`input: ${s}`,`output: ${c}`,`crop: x=${e}, y=${n}, width=${i}, height=${o}`,`size: ${g.size} bytes`].join(`
6
- `))}),r.registerTool("screen_crop",{title:"Screen Crop",description:"\u4ECE\u5F53\u524D\u9ED8\u8BA4\u8BBE\u5907\u622A\u56FE\u4E2D\u6309\u5750\u6807\u88C1\u5207 PNG \u6587\u4EF6\uFF0C\u9002\u5408\u81EA\u52A8\u622A\u53D6\u627E\u56FE\u6A21\u677F\u3002",inputSchema:{x:l.number().int().min(0).describe("\u88C1\u5207\u8D77\u70B9 x"),y:l.number().int().min(0).describe("\u88C1\u5207\u8D77\u70B9 y"),width:l.number().int().min(1).describe("\u88C1\u5207\u5BBD\u5EA6"),height:l.number().int().min(1).describe("\u88C1\u5207\u9AD8\u5EA6"),outputPath:l.string().min(1).optional().describe("\u53EF\u9009\u8F93\u51FA\u8DEF\u5F84\uFF1B\u4E0D\u4F20\u5219\u5199\u5165\u7CFB\u7EDF\u4E34\u65F6\u76EE\u5F55")}},async({x:t,y:e,width:n,height:i,outputPath:o})=>{const a=await(0,f.resolveRuntimeHttpTarget)(),s=await(0,C.getScreenshotOnDevice)((0,f.createRuntimeHttpRequestOptions)(a)),c=await(0,d.default)(s).metadata(),u=c.width??0,p=c.height??0;if(t+n>u||e+i>p)return(0,f.createTextToolResult)(`\u88C1\u5207\u8303\u56F4\u8D85\u51FA\u622A\u56FE\u5C3A\u5BF8: image=${u}x${p}, crop=${t},${e},${n},${i}`,!0);const m=D(o,"ms-mcp-screen-crop","png");await b.ensureDir(h.dirname(m));const g=await(0,d.default)(s).extract({left:t,top:e,width:n,height:i}).png().toFile(m);return(0,f.createTextToolResult)(["\u5C4F\u5E55\u88C1\u56FE\u6210\u529F",`device: ${a.label}`,`output: ${m}`,`screen: ${u}x${p}`,`crop: x=${t}, y=${e}, width=${n}, height=${i}`,`size: ${g.size} bytes`].join(`
7
- `))}),r.registerTool("image_pick_color",{title:"Image Pick Color",description:"\u8BFB\u53D6\u672C\u5730\u56FE\u7247\u6307\u5B9A\u5750\u6807\u989C\u8272\uFF0C\u8FD4\u56DE hex/rgb/rgba\uFF0C\u9002\u5408\u751F\u6210\u627E\u8272\u4EE3\u7801\u3002",inputSchema:{imagePath:l.string().min(1).describe("\u8F93\u5165\u56FE\u7247\u8DEF\u5F84"),x:l.number().int().min(0).describe("\u76EE\u6807\u5750\u6807 x"),y:l.number().int().min(0).describe("\u76EE\u6807\u5750\u6807 y"),radius:l.number().int().min(0).max(20).optional().default(0).describe("\u91C7\u6837\u534A\u5F84\uFF0C0 \u8868\u793A\u53EA\u53D6\u5355\u70B9\uFF0C\u9ED8\u8BA4 0")}},async({imagePath:t,x:e,y:n,radius:i})=>{const o=await _(t),a=await T(o),s=S(a.data,a.width,a.height,e,n,i);return(0,f.createTextToolResult)(x(o,e,n,i,a.width,a.height,s.color,s.sampleCount))}),r.registerTool("screen_pick_color",{title:"Screen Pick Color",description:"\u4ECE\u5F53\u524D\u9ED8\u8BA4\u8BBE\u5907\u622A\u56FE\u4E2D\u8BFB\u53D6\u6307\u5B9A\u5750\u6807\u989C\u8272\uFF0C\u8FD4\u56DE hex/rgb/rgba\uFF0C\u9002\u5408\u81EA\u52A8\u751F\u6210\u627E\u8272\u4EE3\u7801\u3002",inputSchema:{x:l.number().int().min(0).describe("\u76EE\u6807\u5750\u6807 x"),y:l.number().int().min(0).describe("\u76EE\u6807\u5750\u6807 y"),radius:l.number().int().min(0).max(20).optional().default(0).describe("\u91C7\u6837\u534A\u5F84\uFF0C0 \u8868\u793A\u53EA\u53D6\u5355\u70B9\uFF0C\u9ED8\u8BA4 0")}},async({x:t,y:e,radius:n})=>{const i=await(0,f.resolveRuntimeHttpTarget)(),o=await(0,C.getScreenshotOnDevice)((0,f.createRuntimeHttpRequestOptions)(i)),a=await T(o),s=S(a.data,a.width,a.height,t,e,n);return(0,f.createTextToolResult)(x(i.label,t,e,n,a.width,a.height,s.color,s.sampleCount))}),r.registerTool("image_make_transparent",{title:"Image Make Transparent",description:"\u5C06\u56FE\u7247\u4E2D\u63A5\u8FD1\u6307\u5B9A\u989C\u8272\u6216\u89D2\u843D\u80CC\u666F\u8272\u7684\u50CF\u7D20\u8BBE\u4E3A\u900F\u660E\uFF0C\u5E76\u8F93\u51FA PNG \u6587\u4EF6\uFF0C\u9002\u5408\u5236\u4F5C\u627E\u56FE\u6A21\u677F\u900F\u660E\u56FE\u3002",inputSchema:{imagePath:l.string().min(1).describe("\u8F93\u5165\u56FE\u7247\u8DEF\u5F84"),outputPath:l.string().min(1).optional().describe("\u53EF\u9009\u8F93\u51FA\u8DEF\u5F84\uFF1B\u4E0D\u4F20\u5219\u5728\u8F93\u5165\u56FE\u7247\u540C\u76EE\u5F55\u751F\u6210 *-transparent.png"),transparentColor:l.string().min(1).optional().describe("\u8981\u900F\u660E\u5316\u7684\u989C\u8272\uFF0C\u683C\u5F0F #RRGGBB\uFF1B\u4E0D\u4F20\u5219\u4ECE\u6307\u5B9A\u89D2\u843D\u91C7\u6837"),sampleCorner:l.enum(["topLeft","topRight","bottomLeft","bottomRight"]).optional().default("topLeft").describe("\u672A\u4F20 transparentColor \u65F6\u91C7\u6837\u7684\u80CC\u666F\u89D2\u843D\uFF0C\u9ED8\u8BA4 topLeft"),tolerance:l.number().int().min(0).max(441).optional().default(24).describe("RGB \u6B27\u6C0F\u8DDD\u79BB\u5BB9\u5DEE\uFF0C\u9ED8\u8BA4 24\uFF0C\u6700\u5927 441")}},async({imagePath:t,outputPath:e,transparentColor:n,sampleCorner:i,tolerance:o})=>{const a=await _(t),s=R(a,e,"transparent"),{data:c,info:u}=await(0,d.default)(a).ensureAlpha().raw().toBuffer({resolveWithObject:!0}),p=n?I(n):M(c,u.width,u.height,i);let m=0;for(let $=0;$<c.length;$+=4)z(c,$,p,o)&&(c[$+3]=0,m+=1);await b.ensureDir(h.dirname(s));const g=await(0,d.default)(c,{raw:{width:u.width,height:u.height,channels:4}}).png().toFile(s);return(0,f.createTextToolResult)(["\u900F\u660E\u56FE\u5236\u4F5C\u6210\u529F",`input: ${a}`,`output: ${s}`,`image: ${u.width}x${u.height}`,`transparentColor: ${j(p)}`,`tolerance: ${o}`,`transparentPixels: ${m}`,`size: ${g.size} bytes`].join(`
8
- `))})}
1
+ "use strict";var B=exports&&exports.__createBinding||(Object.create?(function(e,t,n,r){r===void 0&&(r=n);var i=Object.getOwnPropertyDescriptor(t,n);(!i||("get"in i?!t.__esModule:i.writable||i.configurable))&&(i={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,i)}):(function(e,t,n,r){r===void 0&&(r=n),e[r]=t[n]})),D=exports&&exports.__setModuleDefault||(Object.create?(function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}):function(e,t){e.default=t}),T=exports&&exports.__importStar||(function(){var e=function(t){return e=Object.getOwnPropertyNames||function(n){var r=[];for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(r[r.length]=i);return r},e(t)};return function(t){if(t&&t.__esModule)return t;var n={};if(t!=null)for(var r=e(t),i=0;i<r.length;i++)r[i]!=="default"&&B(n,t,r[i]);return D(n,t),n}})();Object.defineProperty(exports,"__esModule",{value:!0}),exports.cropLocalImage=M,exports.cropDeviceScreen=j,exports.pickLocalImageColor=O,exports.pickDeviceScreenColor=G,exports.makeLocalImageTransparent=L,exports.registerImageTools=H;const E=T(require("fs-extra")),q=T(require("os")),h=T(require("path")),s=T(require("zod/v4")),v=require("../project"),g=require("./image-codec"),l=require("./tool-utils");function I(e,t,n){if(t&&t.trim())return h.resolve(t.trim());const r=h.parse(h.resolve(e));return h.join(r.dir,`${r.name}-${n}.png`)}function z(e,t,n){return e&&e.trim()?h.resolve(e.trim()):h.join(q.tmpdir(),`${t}-${Date.now()}-${Math.random().toString(36).slice(2,8)}.${n}`)}async function _(e){const t=h.resolve(e.trim());if(!await E.pathExists(t))throw new Error(`\u56FE\u7247\u4E0D\u5B58\u5728: ${t}`);return t}function N(e){const t=e.trim().replace(/^#/,"");if(!/^[0-9a-fA-F]{6}$/.test(t))throw new Error("transparentColor \u5FC5\u987B\u662F #RRGGBB \u6216 RRGGBB \u683C\u5F0F\u3002");return{r:Number.parseInt(t.slice(0,2),16),g:Number.parseInt(t.slice(2,4),16),b:Number.parseInt(t.slice(4,6),16)}}function C(e){return`#${e.r.toString(16).padStart(2,"0")}${e.g.toString(16).padStart(2,"0")}${e.b.toString(16).padStart(2,"0")}`}function k(e,t,n,r){const i=r==="topRight"||r==="bottomRight"?t-1:0,o=((r==="bottomLeft"||r==="bottomRight"?n-1:0)*t+i)*4;return{r:e[o]??0,g:e[o+1]??0,b:e[o+2]??0}}function F(e,t,n,r){const i=(e[t]??0)-n.r,a=(e[t+1]??0)-n.g,o=(e[t+2]??0)-n.b;return Math.sqrt(i*i+a*a+o*o)<=r}function S(e,t,n,r,i,a){if(r>=t||i>=n)throw new Error(`\u5750\u6807\u8D85\u51FA\u56FE\u7247\u8303\u56F4: image=${t}x${n}, point=${r},${i}`);const o=Math.max(0,r-a),c=Math.min(t-1,r+a),u=Math.max(0,i-a),m=Math.min(n-1,i+a);let p=0,$=0,b=0,P=0,d=0;for(let y=u;y<=m;y+=1)for(let R=o;R<=c;R+=1){const w=(y*t+R)*4;p+=e[w]??0,$+=e[w+1]??0,b+=e[w+2]??0,P+=e[w+3]??0,d+=1}return{color:{r:Math.round(p/d),g:Math.round($/d),b:Math.round(b/d),a:Math.round(P/d)},sampleCount:d}}function x(e,t,n,r,i,a,o,c){return["\u53D6\u8272\u6210\u529F",`source: ${e}`,`image: ${i}x${a}`,`point: x=${t}, y=${n}`,`radius: ${r}`,`samplePixels: ${c}`,`hex: ${C(o)}`,`rgb: ${o.r},${o.g},${o.b}`,`rgba: ${o.r},${o.g},${o.b},${o.a}`].join(`
2
+ `)}function f(e){return(0,l.createTextToolResult)(e instanceof Error?e.message:String(e),!0)}async function M(e,t,n,r,i,a){const o=await _(e),c=I(o,a,"crop"),u=await(0,g.decodeImageToRgba)(o),m=(0,g.cropRgbaImage)(u,t,n,r,i),p=await(0,g.encodeRgbaToPngFile)(m,c);return["\u56FE\u7247\u88C1\u5207\u6210\u529F",`input: ${o}`,`output: ${c}`,`crop: x=${t}, y=${n}, width=${r}, height=${i}`,`size: ${p.size} bytes`].join(`
3
+ `)}async function j(e,t,n,r,i,a){const o=await(0,v.getScreenshotOnDevice)({ip:e.ip,port:e.port,transport:"http"}),c=await(0,g.decodeImageToRgba)(o);if(t+r>c.width||n+i>c.height)throw new Error(`\u88C1\u5207\u8303\u56F4\u8D85\u51FA\u622A\u56FE\u5C3A\u5BF8: image=${c.width}x${c.height}, crop=${t},${n},${r},${i}`);const u=(0,g.cropRgbaImage)(c,t,n,r,i),m=z(a,"ms-mcp-screen-crop","png"),p=await(0,g.encodeRgbaToPngFile)(u,m);return["\u5C4F\u5E55\u88C1\u56FE\u6210\u529F",`device: ${e.label}`,`output: ${m}`,`screen: ${c.width}x${c.height}`,`crop: x=${t}, y=${n}, width=${r}, height=${i}`,`size: ${p.size} bytes`].join(`
4
+ `)}async function O(e,t,n,r){const i=await _(e),a=await(0,g.decodeImageToRgba)(i),o=S(a.data,a.width,a.height,t,n,r);return x(i,t,n,r,a.width,a.height,o.color,o.sampleCount)}async function G(e,t,n,r){const i=await(0,v.getScreenshotOnDevice)({ip:e.ip,port:e.port,transport:"http"}),a=await(0,g.decodeImageToRgba)(i),o=S(a.data,a.width,a.height,t,n,r);return x(e.label,t,n,r,a.width,a.height,o.color,o.sampleCount)}async function L(e,t,n,r,i){const a=await _(e),o=I(a,t,"transparent"),c=await(0,g.decodeImageToRgba)(a),u=Buffer.from(c.data),m=n?N(n):k(u,c.width,c.height,r);let p=0;for(let b=0;b<u.length;b+=4)F(u,b,m,i)&&(u[b+3]=0,p+=1);const $=await(0,g.encodeRgbaToPngFile)({data:u,width:c.width,height:c.height},o);return["\u900F\u660E\u56FE\u5236\u4F5C\u6210\u529F",`input: ${a}`,`output: ${o}`,`image: ${c.width}x${c.height}`,`transparentColor: ${C(m)}`,`tolerance: ${i}`,`transparentPixels: ${p}`,`size: ${$.size} bytes`].join(`
5
+ `)}function H(e){e.registerTool("image_crop",{title:"Image Crop",description:"\u88C1\u5207\u672C\u5730\u56FE\u7247\u5E76\u8F93\u51FA PNG \u6587\u4EF6\uFF0C\u9002\u5408\u4ECE\u622A\u56FE\u4E2D\u88C1\u51FA\u627E\u56FE\u6A21\u677F\u3002",inputSchema:{imagePath:s.string().min(1).describe("\u8F93\u5165\u56FE\u7247\u8DEF\u5F84"),x:s.number().int().min(0).describe("\u88C1\u5207\u8D77\u70B9 x"),y:s.number().int().min(0).describe("\u88C1\u5207\u8D77\u70B9 y"),width:s.number().int().min(1).describe("\u88C1\u5207\u5BBD\u5EA6"),height:s.number().int().min(1).describe("\u88C1\u5207\u9AD8\u5EA6"),outputPath:s.string().min(1).optional().describe("\u53EF\u9009\u8F93\u51FA\u8DEF\u5F84\uFF1B\u4E0D\u4F20\u5219\u5728\u8F93\u5165\u56FE\u7247\u540C\u76EE\u5F55\u751F\u6210 *-crop.png")}},async({imagePath:t,x:n,y:r,width:i,height:a,outputPath:o})=>{try{return(0,l.createTextToolResult)(await M(t,n,r,i,a,o))}catch(c){return f(c)}}),e.registerTool("screen_crop",{title:"Screen Crop",description:"\u4ECE\u5F53\u524D\u9ED8\u8BA4\u8BBE\u5907\u622A\u56FE\u4E2D\u6309\u5750\u6807\u88C1\u5207 PNG \u6587\u4EF6\uFF0C\u9002\u5408\u81EA\u52A8\u622A\u53D6\u627E\u56FE\u6A21\u677F\u3002",inputSchema:{x:s.number().int().min(0).describe("\u88C1\u5207\u8D77\u70B9 x"),y:s.number().int().min(0).describe("\u88C1\u5207\u8D77\u70B9 y"),width:s.number().int().min(1).describe("\u88C1\u5207\u5BBD\u5EA6"),height:s.number().int().min(1).describe("\u88C1\u5207\u9AD8\u5EA6"),outputPath:s.string().min(1).optional().describe("\u53EF\u9009\u8F93\u51FA\u8DEF\u5F84\uFF1B\u4E0D\u4F20\u5219\u5199\u5165\u7CFB\u7EDF\u4E34\u65F6\u76EE\u5F55")}},async({x:t,y:n,width:r,height:i,outputPath:a})=>{try{const o=await(0,l.resolveRuntimeHttpTarget)();return(0,l.createTextToolResult)(await j(o,t,n,r,i,a))}catch(o){return f(o)}}),e.registerTool("image_pick_color",{title:"Image Pick Color",description:"\u8BFB\u53D6\u672C\u5730\u56FE\u7247\u6307\u5B9A\u5750\u6807\u989C\u8272\uFF0C\u8FD4\u56DE hex/rgb/rgba\uFF0C\u9002\u5408\u751F\u6210\u627E\u8272\u4EE3\u7801\u3002",inputSchema:{imagePath:s.string().min(1).describe("\u8F93\u5165\u56FE\u7247\u8DEF\u5F84"),x:s.number().int().min(0).describe("\u76EE\u6807\u5750\u6807 x"),y:s.number().int().min(0).describe("\u76EE\u6807\u5750\u6807 y"),radius:s.number().int().min(0).max(20).optional().default(0).describe("\u91C7\u6837\u534A\u5F84\uFF0C0 \u8868\u793A\u53EA\u53D6\u5355\u70B9\uFF0C\u9ED8\u8BA4 0")}},async({imagePath:t,x:n,y:r,radius:i})=>{try{return(0,l.createTextToolResult)(await O(t,n,r,i))}catch(a){return f(a)}}),e.registerTool("screen_pick_color",{title:"Screen Pick Color",description:"\u4ECE\u5F53\u524D\u9ED8\u8BA4\u8BBE\u5907\u622A\u56FE\u4E2D\u8BFB\u53D6\u6307\u5B9A\u5750\u6807\u989C\u8272\uFF0C\u8FD4\u56DE hex/rgb/rgba\uFF0C\u9002\u5408\u81EA\u52A8\u751F\u6210\u627E\u8272\u4EE3\u7801\u3002",inputSchema:{x:s.number().int().min(0).describe("\u76EE\u6807\u5750\u6807 x"),y:s.number().int().min(0).describe("\u76EE\u6807\u5750\u6807 y"),radius:s.number().int().min(0).max(20).optional().default(0).describe("\u91C7\u6837\u534A\u5F84\uFF0C0 \u8868\u793A\u53EA\u53D6\u5355\u70B9\uFF0C\u9ED8\u8BA4 0")}},async({x:t,y:n,radius:r})=>{try{const i=await(0,l.resolveRuntimeHttpTarget)();return(0,l.createTextToolResult)(await G(i,t,n,r))}catch(i){return f(i)}}),e.registerTool("image_make_transparent",{title:"Image Make Transparent",description:"\u5C06\u56FE\u7247\u4E2D\u63A5\u8FD1\u6307\u5B9A\u989C\u8272\u6216\u89D2\u843D\u80CC\u666F\u8272\u7684\u50CF\u7D20\u8BBE\u4E3A\u900F\u660E\uFF0C\u5E76\u8F93\u51FA PNG \u6587\u4EF6\uFF0C\u9002\u5408\u5236\u4F5C\u627E\u56FE\u6A21\u677F\u900F\u660E\u56FE\u3002",inputSchema:{imagePath:s.string().min(1).describe("\u8F93\u5165\u56FE\u7247\u8DEF\u5F84"),outputPath:s.string().min(1).optional().describe("\u53EF\u9009\u8F93\u51FA\u8DEF\u5F84\uFF1B\u4E0D\u4F20\u5219\u5728\u8F93\u5165\u56FE\u7247\u540C\u76EE\u5F55\u751F\u6210 *-transparent.png"),transparentColor:s.string().min(1).optional().describe("\u8981\u900F\u660E\u5316\u7684\u989C\u8272\uFF0C\u683C\u5F0F #RRGGBB\uFF1B\u4E0D\u4F20\u5219\u4ECE\u6307\u5B9A\u89D2\u843D\u91C7\u6837"),sampleCorner:s.enum(["topLeft","topRight","bottomLeft","bottomRight"]).optional().default("topLeft").describe("\u672A\u4F20 transparentColor \u65F6\u91C7\u6837\u7684\u80CC\u666F\u89D2\u843D\uFF0C\u9ED8\u8BA4 topLeft"),tolerance:s.number().int().min(0).max(441).optional().default(24).describe("RGB \u6B27\u6C0F\u8DDD\u79BB\u5BB9\u5DEE\uFF0C\u9ED8\u8BA4 24\uFF0C\u6700\u5927 441")}},async({imagePath:t,outputPath:n,transparentColor:r,sampleCorner:i,tolerance:a})=>{try{return(0,l.createTextToolResult)(await L(t,n,r,i,a))}catch(o){return f(o)}})}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ms-vite-plugin",
3
- "version": "1.4.81",
3
+ "version": "1.4.83",
4
4
  "type": "commonjs",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
@@ -28,8 +28,9 @@
28
28
  "commander": "^14.0.3",
29
29
  "crc": "^4.3.2",
30
30
  "fs-extra": "^11.3.5",
31
+ "jpeg-js": "^0.4.4",
31
32
  "magic-string": "^0.30.21",
32
- "sharp": "^0.34.5",
33
+ "pngjs": "^7.0.0",
33
34
  "uuid": "^14.0.0",
34
35
  "vite": "^8.0.13",
35
36
  "vite-plugin-bundle-obfuscator": "^1.12.0",
@@ -41,6 +42,7 @@
41
42
  "@types/crc": "^4.0.0",
42
43
  "@types/fs-extra": "^11.0.4",
43
44
  "@types/node": "^25.9.0",
45
+ "@types/pngjs": "^6.0.5",
44
46
  "@types/uuid": "^11.0.0",
45
47
  "@types/ws": "^8.18.1",
46
48
  "esbuild": "^0.28.2",