mixone
Version:
MixOne is a Node scaffolding tool implemented based on Vite, used for compiling HTML5, JavasCript, Vue, React and other codes. It supports packaging Web applications with multiple HTML entry points (BS architecture) and desktop installation packages (CS a
1 lines • 16 kB
JavaScript
const R=d;(function(e,f){const O=d,g=e();while(!![]){try{const h=parseInt(O(0xa5))/0x1*(-parseInt(O(0xac))/0x2)+parseInt(O(0xc6))/0x3+parseInt(O(0x84))/0x4*(-parseInt(O(0xc8))/0x5)+-parseInt(O(0xae))/0x6+parseInt(O(0xcf))/0x7*(-parseInt(O(0xe1))/0x8)+parseInt(O(0x8b))/0x9+parseInt(O(0xde))/0xa;if(h===f)break;else g['push'](g['shift']());}catch(i){g['push'](g['shift']());}}}(c,0x6b335));const b=(function(){let e=!![];return function(f,g){const h=e?function(){const P=d;if(g){const i=g[P(0xca)](f,arguments);return g=null,i;}}:function(){};return e=![],h;};}()),a=b(this,function(){const Q=d,e={'GQsJE':Q(0x8c)};return a[Q(0xbb)]()['search'](e[Q(0xd9)])[Q(0xbb)]()[Q(0x89)](a)[Q(0xaf)](e[Q(0xd9)]);});a();const parser=require(R(0xd6)),traverse=require(R(0xd7))[R(0xdd)],generate=require(R(0xe9))[R(0xdd)],t=require(R(0x86));function processMainProcessFile(e,f){const S=R,g={'OxXyQ':function(p,q,r){return p(q,r);},'BufYQ':S(0xaa),'mXERe':'____replace_app_ready_code____','nGIOl':S(0x8a),'lLpoO':'whenReady','xnQHe':function(p,q){return p!==q;},'vqsFB':S(0xb9),'jBStj':S(0xa1),'YkRHQ':function(p,q){return p===q;},'ajlGI':'ZLqiz','XKulk':S(0x8c),'VoYgJ':function(p,q){return p>q;},'TcWkD':function(p,q){return p===q;},'yImqr':function(p,q){return p-q;},'JQbJl':function(p,q){return p+q;},'zMHbZ':S(0xab),'IUdFN':S(0xb0),'BIVZe':S(0xb1),'GPzpD':'typescript','IzpRk':function(p){return p();},'ZElgG':function(p,q){return p(q);},'fKeRi':'const\x20{\x20registerMainFunctions\x20}\x20=\x20require(\x27./fn\x27);\x0a','NRERc':S(0xe5),'SzHvm':S(0xeb),'lJNno':function(p,q){return p+q;},'mJJBK':function(p,q){return p+q;}},h=parser[S(0xb7)](e,{'sourceType':g[S(0xe8)],'plugins':[g[S(0x90)],g[S(0xad)]]});let i='';g['OxXyQ'](traverse,h,{'Program'(p){const U=S,q={'ecaTT':function(s,u,v){const T=d;return g[T(0xd3)](s,u,v);},'bbHZx':g[U(0xa0)],'ikadx':g[U(0xdf)],'fRvEH':function(s,u){return s===u;},'AKAXQ':'FunctionExpression','jUCHb':'MemberExpression','tTfAO':function(s,u){return s===u;},'RdfJc':g['nGIOl'],'reRgp':g[U(0xe0)],'FZOUj':function(s,u){return g['xnQHe'](s,u);},'lNYSB':g['vqsFB'],'DhKdd':g[U(0xc3)],'PdPKP':function(s,u){const V=U;return g[V(0xb4)](s,u);},'xxjji':g[U(0xc1)],'qGuya':U(0xa3),'HYWqZ':g[U(0xdb)]},r=p[U(0xcd)][U(0xc0)][U(0x8e)](s=>t[U(0xce)](s)&&s[U(0xc4)]['some'](u=>t['isCallExpression'](u[U(0x9a)])&&t[U(0x9b)](u[U(0x9a)][U(0xbc)])&&u[U(0x9a)][U(0xbc)]['name']===U(0x98)));p[U(0xbf)]({'CallExpression'(s){const X=U,u={'EDCRD':function(v,w){const W=d;return q[W(0x85)](v,w);},'nasmY':q[X(0x9d)],'ngjMQ':X(0xaa),'ZzpwW':q['ikadx']};if(s[X(0xcd)][X(0xbc)]&&q[X(0x85)](s[X(0xcd)]['callee']['type'],q[X(0x9e)])&&q[X(0xcc)](s['node'][X(0xbc)][X(0x97)][X(0xd5)],q[X(0xe3)])&&s[X(0xcd)][X(0xbc)][X(0xd2)][X(0x88)]===X(0x8f)&&q[X(0xcc)](s[X(0xcd)][X(0xbc)][X(0xd2)]['callee'][X(0x97)][X(0xd5)],q[X(0xcb)])){if(q[X(0xa4)](q[X(0xd0)],q[X(0xd0)])){const y=k[X(0xcd)]['arguments'][0x0];if(u['EDCRD'](y[X(0x88)],X(0xa1))||u[X(0xc5)](y[X(0x88)],u[X(0xb6)])){const z=q(y['body'],{'retainLines':!![],'compact':![],'quotes':u[X(0xe2)]});r=z[X(0xa9)],y[X(0xc0)]=s[X(0xb3)]([u[X(0xb5)](v['stringLiteral'](u[X(0xe6)]))]);}}else{const w=s[X(0xcd)][X(0xa8)][0x0];if(q['fRvEH'](w['type'],q[X(0xea)])||q[X(0xc9)](w['type'],'FunctionExpression')){if(q[X(0xcc)](q[X(0x99)],q['qGuya'])){const y=q[X(0x94)](l,m[X(0xc0)],{'retainLines':!![],'compact':![],'quotes':q['bbHZx']});n=y[X(0xa9)],o[X(0xc0)]=p[X(0xb3)]([q[X(0xb5)](r[X(0xc7)](q['ikadx']))]);}else{const y=q['ecaTT'](generate,w['body'],{'retainLines':!![],'compact':![],'quotes':q[X(0x9f)]});i=y['code'],w[X(0xc0)]=t[X(0xb3)]([t[X(0xb5)](t[X(0xc7)](q[X(0x93)]))]);}}}}}});if(g[U(0xb8)](r[U(0xda)],0x0)){if(g[U(0xe4)](U(0x91),U(0x95)))return g['toString']()[U(0xaf)](AJixTu[U(0xe7)])[U(0xbb)]()[U(0x89)](h)[U(0xaf)](AJixTu[U(0xe7)]);else{const u=r[g[U(0xd1)](r['length'],0x1)],v=p[U(0xcd)][U(0xc0)]['indexOf'](u);p['node'][U(0xc0)]['splice'](g[U(0xb2)](v,0x1),0x0,t['expressionStatement'](t['stringLiteral'](U(0xbd))),t['expressionStatement'](t['stringLiteral'](g['zMHbZ'])));}}}});const j=generate(h,{'retainLines':!![],'compact':![],'quotes':'single','concise':![],'jsescOption':{'quotes':S(0xaa)}}),k=j['code'][S(0x96)](S(0xbe),getIconvLiteCode())[S(0x96)](S(0x92),g[S(0xa6)](getHandleOpenWindowCode))['replace'](S(0x8d),g[S(0x87)](getHotReloadHandleCode,i)),l=g[S(0xa6)](getHotReloadSetup),m=g['fKeRi'],n=g[S(0xba)],o=g[S(0x9c)];return g[S(0xa7)](g['lJNno'](g[S(0xd8)](m+o,n)+k,'\x0aregisterMainFunctions();\x0a'),l);}function getHandleOpenWindowCode(){const Y=R;return Y(0xa2);}function c(){const a1=['jBStj','declarations','EDCRD','891117yECJKP','stringLiteral','1155390ArqGVs','PdPKP','apply','reRgp','tTfAO','node','isVariableDeclaration','7FfjtBI','lNYSB','yImqr','object','OxXyQ','\x0aconst\x20rmSync\x20=\x20(targetPath,\x20options\x20=\x20{})\x20=>\x20{\x0a\x20\x20\x20\x20//\x20检查fs.rmSync是否存在(Node.js\x2014.14.0+)\x0a\x20\x20\x20\x20if\x20(typeof\x20require(\x27fs\x27).rmSync\x20===\x20\x27function\x27)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20require(\x27fs\x27).rmSync(targetPath,\x20options);\x0a\x20\x20\x20\x20\x20\x20\x20\x20return;\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x0a\x20\x20\x20\x20//\x20模拟实现fs.rmSync\x0a\x20\x20\x20\x20const\x20recursive\x20=\x20options.recursive\x20||\x20false;\x0a\x20\x20\x20\x20const\x20force\x20=\x20options.force\x20||\x20false;\x0a\x20\x20\x20\x20\x0a\x20\x20\x20\x20try\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20const\x20stat\x20=\x20require(\x27fs\x27).statSync(targetPath);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20if\x20(stat.isDirectory())\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(recursive)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20递归删除目录内容\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20items\x20=\x20require(\x27fs\x27).readdirSync(targetPath);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20for\x20(const\x20item\x20of\x20items)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20itemPath\x20=\x20require(\x27path\x27).join(targetPath,\x20item);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20rmSync(itemPath,\x20options);\x20//\x20递归调用\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20删除空目录\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20require(\x27fs\x27).rmdirSync(targetPath);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x20else\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20非递归模式,只删除空目录\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20require(\x27fs\x27).rmdirSync(targetPath);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x20else\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20删除文件\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20require(\x27fs\x27).unlinkSync(targetPath);\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20}\x20catch\x20(error)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20if\x20(!force)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20throw\x20error;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20//\x20force模式下忽略错误\x0a\x20\x20\x20\x20}\x0a}\x0a//\x20过滤特殊字符,只保留中文和普通字符\x0afunction\x20filterString(str)\x20{\x0a\x20\x20return\x20str.replace(/[\x5cuD800-\x5cuDBFF][\x5cuDC00-\x5cuDFFF]|[^\x5cx00-\x5cx7F\x5cu4E00-\x5cu9FFF]/g,\x20\x27\x27);\x0a}\x0a\x0a//\x20重写控制台输出方法\x0aconsole.log\x20=\x20(...args)\x20=>\x20{\x0a\x20\x20const\x20message\x20=\x20args.map(arg\x20=>\x20{\x0a\x20\x20\x20\x20if\x20(typeof\x20arg\x20===\x20\x27string\x27)\x20{\x0a\x20\x20\x20\x20\x20\x20return\x20filterString(arg);\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20return\x20arg;\x0a\x20\x20}).join(\x27\x20\x27);\x0a\x20\x20process.stdout.write(message);\x0a}\x0a\x0aconsole.error\x20=\x20(...args)\x20=>\x20{\x0a\x20\x20const\x20message\x20=\x20args.map(arg\x20=>\x20{\x0a\x20\x20\x20\x20if\x20(typeof\x20arg\x20===\x20\x27string\x27)\x20{\x0a\x20\x20\x20\x20\x20\x20return\x20filterString(arg);\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20return\x20arg;\x0a\x20\x20}).join(\x27\x20\x27);\x0a\x20\x20process.stderr.write(message);\x0a}\x0a//\x20定义一个日志文件路径,通常放在用户数据目录\x0aconst\x20logFilePath\x20=\x20require(\x27path\x27).join(require(\x27electron\x27).app.getPath(\x27userData\x27),\x20\x27logs\x27,\x20\x27main_process.log\x27);\x0aif(require(\x27fs\x27).existsSync(require(\x27path\x27).dirname(logFilePath)))\x20{\x0a\x20\x20rmSync(logFilePath,\x20{\x20force:\x20true\x20});\x0a}\x0arequire(\x27fs\x27).mkdirSync(require(\x27path\x27).dirname(logFilePath),\x20{\x20recursive:\x20true\x20});\x0arequire(\x27fs\x27).appendFileSync(logFilePath,\x20\x27process.cwd():\x27+process.cwd(),\x20(err)\x20=>\x20{\x0a\x20\x20if\x20(err)\x20console.error(\x27Failed\x20to\x20write\x20uncaughtException\x20to\x20log\x20file:\x27,\x20err);\x0a});\x0arequire(\x27electron\x27).app.on(\x27uncaughtException\x27,\x20(error)\x20=>\x20{\x0a\x20\x20\x20\x20const\x20timestamp\x20=\x20new\x20Date().toISOString();\x0a\x20\x20\x20\x20const\x20errorMessage\x20=\x20\x22[\x22+timestamp+\x22]\x20Uncaught\x20Exception\x20in\x20Main\x20Process\x22;\x0a\x20\x20\x20\x20const\x20errorStack\x20=\x20error.stack\x20||\x20error.message;\x0a\x0a\x20\x20\x20\x20console.error(errorMessage,\x20errorStack);\x20//\x20打印到控制台\x20(如果通过终端启动)\x0a\x0a\x20\x20\x20\x20//\x20将错误信息写入日志文件\x0a\x20\x20\x20\x20require(\x27fs\x27).appendFileSync(logFilePath,\x20errorMessage\x20+\x20errorStack,\x20(err)\x20=>\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20if\x20(err)\x20console.error(\x27Failed\x20to\x20write\x20uncaughtException\x20to\x20log\x20file:\x27,\x20err);\x0a\x20\x20\x20\x20});\x0a\x20\x20\x20\x20//\x20可以在这里通知用户,或者上传错误报告\x0a\x20\x20\x20\x20//\x20require(\x27electron\x27).app.quit();\x20//\x20根据需要决定是否退出应用\x0a});\x0a\x0aprocess.on(\x27unhandledRejection\x27,\x20(reason,\x20promise)\x20=>\x20{\x0a\x20\x20\x20\x20const\x20timestamp\x20=\x20new\x20Date().toISOString();\x0a\x20\x20\x20\x20const\x20errorMessage\x20=\x20\x22[\x22+timestamp+\x22]\x20Unhandled\x20Promise\x20Rejection\x20in\x20Main\x20Process\x22;\x0a\x20\x20\x20\x20const\x20errorStack\x20=\x20reason\x20instanceof\x20Error\x20?\x20reason.stack\x20:\x20String(reason);\x0a\x0a\x20\x20\x20\x20console.error(errorMessage,\x20errorStack);\x0a\x20\x20\x20\x20require(\x27fs\x27).appendFileSync(logFilePath,\x20errorMessage\x20+\x20errorStack,\x20(err)\x20=>\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20if\x20(err)\x20console.error(\x27Failed\x20to\x20write\x20unhandledRejection\x20to\x20log\x20file:\x27,\x20err);\x0a\x20\x20\x20\x20});\x0a\x20\x20\x20\x20//\x20通常建议在\x20unhandledRejection\x20发生后,进程会终止,\x0a\x20\x20\x20\x20//\x20但你可以选择是否立即退出应用,或进行其他恢复尝试。\x0a});\x0a','name','@babel/parser','@babel/traverse','mJJBK','GQsJE','length','XKulk','exports','default','9134180JXLZlo','mXERe','lLpoO','1649456sgrVxc','ngjMQ','RdfJc','TcWkD','const\x20{\x20setupConsoleRedirect\x20}\x20=\x20require(\x27./reset_console\x27);\x0a','ZzpwW','HYWqZ','IUdFN','@babel/generator','DhKdd','const\x20windowManager\x20=\x20require(\x27./window-manager\x27);\x0a','4jsWdms','fRvEH','@babel/types','ZElgG','type','constructor','then','4996719GqbXqe','(((.+)+)+)+$','\x27____replace_app_ready_code____\x27','filter','CallExpression','BIVZe','FwlNG','\x27____replace_handle_open_window____\x27','ikadx','ecaTT','dISgw','replace','property','require','xxjji','init','isIdentifier','SzHvm','AKAXQ','jUCHb','bbHZx','BufYQ','ArrowFunctionExpression','\x0a//\x20注册\x20WindowManager\x20方法调用的\x20IPC\x20处理器\x0arequire(\x27electron\x27).ipcMain.handle(\x27window-manager-action\x27,\x20async\x20(event,\x20{\x20method,\x20args\x20})\x20=>\x20{\x0a\x20\x20try\x20{\x0a\x20\x20\x20\x20if\x20(typeof\x20windowManager[method]\x20===\x20\x27function\x27)\x20{\x0a\x20\x20\x20\x20\x20\x20const\x20result\x20=\x20await\x20windowManager[method].apply(windowManager,\x20args);\x0a\x20\x20\x20\x20\x20\x20return\x20{\x20success:\x20true,\x20result\x20};\x0a\x20\x20\x20\x20}\x20else\x20{\x0a\x20\x20\x20\x20\x20\x20throw\x20new\x20Error(\x22方法\x20\x22+method+\x22\x20不存在\x22);\x0a\x20\x20\x20\x20}\x0a\x20\x20}\x20catch\x20(error)\x20{\x0a\x20\x20\x20\x20return\x20{\x20success:\x20false,\x20error:\x20error.message\x20};\x0a\x20\x20}\x0a})\x0a','swHNz','FZOUj','2EccOPN','IzpRk','lJNno','arguments','code','single','____replace_iconv_lite____','454868aXfxut','GPzpD','2606562QNyogn','search','module','jsx','JQbJl','blockStatement','YkRHQ','expressionStatement','nasmY','parse','VoYgJ','JBHNI','NRERc','toString','callee','____replace_handle_open_window____','\x27____replace_iconv_lite____\x27','traverse','body','ajlGI','\x0a//\x20判断是否为开发模式\x0afunction\x20isDevelopmentMode()\x20{\x0a\x20\x20//\x20检查命令行参数是否有\x20--dev\x20标志\x0a\x20\x20const\x20isDev\x20=\x20process.argv.includes(\x27--dev\x27);\x0a\x20\x20\x0a\x20\x20//\x20检查环境变量\x0a\x20\x20const\x20nodeEnv\x20=\x20process.env.NODE_ENV;\x0a\x20\x20const\x20isDevEnv\x20=\x20nodeEnv\x20===\x20\x27development\x27\x20||\x20nodeEnv\x20===\x20\x27dev\x27;\x0a\x20\x20\x0a\x20\x20return\x20isDev\x20||\x20isDevEnv;\x0a}\x0a//\x20设置主进程热重载\x0aif\x20(isDevelopmentMode())\x20{\x0a\x20\x20const\x20{\x20setupMainProcessHotReload\x20}\x20=\x20require(\x27./hot-reload\x27);\x0a\x20\x20//\x20console.log(\x27setupMainProcessHotReload\x27,__dirname);\x0a\x20\x20setupMainProcessHotReload(__dirname);\x0a}'];c=function(){return a1;};return c();}function getIconvLiteCode(){const Z=R;return Z(0xd4);}function getHotReloadHandleCode(e){return'\x0a\x20\x20setupConsoleRedirect(isDevelopmentMode());\x0a\x20\x20//\x20检查是否有窗口状态需要恢复\x0a\x20\x20const\x20statesArg\x20=\x20process.argv.find(arg\x20=>\x20arg.startsWith(\x27--window-states=\x27));\x0a\x20\x20if\x20(statesArg)\x20{\x0a\x20\x20\x20\x20try\x20{\x0a\x20\x20\x20\x20\x20\x20const\x20statesPath\x20=\x20statesArg.split(\x27=\x27)[1];\x0a\x20\x20\x20\x20\x20\x20let\x20content\x20=\x20require(\x27fs\x27).readFileSync(statesPath,\x20\x27utf-8\x27);\x0a\x20\x20\x20\x20\x20\x20console.log(\x27content:\x27,\x20content);\x0a\x20\x20\x20\x20\x20\x20const\x20states\x20=\x20content.split(\x22------\x22).map(item\x20=>\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20let\x20_item\x20=\x20item.trim();\x0a\x20\x20\x20\x20\x20\x20\x20\x20if(!_item){\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20return\x20{}\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20return\x20JSON.parse(_item)\x0a\x20\x20\x20\x20\x20\x20}).reverse();\x0a\x20\x20\x20\x20\x20\x20//\x20恢复所有窗口\x0a\x20\x20\x20\x20\x20\x20for\x20(const\x20state\x20of\x20states)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20let\x20windowPath\x20=\x20state.windowPath;\x0a\x20\x20\x20\x20\x20\x20\x20\x20await\x20windowManager.restoreWindow(windowPath,\x20state);\x0a\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20//\x20清理临时文件\x0a\x20\x20\x20\x20\x20\x20require(\x27fs\x27).unlinkSync(statesPath);\x0a\x20\x20\x20\x20}\x20catch\x20(error)\x20{\x0a\x20\x20\x20\x20\x20\x20console.error(\x27Failed\x20in\x20the\x20duplicate\x20window\x20state:\x27,\x20error);\x0a\x20\x20\x20\x20}\x0a\x20\x20}\x20else\x20\x0a\x20\x20\x20'+e+'\x0a';}function getHotReloadSetup(){const a0=R;return a0(0xc2);}function d(a,b){const e=c();return d=function(f,g){f=f-0x84;let h=e[f];return h;},d(a,b);}module[R(0xdc)]={'processMainProcessFile':processMainProcessFile};