prime-dev-cli 1.0.7 → 1.0.9
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/config/projects.json +34 -1
- package/dist/server/.next/BUILD_ID +1 -1
- package/dist/server/.next/app-build-manifest.json +34 -180
- package/dist/server/.next/app-path-routes-manifest.json +13 -12
- package/dist/server/.next/build/chunks/[root-of-the-server]__5583c180._.js +491 -0
- package/dist/server/.next/build/chunks/[root-of-the-server]__5583c180._.js.map +11 -0
- package/dist/server/.next/build/chunks/[root-of-the-server]__f95a3f97._.js +173 -0
- package/dist/server/.next/build/chunks/[root-of-the-server]__f95a3f97._.js.map +7 -0
- package/dist/server/.next/build/chunks/[turbopack]_runtime.js +688 -0
- package/dist/server/.next/build/chunks/[turbopack]_runtime.js.map +10 -0
- package/dist/server/.next/build/chunks/node_modules__pnpm_ec38a98b._.js +6748 -0
- package/dist/server/.next/build/chunks/node_modules__pnpm_ec38a98b._.js.map +47 -0
- package/dist/server/.next/build/chunks/packages_server_postcss_config_mjs_transform_ts_18d17415._.js +17 -0
- package/dist/server/.next/build/chunks/packages_server_postcss_config_mjs_transform_ts_18d17415._.js.map +5 -0
- package/dist/server/.next/build-manifest.json +22 -24
- package/dist/server/.next/cache/.rscinfo +1 -1
- package/dist/server/.next/cache/.tsbuildinfo +1 -1
- package/dist/server/.next/cache/eslint/.cache_1qa5vxt +1 -1
- package/dist/server/.next/cache/webpack/client-production/0.pack +0 -0
- package/dist/server/.next/cache/webpack/client-production/1.pack +0 -0
- package/dist/server/.next/cache/webpack/client-production/2.pack +0 -0
- package/dist/server/.next/cache/webpack/client-production/index.pack +0 -0
- package/dist/server/.next/cache/webpack/client-production/index.pack.old +0 -0
- package/dist/server/.next/cache/webpack/edge-server-production/index.pack +0 -0
- package/dist/server/.next/cache/webpack/edge-server-production/index.pack.old +0 -0
- package/dist/server/.next/cache/webpack/server-production/0.pack +0 -0
- package/dist/server/.next/cache/webpack/server-production/1.pack +0 -0
- package/dist/server/.next/cache/webpack/server-production/index.pack +0 -0
- package/dist/server/.next/cache/webpack/server-production/index.pack.old +0 -0
- package/dist/server/.next/fallback-build-manifest.json +23 -0
- 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 +3 -3
- package/dist/server/.next/required-server-files.json +0 -2
- package/dist/server/.next/server/app/_not-found/page/app-build-manifest.json +13 -0
- package/dist/server/.next/server/app/_not-found/page/app-paths-manifest.json +3 -0
- package/dist/server/.next/server/app/_not-found/page/build-manifest.json +17 -0
- package/dist/server/.next/server/app/_not-found/page/next-font-manifest.json +6 -0
- package/dist/server/.next/server/app/_not-found/page/react-loadable-manifest.json +1 -0
- package/dist/server/.next/server/app/_not-found/page/server-reference-manifest.json +4 -0
- package/dist/server/.next/server/app/_not-found/page.js +13 -1
- package/dist/server/.next/server/app/_not-found/page.js.map +5 -0
- package/dist/server/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/dist/server/.next/server/app/_not-found/page_client-reference-manifest.js +2 -1
- package/dist/server/.next/server/app/_not-found.html +1 -1
- package/dist/server/.next/server/app/_not-found.rsc +11 -11
- package/dist/server/.next/server/app/api/all-projects-envs/route/app-build-manifest.json +11 -0
- package/dist/server/.next/server/app/api/all-projects-envs/route/app-paths-manifest.json +3 -0
- package/dist/server/.next/server/app/api/all-projects-envs/route/build-manifest.json +17 -0
- package/dist/server/.next/server/app/api/all-projects-envs/route/next-font-manifest.json +6 -0
- package/dist/server/.next/server/app/api/all-projects-envs/route/react-loadable-manifest.json +1 -0
- package/dist/server/.next/server/app/api/all-projects-envs/route/server-reference-manifest.json +4 -0
- package/dist/server/.next/server/app/api/all-projects-envs/route.js +8 -1
- package/dist/server/.next/server/app/api/all-projects-envs/route.js.map +5 -0
- package/dist/server/.next/server/app/api/all-projects-envs/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/all-projects-envs/route_client-reference-manifest.js +2 -1
- package/dist/server/.next/server/app/api/check-mock-intercept/route/app-build-manifest.json +11 -0
- package/dist/server/.next/server/app/api/check-mock-intercept/route/app-paths-manifest.json +3 -0
- package/dist/server/.next/server/app/api/check-mock-intercept/route/build-manifest.json +17 -0
- package/dist/server/.next/server/app/api/check-mock-intercept/route/next-font-manifest.json +6 -0
- package/dist/server/.next/server/app/api/check-mock-intercept/route/react-loadable-manifest.json +1 -0
- package/dist/server/.next/server/app/api/check-mock-intercept/route/server-reference-manifest.json +4 -0
- package/dist/server/.next/server/app/api/check-mock-intercept/route.js +8 -1
- package/dist/server/.next/server/app/api/check-mock-intercept/route.js.map +5 -0
- package/dist/server/.next/server/app/api/check-mock-intercept/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/check-mock-intercept/route_client-reference-manifest.js +2 -1
- package/dist/server/.next/server/app/api/check-workspace/route/app-build-manifest.json +11 -0
- package/dist/server/.next/server/app/api/check-workspace/route/app-paths-manifest.json +3 -0
- package/dist/server/.next/server/app/api/check-workspace/route/build-manifest.json +17 -0
- package/dist/server/.next/server/app/api/check-workspace/route/next-font-manifest.json +6 -0
- package/dist/server/.next/server/app/api/check-workspace/route/react-loadable-manifest.json +1 -0
- package/dist/server/.next/server/app/api/check-workspace/route/server-reference-manifest.json +4 -0
- package/dist/server/.next/server/app/api/check-workspace/route.js +7 -14
- package/dist/server/.next/server/app/api/check-workspace/route.js.map +5 -0
- package/dist/server/.next/server/app/api/check-workspace/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/check-workspace/route_client-reference-manifest.js +2 -1
- package/dist/server/.next/server/app/api/cleanup-mock/route/app-build-manifest.json +11 -0
- package/dist/server/.next/server/app/api/cleanup-mock/route/app-paths-manifest.json +3 -0
- package/dist/server/.next/server/app/api/cleanup-mock/route/build-manifest.json +17 -0
- package/dist/server/.next/server/app/api/cleanup-mock/route/next-font-manifest.json +6 -0
- package/dist/server/.next/server/app/api/cleanup-mock/route/react-loadable-manifest.json +1 -0
- package/dist/server/.next/server/app/api/cleanup-mock/route/server-reference-manifest.json +4 -0
- package/dist/server/.next/server/app/api/cleanup-mock/route.js +8 -6
- package/dist/server/.next/server/app/api/cleanup-mock/route.js.map +5 -0
- package/dist/server/.next/server/app/api/cleanup-mock/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/cleanup-mock/route_client-reference-manifest.js +2 -1
- package/dist/server/.next/server/app/api/cleanup-project/route/app-build-manifest.json +11 -0
- package/dist/server/.next/server/app/api/cleanup-project/route/app-paths-manifest.json +3 -0
- package/dist/server/.next/server/app/api/cleanup-project/route/build-manifest.json +17 -0
- package/dist/server/.next/server/app/api/cleanup-project/route/next-font-manifest.json +6 -0
- package/dist/server/.next/server/app/api/cleanup-project/route/react-loadable-manifest.json +1 -0
- package/dist/server/.next/server/app/api/cleanup-project/route/server-reference-manifest.json +4 -0
- package/dist/server/.next/server/app/api/cleanup-project/route.js +8 -1
- package/dist/server/.next/server/app/api/cleanup-project/route.js.map +5 -0
- package/dist/server/.next/server/app/api/cleanup-project/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/cleanup-project/route_client-reference-manifest.js +2 -1
- package/dist/server/.next/server/app/api/delete-mock-api/route/app-build-manifest.json +11 -0
- package/dist/server/.next/server/app/api/delete-mock-api/route/app-paths-manifest.json +3 -0
- package/dist/server/.next/server/app/api/delete-mock-api/route/build-manifest.json +17 -0
- package/dist/server/.next/server/app/api/delete-mock-api/route/next-font-manifest.json +6 -0
- package/dist/server/.next/server/app/api/delete-mock-api/route/react-loadable-manifest.json +1 -0
- package/dist/server/.next/server/app/api/delete-mock-api/route/server-reference-manifest.json +4 -0
- package/dist/server/.next/server/app/api/delete-mock-api/route.js +8 -0
- package/dist/server/.next/server/app/api/delete-mock-api/route.js.map +5 -0
- package/dist/server/.next/server/app/api/delete-mock-api/route.js.nft.json +1 -0
- package/dist/server/.next/server/app/api/delete-mock-api/route_client-reference-manifest.js +2 -0
- package/dist/server/.next/server/app/api/get-mock-data/route/app-build-manifest.json +11 -0
- package/dist/server/.next/server/app/api/get-mock-data/route/app-paths-manifest.json +3 -0
- package/dist/server/.next/server/app/api/get-mock-data/route/build-manifest.json +17 -0
- package/dist/server/.next/server/app/api/get-mock-data/route/next-font-manifest.json +6 -0
- package/dist/server/.next/server/app/api/get-mock-data/route/react-loadable-manifest.json +1 -0
- package/dist/server/.next/server/app/api/get-mock-data/route/server-reference-manifest.json +4 -0
- package/dist/server/.next/server/app/api/get-mock-data/route.js +8 -1
- package/dist/server/.next/server/app/api/get-mock-data/route.js.map +5 -0
- package/dist/server/.next/server/app/api/get-mock-data/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/get-mock-data/route_client-reference-manifest.js +2 -1
- package/dist/server/.next/server/app/api/initialize-workspace/route/app-build-manifest.json +11 -0
- package/dist/server/.next/server/app/api/initialize-workspace/route/app-paths-manifest.json +3 -0
- package/dist/server/.next/server/app/api/initialize-workspace/route/build-manifest.json +17 -0
- package/dist/server/.next/server/app/api/initialize-workspace/route/next-font-manifest.json +6 -0
- package/dist/server/.next/server/app/api/initialize-workspace/route/react-loadable-manifest.json +1 -0
- package/dist/server/.next/server/app/api/initialize-workspace/route/server-reference-manifest.json +4 -0
- package/dist/server/.next/server/app/api/initialize-workspace/route.js +7 -18
- package/dist/server/.next/server/app/api/initialize-workspace/route.js.map +5 -0
- package/dist/server/.next/server/app/api/initialize-workspace/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/initialize-workspace/route_client-reference-manifest.js +2 -1
- package/dist/server/.next/server/app/api/microapp-proxy-change-stream/route/app-build-manifest.json +11 -0
- package/dist/server/.next/server/app/api/microapp-proxy-change-stream/route/app-paths-manifest.json +3 -0
- package/dist/server/.next/server/app/api/microapp-proxy-change-stream/route/build-manifest.json +17 -0
- package/dist/server/.next/server/app/api/microapp-proxy-change-stream/route/next-font-manifest.json +6 -0
- package/dist/server/.next/server/app/api/microapp-proxy-change-stream/route/react-loadable-manifest.json +1 -0
- package/dist/server/.next/server/app/api/microapp-proxy-change-stream/route/server-reference-manifest.json +4 -0
- package/dist/server/.next/server/app/api/microapp-proxy-change-stream/route.js +8 -5
- package/dist/server/.next/server/app/api/microapp-proxy-change-stream/route.js.map +5 -0
- 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-change-stream/route_client-reference-manifest.js +2 -1
- package/dist/server/.next/server/app/api/microapp-proxy-config/route/app-build-manifest.json +11 -0
- package/dist/server/.next/server/app/api/microapp-proxy-config/route/app-paths-manifest.json +3 -0
- package/dist/server/.next/server/app/api/microapp-proxy-config/route/build-manifest.json +17 -0
- package/dist/server/.next/server/app/api/microapp-proxy-config/route/next-font-manifest.json +6 -0
- package/dist/server/.next/server/app/api/microapp-proxy-config/route/react-loadable-manifest.json +1 -0
- package/dist/server/.next/server/app/api/microapp-proxy-config/route/server-reference-manifest.json +4 -0
- package/dist/server/.next/server/app/api/microapp-proxy-config/route.js +8 -3
- package/dist/server/.next/server/app/api/microapp-proxy-config/route.js.map +5 -0
- package/dist/server/.next/server/app/api/microapp-proxy-config/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/microapp-proxy-config/route_client-reference-manifest.js +2 -1
- package/dist/server/.next/server/app/api/mock-file/route/app-build-manifest.json +11 -0
- package/dist/server/.next/server/app/api/mock-file/route/app-paths-manifest.json +3 -0
- package/dist/server/.next/server/app/api/mock-file/route/build-manifest.json +17 -0
- package/dist/server/.next/server/app/api/mock-file/route/next-font-manifest.json +6 -0
- package/dist/server/.next/server/app/api/mock-file/route/react-loadable-manifest.json +1 -0
- package/dist/server/.next/server/app/api/mock-file/route/server-reference-manifest.json +4 -0
- package/dist/server/.next/server/app/api/mock-file/route.js +8 -6
- package/dist/server/.next/server/app/api/mock-file/route.js.map +5 -0
- package/dist/server/.next/server/app/api/mock-file/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/mock-file/route_client-reference-manifest.js +2 -1
- package/dist/server/.next/server/app/api/mock-file-content/route/app-build-manifest.json +11 -0
- package/dist/server/.next/server/app/api/mock-file-content/route/app-paths-manifest.json +3 -0
- package/dist/server/.next/server/app/api/mock-file-content/route/build-manifest.json +17 -0
- package/dist/server/.next/server/app/api/mock-file-content/route/next-font-manifest.json +6 -0
- package/dist/server/.next/server/app/api/mock-file-content/route/react-loadable-manifest.json +1 -0
- package/dist/server/.next/server/app/api/mock-file-content/route/server-reference-manifest.json +4 -0
- package/dist/server/.next/server/app/api/mock-file-content/route.js +8 -1
- package/dist/server/.next/server/app/api/mock-file-content/route.js.map +5 -0
- package/dist/server/.next/server/app/api/mock-file-content/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/mock-file-content/route_client-reference-manifest.js +2 -1
- package/dist/server/.next/server/app/api/mock-open-status/route/app-build-manifest.json +11 -0
- package/dist/server/.next/server/app/api/mock-open-status/route/app-paths-manifest.json +3 -0
- package/dist/server/.next/server/app/api/mock-open-status/route/build-manifest.json +17 -0
- package/dist/server/.next/server/app/api/mock-open-status/route/next-font-manifest.json +6 -0
- package/dist/server/.next/server/app/api/mock-open-status/route/react-loadable-manifest.json +1 -0
- package/dist/server/.next/server/app/api/mock-open-status/route/server-reference-manifest.json +4 -0
- package/dist/server/.next/server/app/api/mock-open-status/route.js +8 -6
- package/dist/server/.next/server/app/api/mock-open-status/route.js.map +5 -0
- package/dist/server/.next/server/app/api/mock-open-status/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/mock-open-status/route_client-reference-manifest.js +2 -1
- package/dist/server/.next/server/app/api/mock-setting/route/app-build-manifest.json +11 -0
- package/dist/server/.next/server/app/api/mock-setting/route/app-paths-manifest.json +3 -0
- package/dist/server/.next/server/app/api/mock-setting/route/build-manifest.json +17 -0
- package/dist/server/.next/server/app/api/mock-setting/route/next-font-manifest.json +6 -0
- package/dist/server/.next/server/app/api/mock-setting/route/react-loadable-manifest.json +1 -0
- package/dist/server/.next/server/app/api/mock-setting/route/server-reference-manifest.json +4 -0
- package/dist/server/.next/server/app/api/mock-setting/route.js +8 -1
- package/dist/server/.next/server/app/api/mock-setting/route.js.map +5 -0
- package/dist/server/.next/server/app/api/mock-setting/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/mock-setting/route_client-reference-manifest.js +2 -1
- package/dist/server/.next/server/app/api/open-all-mock/route/app-build-manifest.json +11 -0
- package/dist/server/.next/server/app/api/open-all-mock/route/app-paths-manifest.json +3 -0
- package/dist/server/.next/server/app/api/open-all-mock/route/build-manifest.json +17 -0
- package/dist/server/.next/server/app/api/open-all-mock/route/next-font-manifest.json +6 -0
- package/dist/server/.next/server/app/api/open-all-mock/route/react-loadable-manifest.json +1 -0
- package/dist/server/.next/server/app/api/open-all-mock/route/server-reference-manifest.json +4 -0
- package/dist/server/.next/server/app/api/open-all-mock/route.js +8 -11
- package/dist/server/.next/server/app/api/open-all-mock/route.js.map +5 -0
- package/dist/server/.next/server/app/api/open-all-mock/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/open-all-mock/route_client-reference-manifest.js +2 -1
- package/dist/server/.next/server/app/api/open-project/route/app-build-manifest.json +11 -0
- package/dist/server/.next/server/app/api/open-project/route/app-paths-manifest.json +3 -0
- package/dist/server/.next/server/app/api/open-project/route/build-manifest.json +17 -0
- package/dist/server/.next/server/app/api/open-project/route/next-font-manifest.json +6 -0
- package/dist/server/.next/server/app/api/open-project/route/react-loadable-manifest.json +1 -0
- package/dist/server/.next/server/app/api/open-project/route/server-reference-manifest.json +4 -0
- package/dist/server/.next/server/app/api/open-project/route.js +7 -14
- package/dist/server/.next/server/app/api/open-project/route.js.map +5 -0
- package/dist/server/.next/server/app/api/open-project/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/open-project/route_client-reference-manifest.js +2 -1
- package/dist/server/.next/server/app/api/process/logs/route/app-build-manifest.json +11 -0
- package/dist/server/.next/server/app/api/process/logs/route/app-paths-manifest.json +3 -0
- package/dist/server/.next/server/app/api/process/logs/route/build-manifest.json +17 -0
- package/dist/server/.next/server/app/api/process/logs/route/next-font-manifest.json +6 -0
- package/dist/server/.next/server/app/api/process/logs/route/react-loadable-manifest.json +1 -0
- package/dist/server/.next/server/app/api/process/logs/route/server-reference-manifest.json +4 -0
- package/dist/server/.next/server/app/api/process/logs/route.js +8 -1
- package/dist/server/.next/server/app/api/process/logs/route.js.map +5 -0
- package/dist/server/.next/server/app/api/process/logs/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/process/logs/route_client-reference-manifest.js +2 -1
- package/dist/server/.next/server/app/api/process/logs/stream/route/app-build-manifest.json +11 -0
- package/dist/server/.next/server/app/api/process/logs/stream/route/app-paths-manifest.json +3 -0
- package/dist/server/.next/server/app/api/process/logs/stream/route/build-manifest.json +17 -0
- package/dist/server/.next/server/app/api/process/logs/stream/route/next-font-manifest.json +6 -0
- package/dist/server/.next/server/app/api/process/logs/stream/route/react-loadable-manifest.json +1 -0
- package/dist/server/.next/server/app/api/process/logs/stream/route/server-reference-manifest.json +4 -0
- package/dist/server/.next/server/app/api/process/logs/stream/route.js +7 -9
- package/dist/server/.next/server/app/api/process/logs/stream/route.js.map +5 -0
- package/dist/server/.next/server/app/api/process/logs/stream/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/process/logs/stream/route_client-reference-manifest.js +2 -1
- package/dist/server/.next/server/app/api/process/start/route/app-build-manifest.json +11 -0
- package/dist/server/.next/server/app/api/process/start/route/app-paths-manifest.json +3 -0
- package/dist/server/.next/server/app/api/process/start/route/build-manifest.json +17 -0
- package/dist/server/.next/server/app/api/process/start/route/next-font-manifest.json +6 -0
- package/dist/server/.next/server/app/api/process/start/route/react-loadable-manifest.json +1 -0
- package/dist/server/.next/server/app/api/process/start/route/server-reference-manifest.json +4 -0
- package/dist/server/.next/server/app/api/process/start/route.js +8 -1
- package/dist/server/.next/server/app/api/process/start/route.js.map +5 -0
- package/dist/server/.next/server/app/api/process/start/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/process/start/route_client-reference-manifest.js +2 -1
- package/dist/server/.next/server/app/api/process/status/route/app-build-manifest.json +11 -0
- package/dist/server/.next/server/app/api/process/status/route/app-paths-manifest.json +3 -0
- package/dist/server/.next/server/app/api/process/status/route/build-manifest.json +17 -0
- package/dist/server/.next/server/app/api/process/status/route/next-font-manifest.json +6 -0
- package/dist/server/.next/server/app/api/process/status/route/react-loadable-manifest.json +1 -0
- package/dist/server/.next/server/app/api/process/status/route/server-reference-manifest.json +4 -0
- package/dist/server/.next/server/app/api/process/status/route.js +8 -1
- package/dist/server/.next/server/app/api/process/status/route.js.map +5 -0
- package/dist/server/.next/server/app/api/process/status/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/process/status/route_client-reference-manifest.js +2 -1
- package/dist/server/.next/server/app/api/project-config/route/app-build-manifest.json +11 -0
- package/dist/server/.next/server/app/api/project-config/route/app-paths-manifest.json +3 -0
- package/dist/server/.next/server/app/api/project-config/route/build-manifest.json +17 -0
- package/dist/server/.next/server/app/api/project-config/route/next-font-manifest.json +6 -0
- package/dist/server/.next/server/app/api/project-config/route/react-loadable-manifest.json +1 -0
- package/dist/server/.next/server/app/api/project-config/route/server-reference-manifest.json +4 -0
- package/dist/server/.next/server/app/api/project-config/route.js +8 -1
- package/dist/server/.next/server/app/api/project-config/route.js.map +5 -0
- package/dist/server/.next/server/app/api/project-config/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/project-config/route_client-reference-manifest.js +2 -1
- package/dist/server/.next/server/app/api/retry-project/route/app-build-manifest.json +11 -0
- package/dist/server/.next/server/app/api/retry-project/route/app-paths-manifest.json +3 -0
- package/dist/server/.next/server/app/api/retry-project/route/build-manifest.json +17 -0
- package/dist/server/.next/server/app/api/retry-project/route/next-font-manifest.json +6 -0
- package/dist/server/.next/server/app/api/retry-project/route/react-loadable-manifest.json +1 -0
- package/dist/server/.next/server/app/api/retry-project/route/server-reference-manifest.json +4 -0
- package/dist/server/.next/server/app/api/retry-project/route.js +7 -14
- package/dist/server/.next/server/app/api/retry-project/route.js.map +5 -0
- package/dist/server/.next/server/app/api/retry-project/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/retry-project/route_client-reference-manifest.js +2 -1
- package/dist/server/.next/server/app/configuration/page/app-build-manifest.json +15 -0
- package/dist/server/.next/server/app/configuration/page/app-paths-manifest.json +3 -0
- package/dist/server/.next/server/app/configuration/page/build-manifest.json +17 -0
- package/dist/server/.next/server/app/configuration/page/next-font-manifest.json +6 -0
- package/dist/server/.next/server/app/configuration/page/react-loadable-manifest.json +1 -0
- package/dist/server/.next/server/app/configuration/page/server-reference-manifest.json +4 -0
- package/dist/server/.next/server/app/configuration/page.js +14 -37
- package/dist/server/.next/server/app/configuration/page.js.map +5 -0
- 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 +2 -1
- package/dist/server/.next/server/app/configuration.html +1 -1
- package/dist/server/.next/server/app/configuration.rsc +13 -13
- package/dist/server/.next/server/app/favicon.ico/route/app-build-manifest.json +11 -0
- package/dist/server/.next/server/app/favicon.ico/route/app-paths-manifest.json +3 -0
- package/dist/server/.next/server/app/favicon.ico/route/build-manifest.json +17 -0
- package/dist/server/.next/server/app/favicon.ico/route.js +9 -1
- package/dist/server/.next/server/app/favicon.ico/route.js.map +5 -0
- package/dist/server/.next/server/app/favicon.ico/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/index.html +1 -1
- package/dist/server/.next/server/app/index.rsc +11 -11
- package/dist/server/.next/server/app/initialization/page/app-build-manifest.json +15 -0
- package/dist/server/.next/server/app/initialization/page/app-paths-manifest.json +3 -0
- package/dist/server/.next/server/app/initialization/page/build-manifest.json +17 -0
- package/dist/server/.next/server/app/initialization/page/next-font-manifest.json +6 -0
- package/dist/server/.next/server/app/initialization/page/react-loadable-manifest.json +1 -0
- package/dist/server/.next/server/app/initialization/page/server-reference-manifest.json +4 -0
- package/dist/server/.next/server/app/initialization/page.js +14 -1
- package/dist/server/.next/server/app/initialization/page.js.map +5 -0
- package/dist/server/.next/server/app/initialization/page.js.nft.json +1 -1
- package/dist/server/.next/server/app/initialization/page_client-reference-manifest.js +2 -1
- package/dist/server/.next/server/app/initialization.html +1 -1
- package/dist/server/.next/server/app/initialization.rsc +12 -12
- package/dist/server/.next/server/app/page/app-build-manifest.json +13 -0
- package/dist/server/.next/server/app/page/app-paths-manifest.json +3 -0
- package/dist/server/.next/server/app/page/build-manifest.json +17 -0
- package/dist/server/.next/server/app/page/next-font-manifest.json +6 -0
- package/dist/server/.next/server/app/page/react-loadable-manifest.json +1 -0
- package/dist/server/.next/server/app/page/server-reference-manifest.json +4 -0
- package/dist/server/.next/server/app/page.js +16 -1
- package/dist/server/.next/server/app/page.js.map +5 -0
- package/dist/server/.next/server/app/page.js.nft.json +1 -1
- package/dist/server/.next/server/app/page_client-reference-manifest.js +2 -1
- package/dist/server/.next/server/app-paths-manifest.json +13 -12
- package/dist/server/.next/server/chunks/9bf22_next_37c78c05._.js +15 -0
- package/dist/server/.next/server/chunks/9bf22_next_37c78c05._.js.map +1 -0
- package/dist/server/.next/server/chunks/9bf22_next_dist_6f19b364._.js +22 -0
- package/dist/server/.next/server/chunks/9bf22_next_dist_6f19b364._.js.map +1 -0
- package/dist/server/.next/server/chunks/9bf22_next_dist_7a32bfc3._.js +22 -0
- package/dist/server/.next/server/chunks/9bf22_next_dist_7a32bfc3._.js.map +1 -0
- package/dist/server/.next/server/chunks/9bf22_next_dist_800492fd._.js +4 -0
- package/dist/server/.next/server/chunks/9bf22_next_dist_800492fd._.js.map +1 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__0111ac14._.js +18 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__0111ac14._.js.map +1 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__1efea51d._.js +13 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__1efea51d._.js.map +1 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__21616bf9._.js +3 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__21616bf9._.js.map +1 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__27f3b464._.js +3 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__27f3b464._.js.map +1 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__29969c0b._.js +3 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__29969c0b._.js.map +1 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__3da8edfd._.js +3 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__3da8edfd._.js.map +1 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__525f44e0._.js +7 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__525f44e0._.js.map +1 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__5fde5218._.js +3 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__5fde5218._.js.map +1 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__616d1a09._.js +3 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__616d1a09._.js.map +1 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__63462bcb._.js +16 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__63462bcb._.js.map +1 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__66ca8d3f._.js +11 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__66ca8d3f._.js.map +1 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__7a46f739._.js +16 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__7a46f739._.js.map +1 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__84542811._.js +8 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__84542811._.js.map +1 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__92625851._.js +5 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__92625851._.js.map +1 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__9544d1f9._.js +20 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__9544d1f9._.js.map +1 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__b68e0025._.js +3 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__b68e0025._.js.map +1 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__c43c9880._.js +3 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__c43c9880._.js.map +1 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__c513ec4a._.js +8 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__c513ec4a._.js.map +1 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__dfe36c1a._.js +3 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__dfe36c1a._.js.map +1 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__ec0f2f72._.js +3 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__ec0f2f72._.js.map +1 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__ec631eb4._.js +3 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__ec631eb4._.js.map +1 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__f6d4fb58._.js +16 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__f6d4fb58._.js.map +1 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__fab72f0c._.js +3 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__fab72f0c._.js.map +1 -0
- package/dist/server/.next/server/chunks/[turbopack]_runtime.js +688 -0
- package/dist/server/.next/server/chunks/[turbopack]_runtime.js.map +10 -0
- package/dist/server/.next/server/chunks/_88faf93c._.js +14 -0
- package/dist/server/.next/server/chunks/_88faf93c._.js.map +1 -0
- package/dist/server/.next/server/chunks/ssr/9bf22_next_dist_05ac4f07._.js +4 -0
- package/dist/server/.next/server/chunks/ssr/9bf22_next_dist_05ac4f07._.js.map +1 -0
- package/dist/server/.next/server/chunks/ssr/9bf22_next_dist_0c9074c5._.js +22 -0
- package/dist/server/.next/server/chunks/ssr/9bf22_next_dist_0c9074c5._.js.map +1 -0
- package/dist/server/.next/server/chunks/ssr/9bf22_next_dist_client_components_forbidden-error_bdb9d650.js +3 -0
- package/dist/server/.next/server/chunks/ssr/9bf22_next_dist_client_components_forbidden-error_bdb9d650.js.map +1 -0
- package/dist/server/.next/server/chunks/ssr/9bf22_next_dist_client_components_unauthorized-error_67370d77.js +3 -0
- package/dist/server/.next/server/chunks/ssr/9bf22_next_dist_client_components_unauthorized-error_67370d77.js.map +1 -0
- package/dist/server/.next/server/chunks/ssr/9bf22_next_f7d8365b._.js +3 -0
- package/dist/server/.next/server/chunks/ssr/9bf22_next_f7d8365b._.js.map +1 -0
- package/dist/server/.next/server/chunks/ssr/[root-of-the-server]__065bacdf._.js +8 -0
- package/dist/server/.next/server/chunks/ssr/[root-of-the-server]__065bacdf._.js.map +1 -0
- package/dist/server/.next/server/chunks/ssr/[root-of-the-server]__63c188bd._.js +3 -0
- package/dist/server/.next/server/chunks/ssr/[root-of-the-server]__63c188bd._.js.map +1 -0
- package/dist/server/.next/server/chunks/ssr/[root-of-the-server]__6d393273._.js +3 -0
- package/dist/server/.next/server/chunks/ssr/[root-of-the-server]__6d393273._.js.map +1 -0
- package/dist/server/.next/server/chunks/ssr/[root-of-the-server]__789bc4bd._.js +3 -0
- package/dist/server/.next/server/chunks/ssr/[root-of-the-server]__789bc4bd._.js.map +1 -0
- package/dist/server/.next/server/chunks/ssr/[root-of-the-server]__b0aa0fa4._.js +6 -0
- package/dist/server/.next/server/chunks/ssr/[root-of-the-server]__b0aa0fa4._.js.map +1 -0
- package/dist/server/.next/server/chunks/ssr/[root-of-the-server]__b3e3ec35._.js +3 -0
- package/dist/server/.next/server/chunks/ssr/[root-of-the-server]__b3e3ec35._.js.map +1 -0
- package/dist/server/.next/server/chunks/ssr/[root-of-the-server]__c53d10ac._.js +3 -0
- package/dist/server/.next/server/chunks/ssr/[root-of-the-server]__c53d10ac._.js.map +1 -0
- package/dist/server/.next/server/chunks/ssr/[root-of-the-server]__f617a52d._.js +3 -0
- package/dist/server/.next/server/chunks/ssr/[root-of-the-server]__f617a52d._.js.map +1 -0
- package/dist/server/.next/server/chunks/ssr/[turbopack]_runtime.js +688 -0
- package/dist/server/.next/server/chunks/ssr/[turbopack]_runtime.js.map +10 -0
- package/dist/server/.next/server/chunks/ssr/_2488faea._.js +61 -0
- package/dist/server/.next/server/chunks/ssr/_2488faea._.js.map +1 -0
- package/dist/server/.next/server/chunks/ssr/_89496b8a._.js +3 -0
- package/dist/server/.next/server/chunks/ssr/_89496b8a._.js.map +1 -0
- package/dist/server/.next/server/chunks/ssr/_b0947ff2._.js +3 -0
- package/dist/server/.next/server/chunks/ssr/_b0947ff2._.js.map +1 -0
- package/dist/server/.next/server/chunks/ssr/_c38b6dab._.js +3 -0
- package/dist/server/.next/server/chunks/ssr/_c38b6dab._.js.map +1 -0
- package/dist/server/.next/server/chunks/ssr/_c9f0c772._.js +3 -0
- package/dist/server/.next/server/chunks/ssr/_c9f0c772._.js.map +1 -0
- package/dist/server/.next/server/chunks/ssr/_e037a20f._.js +4 -0
- package/dist/server/.next/server/chunks/ssr/_e037a20f._.js.map +1 -0
- package/dist/server/.next/server/chunks/ssr/_fbed5872._.js +3 -0
- package/dist/server/.next/server/chunks/ssr/_fbed5872._.js.map +1 -0
- package/dist/server/.next/server/chunks/ssr/node_modules__pnpm_50840a33._.js +3 -0
- package/dist/server/.next/server/chunks/ssr/node_modules__pnpm_50840a33._.js.map +1 -0
- package/dist/server/.next/server/chunks/ssr/node_modules__pnpm_bde53e93._.js +3 -0
- package/dist/server/.next/server/chunks/ssr/node_modules__pnpm_bde53e93._.js.map +1 -0
- package/dist/server/.next/server/chunks/ssr/node_modules__pnpm_da0d20e8._.js +4 -0
- package/dist/server/.next/server/chunks/ssr/node_modules__pnpm_da0d20e8._.js.map +1 -0
- package/dist/server/.next/server/chunks/ssr/packages_server_src_7cef6dbd._.js +3 -0
- package/dist/server/.next/server/chunks/ssr/packages_server_src_7cef6dbd._.js.map +1 -0
- package/dist/server/.next/server/chunks/ssr/packages_server_src_app_eb845476._.js +3 -0
- package/dist/server/.next/server/chunks/ssr/packages_server_src_app_eb845476._.js.map +1 -0
- package/dist/server/.next/server/chunks/ssr/packages_server_src_app_layout_tsx_0712e1b4._.js +3 -0
- package/dist/server/.next/server/chunks/ssr/packages_server_src_app_layout_tsx_0712e1b4._.js.map +1 -0
- package/dist/server/.next/server/middleware-build-manifest.js +33 -1
- package/dist/server/.next/server/middleware-manifest.json +2 -2
- package/dist/server/.next/server/next-font-manifest.js +1 -1
- package/dist/server/.next/server/next-font-manifest.json +6 -1
- 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 +15 -0
- package/dist/server/.next/server/pages/_app/next-font-manifest.json +6 -0
- package/dist/server/.next/server/pages/_app/pages-manifest.json +3 -0
- package/dist/server/.next/server/pages/_app/react-loadable-manifest.json +1 -0
- package/dist/server/.next/server/pages/_app.js +5 -1
- package/dist/server/.next/server/pages/_app.js.map +5 -0
- package/dist/server/.next/server/pages/_app.js.nft.json +1 -1
- package/dist/server/.next/server/pages/_document/next-font-manifest.json +6 -0
- package/dist/server/.next/server/pages/_document/pages-manifest.json +3 -0
- package/dist/server/.next/server/pages/_document/react-loadable-manifest.json +1 -0
- package/dist/server/.next/server/pages/_document.js +6 -1
- package/dist/server/.next/server/pages/_document.js.map +5 -0
- package/dist/server/.next/server/pages/_document.js.nft.json +1 -1
- package/dist/server/.next/server/pages/_error/build-manifest.json +15 -0
- package/dist/server/.next/server/pages/_error/next-font-manifest.json +6 -0
- package/dist/server/.next/server/pages/_error/pages-manifest.json +3 -0
- package/dist/server/.next/server/pages/_error/react-loadable-manifest.json +1 -0
- package/dist/server/.next/server/pages/_error.js +8 -1
- package/dist/server/.next/server/pages/_error.js.map +5 -0
- package/dist/server/.next/server/pages/_error.js.nft.json +1 -1
- package/dist/server/.next/server/pages-manifest.json +1 -1
- package/dist/server/.next/server/server-reference-manifest.js +1 -1
- package/dist/server/.next/server/server-reference-manifest.json +5 -1
- package/dist/server/.next/static/0L93NbbowsMpjl-fJPWIj/_buildManifest.js +1 -0
- package/dist/server/.next/static/0L93NbbowsMpjl-fJPWIj/_ssgManifest.js +1 -0
- package/dist/server/.next/static/CcPdKvbUmZBYZz_Z0RQOI/_buildManifest.js +1 -0
- package/dist/server/.next/static/CcPdKvbUmZBYZz_Z0RQOI/_clientMiddlewareManifest.json +1 -0
- package/dist/server/.next/static/CcPdKvbUmZBYZz_Z0RQOI/_ssgManifest.js +1 -0
- package/dist/server/.next/static/G7Z-m_yayOJWJic2pMxim/_buildManifest.js +1 -0
- package/dist/server/.next/static/G7Z-m_yayOJWJic2pMxim/_clientMiddlewareManifest.json +1 -0
- package/dist/server/.next/static/G7Z-m_yayOJWJic2pMxim/_ssgManifest.js +1 -0
- package/dist/server/.next/static/Vj8TOfdXSkRSgi8JoSCLF/_buildManifest.js +1 -0
- package/dist/server/.next/static/Vj8TOfdXSkRSgi8JoSCLF/_ssgManifest.js +1 -0
- package/dist/server/.next/static/chunks/09f18d884b3a25a2.js.map +1 -0
- package/dist/server/.next/static/chunks/0dfafa95d29e5c79.js +3 -0
- package/dist/server/.next/static/chunks/0e57f1354cda05d5.js +3 -0
- package/dist/server/.next/static/chunks/1923d6510bea25be.js +3 -0
- package/dist/server/.next/static/chunks/1f1c09f06b1f73d5.css +3 -0
- package/dist/server/.next/static/chunks/2316c3dde76bf12d.js.map +1 -0
- package/dist/server/.next/static/chunks/249486689b72c55c.js +3 -0
- package/dist/server/.next/static/chunks/28309924e4c23ccc.js +5 -0
- package/dist/server/.next/static/chunks/2af4b91fa7a98c52.js.map +1 -0
- package/dist/server/.next/static/chunks/2b6075b99689b028.css.map +1 -0
- package/dist/server/.next/static/chunks/2c669537f498f2db.js.map +1 -0
- package/dist/server/.next/static/chunks/371387b426d53320.js +3 -0
- package/dist/server/.next/static/chunks/4553c25757d4836f.js +3 -0
- package/dist/server/.next/static/chunks/4695aadfc21f48b8.js +5 -0
- package/dist/server/.next/static/chunks/512b4b5323114f56.js +61 -0
- package/dist/server/.next/static/chunks/5a52f39dbf60c0c2.js +3 -0
- package/dist/server/.next/static/chunks/5e9dc9d078da6e2d.js.map +1 -0
- package/dist/server/.next/static/chunks/62b241f445063308.js.map +1 -0
- package/dist/server/.next/static/chunks/65c345a4e9ef046d.js.map +1 -0
- package/dist/server/.next/static/chunks/671a03c1fdfc08f8.js.map +1 -0
- package/dist/server/.next/static/chunks/684226c5a0f22bc1.js +3 -0
- package/dist/server/.next/static/chunks/6c6c1dcf9e7e2204.js.map +1 -0
- package/dist/server/.next/static/chunks/76692beeeb707278.css.map +1 -0
- package/dist/server/.next/static/chunks/7d7379cdf8fe9ec5.js +3 -0
- package/dist/server/.next/static/chunks/84f5ecdc99cc0be6.js.map +1 -0
- package/dist/server/.next/static/chunks/86b5e8830b67bd88.js.map +1 -0
- package/dist/server/.next/static/chunks/8969a52917bb9c0d.js.map +1 -0
- package/dist/server/.next/static/chunks/8d6bbd36cdf03018.js +5 -0
- package/dist/server/.next/static/chunks/9af4740ebb92591d.js.map +1 -0
- package/dist/server/.next/static/chunks/a7b45611d4ad55fe.js +4 -0
- package/dist/server/.next/static/chunks/a9cba6096fe97a30.js +5 -0
- package/dist/server/.next/static/chunks/c2cc02f47cf64419.js.map +1 -0
- package/dist/server/.next/static/chunks/cf3b2abf3523d13f.js +3 -0
- package/dist/server/.next/static/chunks/cf6e515377591a1f.js +3 -0
- package/dist/server/.next/static/chunks/d0ab7593ca8c77ca.js.map +1 -0
- package/dist/server/.next/static/chunks/d5028315079b40b4.js +5 -0
- package/dist/server/.next/static/chunks/da35f4984aadc7ee.css +3 -0
- package/dist/server/.next/static/chunks/ebfa652ea6e39124.js.map +1 -0
- package/dist/server/.next/static/chunks/ec548c7ce307cf6d.js +1 -0
- package/dist/server/.next/static/chunks/ecfccf4677b4777a.js +3 -0
- package/dist/server/.next/static/chunks/fc31ec097889736e.js +61 -0
- package/dist/server/.next/static/chunks/ffb74809cc596ae9.js.map +1 -0
- package/dist/server/.next/static/chunks/pages/_app.js +5 -0
- package/dist/server/.next/static/chunks/pages/_error.js +5 -0
- package/dist/server/.next/static/media/favicon.45db1c09.ico +0 -0
- package/dist/server/.next/static/qPRyAah5ijpk6JBI-hD27/_buildManifest.js +1 -0
- package/dist/server/.next/static/qPRyAah5ijpk6JBI-hD27/_clientMiddlewareManifest.json +1 -0
- package/dist/server/.next/static/qPRyAah5ijpk6JBI-hD27/_ssgManifest.js +1 -0
- package/dist/server/.next/trace +1 -4
- package/dist/server/.next/transform.js +7 -0
- package/dist/server/.next/transform.js.map +5 -0
- package/dist/server/.next/turbopack +0 -0
- package/package.json +1 -1
|
@@ -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/lib/process-monitor.ts","turbopack:///[project]/packages/server/src/app/api/process/start/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 fs from 'fs/promises';\nimport path from 'path';\nimport os from 'os';\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\n\nconst execAsync = promisify(exec);\n\n// 进程信息接口\ninterface ProcessInfo {\n key: string;\n projectName: string;\n envName: string;\n pid: number;\n startTime: Date;\n port: string;\n}\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 if (process.platform !== 'win32') {\n process.kill(pid, 0);\n return true;\n } else {\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// 加载并清理过期的进程信息\nexport async function loadAndCleanProcesses(): Promise<ProcessInfo[]> {\n try {\n const processInfoContent = await fs.readFile(getProcessStorePath(), 'utf-8');\n const processInfoList: ProcessInfo[] = JSON.parse(processInfoContent);\n \n // 过滤出仍在运行的进程\n const runningProcesses: ProcessInfo[] = [];\n \n for (const processInfo of processInfoList) {\n const isRunning = await isProcessRunning(processInfo.pid);\n if (isRunning) {\n runningProcesses.push(processInfo);\n }\n }\n \n // 如果有进程被清理,更新文件\n if (runningProcesses.length !== processInfoList.length) {\n await fs.writeFile(getProcessStorePath(), JSON.stringify(runningProcesses, null, 2));\n }\n \n return runningProcesses;\n } catch {\n // 文件不存在或解析错误,返回空数组\n return [];\n }\n}\n\n// 初始化进程监控 - 在应用启动时调用\nexport async function initializeProcessMonitoring() {\n console.log('初始化进程监控...');\n const processes = await loadAndCleanProcesses();\n console.log(`发现 ${processes.length} 个正在运行的进程`);\n return processes;\n}","import { NextRequest, NextResponse } from 'next/server';\nimport { spawn } from 'child_process';\nimport path from 'path';\nimport fs from 'fs/promises';\nimport os from 'os';\nimport { loadAndCleanProcesses } from '@/lib/process-monitor';\nimport { getProjectsConfig } from '@/lib/workspace-config';\nimport { WORKSPACE_CONFIG } from '@/lib/workspace-types';\n\n// 存储进程信息的Map\ninterface ProcessData {\n process: {\n pid: number;\n killed: boolean;\n kill?: () => void;\n on?: (event: string, callback: (code?: number) => void) => void;\n };\n projectName: string;\n envName: string;\n startTime: Date;\n port: string;\n logs: string[];\n maxLogLines?: number;\n}\n\nconst processes = new Map<string, ProcessData>();\nconst MAX_LOG_LINES = 1000; // 最多保存1000行日志\n\n// 获取进程存储文件路径\nfunction getProcessStorePath() {\n return path.join(os.homedir(), '.prime-processes.json');\n}\n\n// 获取进程日志文件路径\nfunction getProcessLogPath(processKey: string) {\n return path.join(os.homedir(), '.prime-process-logs', `${processKey}.log`);\n}\n\n// 保存进程日志\nasync function saveProcessLogs(processKey: string, logs: string[]) {\n const logDir = path.join(os.homedir(), '.prime-process-logs');\n const logPath = getProcessLogPath(processKey);\n \n try {\n // 确保日志目录存在\n await fs.mkdir(logDir, { recursive: true });\n // 写入日志文件\n await fs.writeFile(logPath, logs.join('\\n'), 'utf-8');\n } catch (error) {\n console.error('保存进程日志失败:', error);\n }\n}\n\n// 定期保存日志\nfunction startLogSaver(processKey: string) {\n const interval = setInterval(async () => {\n const processData = processes.get(processKey);\n if (processData) {\n await saveProcessLogs(processKey, processData.logs);\n } else {\n clearInterval(interval);\n }\n }, 5000); // 每5秒保存一次\n \n return interval;\n}\n\n// 保存进程信息到文件\nasync function saveProcessInfo() {\n const processInfo: {\n key: string;\n projectName: string;\n envName: string;\n startTime: Date;\n port: string;\n pid: number;\n }[] = [];\n processes.forEach((value, key) => {\n processInfo.push({\n key,\n projectName: value.projectName,\n envName: value.envName,\n startTime: value.startTime,\n port: value.port,\n pid: value.process.pid\n });\n });\n \n try {\n await fs.writeFile(getProcessStorePath(), JSON.stringify(processInfo, null, 2));\n } catch (error) {\n console.error('保存进程信息失败:', error);\n }\n}\n\n// 在启动时加载现有进程信息\nlet processesInitialized = false;\nasync function ensureProcessesLoaded() {\n if (!processesInitialized) {\n const existingProcesses = await loadAndCleanProcesses();\n for (const processInfo of existingProcesses) {\n // 恢复进程信息到内存,但不恢复实际的进程对象\n // 因为我们只需要知道进程存在,状态查询会检查实际的PID\n // 尝试加载已保存的日志\n const logs: string[] = [];\n try {\n const logPath = getProcessLogPath(processInfo.key);\n const logContent = await fs.readFile(logPath, 'utf-8');\n logs.push(...logContent.split('\\n').filter(line => line.trim()));\n } catch {\n // 日志文件不存在或读取失败,使用空日志\n }\n \n processes.set(processInfo.key, {\n process: { pid: processInfo.pid, killed: false },\n projectName: processInfo.projectName,\n envName: processInfo.envName,\n startTime: new Date(processInfo.startTime),\n port: processInfo.port,\n logs,\n maxLogLines: MAX_LOG_LINES\n });\n }\n processesInitialized = true;\n }\n}\n\nexport async function POST(request: NextRequest) {\n await ensureProcessesLoaded();\n try {\n const { projectName, envName, startCommand } = await request.json();\n\n if (!projectName || !envName || !startCommand) {\n return NextResponse.json({\n success: false,\n error: '缺少必要参数'\n }, { status: 400 });\n }\n\n // 生成进程的唯一标识\n const processKey = `${projectName}-${envName}`;\n\n // 检查进程是否已经在运行\n if (processes.has(processKey)) {\n const existingProcess = processes.get(processKey);\n if (existingProcess && existingProcess.process && !existingProcess.process.killed) {\n return NextResponse.json({\n success: false,\n error: '该环境已经在运行中'\n }, { status: 400 });\n }\n }\n\n // 读取配置文件获取工作区路径\n const config = await getProjectsConfig();\n \n // 使用工作区常量路径\n const workspacePath = WORKSPACE_CONFIG.WORKSPACE_ROOT;\n \n // 构建项目路径\n const projectPath = path.join(workspacePath, projectName);\n\n // 检查项目目录是否存在\n try {\n await fs.access(projectPath);\n } catch {\n return NextResponse.json({\n success: false,\n error: '项目目录不存在'\n }, { status: 404 });\n }\n\n // 解析命令\n const [command, ...args] = startCommand.split(' ');\n\n // 启动进程 - 不传递 env 参数,让子进程继承父进程环境变量\n // 但通过环境变量覆盖确保开发模式\n const childProcess = spawn(command, args, {\n cwd: projectPath,\n shell: true,\n detached: false,\n stdio: ['ignore', 'pipe', 'pipe'],\n env: {\n ...process.env,\n NODE_ENV: 'development', // 强制设置为开发模式\n FORCE_COLOR: '1', // 保留颜色输出\n }\n });\n\n // 获取项目配置中的端口信息\n const projectConfig = config[projectName];\n const envConfig = projectConfig?.envs?.[envName];\n const port = envConfig?.host?.split(':').pop() || '';\n\n // 初始化日志数组\n const logs: string[] = [];\n \n // 存储进程信息\n const processData: ProcessData = {\n process: {\n pid: childProcess.pid || 0,\n killed: false,\n kill: () => childProcess.kill(),\n on: (event: string, callback: (code?: number) => void) => {\n childProcess.on(event, callback);\n }\n },\n projectName,\n envName,\n startTime: new Date(),\n port,\n logs,\n maxLogLines: MAX_LOG_LINES\n };\n \n processes.set(processKey, processData);\n \n // 捕获标准输出\n if (childProcess.stdout) {\n childProcess.stdout.on('data', (data: Buffer) => {\n const text = data.toString();\n // 分割成行,但保留空行以便过滤\n const lines = text.split('\\n');\n \n lines.forEach(line => {\n // 过滤掉只包含控制序列的行\n const cleanedLine = line\n .replace(/\\x1b\\[[0-9;]*m/g, '') // 移除颜色代码\n .replace(/\\x1b\\[[0-9]*[A-Z]/g, '') // 移除光标控制\n .replace(/\\[\\d+[A-Z]/g, '') // 移除其他控制序列\n .trim();\n \n // 如果清理后的行不为空,则记录\n if (cleanedLine) {\n const logEntry = `[${new Date().toISOString()}] [STDOUT] ${line}`;\n logs.push(logEntry);\n // 限制日志大小\n if (logs.length > MAX_LOG_LINES) {\n logs.shift();\n }\n }\n });\n });\n }\n \n // 捕获标准错误\n if (childProcess.stderr) {\n childProcess.stderr.on('data', (data: Buffer) => {\n const text = data.toString();\n const lines = text.split('\\n');\n \n lines.forEach(line => {\n // 过滤掉只包含控制序列的行\n const cleanedLine = line\n .replace(/\\x1b\\[[0-9;]*m/g, '')\n .replace(/\\x1b\\[[0-9]*[A-Z]/g, '')\n .replace(/\\[\\d+[A-Z]/g, '')\n .trim();\n \n if (cleanedLine) {\n const logEntry = `[${new Date().toISOString()}] [STDERR] ${line}`;\n logs.push(logEntry);\n // 限制日志大小\n if (logs.length > MAX_LOG_LINES) {\n logs.shift();\n }\n }\n });\n });\n }\n\n // 保存进程信息到文件\n await saveProcessInfo();\n \n // 同时保存日志\n await saveProcessLogs(processKey, logs);\n\n // 启动日志定期保存\n const logSaveInterval = startLogSaver(processKey);\n \n // 监听进程退出\n childProcess.on('exit', async (code) => {\n console.log(`进程 ${processKey} 退出,退出码: ${code}`);\n const logEntry = `[${new Date().toISOString()}] [SYSTEM] 进程退出,退出码: ${code}`;\n logs.push(logEntry);\n \n // 最后一次保存日志\n await saveProcessLogs(processKey, logs);\n \n // 清理定时器\n clearInterval(logSaveInterval);\n \n processes.delete(processKey);\n await saveProcessInfo();\n });\n\n childProcess.on('error', (error) => {\n console.error(`进程 ${processKey} 错误:`, error);\n processes.delete(processKey);\n saveProcessInfo();\n });\n\n // 等待一小段时间确保进程启动\n await new Promise(resolve => setTimeout(resolve, 2000));\n\n // 检查进程是否仍在运行\n if (childProcess.killed) {\n processes.delete(processKey);\n await saveProcessInfo();\n return NextResponse.json({\n success: false,\n error: '进程启动失败'\n }, { status: 500 });\n }\n\n return NextResponse.json({\n success: true,\n data: {\n pid: childProcess.pid,\n startTime: new Date(),\n port\n }\n });\n } catch (error) {\n console.error('启动进程失败:', error);\n return NextResponse.json({\n success: false,\n error: error instanceof Error ? error.message : '启动进程失败'\n }, { status: 500 });\n }\n}\n\n// 停止进程\nexport async function DELETE(request: NextRequest) {\n await ensureProcessesLoaded();\n try {\n const { searchParams } = new URL(request.url);\n const projectName = searchParams.get('projectName');\n const envName = searchParams.get('envName');\n\n if (!projectName || !envName) {\n return NextResponse.json({\n success: false,\n error: '缺少必要参数'\n }, { status: 400 });\n }\n\n const processKey = `${projectName}-${envName}`;\n const processInfo = processes.get(processKey);\n\n if (!processInfo) {\n return NextResponse.json({\n success: false,\n error: '进程未找到'\n }, { status: 404 });\n }\n\n try {\n // 尝试优雅地终止进程\n process.kill(processInfo.process.pid, 'SIGTERM');\n \n // 给进程一些时间来清理\n await new Promise(resolve => setTimeout(resolve, 1000));\n \n // 如果进程仍在运行,强制终止\n try {\n process.kill(processInfo.process.pid, 0); // 检查进程是否存在\n process.kill(processInfo.process.pid, 'SIGKILL');\n } catch {\n // 进程已经退出\n }\n } catch (error) {\n console.error('终止进程失败:', error);\n }\n\n processes.delete(processKey);\n await saveProcessInfo();\n \n // 清理日志文件\n try {\n const logPath = getProcessLogPath(processKey);\n await fs.unlink(logPath);\n } catch {\n // 忽略删除失败\n }\n\n return NextResponse.json({\n success: true,\n message: '进程已停止'\n });\n } catch (error) {\n console.error('停止进程失败:', error);\n return NextResponse.json({\n success: false,\n error: error instanceof Error ? error.message : '停止进程失败'\n }, { status: 500 });\n }\n}","import {\n AppRouteRouteModule,\n type AppRouteRouteModuleOptions,\n} from '../../server/route-modules/app-route/module.compiled'\nimport { RouteKind } from '../../server/route-kind'\nimport { patchFetch as _patchFetch } from '../../server/lib/patch-fetch'\n\nimport * as userland from 'VAR_USERLAND'\n\n// These are injected by the loader afterwards. This is injected as a variable\n// instead of a replacement because this could also be `undefined` instead of\n// an empty string.\ndeclare const nextConfigOutput: AppRouteRouteModuleOptions['nextConfigOutput']\n\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\n// INJECT:nextConfigOutput\n\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: 'VAR_DEFINITION_PAGE',\n pathname: 'VAR_DEFINITION_PATHNAME',\n filename: 'VAR_DEFINITION_FILENAME',\n bundlePath: 'VAR_DEFINITION_BUNDLE_PATH',\n },\n resolvedPagePath: 'VAR_RESOLVED_PAGE_PATH',\n nextConfigOutput,\n userland,\n})\n\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule\n\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage,\n })\n}\n\nexport {\n routeModule,\n workAsyncStorage,\n workUnitAsyncStorage,\n serverHooks,\n patchFetch,\n}\n"],"names":["AppRouteRouteModule","RouteKind","patchFetch","_patchFetch","userland","routeModule","definition","kind","APP_ROUTE","page","pathname","filename","bundlePath","resolvedPagePath","nextConfigOutput","workAsyncStorage","workUnitAsyncStorage","serverHooks"],"mappings":"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","ignoreList":[4]}
|
|
@@ -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:()=>c,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 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 c=function(e){return e.PENDING="pending",e.EXISTING="existing",e.CLONING="cloning",e.SUCCESS="success",e.FAILED="failed",e.RETRYING="retrying",e}({})},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}({})}},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"))},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),a=e.i(35692),c=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);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,a.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 d=l.split("?")[0].replace(/^\//,"").replace(/\//g,"_")||"root",m=(0,n.join)(c.WORKSPACE_CONFIG.WORKSPACE_ROOT,p),j=(0,n.join)(m,".mock"),f=(0,n.join)(j,d),v=(0,n.join)(f,x.toLowerCase()),N=(0,n.join)(v,"setting.js");try{await o.promises.access(N)}catch{return s.NextResponse.json({success:!1,error:`Mock配置文件不存在: ${d}/${x.toLowerCase()}/setting.js`},{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.js失败: ${N}`,e)}}catch(e){return console.error(`读取setting.js失败: ${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 C=(0,n.join)(v,`${t}.js`);try{await o.promises.access(C)}catch{return s.NextResponse.json({success:!1,error:`Mock场景文件不存在: ${d}/${x.toLowerCase()}/${t}.js`},{status:404})}try{let e=r((0,n.resolve)(C));if(delete r.cache[(0,n.resolve)(C)],!e)return s.NextResponse.json({success:!1,error:"Mock文件格式不正确"},{status:500});try{i=e}catch(e){return console.warn(`解析Mock文件失败: ${C}`,e),s.NextResponse.json({success:!1,error:"解析Mock数据失败"},{status:500})}}catch(e){return console.error(`读取Mock文件失败: ${C}`,e),s.NextResponse.json({success:!1,error:"读取Mock数据失败"},{status:500})}return s.NextResponse.json({success:!0,data:{projectName:p,apiName:d,method:x.toLowerCase(),currentSite:t,mockData:i,filePath:(0,n.join)(".mock",d,x.toLowerCase(),`${t}.js`)},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:()=>c,routeModule:()=>r,serverHooks:()=>u,workAsyncStorage:()=>t,workUnitAsyncStorage:()=>i});var s=e.i(45746),o=e.i(93828),n=e.i(18250),a=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:a}),{workAsyncStorage:t,workUnitAsyncStorage:i,serverHooks:u}=r;function c(){return(0,n.patchFetch)({workAsyncStorage:t,workUnitAsyncStorage:i})}}}};
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=%5Broot-of-the-server%5D__ec0f2f72._.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);\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 // 处理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.js');\n\n // 检查setting.js文件是否存在\n try {\n await fs.access(settingFilePath);\n } catch {\n return NextResponse.json(\n { success: false, error: `Mock配置文件不存在: ${apiName}/${method.toLowerCase()}/setting.js` },\n { status: 404 },\n );\n }\n\n // 读取setting.js文件内容\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.js失败: ${settingFilePath}`, parseError);\n }\n }\n } catch (error) {\n console.error(`读取setting.js失败: ${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}.js`);\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}.js` },\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}.js`),\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]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
module.exports={45935:function(e){var{g:r,__dirname:t,m:n,e:s}=e;n.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 n=e.i(9892),s=e.i(88941);async function o(){try{await (0,n.access)(s.PROJECT_CONFIG_PATH,n.constants.F_OK)}catch{return await i({}),{}}try{let e=await (0,n.readFile)(s.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=s.PROJECT_CONFIG_PATH+".tmp";try{await (0,n.writeFile)(r,JSON.stringify(e,null,2),"utf-8"),await (0,n.rename)(r,s.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}({})},88941:e=>{"use strict";var{g:r,__dirname:t}=e;{e.s({PROJECT_CONFIG_PATH:()=>t,ProjectStatus:()=>o,WORKSPACE_CONFIG:()=>r});var n=e.i(13442),s=e.i(30331);let r={WORKSPACE_ROOT:(0,s.join)((0,n.homedir)(),"Documents","prime-workspace"),GIT_TIMEOUT:3e5,MAX_CONCURRENT_CLONES:Math.max(2,Math.min((0,n.cpus)().length,8)),MAX_RETRY_ATTEMPTS:3},t=(0,s.join)((0,n.homedir)(),".prime-projects.json");var o=function(e){return e.PENDING="pending",e.EXISTING="existing",e.CLONING="cloning",e.SUCCESS="success",e.FAILED="failed",e.RETRYING="retrying",e.INCOMPLETE="incomplete",e}({})}},29549:function(e){var{g:r,__dirname:t,m:n,e:s}=e;n.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:n,e:s}=e;n.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:n,e:s}=e;n.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:n,e:s}=e;n.exports=e.x("path",()=>require("path"))},23430:function(e){var{g:r,__dirname:t,m:n,e:s}=e;n.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},13442:function(e){var{g:r,__dirname:t,m:n,e:s}=e;n.exports=e.x("os",()=>require("os"))},52670:function(e){var{g:r,__dirname:t,m:n,e:s}=e;n.exports=e.x("next/dist/compiled/next-server/app-route-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-route-turbo.runtime.prod.js"))},9892:function(e){var{g:r,__dirname:t,m:n,e:s}=e;n.exports=e.x("fs/promises",()=>require("fs/promises"))},76687:function(e){var{g:r,__dirname:t,m:n,e:s}=e},84038:e=>{"use strict";var{g:r,__dirname:t}=e;e.s({GET:()=>o});var n=e.i(15494),s=e.i(35692);async function o(e){try{let{searchParams:r}=new URL(e.url),t=r.get("project");if(!t)return n.NextResponse.json({success:!1,error:"项目名称参数缺失"},{status:400});let o=await (0,s.getProjectsConfig)();if(!o[t])return n.NextResponse.json({success:!1,error:`项目 ${t} 不存在`},{status:404});let i=o[t];return n.NextResponse.json({success:!0,data:{mockingIntercept:i.mockingIntercept||!1,mockOpen:i.mockOpen||!1}})}catch(r){let e=r instanceof Error?r.message:"获取Mock拦截状态失败";return console.error("获取Mock拦截状态失败:",r),n.NextResponse.json({success:!1,error:e},{status:500})}}},30449:e=>{"use strict";var{g:r,__dirname:t}=e;{e.s({patchFetch:()=>a,routeModule:()=>r,serverHooks:()=>p,workAsyncStorage:()=>t,workUnitAsyncStorage:()=>c});var n=e.i(45746),s=e.i(93828),o=e.i(18250),i=e.i(84038);let r=new n.AppRouteRouteModule({definition:{kind:s.RouteKind.APP_ROUTE,page:"/api/check-mock-intercept/route",pathname:"/api/check-mock-intercept",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/check-mock-intercept/route.ts",nextConfigOutput:"",userland:i}),{workAsyncStorage:t,workUnitAsyncStorage:c,serverHooks:p}=r;function a(){return(0,o.patchFetch)({workAsyncStorage:t,workUnitAsyncStorage:c})}}}};
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=%5Broot-of-the-server%5D__ec631eb4._.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/check-mock-intercept/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 { getProjectsConfig } from '@/lib/workspace-config';\n\nexport async function GET(request: NextRequest) {\n try {\n const { searchParams } = new URL(request.url);\n const projectName = searchParams.get('project');\n\n if (!projectName) {\n return NextResponse.json(\n { success: false, error: '项目名称参数缺失' },\n { status: 400 },\n );\n }\n\n // 读取项目配置文件\n const projectsConfig = await getProjectsConfig();\n\n // 检查项目是否存在\n if (!projectsConfig[projectName]) {\n return NextResponse.json(\n { success: false, error: `项目 ${projectName} 不存在` },\n { status: 404 },\n );\n }\n\n const projectConfig = projectsConfig[projectName];\n\n return NextResponse.json({\n success: true,\n data: {\n mockingIntercept: projectConfig.mockingIntercept || false,\n mockOpen: projectConfig.mockOpen || false,\n },\n });\n } catch (error) {\n const errorMessage =\n 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]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module.exports={29549:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.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:s,m:r,e:n}=e;r.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:s,m:r,e:n}=e;r.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:s,m:r,e:n}=e;r.exports=e.x("path",()=>require("path"))},23430:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},13442:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.exports=e.x("os",()=>require("os"))},52670:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.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:s}=e;{e.s({PROJECT_CONFIG_PATH:()=>s,ProjectStatus:()=>o,WORKSPACE_CONFIG:()=>t});var r=e.i(13442),n=e.i(30331);let t={WORKSPACE_ROOT:(0,n.join)((0,r.homedir)(),"Documents","prime-workspace"),GIT_TIMEOUT:3e5,MAX_CONCURRENT_CLONES:Math.max(2,Math.min((0,r.cpus)().length,8)),MAX_RETRY_ATTEMPTS:3},s=(0,n.join)((0,r.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}({})}},83886:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.exports=e.x("fs",()=>require("fs"))},87485:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.exports=e.x("child_process",()=>require("child_process"))},77159:e=>{"use strict";var{g:t,__dirname:s}=e;e.s({checkMultipleProjectsExist:()=>f,checkProjectExists:()=>d,checkProjectStatus:()=>l,cleanupIncompleteProject:()=>m,cloneRepository:()=>a,createWorkspaceDirectory:()=>c,isValidGitUrl:()=>u,openProjectInCursor:()=>x,sanitizeProjectName:()=>p});var r=e.i(87485),n=e.i(83886),o=e.i(30331),i=e.i(88941);async function c(e){try{return(0,n.existsSync)(e)||(0,n.mkdirSync)(e,{recursive:!0}),{success:!0}}catch(e){return{success:!1,error:`创建工作空间目录失败: ${e instanceof Error?e.message:String(e)}`}}}async function a(e){let{repoUrl:t,targetDir:s,timeout:n,onProgress:c,onError:a,onLog:u}=e,p=(0,o.basename)(t,".git");return new Promise(e=>{let l=Date.now(),d={projectName:p,status:i.ProjectStatus.CLONING,progress:0,message:"开始克隆项目...",startTime:l};c?.(0,"开始克隆项目...");let g=(0,o.join)(s,p),m=["clone","--progress","--verbose",t,g];u?.(p,"stdout",`[开始克隆] 执行命令: git ${m.join(" ")}
|
|
2
|
+
`),u?.(p,"stdout",`[目标目录] ${g}
|
|
3
|
+
`),u?.(p,"stdout",`[仓库地址] ${t}
|
|
4
|
+
`);let f=(0,r.spawn)("git",m,{cwd:s,stdio:["pipe","pipe","pipe"]}),x="",j=0;u?.(p,"stdout",`[进程启动] Git 进程 PID: ${f.pid}
|
|
5
|
+
`);let y=setTimeout(()=>{u?.(p,"stderr",`[超时警告] Git 进程运行超过 ${n/1e3}s,即将终止
|
|
6
|
+
`),f.kill("SIGTERM");let t={...d,status:i.ProjectStatus.FAILED,progress:j,message:"克隆操作超时",error:`克隆操作超时 (${n/1e3}s)`,endTime:Date.now()};u?.(p,"stderr",`[进程终止] 克隆操作超时
|
|
7
|
+
`),a?.(`${p}: 克隆操作超时`),e(t)},n);f.stdout?.on("data",e=>{let t=e.toString();u?.(p,"stdout",t),j=Math.min(j+10,80),c?.(j,"正在克隆代码...")}),f.stderr?.on("data",e=>{let t=e.toString();x+=t,t.includes("remote:")||t.includes("Receiving objects")||t.includes("Resolving deltas")||t.includes("Counting objects")||t.includes("Enumerating objects")||t.includes("Compressing objects")||t.includes("upload-pack")||t.includes("POST git-")||t.includes("正克隆到")||t.includes("Cloning into")?u?.(p,"progress",t):u?.(p,"stderr",t),t.includes("Receiving objects")||t.includes("Resolving deltas")?(j=Math.min(j+5,90),c?.(j,"正在接收对象...")):t.includes("Counting objects")?(j=Math.min(j+2,70),c?.(j,"正在计算对象...")):t.includes("Enumerating objects")&&(j=Math.min(j+2,50),c?.(j,"正在枚举对象..."))}),f.on("close",t=>{clearTimeout(y);let s=Date.now(),r=s-l;if(u?.(p,"stdout",`[进程结束] Git 进程退出,代码: ${t},耗时: ${Math.round(r/1e3)}s
|
|
8
|
+
`),0===t){u?.(p,"stdout",`[克隆成功] 项目已成功克隆到: ${g}
|
|
9
|
+
`);let t={...d,status:i.ProjectStatus.SUCCESS,progress:100,message:"克隆完成",endTime:s};c?.(100,"克隆完成"),e(t)}else{let r=function(e){let t=e.toLowerCase();return t.includes("authentication failed")||t.includes("access denied")?"身份验证失败,请检查仓库访问权限":t.includes("repository not found")||t.includes("not found")?"仓库不存在或无法访问":t.includes("network")||t.includes("connection")?"网络连接问题,请检查网络设置":t.includes("timeout")?"网络超时,请重试":t.includes("permission denied")?"权限被拒绝,请检查文件系统权限":t.includes("already exists")?"目标目录已存在":e.slice(0,200)+(e.length>200?"...":"")}(x);u?.(p,"stderr",`[克隆失败] 错误信息: ${r}
|
|
10
|
+
`),u?.(p,"stderr",`[完整错误输出]
|
|
11
|
+
${x}
|
|
12
|
+
`);let n={...d,status:i.ProjectStatus.FAILED,progress:j,message:"克隆失败",error:r||`Git 进程退出,代码: ${t}`,endTime:s};a?.(`${p}: ${n.error}`),e(n)}}),f.on("error",t=>{clearTimeout(y),u?.(p,"stderr",`[进程错误] Git 进程启动失败: ${t.message}
|
|
13
|
+
`),u?.(p,"stderr",`[错误详情] ${t.stack||"No stack trace"}
|
|
14
|
+
`);let s={...d,status:i.ProjectStatus.FAILED,progress:j,message:"进程启动失败",error:`进程启动失败: ${t.message}`,endTime:Date.now()};a?.(`${p}: ${t.message}`),e(s)})})}function u(e){return/^(https?:\/\/|git@)[^\s]+\.git$/i.test(e)}function p(e){return e.replace(/[^a-zA-Z0-9\-_]/g,"")}async function l(e,t){try{let s=(0,o.join)(e,t);if(!(0,n.existsSync)(s))return{exists:!1,status:"not_exists",needsCleanup:!1};let r=(0,o.join)(s,".git");if(!(0,n.existsSync)(r))return{exists:!0,status:"incomplete",needsCleanup:!0};if(!await g(s))return console.log(`检测到不完整的Git仓库: ${s}`),{exists:!0,status:"incomplete",needsCleanup:!0};return{exists:!0,status:"complete",needsCleanup:!1}}catch(e){return console.error(`检查项目 ${t} 状态时出错:`,e),{exists:!1,status:"not_exists",needsCleanup:!1}}}async function d(e,t){return"complete"===(await l(e,t)).status}async function g(e){try{let t=(0,o.join)(e,".git");for(let e of["HEAD","config","refs"]){let s=(0,o.join)(t,e);if(!(0,n.existsSync)(s))return!1}let s=(await n.promises.readdir(e)).filter(e=>".git"!==e);if(0===s.length)return!1;let r=(0,o.join)(t,"HEAD"),i=await n.promises.readFile(r,"utf-8");if(!i.trim()||i.includes("unborn"))return!1;return!0}catch(e){return console.error("检查Git仓库完整性时出错:",e),!1}}async function m(e){try{console.log(`正在清理不完整的项目: ${e}`),await n.promises.rm(e,{recursive:!0,force:!0}),console.log(`清理完成: ${e}`)}catch(t){console.error(`清理项目失败 ${e}:`,t)}}async function f(e,t){let s={},r=t.map(async t=>{let r=await d(e,t);s[t]=r});return await Promise.all(r),s}async function x(e){return new Promise(t=>{if(!(0,n.existsSync)(e))return void t({success:!1,error:`项目路径不存在: ${e}`});let s=(0,r.spawn)("cursor",[e],{stdio:["ignore","pipe","pipe"],detached:!0,env:{...process.env,NODE_ENV:"development"}}),o="",i=setTimeout(()=>{s.kill("SIGTERM"),t({success:!1,error:"Cursor 命令执行超时"})},1e4);s.stderr?.on("data",e=>{o+=e.toString()}),s.on("exit",e=>{clearTimeout(i),0===e?t({success:!0}):t({success:!1,error:`Cursor 退出代码: ${e}${o?`, 错误: ${o}`:""}`})}),s.on("error",e=>{clearTimeout(i),e.message.includes("ENOENT")?t({success:!1,error:"Cursor 命令未找到,请确保 Cursor CLI 已正确安装并在 PATH 中"}):t({success:!1,error:`启动 Cursor 失败: ${e.message}`})}),s.unref()})}},19294:function(e){var{g:t,__dirname:s,m:r,e:n}=e},18089:e=>{"use strict";var{g:t,__dirname:s}=e;e.s({POST:()=>i});var r=e.i(88941),n=e.i(77159),o=e.i(30331);async function i(e){try{let{projectName:t}=await e.json();if(!t||"string"!=typeof t)return new Response(JSON.stringify({success:!1,error:"项目名称是必需的"}),{status:400,headers:{"Content-Type":"application/json"}});if((0,n.sanitizeProjectName)(t)!==t)return new Response(JSON.stringify({success:!1,error:"项目名称包含无效字符"}),{status:400,headers:{"Content-Type":"application/json"}});let s=r.WORKSPACE_CONFIG.WORKSPACE_ROOT,i=(0,o.join)(s,t),c=await (0,n.openProjectInCursor)(i);if(c.success)return new Response(JSON.stringify({success:!0,message:`项目 ${t} 已在 Cursor 中打开`,projectPath:i}),{status:200,headers:{"Content-Type":"application/json"}});return new Response(JSON.stringify({success:!1,error:c.error,projectName:t,projectPath:i}),{status:500,headers:{"Content-Type":"application/json"}})}catch(t){let e=t instanceof Error?t.message:String(t);return console.error("打开项目失败:",t),new Response(JSON.stringify({success:!1,error:`打开项目失败: ${e}`}),{status:500,headers:{"Content-Type":"application/json"}})}}},4550:e=>{"use strict";var{g:t,__dirname:s}=e;{e.s({patchFetch:()=>c,routeModule:()=>t,serverHooks:()=>u,workAsyncStorage:()=>s,workUnitAsyncStorage:()=>a});var r=e.i(45746),n=e.i(93828),o=e.i(18250),i=e.i(18089);let t=new r.AppRouteRouteModule({definition:{kind:n.RouteKind.APP_ROUTE,page:"/api/open-project/route",pathname:"/api/open-project",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/open-project/route.ts",nextConfigOutput:"",userland:i}),{workAsyncStorage:s,workUnitAsyncStorage:a,serverHooks:u}=t;function c(){return(0,o.patchFetch)({workAsyncStorage:s,workUnitAsyncStorage:a})}}}};
|
|
15
|
+
|
|
16
|
+
//# sourceMappingURL=%5Broot-of-the-server%5D__f6d4fb58._.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["turbopack:///[project]/packages/server/src/lib/workspace-types.ts","turbopack:///[project]/packages/server/src/lib/git-operations.ts","turbopack:///[project]/packages/server/src/app/api/open-project/route.ts","turbopack:///[project]/node_modules/.pnpm/next@15.3.4_react-dom@19.1.0_react@19.1.0__react@19.1.0/node_modules/next/dist/src/build/templates/app-route.ts"],"sourcesContent":["import { homedir, cpus } from 'os';\nimport { join } from 'path';\n\n/**\n * 工作空间配置常量\n */\nexport const WORKSPACE_CONFIG = {\n // 工作空间根目录路径\n WORKSPACE_ROOT: join(homedir(), 'Documents', 'prime-workspace'),\n\n // Git 操作超时时间 (毫秒)\n GIT_TIMEOUT: 300000, // 5分钟\n\n // 最大并发克隆数量(基于CPU核心数,最小2个,最大8个)\n MAX_CONCURRENT_CLONES: Math.max(2, Math.min(cpus().length, 8)),\n\n // 重试次数限制\n MAX_RETRY_ATTEMPTS: 3,\n} as const;\n\nexport const PROJECT_CONFIG_PATH = join(homedir(), '.prime-projects.json');\n\nexport interface ProjectConfig {\n repo: string;\n mockingIntercept?: boolean;\n mockOpen?: boolean;\n envs: {\n [envName: string]: {\n host: string;\n currentProxy: string;\n proxyEnv: {\n [key: string]: string;\n };\n envFileName: string;\n proxyKey: string;\n subApps?: string[];\n };\n };\n}\n\nexport interface ProjectsConfig {\n [projectName: string]: ProjectConfig;\n}\n\n/**\n * 项目状态枚举\n */\nexport enum ProjectStatus {\n PENDING = 'pending',\n EXISTING = 'existing',\n CLONING = 'cloning',\n SUCCESS = 'success',\n FAILED = 'failed',\n RETRYING = 'retrying',\n INCOMPLETE = 'incomplete', // 不完整的项目,需要清理\n}\n\n/**\n * 项目进度信息接口\n */\nexport interface ProjectProgress {\n projectName: string;\n status: ProjectStatus;\n progress: number; // 0-100\n message: string;\n error?: string;\n startTime?: number;\n endTime?: number;\n}\n\n/**\n * 初始化结果接口\n */\nexport interface InitializationResult {\n success: boolean;\n totalProjects: number;\n successCount: number;\n failedCount: number;\n failedProjects: string[];\n workspacePath: string;\n duration: number;\n}\n\n/**\n * Git 操作配置接口\n */\nexport interface GitOperationConfig {\n repoUrl: string;\n targetDir: string;\n timeout: number;\n onProgress?: (progress: number, message: string) => void;\n onError?: (error: string) => void;\n onLog?: (projectName: string, logType: 'stdout' | 'stderr' | 'progress', content: string) => void;\n} ","import { spawn, ChildProcess } from 'child_process';\nimport { existsSync, mkdirSync } from 'fs';\nimport { promises as fs } from 'fs';\nimport { join, basename } from 'path';\nimport {\n ProjectStatus,\n type GitOperationConfig,\n type ProjectProgress,\n} from './workspace-types';\n\n/**\n * 创建工作空间目录\n * @param workspacePath 工作空间路径\n * @returns 创建结果\n */\nexport async function createWorkspaceDirectory(workspacePath: string): Promise<{ success: boolean; error?: string }> {\n try {\n if (!existsSync(workspacePath)) {\n mkdirSync(workspacePath, { recursive: true });\n }\n return { success: true };\n } catch (error) {\n return { \n success: false, \n error: `创建工作空间目录失败: ${error instanceof Error ? error.message : String(error)}` \n };\n }\n}\n\n/**\n * 执行 Git 克隆操作\n * @param config Git 操作配置\n * @returns Promise<ProjectProgress>\n */\nexport async function cloneRepository(config: GitOperationConfig): Promise<ProjectProgress> {\n const { repoUrl, targetDir, timeout, onProgress, onError, onLog } = config;\n const projectName = basename(repoUrl, '.git');\n \n return new Promise<ProjectProgress>((resolve) => {\n const startTime = Date.now();\n \n // 更新开始状态\n const initialProgress: ProjectProgress = {\n projectName,\n status: ProjectStatus.CLONING,\n progress: 0,\n message: '开始克隆项目...',\n startTime,\n };\n onProgress?.(0, '开始克隆项目...');\n\n // 执行 git clone 命令\n const targetPath = join(targetDir, projectName);\n // 添加 --progress 参数来强制显示进度,--verbose 显示详细信息\n const gitArgs = ['clone', '--progress', '--verbose', repoUrl, targetPath];\n \n // 记录命令启动信息\n onLog?.(projectName, 'stdout', `[开始克隆] 执行命令: git ${gitArgs.join(' ')}\\n`);\n onLog?.(projectName, 'stdout', `[目标目录] ${targetPath}\\n`);\n onLog?.(projectName, 'stdout', `[仓库地址] ${repoUrl}\\n`);\n \n const gitProcess: ChildProcess = spawn('git', gitArgs, {\n cwd: targetDir,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n let errorOutput = '';\n let progressValue = 0;\n \n // 记录进程启动成功\n onLog?.(projectName, 'stdout', `[进程启动] Git 进程 PID: ${gitProcess.pid}\\n`);\n\n // 设置超时\n const timeoutId = setTimeout(() => {\n onLog?.(projectName, 'stderr', `[超时警告] Git 进程运行超过 ${timeout / 1000}s,即将终止\\n`);\n gitProcess.kill('SIGTERM');\n \n const errorResult: ProjectProgress = {\n ...initialProgress,\n status: ProjectStatus.FAILED,\n progress: progressValue,\n message: '克隆操作超时',\n error: `克隆操作超时 (${timeout / 1000}s)`,\n endTime: Date.now(),\n };\n onLog?.(projectName, 'stderr', `[进程终止] 克隆操作超时\\n`);\n onError?.(`${projectName}: 克隆操作超时`);\n resolve(errorResult);\n }, timeout);\n\n // 处理标准输出\n gitProcess.stdout?.on('data', (data: Buffer) => {\n const stdoutText = data.toString();\n \n // 实时发送日志\n onLog?.(projectName, 'stdout', stdoutText);\n \n // 模拟进度更新(Git 克隆没有内置进度,这里基于时间估算)\n progressValue = Math.min(progressValue + 10, 80);\n onProgress?.(progressValue, '正在克隆代码...');\n });\n\n // 处理错误输出\n gitProcess.stderr?.on('data', (data: Buffer) => {\n const stderrText = data.toString();\n errorOutput += stderrText;\n \n // 判断是进度信息还是错误信息\n const isProgressInfo = stderrText.includes('remote:') || \n stderrText.includes('Receiving objects') || \n stderrText.includes('Resolving deltas') ||\n stderrText.includes('Counting objects') ||\n stderrText.includes('Enumerating objects') ||\n stderrText.includes('Compressing objects') ||\n stderrText.includes('upload-pack') ||\n stderrText.includes('POST git-') ||\n stderrText.includes('正克隆到') ||\n stderrText.includes('Cloning into');\n \n // 根据内容类型发送不同的日志\n if (isProgressInfo) {\n onLog?.(projectName, 'progress', stderrText);\n } else {\n onLog?.(projectName, 'stderr', stderrText);\n }\n \n // Git 的进度信息通常在 stderr 中\n if (stderrText.includes('Receiving objects') || stderrText.includes('Resolving deltas')) {\n progressValue = Math.min(progressValue + 5, 90);\n onProgress?.(progressValue, '正在接收对象...');\n } else if (stderrText.includes('Counting objects')) {\n progressValue = Math.min(progressValue + 2, 70);\n onProgress?.(progressValue, '正在计算对象...');\n } else if (stderrText.includes('Enumerating objects')) {\n progressValue = Math.min(progressValue + 2, 50);\n onProgress?.(progressValue, '正在枚举对象...');\n }\n });\n\n // 处理进程结束\n gitProcess.on('close', (code: number | null) => {\n clearTimeout(timeoutId);\n const endTime = Date.now();\n const duration = endTime - startTime;\n \n onLog?.(projectName, 'stdout', `[进程结束] Git 进程退出,代码: ${code},耗时: ${Math.round(duration / 1000)}s\\n`);\n \n if (code === 0) {\n // 克隆成功\n onLog?.(projectName, 'stdout', `[克隆成功] 项目已成功克隆到: ${targetPath}\\n`);\n const successResult: ProjectProgress = {\n ...initialProgress,\n status: ProjectStatus.SUCCESS,\n progress: 100,\n message: '克隆完成',\n endTime,\n };\n onProgress?.(100, '克隆完成');\n resolve(successResult);\n } else {\n // 克隆失败\n const parsedError = parseGitError(errorOutput);\n onLog?.(projectName, 'stderr', `[克隆失败] 错误信息: ${parsedError}\\n`);\n onLog?.(projectName, 'stderr', `[完整错误输出]\\n${errorOutput}\\n`);\n \n const failureResult: ProjectProgress = {\n ...initialProgress,\n status: ProjectStatus.FAILED,\n progress: progressValue,\n message: '克隆失败',\n error: parsedError || `Git 进程退出,代码: ${code}`,\n endTime,\n };\n onError?.(`${projectName}: ${failureResult.error}`);\n resolve(failureResult);\n }\n });\n\n // 处理进程错误\n gitProcess.on('error', (error: Error) => {\n clearTimeout(timeoutId);\n onLog?.(projectName, 'stderr', `[进程错误] Git 进程启动失败: ${error.message}\\n`);\n onLog?.(projectName, 'stderr', `[错误详情] ${error.stack || 'No stack trace'}\\n`);\n \n const errorResult: ProjectProgress = {\n ...initialProgress,\n status: ProjectStatus.FAILED,\n progress: progressValue,\n message: '进程启动失败',\n error: `进程启动失败: ${error.message}`,\n endTime: Date.now(),\n };\n onError?.(`${projectName}: ${error.message}`);\n resolve(errorResult);\n });\n });\n}\n\n/**\n * 解析 Git 错误信息,提供用户友好的错误描述\n * @param errorOutput Git stderr 输出\n * @returns 用户友好的错误描述\n */\nfunction parseGitError(errorOutput: string): string {\n const lowerOutput = errorOutput.toLowerCase();\n \n if (lowerOutput.includes('authentication failed') || lowerOutput.includes('access denied')) {\n return '身份验证失败,请检查仓库访问权限';\n }\n \n if (lowerOutput.includes('repository not found') || lowerOutput.includes('not found')) {\n return '仓库不存在或无法访问';\n }\n \n if (lowerOutput.includes('network') || lowerOutput.includes('connection')) {\n return '网络连接问题,请检查网络设置';\n }\n \n if (lowerOutput.includes('timeout')) {\n return '网络超时,请重试';\n }\n \n if (lowerOutput.includes('permission denied')) {\n return '权限被拒绝,请检查文件系统权限';\n }\n \n if (lowerOutput.includes('already exists')) {\n return '目标目录已存在';\n }\n \n // 返回原始错误的前200个字符\n return errorOutput.slice(0, 200) + (errorOutput.length > 200 ? '...' : '');\n}\n\n/**\n * 验证 Git 仓库 URL 格式\n * @param url Git 仓库 URL\n * @returns 是否有效\n */\nexport function isValidGitUrl(url: string): boolean {\n const gitUrlPattern = /^(https?:\\/\\/|git@)[^\\s]+\\.git$/i;\n return gitUrlPattern.test(url);\n}\n\n/**\n * 清理项目名称,移除不安全字符\n * @param projectName 项目名称\n * @returns 清理后的项目名称\n */\nexport function sanitizeProjectName(projectName: string): string {\n return projectName.replace(/[^a-zA-Z0-9\\-_]/g, '');\n}\n\n/**\n * 项目检查结果类型\n */\nexport type ProjectCheckResult = {\n exists: boolean;\n status: 'not_exists' | 'complete' | 'incomplete';\n needsCleanup: boolean;\n};\n\n/**\n * 检查项目状态(详细版本)\n * @param workspacePath 工作空间路径\n * @param projectName 项目名称\n * @returns Promise<ProjectCheckResult> 详细的项目状态\n */\nexport async function checkProjectStatus(workspacePath: string, projectName: string): Promise<ProjectCheckResult> {\n try {\n const projectPath = join(workspacePath, projectName);\n \n // 检查项目目录是否存在\n if (!existsSync(projectPath)) {\n return {\n exists: false,\n status: 'not_exists',\n needsCleanup: false\n };\n }\n \n // 检查是否为 Git 仓库(存在 .git 目录)\n const gitPath = join(projectPath, '.git');\n if (!existsSync(gitPath)) {\n return {\n exists: true,\n status: 'incomplete',\n needsCleanup: true\n };\n }\n \n // 更严格的完整性检查\n const isComplete = await isGitRepositoryComplete(projectPath);\n if (!isComplete) {\n console.log(`检测到不完整的Git仓库: ${projectPath}`);\n return {\n exists: true,\n status: 'incomplete',\n needsCleanup: true\n };\n }\n \n return {\n exists: true,\n status: 'complete',\n needsCleanup: false\n };\n } catch (error) {\n console.error(`检查项目 ${projectName} 状态时出错:`, error);\n return {\n exists: false,\n status: 'not_exists',\n needsCleanup: false\n };\n }\n}\n\n/**\n * 检查项目是否已存在于工作空间中(兼容版本)\n * @param workspacePath 工作空间路径\n * @param projectName 项目名称\n * @returns Promise<boolean> 项目是否存在且为有效的 Git 仓库\n */\nexport async function checkProjectExists(workspacePath: string, projectName: string): Promise<boolean> {\n const result = await checkProjectStatus(workspacePath, projectName);\n return result.status === 'complete';\n}\n\n/**\n * 检查Git仓库是否完整\n * @param projectPath 项目路径\n * @returns Promise<boolean> 仓库是否完整\n */\nasync function isGitRepositoryComplete(projectPath: string): Promise<boolean> {\n try {\n const gitPath = join(projectPath, '.git');\n \n // 检查关键的Git文件是否存在\n const requiredFiles = ['HEAD', 'config', 'refs'];\n for (const file of requiredFiles) {\n const filePath = join(gitPath, file);\n if (!existsSync(filePath)) {\n return false;\n }\n }\n \n // 检查是否有实际的项目文件(不只是.git目录)\n const entries = await fs.readdir(projectPath);\n const nonGitFiles = entries.filter((entry: string) => entry !== '.git');\n \n // 如果只有.git目录,说明克隆未完成\n if (nonGitFiles.length === 0) {\n return false;\n }\n \n // 检查HEAD文件是否有效\n const headPath = join(gitPath, 'HEAD');\n const headContent = await fs.readFile(headPath, 'utf-8');\n if (!headContent.trim() || headContent.includes('unborn')) {\n return false;\n }\n \n return true;\n } catch (error) {\n console.error('检查Git仓库完整性时出错:', error);\n return false;\n }\n}\n\n/**\n * 清理不完整的项目目录\n * @param projectPath 项目路径\n */\nexport async function cleanupIncompleteProject(projectPath: string): Promise<void> {\n try {\n console.log(`正在清理不完整的项目: ${projectPath}`);\n await fs.rm(projectPath, { recursive: true, force: true });\n console.log(`清理完成: ${projectPath}`);\n } catch (error) {\n console.error(`清理项目失败 ${projectPath}:`, error);\n // 清理失败不抛出错误,避免阻塞后续流程\n }\n}\n\n/**\n * 批量检查多个项目的存在状态\n * @param workspacePath 工作空间路径\n * @param projectNames 项目名称列表\n * @returns Promise<Record<string, boolean>> 项目名称到存在状态的映射\n */\nexport async function checkMultipleProjectsExist(\n workspacePath: string, \n projectNames: string[]\n): Promise<Record<string, boolean>> {\n const results: Record<string, boolean> = {};\n \n // 并行检查所有项目\n const checks = projectNames.map(async (projectName) => {\n const exists = await checkProjectExists(workspacePath, projectName);\n results[projectName] = exists;\n });\n \n await Promise.all(checks);\n return results;\n}\n\n/**\n * 在 Cursor 中打开项目\n * @param projectPath 项目的绝对路径\n * @returns Promise<{ success: boolean; error?: string }>\n */\nexport async function openProjectInCursor(projectPath: string): Promise<{ success: boolean; error?: string }> {\n return new Promise((resolve) => {\n // 验证项目路径存在\n if (!existsSync(projectPath)) {\n resolve({\n success: false,\n error: `项目路径不存在: ${projectPath}`\n });\n return;\n }\n\n // 执行 cursor 命令\n const cursorProcess = spawn('cursor', [projectPath], {\n stdio: ['ignore', 'pipe', 'pipe'],\n detached: true, // 让进程在后台独立运行\n env: {\n ...process.env,\n NODE_ENV: 'development', // 强制设置为开发模式\n }\n });\n\n let errorOutput = '';\n\n // 设置超时(10秒)\n const timeoutId = setTimeout(() => {\n cursorProcess.kill('SIGTERM');\n resolve({\n success: false,\n error: 'Cursor 命令执行超时'\n });\n }, 10000);\n\n // 处理错误输出\n cursorProcess.stderr?.on('data', (data: Buffer) => {\n errorOutput += data.toString();\n });\n\n // 处理进程退出\n cursorProcess.on('exit', (code: number | null) => {\n clearTimeout(timeoutId);\n \n if (code === 0) {\n resolve({ success: true });\n } else {\n resolve({\n success: false,\n error: `Cursor 退出代码: ${code}${errorOutput ? `, 错误: ${errorOutput}` : ''}`\n });\n }\n });\n\n // 处理进程错误(如命令不存在)\n cursorProcess.on('error', (error: Error) => {\n clearTimeout(timeoutId);\n \n if (error.message.includes('ENOENT')) {\n resolve({\n success: false,\n error: 'Cursor 命令未找到,请确保 Cursor CLI 已正确安装并在 PATH 中'\n });\n } else {\n resolve({\n success: false,\n error: `启动 Cursor 失败: ${error.message}`\n });\n }\n });\n\n // 让进程独立运行,不等待其完成\n cursorProcess.unref();\n });\n} ","import { NextRequest } from 'next/server';\nimport { WORKSPACE_CONFIG } from '@/lib/workspace-types';\nimport { openProjectInCursor, sanitizeProjectName } from '@/lib/git-operations';\nimport { join } from 'path';\n\n/**\n * 在 Cursor 中打开项目 API 端点\n */\nexport async function POST(request: NextRequest) {\n try {\n const body = await request.json();\n const { projectName } = body;\n\n // 验证项目名称\n if (!projectName || typeof projectName !== 'string') {\n return new Response(\n JSON.stringify({ \n success: false, \n error: '项目名称是必需的' \n }),\n { \n status: 400,\n headers: { 'Content-Type': 'application/json' }\n }\n );\n }\n\n // 清理项目名称,防止路径遍历攻击\n const cleanProjectName = sanitizeProjectName(projectName);\n if (cleanProjectName !== projectName) {\n return new Response(\n JSON.stringify({ \n success: false, \n error: '项目名称包含无效字符' \n }),\n { \n status: 400,\n headers: { 'Content-Type': 'application/json' }\n }\n );\n }\n\n // 构造项目路径\n const workspacePath = WORKSPACE_CONFIG.WORKSPACE_ROOT;\n const projectPath = join(workspacePath, projectName);\n\n // 执行打开操作\n const result = await openProjectInCursor(projectPath);\n\n if (result.success) {\n return new Response(\n JSON.stringify({ \n success: true, \n message: `项目 ${projectName} 已在 Cursor 中打开`,\n projectPath \n }),\n { \n status: 200,\n headers: { 'Content-Type': 'application/json' }\n }\n );\n } else {\n return new Response(\n JSON.stringify({ \n success: false, \n error: result.error,\n projectName,\n projectPath\n }),\n { \n status: 500,\n headers: { 'Content-Type': 'application/json' }\n }\n );\n }\n\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(\"打开项目失败:\", error);\n \n return new Response(\n JSON.stringify({ \n success: false, \n error: `打开项目失败: ${errorMessage}` \n }),\n { \n status: 500,\n headers: { 'Content-Type': 'application/json' }\n }\n );\n }\n}","import {\n AppRouteRouteModule,\n type AppRouteRouteModuleOptions,\n} from '../../server/route-modules/app-route/module.compiled'\nimport { RouteKind } from '../../server/route-kind'\nimport { patchFetch as _patchFetch } from '../../server/lib/patch-fetch'\n\nimport * as userland from 'VAR_USERLAND'\n\n// These are injected by the loader afterwards. This is injected as a variable\n// instead of a replacement because this could also be `undefined` instead of\n// an empty string.\ndeclare const nextConfigOutput: AppRouteRouteModuleOptions['nextConfigOutput']\n\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\n// INJECT:nextConfigOutput\n\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: 'VAR_DEFINITION_PAGE',\n pathname: 'VAR_DEFINITION_PATHNAME',\n filename: 'VAR_DEFINITION_FILENAME',\n bundlePath: 'VAR_DEFINITION_BUNDLE_PATH',\n },\n resolvedPagePath: 'VAR_RESOLVED_PAGE_PATH',\n nextConfigOutput,\n userland,\n})\n\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule\n\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage,\n })\n}\n\nexport {\n routeModule,\n workAsyncStorage,\n workUnitAsyncStorage,\n serverHooks,\n patchFetch,\n}\n"],"names":["AppRouteRouteModule","RouteKind","patchFetch","_patchFetch","userland","routeModule","definition","kind","APP_ROUTE","page","pathname","filename","bundlePath","resolvedPagePath","nextConfigOutput","workAsyncStorage","workUnitAsyncStorage","serverHooks"],"mappings":"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","ignoreList":[3]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
module.exports={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}({})},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}({})}},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"))},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
|
+
|
|
3
|
+
//# sourceMappingURL=%5Broot-of-the-server%5D__fab72f0c._.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/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]}
|