prime-dev-cli 1.0.14 → 1.0.16
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/server/.next/BUILD_ID +1 -1
- package/dist/server/.next/app-path-routes-manifest.json +1 -0
- package/dist/server/.next/build-manifest.json +6 -6
- package/dist/server/.next/cache/.rscinfo +1 -1
- package/dist/server/.next/cache/.tsbuildinfo +1 -1
- package/dist/server/.next/cache/eslint/.cache_1qa5vxt +1 -1
- package/dist/server/.next/fallback-build-manifest.json +6 -6
- package/dist/server/.next/next-minimal-server.js.nft.json +1 -1
- package/dist/server/.next/next-server.js.nft.json +1 -1
- package/dist/server/.next/prerender-manifest.json +9 -9
- package/dist/server/.next/server/app/_not-found/page.js +2 -1
- package/dist/server/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/dist/server/.next/server/app/_not-found.html +1 -1
- package/dist/server/.next/server/app/_not-found.rsc +2 -2
- package/dist/server/.next/server/app/api/all-projects-envs/route.js +1 -1
- package/dist/server/.next/server/app/api/all-projects-envs/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/check-mock-intercept/route.js +1 -1
- package/dist/server/.next/server/app/api/check-mock-intercept/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/check-workspace/route.js +1 -1
- package/dist/server/.next/server/app/api/check-workspace/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/cleanup-mock/route.js +1 -1
- package/dist/server/.next/server/app/api/cleanup-mock/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/delete-mock-api/route.js +1 -1
- package/dist/server/.next/server/app/api/delete-mock-api/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/get-mock-data/route.js +1 -1
- package/dist/server/.next/server/app/api/get-mock-data/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/initialize-workspace/route.js +1 -1
- package/dist/server/.next/server/app/api/initialize-workspace/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/memory-status/route/app-build-manifest.json +11 -0
- package/dist/server/.next/server/app/api/memory-status/route/app-paths-manifest.json +3 -0
- package/dist/server/.next/server/app/api/memory-status/route/build-manifest.json +17 -0
- package/dist/server/.next/server/app/api/memory-status/route/next-font-manifest.json +6 -0
- package/dist/server/.next/server/app/api/memory-status/route/react-loadable-manifest.json +1 -0
- package/dist/server/.next/server/app/api/memory-status/route/server-reference-manifest.json +4 -0
- package/dist/server/.next/server/app/api/memory-status/route.js +8 -0
- package/dist/server/.next/server/app/api/memory-status/route.js.map +5 -0
- package/dist/server/.next/server/app/api/memory-status/route.js.nft.json +1 -0
- package/dist/server/.next/server/app/api/memory-status/route_client-reference-manifest.js +2 -0
- package/dist/server/.next/server/app/api/microapp-proxy-change-stream/route.js +1 -1
- package/dist/server/.next/server/app/api/microapp-proxy-change-stream/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/microapp-proxy-config/route.js +1 -1
- package/dist/server/.next/server/app/api/microapp-proxy-config/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/mock-file/route.js +1 -1
- package/dist/server/.next/server/app/api/mock-file/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/mock-file-content/route.js +1 -1
- package/dist/server/.next/server/app/api/mock-file-content/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/mock-open-status/route.js +1 -1
- package/dist/server/.next/server/app/api/mock-open-status/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/mock-setting/route.js +1 -1
- package/dist/server/.next/server/app/api/mock-setting/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/open-all-mock/route.js +1 -1
- package/dist/server/.next/server/app/api/open-all-mock/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/open-project/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/process/logs/route.js +1 -1
- package/dist/server/.next/server/app/api/process/logs/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/process/logs/stream/route.js +1 -1
- package/dist/server/.next/server/app/api/process/logs/stream/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/process/start/route.js +1 -1
- package/dist/server/.next/server/app/api/process/start/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/process/status/route.js +1 -1
- package/dist/server/.next/server/app/api/process/status/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/project-config/route.js +1 -1
- package/dist/server/.next/server/app/api/project-config/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/retry-project/route.js +1 -1
- package/dist/server/.next/server/app/api/retry-project/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/workspace/create/route.js +1 -1
- package/dist/server/.next/server/app/api/workspace/create/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/configuration/page.js +2 -1
- package/dist/server/.next/server/app/configuration/page.js.nft.json +1 -1
- package/dist/server/.next/server/app/configuration.html +1 -1
- package/dist/server/.next/server/app/configuration.rsc +2 -2
- package/dist/server/.next/server/app/index.html +1 -1
- package/dist/server/.next/server/app/index.rsc +2 -2
- package/dist/server/.next/server/app/initialization/page.js +2 -1
- package/dist/server/.next/server/app/initialization/page.js.nft.json +1 -1
- package/dist/server/.next/server/app/initialization.html +1 -1
- package/dist/server/.next/server/app/initialization.rsc +2 -2
- package/dist/server/.next/server/app/page.js +2 -1
- package/dist/server/.next/server/app/page.js.nft.json +1 -1
- package/dist/server/.next/server/app-paths-manifest.json +1 -0
- package/dist/server/.next/server/chunks/{[root-of-the-server]__7c3ad3a9._.js → [root-of-the-server]__03c2b225._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__7c3ad3a9._.js.map → [root-of-the-server]__03c2b225._.js.map} +1 -1
- package/dist/server/.next/server/chunks/{[root-of-the-server]__e54d7eff._.js → [root-of-the-server]__072f5c45._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__e54d7eff._.js.map → [root-of-the-server]__072f5c45._.js.map} +1 -1
- package/dist/server/.next/server/chunks/{[root-of-the-server]__9370ea2b._.js → [root-of-the-server]__2ba93285._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__9370ea2b._.js.map → [root-of-the-server]__2ba93285._.js.map} +1 -1
- package/dist/server/.next/server/chunks/[root-of-the-server]__2fcc7175._.js +5 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__2fcc7175._.js.map +1 -0
- package/dist/server/.next/server/chunks/{[root-of-the-server]__6f66caff._.js → [root-of-the-server]__31a13318._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__6f66caff._.js.map → [root-of-the-server]__31a13318._.js.map} +1 -1
- package/dist/server/.next/server/chunks/[root-of-the-server]__388e6150._.js +5 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__388e6150._.js.map +1 -0
- package/dist/server/.next/server/chunks/{[root-of-the-server]__4498bb74._.js → [root-of-the-server]__3dfc0dc4._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__4498bb74._.js.map → [root-of-the-server]__3dfc0dc4._.js.map} +1 -1
- package/dist/server/.next/server/chunks/{[root-of-the-server]__0aaf11fd._.js → [root-of-the-server]__419d3b16._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__0aaf11fd._.js.map → [root-of-the-server]__419d3b16._.js.map} +1 -1
- package/dist/server/.next/server/chunks/{[root-of-the-server]__442ae257._.js → [root-of-the-server]__5100a0c5._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__442ae257._.js.map → [root-of-the-server]__5100a0c5._.js.map} +1 -1
- package/dist/server/.next/server/chunks/{[root-of-the-server]__aba5bddd._.js → [root-of-the-server]__5348b4aa._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__aba5bddd._.js.map → [root-of-the-server]__5348b4aa._.js.map} +1 -1
- package/dist/server/.next/server/chunks/{[root-of-the-server]__70a56518._.js → [root-of-the-server]__5355b75a._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__70a56518._.js.map → [root-of-the-server]__5355b75a._.js.map} +1 -1
- package/dist/server/.next/server/chunks/[root-of-the-server]__629e6d6a._.js +3 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__629e6d6a._.js.map +1 -0
- package/dist/server/.next/server/chunks/{[root-of-the-server]__c8cd1231._.js → [root-of-the-server]__6e5dc117._.js} +2 -2
- package/dist/server/.next/server/chunks/[root-of-the-server]__6e5dc117._.js.map +1 -0
- package/dist/server/.next/server/chunks/{[root-of-the-server]__07bd4a2b._.js → [root-of-the-server]__7500acb0._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__07bd4a2b._.js.map → [root-of-the-server]__7500acb0._.js.map} +1 -1
- package/dist/server/.next/server/chunks/{[root-of-the-server]__6f17de68._.js → [root-of-the-server]__771e8133._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__6f17de68._.js.map → [root-of-the-server]__771e8133._.js.map} +1 -1
- package/dist/server/.next/server/chunks/{[root-of-the-server]__c15317cb._.js → [root-of-the-server]__7fc974c9._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__c15317cb._.js.map → [root-of-the-server]__7fc974c9._.js.map} +1 -1
- package/dist/server/.next/server/chunks/{[root-of-the-server]__9f32f8a7._.js → [root-of-the-server]__899d82eb._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__9f32f8a7._.js.map → [root-of-the-server]__899d82eb._.js.map} +1 -1
- package/dist/server/.next/server/chunks/[root-of-the-server]__8fcbb2f0._.js +3 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__8fcbb2f0._.js.map +1 -0
- package/dist/server/.next/server/chunks/{[root-of-the-server]__6cc174c2._.js → [root-of-the-server]__973c48a6._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__6cc174c2._.js.map → [root-of-the-server]__973c48a6._.js.map} +1 -1
- package/dist/server/.next/server/chunks/[root-of-the-server]__a292866b._.js +15 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__a292866b._.js.map +1 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__c8b26634._.js +3 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__c8b26634._.js.map +1 -0
- package/dist/server/.next/server/chunks/{[root-of-the-server]__f76d331f._.js → [root-of-the-server]__f815ea40._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__f76d331f._.js.map → [root-of-the-server]__f815ea40._.js.map} +1 -1
- package/dist/server/.next/server/chunks/ssr/[root-of-the-server]__828c7089._.js +3 -0
- package/dist/server/.next/server/chunks/ssr/[root-of-the-server]__828c7089._.js.map +1 -0
- package/dist/server/.next/server/chunks/ssr/packages_server_src_eb289b89._.js +5 -0
- package/dist/server/.next/server/chunks/ssr/packages_server_src_eb289b89._.js.map +1 -0
- package/dist/server/.next/server/middleware-build-manifest.js +4 -4
- package/dist/server/.next/server/pages/404.html +1 -1
- package/dist/server/.next/server/pages/500.html +1 -1
- package/dist/server/.next/server/pages/_app/build-manifest.json +2 -2
- package/dist/server/.next/server/pages/_error/build-manifest.json +2 -2
- package/dist/server/.next/server/server-reference-manifest.js +1 -1
- package/dist/server/.next/server/server-reference-manifest.json +1 -1
- package/dist/server/.next/static/chunks/{0089092a8fff7e00.js → 294d677a4838a994.js} +2 -2
- package/dist/server/.next/static/chunks/{fc5c3c838ec48e75.js.map → 479d60165927b286.js.map} +1 -1
- package/dist/server/.next/static/chunks/{0d1500d118ef892c.js → d65b8ba84ba3d819.js} +2 -2
- package/dist/server/.next/static/chunks/{bf41727b544d17b4.js → f9ef1d12f3c1646a.js} +2 -2
- package/dist/server/.next/static/chunks/pages/_app.js +2 -2
- package/dist/server/.next/static/chunks/pages/_error.js +2 -2
- package/dist/server/.next/trace +1 -1
- package/package.json +1 -1
- package/dist/server/.next/server/chunks/[root-of-the-server]__616d1a09._.js +0 -3
- package/dist/server/.next/server/chunks/[root-of-the-server]__616d1a09._.js.map +0 -1
- package/dist/server/.next/server/chunks/[root-of-the-server]__66ca8d3f._.js +0 -11
- package/dist/server/.next/server/chunks/[root-of-the-server]__66ca8d3f._.js.map +0 -1
- package/dist/server/.next/server/chunks/[root-of-the-server]__b310ec65._.js +0 -3
- package/dist/server/.next/server/chunks/[root-of-the-server]__b310ec65._.js.map +0 -1
- package/dist/server/.next/server/chunks/[root-of-the-server]__c8cd1231._.js.map +0 -1
- package/dist/server/.next/server/chunks/[root-of-the-server]__e68f3764._.js +0 -3
- package/dist/server/.next/server/chunks/[root-of-the-server]__e68f3764._.js.map +0 -1
- package/dist/server/.next/server/chunks/[root-of-the-server]__fefd40ba._.js +0 -5
- package/dist/server/.next/server/chunks/[root-of-the-server]__fefd40ba._.js.map +0 -1
- package/dist/server/.next/server/chunks/ssr/packages_server_src_app_layout_tsx_0712e1b4._.js +0 -3
- package/dist/server/.next/server/chunks/ssr/packages_server_src_app_layout_tsx_0712e1b4._.js.map +0 -1
- /package/dist/server/.next/static/{e1tjd_meooMxESv5gSLAU → bC3bTGQyq6cbRR_M7T8N6}/_buildManifest.js +0 -0
- /package/dist/server/.next/static/{e1tjd_meooMxESv5gSLAU → bC3bTGQyq6cbRR_M7T8N6}/_clientMiddlewareManifest.json +0 -0
- /package/dist/server/.next/static/{e1tjd_meooMxESv5gSLAU → bC3bTGQyq6cbRR_M7T8N6}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
module.exports={45935:function(e){var{g:t,__dirname:r,m:a,e:s}=e;a.exports=e.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},29549:function(e){var{g:t,__dirname:r,m:a,e:s}=e;a.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},83943:function(e){var{g:t,__dirname:r,m:a,e:s}=e;a.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},86103:function(e){var{g:t,__dirname:r,m:a,e:s}=e;a.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},30331:function(e){var{g:t,__dirname:r,m:a,e:s}=e;a.exports=e.x("path",()=>require("path"))},23430:function(e){var{g:t,__dirname:r,m:a,e:s}=e;a.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},13442:function(e){var{g:t,__dirname:r,m:a,e:s}=e;a.exports=e.x("os",()=>require("os"))},52670:function(e){var{g:t,__dirname:r,m:a,e:s}=e;a.exports=e.x("next/dist/compiled/next-server/app-route-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-route-turbo.runtime.prod.js"))},9892:function(e){var{g:t,__dirname:r,m:a,e:s}=e;a.exports=e.x("fs/promises",()=>require("fs/promises"))},70967:e=>{"use strict";var{g:t,__dirname:r}=e;{e.s({appendLog:()=>p,cleanupOldLogs:()=>g,deleteProcessLogs:()=>x,getLogsDirSize:()=>m,getProcessLogPath:()=>i,readLastNLines:()=>f,rotateLogFile:()=>u,startLogCleanupTask:()=>L,stopLogCleanupTask:()=>y,truncateLogLine:()=>c,writeLogsSync:()=>d});var a=e.i(9892),s=e.i(30331),o=e.i(13442);let t={MAX_FILE_SIZE:5242880,MAX_LOG_FILES:3,MAX_LOG_AGE_DAYS:7,MAX_LINE_LENGTH:1e3,CLEANUP_INTERVAL:18e5};function n(){return s.default.join(o.default.homedir(),".prime-process-logs")}function i(e){return s.default.join(n(),`${e}.log`)}function c(e){return e.length<=t.MAX_LINE_LENGTH?e:e.substring(0,t.MAX_LINE_LENGTH)+"... [truncated]"}async function l(e){try{return(await a.default.stat(e)).size}catch{return 0}}async function u(e){let r=i(e),s=await l(r);if(!(s<t.MAX_FILE_SIZE)){console.log(`[日志管理] 轮转日志文件: ${e}, 大小: ${(s/1024/1024).toFixed(2)}MB`);try{let s=`${r}.${t.MAX_LOG_FILES}`;try{await a.default.unlink(s)}catch{}for(let e=t.MAX_LOG_FILES-1;e>=1;e--){let t=1===e?r:`${r}.${e}`,s=`${r}.${e+1}`;try{await a.default.rename(t,s)}catch{}}await a.default.rename(r,`${r}.1`),await a.default.writeFile(r,"","utf-8"),console.log(`[日志管理] 日志轮转完成: ${e}`)}catch(t){console.error(`[日志管理] 轮转日志文件失败: ${e}`,t)}}}async function p(e,t){await u(e);let r=i(e),s=c(t);try{await a.default.mkdir(n(),{recursive:!0}),await a.default.appendFile(r,s+"\n","utf-8")}catch(t){console.error(`[日志管理] 追加日志失败: ${e}`,t)}}async function d(e,t){await u(e);let r=i(e),s=t.map(e=>c(e));try{await a.default.mkdir(n(),{recursive:!0}),await a.default.writeFile(r,s.join("\n")+"\n","utf-8")}catch(t){console.error(`[日志管理] 写入日志失败: ${e}`,t)}}async function f(e,t=100){let r=i(e);try{return(await a.default.readFile(r,"utf-8")).split("\n").filter(e=>e.trim()).slice(-t)}catch{return[]}}async function g(){console.log("[日志管理] 开始清理旧日志...");try{let e=n();try{await a.default.access(e)}catch{console.log("[日志管理] 日志目录不存在,无需清理");return}let r=await a.default.readdir(e),o=Date.now(),i=24*t.MAX_LOG_AGE_DAYS*36e5,c=0,l=0;for(let t of r){let r=s.default.join(e,t);try{let e=await a.default.stat(r);if(o-e.mtime.getTime()>i){l+=e.size;try{await a.default.unlink(r),c++,console.log(`[日志管理] 删除过期日志: ${t}`)}catch(e){e?.code!=="ENOENT"&&console.error(`[日志管理] 删除文件失败: ${t}`,e)}}}catch(e){e?.code!=="ENOENT"&&console.error(`[日志管理] 处理文件失败: ${t}`,e)}}console.log(`[日志管理] 清理完成: 删除 ${c} 个文件, 释放 ${(l/1024/1024).toFixed(2)}MB`)}catch(e){console.error("[日志管理] 清理日志失败:",e)}}async function x(e){let r=i(e);try{await a.default.unlink(r)}catch(t){t?.code!=="ENOENT"&&console.error(`[日志管理] 删除主日志文件失败: ${e}`,t)}for(let s=1;s<=t.MAX_LOG_FILES;s++)try{await a.default.unlink(`${r}.${s}`)}catch(t){t?.code!=="ENOENT"&&console.error(`[日志管理] 删除轮转日志文件失败: ${e}.${s}`,t)}console.log(`[日志管理] 删除进程日志: ${e}`)}async function m(){try{let e=n(),t=await a.default.readdir(e),r=0,o=0;for(let n of t)try{let t=await a.default.stat(s.default.join(e,n));r+=t.size,o++}catch{}return{totalSize:r,fileCount:o}}catch{return{totalSize:0,fileCount:0}}}let r=null;function L(){r||(console.log("[日志管理] 启动定期清理任务"),g(),r=setInterval(()=>{g()},t.CLEANUP_INTERVAL))}function y(){r&&(clearInterval(r),r=null,console.log("[日志管理] 停止定期清理任务"))}process.on("SIGINT",()=>{y()}),process.on("SIGTERM",()=>{y()})}},24713:function(e){var{g:t,__dirname:r,m:a,e:s}=e},57948:e=>{"use strict";var{g:t,__dirname:r}=e;e.s({DELETE:()=>i,GET:()=>n});var a=e.i(15494),s=e.i(70967),o=e.i(9892);async function n(e){try{let{searchParams:t}=new URL(e.url),r=t.get("projectName"),n=t.get("envName"),i=t.get("tail")||"100";if(!r||!n)return a.NextResponse.json({success:!1,error:"缺少必要参数"},{status:400});let c=`${r}-${n}`,l=parseInt(i);try{let e=await (0,s.readLastNLines)(c,l),t=e.length;try{let e=(0,s.getProcessLogPath)(c);t=(await o.default.readFile(e,"utf-8")).split("\n").filter(e=>e.trim()).length}catch{}return a.NextResponse.json({success:!0,data:{logs:e,totalLines:t,tailCount:e.length}})}catch{return a.NextResponse.json({success:!0,data:{logs:[],totalLines:0,tailCount:0}})}}catch(e){return console.error("获取进程日志失败:",e),a.NextResponse.json({success:!1,error:e instanceof Error?e.message:"获取进程日志失败"},{status:500})}}async function i(e){try{let{searchParams:t}=new URL(e.url),r=t.get("projectName"),o=t.get("envName");if(!r||!o)return a.NextResponse.json({success:!1,error:"缺少必要参数"},{status:400});let n=`${r}-${o}`;return await (0,s.deleteProcessLogs)(n),a.NextResponse.json({success:!0,message:"日志已清除"})}catch(e){return console.error("清除进程日志失败:",e),a.NextResponse.json({success:!1,error:e instanceof Error?e.message:"清除进程日志失败"},{status:500})}}},47527:e=>{"use strict";var{g:t,__dirname:r}=e;{e.s({patchFetch:()=>i,routeModule:()=>t,serverHooks:()=>l,workAsyncStorage:()=>r,workUnitAsyncStorage:()=>c});var a=e.i(45746),s=e.i(93828),o=e.i(18250),n=e.i(57948);let t=new a.AppRouteRouteModule({definition:{kind:s.RouteKind.APP_ROUTE,page:"/api/process/logs/route",pathname:"/api/process/logs",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/process/logs/route.ts",nextConfigOutput:"",userland:n}),{workAsyncStorage:r,workUnitAsyncStorage:c,serverHooks:l}=t;function i(){return(0,o.patchFetch)({workAsyncStorage:r,workUnitAsyncStorage:c})}}}};
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=%5Broot-of-the-server%5D__c8b26634._.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["turbopack:///[project]/packages/server/src/lib/log-manager.ts","turbopack:///[project]/packages/server/src/app/api/process/logs/route.ts","turbopack:///[project]/node_modules/.pnpm/next@15.3.4_react-dom@19.1.0_react@19.1.0__react@19.1.0/node_modules/next/dist/src/build/templates/app-route.ts"],"sourcesContent":["/**\n * 日志管理器 - 处理日志文件的轮转、清理和大小限制\n */\nimport fs from 'fs/promises';\nimport path from 'path';\nimport os from 'os';\n\n// 日志配置\nconst LOG_CONFIG = {\n MAX_FILE_SIZE: 5 * 1024 * 1024, // 5MB\n MAX_LOG_FILES: 3, // 保留最多 3 个日志文件\n MAX_LOG_AGE_DAYS: 7, // 日志保留 7 天\n MAX_LINE_LENGTH: 1000, // 单行最大长度\n CLEANUP_INTERVAL: 30 * 60 * 1000, // 30 分钟清理一次\n};\n\n// 获取日志目录\nfunction getLogDir(): string {\n return path.join(os.homedir(), '.prime-process-logs');\n}\n\n// 获取进程日志文件路径\nexport function getProcessLogPath(processKey: string): string {\n return path.join(getLogDir(), `${processKey}.log`);\n}\n\n// 截断过长的日志行\nexport function truncateLogLine(line: string): string {\n if (line.length <= LOG_CONFIG.MAX_LINE_LENGTH) {\n return line;\n }\n return line.substring(0, LOG_CONFIG.MAX_LINE_LENGTH) + '... [truncated]';\n}\n\n/**\n * 获取文件大小\n */\nasync function getFileSize(filePath: string): Promise<number> {\n try {\n const stats = await fs.stat(filePath);\n return stats.size;\n } catch {\n return 0;\n }\n}\n\n/**\n * 轮转日志文件\n * 当日志文件超过大小限制时,将其重命名并创建新文件\n */\nexport async function rotateLogFile(processKey: string): Promise<void> {\n const logPath = getProcessLogPath(processKey);\n const fileSize = await getFileSize(logPath);\n\n // 如果文件大小未超过限制,不需要轮转\n if (fileSize < LOG_CONFIG.MAX_FILE_SIZE) {\n return;\n }\n\n console.log(`[日志管理] 轮转日志文件: ${processKey}, 大小: ${(fileSize / 1024 / 1024).toFixed(2)}MB`);\n\n try {\n // 删除最旧的日志文件\n const oldestLogPath = `${logPath}.${LOG_CONFIG.MAX_LOG_FILES}`;\n try {\n await fs.unlink(oldestLogPath);\n } catch {\n // 文件不存在,忽略\n }\n\n // 轮转现有的日志文件\n for (let i = LOG_CONFIG.MAX_LOG_FILES - 1; i >= 1; i--) {\n const oldPath = i === 1 ? logPath : `${logPath}.${i}`;\n const newPath = `${logPath}.${i + 1}`;\n\n try {\n await fs.rename(oldPath, newPath);\n } catch {\n // 文件不存在,继续\n }\n }\n\n // 重命名当前日志文件\n await fs.rename(logPath, `${logPath}.1`);\n\n // 创建新的空日志文件\n await fs.writeFile(logPath, '', 'utf-8');\n\n console.log(`[日志管理] 日志轮转完成: ${processKey}`);\n } catch (error) {\n console.error(`[日志管理] 轮转日志文件失败: ${processKey}`, error);\n }\n}\n\n/**\n * 追加日志到文件\n * 如果文件过大,先进行轮转\n */\nexport async function appendLog(processKey: string, logLine: string): Promise<void> {\n // 先检查是否需要轮转\n await rotateLogFile(processKey);\n\n const logPath = getProcessLogPath(processKey);\n const truncatedLine = truncateLogLine(logLine);\n\n try {\n // 确保日志目录存在\n await fs.mkdir(getLogDir(), { recursive: true });\n\n // 追加日志\n await fs.appendFile(logPath, truncatedLine + '\\n', 'utf-8');\n } catch (error) {\n console.error(`[日志管理] 追加日志失败: ${processKey}`, error);\n }\n}\n\n/**\n * 批量写入日志(用于初始写入或同步)\n */\nexport async function writeLogsSync(processKey: string, logs: string[]): Promise<void> {\n await rotateLogFile(processKey);\n\n const logPath = getProcessLogPath(processKey);\n const truncatedLogs = logs.map(line => truncateLogLine(line));\n\n try {\n await fs.mkdir(getLogDir(), { recursive: true });\n await fs.writeFile(logPath, truncatedLogs.join('\\n') + '\\n', 'utf-8');\n } catch (error) {\n console.error(`[日志管理] 写入日志失败: ${processKey}`, error);\n }\n}\n\n/**\n * 读取日志文件的最后 N 行\n */\nexport async function readLastNLines(processKey: string, n: number = 100): Promise<string[]> {\n const logPath = getProcessLogPath(processKey);\n\n try {\n const content = await fs.readFile(logPath, 'utf-8');\n const lines = content.split('\\n').filter(line => line.trim());\n return lines.slice(-n);\n } catch {\n return [];\n }\n}\n\n/**\n * 清理旧的日志文件\n * 删除超过保留期限的日志文件\n */\nexport async function cleanupOldLogs(): Promise<void> {\n console.log('[日志管理] 开始清理旧日志...');\n\n try {\n const logDir = getLogDir();\n\n // 确保目录存在\n try {\n await fs.access(logDir);\n } catch {\n console.log('[日志管理] 日志目录不存在,无需清理');\n return;\n }\n\n const files = await fs.readdir(logDir);\n const now = Date.now();\n const maxAge = LOG_CONFIG.MAX_LOG_AGE_DAYS * 24 * 60 * 60 * 1000;\n\n let deletedCount = 0;\n let freedSpace = 0;\n\n for (const file of files) {\n const filePath = path.join(logDir, file);\n\n try {\n const stats = await fs.stat(filePath);\n\n // 删除超过保留期的文件\n if (now - stats.mtime.getTime() > maxAge) {\n freedSpace += stats.size;\n try {\n await fs.unlink(filePath);\n deletedCount++;\n console.log(`[日志管理] 删除过期日志: ${file}`);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (unlinkError: any) {\n // 如果文件已经不存在,忽略错误\n if (unlinkError?.code !== 'ENOENT') {\n console.error(`[日志管理] 删除文件失败: ${file}`, unlinkError);\n }\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n // 如果文件不存在,跳过(可能已被删除)\n if (error?.code !== 'ENOENT') {\n console.error(`[日志管理] 处理文件失败: ${file}`, error);\n }\n }\n }\n\n console.log(`[日志管理] 清理完成: 删除 ${deletedCount} 个文件, 释放 ${(freedSpace / 1024 / 1024).toFixed(2)}MB`);\n } catch (error) {\n console.error('[日志管理] 清理日志失败:', error);\n }\n}\n\n/**\n * 删除指定进程的所有日志文件\n */\nexport async function deleteProcessLogs(processKey: string): Promise<void> {\n const logPath = getProcessLogPath(processKey);\n\n try {\n // 删除主日志文件\n await fs.unlink(logPath);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n // 文件不存在,忽略\n if (error?.code !== 'ENOENT') {\n console.error(`[日志管理] 删除主日志文件失败: ${processKey}`, error);\n }\n }\n\n // 删除轮转的日志文件\n for (let i = 1; i <= LOG_CONFIG.MAX_LOG_FILES; i++) {\n try {\n await fs.unlink(`${logPath}.${i}`);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n // 文件不存在,忽略\n if (error?.code !== 'ENOENT') {\n console.error(`[日志管理] 删除轮转日志文件失败: ${processKey}.${i}`, error);\n }\n }\n }\n\n console.log(`[日志管理] 删除进程日志: ${processKey}`);\n}\n\n/**\n * 获取日志目录的总大小\n */\nexport async function getLogsDirSize(): Promise<{ totalSize: number; fileCount: number }> {\n try {\n const logDir = getLogDir();\n const files = await fs.readdir(logDir);\n\n let totalSize = 0;\n let fileCount = 0;\n\n for (const file of files) {\n try {\n const stats = await fs.stat(path.join(logDir, file));\n totalSize += stats.size;\n fileCount++;\n } catch {\n // 忽略错误\n }\n }\n\n return { totalSize, fileCount };\n } catch {\n return { totalSize: 0, fileCount: 0 };\n }\n}\n\n// 定期清理任务\nlet cleanupTimer: NodeJS.Timeout | null = null;\n\n/**\n * 启动定期清理任务\n */\nexport function startLogCleanupTask(): void {\n if (cleanupTimer) {\n return; // 已经启动\n }\n\n console.log('[日志管理] 启动定期清理任务');\n\n // 立即执行一次\n cleanupOldLogs();\n\n // 设置定期清理\n cleanupTimer = setInterval(() => {\n cleanupOldLogs();\n }, LOG_CONFIG.CLEANUP_INTERVAL);\n}\n\n/**\n * 停止定期清理任务\n */\nexport function stopLogCleanupTask(): void {\n if (cleanupTimer) {\n clearInterval(cleanupTimer);\n cleanupTimer = null;\n console.log('[日志管理] 停止定期清理任务');\n }\n}\n\n// 进程退出时停止清理任务\nprocess.on('SIGINT', () => {\n stopLogCleanupTask();\n});\n\nprocess.on('SIGTERM', () => {\n stopLogCleanupTask();\n});\n\n","import { NextRequest, NextResponse } from 'next/server';\nimport { readLastNLines, deleteProcessLogs, getProcessLogPath } from '@/lib/log-manager';\nimport fs from 'fs/promises';\n\nexport async function GET(request: NextRequest) {\n try {\n const { searchParams } = new URL(request.url);\n const projectName = searchParams.get('projectName');\n const envName = searchParams.get('envName');\n const tail = searchParams.get('tail') || '100'; // 默认返回最后100行\n\n if (!projectName || !envName) {\n return NextResponse.json({\n success: false,\n error: '缺少必要参数'\n }, { status: 400 });\n }\n\n const processKey = `${projectName}-${envName}`;\n const tailCount = parseInt(tail);\n \n try {\n // 使用日志管理器读取最后N行\n const tailedLines = await readLastNLines(processKey, tailCount);\n \n // 获取总行数(只在需要时读取)\n let totalLines = tailedLines.length;\n try {\n const logPath = getProcessLogPath(processKey);\n const logContent = await fs.readFile(logPath, 'utf-8');\n totalLines = logContent.split('\\n').filter(line => line.trim()).length;\n } catch {\n // 忽略错误\n }\n \n return NextResponse.json({\n success: true,\n data: {\n logs: tailedLines,\n totalLines,\n tailCount: tailedLines.length\n }\n });\n } catch {\n // 日志文件不存在\n return NextResponse.json({\n success: true,\n data: {\n logs: [],\n totalLines: 0,\n tailCount: 0\n }\n });\n }\n } catch (error) {\n console.error('获取进程日志失败:', error);\n return NextResponse.json({\n success: false,\n error: error instanceof Error ? error.message : '获取进程日志失败'\n }, { status: 500 });\n }\n}\n\n// 清除日志\nexport async function DELETE(request: NextRequest) {\n try {\n const { searchParams } = new URL(request.url);\n const projectName = searchParams.get('projectName');\n const envName = searchParams.get('envName');\n\n if (!projectName || !envName) {\n return NextResponse.json({\n success: false,\n error: '缺少必要参数'\n }, { status: 400 });\n }\n\n const processKey = `${projectName}-${envName}`;\n \n // 使用日志管理器删除所有相关日志文件\n await deleteProcessLogs(processKey);\n \n return NextResponse.json({\n success: true,\n message: '日志已清除'\n });\n } catch (error) {\n console.error('清除进程日志失败:', error);\n return NextResponse.json({\n success: false,\n error: error instanceof Error ? error.message : '清除进程日志失败'\n }, { status: 500 });\n }\n}","import {\n AppRouteRouteModule,\n type AppRouteRouteModuleOptions,\n} from '../../server/route-modules/app-route/module.compiled'\nimport { RouteKind } from '../../server/route-kind'\nimport { patchFetch as _patchFetch } from '../../server/lib/patch-fetch'\n\nimport * as userland from 'VAR_USERLAND'\n\n// These are injected by the loader afterwards. This is injected as a variable\n// instead of a replacement because this could also be `undefined` instead of\n// an empty string.\ndeclare const nextConfigOutput: AppRouteRouteModuleOptions['nextConfigOutput']\n\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\n// INJECT:nextConfigOutput\n\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: 'VAR_DEFINITION_PAGE',\n pathname: 'VAR_DEFINITION_PATHNAME',\n filename: 'VAR_DEFINITION_FILENAME',\n bundlePath: 'VAR_DEFINITION_BUNDLE_PATH',\n },\n resolvedPagePath: 'VAR_RESOLVED_PAGE_PATH',\n nextConfigOutput,\n userland,\n})\n\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule\n\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage,\n })\n}\n\nexport {\n routeModule,\n workAsyncStorage,\n workUnitAsyncStorage,\n serverHooks,\n patchFetch,\n}\n"],"names":["AppRouteRouteModule","RouteKind","patchFetch","_patchFetch","userland","routeModule","definition","kind","APP_ROUTE","page","pathname","filename","bundlePath","resolvedPagePath","nextConfigOutput","workAsyncStorage","workUnitAsyncStorage","serverHooks"],"mappings":"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","ignoreList":[2]}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports={83886:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("fs",()=>require("fs"))},45935:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},29549:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},83943:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},86103:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},30331:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("path",()=>require("path"))},23430:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},13442:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("os",()=>require("os"))},52670:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/compiled/next-server/app-route-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-route-turbo.runtime.prod.js"))},
|
|
1
|
+
module.exports={83886:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("fs",()=>require("fs"))},45935:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},88941:e=>{"use strict";var{g:r,__dirname:t}=e;{e.s({PROJECT_CONFIG_PATH:()=>t,ProjectStatus:()=>o,WORKSPACE_CONFIG:()=>r});var s=e.i(13442),n=e.i(30331);let r={WORKSPACE_ROOT:(0,n.join)((0,s.homedir)(),"Documents","prime-workspace"),GIT_TIMEOUT:3e5,MAX_CONCURRENT_CLONES:Math.max(2,Math.min((0,s.cpus)().length,8)),MAX_RETRY_ATTEMPTS:3},t=(0,n.join)((0,s.homedir)(),".prime-projects.json");var o=function(e){return e.PENDING="pending",e.EXISTING="existing",e.CLONING="cloning",e.SUCCESS="success",e.FAILED="failed",e.RETRYING="retrying",e.INCOMPLETE="incomplete",e}({})}},29549:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},83943:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},86103:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},30331:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("path",()=>require("path"))},23430:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},13442:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("os",()=>require("os"))},52670:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/compiled/next-server/app-route-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-route-turbo.runtime.prod.js"))},9892:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("fs/promises",()=>require("fs/promises"))},35692:e=>{"use strict";var{g:r,__dirname:t}=e;e.s({ProjectStatus:()=>a,getProjectsConfig:()=>o,saveProjectsConfig:()=>i});var s=e.i(9892),n=e.i(88941);async function o(){try{await (0,s.access)(n.PROJECT_CONFIG_PATH,s.constants.F_OK)}catch{return await i({}),{}}try{let e=await (0,s.readFile)(n.PROJECT_CONFIG_PATH,"utf-8");if(!e)return{};return JSON.parse(e)}catch(e){throw console.error("读取或解析项目配置文件失败:",e),Error("无法加载项目配置")}}async function i(e){let r=n.PROJECT_CONFIG_PATH+".tmp";try{await (0,s.writeFile)(r,JSON.stringify(e,null,2),"utf-8"),await (0,s.rename)(r,n.PROJECT_CONFIG_PATH)}catch(e){throw console.error("保存项目配置文件失败:",e),Error("无法保存项目配置")}}var a=function(e){return e.PENDING="pending",e.EXISTING="existing",e.CLONING="cloning",e.SUCCESS="success",e.FAILED="failed",e.RETRYING="retrying",e}({})},15564:function(e){var{g:r,__dirname:t,m:s,e:n}=e},35139:e=>{"use strict";var{g:r,__dirname:t}=e;e.s({DELETE:()=>c});var s=e.i(15494),n=e.i(83886),o=e.i(30331),i=e.i(35692),a=e.i(88941);async function c(e){try{let{searchParams:r}=new URL(e.url),t=r.get("project"),c=r.get("apiName");if(!t||!c)return s.NextResponse.json({success:!1,error:"缺少必要参数:project, apiName"},{status:400});if(!(await (0,i.getProjectsConfig)())[t])return s.NextResponse.json({success:!1,error:`项目 ${t} 不存在`},{status:404});let p=(0,o.join)(a.WORKSPACE_CONFIG.WORKSPACE_ROOT,t),u=(0,o.join)(p,".mock",c);try{await n.promises.access(u)}catch{return s.NextResponse.json({success:!1,error:"Mock接口目录不存在"},{status:404})}await n.promises.rmdir(u,{recursive:!0});let d=(0,o.join)(p,".mock");try{let e=await n.promises.readdir(d);0===e.length&&await n.promises.rmdir(d)}catch{}return s.NextResponse.json({success:!0,message:"Mock接口删除成功",data:{projectName:t,apiName:c,deletedPath:(0,o.join)(".mock",c)}})}catch(r){let e=r instanceof Error?r.message:"删除Mock接口失败";return console.error("删除Mock接口失败:",r),s.NextResponse.json({success:!1,error:e},{status:500})}}},19444:e=>{"use strict";var{g:r,__dirname:t}=e;{e.s({patchFetch:()=>a,routeModule:()=>r,serverHooks:()=>p,workAsyncStorage:()=>t,workUnitAsyncStorage:()=>c});var s=e.i(45746),n=e.i(93828),o=e.i(18250),i=e.i(35139);let r=new s.AppRouteRouteModule({definition:{kind:n.RouteKind.APP_ROUTE,page:"/api/delete-mock-api/route",pathname:"/api/delete-mock-api",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/delete-mock-api/route.ts",nextConfigOutput:"",userland:i}),{workAsyncStorage:t,workUnitAsyncStorage:c,serverHooks:p}=r;function a(){return(0,o.patchFetch)({workAsyncStorage:t,workUnitAsyncStorage:c})}}}};
|
|
2
2
|
|
|
3
|
-
//# sourceMappingURL=%5Broot-of-the-server%
|
|
3
|
+
//# sourceMappingURL=%5Broot-of-the-server%5D__f815ea40._.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["turbopack:///[project]/packages/server/src/lib/workspace-types.ts","turbopack:///[project]/packages/server/src/lib/workspace-config.ts","turbopack:///[project]/packages/server/src/app/api/delete-mock-api/route.ts","turbopack:///[project]/node_modules/.pnpm/next@15.3.4_react-dom@19.1.0_react@19.1.0__react@19.1.0/node_modules/next/dist/src/build/templates/app-route.ts"],"sourcesContent":["import { homedir, cpus } from 'os';\nimport { join } from 'path';\n\n/**\n * 工作空间配置常量\n */\nexport const WORKSPACE_CONFIG = {\n // 工作空间根目录路径\n WORKSPACE_ROOT: join(homedir(), 'Documents', 'prime-workspace'),\n\n // Git 操作超时时间 (毫秒)\n GIT_TIMEOUT: 300000, // 5分钟\n\n // 最大并发克隆数量(基于CPU核心数,最小2个,最大8个)\n MAX_CONCURRENT_CLONES: Math.max(2, Math.min(cpus().length, 8)),\n\n // 重试次数限制\n MAX_RETRY_ATTEMPTS: 3,\n} as const;\n\nexport const PROJECT_CONFIG_PATH = join(homedir(), '.prime-projects.json');\n\nexport interface ProjectConfig {\n repo: string;\n mockingIntercept?: boolean;\n mockOpen?: boolean;\n envs: {\n [envName: string]: {\n host: string;\n currentProxy: string;\n proxyEnv: {\n [key: string]: string;\n };\n envFileName: string;\n proxyKey: string;\n subApps?: string[];\n };\n };\n}\n\nexport interface ProjectsConfig {\n [projectName: string]: ProjectConfig;\n}\n\n/**\n * 项目状态枚举\n */\nexport enum ProjectStatus {\n PENDING = 'pending',\n EXISTING = 'existing',\n CLONING = 'cloning',\n SUCCESS = 'success',\n FAILED = 'failed',\n RETRYING = 'retrying',\n INCOMPLETE = 'incomplete', // 不完整的项目,需要清理\n}\n\n/**\n * 项目进度信息接口\n */\nexport interface ProjectProgress {\n projectName: string;\n status: ProjectStatus;\n progress: number; // 0-100\n message: string;\n error?: string;\n startTime?: number;\n endTime?: number;\n}\n\n/**\n * 初始化结果接口\n */\nexport interface InitializationResult {\n success: boolean;\n totalProjects: number;\n successCount: number;\n failedCount: number;\n failedProjects: string[];\n workspacePath: string;\n duration: number;\n}\n\n/**\n * Git 操作配置接口\n */\nexport interface GitOperationConfig {\n repoUrl: string;\n targetDir: string;\n timeout: number;\n onProgress?: (progress: number, message: string) => void;\n onError?: (error: string) => void;\n onLog?: (projectName: string, logType: 'stdout' | 'stderr' | 'progress', content: string) => void;\n} ","import { readFile, writeFile, access, constants, rename } from 'fs/promises';\nimport type { ProjectsConfig } from './workspace-types';\nimport { PROJECT_CONFIG_PATH } from './workspace-types';\n\n/**\n * 读取并解析项目配置文件\n * @returns {Promise<ProjectsConfig>} 项目配置对象\n */\nexport async function getProjectsConfig(): Promise<ProjectsConfig> {\n try {\n await access(PROJECT_CONFIG_PATH, constants.F_OK);\n } catch {\n // 文件不存在,创建并写入空对象\n await saveProjectsConfig({});\n return {};\n }\n\n try {\n const configContent = await readFile(PROJECT_CONFIG_PATH, 'utf-8');\n // 如果文件为空,返回空对象\n if (!configContent) {\n return {};\n }\n return JSON.parse(configContent);\n } catch (error) {\n console.error('读取或解析项目配置文件失败:', error);\n // 在出错时返回空对象或抛出错误,这里选择抛出以通知调用者\n throw new Error('无法加载项目配置');\n }\n}\n\n/**\n * 将项目配置写入文件(原子操作)\n * @param {ProjectsConfig} config - 要保存的配置对象\n */\nexport async function saveProjectsConfig(config: ProjectsConfig): Promise<void> {\n const tempConfigPath = PROJECT_CONFIG_PATH + '.tmp';\n try {\n await writeFile(tempConfigPath, JSON.stringify(config, null, 2), 'utf-8');\n await rename(tempConfigPath, PROJECT_CONFIG_PATH);\n } catch (error) {\n console.error('保存项目配置文件失败:', error);\n throw new Error('无法保存项目配置');\n }\n}\n\n/**\n * 项目状态枚举\n */\nexport enum ProjectStatus {\n PENDING = 'pending',\n EXISTING = 'existing',\n CLONING = 'cloning',\n SUCCESS = 'success',\n FAILED = 'failed',\n RETRYING = 'retrying',\n}\n\n/**\n * 项目进度信息接口\n */\nexport interface ProjectProgress {\n projectName: string;\n status: ProjectStatus;\n progress: number; // 0-100\n message: string;\n error?: string;\n startTime?: number;\n endTime?: number;\n}\n\n/**\n * 初始化结果接口\n */\nexport interface InitializationResult {\n success: boolean;\n totalProjects: number;\n successCount: number;\n failedCount: number;\n failedProjects: string[];\n workspacePath: string;\n duration: number;\n}\n\n/**\n * Git 操作配置接口\n */\nexport interface GitOperationConfig {\n repoUrl: string;\n targetDir: string;\n timeout: number;\n onProgress?: (progress: number, message: string) => void;\n onError?: (error: string) => void;\n}","import { NextRequest, NextResponse } from 'next/server';\nimport { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { getProjectsConfig } from '@/lib/workspace-config';\nimport { WORKSPACE_CONFIG } from '@/lib/workspace-types';\n\nexport async function DELETE(request: NextRequest) {\n try {\n const { searchParams } = new URL(request.url);\n const projectName = searchParams.get('project');\n const apiName = searchParams.get('apiName');\n\n if (!projectName || !apiName) {\n return NextResponse.json(\n { success: false, error: '缺少必要参数:project, apiName' },\n { status: 400 },\n );\n }\n\n // 验证项目是否存在\n const projectsConfig = await getProjectsConfig();\n if (!projectsConfig[projectName]) {\n return NextResponse.json(\n { success: false, error: `项目 ${projectName} 不存在` },\n { status: 404 },\n );\n }\n\n // 构建API目录路径\n const projectPath = join(WORKSPACE_CONFIG.WORKSPACE_ROOT, projectName);\n const apiPath = join(projectPath, '.mock', apiName);\n\n // 检查API目录是否存在\n try {\n await fs.access(apiPath);\n } catch {\n return NextResponse.json(\n { success: false, error: 'Mock接口目录不存在' },\n { status: 404 },\n );\n }\n\n // 递归删除整个API目录\n await fs.rmdir(apiPath, { recursive: true });\n\n // 检查.mock目录是否为空,如果为空则删除.mock目录\n const mockPath = join(projectPath, '.mock');\n try {\n const mockFiles = await fs.readdir(mockPath);\n if (mockFiles.length === 0) {\n await fs.rmdir(mockPath);\n }\n } catch {\n // 忽略目录删除错误\n }\n\n return NextResponse.json({\n success: true,\n message: 'Mock接口删除成功',\n data: {\n projectName,\n apiName,\n deletedPath: join('.mock', apiName),\n },\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : '删除Mock接口失败';\n console.error('删除Mock接口失败:', error);\n return NextResponse.json(\n { success: false, error: errorMessage },\n { status: 500 },\n );\n }\n}\n","import {\n AppRouteRouteModule,\n type AppRouteRouteModuleOptions,\n} from '../../server/route-modules/app-route/module.compiled'\nimport { RouteKind } from '../../server/route-kind'\nimport { patchFetch as _patchFetch } from '../../server/lib/patch-fetch'\n\nimport * as userland from 'VAR_USERLAND'\n\n// These are injected by the loader afterwards. This is injected as a variable\n// instead of a replacement because this could also be `undefined` instead of\n// an empty string.\ndeclare const nextConfigOutput: AppRouteRouteModuleOptions['nextConfigOutput']\n\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\n// INJECT:nextConfigOutput\n\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: 'VAR_DEFINITION_PAGE',\n pathname: 'VAR_DEFINITION_PATHNAME',\n filename: 'VAR_DEFINITION_FILENAME',\n bundlePath: 'VAR_DEFINITION_BUNDLE_PATH',\n },\n resolvedPagePath: 'VAR_RESOLVED_PAGE_PATH',\n nextConfigOutput,\n userland,\n})\n\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule\n\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage,\n })\n}\n\nexport {\n routeModule,\n workAsyncStorage,\n workUnitAsyncStorage,\n serverHooks,\n patchFetch,\n}\n"],"names":["AppRouteRouteModule","RouteKind","patchFetch","_patchFetch","userland","routeModule","definition","kind","APP_ROUTE","page","pathname","filename","bundlePath","resolvedPagePath","nextConfigOutput","workAsyncStorage","workUnitAsyncStorage","serverHooks"],"mappings":"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","ignoreList":[3]}
|
|
1
|
+
{"version":3,"sources":["turbopack:///[project]/packages/server/src/lib/workspace-types.ts","turbopack:///[project]/packages/server/src/lib/workspace-config.ts","turbopack:///[project]/packages/server/src/app/api/delete-mock-api/route.ts","turbopack:///[project]/node_modules/.pnpm/next@15.3.4_react-dom@19.1.0_react@19.1.0__react@19.1.0/node_modules/next/dist/src/build/templates/app-route.ts"],"sourcesContent":["import { homedir, cpus } from 'os';\nimport { join } from 'path';\n\n/**\n * 工作空间配置常量\n */\nexport const WORKSPACE_CONFIG = {\n // 工作空间根目录路径\n WORKSPACE_ROOT: join(homedir(), 'Documents', 'prime-workspace'),\n\n // Git 操作超时时间 (毫秒)\n GIT_TIMEOUT: 300000, // 5分钟\n\n // 最大并发克隆数量(基于CPU核心数,最小2个,最大8个)\n MAX_CONCURRENT_CLONES: Math.max(2, Math.min(cpus().length, 8)),\n\n // 重试次数限制\n MAX_RETRY_ATTEMPTS: 3,\n} as const;\n\nexport const PROJECT_CONFIG_PATH = join(homedir(), '.prime-projects.json');\n\nexport interface ProjectConfig {\n repo: string;\n mockingIntercept?: boolean;\n mockOpen?: boolean;\n envs: {\n [envName: string]: {\n host: string;\n currentProxy: string;\n proxyEnv: {\n [key: string]: string;\n };\n envFileName: string;\n proxyKey: string;\n subApps?: string[];\n };\n };\n}\n\nexport interface ProjectsConfig {\n [projectName: string]: ProjectConfig;\n}\n\n/**\n * 项目状态枚举\n */\nexport enum ProjectStatus {\n PENDING = 'pending',\n EXISTING = 'existing',\n CLONING = 'cloning',\n SUCCESS = 'success',\n FAILED = 'failed',\n RETRYING = 'retrying',\n INCOMPLETE = 'incomplete', // 不完整的项目,需要清理\n}\n\n/**\n * 项目进度信息接口\n */\nexport interface ProjectProgress {\n projectName: string;\n status: ProjectStatus;\n progress: number; // 0-100\n message: string;\n error?: string;\n startTime?: number;\n endTime?: number;\n}\n\n/**\n * 初始化结果接口\n */\nexport interface InitializationResult {\n success: boolean;\n totalProjects: number;\n successCount: number;\n failedCount: number;\n failedProjects: string[];\n workspacePath: string;\n duration: number;\n}\n\n/**\n * Git 操作配置接口\n */\nexport interface GitOperationConfig {\n repoUrl: string;\n targetDir: string;\n timeout: number;\n onProgress?: (progress: number, message: string) => void;\n onError?: (error: string) => void;\n onLog?: (projectName: string, logType: 'stdout' | 'stderr' | 'progress', content: string) => void;\n} ","import { readFile, writeFile, access, constants, rename } from 'fs/promises';\nimport type { ProjectsConfig } from './workspace-types';\nimport { PROJECT_CONFIG_PATH } from './workspace-types';\n\n/**\n * 读取并解析项目配置文件\n * @returns {Promise<ProjectsConfig>} 项目配置对象\n */\nexport async function getProjectsConfig(): Promise<ProjectsConfig> {\n try {\n await access(PROJECT_CONFIG_PATH, constants.F_OK);\n } catch {\n // 文件不存在,创建并写入空对象\n await saveProjectsConfig({});\n return {};\n }\n\n try {\n const configContent = await readFile(PROJECT_CONFIG_PATH, 'utf-8');\n // 如果文件为空,返回空对象\n if (!configContent) {\n return {};\n }\n return JSON.parse(configContent);\n } catch (error) {\n console.error('读取或解析项目配置文件失败:', error);\n // 在出错时返回空对象或抛出错误,这里选择抛出以通知调用者\n throw new Error('无法加载项目配置');\n }\n}\n\n/**\n * 将项目配置写入文件(原子操作)\n * @param {ProjectsConfig} config - 要保存的配置对象\n */\nexport async function saveProjectsConfig(config: ProjectsConfig): Promise<void> {\n const tempConfigPath = PROJECT_CONFIG_PATH + '.tmp';\n try {\n await writeFile(tempConfigPath, JSON.stringify(config, null, 2), 'utf-8');\n await rename(tempConfigPath, PROJECT_CONFIG_PATH);\n } catch (error) {\n console.error('保存项目配置文件失败:', error);\n throw new Error('无法保存项目配置');\n }\n}\n\n/**\n * 项目状态枚举\n */\nexport enum ProjectStatus {\n PENDING = 'pending',\n EXISTING = 'existing',\n CLONING = 'cloning',\n SUCCESS = 'success',\n FAILED = 'failed',\n RETRYING = 'retrying',\n}\n\n/**\n * 项目进度信息接口\n */\nexport interface ProjectProgress {\n projectName: string;\n status: ProjectStatus;\n progress: number; // 0-100\n message: string;\n error?: string;\n startTime?: number;\n endTime?: number;\n}\n\n/**\n * 初始化结果接口\n */\nexport interface InitializationResult {\n success: boolean;\n totalProjects: number;\n successCount: number;\n failedCount: number;\n failedProjects: string[];\n workspacePath: string;\n duration: number;\n}\n\n/**\n * Git 操作配置接口\n */\nexport interface GitOperationConfig {\n repoUrl: string;\n targetDir: string;\n timeout: number;\n onProgress?: (progress: number, message: string) => void;\n onError?: (error: string) => void;\n}","import { NextRequest, NextResponse } from 'next/server';\nimport { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { getProjectsConfig } from '@/lib/workspace-config';\nimport { WORKSPACE_CONFIG } from '@/lib/workspace-types';\n\nexport async function DELETE(request: NextRequest) {\n try {\n const { searchParams } = new URL(request.url);\n const projectName = searchParams.get('project');\n const apiName = searchParams.get('apiName');\n\n if (!projectName || !apiName) {\n return NextResponse.json(\n { success: false, error: '缺少必要参数:project, apiName' },\n { status: 400 },\n );\n }\n\n // 验证项目是否存在\n const projectsConfig = await getProjectsConfig();\n if (!projectsConfig[projectName]) {\n return NextResponse.json(\n { success: false, error: `项目 ${projectName} 不存在` },\n { status: 404 },\n );\n }\n\n // 构建API目录路径\n const projectPath = join(WORKSPACE_CONFIG.WORKSPACE_ROOT, projectName);\n const apiPath = join(projectPath, '.mock', apiName);\n\n // 检查API目录是否存在\n try {\n await fs.access(apiPath);\n } catch {\n return NextResponse.json(\n { success: false, error: 'Mock接口目录不存在' },\n { status: 404 },\n );\n }\n\n // 递归删除整个API目录\n await fs.rmdir(apiPath, { recursive: true });\n\n // 检查.mock目录是否为空,如果为空则删除.mock目录\n const mockPath = join(projectPath, '.mock');\n try {\n const mockFiles = await fs.readdir(mockPath);\n if (mockFiles.length === 0) {\n await fs.rmdir(mockPath);\n }\n } catch {\n // 忽略目录删除错误\n }\n\n return NextResponse.json({\n success: true,\n message: 'Mock接口删除成功',\n data: {\n projectName,\n apiName,\n deletedPath: join('.mock', apiName),\n },\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : '删除Mock接口失败';\n console.error('删除Mock接口失败:', error);\n return NextResponse.json(\n { success: false, error: errorMessage },\n { status: 500 },\n );\n }\n}\n","import {\n AppRouteRouteModule,\n type AppRouteRouteModuleOptions,\n} from '../../server/route-modules/app-route/module.compiled'\nimport { RouteKind } from '../../server/route-kind'\nimport { patchFetch as _patchFetch } from '../../server/lib/patch-fetch'\n\nimport * as userland from 'VAR_USERLAND'\n\n// These are injected by the loader afterwards. This is injected as a variable\n// instead of a replacement because this could also be `undefined` instead of\n// an empty string.\ndeclare const nextConfigOutput: AppRouteRouteModuleOptions['nextConfigOutput']\n\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\n// INJECT:nextConfigOutput\n\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: 'VAR_DEFINITION_PAGE',\n pathname: 'VAR_DEFINITION_PATHNAME',\n filename: 'VAR_DEFINITION_FILENAME',\n bundlePath: 'VAR_DEFINITION_BUNDLE_PATH',\n },\n resolvedPagePath: 'VAR_RESOLVED_PAGE_PATH',\n nextConfigOutput,\n userland,\n})\n\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule\n\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage,\n })\n}\n\nexport {\n routeModule,\n workAsyncStorage,\n workUnitAsyncStorage,\n serverHooks,\n patchFetch,\n}\n"],"names":["AppRouteRouteModule","RouteKind","patchFetch","_patchFetch","userland","routeModule","definition","kind","APP_ROUTE","page","pathname","filename","bundlePath","resolvedPagePath","nextConfigOutput","workAsyncStorage","workUnitAsyncStorage","serverHooks"],"mappings":"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","ignoreList":[3]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
module.exports={13442:function(a){var{g:b,__dirname:c,m:d,e:e}=a;d.exports=a.x("os",()=>require("os"))},9892:function(a){var{g:b,__dirname:c,m:d,e:e}=a;d.exports=a.x("fs/promises",()=>require("fs/promises"))},87485:function(a){var{g:b,__dirname:c,m:d,e:e}=a;d.exports=a.x("child_process",()=>require("child_process"))},4713:function(a){var{g:b,__dirname:c,m:d,e:e}=a;d.exports=a.x("util",()=>require("util"))}};
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=%5Broot-of-the-server%5D__828c7089._.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
module.exports={73428:a=>{"use strict";var{g:b,__dirname:c}=a;{a.s({memoryMonitor:()=>f});var d=a.i(87485);let c=(0,a.i(4713).promisify)(d.exec),e={warningMB:512,criticalMB:1024,heapUsagePercent:90},f=new class{monitorTimer=null;thresholds;cleanupCallbacks=[];lastWarningTime=0;warningCooldown=3e5;constructor(a={}){this.thresholds={...e,...a}}registerCleanupCallback(a){this.cleanupCallbacks.push(a)}async getSystemMemory(){try{{let{stdout:a}=await c(`ps -o rss= -g ${process.pid}`),b=a.trim().split("\n").reduce((a,b)=>{let c=parseInt(b.trim());return a+(isNaN(c)?0:c)},0);return 1024*b}}catch{}return 0}getMemoryUsage(){let a=process.memoryUsage();return{rss:a.rss,heapTotal:a.heapTotal,heapUsed:a.heapUsed,external:a.external,arrayBuffers:a.arrayBuffers}}async getFullMemoryUsage(){let a=this.getMemoryUsage(),b=await this.getSystemMemory();return{...a,systemTotal:b>0?b:void 0}}formatBytes(a){return`${(a/1024/1024).toFixed(2)} MB`}async checkMemory(){let a=await this.getFullMemoryUsage(),b=a.rss/1024/1024,c=a.heapUsed/a.heapTotal*100,d=a.systemTotal?a.systemTotal/1024/1024:null,e={rss:this.formatBytes(a.rss),heapUsed:this.formatBytes(a.heapUsed),heapTotal:this.formatBytes(a.heapTotal),heapUsagePercent:`${c.toFixed(2)}%`};a.systemTotal&&(e.systemTotal=this.formatBytes(a.systemTotal)),console.log("[内存监控] 当前使用:",e);let f=d||b;if(f>=this.thresholds.criticalMB){console.error(`[内存监控] ⚠️ 内存使用达到临界值: ${f.toFixed(2)}MB`),await this.triggerCleanup("critical");return}if(f>=this.thresholds.warningMB||c>=this.thresholds.heapUsagePercent){let a=Date.now();a-this.lastWarningTime>this.warningCooldown&&(console.warn(`[内存监控] ⚠️ 内存使用较高: ${f.toFixed(2)}MB (堆使用率: ${c.toFixed(2)}%)`),this.lastWarningTime=a,await this.triggerCleanup("warning"))}}async triggerCleanup(a){console.log(`[内存监控] 开始 ${"critical"===a?"紧急":"常规"} 清理...`);let c=this.getMemoryUsage();for(let a of this.cleanupCallbacks)try{await a()}catch(a){console.error("[内存监控] 清理回调执行失败:",a)}b.gc?(b.gc(),console.log("[内存监控] 已触发垃圾回收")):"critical"===a&&console.warn("[内存监控] 垃圾回收不可用。启动 Node.js 时使用 --expose-gc 标志以启用手动垃圾回收");let d=this.getMemoryUsage(),e=(c.rss-d.rss)/1024/1024;console.log(`[内存监控] 清理完成,释放内存: ${e.toFixed(2)}MB`)}start(){if(this.monitorTimer)return void console.warn("[内存监控] 监控器已经在运行");console.log("[内存监控] 启动内存监控",{interval:`60秒`,thresholds:{warning:`${this.thresholds.warningMB}MB`,critical:`${this.thresholds.criticalMB}MB`,heapUsage:`${this.thresholds.heapUsagePercent}%`}}),this.checkMemory(),this.monitorTimer=setInterval(()=>{this.checkMemory()},6e4)}stop(){this.monitorTimer&&(clearInterval(this.monitorTimer),this.monitorTimer=null,console.log("[内存监控] 监控器已停止"))}async check(){return await this.checkMemory(),await this.getFullMemoryUsage()}};process.on("SIGINT",()=>{f.stop()}),process.on("SIGTERM",()=>{f.stop()})}},76700:a=>{"use strict";var{g:b,__dirname:c}=a;{a.s({appendLog:()=>l,cleanupOldLogs:()=>o,deleteProcessLogs:()=>p,getLogsDirSize:()=>q,getProcessLogPath:()=>h,readLastNLines:()=>n,rotateLogFile:()=>k,startLogCleanupTask:()=>r,stopLogCleanupTask:()=>s,truncateLogLine:()=>i,writeLogsSync:()=>m});var d=a.i(9892),e=a.i(30331),f=a.i(13442);let b={MAX_FILE_SIZE:5242880,MAX_LOG_FILES:3,MAX_LOG_AGE_DAYS:7,MAX_LINE_LENGTH:1e3,CLEANUP_INTERVAL:18e5};function g(){return e.default.join(f.default.homedir(),".prime-process-logs")}function h(a){return e.default.join(g(),`${a}.log`)}function i(a){return a.length<=b.MAX_LINE_LENGTH?a:a.substring(0,b.MAX_LINE_LENGTH)+"... [truncated]"}async function j(a){try{return(await d.default.stat(a)).size}catch{return 0}}async function k(a){let c=h(a),e=await j(c);if(!(e<b.MAX_FILE_SIZE)){console.log(`[日志管理] 轮转日志文件: ${a}, 大小: ${(e/1024/1024).toFixed(2)}MB`);try{let e=`${c}.${b.MAX_LOG_FILES}`;try{await d.default.unlink(e)}catch{}for(let a=b.MAX_LOG_FILES-1;a>=1;a--){let b=1===a?c:`${c}.${a}`,e=`${c}.${a+1}`;try{await d.default.rename(b,e)}catch{}}await d.default.rename(c,`${c}.1`),await d.default.writeFile(c,"","utf-8"),console.log(`[日志管理] 日志轮转完成: ${a}`)}catch(b){console.error(`[日志管理] 轮转日志文件失败: ${a}`,b)}}}async function l(a,b){await k(a);let c=h(a),e=i(b);try{await d.default.mkdir(g(),{recursive:!0}),await d.default.appendFile(c,e+"\n","utf-8")}catch(b){console.error(`[日志管理] 追加日志失败: ${a}`,b)}}async function m(a,b){await k(a);let c=h(a),e=b.map(a=>i(a));try{await d.default.mkdir(g(),{recursive:!0}),await d.default.writeFile(c,e.join("\n")+"\n","utf-8")}catch(b){console.error(`[日志管理] 写入日志失败: ${a}`,b)}}async function n(a,b=100){let c=h(a);try{return(await d.default.readFile(c,"utf-8")).split("\n").filter(a=>a.trim()).slice(-b)}catch{return[]}}async function o(){console.log("[日志管理] 开始清理旧日志...");try{let a=g();try{await d.default.access(a)}catch{console.log("[日志管理] 日志目录不存在,无需清理");return}let c=await d.default.readdir(a),f=Date.now(),h=24*b.MAX_LOG_AGE_DAYS*36e5,i=0,j=0;for(let b of c){let c=e.default.join(a,b);try{let a=await d.default.stat(c);if(f-a.mtime.getTime()>h){j+=a.size;try{await d.default.unlink(c),i++,console.log(`[日志管理] 删除过期日志: ${b}`)}catch(a){a?.code!=="ENOENT"&&console.error(`[日志管理] 删除文件失败: ${b}`,a)}}}catch(a){a?.code!=="ENOENT"&&console.error(`[日志管理] 处理文件失败: ${b}`,a)}}console.log(`[日志管理] 清理完成: 删除 ${i} 个文件, 释放 ${(j/1024/1024).toFixed(2)}MB`)}catch(a){console.error("[日志管理] 清理日志失败:",a)}}async function p(a){let c=h(a);try{await d.default.unlink(c)}catch(b){b?.code!=="ENOENT"&&console.error(`[日志管理] 删除主日志文件失败: ${a}`,b)}for(let e=1;e<=b.MAX_LOG_FILES;e++)try{await d.default.unlink(`${c}.${e}`)}catch(b){b?.code!=="ENOENT"&&console.error(`[日志管理] 删除轮转日志文件失败: ${a}.${e}`,b)}console.log(`[日志管理] 删除进程日志: ${a}`)}async function q(){try{let a=g(),b=await d.default.readdir(a),c=0,f=0;for(let g of b)try{let b=await d.default.stat(e.default.join(a,g));c+=b.size,f++}catch{}return{totalSize:c,fileCount:f}}catch{return{totalSize:0,fileCount:0}}}let c=null;function r(){c||(console.log("[日志管理] 启动定期清理任务"),o(),c=setInterval(()=>{o()},b.CLEANUP_INTERVAL))}function s(){c&&(clearInterval(c),c=null,console.log("[日志管理] 停止定期清理任务"))}process.on("SIGINT",()=>{s()}),process.on("SIGTERM",()=>{s()})}},27006:a=>{"use strict";var{g:b,__dirname:c}=a;{a.s({sseConnectionManager:()=>c});class b{connections=new Map;encoder=new TextEncoder;heartbeatInterval=null;HEARTBEAT_INTERVAL=3e4;CONNECTION_TIMEOUT=12e4;MAX_CONNECTIONS_PER_ENV=10;constructor(){this.startHeartbeat()}clearAllConnections(){console.log("[SSE] 开始清理所有连接...");let a=Array.from(this.connections.values()).reduce((a,b)=>a+b.size,0);this.connections.forEach(a=>{a.forEach(a=>{try{a.controller.close()}catch{}})}),this.connections.clear(),console.log(`[SSE] 已清理 ${a} 个连接`)}addConnection(a,b,c){console.log(`[SSE] 添加连接: 环境=${a}, 客户端=${c}`),this.connections.has(a)||this.connections.set(a,new Set);let d=this.connections.get(a);if(d.size>=this.MAX_CONNECTIONS_PER_ENV){console.warn(`[SSE] 环境 ${a} 连接数已达上限,清理最旧的连接`);let b=Array.from(d).sort((a,b)=>a.timestamp-b.timestamp)[0];if(b){try{b.controller.close()}catch{}d.delete(b)}}let e={controller:b,timestamp:Date.now(),clientId:c,envName:a};d.add(e),this.sendToConnection(e,{type:"heartbeat",timestamp:Date.now()}),console.log(`[SSE] 当前连接统计: ${this.getConnectionStats()}`)}removeConnection(a,b){console.log(`[SSE] 移除连接: 环境=${a}, 客户端=${b}`);let c=this.connections.get(a);if(c){let d=Array.from(c).find(a=>a.clientId===b);d&&(c.delete(d),0===c.size&&this.connections.delete(a))}console.log(`[SSE] 当前连接统计: ${this.getConnectionStats()}`)}broadcastToEnv(a,b){console.log(`[SSE] 向环境 ${a} 广播配置变化消息`);let c=this.connections.get(a);if(!c||0===c.size)return void console.log(`[SSE] 环境 ${a} 没有活跃连接,跳过广播`);let d=[];c.forEach(a=>{try{this.sendToConnection(a,b)}catch(b){console.error(`[SSE] 发送消息到客户端 ${a.clientId} 失败:`,b),d.push(a)}}),d.forEach(a=>{c.delete(a),console.log(`[SSE] 清理无效连接: 客户端=${a.clientId}`)}),console.log(`[SSE] 成功发送给 ${c.size} 个连接`)}sendToConnection(a,b){let c=`data: ${JSON.stringify(b)}
|
|
2
|
+
|
|
3
|
+
`,d=this.encoder.encode(c);try{a.controller.enqueue(d),a.timestamp=Date.now()}catch(a){throw console.error(`[SSE] 发送消息失败:`,a),a}}startHeartbeat(){this.heartbeatInterval=setInterval(()=>{this.sendHeartbeat(),this.cleanupStaleConnections()},this.HEARTBEAT_INTERVAL),console.log(`[SSE] 心跳机制已启动,间隔: ${this.HEARTBEAT_INTERVAL}ms`)}sendHeartbeat(){let a={type:"heartbeat",timestamp:Date.now()},b=0;this.connections.forEach(c=>{b+=c.size;let d=[];c.forEach(b=>{try{this.sendToConnection(b,a)}catch{d.push(b)}}),d.forEach(a=>c.delete(a))}),b>0&&console.log(`[SSE] 心跳发送完成,活跃连接数: ${b}`)}cleanupStaleConnections(){let a=Date.now(),b=0;this.connections.forEach((c,d)=>{let e=[];c.forEach(b=>{a-b.timestamp>this.CONNECTION_TIMEOUT&&e.push(b)}),e.forEach(a=>{c.delete(a),b++,console.log(`[SSE] 清理过期连接: 环境=${d}, 客户端=${a.clientId}`)}),0===c.size&&this.connections.delete(d)}),b>0&&console.log(`[SSE] 连接清理完成,清理数量: ${b}`)}getConnectionStats(){let a=[],b=0;return this.connections.forEach((c,d)=>{let e=c.size;b+=e,a.push(`${d}: ${e}`)}),`总计 ${b} 个连接 (${a.join(", ")})`}stop(){this.heartbeatInterval&&(clearInterval(this.heartbeatInterval),this.heartbeatInterval=null,console.log(`[SSE] 心跳机制已停止`)),this.connections.forEach(a=>{a.forEach(a=>{try{a.controller.close()}catch(a){console.error(`[SSE] 关闭连接失败:`,a)}})}),this.connections.clear(),console.log(`[SSE] 所有连接已关闭`)}}let c=new b;process.on("SIGINT",()=>{console.log("[SSE] 收到退出信号,正在清理连接..."),c.stop(),process.exit(0)}),process.on("SIGTERM",()=>{console.log("[SSE] 收到终止信号,正在清理连接..."),c.stop(),process.exit(0)})}},84143:a=>{"use strict";var{g:b,__dirname:c}=a;{a.s({initializeServer:()=>g,shutdownServer:()=>h});var d=a.i(73428),e=a.i(76700),f=a.i(27006);let b=!1;function g(){if(b)return void console.log("[服务器] 已初始化,跳过");console.log("[服务器] 开始初始化监控和清理任务..."),(0,e.startLogCleanupTask)(),d.memoryMonitor.registerCleanupCallback(async()=>{console.log("[内存清理] 执行日志清理..."),await (0,e.cleanupOldLogs)()}),d.memoryMonitor.registerCleanupCallback(async()=>{console.log("[内存清理] 清理过期的 SSE 连接...")}),d.memoryMonitor.start(),b=!0,console.log("[服务器] 初始化完成 ✓"),console.log("[服务器] 监控功能:"),console.log(" - 内存监控: 每分钟检查一次"),console.log(" - 日志清理: 每30分钟清理一次过期日志"),console.log(" - SSE心跳: 每30秒检查连接状态")}function h(){console.log("[服务器] 开始关闭..."),d.memoryMonitor.stop(),f.sseConnectionManager.stop(),console.log("[服务器] 已关闭 ✓")}setTimeout(()=>{g()},1e3)}},30507:a=>{"use strict";var{g:b,__dirname:c}=a;{a.s({default:()=>e,metadata:()=>b});var d=a.i(93200);a.i(84143);let b={title:"Prime Dev CLI - 项目管理工具",description:"管理多个前端项目的开发环境和配置"};function e({children:a}){return(0,d.jsx)("html",{lang:"en",children:(0,d.jsx)("body",{children:a})})}}}};
|
|
4
|
+
|
|
5
|
+
//# sourceMappingURL=packages_server_src_eb289b89._.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["turbopack:///[project]/packages/server/src/lib/memory-monitor.ts","turbopack:///[project]/packages/server/src/lib/log-manager.ts","turbopack:///[project]/packages/server/src/lib/sse-connection-manager.ts","turbopack:///[project]/packages/server/src/lib/server-init.ts","turbopack:///[project]/packages/server/src/app/layout.tsx"],"sourcesContent":["/**\n * 内存监控器 - 监控服务内存使用并在必要时触发清理\n */\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\n\nconst execAsync = promisify(exec);\n\ninterface MemoryStats {\n rss: number; // 常驻集大小\n heapTotal: number; // 堆总大小\n heapUsed: number; // 已使用堆大小\n external: number; // C++ 对象大小\n arrayBuffers: number; // ArrayBuffer 大小\n systemTotal?: number; // 系统级总内存(包括子进程)\n}\n\ninterface MemoryThresholds {\n warningMB: number; // 警告阈值 (MB)\n criticalMB: number; // 临界阈值 (MB)\n heapUsagePercent: number; // 堆使用率阈值 (%)\n}\n\nconst DEFAULT_THRESHOLDS: MemoryThresholds = {\n warningMB: 512, // 512MB 时警告\n criticalMB: 1024, // 1GB 时紧急清理\n heapUsagePercent: 90, // 堆使用率 90% 时警告\n};\n\nconst MONITOR_INTERVAL = 60 * 1000; // 每分钟检查一次\n\nclass MemoryMonitor {\n private monitorTimer: NodeJS.Timeout | null = null;\n private thresholds: MemoryThresholds;\n private cleanupCallbacks: Array<() => Promise<void>> = [];\n private lastWarningTime = 0;\n private warningCooldown = 5 * 60 * 1000; // 5分钟警告冷却\n\n constructor(thresholds: Partial<MemoryThresholds> = {}) {\n this.thresholds = { ...DEFAULT_THRESHOLDS, ...thresholds };\n }\n\n /**\n * 注册清理回调函数\n * 当内存达到临界值时会调用这些函数\n */\n registerCleanupCallback(callback: () => Promise<void>): void {\n this.cleanupCallbacks.push(callback);\n }\n\n /**\n * 获取系统级总内存使用(包括子进程)\n */\n private async getSystemMemory(): Promise<number> {\n try {\n if (process.platform === 'darwin' || process.platform === 'linux') {\n // macOS/Linux: 使用 ps 命令获取进程组的总内存\n const { stdout } = await execAsync(`ps -o rss= -g ${process.pid}`);\n const lines = stdout.trim().split('\\n');\n const total = lines.reduce((sum, line) => {\n const rss = parseInt(line.trim());\n return sum + (isNaN(rss) ? 0 : rss);\n }, 0);\n return total * 1024; // ps 返回的是 KB,转换为字节\n } else if (process.platform === 'win32') {\n // Windows: 使用 wmic 命令\n const { stdout } = await execAsync(`wmic process where ProcessId=${process.pid} get WorkingSetSize`);\n const match = stdout.match(/\\d+/);\n return match ? parseInt(match[0]) : 0;\n }\n } catch {\n // 如果获取失败,返回 0\n }\n return 0;\n }\n\n /**\n * 获取当前内存使用情况\n */\n getMemoryUsage(): MemoryStats {\n const usage = process.memoryUsage();\n return {\n rss: usage.rss,\n heapTotal: usage.heapTotal,\n heapUsed: usage.heapUsed,\n external: usage.external,\n arrayBuffers: usage.arrayBuffers,\n };\n }\n \n /**\n * 获取完整的内存使用情况(包括系统级)\n */\n async getFullMemoryUsage(): Promise<MemoryStats> {\n const usage = this.getMemoryUsage();\n const systemTotal = await this.getSystemMemory();\n return {\n ...usage,\n systemTotal: systemTotal > 0 ? systemTotal : undefined,\n };\n }\n\n /**\n * 格式化内存大小\n */\n private formatBytes(bytes: number): string {\n const mb = bytes / 1024 / 1024;\n return `${mb.toFixed(2)} MB`;\n }\n\n /**\n * 检查内存使用情况\n */\n private async checkMemory(): Promise<void> {\n const stats = await this.getFullMemoryUsage();\n const rssMB = stats.rss / 1024 / 1024;\n const heapUsagePercent = (stats.heapUsed / stats.heapTotal) * 100;\n const systemTotalMB = stats.systemTotal ? stats.systemTotal / 1024 / 1024 : null;\n\n // 记录当前内存使用\n const memoryInfo: Record<string, string> = {\n rss: this.formatBytes(stats.rss),\n heapUsed: this.formatBytes(stats.heapUsed),\n heapTotal: this.formatBytes(stats.heapTotal),\n heapUsagePercent: `${heapUsagePercent.toFixed(2)}%`,\n };\n \n if (stats.systemTotal) {\n memoryInfo.systemTotal = this.formatBytes(stats.systemTotal);\n }\n \n console.log('[内存监控] 当前使用:', memoryInfo);\n\n // 使用系统总内存进行阈值检查(如果可用),否则使用 RSS\n const checkMemoryMB = systemTotalMB || rssMB;\n\n // 检查是否超过临界阈值\n if (checkMemoryMB >= this.thresholds.criticalMB) {\n console.error(`[内存监控] ⚠️ 内存使用达到临界值: ${checkMemoryMB.toFixed(2)}MB`);\n await this.triggerCleanup('critical');\n return;\n }\n\n // 检查是否超过警告阈值\n if (checkMemoryMB >= this.thresholds.warningMB || heapUsagePercent >= this.thresholds.heapUsagePercent) {\n const now = Date.now();\n if (now - this.lastWarningTime > this.warningCooldown) {\n console.warn(`[内存监控] ⚠️ 内存使用较高: ${checkMemoryMB.toFixed(2)}MB (堆使用率: ${heapUsagePercent.toFixed(2)}%)`);\n this.lastWarningTime = now;\n \n // 触发轻度清理\n await this.triggerCleanup('warning');\n }\n }\n }\n\n /**\n * 触发清理操作\n */\n private async triggerCleanup(level: 'warning' | 'critical'): Promise<void> {\n console.log(`[内存监控] 开始 ${level === 'critical' ? '紧急' : '常规'} 清理...`);\n\n const beforeStats = this.getMemoryUsage();\n\n // 执行所有注册的清理回调\n for (const callback of this.cleanupCallbacks) {\n try {\n await callback();\n } catch (error) {\n console.error('[内存监控] 清理回调执行失败:', error);\n }\n }\n\n // 强制垃圾回收(如果可用)\n if (global.gc) {\n global.gc();\n console.log('[内存监控] 已触发垃圾回收');\n } else if (level === 'critical') {\n console.warn('[内存监控] 垃圾回收不可用。启动 Node.js 时使用 --expose-gc 标志以启用手动垃圾回收');\n }\n\n const afterStats = this.getMemoryUsage();\n const freedMB = (beforeStats.rss - afterStats.rss) / 1024 / 1024;\n\n console.log(`[内存监控] 清理完成,释放内存: ${freedMB.toFixed(2)}MB`);\n }\n\n /**\n * 启动内存监控\n */\n start(): void {\n if (this.monitorTimer) {\n console.warn('[内存监控] 监控器已经在运行');\n return;\n }\n\n console.log('[内存监控] 启动内存监控', {\n interval: `${MONITOR_INTERVAL / 1000}秒`,\n thresholds: {\n warning: `${this.thresholds.warningMB}MB`,\n critical: `${this.thresholds.criticalMB}MB`,\n heapUsage: `${this.thresholds.heapUsagePercent}%`,\n },\n });\n\n // 立即检查一次\n this.checkMemory();\n\n // 定期检查\n this.monitorTimer = setInterval(() => {\n this.checkMemory();\n }, MONITOR_INTERVAL);\n }\n\n /**\n * 停止内存监控\n */\n stop(): void {\n if (this.monitorTimer) {\n clearInterval(this.monitorTimer);\n this.monitorTimer = null;\n console.log('[内存监控] 监控器已停止');\n }\n }\n\n /**\n * 手动触发内存检查\n */\n async check(): Promise<MemoryStats> {\n await this.checkMemory();\n return await this.getFullMemoryUsage();\n }\n}\n\n// 创建全局实例\nexport const memoryMonitor = new MemoryMonitor();\n\n// 进程退出时停止监控\nprocess.on('SIGINT', () => {\n memoryMonitor.stop();\n});\n\nprocess.on('SIGTERM', () => {\n memoryMonitor.stop();\n});\n\n// 导出类型\nexport type { MemoryStats, MemoryThresholds };\n\n","/**\n * 日志管理器 - 处理日志文件的轮转、清理和大小限制\n */\nimport fs from 'fs/promises';\nimport path from 'path';\nimport os from 'os';\n\n// 日志配置\nconst LOG_CONFIG = {\n MAX_FILE_SIZE: 5 * 1024 * 1024, // 5MB\n MAX_LOG_FILES: 3, // 保留最多 3 个日志文件\n MAX_LOG_AGE_DAYS: 7, // 日志保留 7 天\n MAX_LINE_LENGTH: 1000, // 单行最大长度\n CLEANUP_INTERVAL: 30 * 60 * 1000, // 30 分钟清理一次\n};\n\n// 获取日志目录\nfunction getLogDir(): string {\n return path.join(os.homedir(), '.prime-process-logs');\n}\n\n// 获取进程日志文件路径\nexport function getProcessLogPath(processKey: string): string {\n return path.join(getLogDir(), `${processKey}.log`);\n}\n\n// 截断过长的日志行\nexport function truncateLogLine(line: string): string {\n if (line.length <= LOG_CONFIG.MAX_LINE_LENGTH) {\n return line;\n }\n return line.substring(0, LOG_CONFIG.MAX_LINE_LENGTH) + '... [truncated]';\n}\n\n/**\n * 获取文件大小\n */\nasync function getFileSize(filePath: string): Promise<number> {\n try {\n const stats = await fs.stat(filePath);\n return stats.size;\n } catch {\n return 0;\n }\n}\n\n/**\n * 轮转日志文件\n * 当日志文件超过大小限制时,将其重命名并创建新文件\n */\nexport async function rotateLogFile(processKey: string): Promise<void> {\n const logPath = getProcessLogPath(processKey);\n const fileSize = await getFileSize(logPath);\n\n // 如果文件大小未超过限制,不需要轮转\n if (fileSize < LOG_CONFIG.MAX_FILE_SIZE) {\n return;\n }\n\n console.log(`[日志管理] 轮转日志文件: ${processKey}, 大小: ${(fileSize / 1024 / 1024).toFixed(2)}MB`);\n\n try {\n // 删除最旧的日志文件\n const oldestLogPath = `${logPath}.${LOG_CONFIG.MAX_LOG_FILES}`;\n try {\n await fs.unlink(oldestLogPath);\n } catch {\n // 文件不存在,忽略\n }\n\n // 轮转现有的日志文件\n for (let i = LOG_CONFIG.MAX_LOG_FILES - 1; i >= 1; i--) {\n const oldPath = i === 1 ? logPath : `${logPath}.${i}`;\n const newPath = `${logPath}.${i + 1}`;\n\n try {\n await fs.rename(oldPath, newPath);\n } catch {\n // 文件不存在,继续\n }\n }\n\n // 重命名当前日志文件\n await fs.rename(logPath, `${logPath}.1`);\n\n // 创建新的空日志文件\n await fs.writeFile(logPath, '', 'utf-8');\n\n console.log(`[日志管理] 日志轮转完成: ${processKey}`);\n } catch (error) {\n console.error(`[日志管理] 轮转日志文件失败: ${processKey}`, error);\n }\n}\n\n/**\n * 追加日志到文件\n * 如果文件过大,先进行轮转\n */\nexport async function appendLog(processKey: string, logLine: string): Promise<void> {\n // 先检查是否需要轮转\n await rotateLogFile(processKey);\n\n const logPath = getProcessLogPath(processKey);\n const truncatedLine = truncateLogLine(logLine);\n\n try {\n // 确保日志目录存在\n await fs.mkdir(getLogDir(), { recursive: true });\n\n // 追加日志\n await fs.appendFile(logPath, truncatedLine + '\\n', 'utf-8');\n } catch (error) {\n console.error(`[日志管理] 追加日志失败: ${processKey}`, error);\n }\n}\n\n/**\n * 批量写入日志(用于初始写入或同步)\n */\nexport async function writeLogsSync(processKey: string, logs: string[]): Promise<void> {\n await rotateLogFile(processKey);\n\n const logPath = getProcessLogPath(processKey);\n const truncatedLogs = logs.map(line => truncateLogLine(line));\n\n try {\n await fs.mkdir(getLogDir(), { recursive: true });\n await fs.writeFile(logPath, truncatedLogs.join('\\n') + '\\n', 'utf-8');\n } catch (error) {\n console.error(`[日志管理] 写入日志失败: ${processKey}`, error);\n }\n}\n\n/**\n * 读取日志文件的最后 N 行\n */\nexport async function readLastNLines(processKey: string, n: number = 100): Promise<string[]> {\n const logPath = getProcessLogPath(processKey);\n\n try {\n const content = await fs.readFile(logPath, 'utf-8');\n const lines = content.split('\\n').filter(line => line.trim());\n return lines.slice(-n);\n } catch {\n return [];\n }\n}\n\n/**\n * 清理旧的日志文件\n * 删除超过保留期限的日志文件\n */\nexport async function cleanupOldLogs(): Promise<void> {\n console.log('[日志管理] 开始清理旧日志...');\n\n try {\n const logDir = getLogDir();\n\n // 确保目录存在\n try {\n await fs.access(logDir);\n } catch {\n console.log('[日志管理] 日志目录不存在,无需清理');\n return;\n }\n\n const files = await fs.readdir(logDir);\n const now = Date.now();\n const maxAge = LOG_CONFIG.MAX_LOG_AGE_DAYS * 24 * 60 * 60 * 1000;\n\n let deletedCount = 0;\n let freedSpace = 0;\n\n for (const file of files) {\n const filePath = path.join(logDir, file);\n\n try {\n const stats = await fs.stat(filePath);\n\n // 删除超过保留期的文件\n if (now - stats.mtime.getTime() > maxAge) {\n freedSpace += stats.size;\n try {\n await fs.unlink(filePath);\n deletedCount++;\n console.log(`[日志管理] 删除过期日志: ${file}`);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (unlinkError: any) {\n // 如果文件已经不存在,忽略错误\n if (unlinkError?.code !== 'ENOENT') {\n console.error(`[日志管理] 删除文件失败: ${file}`, unlinkError);\n }\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n // 如果文件不存在,跳过(可能已被删除)\n if (error?.code !== 'ENOENT') {\n console.error(`[日志管理] 处理文件失败: ${file}`, error);\n }\n }\n }\n\n console.log(`[日志管理] 清理完成: 删除 ${deletedCount} 个文件, 释放 ${(freedSpace / 1024 / 1024).toFixed(2)}MB`);\n } catch (error) {\n console.error('[日志管理] 清理日志失败:', error);\n }\n}\n\n/**\n * 删除指定进程的所有日志文件\n */\nexport async function deleteProcessLogs(processKey: string): Promise<void> {\n const logPath = getProcessLogPath(processKey);\n\n try {\n // 删除主日志文件\n await fs.unlink(logPath);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n // 文件不存在,忽略\n if (error?.code !== 'ENOENT') {\n console.error(`[日志管理] 删除主日志文件失败: ${processKey}`, error);\n }\n }\n\n // 删除轮转的日志文件\n for (let i = 1; i <= LOG_CONFIG.MAX_LOG_FILES; i++) {\n try {\n await fs.unlink(`${logPath}.${i}`);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n // 文件不存在,忽略\n if (error?.code !== 'ENOENT') {\n console.error(`[日志管理] 删除轮转日志文件失败: ${processKey}.${i}`, error);\n }\n }\n }\n\n console.log(`[日志管理] 删除进程日志: ${processKey}`);\n}\n\n/**\n * 获取日志目录的总大小\n */\nexport async function getLogsDirSize(): Promise<{ totalSize: number; fileCount: number }> {\n try {\n const logDir = getLogDir();\n const files = await fs.readdir(logDir);\n\n let totalSize = 0;\n let fileCount = 0;\n\n for (const file of files) {\n try {\n const stats = await fs.stat(path.join(logDir, file));\n totalSize += stats.size;\n fileCount++;\n } catch {\n // 忽略错误\n }\n }\n\n return { totalSize, fileCount };\n } catch {\n return { totalSize: 0, fileCount: 0 };\n }\n}\n\n// 定期清理任务\nlet cleanupTimer: NodeJS.Timeout | null = null;\n\n/**\n * 启动定期清理任务\n */\nexport function startLogCleanupTask(): void {\n if (cleanupTimer) {\n return; // 已经启动\n }\n\n console.log('[日志管理] 启动定期清理任务');\n\n // 立即执行一次\n cleanupOldLogs();\n\n // 设置定期清理\n cleanupTimer = setInterval(() => {\n cleanupOldLogs();\n }, LOG_CONFIG.CLEANUP_INTERVAL);\n}\n\n/**\n * 停止定期清理任务\n */\nexport function stopLogCleanupTask(): void {\n if (cleanupTimer) {\n clearInterval(cleanupTimer);\n cleanupTimer = null;\n console.log('[日志管理] 停止定期清理任务');\n }\n}\n\n// 进程退出时停止清理任务\nprocess.on('SIGINT', () => {\n stopLogCleanupTask();\n});\n\nprocess.on('SIGTERM', () => {\n stopLogCleanupTask();\n});\n\n","/**\n * SSE连接管理器\n * 用于管理MicroApp代理配置变化推送的SSE连接\n */\n\nexport interface ConnectionInfo {\n controller: ReadableStreamDefaultController<Uint8Array>;\n timestamp: number;\n clientId: string;\n envName: string;\n}\n\nexport interface ConfigChangeMessage {\n type: 'microapp-proxy-config-change';\n envName: string;\n timestamp: number;\n changes: {\n before: string[];\n after: string[];\n added: string[];\n removed: string[];\n };\n projectName: string;\n message: string;\n}\n\nexport interface HeartbeatMessage {\n type: 'heartbeat';\n timestamp: number;\n}\n\ntype SSEMessage = ConfigChangeMessage | HeartbeatMessage;\n\n/**\n * SSE连接管理器类\n */\nclass SSEConnectionManager {\n private connections = new Map<string, Set<ConnectionInfo>>();\n private encoder = new TextEncoder();\n private heartbeatInterval: NodeJS.Timeout | null = null;\n private readonly HEARTBEAT_INTERVAL = 30000; // 30秒心跳\n private readonly CONNECTION_TIMEOUT = 120000; // 2分钟连接超时\n private readonly MAX_CONNECTIONS_PER_ENV = 10; // 每个环境最多10个连接\n\n constructor() {\n this.startHeartbeat();\n }\n \n /**\n * 清理所有连接(用于内存清理)\n */\n clearAllConnections(): void {\n console.log('[SSE] 开始清理所有连接...');\n const totalConnections = Array.from(this.connections.values()).reduce((sum, set) => sum + set.size, 0);\n \n this.connections.forEach((connections) => {\n connections.forEach(conn => {\n try {\n conn.controller.close();\n } catch {\n // 忽略关闭错误\n }\n });\n });\n \n this.connections.clear();\n console.log(`[SSE] 已清理 ${totalConnections} 个连接`);\n }\n\n /**\n * 添加新的SSE连接\n */\n addConnection(envName: string, controller: ReadableStreamDefaultController<Uint8Array>, clientId: string): void {\n console.log(`[SSE] 添加连接: 环境=${envName}, 客户端=${clientId}`);\n \n if (!this.connections.has(envName)) {\n this.connections.set(envName, new Set());\n }\n \n const connections = this.connections.get(envName)!;\n \n // 检查连接数限制\n if (connections.size >= this.MAX_CONNECTIONS_PER_ENV) {\n console.warn(`[SSE] 环境 ${envName} 连接数已达上限,清理最旧的连接`);\n // 找到最旧的连接并关闭\n const oldestConn = Array.from(connections).sort((a, b) => a.timestamp - b.timestamp)[0];\n if (oldestConn) {\n try {\n oldestConn.controller.close();\n } catch {\n // 忽略关闭错误\n }\n connections.delete(oldestConn);\n }\n }\n \n const connectionInfo: ConnectionInfo = {\n controller,\n timestamp: Date.now(),\n clientId,\n envName,\n };\n \n connections.add(connectionInfo);\n \n // 发送连接确认消息\n this.sendToConnection(connectionInfo, {\n type: 'heartbeat',\n timestamp: Date.now(),\n });\n\n console.log(`[SSE] 当前连接统计: ${this.getConnectionStats()}`);\n }\n\n /**\n * 移除SSE连接\n */\n removeConnection(envName: string, clientId: string): void {\n console.log(`[SSE] 移除连接: 环境=${envName}, 客户端=${clientId}`);\n \n const connections = this.connections.get(envName);\n if (connections) {\n const connectionToRemove = Array.from(connections).find(conn => conn.clientId === clientId);\n if (connectionToRemove) {\n connections.delete(connectionToRemove);\n \n // 如果该环境没有连接了,删除整个entry\n if (connections.size === 0) {\n this.connections.delete(envName);\n }\n }\n }\n\n console.log(`[SSE] 当前连接统计: ${this.getConnectionStats()}`);\n }\n\n /**\n * 向指定环境广播消息\n */\n broadcastToEnv(envName: string, message: ConfigChangeMessage): void {\n console.log(`[SSE] 向环境 ${envName} 广播配置变化消息`);\n \n const connections = this.connections.get(envName);\n if (!connections || connections.size === 0) {\n console.log(`[SSE] 环境 ${envName} 没有活跃连接,跳过广播`);\n return;\n }\n\n const deadConnections: ConnectionInfo[] = [];\n \n connections.forEach(connectionInfo => {\n try {\n this.sendToConnection(connectionInfo, message);\n } catch (error) {\n console.error(`[SSE] 发送消息到客户端 ${connectionInfo.clientId} 失败:`, error);\n deadConnections.push(connectionInfo);\n }\n });\n\n // 清理无效连接\n deadConnections.forEach(conn => {\n connections.delete(conn);\n console.log(`[SSE] 清理无效连接: 客户端=${conn.clientId}`);\n });\n\n console.log(`[SSE] 成功发送给 ${connections.size} 个连接`);\n }\n\n /**\n * 向单个连接发送消息\n */\n private sendToConnection(connectionInfo: ConnectionInfo, message: SSEMessage): void {\n const data = `data: ${JSON.stringify(message)}\\n\\n`;\n const encodedData = this.encoder.encode(data);\n \n try {\n connectionInfo.controller.enqueue(encodedData);\n connectionInfo.timestamp = Date.now(); // 更新最后活跃时间\n } catch (error) {\n console.error(`[SSE] 发送消息失败:`, error);\n throw error;\n }\n }\n\n /**\n * 启动心跳机制\n */\n private startHeartbeat(): void {\n this.heartbeatInterval = setInterval(() => {\n this.sendHeartbeat();\n this.cleanupStaleConnections();\n }, this.HEARTBEAT_INTERVAL);\n \n console.log(`[SSE] 心跳机制已启动,间隔: ${this.HEARTBEAT_INTERVAL}ms`);\n }\n\n /**\n * 发送心跳消息\n */\n private sendHeartbeat(): void {\n const heartbeatMessage: HeartbeatMessage = {\n type: 'heartbeat',\n timestamp: Date.now(),\n };\n\n let totalConnections = 0;\n this.connections.forEach((connections) => {\n totalConnections += connections.size;\n const deadConnections: ConnectionInfo[] = [];\n \n connections.forEach(connectionInfo => {\n try {\n this.sendToConnection(connectionInfo, heartbeatMessage);\n } catch {\n deadConnections.push(connectionInfo);\n }\n });\n\n // 清理无效连接\n deadConnections.forEach(conn => connections.delete(conn));\n });\n\n if (totalConnections > 0) {\n console.log(`[SSE] 心跳发送完成,活跃连接数: ${totalConnections}`);\n }\n }\n\n /**\n * 清理过期连接\n */\n private cleanupStaleConnections(): void {\n const now = Date.now();\n let cleanedCount = 0;\n\n this.connections.forEach((connections, envName) => {\n const staleConnections: ConnectionInfo[] = [];\n \n connections.forEach(connectionInfo => {\n if (now - connectionInfo.timestamp > this.CONNECTION_TIMEOUT) {\n staleConnections.push(connectionInfo);\n }\n });\n\n staleConnections.forEach(conn => {\n connections.delete(conn);\n cleanedCount++;\n console.log(`[SSE] 清理过期连接: 环境=${envName}, 客户端=${conn.clientId}`);\n });\n\n // 如果该环境没有连接了,删除整个entry\n if (connections.size === 0) {\n this.connections.delete(envName);\n }\n });\n\n if (cleanedCount > 0) {\n console.log(`[SSE] 连接清理完成,清理数量: ${cleanedCount}`);\n }\n }\n\n /**\n * 获取连接统计信息\n */\n getConnectionStats(): string {\n const stats: string[] = [];\n let totalConnections = 0;\n \n this.connections.forEach((connections, envName) => {\n const count = connections.size;\n totalConnections += count;\n stats.push(`${envName}: ${count}`);\n });\n\n return `总计 ${totalConnections} 个连接 (${stats.join(', ')})`;\n }\n\n /**\n * 停止连接管理器\n */\n stop(): void {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = null;\n console.log(`[SSE] 心跳机制已停止`);\n }\n\n // 关闭所有连接\n this.connections.forEach((connections) => {\n connections.forEach(connectionInfo => {\n try {\n connectionInfo.controller.close();\n } catch (error) {\n console.error(`[SSE] 关闭连接失败:`, error);\n }\n });\n });\n\n this.connections.clear();\n console.log(`[SSE] 所有连接已关闭`);\n }\n}\n\n// 创建全局实例\nexport const sseConnectionManager = new SSEConnectionManager();\n\n// 在进程退出时清理资源\nprocess.on('SIGINT', () => {\n console.log('[SSE] 收到退出信号,正在清理连接...');\n sseConnectionManager.stop();\n process.exit(0);\n});\n\nprocess.on('SIGTERM', () => {\n console.log('[SSE] 收到终止信号,正在清理连接...');\n sseConnectionManager.stop();\n process.exit(0);\n}); ","/**\n * 服务器初始化 - 启动所有监控和清理任务\n */\nimport { memoryMonitor } from './memory-monitor';\nimport { startLogCleanupTask, cleanupOldLogs } from './log-manager';\nimport { sseConnectionManager } from './sse-connection-manager';\n\nlet initialized = false;\n\n/**\n * 初始化服务器监控和清理任务\n */\nexport function initializeServer(): void {\n if (initialized) {\n console.log('[服务器] 已初始化,跳过');\n return;\n }\n\n console.log('[服务器] 开始初始化监控和清理任务...');\n\n // 1. 启动日志清理任务\n startLogCleanupTask();\n\n // 2. 注册内存清理回调\n memoryMonitor.registerCleanupCallback(async () => {\n console.log('[内存清理] 执行日志清理...');\n await cleanupOldLogs();\n });\n\n memoryMonitor.registerCleanupCallback(async () => {\n console.log('[内存清理] 清理过期的 SSE 连接...');\n // 只在紧急情况下关闭所有连接,通常交给心跳机制处理\n // sseConnectionManager.clearAllConnections();\n });\n\n // 3. 启动内存监控\n memoryMonitor.start();\n\n initialized = true;\n console.log('[服务器] 初始化完成 ✓');\n console.log('[服务器] 监控功能:');\n console.log(' - 内存监控: 每分钟检查一次');\n console.log(' - 日志清理: 每30分钟清理一次过期日志');\n console.log(' - SSE心跳: 每30秒检查连接状态');\n}\n\n/**\n * 停止所有监控和清理任务\n */\nexport function shutdownServer(): void {\n console.log('[服务器] 开始关闭...');\n \n memoryMonitor.stop();\n sseConnectionManager.stop();\n \n console.log('[服务器] 已关闭 ✓');\n}\n\n// 自动在导入时初始化\nif (process.env.NODE_ENV === 'production' || process.env.NODE_ENV === 'development') {\n // 延迟初始化,避免在构建时执行\n if (typeof window === 'undefined') {\n // 只在服务端执行\n setTimeout(() => {\n initializeServer();\n }, 1000);\n }\n}\n\n","import type { Metadata } from \"next\";\n// import { Geist, Geist_Mono } from \"next/font/google\";\nimport \"./globals.css\";\n// 初始化服务器监控和清理任务\nimport '@/lib/server-init';\n\n// const geistSans = Geist({\n// variable: \"--font-geist-sans\",\n// subsets: [\"latin\"],\n// });\n\n// const geistMono = Geist_Mono({\n// variable: \"--font-geist-mono\",\n// subsets: [\"latin\"],\n// });\n\nexport const metadata: Metadata = {\n title: \"Prime Dev CLI - 项目管理工具\",\n description: \"管理多个前端项目的开发环境和配置\",\n};\n\nexport default function RootLayout({\n children,\n}: Readonly<{\n children: React.ReactNode;\n}>) {\n return (\n <html lang=\"en\">\n <body>{children}</body>\n </html>\n );\n}\n"],"names":[],"mappings":"+DAEC,EAAA,CAAA,CAAA,uBACD,IAAA,EAAA,EAAA,CAAA,CAAA,OAGA,IAAM,EAAY,CAAA,EAFlB,AAEkB,EAFlB,CAAA,CAAA,MAEkB,SAAA,AAAQ,EAAE,EAAA,IAAI,EAiB1B,EAAuC,CAC3C,KAlBgB,KAkBL,IACX,WAAY,EAnBc,GAoB1B,iBAAkB,EACpB,EAgNa,EAAgB,IA5M7B,AA4MiC,MA5M3B,AACI,aAAsC,IAAK,CAC3C,UAA6B,CAC7B,iBAA+C,EAAE,AAAC,CAClD,gBAAkB,CAAE,CACpB,gBAAkB,GAAc,AAExC,CAF8B,KAAK,OAEvB,EAAwC,CAAC,CAAC,CAAE,CACtD,IAAI,CAAC,UAAU,CAAG,CAAE,GAAG,CAAkB,CAAE,GAAG,CAAU,AAAC,CAC3D,CAMA,wBAAwB,CAA6B,CAAQ,CAC3D,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAC7B,CAKA,MAAc,iBAAmC,CAC/C,GAAI,CACiE,CAEjE,GAAM,QAAE,CAAM,CAAE,CAAG,MAAM,EAAU,CAAC,cAAc,EAAE,QAAQ,GAAG,CAAA,CAAE,EAE3D,EADQ,AACA,EADO,IAAI,GAAG,KAAK,CAAC,MACd,MAAM,CAAC,CAAC,EAAK,KAC/B,IAAM,EAAM,SAAS,EAAK,IAAI,IAC9B,OAAO,GAAO,GAAD,GAAO,GAAO,EAAI,CAAA,CAAG,AACpC,EAAG,GACH,OAAO,AAAQ,MAAM,AACvB,CAMF,CAAE,KANO,AAMD,CAER,CACA,OAAO,CACT,CAKA,CAhB8C,eAgBhB,CAC5B,IAAM,EAAQ,QAAQ,WAAW,GACjC,MAAO,CACL,IAAK,EAAM,GAAG,CACd,UAAW,EAAM,SAAS,CAC1B,SAAU,EAAM,QAAQ,CACxB,SAAU,EAAM,QAAQ,CACxB,aAAc,EAAM,YAAY,AAClC,CACF,CAKA,MAAM,oBAA2C,CAC/C,IAAM,EAAQ,IAAI,CAAC,cAAc,GAC3B,EAAc,MAAM,IAAI,CAAC,eAAe,GAC9C,MAAO,CACL,GAAG,CAAK,CACR,YAAa,EAAc,EAAI,EAAc,MAC/C,CACF,CAKQ,YAAY,CAAa,CAAU,CAEzC,MAAO,CAAA,EAAG,CADC,EAAQ,KAAO,IAAA,EACb,OAAO,CAAC,GAAG,GAAG,CAAC,AAC9B,CAKA,MAAc,aAA6B,CACzC,IAAM,EAAQ,MAAM,IAAI,CAAC,kBAAkB,GACrC,EAAQ,EAAM,GAAG,CAAG,KAAO,KAC3B,EAAoB,EAAM,QAAQ,CAAG,EAAM,SAAS,CAAI,IACxD,EAAgB,EAAM,WAAW,CAAG,EAAM,WAAW,CAAG,KAAO,KAAO,KAGtE,EAAqC,CACzC,IAAK,IAAI,CAAC,WAAW,CAAC,EAAM,GAAG,EAC/B,SAAU,IAAI,CAAC,WAAW,CAAC,EAAM,QAAQ,EACzC,UAAW,IAAI,CAAC,WAAW,CAAC,EAAM,SAAS,EAC3C,iBAAkB,CAAA,EAAG,EAAiB,OAAO,CAAC,GAAG,CAAC,CAAC,AACrD,EAEI,EAAM,WAAW,EAAE,CACrB,EAAW,WAAW,CAAG,IAAI,CAAC,WAAW,CAAC,EAAM,YAAW,EAG7D,QAAQ,GAAG,CAAC,eAAgB,GAG5B,IAAM,EAAgB,GAAiB,EAGvC,GAAI,GAAiB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAE,CAC/C,QAAQ,KAAK,CAAC,CAAC,qBAAqB,EAAE,EAAc,OAAO,CAAC,GAAG,EAAE,CAAC,EAClE,MAAM,IAAI,CAAC,cAAc,CAAC,YAC1B,MACF,CAGA,GAAI,GAAiB,IAAI,CAAC,UAAU,CAAC,SAAS,EAAI,GAAoB,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAE,CACtG,IAAM,EAAM,KAAK,GAAG,GAChB,EAAM,IAAI,CAAC,eAAe,CAAG,IAAI,CAAC,eAAe,EAAE,CACrD,QAAQ,IAAI,CAAC,CAAC,kBAAkB,EAAE,EAAc,OAAO,CAAC,GAAG,UAAU,EAAE,EAAiB,OAAO,CAAC,GAAG,EAAE,CAAC,EACtG,IAAI,CAAC,eAAe,CAAG,EAGvB,MAAM,IAAI,CAAC,cAAc,CAAC,WAE9B,CACF,CAKA,MAAc,eAAe,CAA6B,CAAiB,CACzE,QAAQ,GAAG,CAAC,CAAC,UAAU,EAAE,AAAU,eAAa,KAAO,KAAK,MAAM,CAAC,EAEnE,IAAM,EAAc,IAAI,CAAC,cAAc,GAGvC,IAAK,IAAM,KAAY,IAAI,CAAC,gBAAgB,CAAE,AAC5C,GAAI,CACF,MAAM,GACR,CAAE,MAAO,EAAO,CACd,QAAQ,KAAK,CAAC,mBAAoB,EACpC,CAIE,EAAO,EAAE,EAAE,AACb,EAAO,EAAE,GACT,QAAQ,GAAG,CAAC,mBACO,YAAY,CAAtB,GACT,QAAQ,IAAI,CAAC,yDAGf,IAAM,EAAa,IAAI,CAAC,cAAc,GAChC,EAAU,CAAC,EAAY,GAAG,CAAG,EAAW,GAAA,AAAG,EAAI,KAAO,KAE5D,QAAQ,GAAG,CAAC,CAAC,kBAAkB,EAAE,EAAQ,OAAO,CAAC,GAAG,EAAE,CAAC,CACzD,CAKA,OAAc,CACZ,GAAI,IAAI,CAAC,YAAY,CAAE,YACrB,QAAQ,IAAI,CAAC,mBAIf,QAAQ,GAAG,CAAC,gBAAiB,CAC3B,SAAU,GAAG,EAA0B,CACvC,WAAY,CACV,IAF8B,IAErB,CAF0B,AAE1B,CAF2B,CAExB,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC,CACzC,SAAU,CAAA,EAAG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC,CAC3C,UAAW,CAAA,EAAG,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAClD,AADmD,CAErD,GAGA,IAAI,CAAC,WAAW,GAGhB,IAAI,CAAC,YAAY,CAAG,YAAY,KAC9B,IAAI,CAAC,WAAW,EAClB,EAtLqB,CAsLlB,GACL,CAKA,AA5L4B,MA4Lf,AA5LqB,CA6L5B,IAAI,CAAC,IA7LiC,QA6LrB,EAAE,CACrB,cAAc,IAAI,CAAC,YAAY,EAC/B,IAAI,CAAC,YAAY,CAAG,KACpB,QAAQ,GAAG,CAAC,iBAEhB,CAKA,MAAM,OAA8B,CAElC,OADA,MAAM,IAAI,CAAC,WAAW,GACf,MAAM,IAAI,CAAC,kBAAkB,EACtC,CACF,EAMA,QAAQ,EAAE,CAAC,SAAU,KACnB,EAAc,IAAI,EACpB,GAEA,QAAQ,EAAE,CAAC,UAAW,KACpB,EAAc,IAAI,EACpB,oDClPC,EAAA,CAAA,CAAA,mPACD,IAAA,EAAA,EAAA,CAAA,CAAA,MACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAGA,IAAM,EAAa,CACjB,cAAe,IAAI,IACnB,GAD0B,WACX,EACf,iBAAkB,EAClB,gBAAiB,IACjB,iBAAkB,IACpB,CADyB,CAIzB,IAJ8B,KAIrB,IACP,OAAO,EAAA,OAAI,CAAC,IAAI,CAAC,EAAA,OAAE,CAAC,OAAO,GAAI,GAAxB,eAAU,IACnB,CAGO,SAAS,EAAkB,CAAkB,EAClD,OAAO,EAAA,OAAI,CAAC,IAAI,CAAC,IAAa,CAAA,EAAG,EAAW,IAAI,CAAC,CACnD,CAGO,OAJE,EAIO,EAAgB,CAAY,SAC1C,AAAI,EAAK,MAAM,EAAI,EAAW,eAAe,CACpC,CADsC,CAGxC,EAAK,SAAS,CAAC,EAAG,EAAW,eAAe,EAAI,iBACzD,CAKA,eAAe,EAAY,CAAgB,EACzC,GAAI,CAEF,MAAO,CADO,MAAM,EAAA,OAAE,CAAC,IAAI,CAAC,EAAA,EACf,IAAI,AACnB,CAAE,KAAM,CACN,OAHoB,AAGb,CACT,CACF,CAMO,eAAe,EAAc,CAAkB,EACpD,IAAM,EAAU,EAAkB,GAC5B,EAAW,MAAM,EAAY,GAGnC,KAAI,EAAW,EAAW,aAAa,AAAb,EAAe,CAIzC,QAAQ,GAAG,CAAC,CAAC,eAAe,EAAE,EAAW,MAAM,EAAE,AAAC,GAAW,KAAO,IAAA,CAAI,CAAE,OAAO,CAAC,GAAG,EAAE,CAAC,EAExF,GAAI,CAEF,IAAM,EAAgB,CAAA,EAAG,EAAQ,CAAC,EAAE,EAAW,aAAa,CAAA,CAAE,CAC9D,GAAI,CACF,MAAM,EAAA,OAAE,CAAC,MAAM,CAAC,EAClB,CAAE,KAAM,CAER,CAGA,IAAK,IAAI,EAAI,AANL,EAMgB,aAAa,CAAG,EAAG,GAAK,EAAG,IAAK,CACtD,IAAM,EAAgB,IAAN,EAAU,EAAU,CAAA,EAAG,EAAQ,CAAC,EAAE,EAAA,CAAG,CAC/C,EAAU,CAAA,EAAG,EAAQ,CAAC,EAAE,EAAI,EAAA,CAAG,CAErC,GAAI,CACF,MAAM,EAAA,OAAE,CAAC,MAAM,CAAC,EAAS,EAC3B,CAAE,KAAM,CAER,CACF,CAGA,MAAM,CAPI,CAOJ,OAAE,CAAC,MAAM,CAAC,EAAS,CAAA,EAAG,EAAQ,EAAE,CAAC,EAGvC,MAAM,EAHA,AAGA,OAAE,CAAC,SAAS,CAAC,EAAS,GAAI,SAEhC,GAFM,KAEE,GAAG,CAAC,CAAC,eAAe,EAAE,EAAA,CAAY,CAC5C,CAAE,MAAO,EAAO,CACd,QAAQ,KAAK,CAAC,CAAC,iBAAiB,EAAE,EAAA,CAAY,CAAE,EAClD,EACF,CAMO,eAAe,EAAU,CAAkB,CAAE,CAAe,EAEjE,MAAM,EAAc,GAEpB,IAAM,EAAU,EAAkB,GAC5B,EAAgB,EAAgB,GAEtC,GAAI,CAEF,MAAM,EAAA,OAAE,CAAC,KAAK,CAAC,IAAa,CAAE,WAAW,CAAK,GAG9C,CAHM,KAGA,EAAA,OAAE,CAAC,UAAU,CAAC,EAAS,EAAgB,KAAM,OAA7C,CACR,CAAE,MAAO,EAAO,CACd,QAAQ,KAAK,CAAC,CAAC,eAAe,EAAE,EAAA,CAAY,CAAE,EAChD,CACF,CAKO,eAAe,EAAc,CAAkB,CAAE,CAAc,EACpE,MAAM,EAAc,GAEpB,IAAM,EAAU,EAAkB,GAC5B,EAAgB,EAAK,GAAG,CAAC,GAAQ,EAAgB,IAEvD,GAAI,CACF,MAAM,EAAA,OAAE,CAAC,KAAK,CAAC,IAAa,CAAE,WAAW,CAAK,GAC9C,CADM,KACA,EAAA,OAAE,CAAC,SAAS,CAAC,EAAS,EAAc,IAAI,CAAC,MAAQ,EAAjD,GAAuD,QAC/D,CAAE,MAAO,EAAO,CACd,QAAQ,KAAK,CAAC,CAAC,eAAe,EAAE,EAAA,CAAY,CAAE,EAChD,CACF,CAKO,eAAe,EAAe,CAAkB,CAAE,EAAY,GAAG,EACtE,IAAM,EAAU,EAAkB,GAElC,GAAI,CAGF,MAAO,AADO,CADE,MAAM,EAAA,OAAE,CAAC,QAAQ,CAAC,EAAS,QAAA,EACrB,KAAK,CAAC,AADN,MACY,MAAM,CAAC,GAAQ,EAAK,IAAI,IAC7C,KAAK,CAAC,CAAC,EACtB,CAAE,KAAM,CACN,MAAO,EACT,AADW,CAEb,CAMO,eAAe,IACpB,QAAQ,GAAG,CAAC,qBAEZ,GAAI,CACF,IAAM,EAAS,IAGf,GAAI,CACF,MAAM,EAAA,OAAE,CAAC,MAAM,CAAC,EAClB,CAAE,KAAM,CACN,QAAQ,GAAG,AAFL,CAEM,uBACZ,MACF,CAEA,IAAM,EAAQ,MAAM,EAAA,OAAE,CAAC,OAAO,CAAC,GACzB,EAAM,KAAK,GAAG,GACd,EAAuC,CAFzB,IAEM,AAAwB,KAAK,KAAK,MAAlB,CAA3B,KAEX,EAAe,EACf,EAAa,EAEjB,IAAK,IAAM,KAAQ,EAAO,CACxB,IAAM,EAAW,EAAA,OAAI,CAAC,IAAI,CAAC,EAAQ,GAEnC,GAAI,CACF,IAAM,EAAQ,MAAM,EAAA,AAHL,OAGO,CAAC,IAAI,CAAC,GAG5B,GAAI,EAAM,EAAM,KAAK,CAAC,MAHF,CAGS,GAAK,EAAQ,CACxC,GAAc,EAAM,IAAI,CACxB,GAAI,CACF,MAAM,EAAA,OAAE,CAAC,MAAM,CAAC,GAChB,IACA,QAAQ,GAAG,CAAC,CAFN,AAEO,eAAe,EAAE,EAAA,CAAM,CAEtC,CAAE,MAAO,EAAkB,CAErB,GAAa,OAAS,UAAU,AAClC,QAAQ,KAAK,CAAC,CAAC,eAAe,EAAE,EAAA,CAAM,CAAE,EAE5C,CACF,CAEA,CAAE,MAAO,EAAY,CAEjB,GAAO,OAAS,UAAU,AAC5B,QAAQ,KAAK,CAAC,CAAC,eAAe,EAAE,EAAA,CAAM,CAAE,EAE5C,CACF,CAEA,QAAQ,GAAG,CAAC,CAAC,gBAAgB,EAAE,EAAa,SAAS,EAAE,CAAC,EAAa,KAAO,IAAA,CAAI,CAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAClG,CAAE,MAAO,EAAO,CACd,QAAQ,KAAK,CAAC,iBAAkB,EAClC,CACF,CAKO,eAAe,EAAkB,CAAkB,EACxD,IAAM,EAAU,EAAkB,GAElC,GAAI,CAEF,MAAM,EAAA,OAAE,CAAC,MAAM,CAAC,EAElB,CAAE,MAAO,EAAY,CAEf,GAAO,KAJL,EAIc,UAAU,AAC5B,QAAQ,KAAK,CAAC,CAAC,kBAAkB,EAAE,EAAA,CAAY,CAAE,EAErD,CAGA,IAAK,IAAI,EAAI,EAAG,GAAK,EAAW,aAAa,CAAE,IAAK,AAClD,GAAI,CACF,MAAM,EAAA,OAAE,CAAC,MAAM,CAAC,CAAA,EAAG,EAAQ,CAAC,EAAE,EAAA,CAAG,CAEnC,CAAE,MAAO,CAFD,CAEa,CAEf,GAAO,OAAS,UAAU,AAC5B,QAAQ,KAAK,CAAC,CAAC,mBAAmB,EAAE,EAAW,CAAC,EAAE,EAAA,CAAG,CAAE,EAE3D,CAGF,QAAQ,GAAG,CAAC,CAAC,eAAe,EAAE,EAAA,CAAY,CAC5C,CAKO,eAAe,IACpB,GAAI,CACF,IAAM,EAAS,IACT,EAAQ,MAAM,EAAA,OAAE,CAAC,OAAO,CAAC,GAE3B,EAAY,EACZ,EAAY,EAEhB,IAAK,IALe,AAKT,KAAQ,EACjB,GAAI,CADoB,AAEtB,IAAM,EAAQ,MAAM,EAAA,OAAE,CAAC,IAAI,CAAC,EAAA,OAAI,CAAC,IAAI,CAAC,EAAQ,IAC9C,CADoB,EACP,EAAM,IAAI,CACvB,GACF,CAAE,GAH4B,EAGtB,CAER,CAGF,MAAO,WAAE,YAAW,CAAU,CAChC,CAAE,KAAM,CACN,MAAO,CAAE,UAAW,EAAG,UAAW,CAAE,CACtC,CACF,CAGA,IAAI,EAAsC,KAKnC,SAAS,IACV,IAIJ,QAAQ,EAJU,CAIP,CAAC,mBAGZ,IAGA,EAAe,YAAY,KACzB,GACF,EAAG,EAAW,gBAAgB,EAChC,CAKO,SAAS,IACV,IACF,UADgB,IACF,GACd,EAAe,KACf,QAAQ,GAAG,CAAC,mBAEhB,CAGA,QAAQ,EAAE,CAAC,SAAU,KACnB,GACF,GAEA,QAAQ,EAAE,CAAC,UAAW,KACpB,GACF,oDClTC,EAAA,CAAA,CAAA,6BAiCD,OAAM,EACI,YAAc,IAAI,GAAmC,CACrD,QAAU,IAAI,WAAc,CAC5B,kBAA2C,IAAK,AACvC,oBAAqB,GAAM,CAC3B,mBAAqB,IAAO,CAC5B,wBAA0B,EAAG,AAE9C,cAAc,CACZ,IAAI,CAAC,cAAc,EACrB,CAKA,qBAA4B,CAC1B,QAAQ,GAAG,CAAC,qBACZ,IAAM,EAAmB,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,EAAK,IAAQ,EAAM,EAAI,IAAI,CAAE,GAEpG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,AAAC,IACxB,EAAY,OAAO,CAAC,IAClB,GAAI,CACF,EAAK,UAAU,CAAC,KAAK,EACvB,CAAE,KAAM,CAER,CACF,EACF,GAEA,IAAI,CAAC,WAAW,CAAC,KAAK,GACtB,QAAQ,GAAG,CAAC,CAAC,UAAU,EAAE,EAAiB,IAAI,CAAC,CACjD,CAKA,cAAc,CAAe,CAAE,CAAuD,CAAE,CAAgB,CAAQ,CAC9G,QAAQ,GAAG,CAAC,CAAC,eAAe,EAAE,EAAQ,MAAM,EAAE,EAAA,CAAU,EAEpD,AAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IACxB,IAAI,CAAC,CAD6B,UAClB,CAAC,GAAG,CAAC,EAAS,IAAI,KAGpC,IAAM,EAAc,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAGzC,GAAI,EAAY,IAAI,EAAI,IAAI,CAAC,uBAAuB,CAAE,CACpD,QAAQ,IAAI,CAAC,CAAC,SAAS,EAAE,EAAQ,gBAAgB,CAAC,EAElD,IAAM,EAAa,MAAM,IAAI,CAAC,GAAa,IAAI,CAAC,CAAC,EAAG,IAAM,EAAE,SAAS,CAAG,EAAE,SAAS,CAAC,CAAC,EAAE,CACvF,GAAI,EAAY,CACd,GAAI,CACF,EAAW,UAAU,CAAC,KAAK,EAC7B,CAAE,KAAM,CAER,CACA,EAAY,MAAM,CAAC,EACrB,CACF,CAEA,IAAM,EAAiC,YACrC,EACA,UAAW,KAAK,GAAG,YACnB,UACA,CACF,EAEA,EAAY,GAAG,CAAC,GAGhB,IAAI,CAAC,gBAAgB,CAAC,EAAgB,CACpC,KAAM,YACN,UAAW,KAAK,GAAG,EACrB,GAEA,QAAQ,GAAG,CAAC,CAAC,cAAc,EAAE,IAAI,CAAC,kBAAkB,GAAA,CAAI,CAC1D,CAKA,iBAAiB,CAAe,CAAE,CAAgB,CAAQ,CACxD,QAAQ,GAAG,CAAC,CAAC,eAAe,EAAE,EAAQ,MAAM,EAAE,EAAA,CAAU,EAExD,IAAM,EAAc,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GACzC,GAAI,EAAa,CACf,IAAM,EAAqB,MAAM,IAAI,CAAC,GAAa,IAAI,CAAC,GAAQ,EAAK,QAAQ,GAAK,GAC9E,IACF,EAAY,MAAM,CAAC,GAGM,GAAG,CAJN,AAIlB,EAAY,IAAI,EAClB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAG9B,CAEA,QAAQ,GAAG,CAAC,CAAC,cAAc,EAAE,IAAI,CAAC,kBAAkB,GAAA,CAAI,CAC1D,CAKA,eAAe,CAAe,CAAE,CAA4B,CAAQ,CAClE,QAAQ,GAAG,CAAC,CAAC,UAAU,EAAE,EAAQ,SAAS,CAAC,EAE3C,IAAM,EAAc,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GACzC,GAAI,CAAC,GAAoC,IAArB,EAAY,IAAI,CAAQ,YAC1C,QAAQ,GAAG,CAAC,CAAC,SAAS,EAAE,EAAQ,YAAY,CAAC,EAI/C,IAAM,EAAoC,EAAE,CAE5C,EAAY,OAAO,CAAC,IAClB,GAAI,CACF,IAAI,CAAC,gBAAgB,CAAC,EAAgB,EACxC,CAAE,MAAO,EAAO,CACd,QAAQ,KAAK,CAAC,CAAC,eAAe,EAAE,EAAe,QAAQ,CAAC,IAAI,CAAC,CAAE,GAC/D,EAAgB,IAAI,CAAC,EACvB,CACF,GAGA,EAAgB,OAAO,CAAC,IACtB,EAAY,MAAM,CAAC,GACnB,QAAQ,GAAG,CAAC,CAAC,kBAAkB,EAAE,EAAK,QAAQ,CAAA,CAAE,CAClD,GAEA,QAAQ,GAAG,CAAC,CAAC,YAAY,EAAE,EAAY,IAAI,CAAC,IAAI,CAAC,CACnD,CAKQ,iBAAiB,CAA8B,CAAE,CAAmB,CAAQ,CAClF,IAAM,EAAO,CAAC,MAAM,EAAE,KAAK,SAAS,CAAC,SAAS;AAAA;AAAI,CAAC,CAC7C,EAAc,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAExC,GAAI,CACF,EAAe,UAAU,CAAC,OAAO,CAAC,GAClC,EAAe,SAAS,CAAG,KAAK,GAAG,EACrC,CAAE,CADuC,KAChC,EAAO,CAEd,GAHkD,GAElD,QAAQ,KAAK,CAAC,CAAC,aAAa,CAAC,CAAE,GACzB,CACR,CACF,CAKQ,gBAAuB,CAC7B,IAAI,CAAC,iBAAiB,CAAG,YAAY,KACnC,IAAI,CAAC,aAAa,GAClB,IAAI,CAAC,uBAAuB,EAC9B,EAAG,IAAI,CAAC,kBAAkB,EAE1B,QAAQ,GAAG,CAAC,CAAC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAC9D,CAKQ,eAAsB,CAC5B,IAAM,EAAqC,CACzC,KAAM,YACN,UAAW,KAAK,GAAG,EACrB,EAEI,EAAmB,EACvB,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,AAAC,IACxB,GAAoB,EAAY,IAAI,CACpC,IAAM,EAAoC,EAAE,CAE5C,EAAY,OAAO,CAAC,IAClB,GAAI,CACF,IAAI,CAAC,gBAAgB,CAAC,EAAgB,EACxC,CAAE,KAAM,CACN,EAAgB,IAAI,CAAC,EACvB,CACF,GAGA,EAAgB,OAAO,CAAC,GAAQ,EAAY,MAAM,CAAC,GACrD,GAEI,EAAmB,GAAG,AACxB,QAAQ,GAAG,CAAC,CAAC,oBAAoB,EAAE,EAAA,CAAkB,CAEzD,CAKQ,yBAAgC,CACtC,IAAM,EAAM,KAAK,GAAG,GAChB,EAAe,EAEnB,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,EAAa,KACrC,IAAM,EAAqC,EAAE,CAE7C,EAAY,OAAO,CAAC,IACd,EAAM,EAAe,SAAS,CAAG,IAAI,CAAC,kBAAkB,EAC1D,AAD4D,EAC3C,IAAI,CAAC,EAE1B,GAEA,EAAiB,OAAO,CAAC,IACvB,EAAY,MAAM,CAAC,GACnB,IACA,QAAQ,GAAG,CAAC,CAAC,iBAAiB,EAAE,EAAQ,MAAM,EAAE,EAAK,QAAQ,CAAA,CAAE,CACjE,GAGyB,GAAG,CAAxB,EAAY,IAAI,EAClB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAE5B,GAEI,EAAe,GAAG,AACpB,QAAQ,GAAG,CAAC,CAAC,mBAAmB,EAAE,EAAA,CAAc,CAEpD,CAKA,oBAA6B,CAC3B,IAAM,EAAkB,EAAE,CACtB,EAAmB,EAQvB,OANA,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,EAAa,KACrC,IAAM,EAAQ,EAAY,IAAI,CAC9B,GAAoB,EACpB,EAAM,IAAI,CAAC,CAAA,EAAG,EAAQ,EAAE,EAAE,EAAA,CAAO,CACnC,GAEO,CAAC,GAAG,EAAE,EAAiB,MAAM,EAAE,EAAM,IAAI,CAAC,MAAM,CAAC,CAAC,AAC3D,CAKA,MAAa,CACP,IAAI,CAAC,iBAAiB,EAAE,CAC1B,cAAc,IAAI,CAAC,iBAAiB,EACpC,IAAI,CAAC,iBAAiB,CAAG,KACzB,QAAQ,GAAG,CAAC,CAAC,aAAa,CAAC,GAI7B,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,AAAC,IACxB,EAAY,OAAO,CAAC,IAClB,GAAI,CACF,EAAe,UAAU,CAAC,KAAK,EACjC,CAAE,MAAO,EAAO,CACd,QAAQ,KAAK,CAAC,CAAC,aAAa,CAAC,CAAE,EACjC,CACF,EACF,GAEA,IAAI,CAAC,WAAW,CAAC,KAAK,GACtB,QAAQ,GAAG,CAAC,CAAC,aAAa,CAAC,CAC7B,CACF,CAGO,IAAM,EAAuB,IAAI,EAGxC,QAAQ,EAAE,CAAC,SAAU,KACnB,QAAQ,GAAG,CAAC,0BACZ,EAAqB,IAAI,GACzB,QAAQ,IAAI,CAAC,EACf,GAEA,QAAQ,EAAE,CAAC,UAAW,KACpB,QAAQ,GAAG,CAAC,0BACZ,EAAqB,IAAI,GACzB,QAAQ,IAAI,CAAC,EACf,oDC1TC,EAAA,CAAA,CAAA,+CACD,IAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAEA,IAAI,GAAc,EAKX,SAAS,IACd,GAAI,EAAa,YACf,QAAQ,GAAG,CAAC,iBAId,QAAQ,GAAG,CAAC,yBAGZ,CAAA,EAAA,EAAA,mBAAA,AAAkB,IAGlB,EAAA,WAHA,EAGa,CAAC,sBAAd,CAAqC,CAAC,UACpC,QAAQ,GAAG,CAAC,oBACZ,MAAM,CAAA,EAAA,EAAA,cAAA,AAAa,GACrB,GAEA,EAAA,aAAa,CAHL,AAGM,sBAAd,CAAqC,CAAC,UACpC,QAAQ,GAAG,CAAC,yBAGd,GAGA,EAAA,aAAa,CAAC,KAAK,GAEnB,GAAc,EACd,QAAQ,CAHR,EAGW,CAAC,iBACZ,QAAQ,GAAG,CAAC,eACZ,QAAQ,GAAG,CAAC,qBACZ,QAAQ,GAAG,CAAC,2BACZ,QAAQ,GAAG,CAAC,wBACd,CAKO,SAAS,IACd,QAAQ,GAAG,CAAC,iBAEZ,EAAA,aAAa,CAAC,IAAI,GAClB,EAAA,aADA,OACoB,CAAC,IAAI,GAEzB,QAFA,AAEQ,GAAG,CAAC,cACd,CAOI,WAAW,KACT,GACF,EAAG,2GC7DP,EAAA,CAAA,CAAA,OAYO,IAAM,EAAqB,CAChC,MAAO,yBACP,YAAa,kBACf,EAEe,SAAS,EAAW,UACjC,CAAQ,CAGR,EACA,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,KAAK,cACT,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAM,KAGb"}
|
|
@@ -2,13 +2,13 @@ globalThis.__BUILD_MANIFEST = {
|
|
|
2
2
|
"pages": {
|
|
3
3
|
"/_app": [
|
|
4
4
|
"static/chunks/7d7379cdf8fe9ec5.js",
|
|
5
|
-
"static/chunks/
|
|
6
|
-
"static/chunks/
|
|
5
|
+
"static/chunks/f9ef1d12f3c1646a.js",
|
|
6
|
+
"static/chunks/d65b8ba84ba3d819.js"
|
|
7
7
|
],
|
|
8
8
|
"/_error": [
|
|
9
9
|
"static/chunks/cf6e515377591a1f.js",
|
|
10
|
-
"static/chunks/
|
|
11
|
-
"static/chunks/
|
|
10
|
+
"static/chunks/f9ef1d12f3c1646a.js",
|
|
11
|
+
"static/chunks/294d677a4838a994.js"
|
|
12
12
|
]
|
|
13
13
|
},
|
|
14
14
|
"devFiles": [],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/1ad898191df92f90.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/0dfafa95d29e5c79.js"/><script src="/_next/static/chunks/a7b45611d4ad55fe.js" async=""></script><script src="/_next/static/chunks/0e57f1354cda05d5.js" async=""></script><script src="/_next/static/chunks/1923d6510bea25be.js" async=""></script><script src="/_next/static/chunks/a9cba6096fe97a30.js" async=""></script><script src="/_next/static/chunks/ecfccf4677b4777a.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>
|
|
1
|
+
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/1ad898191df92f90.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/0dfafa95d29e5c79.js"/><script src="/_next/static/chunks/a7b45611d4ad55fe.js" async=""></script><script src="/_next/static/chunks/0e57f1354cda05d5.js" async=""></script><script src="/_next/static/chunks/1923d6510bea25be.js" async=""></script><script src="/_next/static/chunks/a9cba6096fe97a30.js" async=""></script><script src="/_next/static/chunks/ecfccf4677b4777a.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>Prime Dev CLI - 项目管理工具</title><meta name="description" content="管理多个前端项目的开发环境和配置"/><link rel="icon" href="/favicon.ico?favicon.45db1c09.ico" sizes="256x256" type="image/x-icon"/><script>document.querySelectorAll('body link[rel="icon"], body link[rel="apple-touch-icon"]').forEach(el => document.head.appendChild(el))</script><script src="/_next/static/chunks/ec548c7ce307cf6d.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/0dfafa95d29e5c79.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[55889,[\"/_next/static/chunks/ecfccf4677b4777a.js\"],\"default\"]\n3:I[54799,[\"/_next/static/chunks/ecfccf4677b4777a.js\"],\"default\"]\n4:I[67903,[\"/_next/static/chunks/ecfccf4677b4777a.js\"],\"OutletBoundary\"]\n7:I[73794,[\"/_next/static/chunks/ecfccf4677b4777a.js\"],\"AsyncMetadataOutlet\"]\n9:I[67903,[\"/_next/static/chunks/ecfccf4677b4777a.js\"],\"ViewportBoundary\"]\nb:I[67903,[\"/_next/static/chunks/ecfccf4677b4777a.js\"],\"MetadataBoundary\"]\nd:I[71163,[\"/_next/static/chunks/ecfccf4677b4777a.js\"],\"default\"]\n:HL[\"/_next/static/chunks/1ad898191df92f90.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"bC3bTGQyq6cbRR_M7T8N6\",\"p\":\"\",\"c\":[\"\",\"_not-found\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/1ad898191df92f90.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"children\":[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]]}],{\"children\":[\"/_not-found\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:1:props:children:1:props:children:props:children:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:f:0:1:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L4\",null,{\"children\":[\"$L5\",\"$L6\",[\"$\",\"$L7\",null,{\"promise\":\"$@8\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$1\",\"btGWyDsOA47IIEfOqsLy3v\",{\"children\":[[\"$\",\"$L9\",null,{\"children\":\"$La\"}],null]}],[\"$\",\"$Lb\",null,{\"children\":\"$Lc\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$d\",\"$undefined\"],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"e:\"$Sreact.suspense\"\nf:I[73794,[\"/_next/static/chunks/ecfccf4677b4777a.js\"],\"AsyncMetadata\"]\nc:[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$e\",null,{\"fallback\":null,\"children\":[\"$\",\"$Lf\",null,{\"promise\":\"$@10\"}]}]}]\n6:null\n"])</script><script>self.__next_f.push([1,"a:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n5:null\n"])</script><script>self.__next_f.push([1,"8:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"Prime Dev CLI - 项目管理工具\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"管理多个前端项目的开发环境和配置\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.45db1c09.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}]],\"error\":null,\"digest\":\"$undefined\"}\n10:{\"metadata\":\"$8:metadata\",\"error\":null,\"digest\":\"$undefined\"}\n"])</script></body></html>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><title data-next-head="">500: Internal Server Error</title><noscript data-n-css=""></noscript><script defer="" noModule="" src="/_next/static/chunks/ec548c7ce307cf6d.js"></script><script src="/_next/static/chunks/7d7379cdf8fe9ec5.js" defer=""></script><script src="/_next/static/chunks/
|
|
1
|
+
<!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><title data-next-head="">500: Internal Server Error</title><noscript data-n-css=""></noscript><script defer="" noModule="" src="/_next/static/chunks/ec548c7ce307cf6d.js"></script><script src="/_next/static/chunks/7d7379cdf8fe9ec5.js" defer=""></script><script src="/_next/static/chunks/f9ef1d12f3c1646a.js" defer=""></script><script src="/_next/static/chunks/d65b8ba84ba3d819.js" defer=""></script><script src="/_next/static/chunks/cf6e515377591a1f.js" defer=""></script><script src="/_next/static/chunks/294d677a4838a994.js" defer=""></script><script src="/_next/static/bC3bTGQyq6cbRR_M7T8N6/_ssgManifest.js" defer=""></script><script src="/_next/static/bC3bTGQyq6cbRR_M7T8N6/_buildManifest.js" defer=""></script></head><body><div id="__next"><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error<!-- -->.</h2></div></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":500}},"page":"/_error","query":{},"buildId":"bC3bTGQyq6cbRR_M7T8N6","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
self.__RSC_SERVER_MANIFEST="{\n \"node\": {},\n \"edge\": {},\n \"encryptionKey\": \"
|
|
1
|
+
self.__RSC_SERVER_MANIFEST="{\n \"node\": {},\n \"edge\": {},\n \"encryptionKey\": \"kWbBlOfJtX/nx5xap++ZqATbD2be5EsCxEBRuZyaxzg=\"\n}"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
(globalThis.TURBOPACK=globalThis.TURBOPACK||[]).push(["object"==typeof document?document.currentScript:void 0,{},{otherChunks:["static/chunks/
|
|
1
|
+
(globalThis.TURBOPACK=globalThis.TURBOPACK||[]).push(["object"==typeof document?document.currentScript:void 0,{},{otherChunks:["static/chunks/cf6e515377591a1f.js","static/chunks/f9ef1d12f3c1646a.js"],runtimeModuleIds:[85445,90227]}]),(()=>{let e;if(!Array.isArray(globalThis.TURBOPACK))return;let t="/_next/",r=Symbol("reexported objects"),n=Object.prototype.hasOwnProperty,o="undefined"!=typeof Symbol&&Symbol.toStringTag;function l(e,t,r){n.call(e,t)||Object.defineProperty(e,t,r)}function u(e,t){for(let r in l(e,"__esModule",{value:!0}),o&&l(e,o,{value:"Module"}),t){let n=t[r];Array.isArray(n)?l(e,r,{get:n[0],set:n[1],enumerable:!0}):l(e,r,{get:n,enumerable:!0})}Object.seal(e)}function i(e,t,r){e.namespaceObject=e.exports,u(t,r)}function s(e,t,o){let l;(l=e[r])||(l=e[r]=[],e.exports=e.namespaceObject=new Proxy(t,{get(e,t){if(n.call(e,t)||"default"===t||"__esModule"===t)return Reflect.get(e,t);for(let e of l){let r=Reflect.get(e,t);if(void 0!==r)return r}},ownKeys(e){let t=Reflect.ownKeys(e);for(let e of l)for(let r of Reflect.ownKeys(e))"default"===r||t.includes(r)||t.push(r);return t}})),"object"==typeof o&&null!==o&&e[r].push(o)}function a(e,t){e.exports=t}function c(e,t){e.exports=e.namespaceObject=t}let f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,p=[null,f({}),f([]),f(f)];function d(e,t,r){let n=Object.create(null);for(let t=e;("object"==typeof t||"function"==typeof t)&&!p.includes(t);t=f(t))for(let r of Object.getOwnPropertyNames(t))n[r]=function(e,t){return()=>e[t]}(e,r);return r&&"default"in n||(n.default=()=>e),u(t,n),t}function h(e,t){let r=X(t,e);if(r.error)throw r.error;if(r.namespaceObject)return r.namespaceObject;let n=r.exports;return r.namespaceObject=d(n,"function"==typeof n?function(...e){return n.apply(this,e)}:Object.create(null),n&&n.__esModule)}let m="function"==typeof require?require:function(){throw Error("Unexpected use of runtime require")};function b(e,t){let r=X(t,e);if(r.error)throw r.error;return r.exports}function y(e){function t(t){if(n.call(e,t))return e[t].module();let r=Error(`Cannot find module '${t}'`);throw r.code="MODULE_NOT_FOUND",r}return t.keys=()=>Object.keys(e),t.resolve=t=>{if(n.call(e,t))return e[t].id();let r=Error(`Cannot find module '${t}'`);throw r.code="MODULE_NOT_FOUND",r},t.import=async e=>await t(e),t}function O(){let e,t;return{promise:new Promise((r,n)=>{t=n,e=r}),resolve:e,reject:t}}let g=Symbol("turbopack queues"),w=Symbol("turbopack exports"),R=Symbol("turbopack error");function j(e){e&&1!==e.status&&(e.status=1,e.forEach(e=>e.queueCount--),e.forEach(e=>e.queueCount--?e.queueCount++:e()))}function U(e,t,r){let n=r?Object.assign([],{status:-1}):void 0,o=new Set,{resolve:l,reject:u,promise:i}=O(),s=Object.assign(i,{[w]:e.exports,[g]:e=>{n&&e(n),o.forEach(e),s.catch(()=>{})}}),a={get:()=>s,set(e){e!==s&&(s[w]=e)}};Object.defineProperty(e,"exports",a),Object.defineProperty(e,"namespaceObject",a),t(function(e){let t=e.map(e=>{if(null!==e&&"object"==typeof e){if(g in e)return e;if(null!=e&&"object"==typeof e&&"then"in e&&"function"==typeof e.then){let t=Object.assign([],{status:0}),r={[w]:{},[g]:e=>e(t)};return e.then(e=>{r[w]=e,j(t)},e=>{r[R]=e,j(t)}),r}}return{[w]:e,[g]:()=>{}}}),r=()=>t.map(e=>{if(e[R])throw e[R];return e[w]}),{promise:l,resolve:u}=O(),i=Object.assign(()=>u(r),{queueCount:0});function s(e){e!==n&&!o.has(e)&&(o.add(e),e&&0===e.status&&(i.queueCount++,e.push(i)))}return t.map(e=>e[g](s)),i.queueCount?l:r()},function(e){e?u(s[R]=e):l(s[w]),j(n)}),n&&-1===n.status&&(n.status=0)}let C=function(e){let t=new URL(e,"x:/"),r={};for(let e in t)r[e]=t[e];for(let t in r.href=e,r.pathname=e.replace(/[?#].*/,""),r.origin=r.protocol="",r.toString=r.toJSON=(...t)=>e,r)Object.defineProperty(this,t,{enumerable:!0,configurable:!0,value:r[t]})};function k(e,t){throw Error(`Invariant: ${t(e)}`)}C.prototype=URL.prototype;var P=function(e){return e[e.Runtime=0]="Runtime",e[e.Parent=1]="Parent",e[e.Update=2]="Update",e}(P||{});let _=Object.create(null),$=new Set,T=new Map,v=new Map,S=new Map,A=new Map;async function E(e,t){let r;if("string"==typeof t)return K(e,t);let n=t.included||[],o=n.map(e=>!!_[e]||S.get(e));if(o.length>0&&o.every(e=>e))return Promise.all(o);let l=t.moduleChunks||[],u=l.map(e=>A.get(e)).filter(e=>e);if(u.length>0){if(u.length===l.length)return Promise.all(u);let t=new Set;for(let e of l)A.has(e)||t.add(e);for(let r of t){let t=K(e,r);A.set(r,t),u.push(t)}r=Promise.all(u)}else for(let n of(r=K(e,t.path),l))A.has(n)||A.set(n,r);for(let e of n)S.has(e)||S.set(e,r);return r}async function x(t,r){try{await e.loadChunk(r,t)}catch(n){let e;switch(t.type){case 0:e=`as a runtime dependency of chunk ${t.chunkPath}`;break;case 1:e=`from module ${t.parentId}`;break;case 2:e="from an HMR update";break;default:k(t,e=>`Unknown source type: ${e?.type}`)}throw Error(`Failed to load chunk ${r} ${e}${n?`: ${n}`:""}`,n?{cause:n}:void 0)}}async function K(e,t){return x(e,L(t))}function N(e){return`/ROOT/${e??""}`}function M(e){let t=new Blob([`self.TURBOPACK_WORKER_LOCATION = ${JSON.stringify(location.origin)};
|
|
2
2
|
self.TURBOPACK_NEXT_CHUNK_URLS = ${JSON.stringify(e.reverse().map(L),null,2)};
|
|
3
|
-
importScripts(...self.TURBOPACK_NEXT_CHUNK_URLS.map(c => self.TURBOPACK_WORKER_LOCATION + c).reverse());`],{type:"text/javascript"});return URL.createObjectURL(t)}function L(e){return`${t}${e.split("/").map(e=>encodeURIComponent(e)).join("/")}`}function I([r,n,o]){let l=function(e){if("string"==typeof e)return e;let r=decodeURIComponent(("undefined"!=typeof TURBOPACK_NEXT_CHUNK_URLS?TURBOPACK_NEXT_CHUNK_URLS.pop():e.getAttribute("src")).replace(/[?#].*$/,""));return r.startsWith(t)?r.slice(t.length):r}(r);for(let[e,t]of Object.entries(n))_[e]||(_[e]=t),function(e,t){let r=T.get(e);r?r.add(t):(r=new Set([t]),T.set(e,r));let n=v.get(t);n?n.add(e):(n=new Set([e]),v.set(t,n))}(e,l);return e.registerChunk(l,o)}let B=/\.js(?:\?[^#]*)?(?:#.*)?$/,q=/\.css(?:\?[^#]*)?(?:#.*)?$/;function H(e){return q.test(e)}let W={},X=(e,t)=>{let r=W[e];return r||D(e,{type:P.Parent,parentId:t.id})};function D(e,t){let r=_[e];if("function"!=typeof r){let r;switch(t.type){case P.Runtime:r=`as a runtime entry of chunk ${t.chunkPath}`;break;case P.Parent:r=`because it was required from module ${t.parentId}`;break;case P.Update:r="because of an HMR update";break;default:k(t,e=>`Unknown source type: ${e?.type}`)}throw Error(`Module ${e} was instantiated ${r}, but the module factory is not available. It might have been deleted in an HMR update.`)}switch(t.type){case P.Runtime:$.add(e);break;case P.Parent:break;case P.Update:throw Error("Unexpected");default:k(t,e=>`Unknown source type: ${e?.type}`)}let n={exports:{},error:void 0,loaded:!1,id:e,namespaceObject:void 0};W[e]=n;try{let t={type:P.Parent,parentId:e},o=
|
|
3
|
+
importScripts(...self.TURBOPACK_NEXT_CHUNK_URLS.map(c => self.TURBOPACK_WORKER_LOCATION + c).reverse());`],{type:"text/javascript"});return URL.createObjectURL(t)}function L(e){return`${t}${e.split("/").map(e=>encodeURIComponent(e)).join("/")}`}function I([r,n,o]){let l=function(e){if("string"==typeof e)return e;let r=decodeURIComponent(("undefined"!=typeof TURBOPACK_NEXT_CHUNK_URLS?TURBOPACK_NEXT_CHUNK_URLS.pop():e.getAttribute("src")).replace(/[?#].*$/,""));return r.startsWith(t)?r.slice(t.length):r}(r);for(let[e,t]of Object.entries(n))_[e]||(_[e]=t),function(e,t){let r=T.get(e);r?r.add(t):(r=new Set([t]),T.set(e,r));let n=v.get(t);n?n.add(e):(n=new Set([e]),v.set(t,n))}(e,l);return e.registerChunk(l,o)}let B=/\.js(?:\?[^#]*)?(?:#.*)?$/,q=/\.css(?:\?[^#]*)?(?:#.*)?$/;function H(e){return q.test(e)}let W={},X=(e,t)=>{let r=W[e];return r||D(e,{type:P.Parent,parentId:t.id})};function D(e,t){let r=_[e];if("function"!=typeof r){let r;switch(t.type){case P.Runtime:r=`as a runtime entry of chunk ${t.chunkPath}`;break;case P.Parent:r=`because it was required from module ${t.parentId}`;break;case P.Update:r="because of an HMR update";break;default:k(t,e=>`Unknown source type: ${e?.type}`)}throw Error(`Module ${e} was instantiated ${r}, but the module factory is not available. It might have been deleted in an HMR update.`)}switch(t.type){case P.Runtime:$.add(e);break;case P.Parent:break;case P.Update:throw Error("Unexpected");default:k(t,e=>`Unknown source type: ${e?.type}`)}let n={exports:{},error:void 0,loaded:!1,id:e,namespaceObject:void 0};W[e]=n;try{let t={type:P.Parent,parentId:e},o=b.bind(null,n);r.call(n.exports,{a:U.bind(null,n),e:n.exports,r:b.bind(null,n),t:m,f:y,i:h.bind(null,n),s:i.bind(null,n,n.exports),j:s.bind(null,n,n.exports),v:a.bind(null,n),n:c.bind(null,n),m:n,c:W,M:_,l:E.bind(null,t),L:x.bind(null,t),w:F.bind(null,t),u:J.bind(null,t),g:globalThis,P:N,U:C,R:function(e){let t=o(e);return t?.default??t},b:M,d:"string"==typeof n.id?n.id.replace(/(^|\/)\/+$/,""):n.id})}catch(e){throw n.error=e,e}return n.loaded=!0,n.namespaceObject&&n.exports!==n.namespaceObject&&d(n.exports,n.namespaceObject),n}async function F(e,t,r){let n=fetch(L(t)),{instance:o}=await WebAssembly.instantiateStreaming(n,r);return o.exports}async function J(e,t){let r=fetch(L(t));return await WebAssembly.compileStreaming(r)}let z=new Map;(()=>{function t(e){let t=z.get(e);if(!t){let r,n;t={resolved:!1,promise:new Promise((e,t)=>{r=e,n=t}),resolve:()=>{t.resolved=!0,r()},reject:n},z.set(e,t)}return t}e={async registerChunk(e,r){if(t(L(e)).resolve(),null!=r){for(let e of r.otherChunks)t(L("string"==typeof e?e:e.path));if(await Promise.all(r.otherChunks.map(t=>E({type:P.Runtime,chunkPath:e},t))),r.runtimeModuleIds.length>0)for(let t of r.runtimeModuleIds)!function(e,t){let r=W[e];if(r){if(r.error)throw r.error;return}D(e,{type:P.Runtime,chunkPath:t})}(t,e)}},loadChunk:(e,r)=>(function(e,r){let n=t(e);if(n.resolved)return n.promise;if(r.type===P.Runtime)return H(e)&&n.resolve(),n.promise;if("function"==typeof importScripts)if(H(e));else if(B.test(e))self.TURBOPACK_NEXT_CHUNK_URLS.push(e),importScripts(TURBOPACK_WORKER_LOCATION+e);else throw Error(`can't infer type of chunk from URL ${e} in worker`);else{let t=decodeURI(e);if(H(e))if(document.querySelectorAll(`link[rel=stylesheet][href="${e}"],link[rel=stylesheet][href^="${e}?"],link[rel=stylesheet][href="${t}"],link[rel=stylesheet][href^="${t}?"]`).length>0)n.resolve();else{let t=document.createElement("link");t.rel="stylesheet",t.href=e,t.onerror=()=>{n.reject()},t.onload=()=>{n.resolve()},document.body.appendChild(t)}else if(B.test(e)){let r=document.querySelectorAll(`script[src="${e}"],script[src^="${e}?"],script[src="${t}"],script[src^="${t}?"]`);if(r.length>0)for(let e of Array.from(r))e.addEventListener("error",()=>{n.reject()});else{let t=document.createElement("script");t.src=e,t.onerror=()=>{n.reject()},document.body.appendChild(t)}}else throw Error(`can't infer type of chunk from URL ${e}`)}return n.promise})(e,r)}})();let G=globalThis.TURBOPACK;globalThis.TURBOPACK={push:I},G.forEach(I)})();
|
|
4
4
|
|
|
5
5
|
//# sourceMappingURL=ebfa652ea6e39124.js.map
|