@yinuo-ngm/server 1.0.15 → 1.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (326) hide show
  1. package/lib/plugins/error-handler.plugin.js +5 -0
  2. package/lib/routes/api-client/hub-token.routes.js +22 -0
  3. package/lib/routes/index.js +2 -0
  4. package/lib/routes/node-version.routes.d.ts +2 -0
  5. package/lib/routes/node-version.routes.js +56 -0
  6. package/lib/routes/project.routes.js +5 -0
  7. package/lib/routes/sprite-browse.routes.js +19 -5
  8. package/lib/routes/sprite.routes.js +17 -11
  9. package/lib/routes/static-files.routes.js +16 -0
  10. package/lib/routes/task.routes.js +7 -0
  11. package/package.json +3 -3
  12. package/www/3rdpartylicenses.txt +14 -66
  13. package/www/browser/chunk-2BZRE4G7.js +1 -0
  14. package/www/browser/chunk-2X3MRS27.js +1 -0
  15. package/www/browser/chunk-4KETC6EB.js +1 -0
  16. package/www/browser/chunk-5T5KA5PG.js +1 -0
  17. package/www/browser/chunk-6CGHNKJI.js +1 -0
  18. package/www/browser/chunk-76TVIB33.js +63 -0
  19. package/www/browser/chunk-7J24TP36.js +1 -0
  20. package/www/browser/chunk-ACAZUX6C.js +1 -0
  21. package/www/browser/chunk-B6MBYCXI.js +1 -0
  22. package/www/browser/chunk-BYEU6KGP.js +2 -0
  23. package/www/browser/chunk-CZ5AZ3VW.js +1 -0
  24. package/www/browser/chunk-DW7F5PEA.js +1 -0
  25. package/www/browser/chunk-DXF7BVK5.js +1 -0
  26. package/www/browser/chunk-EEVPZGEY.js +1 -0
  27. package/www/browser/chunk-G2W3B7TJ.js +1 -0
  28. package/www/browser/chunk-GDWS2L66.js +1 -0
  29. package/www/browser/chunk-HFZLJHYR.js +1 -0
  30. package/www/browser/chunk-HGONFYP6.js +1 -0
  31. package/www/browser/chunk-HHBPULJW.js +2 -0
  32. package/www/browser/chunk-HRXCR3IN.js +1 -0
  33. package/www/browser/chunk-INL2PELS.js +1 -0
  34. package/www/browser/chunk-JHMEKUZ5.js +1 -0
  35. package/www/browser/chunk-JU3TEDBV.js +37 -0
  36. package/www/browser/chunk-JZULA5JV.js +1 -0
  37. package/www/browser/chunk-KVFR7GFV.js +20 -0
  38. package/www/browser/chunk-L5D75AMV.js +1 -0
  39. package/www/browser/chunk-L7TMCSHV.js +1 -0
  40. package/www/browser/chunk-LQ5OXSW7.js +3 -0
  41. package/www/browser/chunk-MVQTKINJ.js +1 -0
  42. package/www/browser/chunk-N4LRZJBP.js +1 -0
  43. package/www/browser/chunk-O2EYEF7J.js +1 -0
  44. package/www/browser/chunk-OMDHJIUB.js +1 -0
  45. package/www/browser/chunk-OWUAAOHW.js +2 -0
  46. package/www/browser/chunk-PIK5YPIB.js +1 -0
  47. package/www/browser/chunk-RHLQRQDK.js +9 -0
  48. package/www/browser/chunk-RW2JPJV7.js +1 -0
  49. package/www/browser/chunk-S3SJ4VVM.js +11 -0
  50. package/www/browser/chunk-SIVPP74B.js +0 -0
  51. package/www/browser/chunk-SPRWNZHF.js +15 -0
  52. package/www/browser/chunk-SQQNR223.js +1 -0
  53. package/www/browser/chunk-SVQWPHF5.js +1 -0
  54. package/www/browser/chunk-SYCNSLAW.js +4 -0
  55. package/www/browser/chunk-T3KK7ZXB.js +2 -0
  56. package/www/browser/chunk-TMX5TTV3.js +1 -0
  57. package/www/browser/chunk-UFY3FLDK.js +1 -0
  58. package/www/browser/chunk-UJOHBN2Y.js +1 -0
  59. package/www/browser/chunk-UQGCUFNM.js +1 -0
  60. package/www/browser/chunk-UXXWRMM6.js +1 -0
  61. package/www/browser/chunk-UZRJGJTD.js +2 -0
  62. package/www/browser/chunk-WD4IAQR3.js +1 -0
  63. package/www/browser/chunk-WF2QTF5L.js +1 -0
  64. package/www/browser/chunk-WI67LAOV.js +4 -0
  65. package/www/browser/chunk-WNCM6QKB.js +1 -0
  66. package/www/browser/chunk-XJ5KZQNN.js +1 -0
  67. package/www/browser/chunk-YETDFSQE.js +1 -0
  68. package/www/browser/chunk-YMTC5GZK.js +1 -0
  69. package/www/browser/chunk-YVZHJ76K.js +1 -0
  70. package/www/browser/chunk-ZNTJRLVH.js +1 -0
  71. package/www/browser/dark.css +1 -30433
  72. package/www/browser/default.css +1 -30149
  73. package/www/browser/index.html +3 -3
  74. package/www/browser/main-6LN5C22E.js +34 -0
  75. package/www/browser/scripts-U25HCVEI.js +6 -0
  76. package/www/browser/styles-ROAHD7MY.css +1 -0
  77. package/www/browser/add-widget-drawer.component.css.map +0 -7
  78. package/www/browser/advanced-editor.component.css.map +0 -7
  79. package/www/browser/api-client.component.css.map +0 -7
  80. package/www/browser/api-history-drawer.component.css.map +0 -7
  81. package/www/browser/app.css.map +0 -7
  82. package/www/browser/attachment-viewer.component.css.map +0 -7
  83. package/www/browser/auth-editor.component.css.map +0 -7
  84. package/www/browser/body-editor.component.css.map +0 -7
  85. package/www/browser/chunk-2YSUXBGC.js +0 -627
  86. package/www/browser/chunk-2YSUXBGC.js.map +0 -1
  87. package/www/browser/chunk-3G2GEOPV.js +0 -456
  88. package/www/browser/chunk-3G2GEOPV.js.map +0 -1
  89. package/www/browser/chunk-3L72DF3R.js +0 -1683
  90. package/www/browser/chunk-3L72DF3R.js.map +0 -1
  91. package/www/browser/chunk-3MCIETCQ.js +0 -8279
  92. package/www/browser/chunk-3MCIETCQ.js.map +0 -1
  93. package/www/browser/chunk-665WC4RU.js +0 -5383
  94. package/www/browser/chunk-665WC4RU.js.map +0 -1
  95. package/www/browser/chunk-6QMSEZPT.js +0 -10044
  96. package/www/browser/chunk-6QMSEZPT.js.map +0 -1
  97. package/www/browser/chunk-6TBQERYX.js +0 -280
  98. package/www/browser/chunk-6TBQERYX.js.map +0 -1
  99. package/www/browser/chunk-6UW4MRJZ.js +0 -43
  100. package/www/browser/chunk-6UW4MRJZ.js.map +0 -7
  101. package/www/browser/chunk-6XUMIL3W.js +0 -5495
  102. package/www/browser/chunk-6XUMIL3W.js.map +0 -1
  103. package/www/browser/chunk-724YOJI3.js +0 -903
  104. package/www/browser/chunk-724YOJI3.js.map +0 -1
  105. package/www/browser/chunk-766T7YES.js +0 -437
  106. package/www/browser/chunk-766T7YES.js.map +0 -1
  107. package/www/browser/chunk-7FC7DN65.js +0 -728
  108. package/www/browser/chunk-7FC7DN65.js.map +0 -1
  109. package/www/browser/chunk-APGQRYWX.js +0 -156
  110. package/www/browser/chunk-APGQRYWX.js.map +0 -7
  111. package/www/browser/chunk-AQHSGTHS.js +0 -1960
  112. package/www/browser/chunk-AQHSGTHS.js.map +0 -1
  113. package/www/browser/chunk-CTOEAJQK.js +0 -40
  114. package/www/browser/chunk-CTOEAJQK.js.map +0 -7
  115. package/www/browser/chunk-DEGQJKKZ.js +0 -409
  116. package/www/browser/chunk-DEGQJKKZ.js.map +0 -1
  117. package/www/browser/chunk-DIJX2663.js +0 -1166
  118. package/www/browser/chunk-DIJX2663.js.map +0 -1
  119. package/www/browser/chunk-E4XD4GLT.js +0 -427
  120. package/www/browser/chunk-E4XD4GLT.js.map +0 -1
  121. package/www/browser/chunk-EQOY6A3M.js +0 -212
  122. package/www/browser/chunk-EQOY6A3M.js.map +0 -1
  123. package/www/browser/chunk-ETTBRXVA.js +0 -2643
  124. package/www/browser/chunk-ETTBRXVA.js.map +0 -1
  125. package/www/browser/chunk-FLSUSPBD.js +0 -5569
  126. package/www/browser/chunk-FLSUSPBD.js.map +0 -1
  127. package/www/browser/chunk-FZNHBEAZ.js +0 -102
  128. package/www/browser/chunk-FZNHBEAZ.js.map +0 -1
  129. package/www/browser/chunk-GJC7CZIJ.js +0 -361
  130. package/www/browser/chunk-GJC7CZIJ.js.map +0 -7
  131. package/www/browser/chunk-GMCNMOTD.js +0 -844
  132. package/www/browser/chunk-GMCNMOTD.js.map +0 -7
  133. package/www/browser/chunk-H43HGCRW.js +0 -198
  134. package/www/browser/chunk-H43HGCRW.js.map +0 -7
  135. package/www/browser/chunk-J447GBHM.js +0 -160
  136. package/www/browser/chunk-J447GBHM.js.map +0 -1
  137. package/www/browser/chunk-JN3VOWP7.js +0 -384
  138. package/www/browser/chunk-JN3VOWP7.js.map +0 -1
  139. package/www/browser/chunk-KSHAGY2M.js +0 -399
  140. package/www/browser/chunk-KSHAGY2M.js.map +0 -7
  141. package/www/browser/chunk-KV72AKOD.js +0 -59
  142. package/www/browser/chunk-KV72AKOD.js.map +0 -7
  143. package/www/browser/chunk-LAVMY2SJ.js +0 -26
  144. package/www/browser/chunk-LAVMY2SJ.js.map +0 -7
  145. package/www/browser/chunk-LLRVGHG5.js +0 -73
  146. package/www/browser/chunk-LLRVGHG5.js.map +0 -7
  147. package/www/browser/chunk-LPME4AJ3.js +0 -196
  148. package/www/browser/chunk-LPME4AJ3.js.map +0 -1
  149. package/www/browser/chunk-LVPSURVU.js +0 -4615
  150. package/www/browser/chunk-LVPSURVU.js.map +0 -1
  151. package/www/browser/chunk-MMPO7QLO.js +0 -4146
  152. package/www/browser/chunk-MMPO7QLO.js.map +0 -7
  153. package/www/browser/chunk-O7LB6VFM.js +0 -1953
  154. package/www/browser/chunk-O7LB6VFM.js.map +0 -1
  155. package/www/browser/chunk-P5CWA4FO.js +0 -685
  156. package/www/browser/chunk-P5CWA4FO.js.map +0 -1
  157. package/www/browser/chunk-RBWIWNTL.js +0 -203
  158. package/www/browser/chunk-RBWIWNTL.js.map +0 -7
  159. package/www/browser/chunk-RUXJCM3V.js +0 -26199
  160. package/www/browser/chunk-RUXJCM3V.js.map +0 -1
  161. package/www/browser/chunk-S77VVYUZ.js +0 -168
  162. package/www/browser/chunk-S77VVYUZ.js.map +0 -1
  163. package/www/browser/chunk-SCXPYFOB.js +0 -4316
  164. package/www/browser/chunk-SCXPYFOB.js.map +0 -1
  165. package/www/browser/chunk-SS73S33S.js +0 -471
  166. package/www/browser/chunk-SS73S33S.js.map +0 -7
  167. package/www/browser/chunk-T6UAOWNP.js +0 -600
  168. package/www/browser/chunk-T6UAOWNP.js.map +0 -1
  169. package/www/browser/chunk-TEW4MY4J.js +0 -148
  170. package/www/browser/chunk-TEW4MY4J.js.map +0 -7
  171. package/www/browser/chunk-TVORF3SF.js +0 -82
  172. package/www/browser/chunk-TVORF3SF.js.map +0 -7
  173. package/www/browser/chunk-UAN42EUZ.js +0 -2147
  174. package/www/browser/chunk-UAN42EUZ.js.map +0 -1
  175. package/www/browser/chunk-ULOHDK7Y.js +0 -1
  176. package/www/browser/chunk-ULOHDK7Y.js.map +0 -7
  177. package/www/browser/chunk-UYJ3FVRV.js +0 -3978
  178. package/www/browser/chunk-UYJ3FVRV.js.map +0 -1
  179. package/www/browser/chunk-VXHZMSDM.js +0 -5509
  180. package/www/browser/chunk-VXHZMSDM.js.map +0 -1
  181. package/www/browser/chunk-VYNQPZQO.js +0 -281
  182. package/www/browser/chunk-VYNQPZQO.js.map +0 -1
  183. package/www/browser/chunk-W3J23PZI.js +0 -9213
  184. package/www/browser/chunk-W3J23PZI.js.map +0 -1
  185. package/www/browser/chunk-W5HGHCQT.js +0 -1642
  186. package/www/browser/chunk-W5HGHCQT.js.map +0 -7
  187. package/www/browser/chunk-XF5H7E4L.js +0 -4723
  188. package/www/browser/chunk-XF5H7E4L.js.map +0 -1
  189. package/www/browser/chunk-XNFNEBMY.js +0 -398
  190. package/www/browser/chunk-XNFNEBMY.js.map +0 -7
  191. package/www/browser/chunk-XQY5SPGI.js +0 -30811
  192. package/www/browser/chunk-XQY5SPGI.js.map +0 -1
  193. package/www/browser/chunk-Y7JBZHNK.js +0 -514
  194. package/www/browser/chunk-Y7JBZHNK.js.map +0 -1
  195. package/www/browser/chunk-YWHRP4X3.js +0 -406
  196. package/www/browser/chunk-YWHRP4X3.js.map +0 -1
  197. package/www/browser/chunk-Z7FJIV62.js +0 -95
  198. package/www/browser/chunk-Z7FJIV62.js.map +0 -7
  199. package/www/browser/chunk-ZBZHXS46.js +0 -1674
  200. package/www/browser/chunk-ZBZHXS46.js.map +0 -1
  201. package/www/browser/chunk-ZZA5NVAI.js +0 -735
  202. package/www/browser/chunk-ZZA5NVAI.js.map +0 -1
  203. package/www/browser/collection-modal.component.css.map +0 -7
  204. package/www/browser/collection-tree-item.component.css.map +0 -7
  205. package/www/browser/collection-tree.component.css.map +0 -7
  206. package/www/browser/config-change-bar-component.css.map +0 -7
  207. package/www/browser/config-item-component.css.map +0 -7
  208. package/www/browser/config-nav-component.css.map +0 -7
  209. package/www/browser/config-section-component.css.map +0 -7
  210. package/www/browser/create-summary-aside.component.css.map +0 -7
  211. package/www/browser/curl-actions.component.css.map +0 -7
  212. package/www/browser/dark.css.map +0 -7
  213. package/www/browser/dashboard-canvas.component.css.map +0 -7
  214. package/www/browser/dashboard.component.css.map +0 -7
  215. package/www/browser/default.css.map +0 -7
  216. package/www/browser/detail-item-card.component.css.map +0 -7
  217. package/www/browser/ellipsis-text.component.css.map +0 -7
  218. package/www/browser/env-modal.component.css.map +0 -7
  219. package/www/browser/env-picker.component.css.map +0 -7
  220. package/www/browser/feedback.component.css.map +0 -7
  221. package/www/browser/fs-explorer.component.css.map +0 -7
  222. package/www/browser/git-import-modal.component.css.map +0 -7
  223. package/www/browser/hub-v2-personal-token-modal.component.css.map +0 -7
  224. package/www/browser/issue-action-area.component.css.map +0 -7
  225. package/www/browser/issue-add-participants-dialog.component.css.map +0 -7
  226. package/www/browser/issue-assign-dialog.component.css.map +0 -7
  227. package/www/browser/issue-attachment-area.component.css.map +0 -7
  228. package/www/browser/issue-base-info-area.component.css.map +0 -7
  229. package/www/browser/issue-branches.component.css.map +0 -7
  230. package/www/browser/issue-close-dialog.component.css.map +0 -7
  231. package/www/browser/issue-collaborators-panel.component.css.map +0 -7
  232. package/www/browser/issue-comment-editor.component.css.map +0 -7
  233. package/www/browser/issue-create-branch-dialog.component.css.map +0 -7
  234. package/www/browser/issue-description-area.component.css.map +0 -7
  235. package/www/browser/issue-detail.component.css.map +0 -7
  236. package/www/browser/issue-resolve-dialog.component.css.map +0 -7
  237. package/www/browser/issue-start-own-branch-dialog.component.css.map +0 -7
  238. package/www/browser/issues-list-table.component.css.map +0 -7
  239. package/www/browser/issues.component.css.map +0 -7
  240. package/www/browser/kill-port-widget.component.css.map +0 -7
  241. package/www/browser/kv-table.component.css.map +0 -7
  242. package/www/browser/layout-footer.component.css.map +0 -7
  243. package/www/browser/layout-header.component.css.map +0 -7
  244. package/www/browser/layout-menu.component.css.map +0 -7
  245. package/www/browser/layout-project-nav.component.css.map +0 -7
  246. package/www/browser/layout-sidebar.component.css.map +0 -7
  247. package/www/browser/layout.component.css.map +0 -7
  248. package/www/browser/less-viewport-component.css.map +0 -7
  249. package/www/browser/main.js +0 -1872
  250. package/www/browser/main.js.map +0 -1
  251. package/www/browser/markdown-viewer.component.css.map +0 -7
  252. package/www/browser/news-feed-widget.component.css.map +0 -7
  253. package/www/browser/ng-devtool.component.css.map +0 -7
  254. package/www/browser/nginx-config-editor.component.css.map +0 -7
  255. package/www/browser/nginx-log-viewer.component.css.map +0 -7
  256. package/www/browser/nginx-secondary-logs-tab.component.css.map +0 -7
  257. package/www/browser/nginx-secondary-perf-tab.component.css.map +0 -7
  258. package/www/browser/nginx-secondary-settings-tab.component.css.map +0 -7
  259. package/www/browser/nginx-secondary-ssl-tab.component.css.map +0 -7
  260. package/www/browser/nginx-secondary-test-tab.component.css.map +0 -7
  261. package/www/browser/nginx-secondary-traffic-tab.component.css.map +0 -7
  262. package/www/browser/nginx-secondary-upstream-tab.component.css.map +0 -7
  263. package/www/browser/nginx-section-card.component.css.map +0 -7
  264. package/www/browser/nginx-server-drawer.component.css.map +0 -7
  265. package/www/browser/nginx-server-list.component.css.map +0 -7
  266. package/www/browser/nginx-stat-card.component.css.map +0 -7
  267. package/www/browser/nginx.component.css.map +0 -7
  268. package/www/browser/page-layout.component.css.map +0 -7
  269. package/www/browser/pick-workspace-modal.component.css.map +0 -7
  270. package/www/browser/polyfills.js +0 -26584
  271. package/www/browser/polyfills.js.map +0 -7
  272. package/www/browser/project-conf.component.css.map +0 -7
  273. package/www/browser/project-create-modal.component.css.map +0 -7
  274. package/www/browser/project-create.component.css.map +0 -7
  275. package/www/browser/project-deps.component.css.map +0 -7
  276. package/www/browser/project-edit-modal.component.css.map +0 -7
  277. package/www/browser/project-import.component.css.map +0 -7
  278. package/www/browser/project-item-popover.component.css.map +0 -7
  279. package/www/browser/project-item.component.css.map +0 -7
  280. package/www/browser/project-list.component.css.map +0 -7
  281. package/www/browser/projects.component.css.map +0 -7
  282. package/www/browser/quick-task-widget.component.css.map +0 -7
  283. package/www/browser/rd-action-area.component.css.map +0 -7
  284. package/www/browser/rd-advance-stage-dialog.component.css.map +0 -7
  285. package/www/browser/rd-block-dialog.component.css.map +0 -7
  286. package/www/browser/rd-create-dialog.component.css.map +0 -7
  287. package/www/browser/rd-detail.component.css.map +0 -7
  288. package/www/browser/rd-item-card.component.css.map +0 -7
  289. package/www/browser/rd-list-board.component.css.map +0 -7
  290. package/www/browser/rd-list-table.component.css.map +0 -7
  291. package/www/browser/rd.component.css.map +0 -7
  292. package/www/browser/request-collections.component.css.map +0 -7
  293. package/www/browser/request-editor.component.css.map +0 -7
  294. package/www/browser/request-list-item.component.css.map +0 -7
  295. package/www/browser/request-list.component.css.map +0 -7
  296. package/www/browser/request-tabs-bar.component.css.map +0 -7
  297. package/www/browser/request-tabs.component.css.map +0 -7
  298. package/www/browser/request-urlbar.component.css.map +0 -7
  299. package/www/browser/response-viewer.component.css.map +0 -7
  300. package/www/browser/scripts.js +0 -245
  301. package/www/browser/scripts.js.map +0 -7
  302. package/www/browser/setting.component.css.map +0 -7
  303. package/www/browser/sprite-conf-modal.component.css.map +0 -7
  304. package/www/browser/sprite-icons-panel-component.css.map +0 -7
  305. package/www/browser/sprite-images-panel-component.css.map +0 -7
  306. package/www/browser/sprite-result-tabs.component.css.map +0 -7
  307. package/www/browser/sprite-viewport-component.css.map +0 -7
  308. package/www/browser/sprite.component.css.map +0 -7
  309. package/www/browser/step-advance.component.css.map +0 -7
  310. package/www/browser/step-basic.component.css.map +0 -7
  311. package/www/browser/step-config.component.css.map +0 -7
  312. package/www/browser/step-features.component.css.map +0 -7
  313. package/www/browser/step-preset.component.css.map +0 -7
  314. package/www/browser/step-summary-aside.component.css.map +0 -7
  315. package/www/browser/styles.css +0 -258
  316. package/www/browser/styles.css.map +0 -7
  317. package/www/browser/system-log.component.css.map +0 -7
  318. package/www/browser/task-actions.component.css.map +0 -7
  319. package/www/browser/task-console.component.css.map +0 -7
  320. package/www/browser/task-header.component.css.map +0 -7
  321. package/www/browser/task-list.component.css.map +0 -7
  322. package/www/browser/tasks.component.css.map +0 -7
  323. package/www/browser/terminal-view.component.css.map +0 -7
  324. package/www/browser/welcome-widget.component.css.map +0 -7
  325. package/www/browser/widget-base.component.css.map +0 -7
  326. package/www/browser/widget-host.component.css.map +0 -7
@@ -1,844 +0,0 @@
1
- import {
2
- NzSwitchModule
3
- } from "./chunk-6TBQERYX.js";
4
- import {
5
- NzModalModule,
6
- NzModalService
7
- } from "./chunk-FLSUSPBD.js";
8
- import {
9
- NzDropDownModule,
10
- NzMenuModule
11
- } from "./chunk-ZBZHXS46.js";
12
- import {
13
- ProjectContextStore
14
- } from "./chunk-TEW4MY4J.js";
15
- import {
16
- ApiClient,
17
- LS_KEYS,
18
- LocalStateStore,
19
- UiNotifierService
20
- } from "./chunk-2YSUXBGC.js";
21
- import {
22
- FormsModule,
23
- NzButtonModule,
24
- NzIconModule,
25
- NzInputModule,
26
- NzTooltipModule
27
- } from "./chunk-RUXJCM3V.js";
28
- import {
29
- Router
30
- } from "./chunk-665WC4RU.js";
31
- import {
32
- CommonModule,
33
- HttpParams
34
- } from "./chunk-3MCIETCQ.js";
35
- import {
36
- Component,
37
- Injectable,
38
- __decorate,
39
- __spreadProps,
40
- __spreadValues,
41
- computed,
42
- inject,
43
- lastValueFrom,
44
- map,
45
- signal
46
- } from "./chunk-XQY5SPGI.js";
47
-
48
- // src/app/pages/projects/components/fs-explorer/fs-explorer-api.service.ts
49
- var FsExplorerApiService = class FsExplorerApiService2 {
50
- api = inject(ApiClient);
51
- ls(dirPath, showSystem = false) {
52
- const params = new HttpParams().set("path", dirPath).set("showSystem", showSystem ? "1" : "0");
53
- return this.api.get("/api/fs/ls", params);
54
- }
55
- mkdir(dirPath, folderName) {
56
- return this.api.post("/api/fs/mkdir", { path: dirPath, name: folderName });
57
- }
58
- pathExists(path) {
59
- const params = new HttpParams().set("path", path);
60
- return this.api.get("/api/fs/path-exists", params).pipe(map((res) => res.exists));
61
- }
62
- };
63
- FsExplorerApiService = __decorate([
64
- Injectable({
65
- providedIn: "root"
66
- })
67
- ], FsExplorerApiService);
68
-
69
- // src/app/pages/projects/components/fs-explorer/fs-explorer.service.ts
70
- var FsExplorerService = class FsExplorerService2 {
71
- fsApi = inject(FsExplorerApiService);
72
- localState = inject(LocalStateStore);
73
- /* ---------------- state ---------------- */
74
- // 输入框 path(用户可编辑)
75
- path = signal("D:\\");
76
- // 服务端返回的 realpath(更可信)
77
- currentPath = signal("");
78
- entries = signal([]);
79
- reloading = signal(false);
80
- isEditingPath = signal(false);
81
- showSystemFolders = signal(false);
82
- // 新建目录 UI
83
- isCreateFolderModalVisible = signal(false);
84
- newFolderName = signal("");
85
- // breadcrumb
86
- segments = computed(() => {
87
- const p = this.currentPath() || this.path() || "";
88
- return this.buildSegments(p);
89
- });
90
- // 当前是否处于根目录(用于禁用“上一级”)
91
- isRoot = computed(() => {
92
- const p = (this.currentPath() || this.path() || "").trim();
93
- if (!p)
94
- return true;
95
- if (/^\\\\[^\\]+\\[^\\]+$/.test(p.replaceAll("/", "\\")))
96
- return true;
97
- const win = p.replaceAll("/", "\\");
98
- if (/^[a-zA-Z]:\\?$/.test(win))
99
- return true;
100
- const posix = p.replaceAll("\\", "/");
101
- return posix === "/";
102
- });
103
- // 是否可以上退(非根目录且不在加载中)
104
- canUp = computed(() => !this.reloading() && !this.isRoot());
105
- /* ---------------- favorites ---------------- */
106
- // 从 LocalState 初始化
107
- favorites = signal(this.normalizeFavorites(this.localState.get(LS_KEYS.fs.explorer.favorites, [])));
108
- // 当前路径是否已收藏
109
- isCurFavorited = computed(() => {
110
- const p = this.normalizePath(this.currentPath() || this.path() || "");
111
- if (!p)
112
- return false;
113
- return this.favorites().some((f) => f.path === p);
114
- });
115
- /** 添加/取消收藏 */
116
- toggleFavoriteCurrent() {
117
- const cur = this.normalizePath(this.currentPath() || this.path() || "");
118
- if (!cur)
119
- return;
120
- const list = this.favorites();
121
- const idx = list.findIndex((f) => f.path === cur);
122
- let next;
123
- if (idx >= 0) {
124
- next = list.slice(0, idx).concat(list.slice(idx + 1));
125
- } else {
126
- const fav = {
127
- path: cur,
128
- label: this.buildFavoriteLabel(cur),
129
- createdAt: Date.now()
130
- };
131
- next = [fav, ...list];
132
- }
133
- next = this.normalizeFavorites(next);
134
- this.favorites.set(next);
135
- this.persistFavorites(next);
136
- }
137
- /** 从收藏跳转 */
138
- openFavorite(f) {
139
- if (!f?.path)
140
- return;
141
- this.path.set(f.path);
142
- this.load();
143
- }
144
- /** 删除某条收藏 */
145
- removeFavorite(f) {
146
- const next = this.normalizeFavorites(this.favorites().filter((x) => x.path !== f.path));
147
- this.favorites.set(next);
148
- this.persistFavorites(next);
149
- }
150
- /** 清空收藏(可选) */
151
- clearFavorites() {
152
- this.favorites.set([]);
153
- this.persistFavorites([]);
154
- }
155
- /** 写入 LocalStateStore */
156
- persistFavorites(list) {
157
- this.localState.set(LS_KEYS.fs.explorer.favorites, list);
158
- }
159
- /** 兜底:规范化 + 去重 + 排序 */
160
- normalizeFavorites(list) {
161
- const map2 = /* @__PURE__ */ new Map();
162
- for (const it of list || []) {
163
- const p = this.normalizePath(it?.path || "");
164
- if (!p)
165
- continue;
166
- map2.set(p, {
167
- path: p,
168
- label: String(it?.label || this.buildFavoriteLabel(p)).trim(),
169
- createdAt: Number(it?.createdAt || Date.now())
170
- });
171
- }
172
- return Array.from(map2.values()).sort((a, b) => b.createdAt - a.createdAt);
173
- }
174
- /** label 生成策略:最后一段目录名 / 盘符 / UNC */
175
- buildFavoriteLabel(p) {
176
- const win = p.replaceAll("/", "\\");
177
- if (/^[a-zA-Z]:\\?$/.test(win))
178
- return win.slice(0, 2);
179
- if (/^\\\\[^\\]+\\[^\\]+$/.test(win))
180
- return win;
181
- if (/^\\\\/.test(win)) {
182
- const parts = win.split("\\").filter(Boolean);
183
- return parts[parts.length - 1] || win;
184
- }
185
- const posix = p.replaceAll("\\", "/");
186
- if (posix === "/")
187
- return "/";
188
- const arr = posix.split("/").filter(Boolean);
189
- return arr[arr.length - 1] || posix;
190
- }
191
- /* ---------------- actions ---------------- */
192
- /** 初始化/刷新 */
193
- load(force = false) {
194
- const p = (this.path() || "").trim();
195
- if (!p)
196
- return;
197
- const cur = (this.currentPath() || "").trim();
198
- if (cur && this.normalizePath(cur) === this.normalizePath(p) && this.entries().length && !force) {
199
- this.isEditingPath.set(false);
200
- return;
201
- }
202
- this.reloading.set(true);
203
- this.isEditingPath.set(false);
204
- this.fsApi.ls(p, this.showSystemFolders()).subscribe({
205
- next: (res) => {
206
- this.currentPath.set(res.path);
207
- this.entries.set(res.entries);
208
- this.path.set(res.path);
209
- },
210
- error: () => {
211
- this.reloading.set(false);
212
- },
213
- complete: () => {
214
- this.reloading.set(false);
215
- }
216
- });
217
- }
218
- toggleShowSystemFolders() {
219
- this.showSystemFolders.update((v) => !v);
220
- this.load();
221
- }
222
- editPath() {
223
- this.isEditingPath.update((v) => !v);
224
- }
225
- /** 进入目录 */
226
- open(entry) {
227
- if (entry.type !== "dir")
228
- return;
229
- this.path.set(entry.fullPath);
230
- this.load();
231
- }
232
- /** 返回父级目录,直到根目录停止 */
233
- up() {
234
- if (!this.canUp())
235
- return;
236
- const curRaw = (this.currentPath() || this.path() || "").trim();
237
- if (!curRaw)
238
- return;
239
- const cur = this.normalizePath(curRaw);
240
- const winCur = cur.replaceAll("/", "\\");
241
- const isUNC = /^\\\\[^\\]+\\[^\\]+/.test(winCur);
242
- const isWinDrive = /^[a-zA-Z]:\\/.test(winCur);
243
- const isWin = isUNC || isWinDrive;
244
- const sep = isWin ? "\\" : "/";
245
- if (isUNC) {
246
- const m = winCur.match(/^\\\\([^\\]+)\\([^\\]+)(?:\\(.*))?$/);
247
- if (!m)
248
- return;
249
- const root = `\\\\${m[1]}\\${m[2]}`;
250
- if (winCur === root)
251
- return;
252
- const idx2 = winCur.lastIndexOf("\\");
253
- const next2 = idx2 <= root.length ? root : winCur.slice(0, idx2);
254
- if (this.normalizePath(next2) === this.normalizePath(this.currentPath()))
255
- return;
256
- this.path.set(next2);
257
- this.load();
258
- return;
259
- }
260
- if (isWinDrive) {
261
- const idx2 = winCur.lastIndexOf("\\");
262
- if (idx2 <= 2) {
263
- const driveRoot = `${winCur.slice(0, 2)}\\`;
264
- if (this.normalizePath(driveRoot) === this.normalizePath(this.currentPath()))
265
- return;
266
- this.path.set(driveRoot);
267
- this.load();
268
- return;
269
- }
270
- const next2 = winCur.slice(0, idx2);
271
- if (this.normalizePath(next2) === this.normalizePath(this.currentPath()))
272
- return;
273
- this.path.set(next2);
274
- this.load();
275
- return;
276
- }
277
- const posixCur = cur.replaceAll("\\", "/");
278
- if (posixCur === "/")
279
- return;
280
- const idx = posixCur.lastIndexOf("/");
281
- const next = idx <= 0 ? "/" : posixCur.slice(0, idx);
282
- if (this.normalizePath(next) === this.normalizePath(this.currentPath()))
283
- return;
284
- this.path.set(next);
285
- this.load();
286
- }
287
- /** breadcrumb 跳转 */
288
- jumpTo(seg) {
289
- if (seg.disabled)
290
- return;
291
- this.path.set(seg.fullPath);
292
- this.load();
293
- }
294
- /** 打开新建文件夹 modal */
295
- openCreateFolderModal() {
296
- this.newFolderName.set("");
297
- this.isCreateFolderModalVisible.set(true);
298
- }
299
- /** 取消创建 */
300
- cancelCreateFolder() {
301
- this.isCreateFolderModalVisible.set(false);
302
- this.newFolderName.set("");
303
- }
304
- /** 确认创建 */
305
- confirmCreateFolder() {
306
- const name = (this.newFolderName() || "").trim();
307
- if (!name)
308
- return;
309
- const parentPath = this.currentPath() || this.path();
310
- this.fsApi.mkdir(parentPath, name).subscribe(() => {
311
- this.isCreateFolderModalVisible.set(false);
312
- this.newFolderName.set("");
313
- this.load(true);
314
- });
315
- }
316
- /* ---------------- breadcrumb utils ---------------- */
317
- buildSegments(raw) {
318
- const p = (raw || "").trim();
319
- if (!p)
320
- return [];
321
- const isWin = /^[a-zA-Z]:[\\/]/.test(p) || /^[a-zA-Z]:$/.test(p);
322
- const sep = isWin ? "\\" : "/";
323
- const norm = isWin ? p.replaceAll("/", "\\") : p.replaceAll("\\", "/");
324
- let rootLabel = isWin ? norm.slice(0, 2) : "/";
325
- let rest = norm;
326
- if (isWin) {
327
- const m = norm.match(/^([a-zA-Z]:)(?:[\\\/])?(.*)$/);
328
- if (m) {
329
- rootLabel = m[1];
330
- rest = m[2] || "";
331
- }
332
- } else {
333
- rest = norm.startsWith("/") ? norm.slice(1) : norm;
334
- }
335
- const parts = rest.split(isWin ? /[\\]+/ : /[\/]+/).filter(Boolean);
336
- const segs = [];
337
- const rootFull = isWin ? `${rootLabel}\\` : "/";
338
- segs.push({
339
- key: "root",
340
- label: rootLabel,
341
- fullPath: rootFull,
342
- disabled: parts.length === 0
343
- });
344
- let acc = rootFull;
345
- for (let i = 0; i < parts.length; i++) {
346
- const part = parts[i];
347
- acc = acc.endsWith(sep) ? acc + part : acc + sep + part;
348
- const isLast = i === parts.length - 1;
349
- const fullPath = isLast ? acc : acc + sep;
350
- segs.push({
351
- key: `${i}-${part}`,
352
- label: part,
353
- fullPath,
354
- disabled: isLast
355
- });
356
- }
357
- return segs;
358
- }
359
- normalizePath(raw) {
360
- const p = (raw || "").trim();
361
- if (!p)
362
- return "";
363
- const isUNC = /^\\\\[^\\]+\\[^\\]+/.test(p.replaceAll("/", "\\"));
364
- const isWinDrive = /^[a-zA-Z]:([\\/]|$)/.test(p);
365
- const isWin = isUNC || isWinDrive;
366
- let norm = isWin ? p.replaceAll("/", "\\") : p.replaceAll("\\", "/");
367
- if (isWinDrive) {
368
- const drive = norm.slice(0, 2);
369
- if (norm === drive || norm === `${drive}\\`)
370
- return `${drive}\\`;
371
- }
372
- if (!isWin && norm === "/")
373
- return "/";
374
- norm = norm.replace(/[\\\/]+$/, "");
375
- return norm;
376
- }
377
- };
378
- FsExplorerService = __decorate([
379
- Injectable({
380
- providedIn: "root"
381
- })
382
- ], FsExplorerService);
383
-
384
- // angular:jit:template:src\app\pages\projects\components\fs-explorer\fs-explorer.component.html
385
- var fs_explorer_component_default = `<div class="page">\r
386
- <div class="toolbar">\r
387
- <button nz-button (click)="fs.up()" [disabled]="!fs.canUp()" nz-tooltip="\u4E0A\u4E00\u5C42">\r
388
- <nz-icon nzType="up" nzTheme="outline" />\r
389
- </button>\r
390
- @if (fs.isEditingPath()) {\r
391
- <div class="path-edit">\r
392
- <nz-input-wrapper>\r
393
- <input\r
394
- nz-input\r
395
- nzSize="small"\r
396
- [(ngModel)]="fs.path"\r
397
- placeholder="\u8F93\u5165\u6587\u4EF6\u5939\u5B8C\u6574\u8DEF\u5F84\uFF0C\u5982 D:\\work \u6216 /Users/xx"\r
398
- (keyup.enter)="fs.load()"\r
399
- />\r
400
- <button nzInputSuffix nz-button nzType="link">\r
401
- <nz-icon nzInputSuffix nzType="edit" nzTheme="outline" />\r
402
- </button>\r
403
- </nz-input-wrapper>\r
404
- </div>\r
405
- } @else {\r
406
- <div class="current-path">\r
407
- <div class="path-value">\r
408
- @for (seg of fs.segments(); track seg.key) {\r
409
- <div class="path-part">\r
410
- <button nz-button nzType="link" (click)="fs.jumpTo(seg)">\r
411
- {{ seg.label }}\r
412
- </button>\r
413
- </div>\r
414
- }\r
415
- </div>\r
416
- <button nz-button nzType="link" (click)="fs.editPath()">\r
417
- <nz-icon nzType="edit" nzTheme="outline" />\r
418
- </button>\r
419
- </div>\r
420
- }\r
421
- <button\r
422
- nz-button\r
423
- nzType="primary"\r
424
- (click)="fs.load(true)"\r
425
- [nzLoading]="fs.reloading()"\r
426
- nz-tooltip="\u5237\u65B0"\r
427
- >\r
428
- <nz-icon [nzType]="fs.reloading() ? 'loading' : 'reload'" nzTheme="outline" />\r
429
- </button>\r
430
- <button nz-button (click)="fs.toggleFavoriteCurrent()" nz-tooltip="\u6DFB\u52A0/\u53D6\u6D88\u6536\u85CF">\r
431
- <nz-icon nzType="star" [nzTheme]="fs.isCurFavorited() ? 'fill' : 'outline'" />\r
432
- </button>\r
433
- <button\r
434
- nz-button\r
435
- nz-tooltip="\u6536\u85CF\u7684\u6587\u4EF6\u5939"\r
436
- nz-dropdown\r
437
- [nzDropdownMenu]="collectMenu"\r
438
- nzTrigger="click"\r
439
- nzPlacement="bottomRight"\r
440
- >\r
441
- <nz-icon nzType="caret-down" nzTheme="outline" />\r
442
- </button>\r
443
- <button\r
444
- nz-button\r
445
- nz-dropdown\r
446
- [nzDropdownMenu]="moreMenu"\r
447
- nzPlacement="bottomRight"\r
448
- nzTrigger="click"\r
449
- nz-tooltip="\u66F4\u591A\u64CD\u4F5C"\r
450
- >\r
451
- <nz-icon nzType="more" nzTheme="outline" />\r
452
- </button>\r
453
- </div>\r
454
- <div class="folders">\r
455
- @for (e of fs.entries(); track $index) {\r
456
- <div class="folder-item" (click)="fs.open(e)">\r
457
- <div class="icon">\r
458
- <span nz-icon [nzType]="e.type === 'dir' ? 'folder' : 'file'"></span>\r
459
- </div>\r
460
- <div class="name" title="{{ e.name }}">\r
461
- {{ e.name }}\r
462
- @if (e.projectKind && e.projectKind != 'unknown') {\r
463
- <nz-icon\r
464
- class="project-suffix-icon"\r
465
- [nzType]="'proj:' + e.projectKind"\r
466
- nzTheme="outline"\r
467
- ></nz-icon>\r
468
- }\r
469
- </div>\r
470
- </div>\r
471
- }\r
472
- </div>\r
473
- </div>\r
474
- \r
475
- <nz-dropdown-menu #collectMenu="nzDropdownMenu">\r
476
- <ul nz-menu>\r
477
- @for (fav of fs.favorites(); track fav.path) {\r
478
- <li nz-menu-item>\r
479
- <nz-icon nzType="folder" nzTheme="fill" />\r
480
- <button nz-button nzType="link" (click)="fs.openFavorite(fav)" [nz-tooltip]="fav.path">\r
481
- {{ fav.label }}\r
482
- </button>\r
483
- </li>\r
484
- }\r
485
- </ul>\r
486
- </nz-dropdown-menu>\r
487
- \r
488
- <nz-dropdown-menu #moreMenu="nzDropdownMenu">\r
489
- <ul nz-menu>\r
490
- <li nz-menu-item (click)="fs.openCreateFolderModal()">\r
491
- <nz-icon nzType="folder-add" nzTheme="fill" style="font-size: 16px" />\r
492
- \u65B0\u5EFA\u6587\u4EF6\u5939\r
493
- </li>\r
494
- <li nz-menu-item (click)="fs.toggleShowSystemFolders()">\r
495
- <nz-icon nzType="eye" nzTheme="fill" style="font-size: 16px" />\r
496
- \u662F\u5426\u9690\u85CF\u7CFB\u7EDF\u6587\u4EF6\u5939\r
497
- <nz-switch [ngModel]="fs.showSystemFolders()" style="margin-left: 8px"></nz-switch>\r
498
- </li>\r
499
- </ul>\r
500
- </nz-dropdown-menu>\r
501
- \r
502
- <!--\u65B0\u589E\u6587\u4EF6\u5939-->\r
503
- <nz-modal\r
504
- [(nzVisible)]="fs.isCreateFolderModalVisible"\r
505
- nzTitle="\u65B0\u5EFA\u6587\u4EF6\u5939"\r
506
- (nzOnCancel)="fs.isCreateFolderModalVisible.set(false)"\r
507
- [nzMaskClosable]="false"\r
508
- >\r
509
- <ng-container *nzModalContent>\r
510
- <div class="modal-body">\r
511
- <label>\u6587\u4EF6\u5939\u540D\u79F0\uFF1A </label>\r
512
- <nz-input-wrapper>\r
513
- <input nz-input [(ngModel)]="fs.newFolderName" placeholder="\u8BF7\u8F93\u5165\u6587\u4EF6\u5939\u540D\u79F0" />\r
514
- <nz-icon nzInputPrefix nzType="folder" nzTheme="fill" />\r
515
- <nz-icon\r
516
- nzInputSuffix\r
517
- nzType="question-circle"\r
518
- nzTheme="outline"\r
519
- nz-tooltip="\u4F60\u53EF\u4EE5\u4F7F\u7528\u8DEF\u5F84\u5206\u9694\u7B26\u6765\u521B\u5EFA\u5D4C\u5957\u7684\u6587\u4EF6\u5939"\r
520
- nzTooltipTrigger="hover"\r
521
- nzTooltipPlacement="right"\r
522
- />\r
523
- </nz-input-wrapper>\r
524
- <div class="hint">{{ fs.currentPath() }}{{ fs.newFolderName() }}</div>\r
525
- </div>\r
526
- </ng-container>\r
527
- \r
528
- <ng-container *nzModalFooter>\r
529
- <button nz-button (click)="fs.isCreateFolderModalVisible.set(false)">\u53D6\u6D88</button>\r
530
- <button\r
531
- nz-button\r
532
- nzType="primary"\r
533
- (click)="fs.confirmCreateFolder()"\r
534
- [disabled]="!fs.newFolderName().trim()"\r
535
- >\r
536
- <nz-icon nzType="folder-add" nzTheme="fill" />\r
537
- \u521B\u5EFA\r
538
- </button>\r
539
- </ng-container>\r
540
- </nz-modal>\r
541
- `;
542
-
543
- // angular:jit:style:src\app\pages\projects\components\fs-explorer\fs-explorer.component.less
544
- var fs_explorer_component_default2 = "/* src/app/pages/projects/components/fs-explorer/fs-explorer.component.less */\n.page {\n height: 100%;\n display: flex;\n flex-direction: column;\n}\n.toolbar {\n display: flex;\n gap: 8px;\n align-items: center;\n padding: 16px 0;\n flex: 0 0 auto;\n}\n.folders {\n flex: 100% 1 1;\n height: 0;\n overflow-x: hidden;\n overflow-y: auto;\n position: relative;\n}\n.current-path {\n min-width: 0;\n flex: 100% 1 1;\n display: flex;\n flex-direction: row;\n align-items: stretch;\n border-radius: 3px;\n height: 34px;\n}\n.current-path .path-value {\n flex: auto 1 1;\n display: flex;\n flex-direction: row;\n align-items: stretch;\n}\n.current-path .path-value .path-part {\n flex: auto 0 0;\n border-left-width: 2px;\n border-left-style: solid;\n}\n.path-edit {\n flex: 100% 1 1;\n display: flex;\n flex-direction: row;\n align-items: stretch;\n border-radius: 3px;\n border: none;\n outline: none;\n}\n.folder-item {\n padding: 16px;\n display: flex;\n flex-direction: row;\n align-items: center;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n cursor: pointer;\n position: relative;\n}\n.folder-item .icon {\n margin: 0 4px;\n flex: auto 0 0;\n}\n.folder-item .icon span {\n font-size: 24px;\n}\n.folder-item .name {\n flex: 100% 1 1;\n display: inline-flex;\n align-items: center;\n margin-left: 16px;\n overflow: hidden;\n -ms-text-overflow: ellipsis;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.folder-item .name nz-icon {\n font-size: 16px;\n margin-left: 4px;\n}\n.modal-body {\n display: grid;\n gap: 12px;\n}\n.hint {\n font-size: 12px;\n opacity: 0.75;\n}\nhtml.default {\n}\nhtml.default :root {\n --app-gray: #e6f7ff;\n --app-primary: #1890ff;\n --app-primary-1: #e6f7ff;\n --app-primary-2: #bae7ff;\n --app-primary-3: #91d5ff;\n --app-primary-4: #69c0ff;\n --app-primary-5: #40a9ff;\n --app-primary-6: #1890ff;\n --app-text-color: rgba(0, 0, 0, 0.85);\n --app-text-secondary: rgba(0, 0, 0, 0.45);\n --text-color-primary: #1890ff;\n --app-component-bg: #fff;\n --app-border-color: #d9d9d9;\n --header-error-background: #ff4d4f;\n}\nhtml.default :root {\n --text-color-gray: #888;\n}\nhtml.default :host .current-path {\n background: var(--app-primary-3);\n}\nhtml.default :host button:not(.ant-btn-link) {\n background-color: var(--app-primary-3);\n}\nhtml.default :host .path-part button {\n color: rgba(0, 0, 0, 0.85);\n}\nhtml.default :host .path-part {\n border-left-color: #fff;\n}\nhtml.default :host .folder-item:hover {\n background: var(--app-primary-3);\n}\nhtml.dark {\n}\nhtml.dark :root {\n --text-color-gray: #bbb;\n}\nhtml.dark :host .current-path {\n background: var(--app-primary-3);\n}\nhtml.dark :host button:not(.ant-btn-link) {\n background-color: var(--app-primary-3);\n}\nhtml.dark :host .path-part button {\n color: rgba(255, 255, 255, 0.85);\n}\nhtml.dark :host .path-part {\n border-left-color: #141414;\n}\nhtml.dark :host .folder-item:hover {\n background: var(--app-primary-3);\n}\n/*# sourceMappingURL=fs-explorer.component.css.map */\n";
545
-
546
- // src/app/pages/projects/components/fs-explorer/fs-explorer.component.ts
547
- var FsExplorerComponent = class FsExplorerComponent2 {
548
- fs;
549
- constructor(fs) {
550
- this.fs = fs;
551
- }
552
- ngOnInit() {
553
- this.fs.load();
554
- }
555
- static ctorParameters = () => [
556
- { type: FsExplorerService }
557
- ];
558
- };
559
- FsExplorerComponent = __decorate([
560
- Component({
561
- selector: "app-fs-explorer",
562
- imports: [
563
- CommonModule,
564
- FormsModule,
565
- NzInputModule,
566
- NzButtonModule,
567
- NzIconModule,
568
- NzTooltipModule,
569
- NzDropDownModule,
570
- NzMenuModule,
571
- NzSwitchModule,
572
- NzModalModule
573
- ],
574
- template: fs_explorer_component_default,
575
- styles: [fs_explorer_component_default2]
576
- })
577
- ], FsExplorerComponent);
578
-
579
- // src/app/pages/projects/services/project-api.service.ts
580
- var ProjectApiService = class ProjectApiService2 {
581
- api = inject(ApiClient);
582
- fs = inject(FsExplorerApiService);
583
- // 调用本地服务检查路径是否存在 & 是否重复注册
584
- async checkPathExists(path) {
585
- return await lastValueFrom(this.fs.pathExists(path));
586
- }
587
- detect(rootPath) {
588
- return this.api.post("/api/projects/detect", { rootPath });
589
- }
590
- // Electron 里建议通过 preload 暴露 window.ngm.pickFolder()
591
- async pickFolder() {
592
- return null;
593
- }
594
- bootstrapByCli(draft) {
595
- return this.api.post("/api/projects/bootstrap/cli", {
596
- parentDir: draft.parentDir,
597
- name: draft.name,
598
- rootPath: draft.rootPath,
599
- packageManager: draft.packageManager,
600
- overwriteIfExists: draft.overwriteIfExists,
601
- skipOnboarding: draft.skipOnboarding,
602
- initGit: draft.initGit,
603
- initialCommitMessage: draft.initialCommitMessage,
604
- cliFramework: draft.cliFramework,
605
- cliTool: draft.cliTool,
606
- cliArgs: draft.cliArgs ?? []
607
- });
608
- }
609
- bootstrapPickRoot(input) {
610
- return this.api.post("/api/projects/bootstrap/pickRoot", input);
611
- }
612
- bootstrapByGit(draft) {
613
- return this.api.post("/api/projects/bootstrap/git", {
614
- repoUrl: draft.repoUrl,
615
- parentDir: draft.parentDir,
616
- name: draft.name,
617
- rootPath: draft.rootPath,
618
- overwriteIfExists: draft.overwriteIfExists,
619
- initGit: draft.initGit,
620
- initialCommitMessage: draft.initialCommitMessage,
621
- packageManager: draft.packageManager,
622
- skipOnboarding: draft.skipOnboarding ?? true
623
- });
624
- }
625
- // 从hub-v2中获取项目成员
626
- getProjectMembers(projectId) {
627
- return this.api.hubRequestWithPrjId({
628
- projectId,
629
- path: "/members"
630
- });
631
- }
632
- list() {
633
- return this.api.get("/api/projects/list");
634
- }
635
- get(id) {
636
- return this.api.get(`/api/projects/getInfo/${id}`);
637
- }
638
- check(rootPath) {
639
- return this.api.post("/api/projects/check", { rootPath });
640
- }
641
- createByPath(data) {
642
- return this.api.post("/api/projects/create", data);
643
- }
644
- checkImport(root) {
645
- return this.api.post("/api/projects/checkImport", { root });
646
- }
647
- importByPath(data) {
648
- return this.api.post("/api/projects/import", data);
649
- }
650
- delete(id) {
651
- return this.api.delete(`/api/projects/delete/${id}`);
652
- }
653
- update(id, data) {
654
- return this.api.post(`/api/projects/update/${id}`, data);
655
- }
656
- setFavorite(id, isFavorite) {
657
- return this.api.post(`/api/projects/favorite/${id}`, { isFavorite });
658
- }
659
- toggleFavorite(id) {
660
- return this.api.post(`/api/projects/favorite/${id}/toggle`, {});
661
- }
662
- setLastOpened(id, timestamp) {
663
- return this.api.post(`/api/projects/lastOpened/${id}`, { timestamp });
664
- }
665
- openInEditor(id, editor = "code") {
666
- return this.api.post(`/api/projects/openInEditor/${id}`, { editor });
667
- }
668
- edit(projectId, data) {
669
- return this.api.post(`/api/projects/edit/${projectId}`, data);
670
- }
671
- updateAssets(projectId, assets) {
672
- return this.api.post(`/api/projects/updateAssets/${projectId}`, { assets });
673
- }
674
- };
675
- ProjectApiService = __decorate([
676
- Injectable({ providedIn: "root" })
677
- ], ProjectApiService);
678
-
679
- // src/app/pages/projects/services/project.state.service.ts
680
- var ProjectStateService = class ProjectStateService2 {
681
- modal = inject(NzModalService);
682
- notify = inject(UiNotifierService);
683
- projectService = inject(ProjectApiService);
684
- projectContext = inject(ProjectContextStore);
685
- ls = inject(LocalStateStore);
686
- router = inject(Router);
687
- projects = computed(() => this.projectContext.projects());
688
- keyword = signal("");
689
- /* ----------------- edit modal state ----------------- */
690
- isEditModalVisible = signal(false);
691
- isEditSaving = signal(false);
692
- /* 正在编辑的项目 */
693
- editingProject = signal(null);
694
- /* ----------------- list computed ----------------- */
695
- filteredProjects = computed(() => {
696
- const kw = this.keyword().trim().toLowerCase();
697
- if (!kw)
698
- return this.projects();
699
- return this.projects().filter((p) => p.name.toLowerCase().includes(kw));
700
- });
701
- favoriteProjects = computed(() => this.filteredProjects().filter((p) => p.isFavorite));
702
- moreProjects = computed(() => this.filteredProjects().filter((p) => !p.isFavorite));
703
- recentProjects = computed(() => this.projects().slice().sort((a, b) => {
704
- const dateA = new Date(a.lastOpened || 0).getTime();
705
- const dateB = new Date(b.lastOpened || 0).getTime();
706
- return dateB - dateA;
707
- }).slice(0, 5));
708
- /** 点击列表项:切换当前项目 + 记录 lastOpened */
709
- selectProject(project) {
710
- this.projectContext.setCurrentProject(project);
711
- const lastOpened = Date.now();
712
- this.projectContext.patchProject(__spreadProps(__spreadValues({}, project), { lastOpened }));
713
- this.projectService.setLastOpened(project.id, lastOpened).subscribe();
714
- this.router.navigate(["/dashboard"]);
715
- }
716
- openInEditor(projectId) {
717
- this.projectService.openInEditor(projectId).subscribe({
718
- next: () => {
719
- console.log("Opened project in editor:", projectId);
720
- this.notify.success("\u5DF2\u5728\u7F16\u8F91\u5668\u4E2D\u6253\u5F00\u9879\u76EE");
721
- }
722
- });
723
- }
724
- toggleFavorite(projectId) {
725
- this.projectService.toggleFavorite(projectId).subscribe((updated) => {
726
- this.projectContext.patchProject(updated);
727
- });
728
- }
729
- getProjects(currentProjectId) {
730
- this.projectContext.loadProjects(currentProjectId).subscribe();
731
- }
732
- setCurrentProjectById(projectId) {
733
- this.projectContext.setCurrentProjectById(projectId);
734
- }
735
- isOpen(project) {
736
- return this.projectContext.isOpen(project);
737
- }
738
- /* ----------------- rename modal ----------------- */
739
- /** 打开重命名弹窗:默认带入当前名称 */
740
- openEditModal(project) {
741
- const env = project.env ?? {};
742
- this.editingProject.set({
743
- id: project.id,
744
- name: project.name ?? "",
745
- repoPageUrl: project.repoPageUrl ?? "",
746
- description: project.description ?? "",
747
- hubV2: {
748
- baseUrl: env["NGM_HUB_V2_BASE_URL"] ?? "",
749
- projectKey: env["NGM_HUB_V2_PROJECT_KEY"] ?? "",
750
- token: env["NGM_HUB_V2_TOKEN"] ?? ""
751
- }
752
- });
753
- this.isEditModalVisible.set(true);
754
- }
755
- closeEditModal() {
756
- if (this.isEditSaving())
757
- return;
758
- this.isEditModalVisible.set(false);
759
- this.editingProject.set(null);
760
- }
761
- confirmEditProject() {
762
- if (this.isEditSaving() || !this.editingProject())
763
- return;
764
- const { id, name, description, repoPageUrl, hubV2 } = this.editingProject();
765
- if (!id) {
766
- this.notify.error("\u672A\u9009\u4E2D\u9700\u8981\u91CD\u547D\u540D\u7684\u9879\u76EE");
767
- return;
768
- }
769
- if (!name)
770
- return;
771
- const desc = description?.trim();
772
- const repoPUrl = repoPageUrl?.trim();
773
- const nextHubV2 = {
774
- baseUrl: hubV2.baseUrl.trim(),
775
- projectKey: hubV2.projectKey.trim(),
776
- token: hubV2.token.trim()
777
- };
778
- const current = this.projectContext.getProjectById(id);
779
- const currentEnv = current?.env ?? {};
780
- if (current && current.name === name && current.description === desc && current.repoPageUrl === repoPUrl && (currentEnv["NGM_HUB_V2_BASE_URL"] ?? "") === nextHubV2.baseUrl && (currentEnv["NGM_HUB_V2_PROJECT_KEY"] ?? "") === nextHubV2.projectKey && (currentEnv["NGM_HUB_V2_TOKEN"] ?? "") === nextHubV2.token) {
781
- this.closeEditModal();
782
- return;
783
- }
784
- this.isEditSaving.set(true);
785
- this.projectService.edit(id, { name, description: desc, repoPageUrl: repoPUrl }).subscribe({
786
- next: () => {
787
- const nextEnv = __spreadProps(__spreadValues({}, current?.env ?? {}), {
788
- NGM_HUB_V2_BASE_URL: nextHubV2.baseUrl,
789
- NGM_HUB_V2_PROJECT_KEY: nextHubV2.projectKey,
790
- NGM_HUB_V2_TOKEN: nextHubV2.token
791
- });
792
- this.projectService.update(id, { env: nextEnv }).subscribe({
793
- next: (updated) => {
794
- this.projectContext.patchProject(updated);
795
- this.notify.success("\u4FEE\u6539\u6210\u529F");
796
- this.closeEditModal();
797
- this.isEditSaving.set(false);
798
- },
799
- error: (err) => {
800
- this.notify.error(err?.message || "\u9879\u76EE\u914D\u7F6E\u4FDD\u5B58\u5931\u8D25");
801
- this.isEditSaving.set(false);
802
- }
803
- });
804
- },
805
- error: (err) => {
806
- this.notify.error(err?.message || "\u4FEE\u6539\u5931\u8D25");
807
- this.isEditSaving.set(false);
808
- }
809
- });
810
- }
811
- /** 删除项目 */
812
- deleteProject(projectId) {
813
- this.modal.confirm({
814
- nzTitle: "\u786E\u8BA4\u5220\u9664\u8BE5\u9879\u76EE\u5417\uFF1F",
815
- nzContent: "\u5220\u9664\u9879\u76EE\u53EA\u4F1A\u79FB\u9664\u9879\u76EE\u8BB0\u5F55\uFF0C\u4E0D\u4F1A\u5220\u9664\u78C1\u76D8\u4E0A\u7684\u6587\u4EF6\u5939\u3002\u5982\u9700\u5220\u9664\u78C1\u76D8\u6587\u4EF6\uFF0C\u8BF7\u624B\u52A8\u64CD\u4F5C\u3002",
816
- nzOkText: "\u5220\u9664",
817
- nzCancelText: "\u53D6\u6D88",
818
- nzOkDanger: true,
819
- nzOnOk: () => {
820
- this.projectService.delete(projectId).subscribe({
821
- next: () => {
822
- this.projectContext.removeProject(projectId);
823
- if (!this.projectContext.currentProject()) {
824
- this.notify.info("\u5F53\u524D\u6CA1\u6709\u9879\u76EE\uFF0C\u8BF7\u5148\u521B\u5EFA\u6216\u5BFC\u5165\u9879\u76EE");
825
- }
826
- this.notify.success("\u9879\u76EE\u5DF2\u5220\u9664");
827
- }
828
- });
829
- }
830
- });
831
- }
832
- };
833
- ProjectStateService = __decorate([
834
- Injectable({ providedIn: "root" })
835
- ], ProjectStateService);
836
-
837
- export {
838
- FsExplorerApiService,
839
- FsExplorerService,
840
- FsExplorerComponent,
841
- ProjectApiService,
842
- ProjectStateService
843
- };
844
- //# sourceMappingURL=chunk-GMCNMOTD.js.map