@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.
- package/lib/plugins/error-handler.plugin.js +5 -0
- package/lib/routes/api-client/hub-token.routes.js +22 -0
- package/lib/routes/index.js +2 -0
- package/lib/routes/node-version.routes.d.ts +2 -0
- package/lib/routes/node-version.routes.js +56 -0
- package/lib/routes/project.routes.js +5 -0
- package/lib/routes/sprite-browse.routes.js +19 -5
- package/lib/routes/sprite.routes.js +17 -11
- package/lib/routes/static-files.routes.js +16 -0
- package/lib/routes/task.routes.js +7 -0
- package/package.json +3 -3
- package/www/3rdpartylicenses.txt +14 -66
- package/www/browser/chunk-2BZRE4G7.js +1 -0
- package/www/browser/chunk-2X3MRS27.js +1 -0
- package/www/browser/chunk-4KETC6EB.js +1 -0
- package/www/browser/chunk-5T5KA5PG.js +1 -0
- package/www/browser/chunk-6CGHNKJI.js +1 -0
- package/www/browser/chunk-76TVIB33.js +63 -0
- package/www/browser/chunk-7J24TP36.js +1 -0
- package/www/browser/chunk-ACAZUX6C.js +1 -0
- package/www/browser/chunk-B6MBYCXI.js +1 -0
- package/www/browser/chunk-BYEU6KGP.js +2 -0
- package/www/browser/chunk-CZ5AZ3VW.js +1 -0
- package/www/browser/chunk-DW7F5PEA.js +1 -0
- package/www/browser/chunk-DXF7BVK5.js +1 -0
- package/www/browser/chunk-EEVPZGEY.js +1 -0
- package/www/browser/chunk-G2W3B7TJ.js +1 -0
- package/www/browser/chunk-GDWS2L66.js +1 -0
- package/www/browser/chunk-HFZLJHYR.js +1 -0
- package/www/browser/chunk-HGONFYP6.js +1 -0
- package/www/browser/chunk-HHBPULJW.js +2 -0
- package/www/browser/chunk-HRXCR3IN.js +1 -0
- package/www/browser/chunk-INL2PELS.js +1 -0
- package/www/browser/chunk-JHMEKUZ5.js +1 -0
- package/www/browser/chunk-JU3TEDBV.js +37 -0
- package/www/browser/chunk-JZULA5JV.js +1 -0
- package/www/browser/chunk-KVFR7GFV.js +20 -0
- package/www/browser/chunk-L5D75AMV.js +1 -0
- package/www/browser/chunk-L7TMCSHV.js +1 -0
- package/www/browser/chunk-LQ5OXSW7.js +3 -0
- package/www/browser/chunk-MVQTKINJ.js +1 -0
- package/www/browser/chunk-N4LRZJBP.js +1 -0
- package/www/browser/chunk-O2EYEF7J.js +1 -0
- package/www/browser/chunk-OMDHJIUB.js +1 -0
- package/www/browser/chunk-OWUAAOHW.js +2 -0
- package/www/browser/chunk-PIK5YPIB.js +1 -0
- package/www/browser/chunk-RHLQRQDK.js +9 -0
- package/www/browser/chunk-RW2JPJV7.js +1 -0
- package/www/browser/chunk-S3SJ4VVM.js +11 -0
- package/www/browser/chunk-SIVPP74B.js +0 -0
- package/www/browser/chunk-SPRWNZHF.js +15 -0
- package/www/browser/chunk-SQQNR223.js +1 -0
- package/www/browser/chunk-SVQWPHF5.js +1 -0
- package/www/browser/chunk-SYCNSLAW.js +4 -0
- package/www/browser/chunk-T3KK7ZXB.js +2 -0
- package/www/browser/chunk-TMX5TTV3.js +1 -0
- package/www/browser/chunk-UFY3FLDK.js +1 -0
- package/www/browser/chunk-UJOHBN2Y.js +1 -0
- package/www/browser/chunk-UQGCUFNM.js +1 -0
- package/www/browser/chunk-UXXWRMM6.js +1 -0
- package/www/browser/chunk-UZRJGJTD.js +2 -0
- package/www/browser/chunk-WD4IAQR3.js +1 -0
- package/www/browser/chunk-WF2QTF5L.js +1 -0
- package/www/browser/chunk-WI67LAOV.js +4 -0
- package/www/browser/chunk-WNCM6QKB.js +1 -0
- package/www/browser/chunk-XJ5KZQNN.js +1 -0
- package/www/browser/chunk-YETDFSQE.js +1 -0
- package/www/browser/chunk-YMTC5GZK.js +1 -0
- package/www/browser/chunk-YVZHJ76K.js +1 -0
- package/www/browser/chunk-ZNTJRLVH.js +1 -0
- package/www/browser/dark.css +1 -30433
- package/www/browser/default.css +1 -30149
- package/www/browser/index.html +3 -3
- package/www/browser/main-6LN5C22E.js +34 -0
- package/www/browser/scripts-U25HCVEI.js +6 -0
- package/www/browser/styles-ROAHD7MY.css +1 -0
- package/www/browser/add-widget-drawer.component.css.map +0 -7
- package/www/browser/advanced-editor.component.css.map +0 -7
- package/www/browser/api-client.component.css.map +0 -7
- package/www/browser/api-history-drawer.component.css.map +0 -7
- package/www/browser/app.css.map +0 -7
- package/www/browser/attachment-viewer.component.css.map +0 -7
- package/www/browser/auth-editor.component.css.map +0 -7
- package/www/browser/body-editor.component.css.map +0 -7
- package/www/browser/chunk-2YSUXBGC.js +0 -627
- package/www/browser/chunk-2YSUXBGC.js.map +0 -1
- package/www/browser/chunk-3G2GEOPV.js +0 -456
- package/www/browser/chunk-3G2GEOPV.js.map +0 -1
- package/www/browser/chunk-3L72DF3R.js +0 -1683
- package/www/browser/chunk-3L72DF3R.js.map +0 -1
- package/www/browser/chunk-3MCIETCQ.js +0 -8279
- package/www/browser/chunk-3MCIETCQ.js.map +0 -1
- package/www/browser/chunk-665WC4RU.js +0 -5383
- package/www/browser/chunk-665WC4RU.js.map +0 -1
- package/www/browser/chunk-6QMSEZPT.js +0 -10044
- package/www/browser/chunk-6QMSEZPT.js.map +0 -1
- package/www/browser/chunk-6TBQERYX.js +0 -280
- package/www/browser/chunk-6TBQERYX.js.map +0 -1
- package/www/browser/chunk-6UW4MRJZ.js +0 -43
- package/www/browser/chunk-6UW4MRJZ.js.map +0 -7
- package/www/browser/chunk-6XUMIL3W.js +0 -5495
- package/www/browser/chunk-6XUMIL3W.js.map +0 -1
- package/www/browser/chunk-724YOJI3.js +0 -903
- package/www/browser/chunk-724YOJI3.js.map +0 -1
- package/www/browser/chunk-766T7YES.js +0 -437
- package/www/browser/chunk-766T7YES.js.map +0 -1
- package/www/browser/chunk-7FC7DN65.js +0 -728
- package/www/browser/chunk-7FC7DN65.js.map +0 -1
- package/www/browser/chunk-APGQRYWX.js +0 -156
- package/www/browser/chunk-APGQRYWX.js.map +0 -7
- package/www/browser/chunk-AQHSGTHS.js +0 -1960
- package/www/browser/chunk-AQHSGTHS.js.map +0 -1
- package/www/browser/chunk-CTOEAJQK.js +0 -40
- package/www/browser/chunk-CTOEAJQK.js.map +0 -7
- package/www/browser/chunk-DEGQJKKZ.js +0 -409
- package/www/browser/chunk-DEGQJKKZ.js.map +0 -1
- package/www/browser/chunk-DIJX2663.js +0 -1166
- package/www/browser/chunk-DIJX2663.js.map +0 -1
- package/www/browser/chunk-E4XD4GLT.js +0 -427
- package/www/browser/chunk-E4XD4GLT.js.map +0 -1
- package/www/browser/chunk-EQOY6A3M.js +0 -212
- package/www/browser/chunk-EQOY6A3M.js.map +0 -1
- package/www/browser/chunk-ETTBRXVA.js +0 -2643
- package/www/browser/chunk-ETTBRXVA.js.map +0 -1
- package/www/browser/chunk-FLSUSPBD.js +0 -5569
- package/www/browser/chunk-FLSUSPBD.js.map +0 -1
- package/www/browser/chunk-FZNHBEAZ.js +0 -102
- package/www/browser/chunk-FZNHBEAZ.js.map +0 -1
- package/www/browser/chunk-GJC7CZIJ.js +0 -361
- package/www/browser/chunk-GJC7CZIJ.js.map +0 -7
- package/www/browser/chunk-GMCNMOTD.js +0 -844
- package/www/browser/chunk-GMCNMOTD.js.map +0 -7
- package/www/browser/chunk-H43HGCRW.js +0 -198
- package/www/browser/chunk-H43HGCRW.js.map +0 -7
- package/www/browser/chunk-J447GBHM.js +0 -160
- package/www/browser/chunk-J447GBHM.js.map +0 -1
- package/www/browser/chunk-JN3VOWP7.js +0 -384
- package/www/browser/chunk-JN3VOWP7.js.map +0 -1
- package/www/browser/chunk-KSHAGY2M.js +0 -399
- package/www/browser/chunk-KSHAGY2M.js.map +0 -7
- package/www/browser/chunk-KV72AKOD.js +0 -59
- package/www/browser/chunk-KV72AKOD.js.map +0 -7
- package/www/browser/chunk-LAVMY2SJ.js +0 -26
- package/www/browser/chunk-LAVMY2SJ.js.map +0 -7
- package/www/browser/chunk-LLRVGHG5.js +0 -73
- package/www/browser/chunk-LLRVGHG5.js.map +0 -7
- package/www/browser/chunk-LPME4AJ3.js +0 -196
- package/www/browser/chunk-LPME4AJ3.js.map +0 -1
- package/www/browser/chunk-LVPSURVU.js +0 -4615
- package/www/browser/chunk-LVPSURVU.js.map +0 -1
- package/www/browser/chunk-MMPO7QLO.js +0 -4146
- package/www/browser/chunk-MMPO7QLO.js.map +0 -7
- package/www/browser/chunk-O7LB6VFM.js +0 -1953
- package/www/browser/chunk-O7LB6VFM.js.map +0 -1
- package/www/browser/chunk-P5CWA4FO.js +0 -685
- package/www/browser/chunk-P5CWA4FO.js.map +0 -1
- package/www/browser/chunk-RBWIWNTL.js +0 -203
- package/www/browser/chunk-RBWIWNTL.js.map +0 -7
- package/www/browser/chunk-RUXJCM3V.js +0 -26199
- package/www/browser/chunk-RUXJCM3V.js.map +0 -1
- package/www/browser/chunk-S77VVYUZ.js +0 -168
- package/www/browser/chunk-S77VVYUZ.js.map +0 -1
- package/www/browser/chunk-SCXPYFOB.js +0 -4316
- package/www/browser/chunk-SCXPYFOB.js.map +0 -1
- package/www/browser/chunk-SS73S33S.js +0 -471
- package/www/browser/chunk-SS73S33S.js.map +0 -7
- package/www/browser/chunk-T6UAOWNP.js +0 -600
- package/www/browser/chunk-T6UAOWNP.js.map +0 -1
- package/www/browser/chunk-TEW4MY4J.js +0 -148
- package/www/browser/chunk-TEW4MY4J.js.map +0 -7
- package/www/browser/chunk-TVORF3SF.js +0 -82
- package/www/browser/chunk-TVORF3SF.js.map +0 -7
- package/www/browser/chunk-UAN42EUZ.js +0 -2147
- package/www/browser/chunk-UAN42EUZ.js.map +0 -1
- package/www/browser/chunk-ULOHDK7Y.js +0 -1
- package/www/browser/chunk-ULOHDK7Y.js.map +0 -7
- package/www/browser/chunk-UYJ3FVRV.js +0 -3978
- package/www/browser/chunk-UYJ3FVRV.js.map +0 -1
- package/www/browser/chunk-VXHZMSDM.js +0 -5509
- package/www/browser/chunk-VXHZMSDM.js.map +0 -1
- package/www/browser/chunk-VYNQPZQO.js +0 -281
- package/www/browser/chunk-VYNQPZQO.js.map +0 -1
- package/www/browser/chunk-W3J23PZI.js +0 -9213
- package/www/browser/chunk-W3J23PZI.js.map +0 -1
- package/www/browser/chunk-W5HGHCQT.js +0 -1642
- package/www/browser/chunk-W5HGHCQT.js.map +0 -7
- package/www/browser/chunk-XF5H7E4L.js +0 -4723
- package/www/browser/chunk-XF5H7E4L.js.map +0 -1
- package/www/browser/chunk-XNFNEBMY.js +0 -398
- package/www/browser/chunk-XNFNEBMY.js.map +0 -7
- package/www/browser/chunk-XQY5SPGI.js +0 -30811
- package/www/browser/chunk-XQY5SPGI.js.map +0 -1
- package/www/browser/chunk-Y7JBZHNK.js +0 -514
- package/www/browser/chunk-Y7JBZHNK.js.map +0 -1
- package/www/browser/chunk-YWHRP4X3.js +0 -406
- package/www/browser/chunk-YWHRP4X3.js.map +0 -1
- package/www/browser/chunk-Z7FJIV62.js +0 -95
- package/www/browser/chunk-Z7FJIV62.js.map +0 -7
- package/www/browser/chunk-ZBZHXS46.js +0 -1674
- package/www/browser/chunk-ZBZHXS46.js.map +0 -1
- package/www/browser/chunk-ZZA5NVAI.js +0 -735
- package/www/browser/chunk-ZZA5NVAI.js.map +0 -1
- package/www/browser/collection-modal.component.css.map +0 -7
- package/www/browser/collection-tree-item.component.css.map +0 -7
- package/www/browser/collection-tree.component.css.map +0 -7
- package/www/browser/config-change-bar-component.css.map +0 -7
- package/www/browser/config-item-component.css.map +0 -7
- package/www/browser/config-nav-component.css.map +0 -7
- package/www/browser/config-section-component.css.map +0 -7
- package/www/browser/create-summary-aside.component.css.map +0 -7
- package/www/browser/curl-actions.component.css.map +0 -7
- package/www/browser/dark.css.map +0 -7
- package/www/browser/dashboard-canvas.component.css.map +0 -7
- package/www/browser/dashboard.component.css.map +0 -7
- package/www/browser/default.css.map +0 -7
- package/www/browser/detail-item-card.component.css.map +0 -7
- package/www/browser/ellipsis-text.component.css.map +0 -7
- package/www/browser/env-modal.component.css.map +0 -7
- package/www/browser/env-picker.component.css.map +0 -7
- package/www/browser/feedback.component.css.map +0 -7
- package/www/browser/fs-explorer.component.css.map +0 -7
- package/www/browser/git-import-modal.component.css.map +0 -7
- package/www/browser/hub-v2-personal-token-modal.component.css.map +0 -7
- package/www/browser/issue-action-area.component.css.map +0 -7
- package/www/browser/issue-add-participants-dialog.component.css.map +0 -7
- package/www/browser/issue-assign-dialog.component.css.map +0 -7
- package/www/browser/issue-attachment-area.component.css.map +0 -7
- package/www/browser/issue-base-info-area.component.css.map +0 -7
- package/www/browser/issue-branches.component.css.map +0 -7
- package/www/browser/issue-close-dialog.component.css.map +0 -7
- package/www/browser/issue-collaborators-panel.component.css.map +0 -7
- package/www/browser/issue-comment-editor.component.css.map +0 -7
- package/www/browser/issue-create-branch-dialog.component.css.map +0 -7
- package/www/browser/issue-description-area.component.css.map +0 -7
- package/www/browser/issue-detail.component.css.map +0 -7
- package/www/browser/issue-resolve-dialog.component.css.map +0 -7
- package/www/browser/issue-start-own-branch-dialog.component.css.map +0 -7
- package/www/browser/issues-list-table.component.css.map +0 -7
- package/www/browser/issues.component.css.map +0 -7
- package/www/browser/kill-port-widget.component.css.map +0 -7
- package/www/browser/kv-table.component.css.map +0 -7
- package/www/browser/layout-footer.component.css.map +0 -7
- package/www/browser/layout-header.component.css.map +0 -7
- package/www/browser/layout-menu.component.css.map +0 -7
- package/www/browser/layout-project-nav.component.css.map +0 -7
- package/www/browser/layout-sidebar.component.css.map +0 -7
- package/www/browser/layout.component.css.map +0 -7
- package/www/browser/less-viewport-component.css.map +0 -7
- package/www/browser/main.js +0 -1872
- package/www/browser/main.js.map +0 -1
- package/www/browser/markdown-viewer.component.css.map +0 -7
- package/www/browser/news-feed-widget.component.css.map +0 -7
- package/www/browser/ng-devtool.component.css.map +0 -7
- package/www/browser/nginx-config-editor.component.css.map +0 -7
- package/www/browser/nginx-log-viewer.component.css.map +0 -7
- package/www/browser/nginx-secondary-logs-tab.component.css.map +0 -7
- package/www/browser/nginx-secondary-perf-tab.component.css.map +0 -7
- package/www/browser/nginx-secondary-settings-tab.component.css.map +0 -7
- package/www/browser/nginx-secondary-ssl-tab.component.css.map +0 -7
- package/www/browser/nginx-secondary-test-tab.component.css.map +0 -7
- package/www/browser/nginx-secondary-traffic-tab.component.css.map +0 -7
- package/www/browser/nginx-secondary-upstream-tab.component.css.map +0 -7
- package/www/browser/nginx-section-card.component.css.map +0 -7
- package/www/browser/nginx-server-drawer.component.css.map +0 -7
- package/www/browser/nginx-server-list.component.css.map +0 -7
- package/www/browser/nginx-stat-card.component.css.map +0 -7
- package/www/browser/nginx.component.css.map +0 -7
- package/www/browser/page-layout.component.css.map +0 -7
- package/www/browser/pick-workspace-modal.component.css.map +0 -7
- package/www/browser/polyfills.js +0 -26584
- package/www/browser/polyfills.js.map +0 -7
- package/www/browser/project-conf.component.css.map +0 -7
- package/www/browser/project-create-modal.component.css.map +0 -7
- package/www/browser/project-create.component.css.map +0 -7
- package/www/browser/project-deps.component.css.map +0 -7
- package/www/browser/project-edit-modal.component.css.map +0 -7
- package/www/browser/project-import.component.css.map +0 -7
- package/www/browser/project-item-popover.component.css.map +0 -7
- package/www/browser/project-item.component.css.map +0 -7
- package/www/browser/project-list.component.css.map +0 -7
- package/www/browser/projects.component.css.map +0 -7
- package/www/browser/quick-task-widget.component.css.map +0 -7
- package/www/browser/rd-action-area.component.css.map +0 -7
- package/www/browser/rd-advance-stage-dialog.component.css.map +0 -7
- package/www/browser/rd-block-dialog.component.css.map +0 -7
- package/www/browser/rd-create-dialog.component.css.map +0 -7
- package/www/browser/rd-detail.component.css.map +0 -7
- package/www/browser/rd-item-card.component.css.map +0 -7
- package/www/browser/rd-list-board.component.css.map +0 -7
- package/www/browser/rd-list-table.component.css.map +0 -7
- package/www/browser/rd.component.css.map +0 -7
- package/www/browser/request-collections.component.css.map +0 -7
- package/www/browser/request-editor.component.css.map +0 -7
- package/www/browser/request-list-item.component.css.map +0 -7
- package/www/browser/request-list.component.css.map +0 -7
- package/www/browser/request-tabs-bar.component.css.map +0 -7
- package/www/browser/request-tabs.component.css.map +0 -7
- package/www/browser/request-urlbar.component.css.map +0 -7
- package/www/browser/response-viewer.component.css.map +0 -7
- package/www/browser/scripts.js +0 -245
- package/www/browser/scripts.js.map +0 -7
- package/www/browser/setting.component.css.map +0 -7
- package/www/browser/sprite-conf-modal.component.css.map +0 -7
- package/www/browser/sprite-icons-panel-component.css.map +0 -7
- package/www/browser/sprite-images-panel-component.css.map +0 -7
- package/www/browser/sprite-result-tabs.component.css.map +0 -7
- package/www/browser/sprite-viewport-component.css.map +0 -7
- package/www/browser/sprite.component.css.map +0 -7
- package/www/browser/step-advance.component.css.map +0 -7
- package/www/browser/step-basic.component.css.map +0 -7
- package/www/browser/step-config.component.css.map +0 -7
- package/www/browser/step-features.component.css.map +0 -7
- package/www/browser/step-preset.component.css.map +0 -7
- package/www/browser/step-summary-aside.component.css.map +0 -7
- package/www/browser/styles.css +0 -258
- package/www/browser/styles.css.map +0 -7
- package/www/browser/system-log.component.css.map +0 -7
- package/www/browser/task-actions.component.css.map +0 -7
- package/www/browser/task-console.component.css.map +0 -7
- package/www/browser/task-header.component.css.map +0 -7
- package/www/browser/task-list.component.css.map +0 -7
- package/www/browser/tasks.component.css.map +0 -7
- package/www/browser/terminal-view.component.css.map +0 -7
- package/www/browser/welcome-widget.component.css.map +0 -7
- package/www/browser/widget-base.component.css.map +0 -7
- package/www/browser/widget-host.component.css.map +0 -7
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["angular:jit:style:inline:src\\app\\pages\\projects\\projects.component.ts;CiAgICAucGFnZXsgZGlzcGxheTpmbGV4OyBmbGV4LWRpcmVjdGlvbjpjb2x1bW47IGhlaWdodDoxMDAlOyB9CiAgICAuaGVhZGVyewogICAgICBkaXNwbGF5OmZsZXg7CiAgICAgIGFsaWduLWl0ZW1zOmNlbnRlcjsKICAgICAganVzdGlmeS1jb250ZW50OmNlbnRlcjsKICAgICAgZmxleDowIDAgYXV0bzsKICAgICAgcGFkZGluZzoxNnB4IDA7CiAgICAgIGgyewogICAgICAgIG1hcmdpbjowOwogICAgICB9CiAgICB9CiAgICBuei10YWJzLnRhYnMtY29udGFpbmVyewogICAgICBmbGV4OjEgMSBhdXRvOwogICAgICBoZWlnaHQ6MDsKICAgICAgJjo6bmctZGVlcCAuYW50LXRhYnMtY29udGVudHsKICAgICAgICAgIGhlaWdodDoxMDAlOwogICAgICAgICAgLmFudC10YWJzLXRhYnBhbmV7CiAgICAgICAgICAgIGhlaWdodDoxMDAlOwogICAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAudG9vbGJhciBpbnB1dHsgZmxleDoxOyB9CiAgICAuY3VycmVudHsgbWFyZ2luOjEwcHggMDsgb3BhY2l0eTouNzU7IH0KICA=", "angular:jit:style:inline:src\\app\\pages\\projects\\project-create\\project-create.component.ts;CiAgICAucGFnZSB7CiAgICAgIHdpZHRoOiAxMDAlOwogICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgIC5leHBsb3Jlci1jb250YWluZXIgewogICAgICAgIGZsZXg6IDEgMSBhdXRvOwogICAgICAgIGhlaWdodDogMDsKICAgICAgfQogICAgICAuYWN0aW9ucy1iYXIgewogICAgICAgIGZsZXg6IDAgMCBhdXRvOwogICAgICAgIHBhZGRpbmc6IDE2cHg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICB9CiAgICB9CiAgICA=", "angular:jit:style:inline:src\\app\\pages\\projects\\project-create\\project-create-modal.component.ts;Ci5jb250ZW50IHsKICBkaXNwbGF5OiBncmlkOwogIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDM2MHB4OwogIGdhcDogMTZweDsKICBtYXJnaW4tdG9wOiAxNnB4Owp9CgoubWFpbiB7CiAgbWluLWhlaWdodDogNDIwcHg7Cn0KCi5hY3Rpb25zIHsKICBkaXNwbGF5OiBmbGV4OwogIGdhcDogOHB4OwogIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgbWFyZ2luLXRvcDogMThweDsKfQoKLmFzaWRlIHsKICBwb3NpdGlvbjogc3RpY2t5OwogIHRvcDogMTZweDsKICBoZWlnaHQ6IGZpdC1jb250ZW50Owp9CiAgICA=", "angular:jit:style:inline:src\\app\\pages\\projects\\components\\create-summary-aside.component.ts;CiAgICAuaXRlbSB7IGRpc3BsYXk6ZmxleDsganVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47IGdhcDogMTBweDsgcGFkZGluZzogNnB4IDA7YWxpZ24taXRlbXM6IGNlbnRlcjsgfQogICAgLmsgeyBvcGFjaXR5OiAuNzsgd2lkdGg6IDkwcHg7Zm9udC1zaXplOiAxNHB4OyB9CiAgICAudiB7IHRleHQtYWxpZ246IHJpZ2h0OyBmbGV4OiAxO292ZXJmbG93OiBoaWRkZW47IHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOyB3aGl0ZS1zcGFjZTogbm93cmFwOyB9CiAgICAubW9ubyB7IGZvbnQtZmFtaWx5OiB1aS1tb25vc3BhY2UsIFNGTW9uby1SZWd1bGFyLCBNZW5sbywgTW9uYWNvLCBDb25zb2xhcywgIkxpYmVyYXRpb24gTW9ubyIsIG1vbm9zcGFjZTsgd29yZC1icmVhazogYnJlYWstYWxsOyB9CiAgICAuc2VwIHsgaGVpZ2h0OiAxcHg7IGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsLjA2KTsgbWFyZ2luOiAxMHB4IDA7IH0KICAgIC50YWcgeyBtYXJnaW4tdG9wOiA4cHg7IHRleHQtYWxpZ246IHJpZ2h0OyB9CiAgICAud2FybiB7IG1hcmdpbi10b3A6IDEwcHg7IGZvbnQtc2l6ZTogMTJweDsgY29sb3I6ICNkNDZiMDg7IH0KICA=", "src/app/pages/projects/components/create-summary-aside.component.ts", "angular:jit:style:inline:src\\app\\pages\\projects\\components\\pick-workspace-modal.component.ts;CiAgICAud3JhcCB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogMTJweDsgfQogICAgLmhpbnQgeyBvcGFjaXR5OiAuODU7IH0KICAgIC50b29sYmFyIHsgbWFyZ2luLXRvcDogNHB4OyB9CiAgICBuei1yYWRpby1ncm91cCB7IHdpZHRoOiAxMDAlOyB9CiAgICAubGlzdCB7CiAgICAgIGhlaWdodDogMjQwcHg7CiAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICBwYWRkaW5nOiA4cHg7CiAgICAgIGJvcmRlcjogdmFyKC0tYXBwLWJvcmRlci1jb2xvcik7CiAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIH0KICAgIC5pdGVtIHsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgZ2FwOiA4cHg7CiAgICAgIHBhZGRpbmc6IDEycHggMTJweDsKICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICBtYXJnaW46IDBweDsKICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICY6aG92ZXJ7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYXBwLXByaW1hcnktMyk7CiAgICAgIH0KICAgICAgOjpuZy1kZWVwIC5hbnQtcmFkaW8rc3BhbnsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGdhcDogMTJweDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGZsZXg6IDEgMSBhdXRvOwogICAgICAgIHdpZHRoOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KICAgIH0KICAgIC5wYXRoe2Rpc3BsYXk6ZmxleDtnYXA6MTJweDsgZmxleDogMSAxIGF1dG87IHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOyB3aGl0ZS1zcGFjZTogbm93cmFwOyB3aWR0aDogMDsgb3ZlcmZsb3c6IGhpZGRlbjt9CiAgICAucGF0aCAudmFsdWV7IAogICAgICBmb250LWZhbWlseTogdWktbW9ub3NwYWNlLCBTRk1vbm8tUmVndWxhciwgTWVubG8sIE1vbmFjbywgQ29uc29sYXMsICJMaWJlcmF0aW9uIE1vbm8iLCAiQ291cmllciBOZXciLCBtb25vc3BhY2U7IAogICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgZmxleDogMSAxIGF1dG87CiAgICAgIHdpZHRoOiAwOwogICAgICBvdmVyZmxvdzogaGlkZGVuOwogIH0KICAgIC5hY3Rpb25zIHsgZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsgZ2FwOiA4cHg7IG1hcmdpbi10b3A6IDRweDsgfQogIA==", "src/app/pages/projects/components/pick-workspace-modal.component.ts", "angular:jit:style:inline:src\\app\\pages\\projects\\components\\step-basic.component.ts;CiAgICAuaGludCB7IG1hcmdpbi10b3A6IDZweDsgZm9udC1zaXplOiAxMnB4OyBvcGFjaXR5OiAuNzsgfQogICAgLnN3aXRjaC1yb3cgeyBkaXNwbGF5OmZsZXg7IGFsaWduLWl0ZW1zOmNlbnRlcjsganVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47IHBhZGRpbmctYm90dG9tOiAgNHB4OyBzcGFue2ZvbnQtc2l6ZToxNHB4O30gfQogICAgLmVtaXQgeyBtYXJnaW4tdG9wOiA4cHg7IH0KICA=", "src/app/pages/projects/components/step-basic.component.ts", "angular:jit:style:inline:src\\app\\pages\\projects\\components\\step-config.component.ts;CiAgICAucm93IHsgZGlzcGxheTpmbGV4OyBhbGlnbi1pdGVtczpjZW50ZXI7IGp1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuOyBwYWRkaW5nOiAxMHB4IDA7IH0KICAgIC5yb3cuY29sIHsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IGdhcDogOHB4OyB9CiAgICAubGFiZWwgeyBmb250LXdlaWdodDogNTAwOyB9CiAgICAuaGludCB7IGZvbnQtc2l6ZTogMTJweDsgb3BhY2l0eTogLjc7IH0KICA=", "src/app/pages/projects/components/step-config.component.ts", "angular:jit:style:inline:src\\app\\pages\\projects\\components\\step-features.component.ts;CiAgICAucm93IHsgZGlzcGxheTpmbGV4OyBhbGlnbi1pdGVtczpjZW50ZXI7IGp1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuOyBwYWRkaW5nOiAxMHB4IDA7IH0KICAgIC5sYWJlbCB7IGZvbnQtd2VpZ2h0OiA1MDA7IH0KICA=", "src/app/pages/projects/components/step-features.component.ts", "angular:jit:style:inline:src\\app\\pages\\projects\\components\\step-preset.component.ts;CiAgICAua3YgeyBkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7IGdhcDogOHB4IDEycHg7IH0KICAgIC5rIHsgb3BhY2l0eTogLjc7IGRpc3BsYXk6aW5saW5lLWJsb2NrOyB3aWR0aDogMTIwcHg7IH0KICAgIC5vcHQgeyBtYXJnaW4tdG9wOiAxMHB4OyB9CiAgICBuei1yYWRpby1ncm91cCB7IHdpZHRoOiAxMDAlOyB9CiAgICBbbnotcmFkaW9dIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nOiAxMnB4IDEycHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1hcmdpbjowOwogICAgICAgICY6aG92ZXJ7CiAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHAtcHJpbWFyeS0zKTsKICAgICAgICB9CiAgICB9CiAgICAuaGludCB7CiAgICAgIG1hcmdpbi1sZWZ0OiAyNHB4OwogICAgICBmb250LXNpemU6IDEycHg7CiAgICAgIG9wYWNpdHk6IC43NTsKICAgIH0KICA=", "angular:jit:style:inline:src\\app\\pages\\projects\\components\\git-import-modal.component.ts;CiAgICAgIC5oaW50IHsgbWFyZ2luLXRvcDogNnB4OyBmb250LXNpemU6IDEycHg7IG9wYWNpdHk6IC43OyB9CiAgICA=", "src/app/pages/projects/components/git-import-modal.component.ts", "src/app/pages/projects/components/step-preset.component.ts", "src/app/pages/projects/models/project-draft.ts", "src/app/pages/projects/project-create/project-create-modal.component.ts", "src/app/pages/projects/project-create/project-create.component.ts", "angular:jit:style:inline:src\\app\\pages\\projects\\project-import\\project-import.component.ts;CiAgICAucGFnZSB7CiAgICAgIHdpZHRoOiAxMDAlOwogICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CgogICAgICAuZXhwbG9yZXItY29udGFpbmVyIHsKICAgICAgICBmbGV4OiAxIDEgYXV0bzsKICAgICAgICBoZWlnaHQ6IDA7CiAgICAgIH0KCiAgICAgIC5hY3Rpb25zLWJhciB7CiAgICAgICAgZmxleDogMCAwIGF1dG87CiAgICAgICAgcGFkZGluZzogMTZweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIH0KICAgIH0KICA=", "src/app/pages/projects/services/project-import.state.service.ts", "src/app/pages/projects/project-import/project-import.component.ts", "angular:jit:style:inline:src\\app\\pages\\projects\\project-list\\project-list.component.ts;CiAgOmhvc3R7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGhlaWdodDogMTAwJTsKICAgIG92ZXJmbG93OmhpZGRlbjsKICB9CiAgICAucGFnZSB7CiAgICAgIGhlaWdodDoxMDAlOwogICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAudG9wYmFyewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTJweDsKICAgICAgICBuei1pbnB1dC13cmFwcGVyewogICAgICAgICAgd2lkdGg6MjUlOwogICAgICAgICAgbWluLXdpZHRoOjIwMHB4OwogICAgICAgIH0KICAgICAgfQogICAgICAuY29sewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgfQogICAgfQogICAgLmhlYWRlciB7CiAgICAgIHBhZGRpbmc6IDEycHggMDsKICAgICAgaDJ7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgIH0KICAgIH0gIAogIA==", "angular:jit:style:inline:src\\app\\pages\\projects\\project-list\\project-item.component.ts;CiAgICAucHJvamVjdC1pdGVtewogICAgICBib3JkZXItcmFkaXVzOjRweDsKICAgICAgcGFkZGluZzowOwogICAgICBtYXJnaW46OHB4IDA7CiAgICAgIHRyYW5zaXRpb246YWxsIC4zczsKICAgICAgY3Vyc29yOnBvaW50ZXI7CiAgICAgICYub3BlbiwgJjpob3ZlcnsKICAgICAgICBib3gtc2hhZG93OjAgNHB4IDEycHggcmdiYSgwLDAsMCwuMSk7CiAgICAgICAgYmFja2dyb3VuZDp2YXIoLS1hcHAtcHJpbWFyeS0zKTsKICAgICAgfQogICAgICAuY29udGVudHsKICAgICAgICAgIHBhZGRpbmc6IDE2cHg7CiAgICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBhdXRvIDFmciBhdXRvOwogICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiBhdXRvOwogICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1hcmVhczogImljb24gaW5mbyBhY3Rpb25zIjsKICAgICAgICAgIGdyaWQtZ2FwOiAxNnB4OwogICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKCiAgICAgICAgLmZhdm9yaXRlewogICAgICAgICAgZ3JpZC1hcmVhOiBpY29uOwogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICB9CiAgICAgICAgLmluZm97CiAgICAgICAgICBncmlkLWFyZWE6IGluZm87CiAgICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAgIC5saXN0LWl0ZW0taW5mbyB7CiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoOwogICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAgICAgZ2FwOiA0cHg7CiAgICAgICAgICAgIC5uYW1lewogICAgICAgICAgICAgIGZsZXg6IGF1dG8gMCAwOwogICAgICAgICAgICAgIC50YXNrLXBvcG92ZXItdHJpZ2dlcnsKICAgICAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiA4cHg7CiAgICAgICAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgICAgICAgICBuei1iYWRnZSB7CiAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZToxOHB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAucm9vdC1wYXRoewogICAgICAgICAgICAgIGZsZXg6YXV0byAwIDA7CiAgICAgICAgICAgICAgb3BhY2l0eTowLjc7CiAgICAgICAgICAgICAgZm9udC1zaXplOjE0cHg7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgfQogICAg", "angular:jit:style:inline:src\\app\\pages\\projects\\project-list\\project-item-popover.component.ts;CiAgICAuZHJvcGRvd24tY29udGVudHsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgLnBhbmUtdG9vbGJhcnsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBwYWRkaW5nOiA2cHggNnB4IDZweCAxNnB4OwogICAgICAgICY+KnsKICAgICAgICAgIGZsZXg6IGF1dG8gMCAwOwogICAgICAgIH0KICAgICAgICAuaWNvbnsKICAgICAgICAgIGZvbnQtc2l6ZToxOHB4OwogICAgICAgICAgbWFyZ2luLXJpZ2h0OjZweDsKICAgICAgICB9CiAgICAgICAgLnRpdGxlewogICAgICAgICAgZmxleDogMTAwJSAxIDE7CiAgICAgICAgICB3aWR0aDogMDsKICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgICAtbXMtdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgfQogICAgICB9CiAgICAgIC50YXNrc3sKICAgICAgICB3aWR0aDozMjBweDsKICAgICAgICBtYXgtaGVpZ2h0OjM2MHB4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW4gYXV0bzsKICAgICAgICAudGFzay1pdGVtewogICAgICAgICAgcGFkZGluZzoxNnB4OwogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgJjpob3ZlcnsKICAgICAgICAgICAgYmFja2dyb3VuZDojZjVmNWY1OwogICAgICAgICAgfQogICAgICAgICAgLml0ZW0tY29udGVudHsKICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgICAgZmxleDogMTAwJSAxIDE7CiAgICAgICAgICAgIHdpZHRoOiAwOwogICAgICAgICAgICBnYXA6MTZweDsKICAgICAgICAgICAgY3Vyc29yOnBvaW50ZXI7CiAgICAgICAgICB9CiAgICAgICAgICAuaXRlbS1sb2dvewogICAgICAgICAgICBmb250LXNpemU6NDJweDsKICAgICAgICAgICAgbWFyZ2luLXJpZ2h0OjE2cHg7CiAgICAgICAgICAgIGZsZXg6IGF1dG8gMCAwOwogICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgIH0KICAgICAgICAgIC5saXN0LWl0ZW0taW5mbyB7CiAgICAgICAgICAgIGZsZXg6IDEwMCUgMSAxOwogICAgICAgICAgICB3aWR0aDogMDsKICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7CiAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgICAgICAuZGVzY3JpcHRpb257CiAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBidXR0b257CiAgICAgICAgICAgIGZsZXg6IGF1dG8gMCAwOwogICAgICAgICAgICBuei1pY29uewogICAgICAgICAgICAgIGZvbnQtc2l6ZToyNHB4OwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIA==", "src/app/pages/projects/project-list/project-item-popover.component.ts", "src/app/pages/projects/project-list/project-item.component.ts", "src/app/pages/projects/project-list/project-list.component.ts", "src/app/pages/projects/projects.component.ts", "src/app/pages/projects/projects-routing-module.ts", "src/app/pages/projects/projects-module.ts"],
|
|
4
|
-
"sourcesContent": ["/* angular:styles/component:less;c888d95f0f1c03d48acbd77e7a69222f632f71519933c044ef57049f59437e4f;D:\\ng-manager\\webapp\\src\\app\\pages\\projects\\projects.component.ts */\n.page {\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n.header {\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n padding: 16px 0;\n}\n.header h2 {\n margin: 0;\n}\nnz-tabs.tabs-container {\n flex: 1 1 auto;\n height: 0;\n}\nnz-tabs.tabs-container::ng-deep .ant-tabs-content {\n height: 100%;\n}\nnz-tabs.tabs-container::ng-deep .ant-tabs-content .ant-tabs-tabpane {\n height: 100%;\n}\n.toolbar input {\n flex: 1;\n}\n.current {\n margin: 10px 0;\n opacity: 0.75;\n}\n/*# sourceMappingURL=projects.component.css.map */\n", "/* angular:styles/component:less;003575e58b854dd1fdaf850e4326fd39c8526898617c02cd1a264a93e9dd8880;D:\\ng-manager\\webapp\\src\\app\\pages\\projects\\project-create\\project-create.component.ts */\n.page {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n}\n.page .explorer-container {\n flex: 1 1 auto;\n height: 0;\n}\n.page .actions-bar {\n flex: 0 0 auto;\n padding: 16px;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n/*# sourceMappingURL=project-create.component.css.map */\n", "/* angular:styles/component:less;b740667e2965cfbb9a634af2a88325b1f382881a4d1d8f0cbbcd4fc192f0d251;D:\\ng-manager\\webapp\\src\\app\\pages\\projects\\project-create\\project-create-modal.component.ts */\n.content {\n display: grid;\n grid-template-columns: 1fr 360px;\n gap: 16px;\n margin-top: 16px;\n}\n.main {\n min-height: 420px;\n}\n.actions {\n display: flex;\n gap: 8px;\n justify-content: flex-end;\n margin-top: 18px;\n}\n.aside {\n position: sticky;\n top: 16px;\n height: fit-content;\n}\n/*# sourceMappingURL=project-create-modal.component.css.map */\n", "/* angular:styles/component:less;b9ffde9aa18883857097dda339cdf9d1c94b1bdcae063459df7d83fbab96d96c;D:\\ng-manager\\webapp\\src\\app\\pages\\projects\\components\\create-summary-aside.component.ts */\n.item {\n display: flex;\n justify-content: space-between;\n gap: 10px;\n padding: 6px 0;\n align-items: center;\n}\n.k {\n opacity: 0.7;\n width: 90px;\n font-size: 14px;\n}\n.v {\n text-align: right;\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.mono {\n font-family:\n ui-monospace,\n SFMono-Regular,\n Menlo,\n Monaco,\n Consolas,\n \"Liberation Mono\",\n monospace;\n word-break: break-all;\n}\n.sep {\n height: 1px;\n background: rgba(0, 0, 0, 0.06);\n margin: 10px 0;\n}\n.tag {\n margin-top: 8px;\n text-align: right;\n}\n.warn {\n margin-top: 10px;\n font-size: 12px;\n color: #d46b08;\n}\n/*# sourceMappingURL=create-summary-aside.component.css.map */\n", "import { ChangeDetectionStrategy, ChangeDetectorRef, Component, inject, Input, model, OnChanges, SimpleChanges, ViewChild } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { NzCardModule } from 'ng-zorro-antd/card';\r\nimport { NzTagModule } from 'ng-zorro-antd/tag';\r\n\r\nimport { CreateProjectDraft } from '../models/project-draft';\r\nimport { NzTooltipModule } from 'ng-zorro-antd/tooltip';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\n\r\nimport { Clipboard } from '@angular/cdk/clipboard';\r\nimport { TerminalViewComponent } from '@app/shared';\r\nimport { NzDrawerModule } from 'ng-zorro-antd/drawer';\r\n\r\n@Component({\r\n standalone: true,\r\n selector: 'app-create-summary-aside',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [CommonModule, NzCardModule, NzTagModule, NzTooltipModule, NzIconModule, NzButtonModule, TerminalViewComponent, NzDrawerModule],\r\n template: `\r\n <!--[nzExtra]=\"isCreating() ? logActions : undefined\"-->\r\n <nz-card nzTitle=\"摘要\" nzSize=\"small\" [nzExtra]=\"logActions\">\r\n <div class=\"item\"><span class=\"k\">名称</span><span class=\"v\">{{draft.name || '-'}}</span></div>\r\n <div class=\"item\"><span class=\"k\">路径</span><span class=\"v mono\">{{draft.rootPath || '-'}}</span></div>\r\n <div class=\"item\"><span class=\"k\">包管理器</span><span class=\"v\">{{draft.packageManager}}</span></div>\r\n <div class=\"item\">\r\n <span class=\"k\">Git 远程仓库</span>\r\n <span class=\"v\" [nz-tooltip]=\"draft.repoUrl||''\">{{draft.repoUrl || '-'}}</span>\r\n @if(draft.repoUrl){\r\n <button nz-button nzType=\"text\" nzSize=\"small\" (click)=\"copy()\" [nz-tooltip]=\"copyied ? '已复制' : '复制'\">\r\n <nz-icon nzType=\"copy\" nzTheme=\"outline\" />\r\n </button>\r\n }\r\n </div>\r\n\r\n <div class=\"sep\"></div>\r\n\r\n <div class=\"item\"><span class=\"k\">框架</span><span class=\"v\">{{draft.detected?.framework || '-'}}</span></div>\r\n <div class=\"item\"><span class=\"k\">脚本命令</span><span class=\"v\">{{draft.detected?.scriptsCount ?? '-'}}</span></div>\r\n <div class=\"item\"><span class=\"k\">Git</span><span class=\"v\">{{draft.detected?.hasGit ? 'Yes' : 'No'}}</span></div>\r\n\r\n @if(draft.detected?.recommendedScript){\r\n <div class=\"tag\">\r\n <nz-tag nzColor=\"blue\">推荐:{{draft.detected?.recommendedScript}}</nz-tag>\r\n </div>\r\n }\r\n\r\n @if( draft.overwriteIfExists){\r\n <div class=\"warn\" >\r\n ⚠️ 覆盖已存在目录\r\n </div>\r\n }\r\n </nz-card>\r\n <ng-template #logActions>\r\n <button nz-button nzType=\"text\" nzSize=\"small\" (click)=\"isDrawerOpen = !isDrawerOpen\">\r\n <nz-icon nzType=\"desktop\" nzTheme=\"outline\"></nz-icon>\r\n 日志输出\r\n </button>\r\n </ng-template>\r\n \r\n <nz-drawer\r\n [nzVisible]=\"isDrawerOpen\"\r\n (nzOnClose)=\"isDrawerOpen = false\"\r\n nzTitle=\"日志\"\r\n [nzWidth]=\"720\"\r\n nzPlacement=\"right\"\r\n [nzBodyStyle]=\"{'padding': '8px'}\"\r\n>\r\n <ng-container *nzDrawerContent>\r\n <app-terminal-view [style.height.%]=\"100\"></app-terminal-view>\r\n </ng-container>\r\n </nz-drawer>\r\n `,\r\n styles: [`\r\n .item { display:flex; justify-content:space-between; gap: 10px; padding: 6px 0;align-items: center; }\r\n .k { opacity: .7; width: 90px;font-size: 14px; }\r\n .v { text-align: right; flex: 1;overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\r\n .mono { font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", monospace; word-break: break-all; }\r\n .sep { height: 1px; background: rgba(0,0,0,.06); margin: 10px 0; }\r\n .tag { margin-top: 8px; text-align: right; }\r\n .warn { margin-top: 10px; font-size: 12px; color: #d46b08; }\r\n `]\r\n})\r\nexport class CreateSummaryAsideComponent implements OnChanges {\r\n\r\n @Input({ required: true }) draft!: CreateProjectDraft;\r\n @Input() chunk: string = '';\r\n private clipboard = inject(Clipboard);\r\n @ViewChild(TerminalViewComponent) term?: TerminalViewComponent;\r\n isDrawerOpen = false\r\n isCreating = model(false);\r\n copyied = false;\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['chunk'] && changes['chunk'].currentValue && this.term) {\r\n this.term.write(this.chunk);\r\n }\r\n if (changes['isCreating'] && changes['isCreating'].currentValue === true) {\r\n this.isDrawerOpen = true;\r\n }\r\n }\r\n copy() {\r\n const text = this.draft.repoUrl || '';\r\n this.clipboard.copy(text);\r\n this.copyied = true;\r\n setTimeout(() => {\r\n this.copyied = false;\r\n }, 2000);\r\n }\r\n}\r\n", "/* angular:styles/component:less;5287ea1b90ad59306d455dd89d080622f8924bfeb0b3ea39e3c696973b2c2deb;D:\\ng-manager\\webapp\\src\\app\\pages\\projects\\components\\pick-workspace-modal.component.ts */\n.wrap {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n.hint {\n opacity: 0.85;\n}\n.toolbar {\n margin-top: 4px;\n}\nnz-radio-group {\n width: 100%;\n}\n.list {\n height: 240px;\n overflow: auto;\n padding: 8px;\n border: var(--app-border-color);\n border-radius: 8px;\n}\n.item {\n display: flex;\n gap: 8px;\n padding: 12px 12px;\n border-radius: 8px;\n margin: 0px;\n width: 100%;\n}\n.item:hover {\n background-color: var(--app-primary-3);\n}\n.item ::ng-deep .ant-radio + span {\n display: flex;\n gap: 12px;\n align-items: center;\n flex: 1 1 auto;\n width: 0;\n padding: 0;\n}\n.path {\n display: flex;\n gap: 12px;\n flex: 1 1 auto;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 0;\n overflow: hidden;\n}\n.path .value {\n font-family:\n ui-monospace,\n SFMono-Regular,\n Menlo,\n Monaco,\n Consolas,\n \"Liberation Mono\",\n \"Courier New\",\n monospace;\n text-overflow: ellipsis;\n white-space: nowrap;\n flex: 1 1 auto;\n width: 0;\n overflow: hidden;\n}\n.actions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n margin-top: 4px;\n}\n/*# sourceMappingURL=pick-workspace-modal.component.css.map */\n", "import { CommonModule } from '@angular/common';\r\nimport { Component, computed, inject, signal } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzEmptyModule } from 'ng-zorro-antd/empty';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\nimport { NZ_MODAL_DATA, NzModalModule, NzModalRef } from 'ng-zorro-antd/modal';\r\nimport { NzRadioModule } from 'ng-zorro-antd/radio';\r\nimport { NzTagModule } from 'ng-zorro-antd/tag';\r\nimport { NzTooltipModule } from \"ng-zorro-antd/tooltip\";\r\n\r\nexport type PickWorkspaceResult = { pickedRoot: string };\r\n\r\nexport type PickWorkspaceCandidate = { path: string; kind: \"angular\" | \"vue\" };\r\n\r\nexport interface PickWorkspaceModalData {\r\n candidates: PickWorkspaceCandidate[];\r\n defaultPicked?: PickWorkspaceCandidate;\r\n}\r\n\r\n@Component({\r\n selector: 'app-pick-workspace-modal',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n NzModalModule,\r\n NzInputModule,\r\n NzRadioModule,\r\n NzButtonModule,\r\n NzIconModule,\r\n NzEmptyModule,\r\n NzTagModule,\r\n NzTooltipModule\r\n ],\r\n template: `\r\n <div class=\"wrap\">\r\n <div class=\"hint\">\r\n 检测到该仓库可能包含多个前端工作区(Angular / Vue 等)。请选择一个目录继续导入:\r\n </div>\r\n\r\n <div class=\"toolbar\">\r\n <nz-input-wrapper>\r\n <input nz-input placeholder=\"过滤路径(关键字)\" [(ngModel)]=\"keyword\" />\r\n <nz-icon nzType=\"search\" nzTheme=\"outline\" nzSuffix />\r\n </nz-input-wrapper>\r\n </div>\r\n\r\n <div class=\"list\">\r\n @if (filtered().length === 0) {\r\n <nz-empty nzNotFoundContent=\"没有匹配的目录\"></nz-empty>\r\n } @else {\r\n <nz-radio-group [(ngModel)]=\"selectedPath\" nzSize=\"large\">\r\n @for (p of filtered(); track p) {\r\n <div nz-radio [nzValue]=\"p.path\" class=\"item\">\r\n <div class=\"path\">\r\n <div class=\"value\" [nz-tooltip]=\"p.path\" nzTooltipPlacement=\"top\">{{ p.path }}</div>\r\n @let kind = p.kind;\r\n @if(kind) {\r\n <nz-tag [nzColor]=\"kind==='angular' ? '#dd0031' : kind==='vue' ? '#42b883' : '#108ee9'\" nzMode=\"default\">\r\n {{ p.kind | titlecase }} \r\n </nz-tag>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </nz-radio-group>\r\n }\r\n </div>\r\n\r\n <div class=\"actions\">\r\n <button nz-button (click)=\"cancel()\">\r\n <nz-icon nzType=\"close\" nzTheme=\"outline\" />\r\n 取消\r\n </button>\r\n\r\n <button\r\n nz-button\r\n nzType=\"primary\"\r\n [disabled]=\"!selectedPath()\"\r\n (click)=\"ok()\"\r\n >\r\n <nz-icon nzType=\"check\" nzTheme=\"outline\" />\r\n 选中并继续\r\n </button>\r\n </div>\r\n </div>\r\n `,\r\n styles: [`\r\n .wrap { display: flex; flex-direction: column; gap: 12px; }\r\n .hint { opacity: .85; }\r\n .toolbar { margin-top: 4px; }\r\n nz-radio-group { width: 100%; }\r\n .list {\r\n height: 240px;\r\n overflow: auto;\r\n padding: 8px;\r\n border: var(--app-border-color);\r\n border-radius: 8px;\r\n }\r\n .item {\r\n display: flex;\r\n gap: 8px;\r\n padding: 12px 12px;\r\n border-radius: 8px;\r\n margin: 0px;\r\n width: 100%;\r\n &:hover{\r\n background-color: var(--app-primary-3);\r\n }\r\n ::ng-deep .ant-radio+span{\r\n display: flex;\r\n gap: 12px;\r\n align-items: center;\r\n flex: 1 1 auto;\r\n width: 0;\r\n padding: 0;\r\n }\r\n }\r\n .path{display:flex;gap:12px; flex: 1 1 auto; text-overflow: ellipsis; white-space: nowrap; width: 0; overflow: hidden;}\r\n .path .value{ \r\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace; \r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n flex: 1 1 auto;\r\n width: 0;\r\n overflow: hidden;\r\n }\r\n .actions { display: flex; justify-content: flex-end; gap: 8px; margin-top: 4px; }\r\n `]\r\n})\r\nexport class PickWorkspaceModalComponent {\r\n\r\n readonly data = inject<PickWorkspaceModalData>(NZ_MODAL_DATA);\r\n\r\n keyword = signal<string>('');\r\n\r\n selectedPath = signal<string | null>(null);\r\n\r\n constructor(private modalRef: NzModalRef<PickWorkspaceResult | null>) { }\r\n\r\n ngOnInit() {\r\n const { candidates, defaultPicked } = this.data;\r\n const first = defaultPicked && candidates.includes(defaultPicked)\r\n ? defaultPicked\r\n : (candidates[0] ?? '');\r\n this.selectedPath.set(first?.path ?? null);\r\n }\r\n\r\n filtered = computed(() => {\r\n const kw = (this.keyword() || '').trim().toLowerCase();\r\n const list = this.data.candidates ?? [];\r\n if (!kw) return list;\r\n return list.filter(p => p.path.toLowerCase().includes(kw));\r\n });\r\n\r\n cancel() {\r\n this.modalRef.close(null);\r\n }\r\n\r\n ok() {\r\n const picked = this.selectedPath();\r\n if (!picked) return;\r\n this.modalRef.close({ pickedRoot: picked });\r\n }\r\n}\r\n\r\n", "/* angular:styles/component:less;7757dd15c89a8cad7a6825fbe9a49cf4c9a152d611cf55cbb9706b80f692f9d3;D:\\ng-manager\\webapp\\src\\app\\pages\\projects\\components\\step-basic.component.ts */\n.hint {\n margin-top: 6px;\n font-size: 12px;\n opacity: 0.7;\n}\n.switch-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding-bottom: 4px;\n}\n.switch-row span {\n font-size: 14px;\n}\n.emit {\n margin-top: 8px;\n}\n/*# sourceMappingURL=step-basic.component.css.map */\n", "import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, inject, Input, OnInit, Output } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\n\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzFormModule } from 'ng-zorro-antd/form';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\nimport { NzSelectModule } from 'ng-zorro-antd/select';\r\nimport { NzSwitchModule } from 'ng-zorro-antd/switch';\r\n\r\nimport { NzCardModule } from 'ng-zorro-antd/card';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzModalModule } from 'ng-zorro-antd/modal';\r\nimport { NzTooltipModule } from 'ng-zorro-antd/tooltip';\r\nimport { CreateProjectDraft } from '../models/project-draft';\r\nimport { FsExplorerApiService } from './fs-explorer';\r\nimport { Subject, of } from 'rxjs';\r\nimport { debounceTime, distinctUntilChanged, switchMap } from 'rxjs/operators';\r\n\r\n@Component({\r\n standalone: true,\r\n selector: 'app-step-basic',\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n NzFormModule,\r\n NzInputModule,\r\n NzButtonModule,\r\n NzSelectModule,\r\n NzSwitchModule,\r\n NzCardModule,\r\n NzTooltipModule,\r\n NzIconModule,\r\n NzModalModule\r\n ],\r\n template: `\r\n <nz-card nzTitle=\"基础设置\">\r\n <form nz-form nzLayout=\"vertical\">\r\n <nz-form-item>\r\n <nz-form-label>项目文件夹</nz-form-label>\r\n <nz-form-control>\r\n <input nz-input [(ngModel)]=\"draft.name\" name=\"name\" placeholder=\"输入项目名\" (ngModelChange)=\"recalcRoot()\"/>\r\n <div class=\"hint\">\r\n {{draft.rootPath}}\r\n @if(pathExists){ <span style=\"margin-left:8px;color:#ff4d4f;\">该路径已存在</span> }\r\n </div>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label>包管理器</nz-form-label>\r\n <nz-form-control>\r\n <nz-select [(ngModel)]=\"draft.packageManager\" name=\"pm\">\r\n <nz-option nzValue=\"auto\" nzLabel=\"默认\"></nz-option>\r\n <nz-option nzValue=\"npm\" nzLabel=\"npm\"></nz-option>\r\n <nz-option nzValue=\"pnpm\" nzLabel=\"pnpm\"></nz-option>\r\n <nz-option nzValue=\"yarn\" nzLabel=\"yarn\"></nz-option>\r\n </nz-select>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label>更多选项</nz-form-label>\r\n <nz-form-control>\r\n <div class=\"switch-row\">\r\n <span>若目标文件夹已存在则覆盖</span>\r\n <nz-switch [(ngModel)]=\"draft.overwriteIfExists\" (ngModelChange)=\"emit()\" name=\"overwrite\"></nz-switch>\r\n </div>\r\n <div class=\"switch-row\">\r\n <span>无新手指引的脚手架项目</span>\r\n <nz-switch [(ngModel)]=\"draft.skipOnboarding\" name=\"skip\"></nz-switch>\r\n </div>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label>Git</nz-form-label>\r\n <nz-form-control>\r\n <div class=\"switch-row\">\r\n <span>初始化 git 仓库(建议)</span>\r\n <nz-switch [(ngModel)]=\"draft.initGit\" name=\"initGit\"></nz-switch>\r\n </div>\r\n @if(draft.initGit){\r\n <input nz-input [(ngModel)]=\"draft.initialCommitMessage\" name=\"msg\" placeholder=\"覆盖提交信息(选填)\"/>\r\n }\r\n </nz-form-control>\r\n </nz-form-item>\r\n </form>\r\n </nz-card>\r\n `,\r\n styles: [`\r\n .hint { margin-top: 6px; font-size: 12px; opacity: .7; }\r\n .switch-row { display:flex; align-items:center; justify-content:space-between; padding-bottom: 4px; span{font-size:14px;} }\r\n .emit { margin-top: 8px; }\r\n `]\r\n})\r\nexport class StepBasicComponent implements OnInit {\r\n @Input({ required: true }) draft!: CreateProjectDraft;\r\n @Output() draftChange = new EventEmitter<CreateProjectDraft>();\r\n private pathCheck$ = new Subject<string>();\r\n pathExists = false;\r\n private fsApi = inject(FsExplorerApiService);\r\n ngOnInit(): void {\r\n this.computeRootPath();\r\n this.pathCheck$\r\n .pipe(\r\n debounceTime(200),\r\n distinctUntilChanged(),\r\n switchMap((p) => p ? this.fsApi.pathExists(p) : of(false))\r\n )\r\n .subscribe((exists) => {\r\n this.emit();\r\n this.pathExists = exists;\r\n });\r\n }\r\n\r\n recalcRoot() {\r\n this.computeRootPath();\r\n this.pathCheck$.next(this.draft.rootPath);\r\n }\r\n\r\n private computeRootPath() {\r\n const parent = (this.draft.parentDir ?? \"\").replace(/[\\\\/]+$/, \"\");\r\n const name = (this.draft.name ?? \"\").trim();\r\n this.draft.rootPath = parent && name ? `${parent}/${name}`.replaceAll(\"\\\\\", \"/\") : parent;\r\n }\r\n\r\n emit() {\r\n this.draftChange.emit({ ...this.draft });\r\n }\r\n}\r\n", "/* angular:styles/component:less;472cec399461669211a54f75e5af0c1eb2faa78b6043c99572b2f0efb6cb4526;D:\\ng-manager\\webapp\\src\\app\\pages\\projects\\components\\step-config.component.ts */\n.row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 0;\n}\n.row.col {\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n}\n.label {\n font-weight: 500;\n}\n.hint {\n font-size: 12px;\n opacity: 0.7;\n}\n/*# sourceMappingURL=step-config.component.css.map */\n", "// src/app/projects/components/step-config.component.ts\r\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\n\r\nimport { NzCardModule } from 'ng-zorro-antd/card';\r\nimport { NzRadioModule } from 'ng-zorro-antd/radio';\r\nimport { NzSwitchModule } from 'ng-zorro-antd/switch';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\n\r\nimport { CreateProjectDraft } from '../models/project-draft';\r\n\r\n@Component({\r\n standalone: true,\r\n selector: 'app-step-config',\r\n imports: [CommonModule, FormsModule, NzCardModule, NzRadioModule, NzSwitchModule, NzInputModule],\r\n template: `\r\n <nz-card nzTitle=\"创建后默认行为\">\r\n <div class=\"row\">\r\n <div class=\"label\">置顶收藏</div>\r\n <nz-switch [(ngModel)]=\"draft.pinFavorite\" (ngModelChange)=\"emit()\"></nz-switch>\r\n </div>\r\n\r\n <div class=\"row col\">\r\n <!-- <div class=\"label\">创建后默认打开</div>\r\n <nz-radio-group [(ngModel)]=\"draft.openAfterCreate\" (ngModelChange)=\"emit()\">\r\n <label nz-radio nzValue=\"tasks\">Tasks</label>\r\n <label nz-radio nzValue=\"home\">Home</label>\r\n </nz-radio-group> -->\r\n </div>\r\n\r\n <div class=\"row col\">\r\n <div class=\"label\">默认任务(可选)</div>\r\n <input nz-input [(ngModel)]=\"draft.defaultTaskName\" (ngModelChange)=\"emit()\" placeholder=\"例如:dev / start\"/>\r\n <div class=\"hint\">建议填识别到的 dev 或 start</div>\r\n </div>\r\n </nz-card>\r\n `,\r\n styles: [`\r\n .row { display:flex; align-items:center; justify-content:space-between; padding: 10px 0; }\r\n .row.col { flex-direction: column; align-items: flex-start; gap: 8px; }\r\n .label { font-weight: 500; }\r\n .hint { font-size: 12px; opacity: .7; }\r\n `]\r\n})\r\nexport class StepConfigComponent {\r\n @Input({ required: true }) draft!: CreateProjectDraft;\r\n @Output() draftChange = new EventEmitter<CreateProjectDraft>();\r\n emit() { this.draftChange.emit({ ...this.draft }); }\r\n}\r\n", "/* angular:styles/component:less;a1e2162d0f20406735a955e67a37165b79f76a169f5b06c9f7656fa71c71dc6d;D:\\ng-manager\\webapp\\src\\app\\pages\\projects\\components\\step-features.component.ts */\n.row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 0;\n}\n.label {\n font-weight: 500;\n}\n/*# sourceMappingURL=step-features.component.css.map */\n", "// src/app/projects/components/step-features.component.ts\r\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\n\r\nimport { NzCardModule } from 'ng-zorro-antd/card';\r\nimport { NzSwitchModule } from 'ng-zorro-antd/switch';\r\n\r\nimport { CreateProjectDraft } from '../models/project-draft';\r\n\r\n@Component({\r\n standalone: true,\r\n selector: 'app-step-features',\r\n imports: [CommonModule, FormsModule, NzCardModule, NzSwitchModule],\r\n template: `\r\n <nz-card nzTitle=\"功能开关(Project Scope)\">\r\n <!-- <div class=\"row\">\r\n <div class=\"label\">Tasks(必选)</div>\r\n <nz-switch [(ngModel)]=\"draft.featureTasks\" [ngModelOptions]=\"{standalone:true}\" [nzDisabled]=\"true\"></nz-switch>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div class=\"label\">Processes</div>\r\n <nz-switch [(ngModel)]=\"draft.featureProcesses\" (ngModelChange)=\"emit()\"></nz-switch>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div class=\"label\">Logs</div>\r\n <nz-switch [(ngModel)]=\"draft.featureLogs\" (ngModelChange)=\"emit()\"></nz-switch>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div class=\"label\">Terminal(后续)</div>\r\n <nz-switch [(ngModel)]=\"draft.featureTerminal\" (ngModelChange)=\"emit()\" [nzDisabled]=\"true\"></nz-switch>\r\n </div> -->\r\n </nz-card>\r\n `,\r\n styles: [`\r\n .row { display:flex; align-items:center; justify-content:space-between; padding: 10px 0; }\r\n .label { font-weight: 500; }\r\n `]\r\n})\r\nexport class StepFeaturesComponent {\r\n @Input({ required: true }) draft!: CreateProjectDraft;\r\n @Output() draftChange = new EventEmitter<CreateProjectDraft>();\r\n\r\n emit() {\r\n this.draftChange.emit({ ...this.draft });\r\n }\r\n}\r\n", "/* angular:styles/component:less;d9d68b139b2e21f242c0a3ef4b2427dba36969f779de06467711c14f5184d970;D:\\ng-manager\\webapp\\src\\app\\pages\\projects\\components\\step-preset.component.ts */\n.kv {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 8px 12px;\n}\n.k {\n opacity: 0.7;\n display: inline-block;\n width: 120px;\n}\n.opt {\n margin-top: 10px;\n}\nnz-radio-group {\n width: 100%;\n}\n[nz-radio] {\n display: block;\n padding: 12px 12px;\n border-radius: 8px;\n width: 100%;\n margin: 0;\n}\n[nz-radio]:hover {\n background-color: var(--app-primary-3);\n}\n.hint {\n margin-left: 24px;\n font-size: 12px;\n opacity: 0.75;\n}\n/*# sourceMappingURL=step-preset.component.css.map */\n", "/* angular:styles/component:less;fdd001241c9b4eb1495030a95eaea3273462ba812393c82625f1814e80fca531;D:\\ng-manager\\webapp\\src\\app\\pages\\projects\\components\\git-import-modal.component.ts */\n.hint {\n margin-top: 6px;\n font-size: 12px;\n opacity: 0.7;\n}\n/*# sourceMappingURL=git-import-modal.component.css.map */\n", "import { CommonModule } from '@angular/common';\r\nimport { Component, inject } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\nimport { NZ_MODAL_DATA, NzModalModule } from 'ng-zorro-antd/modal';\r\nimport { NzSelectModule } from 'ng-zorro-antd/select';\r\n\r\n@Component({\r\n selector: 'app-git-import-modal-component',\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n NzIconModule,\r\n NzModalModule,\r\n NzInputModule,\r\n NzSelectModule,\r\n NzButtonModule\r\n ],\r\n template: `\r\n <div class=\"modal-body\">\r\n <label class=\"label\">URL</label>\r\n <nz-input-wrapper >\r\n <input\r\n nz-input\r\n [(ngModel)]=\"nzModalData.cloneUrl\"\r\n placeholder=\"请输入Git仓库地址\"\r\n autofocus\r\n />\r\n <nz-icon nzInputPrefix nzType=\"github\" nzTheme=\"outline\" />\r\n </nz-input-wrapper>\r\n <div class=\"hint\">\r\n Git 仓库地址, 如 'username/repo'. 可以使用前缀如 'gitlab:' 或 'bitbucket:'.\r\n </div>\r\n </div>\r\n `,\r\n styles: [\r\n `\r\n .hint { margin-top: 6px; font-size: 12px; opacity: .7; }\r\n `\r\n ],\r\n})\r\nexport class GitImportModalComponent {\r\n readonly nzModalData = inject<IModalData>(NZ_MODAL_DATA);\r\n isModalVisible = false;\r\n isSaving = false;\r\n}\r\n\r\ninterface IModalData {\r\n cloneUrl: string;\r\n isSaving: boolean;\r\n}\r\n", "// src/app/projects/components/step-preset.component.ts\r\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\n\r\nimport { NzCardModule } from 'ng-zorro-antd/card';\r\nimport { NzCheckboxModule } from 'ng-zorro-antd/checkbox';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzTagModule } from 'ng-zorro-antd/tag';\r\n\r\nimport { CreateProjectDraft, ProjectPreset } from '../models/project-draft';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzRadioModule } from 'ng-zorro-antd/radio';\r\nimport { GitImportModalComponent } from './git-import-modal.component';\r\nimport { NzModalService } from 'ng-zorro-antd/modal';\r\nimport { inject } from '@angular/core';\r\n\r\n@Component({\r\n standalone: true,\r\n selector: 'app-step-preset',\r\n imports: [CommonModule, FormsModule, NzCardModule, NzCheckboxModule, NzButtonModule, NzTagModule, NzIconModule, NzRadioModule],\r\n template: `\r\n <nz-card nzTitle=\"选择一套预设\" [nzExtra]=\"reloadExtraTpl\">\r\n <ng-template #reloadExtraTpl>\r\n <button nz-button nzType=\"text\" nzSize=\"small\" (click)=\"requestDetect.emit()\">\r\n <nz-icon nzType=\"reload\" nzTheme=\"outline\" />\r\n </button>\r\n </ng-template>\r\n <nz-radio-group [(ngModel)]=\"draft.preset\" (ngModelChange)=\"presetChange($event)\" nzSize=\"large\">\r\n <div nz-radio nzValue=\"angular\">\r\n <label for=\"angular\">Angular</label>\r\n <div class=\"hint\">\r\n 适用于使用 Angular 框架开发的项目,支持 Angular CLI 相关任务和配置。\r\n </div>\r\n </div>\r\n <div nz-radio nzValue=\"vue3\">\r\n <label for=\"vue3\">Vue 3</label>\r\n <div class=\"hint\">\r\n 适用于使用 Vue 3 框架开发的项目,支持 Vite 和 Vue CLI 相关任务和配置。\r\n </div>\r\n </div>\r\n <!-- <div nz-radio nzValue=\"manual\">\r\n <label for=\"manual\">手动</label>\r\n <div class=\"hint\">\r\n 不使用任何预设,手动配置项目功能和任务。\r\n </div>\r\n </div> -->\r\n <div nz-radio nzValue=\"git\">\r\n <label for=\"git\">Git导入</label>\r\n <div class=\"hint\">\r\n 从现有的 Git 仓库导入项目,自动识别项目结构和配置。\r\n </div>\r\n </div>\r\n </nz-radio-group>\r\n </nz-card>\r\n <!-- <nz-card nzTitle=\"识别结果\" [nzExtra]=\"extraTpl\">\r\n <ng-template #extraTpl>\r\n <button nz-button nzSize=\"small\" (click)=\"requestDetect.emit()\">重新识别</button>\r\n </ng-template>\r\n\r\n <div class=\"kv\">\r\n <div><span class=\"k\">Framework</span><span class=\"v\">{{draft.detected?.framework || 'unknown'}}</span></div>\r\n <div><span class=\"k\">package.json</span><span class=\"v\">{{draft.detected?.hasPackageJson ? 'Yes' : 'No'}}</span></div>\r\n <div><span class=\"k\">scripts</span><span class=\"v\">{{draft.detected?.scriptsCount ?? 0}}</span></div>\r\n <div><span class=\"k\">lockfile</span><span class=\"v\">{{draft.detected?.lockFile || 'none'}}</span></div>\r\n <div><span class=\"k\">git</span><span class=\"v\">{{draft.detected?.hasGit ? 'Yes' : 'No'}}</span></div>\r\n @if(draft.detected?.recommendedScript){\r\n <div>\r\n <span class=\"k\">推荐运行</span>\r\n <span class=\"v\"><nz-tag nzColor=\"blue\">{{draft.detected?.recommendedScript}}</nz-tag></span>\r\n </div>\r\n }\r\n </div>\r\n </nz-card> -->\r\n\r\n <!-- <nz-card nzTitle=\"导入内容\" style=\"margin-top:12px;\">\r\n <label nz-checkbox [(ngModel)]=\"draft.importScriptsAsTasks\" (ngModelChange)=\"emit()\">\r\n 导入 package.json scripts 生成 Tasks(推荐)\r\n </label>\r\n @if(draft.detected?.hasMakefile){\r\n <div class=\"opt\">\r\n <label nz-checkbox [(ngModel)]=\"draft.importMakefileTasks\" (ngModelChange)=\"emit()\">\r\n 导入 Makefile 任务(可选)\r\n </label>\r\n </div>\r\n }\r\n @if(draft.detected?.hasDockerCompose){\r\n <div class=\"opt\" >\r\n <label nz-checkbox [(ngModel)]=\"draft.importDockerComposeTasks\" (ngModelChange)=\"emit()\">\r\n 导入 docker-compose 任务(可选)\r\n </label>\r\n </div>\r\n }\r\n \r\n\r\n <div class=\"opt\">\r\n <label nz-checkbox [(ngModel)]=\"draft.generateCommonTasks\" (ngModelChange)=\"emit()\">\r\n 生成通用任务模板(install / open / clean)\r\n </label>\r\n </div>\r\n </nz-card> -->\r\n `,\r\n styles: [`\r\n .kv { display: grid; grid-template-columns: 1fr 1fr; gap: 8px 12px; }\r\n .k { opacity: .7; display:inline-block; width: 120px; }\r\n .opt { margin-top: 10px; }\r\n nz-radio-group { width: 100%; }\r\n [nz-radio] {\r\n display: block;\r\n padding: 12px 12px;\r\n border-radius: 8px;\r\n width: 100%;\r\n margin:0;\r\n &:hover{\r\n background-color: var(--app-primary-3);\r\n }\r\n }\r\n .hint {\r\n margin-left: 24px;\r\n font-size: 12px;\r\n opacity: .75;\r\n }\r\n `]\r\n})\r\nexport class StepPresetComponent {\r\n @Input({ required: true }) draft!: CreateProjectDraft;\r\n @Output() draftChange = new EventEmitter<CreateProjectDraft>();\r\n @Output() requestDetect = new EventEmitter<void>();\r\n private modal = inject(NzModalService);\r\n emit() {\r\n this.draftChange.emit({ ...this.draft });\r\n }\r\n\r\n presetChange(preset: ProjectPreset) {\r\n this.draft.preset = preset;\r\n if (preset === \"git\") {\r\n this.openImportGitModal();\r\n return;\r\n } else {\r\n // 非 Git:清掉 repoUrl,回到 create 模式\r\n this.draft.repoUrl = undefined;\r\n this.emit();\r\n }\r\n }\r\n\r\n private openImportGitModal() {\r\n const modal = this.modal.create({\r\n nzTitle: '从 Git 仓库导入项目',\r\n nzMaskClosable: false,\r\n nzContent: GitImportModalComponent,\r\n nzCentered: true,\r\n nzWidth: '580px',\r\n nzClosable: false,\r\n nzData: {\r\n cloneUrl: '',\r\n isSaving: false\r\n },\r\n nzFooter: [\r\n {\r\n label: '取消', type: 'default', onClick: () => {\r\n modal.close();\r\n this.draft.repoUrl = undefined;\r\n this.draft.preset = \"angular\";\r\n this.emit();\r\n }\r\n },\r\n {\r\n label: '导入', type: 'primary', onClick: (comp: GitImportModalComponent) => {\r\n const url = comp.nzModalData.cloneUrl;\r\n const isSaving = comp.nzModalData.isSaving;\r\n if (!url || !url.trim() || isSaving) {\r\n return;\r\n }\r\n comp.nzModalData.isSaving = true;\r\n this.draft.repoUrl = url.trim();\r\n comp.nzModalData.isSaving = false;\r\n this.emit();\r\n modal.close();\r\n },\r\n disabled: (comp?: GitImportModalComponent) => {\r\n const url = comp?.nzModalData.cloneUrl;\r\n return !url || !url.trim();\r\n },\r\n loading: (comp?: GitImportModalComponent) => {\r\n const isSaving = comp?.nzModalData.isSaving;\r\n return isSaving === true;\r\n }\r\n }\r\n ]\r\n })\r\n }\r\n}\r\n", "import { DetectResult, PackageManager } from \"@models/project.model\";\r\n\r\nexport type ProjectPreset = \"angular\" | \"vue3\" | \"manual\" | \"git\";\r\n\r\nexport interface CreateProjectDraft {\r\n preset: ProjectPreset;\r\n\r\n name: string;\r\n parentDir: string; // create 模式:父目录\r\n rootPath: string; // 最终路径:parentDir + name\r\n packageManager: PackageManager;\r\n repoUrl?: string; // Git 仓库地址\r\n\r\n overwriteIfExists: boolean; // 覆盖已存在目录\r\n \r\n skipOnboarding: boolean; // 跳过新手引导\r\n\r\n initGit: boolean;\r\n initialCommitMessage?: string;\r\n\r\n detected?: DetectResult\r\n\r\n importScriptsAsTasks: boolean;\r\n importMakefileTasks: boolean;\r\n importDockerComposeTasks: boolean;\r\n generateCommonTasks: boolean;\r\n\r\n pinFavorite: boolean;\r\n defaultTaskName?: string;\r\n // cli 相关\r\n cliFramework?: \"angular\" | \"vue\";\r\n cliTool?: \"@angular/cli\" | \"@vue/cli\" | \"create-vue\" | \"custom\";\r\n cliArgs?: string[]; // 可选扩展\r\n}\r\n\r\nexport function createEmptyDraft(): CreateProjectDraft {\r\n return {\r\n preset: \"angular\", // 默认预设\r\n name: '',\r\n parentDir: '',\r\n rootPath: '',\r\n packageManager: 'auto',\r\n overwriteIfExists: false,\r\n skipOnboarding: true,\r\n initGit: true,\r\n initialCommitMessage: '',\r\n importScriptsAsTasks: true,\r\n importMakefileTasks: false,\r\n importDockerComposeTasks: false,\r\n generateCommonTasks: true,\r\n pinFavorite: false,\r\n defaultTaskName: '',\r\n\r\n cliFramework: \"angular\",\r\n cliTool: \"@angular/cli\",\r\n cliArgs: [],\r\n };\r\n}\r\n", "import { CommonModule } from '@angular/common';\r\nimport { Component, inject, OnInit, signal } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { Router } from '@angular/router';\r\nimport { TaskBootstrapDonePayload, TaskBootstrapFailedPayload, TaskBootstrapNeedPickRootPayload, TaskEventMsg, UiNotifierService } from '@app/core';\r\nimport { DetectResult } from '@models/project.model';\r\nimport { TaskStreamService } from '@pages/tasks/services/task-stream.service';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzCardModule } from 'ng-zorro-antd/card';\r\nimport { NzGridModule } from 'ng-zorro-antd/grid';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\nimport { NzModalModule, NzModalRef, NzModalService } from 'ng-zorro-antd/modal';\r\nimport { NzSpinModule } from 'ng-zorro-antd/spin';\r\nimport { NzStepsModule } from 'ng-zorro-antd/steps';\r\nimport { filter, first, firstValueFrom, Subject, Subscription, takeUntil, timeout } from 'rxjs';\r\nimport { CreateSummaryAsideComponent } from '../components/create-summary-aside.component';\r\nimport { FsExplorerService } from '../components/fs-explorer';\r\nimport { PickWorkspaceCandidate, PickWorkspaceModalComponent, PickWorkspaceResult } from '../components/pick-workspace-modal.component';\r\nimport { StepBasicComponent } from '../components/step-basic.component';\r\nimport { StepConfigComponent } from '../components/step-config.component';\r\nimport { StepFeaturesComponent } from '../components/step-features.component';\r\nimport { StepPresetComponent } from '../components/step-preset.component';\r\nimport { createEmptyDraft, CreateProjectDraft } from '../models';\r\nimport { ProjectApiService } from '../services/project-api.service';\r\nimport { ProjectStateService } from '../services/project.state.service';\r\n@Component({\r\n selector: 'app-project-create-modal',\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n NzModalModule,\r\n NzCardModule,\r\n NzGridModule,\r\n NzStepsModule,\r\n NzButtonModule,\r\n NzInputModule,\r\n NzIconModule,\r\n NzSpinModule,\r\n StepBasicComponent,\r\n StepPresetComponent,\r\n StepFeaturesComponent,\r\n StepConfigComponent,\r\n CreateSummaryAsideComponent,\r\n ],\r\n template: `\r\n <div nz-row nzJustify=\"start\">\r\n <div nz-col nzSpan=\"24\">\r\n <nz-steps [nzCurrent]=\"step()\" >\r\n <nz-step nzTitle=\"详情\"></nz-step>\r\n <nz-step nzTitle=\"预设\"></nz-step>\r\n <nz-step nzTitle=\"功能\"></nz-step>\r\n <nz-step nzTitle=\"配置\"></nz-step>\r\n </nz-steps>\r\n <div class=\"content\">\r\n <nz-spin [nzSpinning]=\"creating()\" nzTip=\"正在创建项目...\">\r\n <div class=\"main\">\r\n @switch(step()){ @case(0){\r\n <app-step-basic [draft]=\"draft()\" (draftChange)=\"setDraft($event)\" />\r\n } @case(1){\r\n <app-step-preset\r\n [draft]=\"draft()\"\r\n (draftChange)=\"setDraft($event)\"\r\n (requestDetect)=\"detectNow()\"\r\n />\r\n } @case(2){\r\n <app-step-features [draft]=\"draft()\" (draftChange)=\"setDraft($event)\" />\r\n } @case(3){\r\n <app-step-config [draft]=\"draft()\" (draftChange)=\"setDraft($event)\" />\r\n } }\r\n <div class=\"actions\">\r\n @if(step()===0){\r\n <button nz-button (click)=\"cancel()\">\r\n <nz-icon nzType=\"close\" nzTheme=\"outline\" />\r\n 取消\r\n </button>\r\n }\r\n\r\n @if(step() > 0){\r\n <button nz-button (click)=\"prev()\">\r\n <nz-icon nzType=\"arrow-left\" nzTheme=\"outline\" />\r\n 上一步\r\n </button>\r\n }\r\n\r\n @if(canCreateHere()){\r\n <button nz-button nzType=\"primary\" (click)=\"create()\" [disabled]=\"creating()\">\r\n <nz-icon nzType=\"check\" nzTheme=\"outline\" />\r\n 创建项目\r\n </button>\r\n } @else {\r\n <button nz-button nzType=\"primary\" (click)=\"next()\" [disabled]=\"!canNext() || !canGoNext()\">\r\n 下一步\r\n <nz-icon nzType=\"arrow-right\" nzTheme=\"outline\" />\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n </nz-spin>\r\n <div class=\"aside\">\r\n <app-create-summary-aside [draft]=\"draft()\" [(isCreating)]=\"creating\" [chunk]=\"output()\" />\r\n </div>\r\n </div>\r\n \r\n </div>\r\n </div>\r\n `,\r\n styles: [\r\n `\r\n.content {\r\n display: grid;\r\n grid-template-columns: 1fr 360px;\r\n gap: 16px;\r\n margin-top: 16px;\r\n}\r\n\r\n.main {\r\n min-height: 420px;\r\n}\r\n\r\n.actions {\r\n display: flex;\r\n gap: 8px;\r\n justify-content: flex-end;\r\n margin-top: 18px;\r\n}\r\n\r\n.aside {\r\n position: sticky;\r\n top: 16px;\r\n height: fit-content;\r\n}\r\n `\r\n ],\r\n})\r\nexport class ProjectCreateModal implements OnInit {\r\n step = signal(0);\r\n draft = signal<CreateProjectDraft>(createEmptyDraft());\r\n creating = signal(false);\r\n output = signal<string>('');\r\n isDrawerOpen = signal(false);\r\n private fs = inject(FsExplorerService);\r\n readonly parentDir = this.fs.currentPath();\r\n\r\n readonly modalRef = inject(NzModalRef);\r\n private api = inject(ProjectApiService);\r\n private modal = inject(NzModalService);\r\n private notify = inject(UiNotifierService);\r\n private taskStream = inject(TaskStreamService);\r\n private projectState = inject(ProjectStateService);\r\n private router = inject(Router);\r\n\r\n private sub: Subscription = new Subscription();\r\n\r\n ngOnInit(): void {\r\n const d = this.draft();\r\n const parentDir = this.parentDir;\r\n this.draft.set({ ...d, rootPath: '', parentDir, name: \"\" });\r\n }\r\n\r\n detectNow() {\r\n const d = this.draft();\r\n if (!d.rootPath?.trim()) return;\r\n this.api.detect(d.rootPath).subscribe(r => {\r\n const scripts = r.scripts ?? [];\r\n const detected: DetectResult = {\r\n framework: r.framework ?? 'unknown',\r\n hasPackageJson: !!r.hasPackageJson,\r\n scriptsCount: scripts.length,\r\n hasGit: !!r.hasGit,\r\n lockFile: r.lockFile ?? 'unknown',\r\n recommendedScript: scripts.includes('dev') ? 'dev' : (scripts.includes('start') ? 'start' : ''),\r\n hasMakefile: !!r.hasMakefile,\r\n hasDockerCompose: !!r.hasDockerCompose,\r\n };\r\n\r\n // 根据识别结果调整导入选项\r\n const importScriptsAsTasks = scripts.length > 0;\r\n const importMakefileTasks = !!r.hasMakefile;\r\n const importDockerComposeTasks = !!r.hasDockerCompose;\r\n\r\n this.draft.set({\r\n ...d,\r\n detected,\r\n importScriptsAsTasks,\r\n importMakefileTasks: importMakefileTasks && d.importMakefileTasks, // 默认不强开\r\n importDockerComposeTasks: importDockerComposeTasks && d.importDockerComposeTasks,\r\n defaultTaskName: detected.recommendedScript || d.defaultTaskName,\r\n });\r\n })\r\n }\r\n\r\n async create() {\r\n const d = this.draft();\r\n if (!d.rootPath?.trim() || !d.name?.trim()) {\r\n this.notify.error('请先完善项目信息');\r\n return;\r\n }\r\n if (this.creating()) return;\r\n let nzTitle = '确认创建项目?', nzContent = `请确认目标路径 ${d.rootPath},确定要创建该项目吗?`, nzOkText = '确认创建', nzOkDanger = false;\r\n if (d.overwriteIfExists) {\r\n nzTitle = '确认覆盖已存在的项目?';\r\n nzContent = `请确认目标路径 ${d.rootPath},创建时会覆盖原有数据,且不可恢复,确定要继续吗?`;\r\n nzOkText = '确认覆盖';\r\n nzOkDanger = true;\r\n }\r\n const modalRef = this.modal.confirm({\r\n nzTitle,\r\n nzContent,\r\n nzOkText,\r\n nzCancelText: '取消',\r\n nzOkDanger,\r\n nzCentered: true,\r\n nzOnOk: async () => {\r\n this.doCreate(d);\r\n modalRef.close();\r\n },\r\n })\r\n }\r\n\r\n private async doCreate(d: CreateProjectDraft) {\r\n this.creating.set(true);\r\n this.taskStream.ensureConnected();\r\n\r\n const destroy$ = new Subject<void>();\r\n\r\n try {\r\n // 发起 bootstrap\r\n const bootstrap$ = d.preset === 'git'\r\n ? this.api.bootstrapByGit(d)\r\n : this.api.bootstrapByCli(d);\r\n\r\n const { taskId } = await firstValueFrom(bootstrap$);\r\n\r\n // 订阅 task(用于 tail / output)\r\n this.taskStream.subscribeTask(taskId, 3000);\r\n\r\n // 监听输出(展示在 aside)\r\n this.sub.add(\r\n this.taskStream.output$(taskId).subscribe((m) => {\r\n const chunk = m.payload.text ?? '';\r\n this.output.set(chunk);\r\n })\r\n );\r\n\r\n // 等待首个关键事件:done / failed / needPick\r\n const firstEvt = await this.waitForTaskEvent(taskId, [\r\n 'bootstrapDone',\r\n 'bootstrapFailed',\r\n 'bootstrapNeedPickRoot',\r\n ], 10 * 60 * 1000, destroy$);\r\n\r\n if (firstEvt.type === 'bootstrapDone') {\r\n const payload = firstEvt.payload as TaskBootstrapDonePayload;\r\n this.notify.success('项目创建完成');\r\n this.projectState.getProjects(payload.projectId);\r\n this.modalRef.close({ ok: true });\r\n this.router.navigate(['/dashboard']);\r\n return;\r\n }\r\n\r\n if (firstEvt.type === 'bootstrapFailed') {\r\n const payload = firstEvt.payload as TaskBootstrapFailedPayload;\r\n this.notify.error(`项目创建失败:${payload?.reason ?? 'unknown error'}`);\r\n return;\r\n }\r\n\r\n // needPickRoot:打开选择框\r\n const pickPayload = firstEvt.payload as TaskBootstrapNeedPickRootPayload; // TaskBootstrapNeedPickRootPayload\r\n const candidates = pickPayload?.candidates ?? [];\r\n if (!candidates.length) {\r\n this.notify.error('项目导入失败:未找到可导入的工作区目录');\r\n return;\r\n }\r\n\r\n const pickedRoot = await this.pickWorkspaceRootByModal(candidates);\r\n if (!pickedRoot) {\r\n this.modal.info({\r\n nzTitle: '提示',\r\n nzContent: '您未选择任何目录,项目导入已取消。可通过“导入”功能重新手动导入。',\r\n nzCancelText: null,\r\n nzOkText: '我知道了',\r\n nzOnOk: () => {\r\n this.modalRef.close();\r\n }\r\n });\r\n return;\r\n }\r\n\r\n // 回传 pickedRoot(这里用 HTTP 返回 ok 即可,不依赖 WS done)\r\n const pickResult = await firstValueFrom(\r\n this.api.bootstrapPickRoot({ taskId, pickedRoot }).pipe(\r\n timeout(60 * 1000),\r\n takeUntil(destroy$),\r\n )\r\n );\r\n\r\n if (!pickResult.ok) {\r\n this.notify.error(pickResult.reason ?? '项目导入失败');\r\n return;\r\n }\r\n\r\n this.notify.success('项目导入完成');\r\n this.projectState.getProjects(pickResult.projectId);\r\n this.modalRef.close({ ok: true });\r\n this.router.navigate(['/dashboard']);\r\n\r\n // 再等最终结果:done / failed(重新订阅等待,不复用之前的 done$)\r\n // const finalEvt = await this.waitForTaskEvent(taskId, [\r\n // 'bootstrapDone',\r\n // 'bootstrapFailed',\r\n // ], 10 * 60 * 1000, destroy$);\r\n\r\n // if (finalEvt.type === 'bootstrapDone') {\r\n // const payload2 = finalEvt.payload as TaskBootstrapDonePayload;\r\n // this.notify.success('项目导入完成');\r\n // this.projectState.getProjects(payload2.projectId);\r\n // this.modalRef.close({ ok: true });\r\n // this.router.navigate(['/dashboard']);\r\n // return;\r\n // } else {\r\n // const payload2 = finalEvt.payload as TaskBootstrapFailedPayload;\r\n // this.notify.error(`项目导入失败:${payload2?.reason ?? 'unknown error'}`);\r\n // return;\r\n // }\r\n } catch (err: any) {\r\n const msg =\r\n err?.name === 'TimeoutError'\r\n ? '创建超时:脚手架/克隆可能卡住了,请查看任务日志'\r\n : (err?.error?.message || err?.message || '创建失败');\r\n console.error('创建项目失败', err);\r\n this.notify.error(msg);\r\n } finally {\r\n destroy$.next();\r\n destroy$.complete();\r\n this.creating.set(false);\r\n }\r\n }\r\n\r\n /**\r\n * 等待指定 taskId 的某些事件类型之一出现(每次调用都会创建新订阅,避免 first() 复用导致丢事件)\r\n */\r\n private async waitForTaskEvent(\r\n taskId: string,\r\n types: Array<'bootstrapDone' | 'bootstrapFailed' | 'bootstrapNeedPickRoot'>,\r\n timeoutMs: number,\r\n destroy$: Subject<void>,\r\n ): Promise<TaskEventMsg> {\r\n const typeSet = new Set(types);\r\n\r\n return await firstValueFrom(\r\n this.taskStream.events$().pipe(\r\n filter(e => e?.payload?.taskId === taskId),\r\n filter(e => typeSet.has(e.type as 'bootstrapDone' | 'bootstrapFailed' | 'bootstrapNeedPickRoot')),\r\n first(),\r\n timeout(timeoutMs),\r\n takeUntil(destroy$),\r\n )\r\n );\r\n }\r\n\r\n setDraft(d: CreateProjectDraft) {\r\n this.draft.set(d);\r\n }\r\n\r\n canNext(): boolean {\r\n const s = this.step();\r\n const d = this.draft();\r\n\r\n if (s === 0) {\r\n if (!d.name?.trim()) return false;\r\n if (!d.parentDir?.trim()) return false;\r\n if (!d.rootPath?.trim()) return false;\r\n return true;\r\n }\r\n if (s === 1) {\r\n return !!d.rootPath?.trim();\r\n }\r\n return true;\r\n }\r\n\r\n async next() {\r\n const s = this.step();\r\n if (s === 0) {\r\n // Step1 校验 + 路径重复检查(可选)\r\n const exists = await this.api.checkPathExists(this.draft().rootPath);\r\n if (exists && !this.draft().overwriteIfExists) {\r\n this.notify.error('该路径不可用或已存在重复项目');\r\n return;\r\n }\r\n }\r\n const ns = Math.min(3, s + 1);\r\n this.step.set(ns);\r\n // 进入 Step2 自动 detect\r\n // if (ns === 1) await this.detectNow();\r\n }\r\n\r\n prev() {\r\n this.step.set(Math.max(0, this.step() - 1));\r\n }\r\n\r\n canGoNext() {\r\n const s = this.step();\r\n if (s === 0) return true; // basic -> preset\r\n if (s === 1) return this.isManual(); // 只有 manual 才能 preset -> features\r\n if (s === 2) return true; // features -> config\r\n return false;\r\n }\r\n\r\n private isManual() {\r\n return this.draft().preset === 'manual';\r\n }\r\n\r\n canCreateHere() {\r\n const s = this.step();\r\n return (this.isManual() && s === 3) || (!this.isManual() && s === 1);\r\n }\r\n\r\n cancel() {\r\n this.modal.confirm({\r\n nzTitle: '取消创建项目',\r\n nzContent: '确定要取消创建吗',\r\n nzOkDanger: true,\r\n nzOkText: '取消创建',\r\n nzCancelText: '不',\r\n nzCentered: true,\r\n nzOnOk: () => {\r\n this.modalRef.close();\r\n }\r\n })\r\n }\r\n\r\n private async pickWorkspaceRootByModal(candidates: PickWorkspaceCandidate[]): Promise<string | null> {\r\n const modal: NzModalRef<PickWorkspaceModalComponent> = this.modal.create({\r\n nzTitle: '选择要导入的工作区目录',\r\n nzContent: PickWorkspaceModalComponent,\r\n nzData: {\r\n candidates,\r\n defaultPicked: candidates[0],\r\n },\r\n nzFooter: null,\r\n nzCentered: true,\r\n nzMaskClosable: false,\r\n nzClosable: true,\r\n nzWidth: 720,\r\n });\r\n const result = await firstValueFrom<PickWorkspaceResult | null>(modal.afterClose);\r\n return result?.pickedRoot ?? null;\r\n }\r\n\r\n}\r\n", "import { CommonModule } from '@angular/common';\r\nimport { Component } from '@angular/core';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { FsExplorerComponent } from \"../components/fs-explorer/fs-explorer.component\";\r\nimport { NzGridModule } from 'ng-zorro-antd/grid';\r\nimport { NzModalService } from 'ng-zorro-antd/modal';\r\nimport { ProjectCreateModal } from './project-create-modal.component';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\n@Component({\r\n selector: 'app-project-create',\r\n imports: [\r\n CommonModule,\r\n NzButtonModule,\r\n NzGridModule,\r\n FsExplorerComponent,\r\n NzIconModule\r\n ],\r\n template: `\r\n <div nz-row class=\"page\">\r\n <div nz-col nzSpan=\"16\" nzOffset=\"4\" class=\"explorer-container\">\r\n <app-fs-explorer></app-fs-explorer>\r\n </div>\r\n <div class=\"actions-bar\">\r\n <button nz-button nzType=\"primary\" nzSize=\"large\" (click)=\"goCreate()\">\r\n <nz-icon nzType=\"plus\" nzTheme=\"outline\" />\r\n 在此创建新项目\r\n </button>\r\n </div>\r\n </div>\r\n `,\r\n styles: [\r\n `\r\n .page {\r\n width: 100%;\r\n height: 100%;\r\n display: flex;\r\n flex-direction: column;\r\n .explorer-container {\r\n flex: 1 1 auto;\r\n height: 0;\r\n }\r\n .actions-bar {\r\n flex: 0 0 auto;\r\n padding: 16px;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n }\r\n }\r\n `\r\n ],\r\n})\r\nexport class ProjectCreateComponent {\r\n \r\n constructor(private modal: NzModalService) { }\r\n goCreate() {\r\n const modal = this.modal.create({\r\n nzTitle: '创建新项目',\r\n nzFooter: null,\r\n nzMaskClosable: false,\r\n nzClosable: false,\r\n nzContent: ProjectCreateModal,\r\n nzWidth: '1020px',\r\n nzCentered: true,\r\n })\r\n\r\n const instance = modal.getContentComponent();\r\n modal.afterClose.subscribe((data) => {\r\n if (data?.ok) {\r\n // 创建成功\r\n }\r\n })\r\n }\r\n}\r\n", "/* angular:styles/component:less;c4f558d877aae693b48ead1419972780fc56160bf7e1b24f85914fbb0acd5b9a;D:\\ng-manager\\webapp\\src\\app\\pages\\projects\\project-import\\project-import.component.ts */\n.page {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n}\n.page .explorer-container {\n flex: 1 1 auto;\n height: 0;\n}\n.page .actions-bar {\n flex: 0 0 auto;\n padding: 16px;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n/*# sourceMappingURL=project-import.component.css.map */\n", "import { Injectable, inject, signal, computed, effect } from \"@angular/core\";\r\nimport { ImportCheckResult } from \"@models/project.model\";\r\nimport { ProjectApiService } from \"./project-api.service\";\r\nimport { ProjectStateService } from \"./project.state.service\";\r\nimport { UiNotifierService } from \"@core/ui-notifier.service\";\r\nimport { FsExplorerService } from \"../components/fs-explorer\";\r\n\r\n@Injectable({ providedIn: \"root\" })\r\nexport class ProjectImportState {\r\n private fs = inject(FsExplorerService);\r\n private projectApi = inject(ProjectApiService);\r\n private projectState = inject(ProjectStateService);\r\n\r\n /** 是否处于 import 页面 */\r\n readonly active = signal(false);\r\n\r\n readonly checking = signal(false);\r\n readonly result = signal<ImportCheckResult | null>(null);\r\n\r\n readonly canImport = computed(() => this.result()?.ok === true);\r\n readonly warnings = computed(() => this.result()?.warnings ?? []);\r\n readonly reason = computed(() => this.result()?.reason ?? \"\");\r\n\r\n readonly currentPath = computed(\r\n () => this.fs.currentPath() || this.fs.path()\r\n );\r\n\r\n private _seq = 0;\r\n\r\n private notify = inject(UiNotifierService);\r\n\r\n\r\n constructor() {\r\n effect(() => {\r\n if (!this.active()) return;\r\n const root = this.currentPath();\r\n if (!root) return;\r\n this.check(root);\r\n });\r\n }\r\n\r\n enter() {\r\n this.active.set(true);\r\n }\r\n\r\n leave() {\r\n this.active.set(false);\r\n this.result.set(null);\r\n }\r\n\r\n check(root: string) {\r\n const seq = ++this._seq;\r\n this.checking.set(true);\r\n this.result.set(null);\r\n\r\n this.projectApi.checkImport(root).subscribe({\r\n next: (res) => {\r\n if (seq !== this._seq) return;\r\n this.result.set(res);\r\n },\r\n error: (e) => {\r\n if (seq !== this._seq) return;\r\n this.result.set({\r\n ok: false,\r\n root,\r\n reason: e?.message || \"check failed\",\r\n } as any);\r\n },\r\n complete: () => {\r\n if (seq !== this._seq) return;\r\n this.checking.set(false);\r\n },\r\n });\r\n }\r\n\r\n import(name?: string) {\r\n const root = this.currentPath();\r\n if (!root || !this.canImport()) return;\r\n\r\n const defaultName =\r\n root.replace(/[\\\\\\/]+$/, \"\").split(/[\\\\\\/]/).pop() || \"New Project\";\r\n\r\n this.projectApi.importByPath({\r\n root,\r\n name: name || defaultName,\r\n syncTasks: true,\r\n }).subscribe({\r\n next: (res) => {\r\n this.projectState.getProjects();\r\n this.projectState.setCurrentProjectById(res.id);\r\n this.check(root); // 立即刷新为“已注册”\r\n this.notify.success(`项目导入成功`);\r\n },\r\n });\r\n }\r\n}\r\n", "import { CommonModule } from '@angular/common';\r\nimport { Component, inject } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzGridModule } from 'ng-zorro-antd/grid';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { FsExplorerComponent } from '../components/fs-explorer/fs-explorer.component';\r\nimport { ProjectImportState } from '../services/project-import.state.service';\r\n\r\n@Component({\r\n selector: 'app-project-import',\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n NzGridModule,\r\n NzButtonModule,\r\n NzIconModule,\r\n FsExplorerComponent\r\n ],\r\n template: `\r\n <div nz-row class=\"page\">\r\n <div nz-col nzSpan=\"16\" nzOffset=\"4\" class=\"explorer-container\">\r\n <app-fs-explorer></app-fs-explorer>\r\n </div>\r\n <div class=\"actions-bar center\">\r\n <button nz-button nzSize=\"large\" nzType=\"primary\" (click)=\"importState.import()\" [disabled]=\"importState.checking() || !importState.canImport()\">\r\n <nz-icon nzType=\"import\" nzTheme=\"outline\" />\r\n 导入这个文件夹\r\n </button>\r\n </div>\r\n </div>\r\n `,\r\n styles: [`\r\n .page {\r\n width: 100%;\r\n height: 100%;\r\n display: flex;\r\n flex-direction: column;\r\n\r\n .explorer-container {\r\n flex: 1 1 auto;\r\n height: 0;\r\n }\r\n\r\n .actions-bar {\r\n flex: 0 0 auto;\r\n padding: 16px;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n }\r\n }\r\n `]\r\n})\r\nexport class ProjectImportComponent {\r\n importState = inject(ProjectImportState);\r\n}\r\n", "/* angular:styles/component:less;a6e237ce29db8f9aeec1a97922a209791ce9c1f3ebef1fb61cff62893bb07135;D:\\ng-manager\\webapp\\src\\app\\pages\\projects\\project-list\\project-list.component.ts */\n:host {\n display: block;\n height: 100%;\n overflow: hidden;\n}\n.page {\n height: 100%;\n overflow-y: auto;\n}\n.page .topbar {\n width: 100%;\n display: flex;\n justify-content: center;\n margin-bottom: 12px;\n}\n.page .topbar nz-input-wrapper {\n width: 25%;\n min-width: 200px;\n}\n.page .col {\n display: flex;\n flex-direction: column;\n}\n.header {\n padding: 12px 0;\n}\n.header h2 {\n margin: 0;\n font-weight: 600;\n}\n/*# sourceMappingURL=project-list.component.css.map */\n", "/* angular:styles/component:less;8c34310a0e14da96f4fd592557a86c32d709cf19b5d88f7932b178fae2cf6ea8;D:\\ng-manager\\webapp\\src\\app\\pages\\projects\\project-list\\project-item.component.ts */\n.project-item {\n border-radius: 4px;\n padding: 0;\n margin: 8px 0;\n transition: all 0.3s;\n cursor: pointer;\n}\n.project-item.open,\n.project-item:hover {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n background: var(--app-primary-3);\n}\n.project-item .content {\n padding: 16px;\n display: grid;\n grid-template-columns: auto 1fr auto;\n grid-template-rows: auto;\n grid-template-areas: \"icon info actions\";\n grid-gap: 16px;\n align-items: center;\n}\n.project-item .content .favorite {\n grid-area: icon;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.project-item .content .info {\n grid-area: info;\n -webkit-user-select: none;\n user-select: none;\n}\n.project-item .content .info .list-item-info {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n justify-content: center;\n gap: 4px;\n}\n.project-item .content .info .list-item-info .name {\n flex: auto 0 0;\n}\n.project-item .content .info .list-item-info .name .task-popover-trigger {\n display: inline-block;\n margin-left: 8px;\n cursor: pointer;\n}\n.project-item .content .info .list-item-info .name .task-popover-trigger nz-badge {\n font-size: 18px;\n}\n.project-item .content .info .list-item-info .root-path {\n flex: auto 0 0;\n opacity: 0.7;\n font-size: 14px;\n}\n/*# sourceMappingURL=project-item.component.css.map */\n", "/* angular:styles/component:less;a3e12c60aee6315c488faab00515e2b272f207c0582a4e588555f216037cd542;D:\\ng-manager\\webapp\\src\\app\\pages\\projects\\project-list\\project-item-popover.component.ts */\n.dropdown-content {\n display: flex;\n flex-direction: column;\n}\n.dropdown-content .pane-toolbar {\n display: flex;\n flex-direction: row;\n align-items: center;\n padding: 6px 6px 6px 16px;\n}\n.dropdown-content .pane-toolbar > * {\n flex: auto 0 0;\n}\n.dropdown-content .pane-toolbar .icon {\n font-size: 18px;\n margin-right: 6px;\n}\n.dropdown-content .pane-toolbar .title {\n flex: 100% 1 1;\n width: 0;\n overflow: hidden;\n -ms-text-overflow: ellipsis;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.dropdown-content .tasks {\n width: 320px;\n max-height: 360px;\n overflow: hidden auto;\n}\n.dropdown-content .tasks .task-item {\n padding: 16px;\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n.dropdown-content .tasks .task-item:hover {\n background: #f5f5f5;\n}\n.dropdown-content .tasks .task-item .item-content {\n display: flex;\n flex-direction: row;\n align-items: center;\n flex: 100% 1 1;\n width: 0;\n gap: 16px;\n cursor: pointer;\n}\n.dropdown-content .tasks .task-item .item-logo {\n font-size: 42px;\n margin-right: 16px;\n flex: auto 0 0;\n display: inline-flex;\n align-items: center;\n}\n.dropdown-content .tasks .task-item .list-item-info {\n flex: 100% 1 1;\n width: 0;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n align-items: stretch;\n justify-content: center;\n}\n.dropdown-content .tasks .task-item .list-item-info .description {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.dropdown-content .tasks .task-item button {\n flex: auto 0 0;\n}\n.dropdown-content .tasks .task-item button nz-icon {\n font-size: 24px;\n}\n/*# sourceMappingURL=project-item-popover.component.css.map */\n", "import { CommonModule } from '@angular/common';\r\nimport { Component, computed, inject, Input, OnChanges, Signal } from '@angular/core';\r\nimport { Router, RouterModule } from '@angular/router';\r\nimport { TaskRow } from '@models/task.model';\r\nimport { TaskStateService } from '@pages/tasks/services/tasks.state.service';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzTooltipModule } from 'ng-zorro-antd/tooltip';\r\nimport { ProjectStateService } from '../services/project.state.service';\r\nimport { TaskStatus } from '@core/ws';\r\n\r\n@Component({\r\n selector: 'app-project-item-popover',\r\n imports: [CommonModule, NzIconModule, NzButtonModule, NzTooltipModule, RouterModule],\r\n template: `\r\n <div class=\"dropdown-content\">\r\n <div class=\"pane-toolbar\">\r\n <div class=\"icon\">\r\n <nz-icon nzType=\"inbox\" nzTheme=\"outline\" />\r\n </div>\r\n <div class=\"title\">任务</div>\r\n <button nz-button type=\"button\" nzType=\"text\">\r\n <nz-icon nzType=\"close\" nzTheme=\"outline\" />\r\n </button>\r\n </div>\r\n <div class=\"tasks\">\r\n @for( task of tasks();track task.spec.id){ \r\n <div class=\"task-item\" nz-tooltip [nzTooltipTitle]=\"getTaskDescription(task)\" nzTooltipPlacement=\"right\">\r\n <div class=\"item-content\" (click)=\"openTask(task)\">\r\n <div class=\"item-logo\">\r\n <nz-icon nzType=\"code\" nzTheme=\"outline\" />\r\n </div>\r\n <div class=\"list-item-info\">\r\n <div class=\"name\">\r\n <span>{{task.spec.name}}</span>\r\n </div>\r\n <div class=\"description\">\r\n <span>{{ getTaskDescription(task) }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n <button nz-button nzType=\"text\" type=\"button\" (click)=\"$event.stopPropagation(); toggleTask(task)\">\r\n <nz-icon [nzType]=\"getTaskActionIcon(task)\" nzTheme=\"outline\" />\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n `,\r\n styles: [\r\n `\r\n .dropdown-content{\r\n display: flex;\r\n flex-direction: column;\r\n .pane-toolbar{\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n padding: 6px 6px 6px 16px;\r\n &>*{\r\n flex: auto 0 0;\r\n }\r\n .icon{\r\n font-size:18px;\r\n margin-right:6px;\r\n }\r\n .title{\r\n flex: 100% 1 1;\r\n width: 0;\r\n overflow: hidden;\r\n -ms-text-overflow: ellipsis;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n }\r\n }\r\n .tasks{\r\n width:320px;\r\n max-height:360px;\r\n overflow: hidden auto;\r\n .task-item{\r\n padding:16px;\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n &:hover{\r\n background:#f5f5f5;\r\n }\r\n .item-content{\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n flex: 100% 1 1;\r\n width: 0;\r\n gap:16px;\r\n cursor:pointer;\r\n }\r\n .item-logo{\r\n font-size:42px;\r\n margin-right:16px;\r\n flex: auto 0 0;\r\n display: inline-flex;\r\n align-items: center;\r\n }\r\n .list-item-info {\r\n flex: 100% 1 1;\r\n width: 0;\r\n overflow: hidden;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: stretch;\r\n justify-content: center;\r\n .description{\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n }\r\n }\r\n button{\r\n flex: auto 0 0;\r\n nz-icon{\r\n font-size:24px;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n `\r\n ],\r\n})\r\nexport class ProjectItemPopoverComponent implements OnChanges {\r\n @Input() projectId?: string;\r\n private projectState = inject(ProjectStateService);\r\n private router = inject(Router);\r\n private state = inject(TaskStateService);\r\n\r\n readonly tasks: Signal<TaskRow[]> = computed(() => {\r\n if (!this.projectId) return [];\r\n return this.state.rowsViewOf(this.projectId)();\r\n });\r\n\r\n async ngOnChanges() {\r\n if (this.projectId) {\r\n await this.state.ensureProjectLoaded(this.projectId);\r\n }\r\n }\r\n\r\n toggleTask(task: TaskRow) {\r\n if (task.runtime?.status === \"running\") {\r\n this.state.stopSelected();\r\n } else {\r\n this.state.startSelected();\r\n }\r\n this.openTask(task);\r\n }\r\n\r\n async openTask(task: TaskRow) {\r\n this.state.select(task.spec.id);\r\n await this.router.navigate(['/tasks']);\r\n this.projectState.setCurrentProjectById(task.spec.projectId);\r\n }\r\n\r\n getTaskName(task: TaskRow) {\r\n return task.spec.name || task.spec.id;\r\n }\r\n getTaskDescription(task: TaskRow) {\r\n const st = task.runtime?.status;\r\n return task.runtime ? this.computedStatusText(st) : task.spec.description || \"\";\r\n }\r\n\r\n getTaskActionIcon(task: TaskRow) {\r\n const st = task.runtime?.status;\r\n return st === \"running\" || st === \"stopping\" ? \"pause-circle\" : \"play-circle\";\r\n }\r\n\r\n private computedStatusText(status: TaskStatus | undefined): string {\r\n switch (status) {\r\n case \"running\": return \"运行中\";\r\n case \"stopping\": return \"停止中\";\r\n case \"success\": return \"成功\";\r\n case \"failed\": return \"错误\";\r\n case \"stopped\": return \"已停止\";\r\n default: return \"空闲\";\r\n }\r\n }\r\n}\r\n", "import { CommonModule } from '@angular/common';\r\nimport { Component, computed, EventEmitter, inject, Input, Output } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { Project } from '@models/project.model';\r\nimport { NzBadgeModule } from 'ng-zorro-antd/badge';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzGridModule } from 'ng-zorro-antd/grid';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzPopoverModule } from 'ng-zorro-antd/popover';\r\nimport { NzSpaceModule } from 'ng-zorro-antd/space';\r\nimport { ProjectItemPopoverComponent } from \"./project-item-popover.component\";\r\nimport { NzTooltipDirective } from \"ng-zorro-antd/tooltip\";\r\nimport { TaskRuntimeStore } from '@pages/tasks/services/task-runtime-store';\r\nimport { UiNotifierService } from '@app/core';\r\n@Component({\r\n selector: 'app-project-item',\r\n imports: [CommonModule, FormsModule, NzGridModule, NzButtonModule, NzIconModule, NzPopoverModule, NzBadgeModule, NzSpaceModule, ProjectItemPopoverComponent, NzTooltipDirective],\r\n template: `\r\n <div nz-row class=\"project-item\" [class.open]=\"open\">\r\n <div nz-col nzSpan=\"24\" class=\"content\">\r\n <div class=\"favorite\">\r\n <button nz-button nzType=\"primary\" (click)=\"$event.stopPropagation();toggleFavorite.emit()\">\r\n <nz-icon nzType=\"star\" [nzTheme]=\"project?.isFavorite ? 'fill' : 'outline'\"></nz-icon>\r\n </button>\r\n </div>\r\n <div class=\"info\" (click)=\"selectProject.emit()\">\r\n <div class=\"list-item-info\">\r\n <div class=\"name\">\r\n <span>{{ project?.name }}</span>\r\n <span\r\n class=\"task-popover-trigger\"\r\n (click)=\"$event.stopPropagation()\"\r\n nz-popover\r\n nzPopoverTrigger=\"click\"\r\n [nzPopoverContent]=\"contentTemplate\"\r\n nzPopoverPlacement=\"right\"\r\n [nzPopoverOverlayClassName]=\"'project-item-popover'\"\r\n >\r\n <nz-badge \r\n [nzStatus]=\"hasTasksRunning() ? 'processing' : 'default'\"\r\n [nz-tooltip]=\"taskBadgeTip()\">\r\n </nz-badge>\r\n </span>\r\n </div>\r\n <div class=\"root-path\">\r\n <span>{{ project?.root }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"actions\">\r\n <nz-space nzSize=\"large\">\r\n <button nz-button nzType=\"primary\" (click)=\"openInEditor.emit()\">\r\n <nz-icon nzType=\"code\" nzTheme=\"outline\"/>\r\n <span>在编辑器中打开</span>\r\n </button>\r\n <button nz-button nzType=\"primary\" (click)=\"editProject.emit()\" nz-tooltip=\"编辑\">\r\n <nz-icon nzType=\"edit\" nzTheme=\"outline\"/>\r\n </button>\r\n @if(project?.repoPageUrl){\r\n <button nz-button nzType=\"primary\" (click)=\"openPageUrl(project?.repoPageUrl)\" nz-tooltip=\"打开仓库地址\">\r\n <nz-icon nzType=\"global\" nzTheme=\"outline\"/>\r\n </button>\r\n }\r\n <button nz-button nzType=\"primary\" (click)=\"del()\" nz-tooltip=\"删除\">\r\n <nz-icon nzType=\"delete\" nzTheme=\"outline\"/>\r\n </button>\r\n </nz-space>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-template #contentTemplate>\r\n <app-project-item-popover [projectId]=\"project?.id\"></app-project-item-popover>\r\n </ng-template>\r\n `,\r\n styles: [\r\n `\r\n .project-item{\r\n border-radius:4px;\r\n padding:0;\r\n margin:8px 0;\r\n transition:all .3s;\r\n cursor:pointer;\r\n &.open, &:hover{\r\n box-shadow:0 4px 12px rgba(0,0,0,.1);\r\n background:var(--app-primary-3);\r\n }\r\n .content{\r\n padding: 16px;\r\n display: grid;\r\n grid-template-columns: auto 1fr auto;\r\n grid-template-rows: auto;\r\n grid-template-areas: \"icon info actions\";\r\n grid-gap: 16px;\r\n align-items: center;\r\n\r\n .favorite{\r\n grid-area: icon;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n }\r\n .info{\r\n grid-area: info;\r\n user-select: none;\r\n .list-item-info {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: stretch;\r\n justify-content: center;\r\n gap: 4px;\r\n .name{\r\n flex: auto 0 0;\r\n .task-popover-trigger{\r\n display: inline-block;\r\n margin-left: 8px;\r\n cursor: pointer;\r\n nz-badge {\r\n font-size:18px;\r\n }\r\n }\r\n }\r\n .root-path{\r\n flex:auto 0 0;\r\n opacity:0.7;\r\n font-size:14px;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n `\r\n ],\r\n})\r\nexport class ProjectItem {\r\n private taskRuntime = inject(TaskRuntimeStore);\r\n private notify = inject(UiNotifierService);\r\n\r\n @Input() project: Project | null = null;\r\n @Input() open = false;\r\n\r\n @Output() selectProject = new EventEmitter<void>();\r\n @Output() toggleFavorite = new EventEmitter<void>();\r\n @Output() editProject = new EventEmitter<void>();\r\n @Output() openInEditor = new EventEmitter<void>();\r\n @Output() deleteProject = new EventEmitter<void>();\r\n\r\n /** 运行中任务数(running/stopping) */\r\n readonly tasksRunningCount = computed((): number => {\r\n const pid = this.project?.id?.trim();\r\n if (!pid) return 0;\r\n return this.taskRuntime.runningCountSignal(pid)();\r\n });\r\n\r\n /** 是否有任务占用中 */\r\n readonly hasTasksRunning = computed((): boolean => {\r\n return this.tasksRunningCount() > 0;\r\n });\r\n\r\n /** tooltip 文案 */\r\n readonly taskBadgeTip = computed(() => {\r\n const n = this.tasksRunningCount();\r\n return n > 0 ? `${n} 个任务正在运行` : '任务';\r\n });\r\n\r\n del() {\r\n if (this.hasTasksRunning()) {\r\n this.notify.warn('当前项目有任务正在运行,请先停止这些任务后再删除项目。');\r\n return;\r\n }\r\n this.deleteProject.emit();\r\n }\r\n\r\n openPageUrl(url?: string) {\r\n if (url) {\r\n window.open(url, '_blank');\r\n }\r\n }\r\n}\r\n", "import { CommonModule } from '@angular/common';\r\nimport { Component, inject } from '@angular/core';\r\nimport { NzCardModule } from 'ng-zorro-antd/card';\r\nimport { NzEmptyModule } from 'ng-zorro-antd/empty';\r\nimport { NzGridModule } from 'ng-zorro-antd/grid';\r\nimport { ProjectStateService } from '../services/project.state.service';\r\nimport { ProjectItem } from './project-item.component';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { FormsModule } from '@angular/forms';\r\n@Component({\r\n selector: 'app-project-list',\r\n imports: [CommonModule, FormsModule, NzCardModule, NzGridModule, ProjectItem, NzEmptyModule, NzInputModule, NzIconModule],\r\n template: `\r\n <div nz-row class=\"page\">\r\n <div nz-col nzSpan=\"16\" nzOffset=\"4\" class=\"col\">\r\n <div nz-col class=\"topbar\">\r\n <nz-input-wrapper>\r\n <nz-icon class=\"search-icon\" nzInputPrefix nzType=\"search\" />\r\n <input\r\n nz-input\r\n placeholder=\"搜索项目\"\r\n [ngModel]=\"projectState.keyword()\"\r\n (ngModelChange)=\"projectState.keyword.set($event)\"\r\n />\r\n </nz-input-wrapper>\r\n </div>\r\n @if(projectState.favoriteProjects().length > 0){\r\n <div class=\"header\">\r\n <h2>收藏的项目</h2>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"itemsTpl; context: { $implicit: projectState.favoriteProjects()}\"></ng-container>\r\n }\r\n @if(projectState.favoriteProjects().length > 0){\r\n <div class=\"header\">\r\n <h2>更多项目</h2>\r\n </div>\r\n }\r\n <ng-container *ngTemplateOutlet=\"itemsTpl; context: { $implicit: projectState.moreProjects()}\"></ng-container>\r\n @if(projectState.projects().length === 0){\r\n <div class=\"no-projects\">\r\n <nz-empty nzNotFoundImage=\"simple\" nzNotFoundContent=\"暂无项目,快去创建或导入第一个项目吧!\"></nz-empty>\r\n </div>\r\n } \r\n </div>\r\n <ng-template #itemsTpl let-projects>\r\n <div class=\"content\">\r\n @for (project of projects; track project.id) {\r\n <app-project-item \r\n [project] =\"project\"\r\n (selectProject)=\"projectState.selectProject(project)\"\r\n (toggleFavorite)=\"projectState.toggleFavorite(project.id)\" \r\n (openInEditor)=\"projectState.openInEditor(project.id)\"\r\n (editProject)=\"projectState.openEditModal(project)\"\r\n (deleteProject)=\"projectState.deleteProject(project.id)\"\r\n [project]=\"project\" \r\n [open]=\"projectState.isOpen(project)\">\r\n </app-project-item>\r\n }\r\n </div>\r\n </ng-template>\r\n </div>`,\r\n styles: [`\r\n :host{\r\n display: block;\r\n height: 100%;\r\n overflow:hidden;\r\n }\r\n .page {\r\n height:100%;\r\n overflow-y: auto;\r\n .topbar{\r\n width: 100%;\r\n display: flex;\r\n justify-content: center;\r\n margin-bottom: 12px;\r\n nz-input-wrapper{\r\n width:25%;\r\n min-width:200px;\r\n }\r\n }\r\n .col{\r\n display: flex;\r\n flex-direction: column;\r\n }\r\n }\r\n .header {\r\n padding: 12px 0;\r\n h2{\r\n margin: 0;\r\n font-weight: 600;\r\n }\r\n } \r\n `],\r\n})\r\nexport class ProjectListComponent {\r\n\r\n public projectState: ProjectStateService = inject(ProjectStateService);\r\n\r\n}\r\n", "import { CommonModule } from '@angular/common';\r\nimport { Component, inject } from '@angular/core';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzTabsModule } from 'ng-zorro-antd/tabs';\r\nimport { ProjectCreateComponent } from \"./project-create/project-create.component\";\r\nimport { ProjectImportComponent } from \"./project-import/project-import.component\";\r\nimport { ProjectListComponent } from \"./project-list/project-list.component\";\r\nimport { ProjectImportState } from './services/project-import.state.service';\r\n\r\n@Component({\r\n selector: 'app-projects',\r\n imports: [CommonModule, NzTabsModule, NzIconModule, ProjectListComponent, ProjectCreateComponent, ProjectImportComponent],\r\n template: `\r\n <div class=\"page\">\r\n <div class=\"header\">\r\n <h2>项目管理</h2>\r\n </div>\r\n <nz-tabs nzCentered class=\"tabs-container\" [(nzSelectedIndex)]=\"selectedIndex\" (nzSelectedIndexChange)=\"tabIndexChange($event)\">\r\n <nz-tab [nzTitle]=\"projectTitleTemplate\">\r\n <ng-template #projectTitleTemplate>\r\n <nz-icon nzType=\"unordered-list\" nzTheme=\"outline\" />\r\n 项目\r\n </ng-template>\r\n <ng-template nz-tab>\r\n <app-project-list></app-project-list>\r\n </ng-template>\r\n </nz-tab>\r\n <nz-tab [nzTitle]=\"addTitleTemplate\">\r\n <ng-template #addTitleTemplate>\r\n <nz-icon nzType=\"plus-square\" nzTheme=\"outline\" />\r\n 创建\r\n </ng-template>\r\n <ng-template nz-tab>\r\n <app-project-create></app-project-create>\r\n </ng-template>\r\n </nz-tab>\r\n <nz-tab [nzTitle]=\"importTitleTemplate\">\r\n <ng-template #importTitleTemplate>\r\n <nz-icon nzType=\"import\" nzTheme=\"outline\" />\r\n 导入\r\n </ng-template>\r\n <ng-template nz-tab>\r\n <app-project-import></app-project-import>\r\n </ng-template>\r\n </nz-tab>\r\n </nz-tabs>\r\n </div>\r\n `,\r\n styles: [`\r\n .page{ display:flex; flex-direction:column; height:100%; }\r\n .header{\r\n display:flex;\r\n align-items:center;\r\n justify-content:center;\r\n flex:0 0 auto;\r\n padding:16px 0;\r\n h2{\r\n margin:0;\r\n }\r\n }\r\n nz-tabs.tabs-container{\r\n flex:1 1 auto;\r\n height:0;\r\n &::ng-deep .ant-tabs-content{\r\n height:100%;\r\n .ant-tabs-tabpane{\r\n height:100%;\r\n }\r\n }\r\n }\r\n .toolbar input{ flex:1; }\r\n .current{ margin:10px 0; opacity:.75; }\r\n `]\r\n})\r\nexport class ProjectsComponent {\r\n importState = inject(ProjectImportState);\r\n selectedIndex = 0;\r\n tabIndexChange(index: number) {\r\n if (index === 2) {\r\n this.importState.active.set(true);\r\n } else {\r\n this.importState.active.set(false);\r\n }\r\n }\r\n}\r\n", "import { NgModule } from '@angular/core';\r\nimport { RouterModule, Routes } from '@angular/router';\r\nimport { ProjectsComponent } from './projects.component';\r\n\r\nconst routes: Routes = [\r\n { path: '', component: ProjectsComponent },\r\n];\r\n\r\n@NgModule({\r\n imports: [RouterModule.forChild(routes)],\r\n exports: [RouterModule]\r\n})\r\nexport class ProjectsRoutingModule { }\r\n", "import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { ProjectsRoutingModule } from './projects-routing-module';\r\n\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [\r\n CommonModule,\r\n ProjectsRoutingModule\r\n ]\r\n})\r\nexport class ProjectsModule { }\r\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["CreateSummaryAsideComponent", "PickWorkspaceModalComponent", "first", "StepBasicComponent", "StepConfigComponent", "StepFeaturesComponent", "GitImportModalComponent", "StepPresetComponent", "ProjectCreateModal", "ProjectCreateComponent", "ProjectImportState", "ProjectImportComponent", "ProjectItemPopoverComponent", "ProjectItem", "ProjectListComponent", "ProjectsComponent", "ProjectsRoutingModule", "ProjectsModule"]
|
|
7
|
-
}
|