prime-dev-cli 1.0.11-beta.1 → 1.0.12-beta.1
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-build-manifest.json +5 -5
- 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/.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/app-build-manifest.json +1 -1
- package/dist/server/.next/server/app/_not-found/page_client-reference-manifest.js +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/current-branch/route/app-build-manifest.json +11 -0
- package/dist/server/.next/server/app/api/current-branch/route/app-paths-manifest.json +3 -0
- package/dist/server/.next/server/app/api/current-branch/route/build-manifest.json +17 -0
- package/dist/server/.next/server/app/api/current-branch/route/next-font-manifest.json +6 -0
- package/dist/server/.next/server/app/api/current-branch/route/react-loadable-manifest.json +1 -0
- package/dist/server/.next/server/app/api/current-branch/route/server-reference-manifest.json +4 -0
- package/dist/server/.next/server/app/api/current-branch/route.js +8 -0
- package/dist/server/.next/server/app/api/current-branch/route.js.map +5 -0
- package/dist/server/.next/server/app/api/current-branch/route.js.nft.json +1 -0
- package/dist/server/.next/server/app/api/current-branch/route_client-reference-manifest.js +2 -0
- 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/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/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/configuration/page/app-build-manifest.json +2 -2
- package/dist/server/.next/server/app/configuration/page.js.nft.json +1 -1
- package/dist/server/.next/server/app/configuration/page_client-reference-manifest.js +1 -1
- package/dist/server/.next/server/app/configuration.html +1 -1
- package/dist/server/.next/server/app/configuration.rsc +3 -3
- 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/app-build-manifest.json +1 -1
- package/dist/server/.next/server/app/initialization/page_client-reference-manifest.js +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/app-build-manifest.json +1 -1
- package/dist/server/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/server/.next/server/app-paths-manifest.json +1 -0
- package/dist/server/.next/server/chunks/{[root-of-the-server]__27f3b464._.js → [root-of-the-server]__07de450e._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__27f3b464._.js.map → [root-of-the-server]__07de450e._.js.map} +1 -1
- package/dist/server/.next/server/chunks/{[root-of-the-server]__ec631eb4._.js → [root-of-the-server]__09808308._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__ec631eb4._.js.map → [root-of-the-server]__09808308._.js.map} +1 -1
- package/dist/server/.next/server/chunks/{[root-of-the-server]__dfe36c1a._.js → [root-of-the-server]__09914a79._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__dfe36c1a._.js.map → [root-of-the-server]__09914a79._.js.map} +1 -1
- package/dist/server/.next/server/chunks/{[root-of-the-server]__c513ec4a._.js → [root-of-the-server]__42bc7b42._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__c513ec4a._.js.map → [root-of-the-server]__42bc7b42._.js.map} +1 -1
- package/dist/server/.next/server/chunks/{[root-of-the-server]__b68e0025._.js → [root-of-the-server]__4dc677cb._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__b68e0025._.js.map → [root-of-the-server]__4dc677cb._.js.map} +1 -1
- package/dist/server/.next/server/chunks/{[root-of-the-server]__92625851._.js → [root-of-the-server]__52d487d8._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__92625851._.js.map → [root-of-the-server]__52d487d8._.js.map} +1 -1
- package/dist/server/.next/server/chunks/{[root-of-the-server]__7a46f739._.js → [root-of-the-server]__582946e6._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__7a46f739._.js.map → [root-of-the-server]__582946e6._.js.map} +1 -1
- package/dist/server/.next/server/chunks/{[root-of-the-server]__0111ac14._.js → [root-of-the-server]__5cddc64c._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__0111ac14._.js.map → [root-of-the-server]__5cddc64c._.js.map} +1 -1
- package/dist/server/.next/server/chunks/{[root-of-the-server]__63462bcb._.js → [root-of-the-server]__802aba2d._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__63462bcb._.js.map → [root-of-the-server]__802aba2d._.js.map} +1 -1
- package/dist/server/.next/server/chunks/{[root-of-the-server]__9544d1f9._.js → [root-of-the-server]__837d58ae._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__9544d1f9._.js.map → [root-of-the-server]__837d58ae._.js.map} +1 -1
- package/dist/server/.next/server/chunks/{[root-of-the-server]__c43c9880._.js → [root-of-the-server]__933f7077._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__c43c9880._.js.map → [root-of-the-server]__933f7077._.js.map} +1 -1
- package/dist/server/.next/server/chunks/[root-of-the-server]__94e10604._.js +3 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__94e10604._.js.map +1 -0
- package/dist/server/.next/server/chunks/{[root-of-the-server]__84542811._.js → [root-of-the-server]__a6211ee0._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__84542811._.js.map → [root-of-the-server]__a6211ee0._.js.map} +1 -1
- package/dist/server/.next/server/chunks/{[root-of-the-server]__29969c0b._.js → [root-of-the-server]__aca25fcf._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__29969c0b._.js.map → [root-of-the-server]__aca25fcf._.js.map} +1 -1
- package/dist/server/.next/server/chunks/{[root-of-the-server]__3da8edfd._.js → [root-of-the-server]__be3de126._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__3da8edfd._.js.map → [root-of-the-server]__be3de126._.js.map} +1 -1
- package/dist/server/.next/server/chunks/{[root-of-the-server]__fab72f0c._.js → [root-of-the-server]__da89e112._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__fab72f0c._.js.map → [root-of-the-server]__da89e112._.js.map} +1 -1
- package/dist/server/.next/server/chunks/[root-of-the-server]__e07d75ff._.js +3 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__e07d75ff._.js.map +1 -0
- package/dist/server/.next/server/chunks/{[root-of-the-server]__1efea51d._.js → [root-of-the-server]__e301c560._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__1efea51d._.js.map → [root-of-the-server]__e301c560._.js.map} +1 -1
- package/dist/server/.next/server/chunks/{[root-of-the-server]__525f44e0._.js → [root-of-the-server]__ef09a48e._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__525f44e0._.js.map → [root-of-the-server]__ef09a48e._.js.map} +1 -1
- package/dist/server/.next/server/chunks/ssr/{_2488faea._.js → _bb352729._.js} +3 -3
- package/dist/server/.next/server/chunks/ssr/_bb352729._.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/static/chunks/{d5028315079b40b4.js → 2befba13bed43c5f.js} +1 -1
- package/dist/server/.next/static/chunks/344b0062191ace22.css.map +1 -0
- package/dist/server/.next/static/chunks/{249486689b72c55c.js → 4cbec079b6e3e189.js} +2 -2
- package/dist/server/.next/static/chunks/6c91d5f280e79a14.css +3 -0
- package/dist/server/.next/static/chunks/700389bfed628512.js +61 -0
- package/dist/server/.next/static/chunks/8d4c1c4e33fc41f3.js.map +1 -0
- package/dist/server/.next/static/chunks/{5e9dc9d078da6e2d.js.map → a898634af0862944.js.map} +1 -1
- package/dist/server/.next/static/chunks/{8d6bbd36cdf03018.js → d74cc70dd8ef74c9.js} +1 -1
- 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/lib/mock-file-utils.mjs +103 -0
- package/package.json +5 -3
- package/dist/server/.next/server/chunks/[root-of-the-server]__ec0f2f72._.js +0 -3
- package/dist/server/.next/server/chunks/[root-of-the-server]__ec0f2f72._.js.map +0 -1
- package/dist/server/.next/server/chunks/ssr/_2488faea._.js.map +0 -1
- package/dist/server/.next/static/chunks/1f1c09f06b1f73d5.css +0 -3
- package/dist/server/.next/static/chunks/4791e420776e4b33.js.map +0 -1
- package/dist/server/.next/static/chunks/76692beeeb707278.css.map +0 -1
- package/dist/server/.next/static/chunks/f99d8b48dbb26003.js +0 -61
- /package/dist/server/.next/static/{DiL7txnLfsR2XvLBEz06H → CockuVPN955YqCV3kRDYs}/_buildManifest.js +0 -0
- /package/dist/server/.next/static/{DiL7txnLfsR2XvLBEz06H → CockuVPN955YqCV3kRDYs}/_clientMiddlewareManifest.json +0 -0
- /package/dist/server/.next/static/{DiL7txnLfsR2XvLBEz06H → CockuVPN955YqCV3kRDYs}/_ssgManifest.js +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
module.exports={83886:function(e){var{g:t,__dirname:r,m:s,e:o}=e;s.exports=e.x("fs",()=>require("fs"))},45935:function(e){var{g:t,__dirname:r,m:s,e:o}=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"))},35692:e=>{"use strict";var{g:t,__dirname:r}=e;e.s({ProjectStatus:()=>a,getProjectsConfig:()=>n,saveProjectsConfig:()=>i});var s=e.i(9892),o=e.i(88941);async function n(){try{await (0,s.access)(o.PROJECT_CONFIG_PATH,s.constants.F_OK)}catch{return await i({}),{}}try{let e=await (0,s.readFile)(o.PROJECT_CONFIG_PATH,"utf-8");if(!e)return{};return JSON.parse(e)}catch(e){throw console.error("读取或解析项目配置文件失败:",e),Error("无法加载项目配置")}}async function i(e){let t=o.PROJECT_CONFIG_PATH+".tmp";try{await (0,s.writeFile)(t,JSON.stringify(e,null,2),"utf-8"),await (0,s.rename)(t,o.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}({})},
|
|
1
|
+
module.exports={83886:function(e){var{g:t,__dirname:r,m:s,e:o}=e;s.exports=e.x("fs",()=>require("fs"))},45935:function(e){var{g:t,__dirname:r,m:s,e:o}=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"))},35692:e=>{"use strict";var{g:t,__dirname:r}=e;e.s({ProjectStatus:()=>a,getProjectsConfig:()=>n,saveProjectsConfig:()=>i});var s=e.i(9892),o=e.i(88941);async function n(){try{await (0,s.access)(o.PROJECT_CONFIG_PATH,s.constants.F_OK)}catch{return await i({}),{}}try{let e=await (0,s.readFile)(o.PROJECT_CONFIG_PATH,"utf-8");if(!e)return{};return JSON.parse(e)}catch(e){throw console.error("读取或解析项目配置文件失败:",e),Error("无法加载项目配置")}}async function i(e){let t=o.PROJECT_CONFIG_PATH+".tmp";try{await (0,s.writeFile)(t,JSON.stringify(e,null,2),"utf-8"),await (0,s.rename)(t,o.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}({})},29549:function(e){var{g:t,__dirname:r,m:s,e:o}=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:t,__dirname:r,m:s,e:o}=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:t,__dirname:r,m:s,e:o}=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:t,__dirname:r,m:s,e:o}=e;s.exports=e.x("path",()=>require("path"))},23430:function(e){var{g:t,__dirname:r,m:s,e:o}=e;s.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},13442:function(e){var{g:t,__dirname:r,m:s,e:o}=e;s.exports=e.x("os",()=>require("os"))},52670:function(e){var{g:t,__dirname:r,m:s,e:o}=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"))},88941:e=>{"use strict";var{g:t,__dirname:r}=e;{e.s({PROJECT_CONFIG_PATH:()=>r,ProjectStatus:()=>n,WORKSPACE_CONFIG:()=>t});var s=e.i(13442),o=e.i(30331);let t={WORKSPACE_ROOT:(0,o.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},r=(0,o.join)((0,s.homedir)(),".prime-projects.json");var n=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}({})}},9892:function(e){var{g:t,__dirname:r,m:s,e:o}=e;s.exports=e.x("fs/promises",()=>require("fs/promises"))},15650:function(e){var{g:t,__dirname:r,m:s,e:o}=e;s.exports=e.x("module",()=>require("module"))},21340:function(e){var{g:t,__dirname:r,m:s,e:o}=e},17228:e=>{"use strict";var{g:t,__dirname:r}=e;{e.s({PUT:()=>c});var s=e.i(15494),o=e.i(83886),n=e.i(30331),i=e.i(35692),a=e.i(88941);let t=(0,e.i(15650).createRequire)({get url(){return`file://${e.P("packages/server/src/app/api/mock-open-status/route.ts")}`}}.url);async function c(e){try{let{projectName:r,apiName:c,method:u,siteName:p,isOpen:l}=await e.json();if(!r||!c||!u||!p||"boolean"!=typeof l)return s.NextResponse.json({success:!1,error:"缺少必要参数:projectName, apiName, method, siteName, isOpen"},{status:400});if(!(await (0,i.getProjectsConfig)())[r])return s.NextResponse.json({success:!1,error:`项目 ${r} 不存在`},{status:404});let m=(0,n.join)(a.WORKSPACE_CONFIG.WORKSPACE_ROOT,r),x=(0,n.join)(m,".mock",c,u.toLowerCase(),"setting.cjs");try{await o.promises.access(x)}catch{return s.NextResponse.json({success:!1,error:"setting.cjs文件不存在"},{status:404})}let g={};try{let e=(0,n.resolve)(x);delete t.cache[e],g=t(e)}catch(e){console.warn(`解析setting.cjs失败: ${x}`,e)}Array.isArray(g.open)||(g.open=[]);let d=g.open,f=d.indexOf(p);l?-1===f&&d.push(p):-1!==f&&d.splice(f,1);let v=`module.exports = {
|
|
2
2
|
// 当前场景名称
|
|
3
3
|
currentSite: '${g.currentSite||p}',
|
|
4
4
|
// 开启Mock的场景列表
|
|
5
5
|
open: ${JSON.stringify(d)}
|
|
6
6
|
};`;return await o.promises.writeFile(x,v,"utf-8"),s.NextResponse.json({success:!0,message:"Mock开启状态更新成功",data:{projectName:r,apiName:c,method:u.toLowerCase(),siteName:p,isOpen:l,openSites:d,filePath:(0,n.join)(".mock",c,u.toLowerCase(),"setting.cjs"),updatedAt:new Date().toISOString()}})}catch(t){let e=t instanceof Error?t.message:"更新Mock开启状态失败";return console.error("更新Mock开启状态失败:",t),s.NextResponse.json({success:!1,error:e},{status:500})}}}},40178:e=>{"use strict";var{g:t,__dirname:r}=e;{e.s({patchFetch:()=>a,routeModule:()=>t,serverHooks:()=>u,workAsyncStorage:()=>r,workUnitAsyncStorage:()=>c});var s=e.i(45746),o=e.i(93828),n=e.i(18250),i=e.i(17228);let t=new s.AppRouteRouteModule({definition:{kind:o.RouteKind.APP_ROUTE,page:"/api/mock-open-status/route",pathname:"/api/mock-open-status",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/mock-open-status/route.ts",nextConfigOutput:"",userland:i}),{workAsyncStorage:r,workUnitAsyncStorage:c,serverHooks:u}=t;function a(){return(0,n.patchFetch)({workAsyncStorage:r,workUnitAsyncStorage:c})}}}};
|
|
7
7
|
|
|
8
|
-
//# sourceMappingURL=%5Broot-of-the-server%
|
|
8
|
+
//# sourceMappingURL=%5Broot-of-the-server%5D__a6211ee0._.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["turbopack:///[project]/packages/server/src/lib/workspace-config.ts","turbopack:///[project]/packages/server/src/lib/workspace-types.ts","turbopack:///[project]/packages/server/src/app/api/mock-open-status/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 { 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 { 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 { NextRequest, NextResponse } from 'next/server';\nimport { promises as fs } from 'fs';\nimport { join, resolve } from 'path';\nimport { getProjectsConfig } from '@/lib/workspace-config';\nimport { WORKSPACE_CONFIG } from '@/lib/workspace-types';\nimport { createRequire } from \"module\";\nconst require = createRequire(import.meta.url);\n\nexport async function PUT(request: NextRequest) {\n try {\n // 解析请求体\n const { projectName, apiName, method, siteName, isOpen } = await request.json();\n\n // 参数验证\n if (!projectName || !apiName || !method || !siteName || typeof isOpen !== 'boolean') {\n return NextResponse.json(\n {\n success: false,\n error: '缺少必要参数:projectName, apiName, method, siteName, isOpen',\n },\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 // 构建setting.cjs文件路径\n const projectPath = join(WORKSPACE_CONFIG.WORKSPACE_ROOT, projectName);\n const settingFilePath = join(projectPath, '.mock', apiName, method.toLowerCase(), 'setting.cjs');\n\n // 检查setting.cjs文件是否存在\n try {\n await fs.access(settingFilePath);\n } catch {\n return NextResponse.json(\n { success: false, error: 'setting.cjs文件不存在' },\n { status: 404 },\n );\n }\n\n // 使用require直接导入setting.cjs\n let currentConfig: { \n currentSite?: string; \n open?: string[];\n [key: string]: unknown \n } = {};\n \n try {\n const resolvedPath = resolve(settingFilePath);\n delete require.cache[resolvedPath];\n \n currentConfig = require(resolvedPath);\n } catch (parseError) {\n console.warn(`解析setting.cjs失败: ${settingFilePath}`, parseError);\n }\n\n // 确保open数组存在\n if (!Array.isArray(currentConfig.open)) {\n currentConfig.open = [];\n }\n\n // 更新open数组\n const openArray = currentConfig.open;\n const siteIndex = openArray.indexOf(siteName);\n \n if (isOpen) {\n // 开启Mock:如果场景不在数组中,则添加\n if (siteIndex === -1) {\n openArray.push(siteName);\n }\n } else {\n // 关闭Mock:如果场景在数组中,则移除\n if (siteIndex !== -1) {\n openArray.splice(siteIndex, 1);\n }\n }\n\n // 生成新的文件内容\n const newContent = `module.exports = {\n // 当前场景名称\n currentSite: '${currentConfig.currentSite || siteName}',\n // 开启Mock的场景列表\n open: ${JSON.stringify(openArray)}\n};`;\n\n // 写入文件\n await fs.writeFile(settingFilePath, newContent, 'utf-8');\n\n return NextResponse.json({\n success: true,\n message: 'Mock开启状态更新成功',\n data: {\n projectName,\n apiName,\n method: method.toLowerCase(),\n siteName,\n isOpen,\n openSites: openArray,\n filePath: join('.mock', apiName, method.toLowerCase(), 'setting.cjs'),\n updatedAt: new Date().toISOString(),\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} ","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-config.ts","turbopack:///[project]/packages/server/src/lib/workspace-types.ts","turbopack:///[project]/packages/server/src/app/api/mock-open-status/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 { 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 { 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 { NextRequest, NextResponse } from 'next/server';\nimport { promises as fs } from 'fs';\nimport { join, resolve } from 'path';\nimport { getProjectsConfig } from '@/lib/workspace-config';\nimport { WORKSPACE_CONFIG } from '@/lib/workspace-types';\nimport { createRequire } from \"module\";\nconst require = createRequire(import.meta.url);\n\nexport async function PUT(request: NextRequest) {\n try {\n // 解析请求体\n const { projectName, apiName, method, siteName, isOpen } = await request.json();\n\n // 参数验证\n if (!projectName || !apiName || !method || !siteName || typeof isOpen !== 'boolean') {\n return NextResponse.json(\n {\n success: false,\n error: '缺少必要参数:projectName, apiName, method, siteName, isOpen',\n },\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 // 构建setting.cjs文件路径\n const projectPath = join(WORKSPACE_CONFIG.WORKSPACE_ROOT, projectName);\n const settingFilePath = join(projectPath, '.mock', apiName, method.toLowerCase(), 'setting.cjs');\n\n // 检查setting.cjs文件是否存在\n try {\n await fs.access(settingFilePath);\n } catch {\n return NextResponse.json(\n { success: false, error: 'setting.cjs文件不存在' },\n { status: 404 },\n );\n }\n\n // 使用require直接导入setting.cjs\n let currentConfig: { \n currentSite?: string; \n open?: string[];\n [key: string]: unknown \n } = {};\n \n try {\n const resolvedPath = resolve(settingFilePath);\n delete require.cache[resolvedPath];\n \n currentConfig = require(resolvedPath);\n } catch (parseError) {\n console.warn(`解析setting.cjs失败: ${settingFilePath}`, parseError);\n }\n\n // 确保open数组存在\n if (!Array.isArray(currentConfig.open)) {\n currentConfig.open = [];\n }\n\n // 更新open数组\n const openArray = currentConfig.open;\n const siteIndex = openArray.indexOf(siteName);\n \n if (isOpen) {\n // 开启Mock:如果场景不在数组中,则添加\n if (siteIndex === -1) {\n openArray.push(siteName);\n }\n } else {\n // 关闭Mock:如果场景在数组中,则移除\n if (siteIndex !== -1) {\n openArray.splice(siteIndex, 1);\n }\n }\n\n // 生成新的文件内容\n const newContent = `module.exports = {\n // 当前场景名称\n currentSite: '${currentConfig.currentSite || siteName}',\n // 开启Mock的场景列表\n open: ${JSON.stringify(openArray)}\n};`;\n\n // 写入文件\n await fs.writeFile(settingFilePath, newContent, 'utf-8');\n\n return NextResponse.json({\n success: true,\n message: 'Mock开启状态更新成功',\n data: {\n projectName,\n apiName,\n method: method.toLowerCase(),\n siteName,\n isOpen,\n openSites: openArray,\n filePath: join('.mock', apiName, method.toLowerCase(), 'setting.cjs'),\n updatedAt: new Date().toISOString(),\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} ","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,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"))},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}({})},
|
|
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"))},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}({})},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"))},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}({})}},9892:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("fs/promises",()=>require("fs/promises"))},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__aca25fcf._.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["turbopack:///[project]/packages/server/src/lib/workspace-config.ts","turbopack:///[project]/packages/server/src/lib/workspace-types.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 { 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 { 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 { 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":"sbAAA,IAAA,EAAA,EAAA,CAAA,CAAA,MAEA,EAAA,EAAA,CAAA,CAAA,OAMO,eAAe,IACpB,GAAI,CACF,MAAM,CAAA,EAAA,EAAA,MAAA,AAAK,EAAE,EAAA,mBAAmB,CAAE,EAAA,GAA5B,MAAqC,CAAC,IAAI,AAAnC,CACf,CAAE,KAAM,CAGN,OADA,MAHkC,AAG5B,EAAmB,CAAC,GACnB,CAAC,CACV,CAEA,GAAI,CACF,IAAM,EAAgB,MAAM,CAAA,EAAA,EAAA,QAAO,AAAP,EAAS,EAAA,mBAAmB,CAAE,GAA9B,MAE5B,GAAI,CAAC,EACH,CAHmC,KAG5B,CAAC,EAEV,IAHoB,GAGb,KAAK,KAAK,CAAC,EACpB,CAAE,MAAO,EAAO,CAGd,MAFA,QAAQ,KAAK,CAAC,iBAAkB,GAE1B,AAAI,MAAM,WAClB,CACF,CAMO,eAAe,EAAmB,CAAsB,EAC7D,IAAM,EAAiB,EAAA,mBAAmB,CAAG,OAC7C,GAAI,CACF,KAFqB,CAEf,CAAA,EAAA,EAAA,SAAA,AAAQ,EAAE,EAAgB,KAAK,SAAS,CAAC,EAAQ,KAAM,AAAvD,GAA2D,SACjE,MAAM,CAAA,EAAA,EAAA,MAAA,AAAK,EAAE,EAAgB,EAAA,mBAAmB,CAClD,CAAE,EADM,IACC,EAAO,CAEd,MADA,AAF6B,QAErB,KAAK,CAAC,cAAe,GACvB,AAAI,MAAM,WAClB,CACF,CAKO,IAAK,EAAA,SAAA,CAAA,mIAAA,mICjDZ,IAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAKO,IAAM,EAAmB,CAE9B,eAAgB,CAAA,EAAA,EAAA,IAAA,AAAG,EAAE,CAAA,EAAA,EAAA,OAAA,AAAM,IAAK,YAAa,EAA7B,WAAK,MAGrB,YAAa,IAGb,sBAAuB,KAAK,GAAG,CAAC,EAAG,KAAK,GAAG,CAAC,CAAA,EAAA,EAAA,IAAA,AAAG,IAAI,MAAM,CAAE,IAG3D,iBAH4C,EAGxB,CACtB,EAEa,EAAsB,CAAA,EAAA,EAAA,IAAA,AAAG,EAAE,GAAA,EAAA,OAAA,AAAM,IAAK,cAAhB,UA2B5B,CA3BiC,GA2B5B,EAAA,SAAA,CAAA,6JAAA,g3CC/CZ,IAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAEO,eAAe,EAAO,CAAoB,EAC/C,GAAI,CACF,GAAM,cAAE,CAAY,CAAE,CAAG,IAAI,IAAI,EAAQ,GAAG,EACtC,EAAc,EAAa,GAAG,CAAC,WAC/B,EAAU,EAAa,GAAG,CAAC,WAEjC,GAAI,CAAC,GAAe,CAAC,EACnB,OAD4B,AACrB,EAAA,YAAY,CAAC,IAAI,CACtB,CAAE,SAAS,EAAO,MAAO,AADpB,yBAC8C,EACnD,CAAE,OAAQ,GAAI,GAMlB,GAAI,CAAC,CADkB,MAAM,CAAA,EAAA,EAAA,iBAAA,AAAgB,GAAA,CAC1B,CAAC,EAAY,CAC9B,CADgC,MACzB,EAAA,EAFoB,UAER,CAAC,IAAI,CACtB,CAAE,SAAS,EAAO,MADb,AACoB,CAAC,GAAG,EAAE,EAAY,IAAI,CAAC,AAAC,EACjD,CAAE,OAAQ,GAAI,GAKlB,IAAM,EAAc,CAAA,EAAA,EAAA,IAAA,AAAG,EAAE,EAAA,gBAAgB,CAAC,WAAtB,GAAoC,CAAE,GACpD,CADmB,CACT,CAAA,EAAA,EAAA,IAAA,AAAG,EAAE,EAAa,QAAS,GAG3C,GAAI,CACF,MAAM,EAAA,KAJQ,GAIN,CAAC,MAAM,CAAC,EAClB,CAAE,KAAM,CACN,OAAO,EAAA,EAFD,UAEa,CAAC,IAAI,CACtB,CAAE,SAAS,EAAO,MAAO,AADpB,aACkC,EACvC,CAAE,OAAQ,GAAI,EAElB,CAGA,MAAM,EAAA,QAAE,CAAC,KAAK,CAAC,EAAS,CAAE,WAAW,CAAK,GAG1C,GAHM,CAGA,EAAW,CAAA,EAAA,EAAA,IAAA,AAAG,EAAE,EAAa,SACnC,GAAI,CACF,IAAM,EAAY,MAAM,EAAA,CAFT,OAEW,CAAC,OAAO,CAAC,GACV,GAAG,CAAxB,EAAU,MAAM,EAClB,EAFsB,IAEhB,EAAA,QAAE,CAAC,KAAK,CAAC,EAEnB,CAAE,KAAM,CAER,CAEA,OAAO,EAAA,EANG,UAMS,CAAC,IAAI,CAAC,CACvB,SAAS,EACT,MAFK,EAEI,aACT,KAAM,aACJ,UACA,EACA,YAAa,CAAA,EAAA,EAAA,IAAA,AAAG,EAAE,QAAS,EAC7B,CACF,EACF,CAAE,MAAO,EAAO,CACd,IAAM,EAAe,CAJJ,YAIqB,MAAQ,EAAM,OAAO,CAAG,aAE9D,OADA,QAAQ,KAAK,CAAC,cAAe,GACtB,EAAA,YAAY,CAAC,IAAI,CACtB,CAAE,SAAS,EAAO,MADb,AACoB,CAAa,EACtC,CAAE,OAAQ,GAAI,EAElB,CACF,gKCzEA,IAAA,EAGO,EAAA,CAFLA,AAEK,CAAA,OACP,EAA0B,EAAyB,CAA1CC,AAA0C,CAAA,GAAA,EAH9B,EAIrB,CADkB,CAD2C,AAEnB,EAAA,CAAA,AAAjCC,CAFF,AAEmC,GADhB,CAC8C,GAExE,EAAwC,EAAA,CAAA,CAFjBC,AAEiB,EAA5BC,KAWZ,IAbkC,AAa5BC,EAAc,GAXM,CAWN,EAbsB,AAalBL,YAXgB,OAWhBA,CAAoB,CAC1CM,WAAY,CACVC,KAAMN,EAAAA,SAAAA,CAAUO,SAAS,CACzBC,KAAM,6BACNC,SAAU,uBACVC,SAAU,QACVC,WAAY,EACd,EACAC,iBAAkB,iEAClBC,iBAXF,CAA0B,WAYxBV,CACF,GAKM,kBAAEW,CAAgB,sBAAEC,CAAoB,aAAEC,CAAW,CAAE,CAAGZ,EAEhE,SAASH,IACP,MAAA,CAAA,EAAA,EAAOC,UAAAA,EAAY,kBACjBY,uBACAC,CACF,EACF","ignoreList":[3]}
|
|
1
|
+
{"version":3,"sources":["turbopack:///[project]/packages/server/src/lib/workspace-config.ts","turbopack:///[project]/packages/server/src/lib/workspace-types.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 { 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 { 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 { 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,3 +1,3 @@
|
|
|
1
|
-
module.exports={83886:function(e){var{g:t,__dirname:r,m:s,e:o}=e;s.exports=e.x("fs",()=>require("fs"))},45935:function(e){var{g:t,__dirname:r,m:s,e:o}=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"))},35692:e=>{"use strict";var{g:t,__dirname:r}=e;e.s({ProjectStatus:()=>i,getProjectsConfig:()=>n,saveProjectsConfig:()=>a});var s=e.i(9892),o=e.i(88941);async function n(){try{await (0,s.access)(o.PROJECT_CONFIG_PATH,s.constants.F_OK)}catch{return await a({}),{}}try{let e=await (0,s.readFile)(o.PROJECT_CONFIG_PATH,"utf-8");if(!e)return{};return JSON.parse(e)}catch(e){throw console.error("读取或解析项目配置文件失败:",e),Error("无法加载项目配置")}}async function a(e){let t=o.PROJECT_CONFIG_PATH+".tmp";try{await (0,s.writeFile)(t,JSON.stringify(e,null,2),"utf-8"),await (0,s.rename)(t,o.PROJECT_CONFIG_PATH)}catch(e){throw console.error("保存项目配置文件失败:",e),Error("无法保存项目配置")}}var i=function(e){return e.PENDING="pending",e.EXISTING="existing",e.CLONING="cloning",e.SUCCESS="success",e.FAILED="failed",e.RETRYING="retrying",e}({})},
|
|
1
|
+
module.exports={83886:function(e){var{g:t,__dirname:r,m:s,e:o}=e;s.exports=e.x("fs",()=>require("fs"))},45935:function(e){var{g:t,__dirname:r,m:s,e:o}=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"))},35692:e=>{"use strict";var{g:t,__dirname:r}=e;e.s({ProjectStatus:()=>i,getProjectsConfig:()=>n,saveProjectsConfig:()=>a});var s=e.i(9892),o=e.i(88941);async function n(){try{await (0,s.access)(o.PROJECT_CONFIG_PATH,s.constants.F_OK)}catch{return await a({}),{}}try{let e=await (0,s.readFile)(o.PROJECT_CONFIG_PATH,"utf-8");if(!e)return{};return JSON.parse(e)}catch(e){throw console.error("读取或解析项目配置文件失败:",e),Error("无法加载项目配置")}}async function a(e){let t=o.PROJECT_CONFIG_PATH+".tmp";try{await (0,s.writeFile)(t,JSON.stringify(e,null,2),"utf-8"),await (0,s.rename)(t,o.PROJECT_CONFIG_PATH)}catch(e){throw console.error("保存项目配置文件失败:",e),Error("无法保存项目配置")}}var i=function(e){return e.PENDING="pending",e.EXISTING="existing",e.CLONING="cloning",e.SUCCESS="success",e.FAILED="failed",e.RETRYING="retrying",e}({})},29549:function(e){var{g:t,__dirname:r,m:s,e:o}=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:t,__dirname:r,m:s,e:o}=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:t,__dirname:r,m:s,e:o}=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:t,__dirname:r,m:s,e:o}=e;s.exports=e.x("path",()=>require("path"))},23430:function(e){var{g:t,__dirname:r,m:s,e:o}=e;s.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},13442:function(e){var{g:t,__dirname:r,m:s,e:o}=e;s.exports=e.x("os",()=>require("os"))},52670:function(e){var{g:t,__dirname:r,m:s,e:o}=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"))},88941:e=>{"use strict";var{g:t,__dirname:r}=e;{e.s({PROJECT_CONFIG_PATH:()=>r,ProjectStatus:()=>n,WORKSPACE_CONFIG:()=>t});var s=e.i(13442),o=e.i(30331);let t={WORKSPACE_ROOT:(0,o.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},r=(0,o.join)((0,s.homedir)(),".prime-projects.json");var n=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}({})}},9892:function(e){var{g:t,__dirname:r,m:s,e:o}=e;s.exports=e.x("fs/promises",()=>require("fs/promises"))},8773:function(e){var{g:t,__dirname:r,m:s,e:o}=e},55859:e=>{"use strict";var{g:t,__dirname:r}=e;e.s({GET:()=>c,PUT:()=>u});var s=e.i(15494),o=e.i(83886),n=e.i(30331),a=e.i(35692),i=e.i(88941);async function c(e){try{let{searchParams:t}=new URL(e.url),r=t.get("project"),c=t.get("apiName"),u=t.get("method"),p=t.get("siteName");if(!r||!c||!u||!p)return s.NextResponse.json({success:!1,error:"缺少必要参数:project, apiName, method, siteName"},{status:400});if(!(await (0,a.getProjectsConfig)())[r])return s.NextResponse.json({success:!1,error:`项目 ${r} 不存在`},{status:404});let m=(0,n.join)(i.WORKSPACE_CONFIG.WORKSPACE_ROOT,r),x=(0,n.join)(m,".mock",c,u.toLowerCase(),`${p}.cjs`);try{await o.promises.access(x)}catch{return s.NextResponse.json({success:!1,error:"Mock文件不存在"},{status:404})}let d=await o.promises.readFile(x,"utf-8");return s.NextResponse.json({success:!0,data:{projectName:r,apiName:c,method:u.toLowerCase(),siteName:p,content:d,filePath:(0,n.join)(".mock",c,u.toLowerCase(),`${p}.cjs`)},message:"获取Mock文件内容成功"})}catch(t){let e=t instanceof Error?t.message:"获取Mock文件内容失败";return console.error("获取Mock文件内容失败:",t),s.NextResponse.json({success:!1,error:e},{status:500})}}async function u(e){try{let{projectName:t,apiName:r,method:c,siteName:u,content:p}=await e.json();if(!t||!r||!c||!u||void 0===p)return s.NextResponse.json({success:!1,error:"缺少必要参数:projectName, apiName, method, siteName, content"},{status:400});if(!(await (0,a.getProjectsConfig)())[t])return s.NextResponse.json({success:!1,error:`项目 ${t} 不存在`},{status:404});let m=(0,n.join)(i.WORKSPACE_CONFIG.WORKSPACE_ROOT,t),x=(0,n.join)(m,".mock",r,c.toLowerCase(),`${u}.cjs`);try{await o.promises.access(x)}catch{return s.NextResponse.json({success:!1,error:"Mock文件不存在"},{status:404})}return await o.promises.writeFile(x,p,"utf-8"),s.NextResponse.json({success:!0,message:"Mock文件内容更新成功",data:{projectName:t,apiName:r,method:c.toLowerCase(),siteName:u,filePath:(0,n.join)(".mock",r,c.toLowerCase(),`${u}.cjs`),updatedAt:new Date().toISOString()}})}catch(t){let e=t instanceof Error?t.message:"更新Mock文件内容失败";return console.error("更新Mock文件内容失败:",t),s.NextResponse.json({success:!1,error:e},{status:500})}}},19627:e=>{"use strict";var{g:t,__dirname:r}=e;{e.s({patchFetch:()=>i,routeModule:()=>t,serverHooks:()=>u,workAsyncStorage:()=>r,workUnitAsyncStorage:()=>c});var s=e.i(45746),o=e.i(93828),n=e.i(18250),a=e.i(55859);let t=new s.AppRouteRouteModule({definition:{kind:o.RouteKind.APP_ROUTE,page:"/api/mock-file-content/route",pathname:"/api/mock-file-content",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/mock-file-content/route.ts",nextConfigOutput:"",userland:a}),{workAsyncStorage:r,workUnitAsyncStorage:c,serverHooks:u}=t;function i(){return(0,n.patchFetch)({workAsyncStorage:r,workUnitAsyncStorage:c})}}}};
|
|
2
2
|
|
|
3
|
-
//# sourceMappingURL=%5Broot-of-the-server%
|
|
3
|
+
//# sourceMappingURL=%5Broot-of-the-server%5D__be3de126._.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["turbopack:///[project]/packages/server/src/lib/workspace-config.ts","turbopack:///[project]/packages/server/src/lib/workspace-types.ts","turbopack:///[project]/packages/server/src/app/api/mock-file-content/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 { 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 { 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 { 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 GET(request: NextRequest) {\n try {\n const { searchParams } = new URL(request.url);\n const projectName = searchParams.get('project');\n const apiName = searchParams.get('apiName');\n const method = searchParams.get('method');\n const siteName = searchParams.get('siteName');\n\n if (!projectName || !apiName || !method || !siteName) {\n return NextResponse.json(\n { success: false, error: '缺少必要参数:project, apiName, method, siteName' },\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 // 构建文件路径\n const projectPath = join(WORKSPACE_CONFIG.WORKSPACE_ROOT, projectName);\n const filePath = join(projectPath, '.mock', apiName, method.toLowerCase(), `${siteName}.cjs`);\n\n // 检查文件是否存在\n try {\n await fs.access(filePath);\n } catch {\n return NextResponse.json(\n { success: false, error: 'Mock文件不存在' },\n { status: 404 },\n );\n }\n\n // 读取文件内容\n const content = await fs.readFile(filePath, 'utf-8');\n\n return NextResponse.json({\n success: true,\n data: {\n projectName,\n apiName,\n method: method.toLowerCase(),\n siteName,\n content,\n filePath: join('.mock', apiName, method.toLowerCase(), `${siteName}.cjs`),\n },\n message: '获取Mock文件内容成功',\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\nexport async function PUT(request: NextRequest) {\n try {\n // 解析请求体\n const { projectName, apiName, method, siteName, content } = await request.json();\n\n // 参数验证\n if (!projectName || !apiName || !method || !siteName || content === undefined) {\n return NextResponse.json(\n {\n success: false,\n error: '缺少必要参数:projectName, apiName, method, siteName, content',\n },\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 // 构建文件路径\n const projectPath = join(WORKSPACE_CONFIG.WORKSPACE_ROOT, projectName);\n const filePath = join(projectPath, '.mock', apiName, method.toLowerCase(), `${siteName}.cjs`);\n\n // 检查文件是否存在\n try {\n await fs.access(filePath);\n } catch {\n return NextResponse.json(\n { success: false, error: 'Mock文件不存在' },\n { status: 404 },\n );\n }\n\n // 写入文件内容\n await fs.writeFile(filePath, content, 'utf-8');\n\n return NextResponse.json({\n success: true,\n message: 'Mock文件内容更新成功',\n data: {\n projectName,\n apiName,\n method: method.toLowerCase(),\n siteName,\n filePath: join('.mock', apiName, method.toLowerCase(), `${siteName}.cjs`),\n updatedAt: new Date().toISOString(),\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} ","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-config.ts","turbopack:///[project]/packages/server/src/lib/workspace-types.ts","turbopack:///[project]/packages/server/src/app/api/mock-file-content/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 { 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 { 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 { 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 GET(request: NextRequest) {\n try {\n const { searchParams } = new URL(request.url);\n const projectName = searchParams.get('project');\n const apiName = searchParams.get('apiName');\n const method = searchParams.get('method');\n const siteName = searchParams.get('siteName');\n\n if (!projectName || !apiName || !method || !siteName) {\n return NextResponse.json(\n { success: false, error: '缺少必要参数:project, apiName, method, siteName' },\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 // 构建文件路径\n const projectPath = join(WORKSPACE_CONFIG.WORKSPACE_ROOT, projectName);\n const filePath = join(projectPath, '.mock', apiName, method.toLowerCase(), `${siteName}.cjs`);\n\n // 检查文件是否存在\n try {\n await fs.access(filePath);\n } catch {\n return NextResponse.json(\n { success: false, error: 'Mock文件不存在' },\n { status: 404 },\n );\n }\n\n // 读取文件内容\n const content = await fs.readFile(filePath, 'utf-8');\n\n return NextResponse.json({\n success: true,\n data: {\n projectName,\n apiName,\n method: method.toLowerCase(),\n siteName,\n content,\n filePath: join('.mock', apiName, method.toLowerCase(), `${siteName}.cjs`),\n },\n message: '获取Mock文件内容成功',\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\nexport async function PUT(request: NextRequest) {\n try {\n // 解析请求体\n const { projectName, apiName, method, siteName, content } = await request.json();\n\n // 参数验证\n if (!projectName || !apiName || !method || !siteName || content === undefined) {\n return NextResponse.json(\n {\n success: false,\n error: '缺少必要参数:projectName, apiName, method, siteName, content',\n },\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 // 构建文件路径\n const projectPath = join(WORKSPACE_CONFIG.WORKSPACE_ROOT, projectName);\n const filePath = join(projectPath, '.mock', apiName, method.toLowerCase(), `${siteName}.cjs`);\n\n // 检查文件是否存在\n try {\n await fs.access(filePath);\n } catch {\n return NextResponse.json(\n { success: false, error: 'Mock文件不存在' },\n { status: 404 },\n );\n }\n\n // 写入文件内容\n await fs.writeFile(filePath, content, 'utf-8');\n\n return NextResponse.json({\n success: true,\n message: 'Mock文件内容更新成功',\n data: {\n projectName,\n apiName,\n method: method.toLowerCase(),\n siteName,\n filePath: join('.mock', apiName, method.toLowerCase(), `${siteName}.cjs`),\n updatedAt: new Date().toISOString(),\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} ","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,3 +1,3 @@
|
|
|
1
|
-
module.exports={45935:function(e){var{g:t,__dirname:r,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"))},35692:e=>{"use strict";var{g:t,__dirname:r}=e;e.s({ProjectStatus:()=>o,getProjectsConfig:()=>i,saveProjectsConfig:()=>a});var s=e.i(9892),n=e.i(88941);async function i(){try{await (0,s.access)(n.PROJECT_CONFIG_PATH,s.constants.F_OK)}catch{return await a({}),{}}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 a(e){let t=n.PROJECT_CONFIG_PATH+".tmp";try{await (0,s.writeFile)(t,JSON.stringify(e,null,2),"utf-8"),await (0,s.rename)(t,n.PROJECT_CONFIG_PATH)}catch(e){throw console.error("保存项目配置文件失败:",e),Error("无法保存项目配置")}}var o=function(e){return e.PENDING="pending",e.EXISTING="existing",e.CLONING="cloning",e.SUCCESS="success",e.FAILED="failed",e.RETRYING="retrying",e}({})},
|
|
1
|
+
module.exports={45935:function(e){var{g:t,__dirname:r,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"))},35692:e=>{"use strict";var{g:t,__dirname:r}=e;e.s({ProjectStatus:()=>o,getProjectsConfig:()=>i,saveProjectsConfig:()=>a});var s=e.i(9892),n=e.i(88941);async function i(){try{await (0,s.access)(n.PROJECT_CONFIG_PATH,s.constants.F_OK)}catch{return await a({}),{}}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 a(e){let t=n.PROJECT_CONFIG_PATH+".tmp";try{await (0,s.writeFile)(t,JSON.stringify(e,null,2),"utf-8"),await (0,s.rename)(t,n.PROJECT_CONFIG_PATH)}catch(e){throw console.error("保存项目配置文件失败:",e),Error("无法保存项目配置")}}var o=function(e){return e.PENDING="pending",e.EXISTING="existing",e.CLONING="cloning",e.SUCCESS="success",e.FAILED="failed",e.RETRYING="retrying",e}({})},29549:function(e){var{g:t,__dirname:r,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:t,__dirname:r,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:t,__dirname:r,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:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("path",()=>require("path"))},23430:function(e){var{g:t,__dirname:r,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:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("os",()=>require("os"))},52670:function(e){var{g:t,__dirname:r,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"))},88941:e=>{"use strict";var{g:t,__dirname:r}=e;{e.s({PROJECT_CONFIG_PATH:()=>r,ProjectStatus:()=>i,WORKSPACE_CONFIG:()=>t});var s=e.i(13442),n=e.i(30331);let t={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},r=(0,n.join)((0,s.homedir)(),".prime-projects.json");var i=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}({})}},9892:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("fs/promises",()=>require("fs/promises"))},87485:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("child_process",()=>require("child_process"))},4713:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("util",()=>require("util"))},56305:function(e){var{g:t,__dirname:r,m:s,e:n}=e},1411:e=>{"use strict";var{g:t,__dirname:r}=e;{e.s({GET:()=>x});var s=e.i(15494),n=e.i(30331),i=e.i(9892),a=e.i(13442),o=e.i(87485),c=e.i(4713),p=e.i(35692);let t=(0,c.promisify)(o.exec);function u(){return n.default.join(a.default.homedir(),".prime-processes.json")}async function l(e){try{return process.kill(e,0),!0}catch{return!1}}async function d(e){try{let r=parseInt(e);if(isNaN(r))return!1;try{let{stdout:r}=await t(`lsof -i :${e} -t`);return r.trim().length>0}catch{return!1}}catch{return!1}}async function x(e){try{let{searchParams:t}=new URL(e.url),r=t.get("projectName"),n=t.get("envName");if(r&&n){let e=`${r}-${n}`;try{let t=await i.default.readFile(u(),"utf-8"),r=JSON.parse(t).find(t=>t.key===e);if(r){let e=await l(r.pid),t=!!r.port&&await d(r.port);return s.NextResponse.json({success:!0,data:{running:e,pid:r.pid,startTime:r.startTime,port:r.port,portInUse:t}})}}catch{}try{let e=(await (0,p.getProjectsConfig)())[r];if(e&&e.envs&&e.envs[n]){let t=e.envs[n].host?.split(":").pop();if(t){let e=await d(t);return s.NextResponse.json({success:!0,data:{running:e,portInUse:e,port:t}})}}}catch{}return s.NextResponse.json({success:!0,data:{running:!1}})}let a=[];try{let e=await i.default.readFile(u(),"utf-8");for(let t of JSON.parse(e)){let e=await l(t.pid),r=!!t.port&&await d(t.port);a.push({key:t.key,projectName:t.projectName,envName:t.envName,running:e,pid:t.pid,startTime:t.startTime,port:t.port,portInUse:r})}}catch{}return s.NextResponse.json({success:!0,data:a})}catch(e){return console.error("获取进程状态失败:",e),s.NextResponse.json({success:!1,error:e instanceof Error?e.message:"获取进程状态失败"},{status:500})}}}},81656:e=>{"use strict";var{g:t,__dirname:r}=e;{e.s({patchFetch:()=>o,routeModule:()=>t,serverHooks:()=>p,workAsyncStorage:()=>r,workUnitAsyncStorage:()=>c});var s=e.i(45746),n=e.i(93828),i=e.i(18250),a=e.i(1411);let t=new s.AppRouteRouteModule({definition:{kind:n.RouteKind.APP_ROUTE,page:"/api/process/status/route",pathname:"/api/process/status",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/process/status/route.ts",nextConfigOutput:"",userland:a}),{workAsyncStorage:r,workUnitAsyncStorage:c,serverHooks:p}=t;function o(){return(0,i.patchFetch)({workAsyncStorage:r,workUnitAsyncStorage:c})}}}};
|
|
2
2
|
|
|
3
|
-
//# sourceMappingURL=%5Broot-of-the-server%
|
|
3
|
+
//# sourceMappingURL=%5Broot-of-the-server%5D__da89e112._.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["turbopack:///[project]/packages/server/src/lib/workspace-config.ts","turbopack:///[project]/packages/server/src/lib/workspace-types.ts","turbopack:///[project]/packages/server/src/app/api/process/status/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 { 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 { 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 { NextRequest, NextResponse } from 'next/server';\nimport path from 'path';\nimport fs from 'fs/promises';\nimport os from 'os';\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\nimport { getProjectsConfig } from '@/lib/workspace-config';\n\nconst execAsync = promisify(exec);\n\n// 获取进程存储文件路径\nfunction getProcessStorePath() {\n return path.join(os.homedir(), '.prime-processes.json');\n}\n\n// 检查进程是否仍在运行\nasync function isProcessRunning(pid: number): Promise<boolean> {\n try {\n // 在Unix系统上,使用kill -0来检查进程是否存在\n if (process.platform !== 'win32') {\n process.kill(pid, 0);\n return true;\n } else {\n // 在Windows上使用tasklist命令\n const { stdout } = await execAsync(`tasklist /FI \"PID eq ${pid}\"`);\n return stdout.includes(pid.toString());\n }\n } catch {\n return false;\n }\n}\n\n// 检查端口是否被占用\nasync function isPortInUse(port: string): Promise<boolean> {\n try {\n const portNum = parseInt(port);\n if (isNaN(portNum)) return false;\n\n if (process.platform !== 'win32') {\n // Unix系统使用lsof\n try {\n const { stdout } = await execAsync(`lsof -i :${port} -t`);\n return stdout.trim().length > 0;\n } catch {\n return false;\n }\n } else {\n // Windows系统使用netstat\n const { stdout } = await execAsync(`netstat -ano | findstr :${port}`);\n return stdout.includes(`:${port}`);\n }\n } catch {\n return false;\n }\n}\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\n // 如果提供了项目名和环境名,返回特定进程状态\n if (projectName && envName) {\n const processKey = `${projectName}-${envName}`;\n \n // 尝试从存储的进程信息中读取\n try {\n const processInfoContent = await fs.readFile(getProcessStorePath(), 'utf-8');\n const processInfoList = JSON.parse(processInfoContent);\n const processInfo = processInfoList.find((p: { key: string; pid: number; port: string; startTime: string }) => p.key === processKey);\n\n if (processInfo) {\n // 检查进程是否仍在运行\n const isRunning = await isProcessRunning(processInfo.pid);\n const portInUse = processInfo.port ? await isPortInUse(processInfo.port) : false;\n\n return NextResponse.json({\n success: true,\n data: {\n running: isRunning,\n pid: processInfo.pid,\n startTime: processInfo.startTime,\n port: processInfo.port,\n portInUse\n }\n });\n }\n } catch {\n // 文件不存在或读取失败\n }\n\n // 如果没有找到进程信息,检查端口是否被占用\n // 读取项目配置获取端口信息\n try {\n const config = await getProjectsConfig();\n const project = config[projectName];\n if (project && project.envs && project.envs[envName]) {\n const port = project.envs[envName].host?.split(':').pop();\n if (port) {\n const portInUse = await isPortInUse(port);\n return NextResponse.json({\n success: true,\n data: {\n running: portInUse,\n portInUse,\n port\n }\n });\n }\n }\n } catch {\n // 配置文件读取失败\n }\n\n return NextResponse.json({\n success: true,\n data: {\n running: false\n }\n });\n }\n\n // 如果没有提供参数,返回所有进程状态\n const allProcesses: {\n key: string;\n projectName: string;\n envName: string;\n running: boolean;\n pid: number;\n startTime: string;\n port: string;\n portInUse: boolean;\n }[] = [];\n \n try {\n const processInfoContent = await fs.readFile(getProcessStorePath(), 'utf-8');\n const processInfoList = JSON.parse(processInfoContent);\n\n for (const processInfo of processInfoList) {\n const isRunning = await isProcessRunning(processInfo.pid);\n const portInUse = processInfo.port ? await isPortInUse(processInfo.port) : false;\n \n allProcesses.push({\n key: processInfo.key,\n projectName: processInfo.projectName,\n envName: processInfo.envName,\n running: isRunning,\n pid: processInfo.pid,\n startTime: processInfo.startTime,\n port: processInfo.port,\n portInUse\n });\n }\n } catch {\n // 文件不存在或读取失败,返回空数组\n }\n\n return NextResponse.json({\n success: true,\n data: allProcesses\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":[3]}
|
|
1
|
+
{"version":3,"sources":["turbopack:///[project]/packages/server/src/lib/workspace-config.ts","turbopack:///[project]/packages/server/src/lib/workspace-types.ts","turbopack:///[project]/packages/server/src/app/api/process/status/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 { 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 { 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 { NextRequest, NextResponse } from 'next/server';\nimport path from 'path';\nimport fs from 'fs/promises';\nimport os from 'os';\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\nimport { getProjectsConfig } from '@/lib/workspace-config';\n\nconst execAsync = promisify(exec);\n\n// 获取进程存储文件路径\nfunction getProcessStorePath() {\n return path.join(os.homedir(), '.prime-processes.json');\n}\n\n// 检查进程是否仍在运行\nasync function isProcessRunning(pid: number): Promise<boolean> {\n try {\n // 在Unix系统上,使用kill -0来检查进程是否存在\n if (process.platform !== 'win32') {\n process.kill(pid, 0);\n return true;\n } else {\n // 在Windows上使用tasklist命令\n const { stdout } = await execAsync(`tasklist /FI \"PID eq ${pid}\"`);\n return stdout.includes(pid.toString());\n }\n } catch {\n return false;\n }\n}\n\n// 检查端口是否被占用\nasync function isPortInUse(port: string): Promise<boolean> {\n try {\n const portNum = parseInt(port);\n if (isNaN(portNum)) return false;\n\n if (process.platform !== 'win32') {\n // Unix系统使用lsof\n try {\n const { stdout } = await execAsync(`lsof -i :${port} -t`);\n return stdout.trim().length > 0;\n } catch {\n return false;\n }\n } else {\n // Windows系统使用netstat\n const { stdout } = await execAsync(`netstat -ano | findstr :${port}`);\n return stdout.includes(`:${port}`);\n }\n } catch {\n return false;\n }\n}\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\n // 如果提供了项目名和环境名,返回特定进程状态\n if (projectName && envName) {\n const processKey = `${projectName}-${envName}`;\n \n // 尝试从存储的进程信息中读取\n try {\n const processInfoContent = await fs.readFile(getProcessStorePath(), 'utf-8');\n const processInfoList = JSON.parse(processInfoContent);\n const processInfo = processInfoList.find((p: { key: string; pid: number; port: string; startTime: string }) => p.key === processKey);\n\n if (processInfo) {\n // 检查进程是否仍在运行\n const isRunning = await isProcessRunning(processInfo.pid);\n const portInUse = processInfo.port ? await isPortInUse(processInfo.port) : false;\n\n return NextResponse.json({\n success: true,\n data: {\n running: isRunning,\n pid: processInfo.pid,\n startTime: processInfo.startTime,\n port: processInfo.port,\n portInUse\n }\n });\n }\n } catch {\n // 文件不存在或读取失败\n }\n\n // 如果没有找到进程信息,检查端口是否被占用\n // 读取项目配置获取端口信息\n try {\n const config = await getProjectsConfig();\n const project = config[projectName];\n if (project && project.envs && project.envs[envName]) {\n const port = project.envs[envName].host?.split(':').pop();\n if (port) {\n const portInUse = await isPortInUse(port);\n return NextResponse.json({\n success: true,\n data: {\n running: portInUse,\n portInUse,\n port\n }\n });\n }\n }\n } catch {\n // 配置文件读取失败\n }\n\n return NextResponse.json({\n success: true,\n data: {\n running: false\n }\n });\n }\n\n // 如果没有提供参数,返回所有进程状态\n const allProcesses: {\n key: string;\n projectName: string;\n envName: string;\n running: boolean;\n pid: number;\n startTime: string;\n port: string;\n portInUse: boolean;\n }[] = [];\n \n try {\n const processInfoContent = await fs.readFile(getProcessStorePath(), 'utf-8');\n const processInfoList = JSON.parse(processInfoContent);\n\n for (const processInfo of processInfoList) {\n const isRunning = await isProcessRunning(processInfo.pid);\n const portInUse = processInfo.port ? await isPortInUse(processInfo.port) : false;\n \n allProcesses.push({\n key: processInfo.key,\n projectName: processInfo.projectName,\n envName: processInfo.envName,\n running: isRunning,\n pid: processInfo.pid,\n startTime: processInfo.startTime,\n port: processInfo.port,\n portInUse\n });\n }\n } catch {\n // 文件不存在或读取失败,返回空数组\n }\n\n return NextResponse.json({\n success: true,\n data: allProcesses\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":[3]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
module.exports={83886:function(e){var{g:r,__dirname:t,m:s,e:o}=e;s.exports=e.x("fs",()=>require("fs"))},45935:function(e){var{g:r,__dirname:t,m:s,e:o}=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"))},35692:e=>{"use strict";var{g:r,__dirname:t}=e;e.s({ProjectStatus:()=>a,getProjectsConfig:()=>n,saveProjectsConfig:()=>c});var s=e.i(9892),o=e.i(88941);async function n(){try{await (0,s.access)(o.PROJECT_CONFIG_PATH,s.constants.F_OK)}catch{return await c({}),{}}try{let e=await (0,s.readFile)(o.PROJECT_CONFIG_PATH,"utf-8");if(!e)return{};return JSON.parse(e)}catch(e){throw console.error("读取或解析项目配置文件失败:",e),Error("无法加载项目配置")}}async function c(e){let r=o.PROJECT_CONFIG_PATH+".tmp";try{await (0,s.writeFile)(r,JSON.stringify(e,null,2),"utf-8"),await (0,s.rename)(r,o.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}({})},29549:function(e){var{g:r,__dirname:t,m:s,e:o}=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:o}=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:o}=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:o}=e;s.exports=e.x("path",()=>require("path"))},23430:function(e){var{g:r,__dirname:t,m:s,e:o}=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:o}=e;s.exports=e.x("os",()=>require("os"))},52670:function(e){var{g:r,__dirname:t,m:s,e:o}=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"))},88941:e=>{"use strict";var{g:r,__dirname:t}=e;{e.s({PROJECT_CONFIG_PATH:()=>t,ProjectStatus:()=>n,WORKSPACE_CONFIG:()=>r});var s=e.i(13442),o=e.i(30331);let r={WORKSPACE_ROOT:(0,o.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,o.join)((0,s.homedir)(),".prime-projects.json");var n=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}({})}},9892:function(e){var{g:r,__dirname:t,m:s,e:o}=e;s.exports=e.x("fs/promises",()=>require("fs/promises"))},15650:function(e){var{g:r,__dirname:t,m:s,e:o}=e;s.exports=e.x("module",()=>require("module"))},25378:function(e){var{g:r,__dirname:t,m:s,e:o}=e},66778:e=>{"use strict";var{g:r,__dirname:t}=e;{e.s({GET:()=>i});var s=e.i(15494),o=e.i(83886),n=e.i(30331),c=e.i(35692),a=e.i(88941);let r=(0,e.i(15650).createRequire)({get url(){return`file://${e.P("packages/server/src/app/api/get-mock-data/route.ts")}`}}.url);try{r("mockjs")}catch(e){console.warn("mockjs模块加载失败,可能影响mock文件功能:",e)}async function i(e){try{let t,i,{searchParams:u}=new URL(e.url),p=u.get("project"),l=u.get("url"),x=u.get("method");if(!p||!l||!x)return s.NextResponse.json({success:!1,error:"缺少必要参数:project, url, method"},{status:400});let g=await (0,c.getProjectsConfig)();if(!g[p])return s.NextResponse.json({success:!1,error:`项目 ${p} 不存在`},{status:404});if(!g[p].mockOpen)return s.NextResponse.json({success:!1,error:"Mock功能未开启"},{status:400});let m=l.split("?")[0].replace(/^\//,"").replace(/\//g,"_")||"root",d=(0,n.join)(a.WORKSPACE_CONFIG.WORKSPACE_ROOT,p),j=(0,n.join)(d,".mock"),f=(0,n.join)(j,m),v=(0,n.join)(f,x.toLowerCase()),N=(0,n.join)(v,"setting.cjs");try{await o.promises.access(N)}catch{return s.NextResponse.json({success:!1,error:`Mock配置文件不存在: ${m}/${x.toLowerCase()}/setting.cjs`},{status:404})}let R=[];try{let e=r((0,n.resolve)(N));if(delete r.cache[(0,n.resolve)(N)],e)try{t=e.currentSite,R=Array.isArray(e.open)?e.open:[]}catch(e){console.warn(`解析setting.cjs失败: ${N}`,e)}}catch(e){return console.error(`读取setting.cjs失败: ${N}`,e),s.NextResponse.json({success:!1,error:"读取Mock配置失败"},{status:500})}if(!t)return s.NextResponse.json({success:!1,error:"未找到当前选中的Mock场景"},{status:404});if(!R.includes(t))return s.NextResponse.json({success:!1,error:`当前场景 "${t}" 未开启Mock功能`},{status:400});let k=(0,n.join)(v,`${t}.cjs`);try{await o.promises.access(k)}catch{return s.NextResponse.json({success:!1,error:`Mock场景文件不存在: ${m}/${x.toLowerCase()}/${t}.cjs`},{status:404})}try{let e=r((0,n.resolve)(k));if(delete r.cache[(0,n.resolve)(k)],!e)return s.NextResponse.json({success:!1,error:"Mock文件格式不正确"},{status:500});try{i=e}catch(e){return console.warn(`解析Mock文件失败: ${k}`,e),s.NextResponse.json({success:!1,error:"解析Mock数据失败"},{status:500})}}catch(e){return console.error(`读取Mock文件失败: ${k}`,e),s.NextResponse.json({success:!1,error:"读取Mock数据失败"},{status:500})}return s.NextResponse.json({success:!0,data:{projectName:p,apiName:m,method:x.toLowerCase(),currentSite:t,mockData:i,filePath:(0,n.join)(".mock",m,x.toLowerCase(),`${t}.cjs`)},message:"Mock数据获取成功"})}catch(r){let e=r instanceof Error?r.message:"获取Mock数据失败";return console.error("获取Mock数据失败:",r),s.NextResponse.json({success:!1,error:e},{status:500})}}}},41360:e=>{"use strict";var{g:r,__dirname:t}=e;{e.s({patchFetch:()=>a,routeModule:()=>r,serverHooks:()=>u,workAsyncStorage:()=>t,workUnitAsyncStorage:()=>i});var s=e.i(45746),o=e.i(93828),n=e.i(18250),c=e.i(66778);let r=new s.AppRouteRouteModule({definition:{kind:o.RouteKind.APP_ROUTE,page:"/api/get-mock-data/route",pathname:"/api/get-mock-data",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/get-mock-data/route.ts",nextConfigOutput:"",userland:c}),{workAsyncStorage:t,workUnitAsyncStorage:i,serverHooks:u}=r;function a(){return(0,n.patchFetch)({workAsyncStorage:t,workUnitAsyncStorage:i})}}}};
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=%5Broot-of-the-server%5D__e07d75ff._.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["turbopack:///[project]/packages/server/src/lib/workspace-config.ts","turbopack:///[project]/packages/server/src/lib/workspace-types.ts","turbopack:///[project]/packages/server/src/app/api/get-mock-data/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 { 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 { 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 { NextRequest, NextResponse } from 'next/server';\nimport { promises as fs } from 'fs';\nimport { join, resolve } from 'path';\nimport { getProjectsConfig } from '@/lib/workspace-config';\nimport { WORKSPACE_CONFIG } from '@/lib/workspace-types';\nimport { createRequire } from \"module\";\nconst require = createRequire(import.meta.url);\n\n// 预先加载mockjs,确保外部mock文件可以正常require\ntry {\n require('mockjs');\n} catch (error) {\n console.warn('mockjs模块加载失败,可能影响mock文件功能:', error);\n}\n\nexport async function GET(request: NextRequest) {\n try {\n const { searchParams } = new URL(request.url);\n const projectName = searchParams.get('project');\n const url = searchParams.get('url');\n const method = searchParams.get('method');\n\n if (!projectName || !url || !method) {\n return NextResponse.json(\n { success: false, error: '缺少必要参数:project, url, method' },\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 // 检查项目是否开启Mock功能\n const projectConfig = projectsConfig[projectName];\n if (!projectConfig.mockOpen) {\n return NextResponse.json(\n { success: false, error: 'Mock功能未开启' },\n { status: 400 },\n );\n }\n\n\n // 处理URL路径:移除查询参数,转换/为_\n const cleanUrl = url.split('?')[0];\n const apiName = cleanUrl.replace(/^\\//, '').replace(/\\//g, '_') || 'root';\n\n // 构建Mock文件路径\n const projectPath = join(WORKSPACE_CONFIG.WORKSPACE_ROOT, projectName);\n const mockPath = join(projectPath, '.mock');\n const apiPath = join(mockPath, apiName);\n const methodPath = join(apiPath, method.toLowerCase());\n const settingFilePath = join(methodPath, 'setting.cjs');\n\n // 检查setting.cjs文件是否存在\n try {\n await fs.access(settingFilePath);\n } catch {\n return NextResponse.json(\n { success: false, error: `Mock配置文件不存在: ${apiName}/${method.toLowerCase()}/setting.cjs` },\n { status: 404 },\n );\n }\n\n // 读取setting.cjs文件内容\n let currentSite: string | undefined;\n let openSites: string[] = [];\n try {\n const setting = require(resolve(settingFilePath));\n delete require.cache[resolve(settingFilePath)];\n if (setting) {\n try {\n // 使用Function构造器替代eval,更安全\n currentSite = setting.currentSite;\n openSites = Array.isArray(setting.open) ? setting.open : [];\n } catch (parseError) {\n console.warn(`解析setting.cjs失败: ${settingFilePath}`, parseError);\n }\n }\n } catch (error) {\n console.error(`读取setting.cjs失败: ${settingFilePath}`, error);\n return NextResponse.json(\n { success: false, error: '读取Mock配置失败' },\n { status: 500 },\n );\n }\n\n if (!currentSite) {\n return NextResponse.json(\n { success: false, error: '未找到当前选中的Mock场景' },\n { status: 404 },\n );\n }\n\n // 检查当前场景是否在开启的Mock场景列表中\n if (!openSites.includes(currentSite)) {\n return NextResponse.json(\n { success: false, error: `当前场景 \"${currentSite}\" 未开启Mock功能` },\n { status: 400 },\n );\n }\n\n // 构建Mock场景文件路径\n const mockFilePath = join(methodPath, `${currentSite}.cjs`);\n\n // 检查Mock场景文件是否存在\n try {\n await fs.access(mockFilePath);\n } catch {\n return NextResponse.json(\n { success: false, error: `Mock场景文件不存在: ${apiName}/${method.toLowerCase()}/${currentSite}.cjs` },\n { status: 404 },\n );\n }\n\n // 读取Mock场景文件内容\n let mockData: unknown;\n try {\n const mockContent = require(resolve(mockFilePath));\n delete require.cache[resolve(mockFilePath)];\n // 使用更安全的方式解析module.exports\n if (mockContent) {\n try {\n // 使用Function构造器替代eval,更安全\n mockData = mockContent;\n } catch (parseError) {\n console.warn(`解析Mock文件失败: ${mockFilePath}`, parseError);\n return NextResponse.json(\n { success: false, error: '解析Mock数据失败' },\n { status: 500 },\n );\n }\n } else {\n return NextResponse.json(\n { success: false, error: 'Mock文件格式不正确' },\n { status: 500 },\n );\n }\n } catch (error) {\n console.error(`读取Mock文件失败: ${mockFilePath}`, error);\n return NextResponse.json(\n { success: false, error: '读取Mock数据失败' },\n { status: 500 },\n );\n }\n\n return NextResponse.json({\n success: true,\n data: {\n projectName,\n apiName,\n method: method.toLowerCase(),\n currentSite,\n mockData,\n filePath: join('.mock', apiName, method.toLowerCase(), `${currentSite}.cjs`),\n },\n message: 'Mock数据获取成功',\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} ","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,4 +1,4 @@
|
|
|
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"))},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}({})},
|
|
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"))},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}({})},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"))},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}({})}},9892:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("fs/promises",()=>require("fs/promises"))},15650:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("module",()=>require("module"))},94995:function(e){var{g:r,__dirname:t,m:s,e:n}=e},45640:e=>{"use strict";var{g:r,__dirname:t}=e;{e.s({POST:()=>c});var s=e.i(15494),n=e.i(83886),o=e.i(30331),i=e.i(35692),a=e.i(88941);let r=(0,e.i(15650).createRequire)({get url(){return`file://${e.P("packages/server/src/app/api/open-all-mock/route.ts")}`}}.url);async function c(e){try{let{projectName:t}=await e.json();if(!t)return s.NextResponse.json({success:!1,error:"项目名称参数缺失"},{status:400});if(!(await (0,i.getProjectsConfig)())[t])return s.NextResponse.json({success:!1,error:`项目 ${t} 不存在`},{status:404});let c=(0,o.join)(a.WORKSPACE_CONFIG.WORKSPACE_ROOT,t),p=(0,o.join)(c,".mock");try{await n.promises.access(p)}catch{return s.NextResponse.json({success:!0,message:"Mock目录不存在,无需处理",data:{projectName:t,timestamp:new Date().toISOString()}})}let u=async e=>{for(let t of(await n.promises.readdir(e,{withFileTypes:!0}))){let s=(0,o.join)(e,t.name);if(t.isDirectory())await u(s);else if(t.name.endsWith(".cjs")&&"setting.cjs"!==t.name){let s=(0,o.join)(e),i=(0,o.join)(s,"setting.cjs"),a=t.name.replace(".cjs","");try{await n.promises.access(i)}catch{let e=`module.exports = {
|
|
2
2
|
// 当前场景名称
|
|
3
3
|
currentSite: '${a}',
|
|
4
4
|
// 开启Mock的场景列表
|
|
@@ -10,4 +10,4 @@ module.exports={83886:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("
|
|
|
10
10
|
open: ${JSON.stringify(t.open)}
|
|
11
11
|
};`;await n.promises.writeFile(i,s,"utf-8")}catch(e){console.warn(`解析setting.cjs失败: ${i}`,e)}}}};return await u(p),s.NextResponse.json({success:!0,message:"所有Mock场景已开启",data:{projectName:t,timestamp:new Date().toISOString()}})}catch(r){let e=r instanceof Error?r.message:"开启Mock场景失败";return console.error("开启Mock场景失败:",r),s.NextResponse.json({success:!1,error:e},{status:500})}}}},40988: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(45640);let r=new s.AppRouteRouteModule({definition:{kind:n.RouteKind.APP_ROUTE,page:"/api/open-all-mock/route",pathname:"/api/open-all-mock",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/open-all-mock/route.ts",nextConfigOutput:"",userland:i}),{workAsyncStorage:t,workUnitAsyncStorage:c,serverHooks:p}=r;function a(){return(0,o.patchFetch)({workAsyncStorage:t,workUnitAsyncStorage:c})}}}};
|
|
12
12
|
|
|
13
|
-
//# sourceMappingURL=%5Broot-of-the-server%
|
|
13
|
+
//# sourceMappingURL=%5Broot-of-the-server%5D__e301c560._.js.map
|