prime-dev-cli 2.0.6 → 2.0.8

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.
Files changed (263) hide show
  1. package/dist/server/.next/BUILD_ID +1 -1
  2. package/dist/server/.next/app-build-manifest.json +8 -8
  3. package/dist/server/.next/app-path-routes-manifest.json +7 -0
  4. package/dist/server/.next/build-manifest.json +6 -6
  5. package/dist/server/.next/cache/.rscinfo +1 -1
  6. package/dist/server/.next/cache/.tsbuildinfo +1 -1
  7. package/dist/server/.next/cache/eslint/.cache_1qa5vxt +1 -1
  8. package/dist/server/.next/fallback-build-manifest.json +6 -6
  9. package/dist/server/.next/next-minimal-server.js.nft.json +1 -1
  10. package/dist/server/.next/next-server.js.nft.json +1 -1
  11. package/dist/server/.next/prerender-manifest.json +9 -9
  12. package/dist/server/.next/server/app/_not-found/page/app-build-manifest.json +1 -1
  13. package/dist/server/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  14. package/dist/server/.next/server/app/_not-found.html +1 -1
  15. package/dist/server/.next/server/app/_not-found.rsc +2 -2
  16. package/dist/server/.next/server/app/api/admin-git-batch-create-branch/route.js +1 -1
  17. package/dist/server/.next/server/app/api/admin-git-batch-create-branch/route.js.nft.json +1 -1
  18. package/dist/server/.next/server/app/api/admin-git-batch-delete-branch/route.js +1 -1
  19. package/dist/server/.next/server/app/api/admin-git-batch-delete-branch/route.js.nft.json +1 -1
  20. package/dist/server/.next/server/app/api/admin-git-batch-merge/route.js +1 -1
  21. package/dist/server/.next/server/app/api/admin-git-batch-merge/route.js.nft.json +1 -1
  22. package/dist/server/.next/server/app/api/admin-git-batch-probe-remote-branch/route.js +1 -1
  23. package/dist/server/.next/server/app/api/admin-git-batch-probe-remote-branch/route.js.nft.json +1 -1
  24. package/dist/server/.next/server/app/api/all-projects-envs/route.js +1 -1
  25. package/dist/server/.next/server/app/api/all-projects-envs/route.js.nft.json +1 -1
  26. package/dist/server/.next/server/app/api/batch-list-branches/route/app-build-manifest.json +10 -0
  27. package/dist/server/.next/server/app/api/batch-list-branches/route/app-paths-manifest.json +3 -0
  28. package/dist/server/.next/server/app/api/batch-list-branches/route/build-manifest.json +16 -0
  29. package/dist/server/.next/server/app/api/batch-list-branches/route/next-font-manifest.json +6 -0
  30. package/dist/server/.next/server/app/api/batch-list-branches/route/react-loadable-manifest.json +1 -0
  31. package/dist/server/.next/server/app/api/batch-list-branches/route/server-reference-manifest.json +4 -0
  32. package/dist/server/.next/server/app/api/batch-list-branches/route.js +8 -0
  33. package/dist/server/.next/server/app/api/batch-list-branches/route.js.map +5 -0
  34. package/dist/server/.next/server/app/api/batch-list-branches/route.js.nft.json +1 -0
  35. package/dist/server/.next/server/app/api/batch-list-branches/route_client-reference-manifest.js +2 -0
  36. package/dist/server/.next/server/app/api/batch-list-submodule-branches/route/app-build-manifest.json +10 -0
  37. package/dist/server/.next/server/app/api/batch-list-submodule-branches/route/app-paths-manifest.json +3 -0
  38. package/dist/server/.next/server/app/api/batch-list-submodule-branches/route/build-manifest.json +16 -0
  39. package/dist/server/.next/server/app/api/batch-list-submodule-branches/route/next-font-manifest.json +6 -0
  40. package/dist/server/.next/server/app/api/batch-list-submodule-branches/route/react-loadable-manifest.json +1 -0
  41. package/dist/server/.next/server/app/api/batch-list-submodule-branches/route/server-reference-manifest.json +4 -0
  42. package/dist/server/.next/server/app/api/batch-list-submodule-branches/route.js +8 -0
  43. package/dist/server/.next/server/app/api/batch-list-submodule-branches/route.js.map +5 -0
  44. package/dist/server/.next/server/app/api/batch-list-submodule-branches/route.js.nft.json +1 -0
  45. package/dist/server/.next/server/app/api/batch-list-submodule-branches/route_client-reference-manifest.js +2 -0
  46. package/dist/server/.next/server/app/api/batch-switch-branch/route/app-build-manifest.json +10 -0
  47. package/dist/server/.next/server/app/api/batch-switch-branch/route/app-paths-manifest.json +3 -0
  48. package/dist/server/.next/server/app/api/batch-switch-branch/route/build-manifest.json +16 -0
  49. package/dist/server/.next/server/app/api/batch-switch-branch/route/next-font-manifest.json +6 -0
  50. package/dist/server/.next/server/app/api/batch-switch-branch/route/react-loadable-manifest.json +1 -0
  51. package/dist/server/.next/server/app/api/batch-switch-branch/route/server-reference-manifest.json +4 -0
  52. package/dist/server/.next/server/app/api/batch-switch-branch/route.js +8 -0
  53. package/dist/server/.next/server/app/api/batch-switch-branch/route.js.map +5 -0
  54. package/dist/server/.next/server/app/api/batch-switch-branch/route.js.nft.json +1 -0
  55. package/dist/server/.next/server/app/api/batch-switch-branch/route_client-reference-manifest.js +2 -0
  56. package/dist/server/.next/server/app/api/batch-switch-submodule-branch/route/app-build-manifest.json +10 -0
  57. package/dist/server/.next/server/app/api/batch-switch-submodule-branch/route/app-paths-manifest.json +3 -0
  58. package/dist/server/.next/server/app/api/batch-switch-submodule-branch/route/build-manifest.json +16 -0
  59. package/dist/server/.next/server/app/api/batch-switch-submodule-branch/route/next-font-manifest.json +6 -0
  60. package/dist/server/.next/server/app/api/batch-switch-submodule-branch/route/react-loadable-manifest.json +1 -0
  61. package/dist/server/.next/server/app/api/batch-switch-submodule-branch/route/server-reference-manifest.json +4 -0
  62. package/dist/server/.next/server/app/api/batch-switch-submodule-branch/route.js +8 -0
  63. package/dist/server/.next/server/app/api/batch-switch-submodule-branch/route.js.map +5 -0
  64. package/dist/server/.next/server/app/api/batch-switch-submodule-branch/route.js.nft.json +1 -0
  65. package/dist/server/.next/server/app/api/batch-switch-submodule-branch/route_client-reference-manifest.js +2 -0
  66. package/dist/server/.next/server/app/api/branch/switch/route/app-build-manifest.json +10 -0
  67. package/dist/server/.next/server/app/api/branch/switch/route/app-paths-manifest.json +3 -0
  68. package/dist/server/.next/server/app/api/branch/switch/route/build-manifest.json +16 -0
  69. package/dist/server/.next/server/app/api/branch/switch/route/next-font-manifest.json +6 -0
  70. package/dist/server/.next/server/app/api/branch/switch/route/react-loadable-manifest.json +1 -0
  71. package/dist/server/.next/server/app/api/branch/switch/route/server-reference-manifest.json +4 -0
  72. package/dist/server/.next/server/app/api/branch/switch/route.js +8 -0
  73. package/dist/server/.next/server/app/api/branch/switch/route.js.map +5 -0
  74. package/dist/server/.next/server/app/api/branch/switch/route.js.nft.json +1 -0
  75. package/dist/server/.next/server/app/api/branch/switch/route_client-reference-manifest.js +2 -0
  76. package/dist/server/.next/server/app/api/branches/route/app-build-manifest.json +10 -0
  77. package/dist/server/.next/server/app/api/branches/route/app-paths-manifest.json +3 -0
  78. package/dist/server/.next/server/app/api/branches/route/build-manifest.json +16 -0
  79. package/dist/server/.next/server/app/api/branches/route/next-font-manifest.json +6 -0
  80. package/dist/server/.next/server/app/api/branches/route/react-loadable-manifest.json +1 -0
  81. package/dist/server/.next/server/app/api/branches/route/server-reference-manifest.json +4 -0
  82. package/dist/server/.next/server/app/api/branches/route.js +8 -0
  83. package/dist/server/.next/server/app/api/branches/route.js.map +5 -0
  84. package/dist/server/.next/server/app/api/branches/route.js.nft.json +1 -0
  85. package/dist/server/.next/server/app/api/branches/route_client-reference-manifest.js +2 -0
  86. package/dist/server/.next/server/app/api/check-mock-intercept/route.js +1 -1
  87. package/dist/server/.next/server/app/api/check-mock-intercept/route.js.nft.json +1 -1
  88. package/dist/server/.next/server/app/api/check-workspace/route.js +1 -1
  89. package/dist/server/.next/server/app/api/check-workspace/route.js.nft.json +1 -1
  90. package/dist/server/.next/server/app/api/cleanup-mock/route.js +1 -1
  91. package/dist/server/.next/server/app/api/cleanup-mock/route.js.nft.json +1 -1
  92. package/dist/server/.next/server/app/api/delete-mock-api/route.js +1 -1
  93. package/dist/server/.next/server/app/api/delete-mock-api/route.js.nft.json +1 -1
  94. package/dist/server/.next/server/app/api/get-mock-data/route.js +1 -1
  95. package/dist/server/.next/server/app/api/get-mock-data/route.js.nft.json +1 -1
  96. package/dist/server/.next/server/app/api/gwh-git-flow/route.js +1 -1
  97. package/dist/server/.next/server/app/api/gwh-git-flow/route.js.nft.json +1 -1
  98. package/dist/server/.next/server/app/api/initialize-workspace/route.js +1 -1
  99. package/dist/server/.next/server/app/api/initialize-workspace/route.js.nft.json +1 -1
  100. package/dist/server/.next/server/app/api/memory-status/route.js +1 -1
  101. package/dist/server/.next/server/app/api/memory-status/route.js.nft.json +1 -1
  102. package/dist/server/.next/server/app/api/microapp-proxy-change-stream/route.js +1 -1
  103. package/dist/server/.next/server/app/api/microapp-proxy-change-stream/route.js.nft.json +1 -1
  104. package/dist/server/.next/server/app/api/microapp-proxy-config/route.js +1 -1
  105. package/dist/server/.next/server/app/api/microapp-proxy-config/route.js.nft.json +1 -1
  106. package/dist/server/.next/server/app/api/mock-file/route.js +1 -1
  107. package/dist/server/.next/server/app/api/mock-file/route.js.nft.json +1 -1
  108. package/dist/server/.next/server/app/api/mock-file-content/route.js +1 -1
  109. package/dist/server/.next/server/app/api/mock-file-content/route.js.nft.json +1 -1
  110. package/dist/server/.next/server/app/api/mock-open-status/route.js +1 -1
  111. package/dist/server/.next/server/app/api/mock-open-status/route.js.nft.json +1 -1
  112. package/dist/server/.next/server/app/api/mock-setting/route.js +1 -1
  113. package/dist/server/.next/server/app/api/mock-setting/route.js.nft.json +1 -1
  114. package/dist/server/.next/server/app/api/open-all-mock/route.js +1 -1
  115. package/dist/server/.next/server/app/api/open-all-mock/route.js.nft.json +1 -1
  116. package/dist/server/.next/server/app/api/open-project/route.js.nft.json +1 -1
  117. package/dist/server/.next/server/app/api/process/start/route.js +1 -1
  118. package/dist/server/.next/server/app/api/process/start/route.js.nft.json +1 -1
  119. package/dist/server/.next/server/app/api/process/status/route.js +1 -1
  120. package/dist/server/.next/server/app/api/process/status/route.js.nft.json +1 -1
  121. package/dist/server/.next/server/app/api/project-config/route.js +1 -1
  122. package/dist/server/.next/server/app/api/project-config/route.js.nft.json +1 -1
  123. package/dist/server/.next/server/app/api/retry-project/route.js +1 -1
  124. package/dist/server/.next/server/app/api/retry-project/route.js.nft.json +1 -1
  125. package/dist/server/.next/server/app/api/submodule-info/route/app-build-manifest.json +10 -0
  126. package/dist/server/.next/server/app/api/submodule-info/route/app-paths-manifest.json +3 -0
  127. package/dist/server/.next/server/app/api/submodule-info/route/build-manifest.json +16 -0
  128. package/dist/server/.next/server/app/api/submodule-info/route/next-font-manifest.json +6 -0
  129. package/dist/server/.next/server/app/api/submodule-info/route/react-loadable-manifest.json +1 -0
  130. package/dist/server/.next/server/app/api/submodule-info/route/server-reference-manifest.json +4 -0
  131. package/dist/server/.next/server/app/api/submodule-info/route.js +8 -0
  132. package/dist/server/.next/server/app/api/submodule-info/route.js.map +5 -0
  133. package/dist/server/.next/server/app/api/submodule-info/route.js.nft.json +1 -0
  134. package/dist/server/.next/server/app/api/submodule-info/route_client-reference-manifest.js +2 -0
  135. package/dist/server/.next/server/app/api/uat-git-flow/route.js +1 -1
  136. package/dist/server/.next/server/app/api/uat-git-flow/route.js.nft.json +1 -1
  137. package/dist/server/.next/server/app/api/uat-git-flow/step/route.js +1 -1
  138. package/dist/server/.next/server/app/api/uat-git-flow/step/route.js.nft.json +1 -1
  139. package/dist/server/.next/server/app/api/workspace/create/route.js +1 -1
  140. package/dist/server/.next/server/app/api/workspace/create/route.js.nft.json +1 -1
  141. package/dist/server/.next/server/app/configuration/page/app-build-manifest.json +3 -3
  142. package/dist/server/.next/server/app/configuration/page.js.nft.json +1 -1
  143. package/dist/server/.next/server/app/configuration/page_client-reference-manifest.js +1 -1
  144. package/dist/server/.next/server/app/configuration.html +1 -1
  145. package/dist/server/.next/server/app/configuration.rsc +3 -3
  146. package/dist/server/.next/server/app/index.html +1 -1
  147. package/dist/server/.next/server/app/index.rsc +2 -2
  148. package/dist/server/.next/server/app/initialization/page/app-build-manifest.json +3 -3
  149. package/dist/server/.next/server/app/initialization/page.js.nft.json +1 -1
  150. package/dist/server/.next/server/app/initialization/page_client-reference-manifest.js +1 -1
  151. package/dist/server/.next/server/app/initialization.html +1 -1
  152. package/dist/server/.next/server/app/initialization.rsc +3 -3
  153. package/dist/server/.next/server/app/page/app-build-manifest.json +1 -1
  154. package/dist/server/.next/server/app/page_client-reference-manifest.js +1 -1
  155. package/dist/server/.next/server/app-paths-manifest.json +7 -0
  156. package/dist/server/.next/server/chunks/{[root-of-the-server]__dda45cac._.js → [root-of-the-server]__061fab1d._.js} +2 -2
  157. package/dist/server/.next/server/chunks/{[root-of-the-server]__dda45cac._.js.map → [root-of-the-server]__061fab1d._.js.map} +1 -1
  158. package/dist/server/.next/server/chunks/{[root-of-the-server]__4ec3205b._.js → [root-of-the-server]__09313e5e._.js} +2 -2
  159. package/dist/server/.next/server/chunks/{[root-of-the-server]__4ec3205b._.js.map → [root-of-the-server]__09313e5e._.js.map} +1 -1
  160. package/dist/server/.next/server/chunks/[root-of-the-server]__0c170d21._.js +3 -0
  161. package/dist/server/.next/server/chunks/[root-of-the-server]__0c170d21._.js.map +1 -0
  162. package/dist/server/.next/server/chunks/[root-of-the-server]__139ed483._.js +3 -0
  163. package/dist/server/.next/server/chunks/[root-of-the-server]__139ed483._.js.map +1 -0
  164. package/dist/server/.next/server/chunks/{[root-of-the-server]__37bfbf6b._.js → [root-of-the-server]__1ebda8c2._.js} +2 -2
  165. package/dist/server/.next/server/chunks/{[root-of-the-server]__37bfbf6b._.js.map → [root-of-the-server]__1ebda8c2._.js.map} +1 -1
  166. package/dist/server/.next/server/chunks/[root-of-the-server]__326fc423._.js +3 -0
  167. package/dist/server/.next/server/chunks/{[root-of-the-server]__2a78acef._.js.map → [root-of-the-server]__326fc423._.js.map} +1 -1
  168. package/dist/server/.next/server/chunks/{[root-of-the-server]__ec681197._.js → [root-of-the-server]__32f4379a._.js} +2 -2
  169. package/dist/server/.next/server/chunks/{[root-of-the-server]__ec681197._.js.map → [root-of-the-server]__32f4379a._.js.map} +1 -1
  170. package/dist/server/.next/server/chunks/{[root-of-the-server]__e0b7050d._.js → [root-of-the-server]__36b796c6._.js} +2 -2
  171. package/dist/server/.next/server/chunks/{[root-of-the-server]__e0b7050d._.js.map → [root-of-the-server]__36b796c6._.js.map} +1 -1
  172. package/dist/server/.next/server/chunks/{[root-of-the-server]__2f8b52da._.js → [root-of-the-server]__3987d53e._.js} +2 -2
  173. package/dist/server/.next/server/chunks/{[root-of-the-server]__2f8b52da._.js.map → [root-of-the-server]__3987d53e._.js.map} +1 -1
  174. package/dist/server/.next/server/chunks/{[root-of-the-server]__9e44bbc8._.js → [root-of-the-server]__3f941970._.js} +2 -2
  175. package/dist/server/.next/server/chunks/{[root-of-the-server]__9e44bbc8._.js.map → [root-of-the-server]__3f941970._.js.map} +1 -1
  176. package/dist/server/.next/server/chunks/{[root-of-the-server]__d3078133._.js → [root-of-the-server]__5a926dad._.js} +2 -2
  177. package/dist/server/.next/server/chunks/{[root-of-the-server]__d3078133._.js.map → [root-of-the-server]__5a926dad._.js.map} +1 -1
  178. package/dist/server/.next/server/chunks/{[root-of-the-server]__0d56f35b._.js → [root-of-the-server]__5d6739e4._.js} +2 -2
  179. package/dist/server/.next/server/chunks/{[root-of-the-server]__0d56f35b._.js.map → [root-of-the-server]__5d6739e4._.js.map} +1 -1
  180. package/dist/server/.next/server/chunks/{[root-of-the-server]__3952b86e._.js → [root-of-the-server]__6004758a._.js} +2 -2
  181. package/dist/server/.next/server/chunks/{[root-of-the-server]__3952b86e._.js.map → [root-of-the-server]__6004758a._.js.map} +1 -1
  182. package/dist/server/.next/server/chunks/{[root-of-the-server]__54f2f032._.js → [root-of-the-server]__6496ee9b._.js} +2 -2
  183. package/dist/server/.next/server/chunks/{[root-of-the-server]__54f2f032._.js.map → [root-of-the-server]__6496ee9b._.js.map} +1 -1
  184. package/dist/server/.next/server/chunks/{[root-of-the-server]__c18498ef._.js → [root-of-the-server]__66952f53._.js} +2 -2
  185. package/dist/server/.next/server/chunks/{[root-of-the-server]__c18498ef._.js.map → [root-of-the-server]__66952f53._.js.map} +1 -1
  186. package/dist/server/.next/server/chunks/[root-of-the-server]__6bf6dd19._.js +3 -0
  187. package/dist/server/.next/server/chunks/[root-of-the-server]__6bf6dd19._.js.map +1 -0
  188. package/dist/server/.next/server/chunks/[root-of-the-server]__6c7b8215._.js +3 -0
  189. package/dist/server/.next/server/chunks/[root-of-the-server]__6c7b8215._.js.map +1 -0
  190. package/dist/server/.next/server/chunks/{[root-of-the-server]__4fd52ac1._.js → [root-of-the-server]__72882dad._.js} +2 -2
  191. package/dist/server/.next/server/chunks/{[root-of-the-server]__4fd52ac1._.js.map → [root-of-the-server]__72882dad._.js.map} +1 -1
  192. package/dist/server/.next/server/chunks/[root-of-the-server]__77a38b01._.js +16 -0
  193. package/dist/server/.next/server/chunks/[root-of-the-server]__77a38b01._.js.map +1 -0
  194. package/dist/server/.next/server/chunks/{[root-of-the-server]__5c9f62f9._.js → [root-of-the-server]__7f6ec3b4._.js} +2 -2
  195. package/dist/server/.next/server/chunks/{[root-of-the-server]__5c9f62f9._.js.map → [root-of-the-server]__7f6ec3b4._.js.map} +1 -1
  196. package/dist/server/.next/server/chunks/{[root-of-the-server]__2ffbf0d3._.js → [root-of-the-server]__86c123b3._.js} +2 -2
  197. package/dist/server/.next/server/chunks/{[root-of-the-server]__2ffbf0d3._.js.map → [root-of-the-server]__86c123b3._.js.map} +1 -1
  198. package/dist/server/.next/server/chunks/[root-of-the-server]__8713ccda._.js +16 -0
  199. package/dist/server/.next/server/chunks/[root-of-the-server]__8713ccda._.js.map +1 -0
  200. package/dist/server/.next/server/chunks/{[root-of-the-server]__0e8a08fc._.js → [root-of-the-server]__9d9f55dd._.js} +2 -2
  201. package/dist/server/.next/server/chunks/{[root-of-the-server]__0e8a08fc._.js.map → [root-of-the-server]__9d9f55dd._.js.map} +1 -1
  202. package/dist/server/.next/server/chunks/{[root-of-the-server]__452b5f9c._.js → [root-of-the-server]__a75af746._.js} +2 -2
  203. package/dist/server/.next/server/chunks/{[root-of-the-server]__452b5f9c._.js.map → [root-of-the-server]__a75af746._.js.map} +1 -1
  204. package/dist/server/.next/server/chunks/{[root-of-the-server]__0879b2d6._.js → [root-of-the-server]__ae9fe9b7._.js} +2 -2
  205. package/dist/server/.next/server/chunks/{[root-of-the-server]__0879b2d6._.js.map → [root-of-the-server]__ae9fe9b7._.js.map} +1 -1
  206. package/dist/server/.next/server/chunks/{[root-of-the-server]__2a29597f._.js → [root-of-the-server]__b49d8c86._.js} +2 -2
  207. package/dist/server/.next/server/chunks/{[root-of-the-server]__2a29597f._.js.map → [root-of-the-server]__b49d8c86._.js.map} +1 -1
  208. package/dist/server/.next/server/chunks/{[root-of-the-server]__c43cf810._.js → [root-of-the-server]__b96ce42e._.js} +2 -2
  209. package/dist/server/.next/server/chunks/{[root-of-the-server]__c43cf810._.js.map → [root-of-the-server]__b96ce42e._.js.map} +1 -1
  210. package/dist/server/.next/server/chunks/[root-of-the-server]__c52380bc._.js +3 -0
  211. package/dist/server/.next/server/chunks/[root-of-the-server]__c52380bc._.js.map +1 -0
  212. package/dist/server/.next/server/chunks/{[root-of-the-server]__8637b7f1._.js → [root-of-the-server]__e2654a76._.js} +2 -2
  213. package/dist/server/.next/server/chunks/{[root-of-the-server]__8637b7f1._.js.map → [root-of-the-server]__e2654a76._.js.map} +1 -1
  214. package/dist/server/.next/server/chunks/{[root-of-the-server]__4b595942._.js → [root-of-the-server]__e96f0857._.js} +2 -2
  215. package/dist/server/.next/server/chunks/ssr/{_a1ab1c09._.js → _283bdc73._.js} +2 -2
  216. package/dist/server/.next/server/chunks/ssr/_283bdc73._.js.map +1 -0
  217. package/dist/server/.next/server/chunks/ssr/_89496b8a._.js +1 -1
  218. package/dist/server/.next/server/chunks/ssr/_89496b8a._.js.map +1 -1
  219. package/dist/server/.next/server/chunks/ssr/_9f432559._.js +1 -1
  220. package/dist/server/.next/server/chunks/ssr/_9f432559._.js.map +1 -1
  221. package/dist/server/.next/server/chunks/ssr/{_ee0c9da0._.js → _c7905e3c._.js} +2 -2
  222. package/dist/server/.next/server/chunks/ssr/_c7905e3c._.js.map +1 -0
  223. package/dist/server/.next/server/chunks/ssr/packages_server_src_65e3de99._.js +3 -0
  224. package/dist/server/.next/server/chunks/ssr/packages_server_src_65e3de99._.js.map +1 -0
  225. package/dist/server/.next/server/middleware-build-manifest.js +4 -4
  226. package/dist/server/.next/server/pages/404.html +1 -1
  227. package/dist/server/.next/server/pages/500.html +1 -1
  228. package/dist/server/.next/server/pages/_app/build-manifest.json +2 -2
  229. package/dist/server/.next/server/pages/_error/build-manifest.json +2 -2
  230. package/dist/server/.next/server/server-reference-manifest.js +1 -1
  231. package/dist/server/.next/server/server-reference-manifest.json +1 -1
  232. package/dist/server/.next/static/chunks/{923f67dbd9f9897e.js → 063f4e9959195b1d.js} +3 -3
  233. package/dist/server/.next/static/chunks/09cba5d1f6b48977.js.map +1 -0
  234. package/dist/server/.next/static/chunks/{aa6cbf0011bc69d5.js → 0c6009607901038e.js} +2 -2
  235. package/dist/server/.next/{server/chunks/ssr/_ee0c9da0._.js.map → static/chunks/0e959ec3ce9fc799.js.map} +1 -1
  236. package/dist/server/.next/static/chunks/1427afaf93da978b.css +3 -0
  237. package/dist/server/.next/static/chunks/{9148331cad3a934e.js → 45543bd9f83f509f.js} +2 -2
  238. package/dist/server/.next/static/chunks/4608598ca6cc0991.js.map +1 -0
  239. package/dist/server/.next/static/chunks/{43c514797c454939.js → 4c54a6f1b63a5c72.js} +2 -2
  240. package/dist/server/.next/static/chunks/{b18e8b227375accd.js.map → 6a92a3cb924fd124.js.map} +1 -1
  241. package/dist/server/.next/{server/chunks/ssr/_a1ab1c09._.js.map → static/chunks/8e1056102ab0be45.js.map} +1 -1
  242. package/dist/server/.next/static/chunks/{8ade09a4b436cb9d.js → 9793bc87a71ec278.js} +2 -2
  243. package/dist/server/.next/static/chunks/{cf8cd3228a692db3.js → dad6616f7b6f4060.js} +1 -1
  244. package/dist/server/.next/static/chunks/e0fb1a1f78246e35.css.map +1 -0
  245. package/dist/server/.next/static/chunks/fce82d5fa17f0367.js +3 -0
  246. package/dist/server/.next/static/chunks/pages/_app.js +2 -2
  247. package/dist/server/.next/static/chunks/pages/_error.js +2 -2
  248. package/dist/server/.next/trace +2 -2
  249. package/package.json +1 -1
  250. package/dist/server/.next/server/chunks/[root-of-the-server]__2a78acef._.js +0 -3
  251. package/dist/server/.next/server/chunks/ssr/packages_server_src_7cef6dbd._.js +0 -3
  252. package/dist/server/.next/server/chunks/ssr/packages_server_src_7cef6dbd._.js.map +0 -1
  253. package/dist/server/.next/static/chunks/3dc9d6a79fb35214.js.map +0 -1
  254. package/dist/server/.next/static/chunks/45e30917848bc72f.js +0 -3
  255. package/dist/server/.next/static/chunks/4738c58ccb7b92a0.js.map +0 -1
  256. package/dist/server/.next/static/chunks/5ae25dc5b211a319.css +0 -3
  257. package/dist/server/.next/static/chunks/888146b3e75fe817.js.map +0 -1
  258. package/dist/server/.next/static/chunks/d10e7ab50988a39e.css.map +0 -1
  259. package/dist/server/.next/static/chunks/e70508cc9f59709d.js.map +0 -1
  260. /package/dist/server/.next/server/chunks/{[root-of-the-server]__4b595942._.js.map → [root-of-the-server]__e96f0857._.js.map} +0 -0
  261. /package/dist/server/.next/static/{CSWsqwtWCRONg1gSmV6NV → TtpaZZwrnzkXloBpwEr24}/_buildManifest.js +0 -0
  262. /package/dist/server/.next/static/{CSWsqwtWCRONg1gSmV6NV → TtpaZZwrnzkXloBpwEr24}/_clientMiddlewareManifest.json +0 -0
  263. /package/dist/server/.next/static/{CSWsqwtWCRONg1gSmV6NV → TtpaZZwrnzkXloBpwEr24}/_ssgManifest.js +0 -0
@@ -1,3 +1,3 @@
1
- module.exports={83886:function(e){var{g:r,__dirname:t,m:n,e:s}=e;n.exports=e.x("fs",()=>require("fs"))},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"))},88941:e=>{"use strict";var{g:r,__dirname:t}=e;{e.s({PROJECT_CONFIG_PATH:()=>t,ProjectStatus:()=>i,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 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}({})}},30331:function(e){var{g:r,__dirname:t,m:n,e:s}=e;n.exports=e.x("path",()=>require("path"))},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"))},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"))},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"))},13442:function(e){var{g:r,__dirname:t,m:n,e:s}=e;n.exports=e.x("os",()=>require("os"))},9892:function(e){var{g:r,__dirname:t,m:n,e:s}=e;n.exports=e.x("fs/promises",()=>require("fs/promises"))},35692:e=>{"use strict";var{g:r,__dirname:t}=e;e.s({ProjectStatus:()=>a,getProjectsConfig:()=>i,saveProjectsConfig:()=>o});var n=e.i(9892),s=e.i(88941);async function i(){try{await (0,n.access)(s.PROJECT_CONFIG_PATH,n.constants.F_OK)}catch{return await o({}),{}}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 o(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}({})},50948:e=>{"use strict";var{g:r,__dirname:t}=e;{e.s({PRIME_PROXY_PREFIX_MAP_KEY:()=>r,PRIME_PROXY_REWRITE_MAP_KEY:()=>t,buildEnvFileContent:()=>a,deriveProxyKey:()=>s,normalizeApiProxyItem:()=>o,normalizePrefix:()=>n,validateApiProxies:()=>i});let r="PRIME_PROXY_PREFIX_MAP",t="PRIME_PROXY_REWRITE_MAP";function n(e){let r=e.trim();return r.startsWith("/")&&r.length>1?r.replace(/\/+$/,""):r}function s(e,r){if(r&&r.trim())return r.trim();let t=n(e);if("/api"===t)return"PROXY_URL";let s=t.replace(/^\//,"").replace(/[^a-zA-Z0-9]+/g,"_").replace(/^_+|_+$/g,"").toUpperCase();return`PROXY_${s}_URL`}function i(e){if(!Array.isArray(e)||0===e.length)return{valid:!1,error:"apiProxies 不能为空"};let r=new Set;for(let t of e){let e=function(e){if(!e||!e.trim())return"prefix 不能为空";let r=n(e);return r.startsWith("/")?/\s/.test(r)?`prefix ${e} 不能包含空白字符`:null:`prefix ${e} 必须以 / 开头`}(t.prefix);if(e)return{valid:!1,error:e};let s=n(t.prefix);if(r.has(s))return{valid:!1,error:`prefix ${s} 重复`};if(r.add(s),!t.currentProxy||!t.currentProxy.trim())return{valid:!1,error:`prefix ${s} 缺少 currentProxy`};if(!t.proxyEnv||"object"!=typeof t.proxyEnv)return{valid:!1,error:`prefix ${s} 缺少 proxyEnv`};let i=t.proxyEnv[t.currentProxy];if("string"!=typeof i)return{valid:!1,error:`prefix ${s} 的 currentProxy 不存在于 proxyEnv 中`};if("custom"===t.currentProxy&&!i.trim())return{valid:!1,error:`prefix ${s} 选择 custom 时必须提供 URL`};if(!i.trim())return{valid:!1,error:`prefix ${s} 的 currentProxy URL 不能为空`};let o=function(e,r){if(!e.rewrite)return null;let{mode:t,targetPrefix:n}=e.rewrite;if(!["none","remove","replace"].includes(t))return`prefix ${r} 的 rewrite.mode 仅支持 none/remove/replace`;let s="string"==typeof n&&n.length>0;if("remove"===t&&s)return`prefix ${r} 的 rewrite.mode 为 remove 时不允许 targetPrefix`;if("replace"===t){let e=(n||"").trim();if(!e||!e.startsWith("/")||/\s/.test(e))return`prefix ${r} 的 rewrite.mode 为 replace 时 targetPrefix 必须以 / 开头且不能包含空白字符`}return null}(t,s);if(o)return{valid:!1,error:o}}return{valid:!0}}function o(e){let r=n(e.prefix),t=e.rewrite;return t&&(t="replace"===t.mode?{mode:"replace",targetPrefix:(t.targetPrefix||"").trim().replace(/\/+$/,"")||"/"}:"remove"===t.mode?{mode:"remove"}:{mode:"none"}),{...e,prefix:r,rewrite:t,proxyKey:s(r,e.proxyKey)}}function a(e){let n=i(e);if(!n.valid)return{error:n.error};let s=e.map(o),a=s.reduce((e,r)=>(e[r.prefix]=r.proxyKey,e),{}),c=s.reduce((e,r)=>(r.rewrite&&"none"!==r.rewrite.mode&&("remove"===r.rewrite.mode?e[r.prefix]="":"replace"===r.rewrite.mode&&(e[r.prefix]=r.rewrite.targetPrefix)),e),{});return{content:[`${r}=${JSON.stringify(a)}`,...Object.keys(c).length>0?[`${t}=${JSON.stringify(c)}`]:[],...s.map(e=>`${e.proxyKey}=${e.proxyEnv[e.currentProxy].trim()}`)].join("\n")}}}},15079:e=>{"use strict";var{g:r,__dirname:t}=e;e.s({createProjectEnvFiles:()=>o,createProjectMockDirectories:()=>a,updateProjectEnvFile:()=>c});var n=e.i(83886),s=e.i(30331),i=e.i(50948);async function o(e,r,t){let o=(0,s.join)(t,e),a=[],c=[];try{await n.promises.mkdir(o,{recursive:!0});let e=r.envs||{};for(let r in e){let t=e[r];if(t.envFileName&&t.apiProxies?.length){let e=(0,s.join)(o,t.envFileName);try{await n.promises.access(e),c.push(t.envFileName)}catch{let s=(0,i.buildEnvFileContent)(t.apiProxies);if("error"in s)return{success:!1,createdFiles:a,skippedFiles:c,error:`环境 ${r} 配置无效: ${s.error}`};await n.promises.writeFile(e,s.content,"utf-8"),a.push(t.envFileName)}}}return{success:!0,createdFiles:a,skippedFiles:c}}catch(t){let r=t instanceof Error?t.message:String(t);return console.error(`在为项目 ${e} 创建环境文件时出错:`,t),{success:!1,createdFiles:a,skippedFiles:c,error:r}}}async function a(e,r){let t=(0,s.join)(r,e),i=(0,s.join)(t,".mock"),o=[],a=[];try{try{await n.promises.access(i),a.push(".mock")}catch{await n.promises.mkdir(i,{recursive:!0}),o.push(".mock")}return{success:!0,createdDirectories:o,skippedDirectories:a}}catch(t){let r=t instanceof Error?t.message:String(t);return console.error(`在为项目 ${e} 创建Mock目录时出错:`,t),{success:!1,createdDirectories:o,skippedDirectories:a,error:r}}}async function c(e,r,t,o){try{let a=t.envs[r];if(!a)return{success:!1,error:`环境 ${r} 不存在于项目 ${e} 配置中`};if(!a.envFileName||!a.apiProxies?.length)return{success:!1,error:`环境 ${r} 缺少 envFileName 或 apiProxies 配置`};let c=(0,i.buildEnvFileContent)(a.apiProxies);if("error"in c)return{success:!1,error:c.error};let u=(0,s.join)(o,e),p=(0,s.join)(u,a.envFileName);return await n.promises.writeFile(p,c.content,"utf-8"),console.log(`已更新环境文件: ${p}, 内容: ${c.content}`),{success:!0,updatedFile:a.envFileName}}catch(n){let t=n instanceof Error?n.message:String(n);return console.error(`更新项目 ${e} 环境 ${r} 的环境文件时出错:`,n),{success:!1,error:t}}}},24468:function(e){var{g:r,__dirname:t,m:n,e:s}=e},32875:e=>{"use strict";var{g:r,__dirname:t}=e;e.s({GET:()=>c,PUT:()=>u});var n=e.i(15494),s=e.i(35692),i=e.i(15079),o=e.i(50948),a=e.i(88941);async function c(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 i=await (0,s.getProjectsConfig)();if(!i[t])return n.NextResponse.json({success:!1,error:`项目 ${t} 不存在`},{status:404});let o=i[t];return n.NextResponse.json({success:!0,data:{projectName:t,repo:o.repo,mockingIntercept:o.mockingIntercept,mockOpen:o.mockOpen,envs:o.envs}})}catch(r){let e=r instanceof Error?r.message:"获取项目配置失败";return console.error("获取项目配置失败:",r),n.NextResponse.json({success:!1,error:e},{status:500})}}async function u(e){try{let{projectName:r,envName:t,apiProxies:c,projectConfig:u}=await e.json();if(!r)return n.NextResponse.json({success:!1,error:"缺少必要参数:projectName"},{status:400});if(u){let e=await (0,s.getProjectsConfig)();if(!e[r])return n.NextResponse.json({success:!1,error:`项目 ${r} 不存在`},{status:404});return void 0!==u.mockingIntercept&&(e[r].mockingIntercept=u.mockingIntercept),void 0!==u.mockOpen&&(e[r].mockOpen=u.mockOpen),await (0,s.saveProjectsConfig)(e),n.NextResponse.json({success:!0,message:"项目配置更新成功",data:{projectName:r,mockingIntercept:e[r].mockingIntercept,mockOpen:e[r].mockOpen}})}if(!t||!Array.isArray(c))return n.NextResponse.json({success:!1,error:"缺少必要参数:envName, apiProxies"},{status:400});let p=await (0,s.getProjectsConfig)();if(!p[r])return n.NextResponse.json({success:!1,error:`项目 ${r} 不存在`},{status:404});if(!p[r].envs[t])return n.NextResponse.json({success:!1,error:`项目 ${r} 中不存在环境 ${t}`},{status:404});let l=(0,o.validateApiProxies)(c);if(!l.valid)return n.NextResponse.json({success:!1,error:l.error},{status:400});p[r].envs[t].apiProxies=c,await (0,s.saveProjectsConfig)(p);let f=await (0,i.updateProjectEnvFile)(r,t,p[r],a.WORKSPACE_CONFIG.WORKSPACE_ROOT),x={projectName:r,envName:t,apiProxies:p[r].envs[t].apiProxies};if(!f.success)return console.warn(`环境文件更新失败: ${f.error}`),n.NextResponse.json({success:!0,message:"代理环境更新成功,但环境文件更新失败",warning:`环境文件更新失败: ${f.error}`,data:x});return n.NextResponse.json({success:!0,message:"代理环境更新成功",data:{...x,updatedEnvFile:f.updatedFile}})}catch(r){let e=r instanceof Error?r.message:"更新项目配置失败";return console.error("更新项目配置失败:",r),n.NextResponse.json({success:!1,error:e},{status:500})}}},42106:e=>{"use strict";var{g:r,__dirname:t}=e;{e.s({patchFetch:()=>a,routeModule:()=>r,serverHooks:()=>u,workAsyncStorage:()=>t,workUnitAsyncStorage:()=>c});var n=e.i(45746),s=e.i(93828),i=e.i(18250),o=e.i(32875);let r=new n.AppRouteRouteModule({definition:{kind:s.RouteKind.APP_ROUTE,page:"/api/project-config/route",pathname:"/api/project-config",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/project-config/route.ts",nextConfigOutput:"",userland:o}),{workAsyncStorage:t,workUnitAsyncStorage:c,serverHooks:u}=r;function a(){return(0,i.patchFetch)({workAsyncStorage:t,workUnitAsyncStorage:c})}}}};
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"))},30331:function(e){var{g:r,__dirname:t,m:n,e:s}=e;n.exports=e.x("path",()=>require("path"))},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"))},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"))},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"))},13442:function(e){var{g:r,__dirname:t,m:n,e:s}=e;n.exports=e.x("os",()=>require("os"))},88941:e=>{"use strict";var{g:r,__dirname:t}=e;{e.s({PROJECT_CONFIG_PATH:()=>t,ProjectStatus:()=>i,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 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}({})}},83886:function(e){var{g:r,__dirname:t,m:n,e:s}=e;n.exports=e.x("fs",()=>require("fs"))},9892:function(e){var{g:r,__dirname:t,m:n,e:s}=e;n.exports=e.x("fs/promises",()=>require("fs/promises"))},35692:e=>{"use strict";var{g:r,__dirname:t}=e;e.s({ProjectStatus:()=>a,getProjectsConfig:()=>i,saveProjectsConfig:()=>o});var n=e.i(9892),s=e.i(88941);async function i(){try{await (0,n.access)(s.PROJECT_CONFIG_PATH,n.constants.F_OK)}catch{return await o({}),{}}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 o(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}({})},50948:e=>{"use strict";var{g:r,__dirname:t}=e;{e.s({PRIME_PROXY_PREFIX_MAP_KEY:()=>r,PRIME_PROXY_REWRITE_MAP_KEY:()=>t,buildEnvFileContent:()=>a,deriveProxyKey:()=>s,normalizeApiProxyItem:()=>o,normalizePrefix:()=>n,validateApiProxies:()=>i});let r="PRIME_PROXY_PREFIX_MAP",t="PRIME_PROXY_REWRITE_MAP";function n(e){let r=e.trim();return r.startsWith("/")&&r.length>1?r.replace(/\/+$/,""):r}function s(e,r){if(r&&r.trim())return r.trim();let t=n(e);if("/api"===t)return"PROXY_URL";let s=t.replace(/^\//,"").replace(/[^a-zA-Z0-9]+/g,"_").replace(/^_+|_+$/g,"").toUpperCase();return`PROXY_${s}_URL`}function i(e){if(!Array.isArray(e)||0===e.length)return{valid:!1,error:"apiProxies 不能为空"};let r=new Set;for(let t of e){let e=function(e){if(!e||!e.trim())return"prefix 不能为空";let r=n(e);return r.startsWith("/")?/\s/.test(r)?`prefix ${e} 不能包含空白字符`:null:`prefix ${e} 必须以 / 开头`}(t.prefix);if(e)return{valid:!1,error:e};let s=n(t.prefix);if(r.has(s))return{valid:!1,error:`prefix ${s} 重复`};if(r.add(s),!t.currentProxy||!t.currentProxy.trim())return{valid:!1,error:`prefix ${s} 缺少 currentProxy`};if(!t.proxyEnv||"object"!=typeof t.proxyEnv)return{valid:!1,error:`prefix ${s} 缺少 proxyEnv`};let i=t.proxyEnv[t.currentProxy];if("string"!=typeof i)return{valid:!1,error:`prefix ${s} 的 currentProxy 不存在于 proxyEnv 中`};if("custom"===t.currentProxy&&!i.trim())return{valid:!1,error:`prefix ${s} 选择 custom 时必须提供 URL`};if(!i.trim())return{valid:!1,error:`prefix ${s} 的 currentProxy URL 不能为空`};let o=function(e,r){if(!e.rewrite)return null;let{mode:t,targetPrefix:n}=e.rewrite;if(!["none","remove","replace"].includes(t))return`prefix ${r} 的 rewrite.mode 仅支持 none/remove/replace`;let s="string"==typeof n&&n.length>0;if("remove"===t&&s)return`prefix ${r} 的 rewrite.mode 为 remove 时不允许 targetPrefix`;if("replace"===t){let e=(n||"").trim();if(!e||!e.startsWith("/")||/\s/.test(e))return`prefix ${r} 的 rewrite.mode 为 replace 时 targetPrefix 必须以 / 开头且不能包含空白字符`}return null}(t,s);if(o)return{valid:!1,error:o}}return{valid:!0}}function o(e){let r=n(e.prefix),t=e.rewrite;return t&&(t="replace"===t.mode?{mode:"replace",targetPrefix:(t.targetPrefix||"").trim().replace(/\/+$/,"")||"/"}:"remove"===t.mode?{mode:"remove"}:{mode:"none"}),{...e,prefix:r,rewrite:t,proxyKey:s(r,e.proxyKey)}}function a(e){let n=i(e);if(!n.valid)return{error:n.error};let s=e.map(o),a=s.reduce((e,r)=>(e[r.prefix]=r.proxyKey,e),{}),c=s.reduce((e,r)=>(r.rewrite&&"none"!==r.rewrite.mode&&("remove"===r.rewrite.mode?e[r.prefix]="":"replace"===r.rewrite.mode&&(e[r.prefix]=r.rewrite.targetPrefix)),e),{});return{content:[`${r}=${JSON.stringify(a)}`,...Object.keys(c).length>0?[`${t}=${JSON.stringify(c)}`]:[],...s.map(e=>`${e.proxyKey}=${e.proxyEnv[e.currentProxy].trim()}`)].join("\n")}}}},15079:e=>{"use strict";var{g:r,__dirname:t}=e;e.s({createProjectEnvFiles:()=>o,createProjectMockDirectories:()=>a,updateProjectEnvFile:()=>c});var n=e.i(83886),s=e.i(30331),i=e.i(50948);async function o(e,r,t){let o=(0,s.join)(t,e),a=[],c=[];try{await n.promises.mkdir(o,{recursive:!0});let e=r.envs||{};for(let r in e){let t=e[r];if(t.envFileName&&t.apiProxies?.length){let e=(0,s.join)(o,t.envFileName);try{await n.promises.access(e),c.push(t.envFileName)}catch{let s=(0,i.buildEnvFileContent)(t.apiProxies);if("error"in s)return{success:!1,createdFiles:a,skippedFiles:c,error:`环境 ${r} 配置无效: ${s.error}`};await n.promises.writeFile(e,s.content,"utf-8"),a.push(t.envFileName)}}}return{success:!0,createdFiles:a,skippedFiles:c}}catch(t){let r=t instanceof Error?t.message:String(t);return console.error(`在为项目 ${e} 创建环境文件时出错:`,t),{success:!1,createdFiles:a,skippedFiles:c,error:r}}}async function a(e,r){let t=(0,s.join)(r,e),i=(0,s.join)(t,".mock"),o=[],a=[];try{try{await n.promises.access(i),a.push(".mock")}catch{await n.promises.mkdir(i,{recursive:!0}),o.push(".mock")}return{success:!0,createdDirectories:o,skippedDirectories:a}}catch(t){let r=t instanceof Error?t.message:String(t);return console.error(`在为项目 ${e} 创建Mock目录时出错:`,t),{success:!1,createdDirectories:o,skippedDirectories:a,error:r}}}async function c(e,r,t,o){try{let a=t.envs[r];if(!a)return{success:!1,error:`环境 ${r} 不存在于项目 ${e} 配置中`};if(!a.envFileName||!a.apiProxies?.length)return{success:!1,error:`环境 ${r} 缺少 envFileName 或 apiProxies 配置`};let c=(0,i.buildEnvFileContent)(a.apiProxies);if("error"in c)return{success:!1,error:c.error};let u=(0,s.join)(o,e),p=(0,s.join)(u,a.envFileName);return await n.promises.writeFile(p,c.content,"utf-8"),console.log(`已更新环境文件: ${p}, 内容: ${c.content}`),{success:!0,updatedFile:a.envFileName}}catch(n){let t=n instanceof Error?n.message:String(n);return console.error(`更新项目 ${e} 环境 ${r} 的环境文件时出错:`,n),{success:!1,error:t}}}},24468:function(e){var{g:r,__dirname:t,m:n,e:s}=e},32875:e=>{"use strict";var{g:r,__dirname:t}=e;e.s({GET:()=>c,PUT:()=>u});var n=e.i(15494),s=e.i(35692),i=e.i(15079),o=e.i(50948),a=e.i(88941);async function c(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 i=await (0,s.getProjectsConfig)();if(!i[t])return n.NextResponse.json({success:!1,error:`项目 ${t} 不存在`},{status:404});let o=i[t];return n.NextResponse.json({success:!0,data:{projectName:t,repo:o.repo,mockingIntercept:o.mockingIntercept,mockOpen:o.mockOpen,envs:o.envs}})}catch(r){let e=r instanceof Error?r.message:"获取项目配置失败";return console.error("获取项目配置失败:",r),n.NextResponse.json({success:!1,error:e},{status:500})}}async function u(e){try{let{projectName:r,envName:t,apiProxies:c,projectConfig:u}=await e.json();if(!r)return n.NextResponse.json({success:!1,error:"缺少必要参数:projectName"},{status:400});if(u){let e=await (0,s.getProjectsConfig)();if(!e[r])return n.NextResponse.json({success:!1,error:`项目 ${r} 不存在`},{status:404});return void 0!==u.mockingIntercept&&(e[r].mockingIntercept=u.mockingIntercept),void 0!==u.mockOpen&&(e[r].mockOpen=u.mockOpen),await (0,s.saveProjectsConfig)(e),n.NextResponse.json({success:!0,message:"项目配置更新成功",data:{projectName:r,mockingIntercept:e[r].mockingIntercept,mockOpen:e[r].mockOpen}})}if(!t||!Array.isArray(c))return n.NextResponse.json({success:!1,error:"缺少必要参数:envName, apiProxies"},{status:400});let p=await (0,s.getProjectsConfig)();if(!p[r])return n.NextResponse.json({success:!1,error:`项目 ${r} 不存在`},{status:404});if(!p[r].envs[t])return n.NextResponse.json({success:!1,error:`项目 ${r} 中不存在环境 ${t}`},{status:404});let l=(0,o.validateApiProxies)(c);if(!l.valid)return n.NextResponse.json({success:!1,error:l.error},{status:400});p[r].envs[t].apiProxies=c,await (0,s.saveProjectsConfig)(p);let f=await (0,i.updateProjectEnvFile)(r,t,p[r],a.WORKSPACE_CONFIG.WORKSPACE_ROOT),x={projectName:r,envName:t,apiProxies:p[r].envs[t].apiProxies};if(!f.success)return console.warn(`环境文件更新失败: ${f.error}`),n.NextResponse.json({success:!0,message:"代理环境更新成功,但环境文件更新失败",warning:`环境文件更新失败: ${f.error}`,data:x});return n.NextResponse.json({success:!0,message:"代理环境更新成功",data:{...x,updatedEnvFile:f.updatedFile}})}catch(r){let e=r instanceof Error?r.message:"更新项目配置失败";return console.error("更新项目配置失败:",r),n.NextResponse.json({success:!1,error:e},{status:500})}}},42106:e=>{"use strict";var{g:r,__dirname:t}=e;{e.s({patchFetch:()=>a,routeModule:()=>r,serverHooks:()=>u,workAsyncStorage:()=>t,workUnitAsyncStorage:()=>c});var n=e.i(45746),s=e.i(93828),i=e.i(18250),o=e.i(32875);let r=new n.AppRouteRouteModule({definition:{kind:s.RouteKind.APP_ROUTE,page:"/api/project-config/route",pathname:"/api/project-config",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/project-config/route.ts",nextConfigOutput:"",userland:o}),{workAsyncStorage:t,workUnitAsyncStorage:c,serverHooks:u}=r;function a(){return(0,i.patchFetch)({workAsyncStorage:t,workUnitAsyncStorage:c})}}}};
2
2
 
3
- //# sourceMappingURL=%5Broot-of-the-server%5D__54f2f032._.js.map
3
+ //# sourceMappingURL=%5Broot-of-the-server%5D__6496ee9b._.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["turbopack:///[project]/packages/server/src/lib/workspace-types.ts","turbopack:///[project]/packages/server/src/lib/workspace-config.ts","turbopack:///[project]/packages/server/src/lib/api-proxy.ts","turbopack:///[project]/packages/server/src/lib/env-file-operations.ts","turbopack:///[project]/packages/server/src/app/api/project-config/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 ApiProxyRewrite {\n mode: 'none' | 'remove' | 'replace';\n targetPrefix?: string;\n}\n\nexport interface ApiProxyItem {\n prefix: string;\n proxyKey?: string;\n currentProxy: string;\n proxyEnv: {\n [key: string]: string;\n };\n rewrite?: ApiProxyRewrite;\n}\n\nexport interface ProjectConfig {\n repo: string;\n mockingIntercept?: boolean;\n mockOpen?: boolean;\n envs: {\n [envName: string]: {\n host: string;\n envFileName: string;\n apiProxies: ApiProxyItem[];\n subApps?: string[];\n startCommand?: string;\n /**\n * 微应用路径标识:用于在共享宿主(micro-app 域名)下区分兄弟子应用。\n * 插件按 micro-app 元素的 default-page / url 是否“包含”该值来选中对应本地 host。\n * 例如 micro-components 为 \"/micro/components\"、360-icrc-site 为 \"/micro/360-icrc-site\"。\n */\n microPath?: 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 projectName?: 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}\n","import { readFile, writeFile, access, constants, rename } from 'fs/promises';\nimport type { ProjectsConfig } from './workspace-types';\nimport { PROJECT_CONFIG_PATH } from './workspace-types';\n\n/**\n * 读取并解析项目配置文件\n * @returns {Promise<ProjectsConfig>} 项目配置对象\n */\nexport async function getProjectsConfig(): Promise<ProjectsConfig> {\n try {\n await access(PROJECT_CONFIG_PATH, constants.F_OK);\n } catch {\n // 文件不存在,创建并写入空对象\n await saveProjectsConfig({});\n return {};\n }\n\n try {\n const configContent = await readFile(PROJECT_CONFIG_PATH, 'utf-8');\n // 如果文件为空,返回空对象\n if (!configContent) {\n return {};\n }\n return JSON.parse(configContent);\n } catch (error) {\n console.error('读取或解析项目配置文件失败:', error);\n // 在出错时返回空对象或抛出错误,这里选择抛出以通知调用者\n throw new Error('无法加载项目配置');\n }\n}\n\n/**\n * 将项目配置写入文件(原子操作)\n * @param {ProjectsConfig} config - 要保存的配置对象\n */\nexport async function saveProjectsConfig(config: ProjectsConfig): Promise<void> {\n const tempConfigPath = PROJECT_CONFIG_PATH + '.tmp';\n try {\n await writeFile(tempConfigPath, JSON.stringify(config, null, 2), 'utf-8');\n await rename(tempConfigPath, PROJECT_CONFIG_PATH);\n } catch (error) {\n console.error('保存项目配置文件失败:', error);\n throw new Error('无法保存项目配置');\n }\n}\n\n/**\n * 项目状态枚举\n */\nexport enum ProjectStatus {\n PENDING = 'pending',\n EXISTING = 'existing',\n CLONING = 'cloning',\n SUCCESS = 'success',\n FAILED = 'failed',\n RETRYING = 'retrying',\n}\n\n/**\n * 项目进度信息接口\n */\nexport interface ProjectProgress {\n projectName: string;\n status: ProjectStatus;\n progress: number; // 0-100\n message: string;\n error?: string;\n startTime?: number;\n endTime?: number;\n}\n\n/**\n * 初始化结果接口\n */\nexport interface InitializationResult {\n success: boolean;\n totalProjects: number;\n successCount: number;\n failedCount: number;\n failedProjects: string[];\n workspacePath: string;\n duration: number;\n}\n\n/**\n * Git 操作配置接口\n */\nexport interface GitOperationConfig {\n repoUrl: string;\n projectName?: string;\n targetDir: string;\n timeout: number;\n onProgress?: (progress: number, message: string) => void;\n onError?: (error: string) => void;\n}\n","import type { ApiProxyItem } from './workspace-types';\n\nexport const PRIME_PROXY_PREFIX_MAP_KEY = 'PRIME_PROXY_PREFIX_MAP';\nexport const PRIME_PROXY_REWRITE_MAP_KEY = 'PRIME_PROXY_REWRITE_MAP';\n\nexport function normalizePrefix(prefix: string): string {\n const trimmed = prefix.trim();\n if (!trimmed.startsWith('/')) {\n return trimmed;\n }\n if (trimmed.length > 1) {\n return trimmed.replace(/\\/+$/, '');\n }\n return trimmed;\n}\n\nfunction toProxyName(prefix: string): string {\n return prefix\n .replace(/^\\//, '')\n .replace(/[^a-zA-Z0-9]+/g, '_')\n .replace(/^_+|_+$/g, '')\n .toUpperCase();\n}\n\nexport function deriveProxyKey(prefix: string, proxyKey?: string): string {\n if (proxyKey && proxyKey.trim()) {\n return proxyKey.trim();\n }\n\n const normalizedPrefix = normalizePrefix(prefix);\n if (normalizedPrefix === '/api') {\n return 'PROXY_URL';\n }\n\n const proxyName = toProxyName(normalizedPrefix);\n return `PROXY_${proxyName}_URL`;\n}\n\nfunction validatePrefix(prefix: string): string | null {\n if (!prefix || !prefix.trim()) {\n return 'prefix 不能为空';\n }\n\n const normalizedPrefix = normalizePrefix(prefix);\n if (!normalizedPrefix.startsWith('/')) {\n return `prefix ${prefix} 必须以 / 开头`;\n }\n\n if (/\\s/.test(normalizedPrefix)) {\n return `prefix ${prefix} 不能包含空白字符`;\n }\n\n return null;\n}\n\nfunction validateRewrite(item: ApiProxyItem, normalizedPrefix: string): string | null {\n if (!item.rewrite) {\n return null;\n }\n\n const { mode, targetPrefix } = item.rewrite;\n\n if (!['none', 'remove', 'replace'].includes(mode)) {\n return `prefix ${normalizedPrefix} 的 rewrite.mode 仅支持 none/remove/replace`;\n }\n\n const hasTargetPrefix = typeof targetPrefix === 'string' && targetPrefix.length > 0;\n\n if (mode === 'remove' && hasTargetPrefix) {\n return `prefix ${normalizedPrefix} 的 rewrite.mode 为 remove 时不允许 targetPrefix`;\n }\n\n if (mode === 'replace') {\n const normalizedTargetPrefix = (targetPrefix || '').trim();\n if (!normalizedTargetPrefix || !normalizedTargetPrefix.startsWith('/') || /\\s/.test(normalizedTargetPrefix)) {\n return `prefix ${normalizedPrefix} 的 rewrite.mode 为 replace 时 targetPrefix 必须以 / 开头且不能包含空白字符`;\n }\n }\n\n return null;\n}\n\nexport function validateApiProxies(apiProxies: ApiProxyItem[]): { valid: true } | { valid: false; error: string } {\n if (!Array.isArray(apiProxies) || apiProxies.length === 0) {\n return { valid: false, error: 'apiProxies 不能为空' };\n }\n\n const seen = new Set<string>();\n\n for (const item of apiProxies) {\n const prefixError = validatePrefix(item.prefix);\n if (prefixError) {\n return { valid: false, error: prefixError };\n }\n\n const normalizedPrefix = normalizePrefix(item.prefix);\n if (seen.has(normalizedPrefix)) {\n return { valid: false, error: `prefix ${normalizedPrefix} 重复` };\n }\n seen.add(normalizedPrefix);\n\n if (!item.currentProxy || !item.currentProxy.trim()) {\n return { valid: false, error: `prefix ${normalizedPrefix} 缺少 currentProxy` };\n }\n\n if (!item.proxyEnv || typeof item.proxyEnv !== 'object') {\n return { valid: false, error: `prefix ${normalizedPrefix} 缺少 proxyEnv` };\n }\n\n const currentProxyUrl = item.proxyEnv[item.currentProxy];\n if (typeof currentProxyUrl !== 'string') {\n return { valid: false, error: `prefix ${normalizedPrefix} 的 currentProxy 不存在于 proxyEnv 中` };\n }\n\n if (item.currentProxy === 'custom' && !currentProxyUrl.trim()) {\n return { valid: false, error: `prefix ${normalizedPrefix} 选择 custom 时必须提供 URL` };\n }\n\n if (!currentProxyUrl.trim()) {\n return { valid: false, error: `prefix ${normalizedPrefix} 的 currentProxy URL 不能为空` };\n }\n\n const rewriteError = validateRewrite(item, normalizedPrefix);\n if (rewriteError) {\n return { valid: false, error: rewriteError };\n }\n }\n\n return { valid: true };\n}\n\nexport function normalizeApiProxyItem(item: ApiProxyItem): ApiProxyItem {\n const prefix = normalizePrefix(item.prefix);\n\n let rewrite = item.rewrite;\n if (rewrite) {\n if (rewrite.mode === 'replace') {\n rewrite = {\n mode: 'replace',\n targetPrefix: (rewrite.targetPrefix || '').trim().replace(/\\/+$/, '') || '/',\n };\n } else if (rewrite.mode === 'remove') {\n rewrite = {\n mode: 'remove',\n };\n } else {\n rewrite = {\n mode: 'none',\n };\n }\n }\n\n return {\n ...item,\n prefix,\n rewrite,\n proxyKey: deriveProxyKey(prefix, item.proxyKey),\n };\n}\n\nexport function buildEnvFileContent(apiProxies: ApiProxyItem[]): { content: string } | { error: string } {\n const validationResult = validateApiProxies(apiProxies);\n if (!validationResult.valid) {\n return { error: validationResult.error };\n }\n\n const normalizedItems = apiProxies.map(normalizeApiProxyItem);\n const prefixMap = normalizedItems.reduce<Record<string, string>>((acc, item) => {\n acc[item.prefix] = item.proxyKey as string;\n return acc;\n }, {});\n\n const rewriteMap = normalizedItems.reduce<Record<string, string>>((acc, item) => {\n if (!item.rewrite || item.rewrite.mode === 'none') {\n return acc;\n }\n\n if (item.rewrite.mode === 'remove') {\n acc[item.prefix] = '';\n return acc;\n }\n\n if (item.rewrite.mode === 'replace') {\n acc[item.prefix] = item.rewrite.targetPrefix as string;\n }\n\n return acc;\n }, {});\n\n const lines = [\n `${PRIME_PROXY_PREFIX_MAP_KEY}=${JSON.stringify(prefixMap)}`,\n ...(Object.keys(rewriteMap).length > 0 ? [`${PRIME_PROXY_REWRITE_MAP_KEY}=${JSON.stringify(rewriteMap)}`] : []),\n ...normalizedItems.map((item) => `${item.proxyKey}=${item.proxyEnv[item.currentProxy].trim()}`),\n ];\n\n return {\n content: lines.join('\\n'),\n };\n}\n","import { promises as fs } from 'fs';\nimport { join } from 'path';\nimport type { ProjectConfig } from './workspace-types';\nimport { buildEnvFileContent } from './api-proxy';\n\n/**\n * 为指定项目创建环境文件,如果文件已存在则跳过。\n * @param projectName - 项目名称\n * @param projectConfig - 项目配置\n * @param workspacePath - 工作空间根路径\n * @returns 一个包含已创建和已跳过文件列表的对象\n */\nexport async function createProjectEnvFiles(\n projectName: string,\n projectConfig: ProjectConfig,\n workspacePath: string,\n): Promise<{\n success: boolean;\n createdFiles: string[];\n skippedFiles: string[];\n error?: string;\n}> {\n const projectPath = join(workspacePath, projectName);\n const createdFiles: string[] = [];\n const skippedFiles: string[] = [];\n\n try {\n await fs.mkdir(projectPath, { recursive: true });\n\n const envs = projectConfig.envs || {};\n for (const envName in envs) {\n const envConfig = envs[envName];\n if (envConfig.envFileName && envConfig.apiProxies?.length) {\n const filePath = join(projectPath, envConfig.envFileName);\n\n try {\n await fs.access(filePath);\n // 文件已存在,跳过\n skippedFiles.push(envConfig.envFileName);\n } catch {\n const built = buildEnvFileContent(envConfig.apiProxies);\n if ('error' in built) {\n return {\n success: false,\n createdFiles,\n skippedFiles,\n error: `环境 ${envName} 配置无效: ${built.error}`,\n };\n }\n\n await fs.writeFile(filePath, built.content, 'utf-8');\n createdFiles.push(envConfig.envFileName);\n }\n }\n }\n return { success: true, createdFiles, skippedFiles };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`在为项目 ${projectName} 创建环境文件时出错:`, error);\n return { success: false, createdFiles, skippedFiles, error: errorMessage };\n }\n}\n\n/**\n * 为指定项目创建.mock文件夹\n * @param projectName - 项目名称\n * @param workspacePath - 工作空间根路径\n * @returns 创建结果\n */\nexport async function createProjectMockDirectories(\n projectName: string,\n workspacePath: string,\n): Promise<{\n success: boolean;\n createdDirectories: string[];\n skippedDirectories: string[];\n error?: string;\n}> {\n const projectPath = join(workspacePath, projectName);\n const mockPath = join(projectPath, '.mock');\n const createdDirectories: string[] = [];\n const skippedDirectories: string[] = [];\n\n try {\n // 创建 .mock 文件夹\n try {\n await fs.access(mockPath);\n skippedDirectories.push('.mock');\n } catch {\n await fs.mkdir(mockPath, { recursive: true });\n createdDirectories.push('.mock');\n }\n\n return { success: true, createdDirectories, skippedDirectories };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`在为项目 ${projectName} 创建Mock目录时出错:`, error);\n return { success: false, createdDirectories, skippedDirectories, error: errorMessage };\n }\n}\n\n/**\n * 更新指定项目环境的环境文件内容\n * @param projectName - 项目名称\n * @param envName - 环境名称\n * @param projectConfig - 项目配置\n * @param workspacePath - 工作空间根路径\n * @returns 更新结果\n */\nexport async function updateProjectEnvFile(\n projectName: string,\n envName: string,\n projectConfig: ProjectConfig,\n workspacePath: string,\n): Promise<{\n success: boolean;\n updatedFile?: string;\n error?: string;\n}> {\n try {\n const envConfig = projectConfig.envs[envName];\n \n if (!envConfig) {\n return {\n success: false,\n error: `环境 ${envName} 不存在于项目 ${projectName} 配置中`,\n };\n }\n\n if (!envConfig.envFileName || !envConfig.apiProxies?.length) {\n return {\n success: false,\n error: `环境 ${envName} 缺少 envFileName 或 apiProxies 配置`,\n };\n }\n\n const built = buildEnvFileContent(envConfig.apiProxies);\n if ('error' in built) {\n return {\n success: false,\n error: built.error,\n };\n }\n\n const projectPath = join(workspacePath, projectName);\n const filePath = join(projectPath, envConfig.envFileName);\n\n // 写入文件内容\n await fs.writeFile(filePath, built.content, 'utf-8');\n\n console.log(`已更新环境文件: ${filePath}, 内容: ${built.content}`);\n \n return {\n success: true,\n updatedFile: envConfig.envFileName,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`更新项目 ${projectName} 环境 ${envName} 的环境文件时出错:`, error);\n return {\n success: false,\n error: errorMessage,\n };\n }\n} ","import { NextRequest, NextResponse } from 'next/server';\nimport {\n getProjectsConfig,\n saveProjectsConfig,\n} from '@/lib/workspace-config';\nimport { updateProjectEnvFile } from '@/lib/env-file-operations';\nimport { validateApiProxies } from '@/lib/api-proxy';\nimport { WORKSPACE_CONFIG } from '@/lib/workspace-types';\n\nexport async function GET(request: NextRequest) {\n try {\n const { searchParams } = new URL(request.url);\n const projectName = searchParams.get('project');\n\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 projectName,\n repo: projectConfig.repo,\n mockingIntercept: projectConfig.mockingIntercept,\n mockOpen: projectConfig.mockOpen,\n envs: projectConfig.envs,\n },\n });\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : '获取项目配置失败';\n console.error('获取项目配置失败:', error);\n return NextResponse.json(\n { success: false, error: errorMessage },\n { status: 500 },\n );\n }\n}\n\nexport async function PUT(request: NextRequest) {\n try {\n // 解析请求体\n const { projectName, envName, apiProxies, projectConfig } =\n await request.json();\n\n // 参数验证\n if (!projectName) {\n return NextResponse.json(\n {\n success: false,\n error: '缺少必要参数:projectName',\n },\n { status: 400 },\n );\n }\n\n // 如果是项目级配置更新\n if (projectConfig) {\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 // 更新项目级配置\n if (projectConfig.mockingIntercept !== undefined) {\n projectsConfig[projectName].mockingIntercept = projectConfig.mockingIntercept;\n }\n if (projectConfig.mockOpen !== undefined) {\n projectsConfig[projectName].mockOpen = projectConfig.mockOpen;\n }\n\n // 保存更新后的配置\n await saveProjectsConfig(projectsConfig);\n\n return NextResponse.json({\n success: true,\n message: '项目配置更新成功',\n data: {\n projectName,\n mockingIntercept: projectsConfig[projectName].mockingIntercept,\n mockOpen: projectsConfig[projectName].mockOpen,\n },\n });\n }\n\n // 环境级配置更新的参数验证\n if (!envName || !Array.isArray(apiProxies)) {\n return NextResponse.json(\n {\n success: false,\n error: '缺少必要参数:envName, apiProxies',\n },\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 // 检查环境是否存在\n if (!projectsConfig[projectName].envs[envName]) {\n return NextResponse.json(\n {\n success: false,\n error: `项目 ${projectName} 中不存在环境 ${envName}`,\n },\n { status: 404 },\n );\n }\n\n const validation = validateApiProxies(apiProxies);\n if (!validation.valid) {\n return NextResponse.json(\n { success: false, error: validation.error },\n { status: 400 },\n );\n }\n\n projectsConfig[projectName].envs[envName].apiProxies = apiProxies;\n\n // 保存更新后的配置\n await saveProjectsConfig(projectsConfig);\n\n // 更新项目的环境文件\n const envFileResult = await updateProjectEnvFile(\n projectName,\n envName,\n projectsConfig[projectName],\n WORKSPACE_CONFIG.WORKSPACE_ROOT,\n );\n\n // 准备响应数据\n const responseData = {\n projectName,\n envName,\n apiProxies: projectsConfig[projectName].envs[envName].apiProxies,\n };\n\n // 如果环境文件更新失败,在响应中包含警告信息\n if (!envFileResult.success) {\n console.warn(`环境文件更新失败: ${envFileResult.error}`);\n return NextResponse.json({\n success: true,\n message: '代理环境更新成功,但环境文件更新失败',\n warning: `环境文件更新失败: ${envFileResult.error}`,\n data: responseData,\n });\n }\n\n return NextResponse.json({\n success: true,\n message: '代理环境更新成功',\n data: {\n ...responseData,\n updatedEnvFile: envFileResult.updatedFile,\n },\n });\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : '更新项目配置失败';\n console.error('更新项目配置失败:', 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":[5]}
1
+ {"version":3,"sources":["turbopack:///[project]/packages/server/src/lib/workspace-types.ts","turbopack:///[project]/packages/server/src/lib/workspace-config.ts","turbopack:///[project]/packages/server/src/lib/api-proxy.ts","turbopack:///[project]/packages/server/src/lib/env-file-operations.ts","turbopack:///[project]/packages/server/src/app/api/project-config/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 ApiProxyRewrite {\n mode: 'none' | 'remove' | 'replace';\n targetPrefix?: string;\n}\n\nexport interface ApiProxyItem {\n prefix: string;\n proxyKey?: string;\n currentProxy: string;\n proxyEnv: {\n [key: string]: string;\n };\n rewrite?: ApiProxyRewrite;\n}\n\nexport interface ProjectConfig {\n repo: string;\n mockingIntercept?: boolean;\n mockOpen?: boolean;\n envs: {\n [envName: string]: {\n host: string;\n envFileName: string;\n apiProxies: ApiProxyItem[];\n subApps?: string[];\n startCommand?: string;\n /**\n * 微应用路径标识:用于在共享宿主(micro-app 域名)下区分兄弟子应用。\n * 插件按 micro-app 元素的 default-page / url 是否“包含”该值来选中对应本地 host。\n * 例如 micro-components 为 \"/micro/components\"、360-icrc-site 为 \"/micro/360-icrc-site\"。\n */\n microPath?: 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 projectName?: 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}\n","import { readFile, writeFile, access, constants, rename } from 'fs/promises';\nimport type { ProjectsConfig } from './workspace-types';\nimport { PROJECT_CONFIG_PATH } from './workspace-types';\n\n/**\n * 读取并解析项目配置文件\n * @returns {Promise<ProjectsConfig>} 项目配置对象\n */\nexport async function getProjectsConfig(): Promise<ProjectsConfig> {\n try {\n await access(PROJECT_CONFIG_PATH, constants.F_OK);\n } catch {\n // 文件不存在,创建并写入空对象\n await saveProjectsConfig({});\n return {};\n }\n\n try {\n const configContent = await readFile(PROJECT_CONFIG_PATH, 'utf-8');\n // 如果文件为空,返回空对象\n if (!configContent) {\n return {};\n }\n return JSON.parse(configContent);\n } catch (error) {\n console.error('读取或解析项目配置文件失败:', error);\n // 在出错时返回空对象或抛出错误,这里选择抛出以通知调用者\n throw new Error('无法加载项目配置');\n }\n}\n\n/**\n * 将项目配置写入文件(原子操作)\n * @param {ProjectsConfig} config - 要保存的配置对象\n */\nexport async function saveProjectsConfig(config: ProjectsConfig): Promise<void> {\n const tempConfigPath = PROJECT_CONFIG_PATH + '.tmp';\n try {\n await writeFile(tempConfigPath, JSON.stringify(config, null, 2), 'utf-8');\n await rename(tempConfigPath, PROJECT_CONFIG_PATH);\n } catch (error) {\n console.error('保存项目配置文件失败:', error);\n throw new Error('无法保存项目配置');\n }\n}\n\n/**\n * 项目状态枚举\n */\nexport enum ProjectStatus {\n PENDING = 'pending',\n EXISTING = 'existing',\n CLONING = 'cloning',\n SUCCESS = 'success',\n FAILED = 'failed',\n RETRYING = 'retrying',\n}\n\n/**\n * 项目进度信息接口\n */\nexport interface ProjectProgress {\n projectName: string;\n status: ProjectStatus;\n progress: number; // 0-100\n message: string;\n error?: string;\n startTime?: number;\n endTime?: number;\n}\n\n/**\n * 初始化结果接口\n */\nexport interface InitializationResult {\n success: boolean;\n totalProjects: number;\n successCount: number;\n failedCount: number;\n failedProjects: string[];\n workspacePath: string;\n duration: number;\n}\n\n/**\n * Git 操作配置接口\n */\nexport interface GitOperationConfig {\n repoUrl: string;\n projectName?: string;\n targetDir: string;\n timeout: number;\n onProgress?: (progress: number, message: string) => void;\n onError?: (error: string) => void;\n}\n","import type { ApiProxyItem } from './workspace-types';\n\nexport const PRIME_PROXY_PREFIX_MAP_KEY = 'PRIME_PROXY_PREFIX_MAP';\nexport const PRIME_PROXY_REWRITE_MAP_KEY = 'PRIME_PROXY_REWRITE_MAP';\n\nexport function normalizePrefix(prefix: string): string {\n const trimmed = prefix.trim();\n if (!trimmed.startsWith('/')) {\n return trimmed;\n }\n if (trimmed.length > 1) {\n return trimmed.replace(/\\/+$/, '');\n }\n return trimmed;\n}\n\nfunction toProxyName(prefix: string): string {\n return prefix\n .replace(/^\\//, '')\n .replace(/[^a-zA-Z0-9]+/g, '_')\n .replace(/^_+|_+$/g, '')\n .toUpperCase();\n}\n\nexport function deriveProxyKey(prefix: string, proxyKey?: string): string {\n if (proxyKey && proxyKey.trim()) {\n return proxyKey.trim();\n }\n\n const normalizedPrefix = normalizePrefix(prefix);\n if (normalizedPrefix === '/api') {\n return 'PROXY_URL';\n }\n\n const proxyName = toProxyName(normalizedPrefix);\n return `PROXY_${proxyName}_URL`;\n}\n\nfunction validatePrefix(prefix: string): string | null {\n if (!prefix || !prefix.trim()) {\n return 'prefix 不能为空';\n }\n\n const normalizedPrefix = normalizePrefix(prefix);\n if (!normalizedPrefix.startsWith('/')) {\n return `prefix ${prefix} 必须以 / 开头`;\n }\n\n if (/\\s/.test(normalizedPrefix)) {\n return `prefix ${prefix} 不能包含空白字符`;\n }\n\n return null;\n}\n\nfunction validateRewrite(item: ApiProxyItem, normalizedPrefix: string): string | null {\n if (!item.rewrite) {\n return null;\n }\n\n const { mode, targetPrefix } = item.rewrite;\n\n if (!['none', 'remove', 'replace'].includes(mode)) {\n return `prefix ${normalizedPrefix} 的 rewrite.mode 仅支持 none/remove/replace`;\n }\n\n const hasTargetPrefix = typeof targetPrefix === 'string' && targetPrefix.length > 0;\n\n if (mode === 'remove' && hasTargetPrefix) {\n return `prefix ${normalizedPrefix} 的 rewrite.mode 为 remove 时不允许 targetPrefix`;\n }\n\n if (mode === 'replace') {\n const normalizedTargetPrefix = (targetPrefix || '').trim();\n if (!normalizedTargetPrefix || !normalizedTargetPrefix.startsWith('/') || /\\s/.test(normalizedTargetPrefix)) {\n return `prefix ${normalizedPrefix} 的 rewrite.mode 为 replace 时 targetPrefix 必须以 / 开头且不能包含空白字符`;\n }\n }\n\n return null;\n}\n\nexport function validateApiProxies(apiProxies: ApiProxyItem[]): { valid: true } | { valid: false; error: string } {\n if (!Array.isArray(apiProxies) || apiProxies.length === 0) {\n return { valid: false, error: 'apiProxies 不能为空' };\n }\n\n const seen = new Set<string>();\n\n for (const item of apiProxies) {\n const prefixError = validatePrefix(item.prefix);\n if (prefixError) {\n return { valid: false, error: prefixError };\n }\n\n const normalizedPrefix = normalizePrefix(item.prefix);\n if (seen.has(normalizedPrefix)) {\n return { valid: false, error: `prefix ${normalizedPrefix} 重复` };\n }\n seen.add(normalizedPrefix);\n\n if (!item.currentProxy || !item.currentProxy.trim()) {\n return { valid: false, error: `prefix ${normalizedPrefix} 缺少 currentProxy` };\n }\n\n if (!item.proxyEnv || typeof item.proxyEnv !== 'object') {\n return { valid: false, error: `prefix ${normalizedPrefix} 缺少 proxyEnv` };\n }\n\n const currentProxyUrl = item.proxyEnv[item.currentProxy];\n if (typeof currentProxyUrl !== 'string') {\n return { valid: false, error: `prefix ${normalizedPrefix} 的 currentProxy 不存在于 proxyEnv 中` };\n }\n\n if (item.currentProxy === 'custom' && !currentProxyUrl.trim()) {\n return { valid: false, error: `prefix ${normalizedPrefix} 选择 custom 时必须提供 URL` };\n }\n\n if (!currentProxyUrl.trim()) {\n return { valid: false, error: `prefix ${normalizedPrefix} 的 currentProxy URL 不能为空` };\n }\n\n const rewriteError = validateRewrite(item, normalizedPrefix);\n if (rewriteError) {\n return { valid: false, error: rewriteError };\n }\n }\n\n return { valid: true };\n}\n\nexport function normalizeApiProxyItem(item: ApiProxyItem): ApiProxyItem {\n const prefix = normalizePrefix(item.prefix);\n\n let rewrite = item.rewrite;\n if (rewrite) {\n if (rewrite.mode === 'replace') {\n rewrite = {\n mode: 'replace',\n targetPrefix: (rewrite.targetPrefix || '').trim().replace(/\\/+$/, '') || '/',\n };\n } else if (rewrite.mode === 'remove') {\n rewrite = {\n mode: 'remove',\n };\n } else {\n rewrite = {\n mode: 'none',\n };\n }\n }\n\n return {\n ...item,\n prefix,\n rewrite,\n proxyKey: deriveProxyKey(prefix, item.proxyKey),\n };\n}\n\nexport function buildEnvFileContent(apiProxies: ApiProxyItem[]): { content: string } | { error: string } {\n const validationResult = validateApiProxies(apiProxies);\n if (!validationResult.valid) {\n return { error: validationResult.error };\n }\n\n const normalizedItems = apiProxies.map(normalizeApiProxyItem);\n const prefixMap = normalizedItems.reduce<Record<string, string>>((acc, item) => {\n acc[item.prefix] = item.proxyKey as string;\n return acc;\n }, {});\n\n const rewriteMap = normalizedItems.reduce<Record<string, string>>((acc, item) => {\n if (!item.rewrite || item.rewrite.mode === 'none') {\n return acc;\n }\n\n if (item.rewrite.mode === 'remove') {\n acc[item.prefix] = '';\n return acc;\n }\n\n if (item.rewrite.mode === 'replace') {\n acc[item.prefix] = item.rewrite.targetPrefix as string;\n }\n\n return acc;\n }, {});\n\n const lines = [\n `${PRIME_PROXY_PREFIX_MAP_KEY}=${JSON.stringify(prefixMap)}`,\n ...(Object.keys(rewriteMap).length > 0 ? [`${PRIME_PROXY_REWRITE_MAP_KEY}=${JSON.stringify(rewriteMap)}`] : []),\n ...normalizedItems.map((item) => `${item.proxyKey}=${item.proxyEnv[item.currentProxy].trim()}`),\n ];\n\n return {\n content: lines.join('\\n'),\n };\n}\n","import { promises as fs } from 'fs';\nimport { join } from 'path';\nimport type { ProjectConfig } from './workspace-types';\nimport { buildEnvFileContent } from './api-proxy';\n\n/**\n * 为指定项目创建环境文件,如果文件已存在则跳过。\n * @param projectName - 项目名称\n * @param projectConfig - 项目配置\n * @param workspacePath - 工作空间根路径\n * @returns 一个包含已创建和已跳过文件列表的对象\n */\nexport async function createProjectEnvFiles(\n projectName: string,\n projectConfig: ProjectConfig,\n workspacePath: string,\n): Promise<{\n success: boolean;\n createdFiles: string[];\n skippedFiles: string[];\n error?: string;\n}> {\n const projectPath = join(workspacePath, projectName);\n const createdFiles: string[] = [];\n const skippedFiles: string[] = [];\n\n try {\n await fs.mkdir(projectPath, { recursive: true });\n\n const envs = projectConfig.envs || {};\n for (const envName in envs) {\n const envConfig = envs[envName];\n if (envConfig.envFileName && envConfig.apiProxies?.length) {\n const filePath = join(projectPath, envConfig.envFileName);\n\n try {\n await fs.access(filePath);\n // 文件已存在,跳过\n skippedFiles.push(envConfig.envFileName);\n } catch {\n const built = buildEnvFileContent(envConfig.apiProxies);\n if ('error' in built) {\n return {\n success: false,\n createdFiles,\n skippedFiles,\n error: `环境 ${envName} 配置无效: ${built.error}`,\n };\n }\n\n await fs.writeFile(filePath, built.content, 'utf-8');\n createdFiles.push(envConfig.envFileName);\n }\n }\n }\n return { success: true, createdFiles, skippedFiles };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`在为项目 ${projectName} 创建环境文件时出错:`, error);\n return { success: false, createdFiles, skippedFiles, error: errorMessage };\n }\n}\n\n/**\n * 为指定项目创建.mock文件夹\n * @param projectName - 项目名称\n * @param workspacePath - 工作空间根路径\n * @returns 创建结果\n */\nexport async function createProjectMockDirectories(\n projectName: string,\n workspacePath: string,\n): Promise<{\n success: boolean;\n createdDirectories: string[];\n skippedDirectories: string[];\n error?: string;\n}> {\n const projectPath = join(workspacePath, projectName);\n const mockPath = join(projectPath, '.mock');\n const createdDirectories: string[] = [];\n const skippedDirectories: string[] = [];\n\n try {\n // 创建 .mock 文件夹\n try {\n await fs.access(mockPath);\n skippedDirectories.push('.mock');\n } catch {\n await fs.mkdir(mockPath, { recursive: true });\n createdDirectories.push('.mock');\n }\n\n return { success: true, createdDirectories, skippedDirectories };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`在为项目 ${projectName} 创建Mock目录时出错:`, error);\n return { success: false, createdDirectories, skippedDirectories, error: errorMessage };\n }\n}\n\n/**\n * 更新指定项目环境的环境文件内容\n * @param projectName - 项目名称\n * @param envName - 环境名称\n * @param projectConfig - 项目配置\n * @param workspacePath - 工作空间根路径\n * @returns 更新结果\n */\nexport async function updateProjectEnvFile(\n projectName: string,\n envName: string,\n projectConfig: ProjectConfig,\n workspacePath: string,\n): Promise<{\n success: boolean;\n updatedFile?: string;\n error?: string;\n}> {\n try {\n const envConfig = projectConfig.envs[envName];\n \n if (!envConfig) {\n return {\n success: false,\n error: `环境 ${envName} 不存在于项目 ${projectName} 配置中`,\n };\n }\n\n if (!envConfig.envFileName || !envConfig.apiProxies?.length) {\n return {\n success: false,\n error: `环境 ${envName} 缺少 envFileName 或 apiProxies 配置`,\n };\n }\n\n const built = buildEnvFileContent(envConfig.apiProxies);\n if ('error' in built) {\n return {\n success: false,\n error: built.error,\n };\n }\n\n const projectPath = join(workspacePath, projectName);\n const filePath = join(projectPath, envConfig.envFileName);\n\n // 写入文件内容\n await fs.writeFile(filePath, built.content, 'utf-8');\n\n console.log(`已更新环境文件: ${filePath}, 内容: ${built.content}`);\n \n return {\n success: true,\n updatedFile: envConfig.envFileName,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`更新项目 ${projectName} 环境 ${envName} 的环境文件时出错:`, error);\n return {\n success: false,\n error: errorMessage,\n };\n }\n} ","import { NextRequest, NextResponse } from 'next/server';\nimport {\n getProjectsConfig,\n saveProjectsConfig,\n} from '@/lib/workspace-config';\nimport { updateProjectEnvFile } from '@/lib/env-file-operations';\nimport { validateApiProxies } from '@/lib/api-proxy';\nimport { WORKSPACE_CONFIG } from '@/lib/workspace-types';\n\nexport async function GET(request: NextRequest) {\n try {\n const { searchParams } = new URL(request.url);\n const projectName = searchParams.get('project');\n\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 projectName,\n repo: projectConfig.repo,\n mockingIntercept: projectConfig.mockingIntercept,\n mockOpen: projectConfig.mockOpen,\n envs: projectConfig.envs,\n },\n });\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : '获取项目配置失败';\n console.error('获取项目配置失败:', error);\n return NextResponse.json(\n { success: false, error: errorMessage },\n { status: 500 },\n );\n }\n}\n\nexport async function PUT(request: NextRequest) {\n try {\n // 解析请求体\n const { projectName, envName, apiProxies, projectConfig } =\n await request.json();\n\n // 参数验证\n if (!projectName) {\n return NextResponse.json(\n {\n success: false,\n error: '缺少必要参数:projectName',\n },\n { status: 400 },\n );\n }\n\n // 如果是项目级配置更新\n if (projectConfig) {\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 // 更新项目级配置\n if (projectConfig.mockingIntercept !== undefined) {\n projectsConfig[projectName].mockingIntercept = projectConfig.mockingIntercept;\n }\n if (projectConfig.mockOpen !== undefined) {\n projectsConfig[projectName].mockOpen = projectConfig.mockOpen;\n }\n\n // 保存更新后的配置\n await saveProjectsConfig(projectsConfig);\n\n return NextResponse.json({\n success: true,\n message: '项目配置更新成功',\n data: {\n projectName,\n mockingIntercept: projectsConfig[projectName].mockingIntercept,\n mockOpen: projectsConfig[projectName].mockOpen,\n },\n });\n }\n\n // 环境级配置更新的参数验证\n if (!envName || !Array.isArray(apiProxies)) {\n return NextResponse.json(\n {\n success: false,\n error: '缺少必要参数:envName, apiProxies',\n },\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 // 检查环境是否存在\n if (!projectsConfig[projectName].envs[envName]) {\n return NextResponse.json(\n {\n success: false,\n error: `项目 ${projectName} 中不存在环境 ${envName}`,\n },\n { status: 404 },\n );\n }\n\n const validation = validateApiProxies(apiProxies);\n if (!validation.valid) {\n return NextResponse.json(\n { success: false, error: validation.error },\n { status: 400 },\n );\n }\n\n projectsConfig[projectName].envs[envName].apiProxies = apiProxies;\n\n // 保存更新后的配置\n await saveProjectsConfig(projectsConfig);\n\n // 更新项目的环境文件\n const envFileResult = await updateProjectEnvFile(\n projectName,\n envName,\n projectsConfig[projectName],\n WORKSPACE_CONFIG.WORKSPACE_ROOT,\n );\n\n // 准备响应数据\n const responseData = {\n projectName,\n envName,\n apiProxies: projectsConfig[projectName].envs[envName].apiProxies,\n };\n\n // 如果环境文件更新失败,在响应中包含警告信息\n if (!envFileResult.success) {\n console.warn(`环境文件更新失败: ${envFileResult.error}`);\n return NextResponse.json({\n success: true,\n message: '代理环境更新成功,但环境文件更新失败',\n warning: `环境文件更新失败: ${envFileResult.error}`,\n data: responseData,\n });\n }\n\n return NextResponse.json({\n success: true,\n message: '代理环境更新成功',\n data: {\n ...responseData,\n updatedEnvFile: envFileResult.updatedFile,\n },\n });\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : '更新项目配置失败';\n console.error('更新项目配置失败:', 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":[5]}
@@ -1,3 +1,3 @@
1
- module.exports={83886:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("fs",()=>require("fs"))},45935:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},88941:e=>{"use strict";var{g:r,__dirname:t}=e;{e.s({PROJECT_CONFIG_PATH:()=>t,ProjectStatus:()=>o,WORKSPACE_CONFIG:()=>r});var s=e.i(13442),n=e.i(30331);let r={WORKSPACE_ROOT:(0,n.join)((0,s.homedir)(),"Documents","prime-workspace"),GIT_TIMEOUT:3e5,MAX_CONCURRENT_CLONES:Math.max(2,Math.min((0,s.cpus)().length,8)),MAX_RETRY_ATTEMPTS:3},t=(0,n.join)((0,s.homedir)(),".prime-projects.json");var o=function(e){return e.PENDING="pending",e.EXISTING="existing",e.CLONING="cloning",e.SUCCESS="success",e.FAILED="failed",e.RETRYING="retrying",e.INCOMPLETE="incomplete",e}({})}},30331:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("path",()=>require("path"))},29549:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},83943:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},86103:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},23430:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},52670:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/compiled/next-server/app-route-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-route-turbo.runtime.prod.js"))},13442:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("os",()=>require("os"))},9892:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("fs/promises",()=>require("fs/promises"))},35692:e=>{"use strict";var{g:r,__dirname:t}=e;e.s({ProjectStatus:()=>a,getProjectsConfig:()=>o,saveProjectsConfig:()=>i});var s=e.i(9892),n=e.i(88941);async function o(){try{await (0,s.access)(n.PROJECT_CONFIG_PATH,s.constants.F_OK)}catch{return await i({}),{}}try{let e=await (0,s.readFile)(n.PROJECT_CONFIG_PATH,"utf-8");if(!e)return{};return JSON.parse(e)}catch(e){throw console.error("读取或解析项目配置文件失败:",e),Error("无法加载项目配置")}}async function i(e){let r=n.PROJECT_CONFIG_PATH+".tmp";try{await (0,s.writeFile)(r,JSON.stringify(e,null,2),"utf-8"),await (0,s.rename)(r,n.PROJECT_CONFIG_PATH)}catch(e){throw console.error("保存项目配置文件失败:",e),Error("无法保存项目配置")}}var a=function(e){return e.PENDING="pending",e.EXISTING="existing",e.CLONING="cloning",e.SUCCESS="success",e.FAILED="failed",e.RETRYING="retrying",e}({})},15564:function(e){var{g:r,__dirname:t,m:s,e:n}=e},35139:e=>{"use strict";var{g:r,__dirname:t}=e;e.s({DELETE:()=>c});var s=e.i(15494),n=e.i(83886),o=e.i(30331),i=e.i(35692),a=e.i(88941);async function c(e){try{let{searchParams:r}=new URL(e.url),t=r.get("project"),c=r.get("apiName");if(!t||!c)return s.NextResponse.json({success:!1,error:"缺少必要参数:project, apiName"},{status:400});if(!(await (0,i.getProjectsConfig)())[t])return s.NextResponse.json({success:!1,error:`项目 ${t} 不存在`},{status:404});let p=(0,o.join)(a.WORKSPACE_CONFIG.WORKSPACE_ROOT,t),u=(0,o.join)(p,".mock",c);try{await n.promises.access(u)}catch{return s.NextResponse.json({success:!1,error:"Mock接口目录不存在"},{status:404})}await n.promises.rmdir(u,{recursive:!0});let d=(0,o.join)(p,".mock");try{let e=await n.promises.readdir(d);0===e.length&&await n.promises.rmdir(d)}catch{}return s.NextResponse.json({success:!0,message:"Mock接口删除成功",data:{projectName:t,apiName:c,deletedPath:(0,o.join)(".mock",c)}})}catch(r){let e=r instanceof Error?r.message:"删除Mock接口失败";return console.error("删除Mock接口失败:",r),s.NextResponse.json({success:!1,error:e},{status:500})}}},19444:e=>{"use strict";var{g:r,__dirname:t}=e;{e.s({patchFetch:()=>a,routeModule:()=>r,serverHooks:()=>p,workAsyncStorage:()=>t,workUnitAsyncStorage:()=>c});var s=e.i(45746),n=e.i(93828),o=e.i(18250),i=e.i(35139);let r=new s.AppRouteRouteModule({definition:{kind:n.RouteKind.APP_ROUTE,page:"/api/delete-mock-api/route",pathname:"/api/delete-mock-api",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/delete-mock-api/route.ts",nextConfigOutput:"",userland:i}),{workAsyncStorage:t,workUnitAsyncStorage:c,serverHooks:p}=r;function a(){return(0,o.patchFetch)({workAsyncStorage:t,workUnitAsyncStorage:c})}}}};
1
+ module.exports={45935:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},30331:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("path",()=>require("path"))},29549:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},83943:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},86103:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},23430:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},52670:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/compiled/next-server/app-route-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-route-turbo.runtime.prod.js"))},13442:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("os",()=>require("os"))},88941:e=>{"use strict";var{g:r,__dirname:t}=e;{e.s({PROJECT_CONFIG_PATH:()=>t,ProjectStatus:()=>o,WORKSPACE_CONFIG:()=>r});var s=e.i(13442),n=e.i(30331);let r={WORKSPACE_ROOT:(0,n.join)((0,s.homedir)(),"Documents","prime-workspace"),GIT_TIMEOUT:3e5,MAX_CONCURRENT_CLONES:Math.max(2,Math.min((0,s.cpus)().length,8)),MAX_RETRY_ATTEMPTS:3},t=(0,n.join)((0,s.homedir)(),".prime-projects.json");var o=function(e){return e.PENDING="pending",e.EXISTING="existing",e.CLONING="cloning",e.SUCCESS="success",e.FAILED="failed",e.RETRYING="retrying",e.INCOMPLETE="incomplete",e}({})}},83886:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("fs",()=>require("fs"))},9892:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("fs/promises",()=>require("fs/promises"))},35692:e=>{"use strict";var{g:r,__dirname:t}=e;e.s({ProjectStatus:()=>a,getProjectsConfig:()=>o,saveProjectsConfig:()=>i});var s=e.i(9892),n=e.i(88941);async function o(){try{await (0,s.access)(n.PROJECT_CONFIG_PATH,s.constants.F_OK)}catch{return await i({}),{}}try{let e=await (0,s.readFile)(n.PROJECT_CONFIG_PATH,"utf-8");if(!e)return{};return JSON.parse(e)}catch(e){throw console.error("读取或解析项目配置文件失败:",e),Error("无法加载项目配置")}}async function i(e){let r=n.PROJECT_CONFIG_PATH+".tmp";try{await (0,s.writeFile)(r,JSON.stringify(e,null,2),"utf-8"),await (0,s.rename)(r,n.PROJECT_CONFIG_PATH)}catch(e){throw console.error("保存项目配置文件失败:",e),Error("无法保存项目配置")}}var a=function(e){return e.PENDING="pending",e.EXISTING="existing",e.CLONING="cloning",e.SUCCESS="success",e.FAILED="failed",e.RETRYING="retrying",e}({})},15564:function(e){var{g:r,__dirname:t,m:s,e:n}=e},35139:e=>{"use strict";var{g:r,__dirname:t}=e;e.s({DELETE:()=>c});var s=e.i(15494),n=e.i(83886),o=e.i(30331),i=e.i(35692),a=e.i(88941);async function c(e){try{let{searchParams:r}=new URL(e.url),t=r.get("project"),c=r.get("apiName");if(!t||!c)return s.NextResponse.json({success:!1,error:"缺少必要参数:project, apiName"},{status:400});if(!(await (0,i.getProjectsConfig)())[t])return s.NextResponse.json({success:!1,error:`项目 ${t} 不存在`},{status:404});let p=(0,o.join)(a.WORKSPACE_CONFIG.WORKSPACE_ROOT,t),u=(0,o.join)(p,".mock",c);try{await n.promises.access(u)}catch{return s.NextResponse.json({success:!1,error:"Mock接口目录不存在"},{status:404})}await n.promises.rmdir(u,{recursive:!0});let d=(0,o.join)(p,".mock");try{let e=await n.promises.readdir(d);0===e.length&&await n.promises.rmdir(d)}catch{}return s.NextResponse.json({success:!0,message:"Mock接口删除成功",data:{projectName:t,apiName:c,deletedPath:(0,o.join)(".mock",c)}})}catch(r){let e=r instanceof Error?r.message:"删除Mock接口失败";return console.error("删除Mock接口失败:",r),s.NextResponse.json({success:!1,error:e},{status:500})}}},19444:e=>{"use strict";var{g:r,__dirname:t}=e;{e.s({patchFetch:()=>a,routeModule:()=>r,serverHooks:()=>p,workAsyncStorage:()=>t,workUnitAsyncStorage:()=>c});var s=e.i(45746),n=e.i(93828),o=e.i(18250),i=e.i(35139);let r=new s.AppRouteRouteModule({definition:{kind:n.RouteKind.APP_ROUTE,page:"/api/delete-mock-api/route",pathname:"/api/delete-mock-api",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/delete-mock-api/route.ts",nextConfigOutput:"",userland:i}),{workAsyncStorage:t,workUnitAsyncStorage:c,serverHooks:p}=r;function a(){return(0,o.patchFetch)({workAsyncStorage:t,workUnitAsyncStorage:c})}}}};
2
2
 
3
- //# sourceMappingURL=%5Broot-of-the-server%5D__c18498ef._.js.map
3
+ //# sourceMappingURL=%5Broot-of-the-server%5D__66952f53._.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["turbopack:///[project]/packages/server/src/lib/workspace-types.ts","turbopack:///[project]/packages/server/src/lib/workspace-config.ts","turbopack:///[project]/packages/server/src/app/api/delete-mock-api/route.ts","turbopack:///[project]/node_modules/.pnpm/next@15.3.4_react-dom@19.1.0_react@19.1.0__react@19.1.0/node_modules/next/dist/src/build/templates/app-route.ts"],"sourcesContent":["import { homedir, cpus } from 'os';\nimport { join } from 'path';\n\n/**\n * 工作空间配置常量\n */\nexport const WORKSPACE_CONFIG = {\n // 工作空间根目录路径\n WORKSPACE_ROOT: join(homedir(), 'Documents', 'prime-workspace'),\n\n // Git 操作超时时间 (毫秒)\n GIT_TIMEOUT: 300000, // 5分钟\n\n // 最大并发克隆数量(基于CPU核心数,最小2个,最大8个)\n MAX_CONCURRENT_CLONES: Math.max(2, Math.min(cpus().length, 8)),\n\n // 重试次数限制\n MAX_RETRY_ATTEMPTS: 3,\n} as const;\n\nexport const PROJECT_CONFIG_PATH = join(homedir(), '.prime-projects.json');\n\nexport interface ApiProxyRewrite {\n mode: 'none' | 'remove' | 'replace';\n targetPrefix?: string;\n}\n\nexport interface ApiProxyItem {\n prefix: string;\n proxyKey?: string;\n currentProxy: string;\n proxyEnv: {\n [key: string]: string;\n };\n rewrite?: ApiProxyRewrite;\n}\n\nexport interface ProjectConfig {\n repo: string;\n mockingIntercept?: boolean;\n mockOpen?: boolean;\n envs: {\n [envName: string]: {\n host: string;\n envFileName: string;\n apiProxies: ApiProxyItem[];\n subApps?: string[];\n startCommand?: string;\n /**\n * 微应用路径标识:用于在共享宿主(micro-app 域名)下区分兄弟子应用。\n * 插件按 micro-app 元素的 default-page / url 是否“包含”该值来选中对应本地 host。\n * 例如 micro-components 为 \"/micro/components\"、360-icrc-site 为 \"/micro/360-icrc-site\"。\n */\n microPath?: 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 projectName?: 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}\n","import { readFile, writeFile, access, constants, rename } from 'fs/promises';\nimport type { ProjectsConfig } from './workspace-types';\nimport { PROJECT_CONFIG_PATH } from './workspace-types';\n\n/**\n * 读取并解析项目配置文件\n * @returns {Promise<ProjectsConfig>} 项目配置对象\n */\nexport async function getProjectsConfig(): Promise<ProjectsConfig> {\n try {\n await access(PROJECT_CONFIG_PATH, constants.F_OK);\n } catch {\n // 文件不存在,创建并写入空对象\n await saveProjectsConfig({});\n return {};\n }\n\n try {\n const configContent = await readFile(PROJECT_CONFIG_PATH, 'utf-8');\n // 如果文件为空,返回空对象\n if (!configContent) {\n return {};\n }\n return JSON.parse(configContent);\n } catch (error) {\n console.error('读取或解析项目配置文件失败:', error);\n // 在出错时返回空对象或抛出错误,这里选择抛出以通知调用者\n throw new Error('无法加载项目配置');\n }\n}\n\n/**\n * 将项目配置写入文件(原子操作)\n * @param {ProjectsConfig} config - 要保存的配置对象\n */\nexport async function saveProjectsConfig(config: ProjectsConfig): Promise<void> {\n const tempConfigPath = PROJECT_CONFIG_PATH + '.tmp';\n try {\n await writeFile(tempConfigPath, JSON.stringify(config, null, 2), 'utf-8');\n await rename(tempConfigPath, PROJECT_CONFIG_PATH);\n } catch (error) {\n console.error('保存项目配置文件失败:', error);\n throw new Error('无法保存项目配置');\n }\n}\n\n/**\n * 项目状态枚举\n */\nexport enum ProjectStatus {\n PENDING = 'pending',\n EXISTING = 'existing',\n CLONING = 'cloning',\n SUCCESS = 'success',\n FAILED = 'failed',\n RETRYING = 'retrying',\n}\n\n/**\n * 项目进度信息接口\n */\nexport interface ProjectProgress {\n projectName: string;\n status: ProjectStatus;\n progress: number; // 0-100\n message: string;\n error?: string;\n startTime?: number;\n endTime?: number;\n}\n\n/**\n * 初始化结果接口\n */\nexport interface InitializationResult {\n success: boolean;\n totalProjects: number;\n successCount: number;\n failedCount: number;\n failedProjects: string[];\n workspacePath: string;\n duration: number;\n}\n\n/**\n * Git 操作配置接口\n */\nexport interface GitOperationConfig {\n repoUrl: string;\n projectName?: string;\n targetDir: string;\n timeout: number;\n onProgress?: (progress: number, message: string) => void;\n onError?: (error: string) => void;\n}\n","import { NextRequest, NextResponse } from 'next/server';\nimport { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { getProjectsConfig } from '@/lib/workspace-config';\nimport { WORKSPACE_CONFIG } from '@/lib/workspace-types';\n\nexport async function DELETE(request: NextRequest) {\n try {\n const { searchParams } = new URL(request.url);\n const projectName = searchParams.get('project');\n const apiName = searchParams.get('apiName');\n\n if (!projectName || !apiName) {\n return NextResponse.json(\n { success: false, error: '缺少必要参数:project, apiName' },\n { status: 400 },\n );\n }\n\n // 验证项目是否存在\n const projectsConfig = await getProjectsConfig();\n if (!projectsConfig[projectName]) {\n return NextResponse.json(\n { success: false, error: `项目 ${projectName} 不存在` },\n { status: 404 },\n );\n }\n\n // 构建API目录路径\n const projectPath = join(WORKSPACE_CONFIG.WORKSPACE_ROOT, projectName);\n const apiPath = join(projectPath, '.mock', apiName);\n\n // 检查API目录是否存在\n try {\n await fs.access(apiPath);\n } catch {\n return NextResponse.json(\n { success: false, error: 'Mock接口目录不存在' },\n { status: 404 },\n );\n }\n\n // 递归删除整个API目录\n await fs.rmdir(apiPath, { recursive: true });\n\n // 检查.mock目录是否为空,如果为空则删除.mock目录\n const mockPath = join(projectPath, '.mock');\n try {\n const mockFiles = await fs.readdir(mockPath);\n if (mockFiles.length === 0) {\n await fs.rmdir(mockPath);\n }\n } catch {\n // 忽略目录删除错误\n }\n\n return NextResponse.json({\n success: true,\n message: 'Mock接口删除成功',\n data: {\n projectName,\n apiName,\n deletedPath: join('.mock', apiName),\n },\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : '删除Mock接口失败';\n console.error('删除Mock接口失败:', error);\n return NextResponse.json(\n { success: false, error: errorMessage },\n { status: 500 },\n );\n }\n}\n","import {\n AppRouteRouteModule,\n type AppRouteRouteModuleOptions,\n} from '../../server/route-modules/app-route/module.compiled'\nimport { RouteKind } from '../../server/route-kind'\nimport { patchFetch as _patchFetch } from '../../server/lib/patch-fetch'\n\nimport * as userland from 'VAR_USERLAND'\n\n// These are injected by the loader afterwards. This is injected as a variable\n// instead of a replacement because this could also be `undefined` instead of\n// an empty string.\ndeclare const nextConfigOutput: AppRouteRouteModuleOptions['nextConfigOutput']\n\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\n// INJECT:nextConfigOutput\n\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: 'VAR_DEFINITION_PAGE',\n pathname: 'VAR_DEFINITION_PATHNAME',\n filename: 'VAR_DEFINITION_FILENAME',\n bundlePath: 'VAR_DEFINITION_BUNDLE_PATH',\n },\n resolvedPagePath: 'VAR_RESOLVED_PAGE_PATH',\n nextConfigOutput,\n userland,\n})\n\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule\n\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage,\n })\n}\n\nexport {\n routeModule,\n workAsyncStorage,\n workUnitAsyncStorage,\n serverHooks,\n patchFetch,\n}\n"],"names":["AppRouteRouteModule","RouteKind","patchFetch","_patchFetch","userland","routeModule","definition","kind","APP_ROUTE","page","pathname","filename","bundlePath","resolvedPagePath","nextConfigOutput","workAsyncStorage","workUnitAsyncStorage","serverHooks"],"mappings":"ubAAA,IAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAKO,IAAM,EAAmB,CAE9B,eAAgB,CAAA,EAAA,EAAA,IAAA,AAAG,EAAE,CAAA,EAAA,EAAA,OAAM,AAAN,IAAW,YAAa,EAA7B,WAAK,MAGrB,YAAa,IAGb,sBAAuB,KAAK,GAAG,CAAC,EAAG,KAAK,GAAG,CAAC,CAAA,EAAA,EAAA,IAAA,AAAG,IAAI,MAAM,CAAE,IAG3D,iBAH4C,EAGxB,CACtB,EAEa,EAAsB,CAAA,EAAA,EAAA,IAAA,AAAG,EAAE,CAAA,EAAA,EAAA,OAAA,AAAM,IAAK,cAAhB,UA6C5B,CA7CiC,GA6C5B,EAAA,SAAA,CAAA,6JAAA,s3CCjEZ,IAAA,EAAA,EAAA,CAAA,CAAA,MAEA,EAAA,EAAA,CAAA,CAAA,OAMO,eAAe,IACpB,GAAI,CACF,MAAM,CAAA,EAAA,EAAA,MAAA,AAAK,EAAE,EAAA,mBAAmB,CAAE,EAAA,GAA5B,MAAqC,CAAC,IAAI,AAAnC,CACf,CAAE,KAAM,CAGN,OADA,MAAM,AAH4B,EAGT,CAAC,GACnB,CAAC,CACV,CAEA,GAAI,CACF,IAAM,EAAgB,MAAM,CAAA,EAAA,EAAA,QAAA,AAAO,EAAE,EAAA,mBAAmB,CAAE,GAA9B,MAE5B,GAAI,CAAC,EACH,CAHmC,KAG5B,CAAC,EAEV,IAHoB,GAGb,KAAK,KAAK,CAAC,EACpB,CAAE,MAAO,EAAO,CAGd,MAFA,QAAQ,KAAK,CAAC,iBAAkB,GAE1B,AAAI,MAAM,WAClB,CACF,CAMO,eAAe,EAAmB,CAAsB,EAC7D,IAAM,EAAiB,EAAA,mBAAmB,CAAG,OAC7C,GAAI,CACF,KAFqB,CAEf,CAAA,EAAA,EAAA,SAAA,AAAQ,EAAE,EAAgB,KAAK,SAAS,CAAC,EAAQ,KAAM,AAAvD,GAA2D,SACjE,MAAM,CAAA,EAAA,EAAA,MAAA,AAAK,EAAE,EAAgB,EAAA,mBAAmB,CAClD,CAAE,EADM,IACC,EAAO,CAEd,MAH6B,AAE7B,QAAQ,KAAK,CAAC,cAAe,GACnB,AAAJ,MAAU,WAClB,CACF,CAKO,IAAK,EAAA,SAAA,CAAA,mIAAA,4HCjDZ,IAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAEO,eAAe,EAAO,CAAoB,EAC/C,GAAI,CACF,GAAM,cAAE,CAAY,CAAE,CAAG,IAAI,IAAI,EAAQ,GAAG,EACtC,EAAc,EAAa,GAAG,CAAC,WAC/B,EAAU,EAAa,GAAG,CAAC,WAEjC,GAAI,CAAC,GAAe,CAAC,EACnB,OAD4B,AACrB,EAAA,YAAY,CAAC,IAAI,CACtB,CAAE,SAAS,EAAO,MAAO,AADpB,yBAC8C,EACnD,CAAE,OAAQ,GAAI,GAMlB,GAAI,CAAC,CADkB,MAAM,CAAA,EAAA,EAAA,iBAAgB,AAAhB,GAAgB,CAC1B,CAAC,EAAY,CAC9B,CADgC,MACzB,EAAA,EAFoB,UAER,CAAC,IAAI,CACtB,CAAE,SAAS,EAAO,MADb,AACoB,CAAC,GAAG,EAAE,EAAY,IAAI,CAAC,AAAC,EACjD,CAAE,OAAQ,GAAI,GAKlB,IAAM,EAAc,CAAA,EAAA,EAAA,IAAA,AAAG,EAAE,EAAA,gBAAgB,CAAC,WAAtB,GAAoC,CAAE,GACpD,CADmB,CACT,CAAA,EAAA,EAAA,IAAA,AAAG,EAAE,EAAa,QAAS,GAG3C,GAAI,CACF,MAAM,EAAA,KAJQ,GAIN,CAAC,MAAM,CAAC,EAClB,CAAE,KAAM,CACN,OAAO,EAAA,EAFD,UAEa,CAAC,IAAI,CACtB,CAAE,SAAS,EAAO,MAAO,AADpB,aACkC,EACvC,CAAE,OAAQ,GAAI,EAElB,CAGA,MAAM,EAAA,QAAE,CAAC,KAAK,CAAC,EAAS,CAAE,WAAW,CAAK,GAG1C,GAHM,CAGA,EAAW,CAAA,EAAA,EAAA,IAAA,AAAG,EAAE,EAAa,SACnC,GAAI,CACF,IAAM,EAAY,MAAM,EAAA,CAFT,OAEW,CAAC,OAAO,CAAC,GACV,GAAG,CAAxB,EAAU,MAAM,EAClB,EAFsB,IAEhB,EAAA,QAAE,CAAC,KAAK,CAAC,EAEnB,CAAE,KAAM,CAER,CAEA,OAAO,EAAA,EANG,UAMS,CAAC,IAAI,CAAC,CACvB,SAAS,EACT,MAFK,EAEI,aACT,KAAM,aACJ,UACA,EACA,YAAa,CAAA,EAAA,EAAA,IAAA,AAAG,EAAE,QAAS,EAC7B,CACF,EACF,CAAE,MAAO,EAAO,CACd,IAAM,EAAe,CAJJ,YAIqB,MAAQ,EAAM,OAAO,CAAG,aAE9D,OADA,QAAQ,KAAK,CAAC,cAAe,GACtB,EAAA,YAAY,CAAC,IAAI,CACtB,CAAE,SAAS,EAAO,MADb,AACoB,CAAa,EACtC,CAAE,OAAQ,GAAI,EAElB,CACF,gKCzEA,IAAA,EAGO,EAAA,CAFLA,AAEK,CAAA,OACP,EAA0B,EAAyB,CAA1CC,AAA0C,CAAA,GAAA,EAH9B,EAIrB,CADkB,CAD2C,AAEnB,EAAA,CAAA,AAAjCC,CAFF,AAEmC,GADhB,CAC8C,GAExE,EAAwC,EAAA,CAAA,CAFjBC,AAEiB,EAA5BC,KAWZ,IAbkC,AAa5BC,EAAc,GAXM,CAWN,EAbsB,AAalBL,YAXgB,OAWhBA,CAAoB,CAC1CM,WAAY,CACVC,KAAMN,EAAAA,SAAAA,CAAUO,SAAS,CACzBC,KAAM,6BACNC,SAAU,uBACVC,SAAU,QACVC,WAAY,EACd,EACAC,iBAAkB,iEAClBC,iBAXF,CAA0B,WAYxBV,CACF,GAKM,kBAAEW,CAAgB,sBAAEC,CAAoB,aAAEC,CAAW,CAAE,CAAGZ,EAEhE,SAASH,IACP,MAAA,CAAA,EAAA,EAAOC,UAAAA,EAAY,kBACjBY,uBACAC,CACF,EACF","ignoreList":[3]}
1
+ {"version":3,"sources":["turbopack:///[project]/packages/server/src/lib/workspace-types.ts","turbopack:///[project]/packages/server/src/lib/workspace-config.ts","turbopack:///[project]/packages/server/src/app/api/delete-mock-api/route.ts","turbopack:///[project]/node_modules/.pnpm/next@15.3.4_react-dom@19.1.0_react@19.1.0__react@19.1.0/node_modules/next/dist/src/build/templates/app-route.ts"],"sourcesContent":["import { homedir, cpus } from 'os';\nimport { join } from 'path';\n\n/**\n * 工作空间配置常量\n */\nexport const WORKSPACE_CONFIG = {\n // 工作空间根目录路径\n WORKSPACE_ROOT: join(homedir(), 'Documents', 'prime-workspace'),\n\n // Git 操作超时时间 (毫秒)\n GIT_TIMEOUT: 300000, // 5分钟\n\n // 最大并发克隆数量(基于CPU核心数,最小2个,最大8个)\n MAX_CONCURRENT_CLONES: Math.max(2, Math.min(cpus().length, 8)),\n\n // 重试次数限制\n MAX_RETRY_ATTEMPTS: 3,\n} as const;\n\nexport const PROJECT_CONFIG_PATH = join(homedir(), '.prime-projects.json');\n\nexport interface ApiProxyRewrite {\n mode: 'none' | 'remove' | 'replace';\n targetPrefix?: string;\n}\n\nexport interface ApiProxyItem {\n prefix: string;\n proxyKey?: string;\n currentProxy: string;\n proxyEnv: {\n [key: string]: string;\n };\n rewrite?: ApiProxyRewrite;\n}\n\nexport interface ProjectConfig {\n repo: string;\n mockingIntercept?: boolean;\n mockOpen?: boolean;\n envs: {\n [envName: string]: {\n host: string;\n envFileName: string;\n apiProxies: ApiProxyItem[];\n subApps?: string[];\n startCommand?: string;\n /**\n * 微应用路径标识:用于在共享宿主(micro-app 域名)下区分兄弟子应用。\n * 插件按 micro-app 元素的 default-page / url 是否“包含”该值来选中对应本地 host。\n * 例如 micro-components 为 \"/micro/components\"、360-icrc-site 为 \"/micro/360-icrc-site\"。\n */\n microPath?: 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 projectName?: 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}\n","import { readFile, writeFile, access, constants, rename } from 'fs/promises';\nimport type { ProjectsConfig } from './workspace-types';\nimport { PROJECT_CONFIG_PATH } from './workspace-types';\n\n/**\n * 读取并解析项目配置文件\n * @returns {Promise<ProjectsConfig>} 项目配置对象\n */\nexport async function getProjectsConfig(): Promise<ProjectsConfig> {\n try {\n await access(PROJECT_CONFIG_PATH, constants.F_OK);\n } catch {\n // 文件不存在,创建并写入空对象\n await saveProjectsConfig({});\n return {};\n }\n\n try {\n const configContent = await readFile(PROJECT_CONFIG_PATH, 'utf-8');\n // 如果文件为空,返回空对象\n if (!configContent) {\n return {};\n }\n return JSON.parse(configContent);\n } catch (error) {\n console.error('读取或解析项目配置文件失败:', error);\n // 在出错时返回空对象或抛出错误,这里选择抛出以通知调用者\n throw new Error('无法加载项目配置');\n }\n}\n\n/**\n * 将项目配置写入文件(原子操作)\n * @param {ProjectsConfig} config - 要保存的配置对象\n */\nexport async function saveProjectsConfig(config: ProjectsConfig): Promise<void> {\n const tempConfigPath = PROJECT_CONFIG_PATH + '.tmp';\n try {\n await writeFile(tempConfigPath, JSON.stringify(config, null, 2), 'utf-8');\n await rename(tempConfigPath, PROJECT_CONFIG_PATH);\n } catch (error) {\n console.error('保存项目配置文件失败:', error);\n throw new Error('无法保存项目配置');\n }\n}\n\n/**\n * 项目状态枚举\n */\nexport enum ProjectStatus {\n PENDING = 'pending',\n EXISTING = 'existing',\n CLONING = 'cloning',\n SUCCESS = 'success',\n FAILED = 'failed',\n RETRYING = 'retrying',\n}\n\n/**\n * 项目进度信息接口\n */\nexport interface ProjectProgress {\n projectName: string;\n status: ProjectStatus;\n progress: number; // 0-100\n message: string;\n error?: string;\n startTime?: number;\n endTime?: number;\n}\n\n/**\n * 初始化结果接口\n */\nexport interface InitializationResult {\n success: boolean;\n totalProjects: number;\n successCount: number;\n failedCount: number;\n failedProjects: string[];\n workspacePath: string;\n duration: number;\n}\n\n/**\n * Git 操作配置接口\n */\nexport interface GitOperationConfig {\n repoUrl: string;\n projectName?: string;\n targetDir: string;\n timeout: number;\n onProgress?: (progress: number, message: string) => void;\n onError?: (error: string) => void;\n}\n","import { NextRequest, NextResponse } from 'next/server';\nimport { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { getProjectsConfig } from '@/lib/workspace-config';\nimport { WORKSPACE_CONFIG } from '@/lib/workspace-types';\n\nexport async function DELETE(request: NextRequest) {\n try {\n const { searchParams } = new URL(request.url);\n const projectName = searchParams.get('project');\n const apiName = searchParams.get('apiName');\n\n if (!projectName || !apiName) {\n return NextResponse.json(\n { success: false, error: '缺少必要参数:project, apiName' },\n { status: 400 },\n );\n }\n\n // 验证项目是否存在\n const projectsConfig = await getProjectsConfig();\n if (!projectsConfig[projectName]) {\n return NextResponse.json(\n { success: false, error: `项目 ${projectName} 不存在` },\n { status: 404 },\n );\n }\n\n // 构建API目录路径\n const projectPath = join(WORKSPACE_CONFIG.WORKSPACE_ROOT, projectName);\n const apiPath = join(projectPath, '.mock', apiName);\n\n // 检查API目录是否存在\n try {\n await fs.access(apiPath);\n } catch {\n return NextResponse.json(\n { success: false, error: 'Mock接口目录不存在' },\n { status: 404 },\n );\n }\n\n // 递归删除整个API目录\n await fs.rmdir(apiPath, { recursive: true });\n\n // 检查.mock目录是否为空,如果为空则删除.mock目录\n const mockPath = join(projectPath, '.mock');\n try {\n const mockFiles = await fs.readdir(mockPath);\n if (mockFiles.length === 0) {\n await fs.rmdir(mockPath);\n }\n } catch {\n // 忽略目录删除错误\n }\n\n return NextResponse.json({\n success: true,\n message: 'Mock接口删除成功',\n data: {\n projectName,\n apiName,\n deletedPath: join('.mock', apiName),\n },\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : '删除Mock接口失败';\n console.error('删除Mock接口失败:', error);\n return NextResponse.json(\n { success: false, error: errorMessage },\n { status: 500 },\n );\n }\n}\n","import {\n AppRouteRouteModule,\n type AppRouteRouteModuleOptions,\n} from '../../server/route-modules/app-route/module.compiled'\nimport { RouteKind } from '../../server/route-kind'\nimport { patchFetch as _patchFetch } from '../../server/lib/patch-fetch'\n\nimport * as userland from 'VAR_USERLAND'\n\n// These are injected by the loader afterwards. This is injected as a variable\n// instead of a replacement because this could also be `undefined` instead of\n// an empty string.\ndeclare const nextConfigOutput: AppRouteRouteModuleOptions['nextConfigOutput']\n\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\n// INJECT:nextConfigOutput\n\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: 'VAR_DEFINITION_PAGE',\n pathname: 'VAR_DEFINITION_PATHNAME',\n filename: 'VAR_DEFINITION_FILENAME',\n bundlePath: 'VAR_DEFINITION_BUNDLE_PATH',\n },\n resolvedPagePath: 'VAR_RESOLVED_PAGE_PATH',\n nextConfigOutput,\n userland,\n})\n\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule\n\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage,\n })\n}\n\nexport {\n routeModule,\n workAsyncStorage,\n workUnitAsyncStorage,\n serverHooks,\n patchFetch,\n}\n"],"names":["AppRouteRouteModule","RouteKind","patchFetch","_patchFetch","userland","routeModule","definition","kind","APP_ROUTE","page","pathname","filename","bundlePath","resolvedPagePath","nextConfigOutput","workAsyncStorage","workUnitAsyncStorage","serverHooks"],"mappings":"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","ignoreList":[3]}
@@ -0,0 +1,3 @@
1
+ module.exports={45935:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},30331:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("path",()=>require("path"))},29549:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},83943:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},86103:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},23430:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},52670:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/compiled/next-server/app-route-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-route-turbo.runtime.prod.js"))},13442:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("os",()=>require("os"))},88941:e=>{"use strict";var{g:r,__dirname:t}=e;{e.s({PROJECT_CONFIG_PATH:()=>t,ProjectStatus:()=>o,WORKSPACE_CONFIG:()=>r});var s=e.i(13442),n=e.i(30331);let r={WORKSPACE_ROOT:(0,n.join)((0,s.homedir)(),"Documents","prime-workspace"),GIT_TIMEOUT:3e5,MAX_CONCURRENT_CLONES:Math.max(2,Math.min((0,s.cpus)().length,8)),MAX_RETRY_ATTEMPTS:3},t=(0,n.join)((0,s.homedir)(),".prime-projects.json");var o=function(e){return e.PENDING="pending",e.EXISTING="existing",e.CLONING="cloning",e.SUCCESS="success",e.FAILED="failed",e.RETRYING="retrying",e.INCOMPLETE="incomplete",e}({})}},83886:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("fs",()=>require("fs"))},87485:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("child_process",()=>require("child_process"))},85750:e=>{"use strict";var{g:r,__dirname:t}=e;e.s({resolveSubPath:()=>n});var s=e.i(30331);function n(e,r){if(!r||!r.trim())return e;let t=r.trim();if((0,s.isAbsolute)(t))return null;let n=(0,s.normalize)(t);return".."===n||n.startsWith(`..${s.sep}`)||n.includes(`${s.sep}..${s.sep}`)?null:(0,s.join)(e,n)}},70809:e=>{"use strict";var{g:r,__dirname:t}=e;e.s({POST:()=>d,formatGitError:()=>p});var s=e.i(15494),n=e.i(87485),o=e.i(83886),i=e.i(30331),a=e.i(88941),c=e.i(85750);function u(e,r){return new Promise((t,s)=>{let o=(0,n.spawn)("git",r,{cwd:e,stdio:["ignore","pipe","pipe"]}),i="",a="";o.stdout?.on("data",e=>{i+=e.toString()}),o.stderr?.on("data",e=>{a+=e.toString()}),o.on("close",e=>{t({code:e,stdout:i,stderr:a})}),o.on("error",e=>{s(e)})})}function p(e){let r=e.toLowerCase();if(r.includes("would be overwritten by checkout")||r.includes("local changes would be overwritten"))return"工作区存在未提交的修改,切换分支会覆盖本地更改,请先提交或暂存(stash)";if(r.includes("please commit your changes or stash them"))return"工作区存在未提交的修改,请先提交或暂存(stash)后再切换";if(r.includes("did not match any file(s) known to git")||r.includes("pathspec")||r.includes("remote branch not found")||r.includes("不是一个提交"))return"分支不存在";if(r.includes("not a git repository"))return"不是有效的 Git 仓库";if(r.includes("you need to resolve your current index"))return"当前存在合并冲突,请先解决冲突";let t=e.replace(/^fatal:\s*/i,"").replace(/^致命错误:?\s*/,"").replace(/^error:\s*/i,"").replace(/\s+/g," ").trim();return t?t.slice(0,300):"未知错误"}async function d(e){try{let r=await e.json(),t="string"==typeof r.projectName?r.projectName.trim():"",n="string"==typeof r.branchName?r.branchName.trim():"",d="string"==typeof r.subPath?r.subPath.trim():"";if(!t)return s.NextResponse.json({success:!1,error:"缺少项目名称参数"},{status:400});if(!n)return s.NextResponse.json({success:!1,error:"缺少分支名称参数"},{status:400});if(/\s/.test(n)||n.startsWith("-"))return s.NextResponse.json({success:!1,error:"分支名称不合法"},{status:400});let l=a.WORKSPACE_CONFIG.WORKSPACE_ROOT,x=(0,i.join)(l,t);if(!(0,o.existsSync)(x))return s.NextResponse.json({success:!1,error:`项目目录不存在: ${x}`},{status:404});let m=(0,c.resolveSubPath)(x,d);if(!m)return s.NextResponse.json({success:!1,error:"无效的子路径"},{status:400});if(!(0,o.existsSync)(m)||!(0,o.existsSync)((0,i.join)(m,".git")))return s.NextResponse.json({success:!1,error:"子仓库目录不存在"},{status:400});if(d){let e=await u(x,["ls-files","-s",d]);if(!(0===e.code&&e.stdout.trim().startsWith("160000")))return s.NextResponse.json({success:!1,error:"当前分支不包含该子仓库"},{status:400})}let g=await u(m,["branch","--show-current"]),f=0===g.code?g.stdout.trim():"";if(f===n)return s.NextResponse.json({success:!0,data:{currentBranch:f,changed:!1},message:`当前已在分支 ${n}`});let h=await u(m,["branch","--list",n]),v=0===h.code&&""!==h.stdout.trim()?["checkout",n]:["checkout","-b",n,`origin/${n}`],j=await u(m,v);if(0!==j.code){let e=j.stderr.trim()||j.stdout.trim();return console.error(`切换分支失败 (${t}${d?"/"+d:""} -> ${n}):`,e),s.NextResponse.json({success:!1,error:`切换分支失败: ${p(e)}`})}return s.NextResponse.json({success:!0,data:{currentBranch:n,changed:!0},message:`已切换到分支 ${n}`})}catch(e){return console.error("切换分支失败:",e),s.NextResponse.json({success:!1,error:e instanceof Error?e.message:"切换分支失败"},{status:500})}}},59282:function(e){var{g:r,__dirname:t,m:s,e:n}=e},1005:e=>{"use strict";var{g:r,__dirname:t}=e;{e.s({patchFetch:()=>a,routeModule:()=>r,serverHooks:()=>u,workAsyncStorage:()=>t,workUnitAsyncStorage:()=>c});var s=e.i(45746),n=e.i(93828),o=e.i(18250),i=e.i(70809);let r=new s.AppRouteRouteModule({definition:{kind:n.RouteKind.APP_ROUTE,page:"/api/branch/switch/route",pathname:"/api/branch/switch",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/branch/switch/route.ts",nextConfigOutput:"",userland:i}),{workAsyncStorage:t,workUnitAsyncStorage:c,serverHooks:u}=r;function a(){return(0,o.patchFetch)({workAsyncStorage:t,workUnitAsyncStorage:c})}}}};
2
+
3
+ //# sourceMappingURL=%5Broot-of-the-server%5D__6bf6dd19._.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["turbopack:///[project]/packages/server/src/lib/workspace-types.ts","turbopack:///[project]/packages/server/src/lib/project-path.ts","turbopack:///[project]/packages/server/src/app/api/branch/switch/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 ApiProxyRewrite {\n mode: 'none' | 'remove' | 'replace';\n targetPrefix?: string;\n}\n\nexport interface ApiProxyItem {\n prefix: string;\n proxyKey?: string;\n currentProxy: string;\n proxyEnv: {\n [key: string]: string;\n };\n rewrite?: ApiProxyRewrite;\n}\n\nexport interface ProjectConfig {\n repo: string;\n mockingIntercept?: boolean;\n mockOpen?: boolean;\n envs: {\n [envName: string]: {\n host: string;\n envFileName: string;\n apiProxies: ApiProxyItem[];\n subApps?: string[];\n startCommand?: string;\n /**\n * 微应用路径标识:用于在共享宿主(micro-app 域名)下区分兄弟子应用。\n * 插件按 micro-app 元素的 default-page / url 是否“包含”该值来选中对应本地 host。\n * 例如 micro-components 为 \"/micro/components\"、360-icrc-site 为 \"/micro/360-icrc-site\"。\n */\n microPath?: 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 projectName?: 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}\n","import { join, normalize, isAbsolute, sep } from 'path';\n\n/**\n * 校验子路径安全性并拼接项目目录。\n * subPath 必须为相对路径且不能包含 .. 跳出项目目录,否则返回 null。\n * 不带 subPath 时返回项目目录本身。\n */\nexport function resolveSubPath(projectPath: string, subPath?: string | null): string | null {\n if (!subPath || !subPath.trim()) return projectPath;\n\n const trimmed = subPath.trim();\n if (isAbsolute(trimmed)) return null;\n\n const normalized = normalize(trimmed);\n if (normalized === '..' || normalized.startsWith(`..${sep}`) || normalized.includes(`${sep}..${sep}`)) {\n return null;\n }\n\n return join(projectPath, normalized);\n}\n","import { NextRequest, NextResponse } from 'next/server';\nimport { spawn } from 'child_process';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { WORKSPACE_CONFIG } from '@/lib/workspace-types';\nimport { resolveSubPath } from '@/lib/project-path';\n\ntype GitResult = {\n code: number | null;\n stdout: string;\n stderr: string;\n};\n\nfunction runGitCommand(cwd: string, args: string[]): Promise<GitResult> {\n return new Promise((resolve, reject) => {\n const child = spawn('git', args, {\n cwd,\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n let stdout = '';\n let stderr = '';\n\n child.stdout?.on('data', (data: Buffer) => {\n stdout += data.toString();\n });\n\n child.stderr?.on('data', (data: Buffer) => {\n stderr += data.toString();\n });\n\n child.on('close', (code) => {\n resolve({ code, stdout, stderr });\n });\n\n child.on('error', (error) => {\n reject(error);\n });\n });\n}\n\n/**\n * 将 git 错误输出转换为用户友好的中文提示\n */\nexport function formatGitError(stderr: string): string {\n const lower = stderr.toLowerCase();\n\n if (\n lower.includes('would be overwritten by checkout') ||\n lower.includes('local changes would be overwritten')\n ) {\n return '工作区存在未提交的修改,切换分支会覆盖本地更改,请先提交或暂存(stash)';\n }\n\n if (lower.includes('please commit your changes or stash them')) {\n return '工作区存在未提交的修改,请先提交或暂存(stash)后再切换';\n }\n\n if (\n lower.includes('did not match any file(s) known to git') ||\n lower.includes('pathspec') ||\n lower.includes('remote branch not found') ||\n lower.includes('不是一个提交')\n ) {\n return '分支不存在';\n }\n\n if (lower.includes('not a git repository')) {\n return '不是有效的 Git 仓库';\n }\n\n if (lower.includes('you need to resolve your current index')) {\n return '当前存在合并冲突,请先解决冲突';\n }\n\n // 清理 \"fatal: \" / \"致命错误:\" 前缀与换行,保留原始错误内容\n const cleaned = stderr\n .replace(/^fatal:\\s*/i, '')\n .replace(/^致命错误:?\\s*/, '')\n .replace(/^error:\\s*/i, '')\n .replace(/\\s+/g, ' ')\n .trim();\n return cleaned ? cleaned.slice(0, 300) : '未知错误';\n}\n\n/**\n * 切换项目(或子目录子仓库)分支的API\n * subPath 参数可选:如 submodules/common,用于切换子仓库的分支。\n * 失败时 git 的 HEAD 不会改变(checkout 为原子操作),\n * 因此无需回滚操作,前端保持原分支展示即可。\n */\nexport async function POST(request: NextRequest) {\n try {\n const body = await request.json();\n const projectName = typeof body.projectName === 'string' ? body.projectName.trim() : '';\n const branchName = typeof body.branchName === 'string' ? body.branchName.trim() : '';\n const subPath = typeof body.subPath === 'string' ? body.subPath.trim() : '';\n\n if (!projectName) {\n return NextResponse.json({\n success: false,\n error: '缺少项目名称参数'\n }, { status: 400 });\n }\n\n if (!branchName) {\n return NextResponse.json({\n success: false,\n error: '缺少分支名称参数'\n }, { status: 400 });\n }\n\n if (/\\s/.test(branchName) || branchName.startsWith('-')) {\n return NextResponse.json({\n success: false,\n error: '分支名称不合法'\n }, { status: 400 });\n }\n\n // 使用工作空间配置路径\n const workspacePath = WORKSPACE_CONFIG.WORKSPACE_ROOT;\n const projectPath = join(workspacePath, projectName);\n\n // 检查项目目录是否存在\n if (!existsSync(projectPath)) {\n return NextResponse.json({\n success: false,\n error: `项目目录不存在: ${projectPath}`\n }, { status: 404 });\n }\n\n // 解析子目录路径(子仓库),非法时返回错误\n const targetPath = resolveSubPath(projectPath, subPath);\n if (!targetPath) {\n return NextResponse.json({\n success: false,\n error: '无效的子路径'\n }, { status: 400 });\n }\n\n // 检查是否为git仓库(子仓库目录不存在时无法切换)\n if (!existsSync(targetPath) || !existsSync(join(targetPath, '.git'))) {\n return NextResponse.json({\n success: false,\n error: '子仓库目录不存在'\n }, { status: 400 });\n }\n\n // 子仓库场景下检查主仓库当前分支是否跟踪该路径(gitlink mode 160000)。\n // 切换分支后残留的目录不属于当前分支的子仓库,不允许切换。\n if (subPath) {\n const trackResult = await runGitCommand(projectPath, ['ls-files', '-s', subPath]);\n const isTracked = trackResult.code === 0 && trackResult.stdout.trim().startsWith('160000');\n if (!isTracked) {\n return NextResponse.json({\n success: false,\n error: '当前分支不包含该子仓库'\n }, { status: 400 });\n }\n }\n\n // 获取当前分支,若目标分支就是当前分支则直接成功\n const currentResult = await runGitCommand(targetPath, ['branch', '--show-current']);\n const currentBranch = currentResult.code === 0 ? currentResult.stdout.trim() : '';\n\n if (currentBranch === branchName) {\n return NextResponse.json({\n success: true,\n data: { currentBranch, changed: false },\n message: `当前已在分支 ${branchName}`,\n });\n }\n\n // 检查本地是否已存在该分支\n const localCheckResult = await runGitCommand(targetPath, ['branch', '--list', branchName]);\n const isLocalBranch = localCheckResult.code === 0 && localCheckResult.stdout.trim() !== '';\n\n // 本地存在直接 checkout,不存在则基于 origin/<branch> 创建跟踪分支\n const args = isLocalBranch\n ? ['checkout', branchName]\n : ['checkout', '-b', branchName, `origin/${branchName}`];\n\n const switchResult = await runGitCommand(targetPath, args);\n\n if (switchResult.code !== 0) {\n const rawError = switchResult.stderr.trim() || switchResult.stdout.trim();\n console.error(`切换分支失败 (${projectName}${subPath ? '/' + subPath : ''} -> ${branchName}):`, rawError);\n // 切换失败:HEAD 未改变,操作无效,仅返回错误原因\n return NextResponse.json({\n success: false,\n error: `切换分支失败: ${formatGitError(rawError)}`,\n });\n }\n\n return NextResponse.json({\n success: true,\n data: { currentBranch: branchName, changed: true },\n message: `已切换到分支 ${branchName}`,\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","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: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"))},30331:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("path",()=>require("path"))},29549:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},83943:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},86103:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},23430:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},52670:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/compiled/next-server/app-route-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-route-turbo.runtime.prod.js"))},13442:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("os",()=>require("os"))},88941:e=>{"use strict";var{g:r,__dirname:t}=e;{e.s({PROJECT_CONFIG_PATH:()=>t,ProjectStatus:()=>o,WORKSPACE_CONFIG:()=>r});var s=e.i(13442),n=e.i(30331);let r={WORKSPACE_ROOT:(0,n.join)((0,s.homedir)(),"Documents","prime-workspace"),GIT_TIMEOUT:3e5,MAX_CONCURRENT_CLONES:Math.max(2,Math.min((0,s.cpus)().length,8)),MAX_RETRY_ATTEMPTS:3},t=(0,n.join)((0,s.homedir)(),".prime-projects.json");var o=function(e){return e.PENDING="pending",e.EXISTING="existing",e.CLONING="cloning",e.SUCCESS="success",e.FAILED="failed",e.RETRYING="retrying",e.INCOMPLETE="incomplete",e}({})}},83886:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("fs",()=>require("fs"))},87485:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("child_process",()=>require("child_process"))},69383:function(e){var{g:r,__dirname:t,m:s,e:n}=e},77814:e=>{"use strict";var{g:r,__dirname:t}=e;{e.s({POST:()=>u});var s=e.i(15494),n=e.i(87485),o=e.i(83886),i=e.i(30331),a=e.i(88941);let r="submodules/common";function c(e,r){return new Promise((t,s)=>{let o=(0,n.spawn)("git",r,{cwd:e,stdio:["ignore","pipe","pipe"]}),i="",a="";o.stdout?.on("data",e=>{i+=e.toString()}),o.stderr?.on("data",e=>{a+=e.toString()}),o.on("close",e=>{t({code:e,stdout:i,stderr:a})}),o.on("error",e=>{s(e)})})}async function u(e){try{let t=await e.json(),n=(Array.isArray(t.projects)?t.projects:[]).map(e=>String(e).trim()).filter(Boolean);if(0===n.length)return s.NextResponse.json({success:!1,error:"缺少项目列表参数"},{status:400});let u=a.WORKSPACE_CONFIG.WORKSPACE_ROOT,p=await Promise.all(n.map(async e=>{let t=(0,i.join)(u,e);if(!(0,o.existsSync)(t)||!(0,o.existsSync)((0,i.join)(t,".git")))return{projectName:e,branches:[],error:"项目不存在或不是Git仓库"};let s=(0,i.join)(t,r);if(!(0,o.existsSync)(s)||!(0,o.existsSync)((0,i.join)(s,".git")))return{projectName:e,branches:[],error:null};let n=await c(t,["ls-files","-s",r]);if(0!==n.code||!n.stdout.trim().startsWith("160000"))return{projectName:e,branches:[],error:null};try{let r=await c(s,["ls-remote","--heads","origin"]);if(0!==r.code){let t=r.stderr.trim()||r.stdout.trim();return{projectName:e,branches:[],error:t.slice(0,150)||"获取子仓库远程分支失败"}}let t=[];return r.stdout.split("\n").forEach(e=>{let r=e.trim().match(/^[0-9a-f]+\trefs\/heads\/(.+)$/);if(r){let e=r[1].trim();e&&t.push(e)}}),{projectName:e,branches:t,error:null}}catch(r){return{projectName:e,branches:[],error:r instanceof Error?r.message:"执行失败"}}})),l=new Set,d=[];return p.forEach(e=>{e.error&&d.push({projectName:e.projectName,reason:e.error}),e.branches.forEach(e=>l.add(e))}),s.NextResponse.json({success:!0,branches:Array.from(l).sort((e,r)=>e.localeCompare(r)),failedProjects:d})}catch(e){return console.error("批量获取子仓库远程分支失败:",e),s.NextResponse.json({success:!1,error:e instanceof Error?e.message:"批量获取子仓库远程分支失败"},{status:500})}}}},90472:e=>{"use strict";var{g:r,__dirname:t}=e;{e.s({patchFetch:()=>a,routeModule:()=>r,serverHooks:()=>u,workAsyncStorage:()=>t,workUnitAsyncStorage:()=>c});var s=e.i(45746),n=e.i(93828),o=e.i(18250),i=e.i(77814);let r=new s.AppRouteRouteModule({definition:{kind:n.RouteKind.APP_ROUTE,page:"/api/batch-list-submodule-branches/route",pathname:"/api/batch-list-submodule-branches",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/batch-list-submodule-branches/route.ts",nextConfigOutput:"",userland:i}),{workAsyncStorage:t,workUnitAsyncStorage:c,serverHooks:u}=r;function a(){return(0,o.patchFetch)({workAsyncStorage:t,workUnitAsyncStorage:c})}}}};
2
+
3
+ //# sourceMappingURL=%5Broot-of-the-server%5D__6c7b8215._.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["turbopack:///[project]/packages/server/src/lib/workspace-types.ts","turbopack:///[project]/packages/server/src/app/api/batch-list-submodule-branches/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 ApiProxyRewrite {\n mode: 'none' | 'remove' | 'replace';\n targetPrefix?: string;\n}\n\nexport interface ApiProxyItem {\n prefix: string;\n proxyKey?: string;\n currentProxy: string;\n proxyEnv: {\n [key: string]: string;\n };\n rewrite?: ApiProxyRewrite;\n}\n\nexport interface ProjectConfig {\n repo: string;\n mockingIntercept?: boolean;\n mockOpen?: boolean;\n envs: {\n [envName: string]: {\n host: string;\n envFileName: string;\n apiProxies: ApiProxyItem[];\n subApps?: string[];\n startCommand?: string;\n /**\n * 微应用路径标识:用于在共享宿主(micro-app 域名)下区分兄弟子应用。\n * 插件按 micro-app 元素的 default-page / url 是否“包含”该值来选中对应本地 host。\n * 例如 micro-components 为 \"/micro/components\"、360-icrc-site 为 \"/micro/360-icrc-site\"。\n */\n microPath?: 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 projectName?: 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}\n","import { NextRequest, NextResponse } from 'next/server';\nimport { spawn } from 'child_process';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { WORKSPACE_CONFIG } from '@/lib/workspace-types';\n\n// 子仓库固定路径:项目根目录下的 submodules/common\nconst SUB_PATH = 'submodules/common';\n\ntype GitResult = {\n code: number | null;\n stdout: string;\n stderr: string;\n};\n\nfunction runGitCommand(cwd: string, args: string[]): Promise<GitResult> {\n return new Promise((resolve, reject) => {\n const child = spawn('git', args, {\n cwd,\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n let stdout = '';\n let stderr = '';\n\n child.stdout?.on('data', (data: Buffer) => {\n stdout += data.toString();\n });\n\n child.stderr?.on('data', (data: Buffer) => {\n stderr += data.toString();\n });\n\n child.on('close', (code) => {\n resolve({ code, stdout, stderr });\n });\n\n child.on('error', (error) => {\n reject(error);\n });\n });\n}\n\n/**\n * 批量获取多个项目 submodules/common 子仓库的远程分支聚合去重列表。\n * 仅统计当前分支跟踪该子仓库(gitlink mode 160000)的项目;\n * 未跟踪的项目直接跳过(不属于失败)。\n * 每次调用都会重新执行 git ls-remote,保证分支列表最新。\n */\nexport async function POST(request: NextRequest) {\n try {\n const body = await request.json();\n const rawProjects: unknown = Array.isArray(body.projects) ? body.projects : [];\n const projects = (rawProjects as unknown[])\n .map((item) => String(item).trim())\n .filter(Boolean);\n\n if (projects.length === 0) {\n return NextResponse.json({\n success: false,\n error: '缺少项目列表参数'\n }, { status: 400 });\n }\n\n const workspacePath = WORKSPACE_CONFIG.WORKSPACE_ROOT;\n\n // 并发获取所有项目的子仓库远程分支\n const results = await Promise.all(\n projects.map(async (projectName: string) => {\n const projectPath = join(workspacePath, projectName);\n\n if (!existsSync(projectPath) || !existsSync(join(projectPath, '.git'))) {\n return { projectName, branches: [] as string[], error: '项目不存在或不是Git仓库' };\n }\n\n // 子仓库目录不存在或不是 git 仓库:跳过(不展示)\n const subPath = join(projectPath, SUB_PATH);\n if (!existsSync(subPath) || !existsSync(join(subPath, '.git'))) {\n return { projectName, branches: [] as string[], error: null };\n }\n\n // 检查主仓库当前分支是否跟踪该路径(gitlink mode 160000),未跟踪则跳过\n const trackResult = await runGitCommand(projectPath, ['ls-files', '-s', SUB_PATH]);\n if (trackResult.code !== 0 || !trackResult.stdout.trim().startsWith('160000')) {\n return { projectName, branches: [] as string[], error: null };\n }\n\n try {\n const result = await runGitCommand(subPath, ['ls-remote', '--heads', 'origin']);\n if (result.code !== 0) {\n const rawError = result.stderr.trim() || result.stdout.trim();\n return { projectName, branches: [] as string[], error: rawError.slice(0, 150) || '获取子仓库远程分支失败' };\n }\n\n const branches: string[] = [];\n result.stdout.split('\\n').forEach((line) => {\n const match = line.trim().match(/^[0-9a-f]+\\trefs\\/heads\\/(.+)$/);\n if (match) {\n const branchName = match[1].trim();\n if (branchName) branches.push(branchName);\n }\n });\n return { projectName, branches, error: null };\n } catch (err) {\n return { projectName, branches: [] as string[], error: err instanceof Error ? err.message : '执行失败' };\n }\n }),\n );\n\n // 聚合去重(未跟踪/无子仓库的项目 branches 为空,自然不贡献分支)\n const branchSet = new Set<string>();\n const failedProjects: Array<{ projectName: string; reason: string }> = [];\n results.forEach((result) => {\n if (result.error) {\n failedProjects.push({ projectName: result.projectName, reason: result.error });\n }\n result.branches.forEach((branch: string) => branchSet.add(branch));\n });\n\n return NextResponse.json({\n success: true,\n branches: Array.from(branchSet).sort((a, b) => a.localeCompare(b)),\n failedProjects,\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","import {\n AppRouteRouteModule,\n type AppRouteRouteModuleOptions,\n} from '../../server/route-modules/app-route/module.compiled'\nimport { RouteKind } from '../../server/route-kind'\nimport { patchFetch as _patchFetch } from '../../server/lib/patch-fetch'\n\nimport * as userland from 'VAR_USERLAND'\n\n// These are injected by the loader afterwards. This is injected as a variable\n// instead of a replacement because this could also be `undefined` instead of\n// an empty string.\ndeclare const nextConfigOutput: AppRouteRouteModuleOptions['nextConfigOutput']\n\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\n// INJECT:nextConfigOutput\n\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: 'VAR_DEFINITION_PAGE',\n pathname: 'VAR_DEFINITION_PATHNAME',\n filename: 'VAR_DEFINITION_FILENAME',\n bundlePath: 'VAR_DEFINITION_BUNDLE_PATH',\n },\n resolvedPagePath: 'VAR_RESOLVED_PAGE_PATH',\n nextConfigOutput,\n userland,\n})\n\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule\n\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage,\n })\n}\n\nexport {\n routeModule,\n workAsyncStorage,\n workUnitAsyncStorage,\n serverHooks,\n patchFetch,\n}\n"],"names":["AppRouteRouteModule","RouteKind","patchFetch","_patchFetch","userland","routeModule","definition","kind","APP_ROUTE","page","pathname","filename","bundlePath","resolvedPagePath","nextConfigOutput","workAsyncStorage","workUnitAsyncStorage","serverHooks"],"mappings":"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","ignoreList":[2]}
@@ -1,4 +1,4 @@
1
- module.exports={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}({})}},30331:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("path",()=>require("path"))},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"))},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"))},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"))},13442:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("os",()=>require("os"))},9892:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("fs/promises",()=>require("fs/promises"))},35692:e=>{"use strict";var{g:t,__dirname:r}=e;e.s({ProjectStatus:()=>a,getProjectsConfig:()=>i,saveProjectsConfig:()=>o});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 o({}),{}}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 o(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 a=function(e){return e.PENDING="pending",e.EXISTING="existing",e.CLONING="cloning",e.SUCCESS="success",e.FAILED="failed",e.RETRYING="retrying",e}({})},83886:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("fs",()=>require("fs"))},87485:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("child_process",()=>require("child_process"))},77159:e=>{"use strict";var{g:t,__dirname:r}=e;e.s({checkMultipleProjectsExist:()=>f,checkProjectExists:()=>d,checkProjectStatus:()=>p,cleanupIncompleteProject:()=>m,cloneRepository:()=>c,createWorkspaceDirectory:()=>a,isValidGitUrl:()=>u,sanitizeProjectName:()=>l});var s=e.i(87485),n=e.i(83886),i=e.i(30331),o=e.i(88941);async function a(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 c(e){let{repoUrl:t,projectName:r,targetDir:n,timeout:a,onProgress:c,onError:u,onLog:l}=e,p=r?.trim()||(0,i.basename)(t,".git");return new Promise(e=>{let r=Date.now(),d={projectName:p,status:o.ProjectStatus.CLONING,progress:0,message:"开始克隆项目...",startTime:r};c?.(0,"开始克隆项目...");let g=(0,i.join)(n,p),m=["clone","--progress","--verbose",t,g];l?.(p,"stdout",`[开始克隆] 执行命令: git ${m.join(" ")}
1
+ module.exports={30331:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("path",()=>require("path"))},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"))},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"))},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"))},13442:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("os",()=>require("os"))},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}({})}},83886:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("fs",()=>require("fs"))},9892:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("fs/promises",()=>require("fs/promises"))},35692:e=>{"use strict";var{g:t,__dirname:r}=e;e.s({ProjectStatus:()=>a,getProjectsConfig:()=>i,saveProjectsConfig:()=>o});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 o({}),{}}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 o(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 a=function(e){return e.PENDING="pending",e.EXISTING="existing",e.CLONING="cloning",e.SUCCESS="success",e.FAILED="failed",e.RETRYING="retrying",e}({})},87485:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("child_process",()=>require("child_process"))},77159:e=>{"use strict";var{g:t,__dirname:r}=e;e.s({checkMultipleProjectsExist:()=>f,checkProjectExists:()=>d,checkProjectStatus:()=>p,cleanupIncompleteProject:()=>m,cloneRepository:()=>c,createWorkspaceDirectory:()=>a,isValidGitUrl:()=>u,sanitizeProjectName:()=>l});var s=e.i(87485),n=e.i(83886),i=e.i(30331),o=e.i(88941);async function a(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 c(e){let{repoUrl:t,projectName:r,targetDir:n,timeout:a,onProgress:c,onError:u,onLog:l}=e,p=r?.trim()||(0,i.basename)(t,".git");return new Promise(e=>{let r=Date.now(),d={projectName:p,status:o.ProjectStatus.CLONING,progress:0,message:"开始克隆项目...",startTime:r};c?.(0,"开始克隆项目...");let g=(0,i.join)(n,p),m=["clone","--progress","--verbose",t,g];l?.(p,"stdout",`[开始克隆] 执行命令: git ${m.join(" ")}
2
2
  `),l?.(p,"stdout",`[目标目录] ${g}
3
3
  `),l?.(p,"stdout",`[仓库地址] ${t}
4
4
  `);let f=(0,s.spawn)("git",m,{cwd:n,stdio:["pipe","pipe","pipe"]}),x="",j=0;l?.(p,"stdout",`[进程启动] Git 进程 PID: ${f.pid}
@@ -13,4 +13,4 @@ ${x}
13
13
  `),l?.(p,"stderr",`[错误详情] ${t.stack||"No stack trace"}
14
14
  `);let r={...d,status:o.ProjectStatus.FAILED,progress:j,message:"进程启动失败",error:`进程启动失败: ${t.message}`,endTime:Date.now()};u?.(`${p}: ${t.message}`),e(r)})})}function u(e){return/^(https?:\/\/|git@)[^\s]+\.git$/i.test(e)}function l(e){return e.replace(/[^a-zA-Z0-9\-_]/g,"")}async function p(e,t){try{let r=(0,i.join)(e,t);if(!(0,n.existsSync)(r))return{exists:!1,status:"not_exists",needsCleanup:!1};let s=(0,i.join)(r,".git");if(!(0,n.existsSync)(s))return{exists:!0,status:"incomplete",needsCleanup:!0};if(!await g(r))return console.log(`检测到不完整的Git仓库: ${r}`),{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 p(e,t)).status}async function g(e){try{let t=(0,i.join)(e,".git");for(let e of["HEAD","config","refs"]){let r=(0,i.join)(t,e);if(!(0,n.existsSync)(r))return!1}let r=(await n.promises.readdir(e)).filter(e=>".git"!==e);if(0===r.length)return!1;let s=(0,i.join)(t,"HEAD"),o=await n.promises.readFile(s,"utf-8");if(!o.trim()||o.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 r={},s=t.map(async t=>{let s=await d(e,t);r[t]=s});return await Promise.all(s),r}},16822:function(e){var{g:t,__dirname:r,m:s,e:n}=e},89950:e=>{"use strict";var{g:t,__dirname:r}=e;e.s({POST:()=>o});var s=e.i(88941),n=e.i(35692),i=e.i(77159);async function o(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"}});let r=await (0,n.getProjectsConfig)();if(!(t in r))return new Response(JSON.stringify({success:!1,error:`项目 ${t} 不存在于配置中`}),{status:404,headers:{"Content-Type":"application/json"}});let o=r[t],a=s.WORKSPACE_CONFIG.WORKSPACE_ROOT,c=await (0,i.cloneRepository)({repoUrl:o.repo,projectName:t,targetDir:a,timeout:s.WORKSPACE_CONFIG.GIT_TIMEOUT}),u={success:c.status===s.ProjectStatus.SUCCESS,projectName:t,status:c.status,message:c.message,error:c.error,progress:c.progress,duration:c.endTime&&c.startTime?c.endTime-c.startTime:0};return new Response(JSON.stringify(u),{status:200,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"}})}}},23856:e=>{"use strict";var{g:t,__dirname:r}=e;{e.s({patchFetch:()=>a,routeModule:()=>t,serverHooks:()=>u,workAsyncStorage:()=>r,workUnitAsyncStorage:()=>c});var s=e.i(45746),n=e.i(93828),i=e.i(18250),o=e.i(89950);let t=new s.AppRouteRouteModule({definition:{kind:n.RouteKind.APP_ROUTE,page:"/api/retry-project/route",pathname:"/api/retry-project",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/retry-project/route.ts",nextConfigOutput:"",userland:o}),{workAsyncStorage:r,workUnitAsyncStorage:c,serverHooks:u}=t;function a(){return(0,i.patchFetch)({workAsyncStorage:r,workUnitAsyncStorage:c})}}}};
15
15
 
16
- //# sourceMappingURL=%5Broot-of-the-server%5D__4fd52ac1._.js.map
16
+ //# sourceMappingURL=%5Broot-of-the-server%5D__72882dad._.js.map