@yinuo-ngm/server 1.0.16 → 1.0.17
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/app.js +3 -15
- package/lib/common/editor.js +2 -2
- package/lib/env.d.ts +1 -0
- package/lib/env.js +1 -0
- package/lib/plugins/error-handler.plugin.d.ts +2 -2
- package/lib/plugins/error-handler.plugin.js +97 -93
- package/lib/plugins/ws/topics/nginx.ws.js +2 -1
- package/lib/plugins/ws/topics/svn.ws.d.ts +2 -1
- package/lib/plugins/ws/topics/svn.ws.js +3 -2
- package/lib/plugins/ws/topics/syslog.ws.d.ts +1 -1
- package/lib/plugins/ws/topics/task.ws.d.ts +2 -1
- package/lib/plugins/ws/topics/task.ws.js +2 -1
- package/lib/plugins/ws/ws.context.d.ts +1 -1
- package/lib/plugins/ws/ws.plugin.js +4 -3
- package/lib/plugins/ws/ws.router.d.ts +2 -2
- package/lib/plugins/ws/ws.router.js +8 -7
- package/lib/routes/api-client/collection.routes.js +8 -6
- package/lib/routes/api-client/env.routes.js +4 -3
- package/lib/routes/api-client/history.routes.js +3 -2
- package/lib/routes/api-client/hub-token.routes.js +11 -11
- package/lib/routes/api-client/request.routes.js +7 -6
- package/lib/routes/api-client/send.routes.js +3 -2
- package/lib/routes/config.routes.js +5 -5
- package/lib/routes/hub.routes.js +10 -10
- package/lib/routes/nginx/nginx-lifecycle.routes.js +4 -0
- package/lib/routes/nginx/nginx-route.context.js +23 -7
- package/lib/routes/nginx/nginx-server.routes.js +158 -6
- package/lib/routes/node-version.routes.js +7 -7
- package/lib/routes/project.routes.js +9 -9
- package/lib/routes/rss.routes.js +3 -3
- package/lib/routes/sprite-browse.routes.js +2 -1
- package/lib/routes/sprite.routes.js +3 -3
- package/lib/routes/static-files.routes.js +7 -7
- package/lib/routes/svn.routes.js +5 -3
- package/lib/routes/system.routes.js +20 -1
- package/lib/routes/task.routes.js +4 -4
- package/package.json +13 -6
- package/www/3rdpartylicenses.txt +52 -52
- package/www/browser/chunk-2L7NUOMX.js +2 -0
- package/www/browser/chunk-2NZJ7CN2.js +20 -0
- package/www/browser/{chunk-SPRWNZHF.js → chunk-3CM4SKDO.js} +2 -2
- package/www/browser/{chunk-EEVPZGEY.js → chunk-3I7BQCXS.js} +1 -1
- package/www/browser/{chunk-DXF7BVK5.js → chunk-3M56F2S2.js} +1 -1
- package/www/browser/chunk-3OHBKMAA.js +1 -0
- package/www/browser/{chunk-4KETC6EB.js → chunk-3XNNQFWR.js} +1 -1
- package/www/browser/chunk-4BRW6LCZ.js +4 -0
- package/www/browser/{chunk-HGONFYP6.js → chunk-4LBSLURA.js} +1 -1
- package/www/browser/{chunk-BYEU6KGP.js → chunk-4X42HB6N.js} +1 -1
- package/www/browser/chunk-5DYX4DUX.js +11 -0
- package/www/browser/chunk-6SYVDN5L.js +1 -0
- package/www/browser/{chunk-XJ5KZQNN.js → chunk-6YYNHZ2A.js} +1 -1
- package/www/browser/{chunk-G2W3B7TJ.js → chunk-75W3GVSO.js} +1 -1
- package/www/browser/{chunk-76TVIB33.js → chunk-7U44RF5F.js} +1 -1
- package/www/browser/{chunk-WD4IAQR3.js → chunk-AELTP6YN.js} +1 -1
- package/www/browser/chunk-AMXRL4GR.js +1 -0
- package/www/browser/chunk-AV2ZODEH.js +1 -0
- package/www/browser/chunk-AZ6SIMYH.js +1 -0
- package/www/browser/chunk-B3C35ET3.js +2 -0
- package/www/browser/chunk-BTQIUVTQ.js +1 -0
- package/www/browser/chunk-CN5J4WNO.js +1 -0
- package/www/browser/{chunk-N4LRZJBP.js → chunk-D2ODDESN.js} +1 -1
- package/www/browser/{chunk-O2EYEF7J.js → chunk-DE6E23ET.js} +1 -1
- package/www/browser/{chunk-SVQWPHF5.js → chunk-DIJPUYIA.js} +1 -1
- package/www/browser/{chunk-SYCNSLAW.js → chunk-DLGJD6YU.js} +4 -4
- package/www/browser/{chunk-JHMEKUZ5.js → chunk-EEDA5U4V.js} +1 -1
- package/www/browser/chunk-FK6Z4HLL.js +1 -0
- package/www/browser/chunk-FL6GDGHW.js +1 -0
- package/www/browser/{chunk-HRXCR3IN.js → chunk-FXCG34QS.js} +1 -1
- package/www/browser/{chunk-UJOHBN2Y.js → chunk-H2USFIYR.js} +1 -1
- package/www/browser/chunk-H5HGMOE6.js +1 -0
- package/www/browser/chunk-HB3HECPD.js +1 -0
- package/www/browser/{chunk-INL2PELS.js → chunk-HDNG236Q.js} +1 -1
- package/www/browser/{chunk-WF2QTF5L.js → chunk-HJTXXSMC.js} +1 -1
- package/www/browser/{chunk-LQ5OXSW7.js → chunk-HUMCWAKJ.js} +1 -1
- package/www/browser/chunk-IKB3EQCP.js +2 -0
- package/www/browser/{chunk-TMX5TTV3.js → chunk-K7PESFPY.js} +1 -1
- package/www/browser/{chunk-T3KK7ZXB.js → chunk-KRYMOHYF.js} +1 -1
- package/www/browser/{chunk-SQQNR223.js → chunk-M4QRBV3K.js} +1 -1
- package/www/browser/chunk-N2PELLMM.js +30 -0
- package/www/browser/{chunk-ACAZUX6C.js → chunk-ONXBYGIG.js} +1 -1
- package/www/browser/{chunk-JZULA5JV.js → chunk-OSBDR36P.js} +1 -1
- package/www/browser/chunk-OZCK4XVV.js +1 -0
- package/www/browser/{chunk-GDWS2L66.js → chunk-QJP5F735.js} +1 -1
- package/www/browser/{chunk-2X3MRS27.js → chunk-RGOYDY7H.js} +1 -1
- package/www/browser/{chunk-B6MBYCXI.js → chunk-UJKK4A7Y.js} +1 -1
- package/www/browser/{chunk-ZNTJRLVH.js → chunk-WD2EKZQC.js} +1 -1
- package/www/browser/{chunk-L5D75AMV.js → chunk-WUA5JFDD.js} +1 -1
- package/www/browser/chunk-XLFHB7RS.js +3 -0
- package/www/browser/{chunk-JU3TEDBV.js → chunk-YNW4HEJO.js} +1 -1
- package/www/browser/{chunk-RW2JPJV7.js → chunk-ZTDLWBW5.js} +1 -1
- package/www/browser/index.html +1 -1
- package/www/browser/main-N64WJCHX.js +34 -0
- package/www/browser/chunk-2BZRE4G7.js +0 -1
- package/www/browser/chunk-5T5KA5PG.js +0 -1
- package/www/browser/chunk-6CGHNKJI.js +0 -1
- package/www/browser/chunk-7J24TP36.js +0 -1
- package/www/browser/chunk-CZ5AZ3VW.js +0 -1
- package/www/browser/chunk-DW7F5PEA.js +0 -1
- package/www/browser/chunk-HHBPULJW.js +0 -2
- package/www/browser/chunk-KVFR7GFV.js +0 -20
- package/www/browser/chunk-L7TMCSHV.js +0 -1
- package/www/browser/chunk-MVQTKINJ.js +0 -1
- package/www/browser/chunk-OMDHJIUB.js +0 -1
- package/www/browser/chunk-OWUAAOHW.js +0 -2
- package/www/browser/chunk-PIK5YPIB.js +0 -1
- package/www/browser/chunk-RHLQRQDK.js +0 -9
- package/www/browser/chunk-S3SJ4VVM.js +0 -11
- package/www/browser/chunk-SIVPP74B.js +0 -0
- package/www/browser/chunk-UFY3FLDK.js +0 -1
- package/www/browser/chunk-UQGCUFNM.js +0 -1
- package/www/browser/chunk-UXXWRMM6.js +0 -1
- package/www/browser/chunk-UZRJGJTD.js +0 -2
- package/www/browser/chunk-WI67LAOV.js +0 -4
- package/www/browser/chunk-WNCM6QKB.js +0 -1
- package/www/browser/chunk-YETDFSQE.js +0 -1
- package/www/browser/chunk-YMTC5GZK.js +0 -1
- package/www/browser/chunk-YVZHJ76K.js +0 -1
- package/www/browser/main-6LN5C22E.js +0 -34
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import{a as Bn,b as An}from"./chunk-ONXBYGIG.js";import{a as Dn,e as En,f as Fn}from"./chunk-ZTDLWBW5.js";import{a as yt,b as Ye}from"./chunk-HDNG236Q.js";import{b as In,c as Vn,d as Rn}from"./chunk-4LBSLURA.js";import{a as Ze,b as Xe,c as Je,d as et,e as tt}from"./chunk-DIJPUYIA.js";import{a as ze,b as xe}from"./chunk-QJP5F735.js";import{a as Ae,b as We,c as Ue}from"./chunk-WD2EKZQC.js";import{a as kn,b as On,c as Ln}from"./chunk-75W3GVSO.js";import{a as St,b as wt}from"./chunk-OZCK4XVV.js";import{a as Ge,b as we}from"./chunk-AELTP6YN.js";import"./chunk-FXCG34QS.js";import{a as Tn,c as Pn,d as ge,e as fe,f as he}from"./chunk-3XNNQFWR.js";import{b as $e,c as je,e as wn}from"./chunk-YNW4HEJO.js";import{g as Ie,h as Ve,k as Re,l as Be}from"./chunk-4X42HB6N.js";import{a as Nn}from"./chunk-AV2ZODEH.js";import{d as $,k as Mn}from"./chunk-2NZJ7CN2.js";import{$a as vn,$b as Yt,Bb as yn,Cb as Sn,Fb as Q,Ga as R,Ha as k,Hb as j,Ib as He,Ka as xn,Kb as qe,L as Ht,La as _n,Lb as H,M as hn,Ma as Cn,Mb as Ke,Nb as Ct,Pa as B,Qa as A,Rb as vt,Sa as W,Ta as U,U as ht,V as rt,Vb as q,Yb as qt,Zb as Kt,_b as Qt,a as fn,ac as re,dc as ae,gc as bt,ic as Qe,jc as zn,qa as xt,sa as _t,zb as bn}from"./chunk-3CM4SKDO.js";import"./chunk-HFZLJHYR.js";import"./chunk-WUA5JFDD.js";import{g as gt,i as gn,n as E,u as ft}from"./chunk-KRYMOHYF.js";import{$b as L,Ac as Oe,Ba as rn,Bc as it,Cc as At,Da as an,Dc as Wt,Ec as oe,Fb as P,Fc as ct,Gb as ln,Gc as F,Ha as g,Ic as Le,Jc as d,Kb as dn,Kc as y,Lb as O,Lc as J,M as en,Mc as mt,Nc as mn,Oa as Ee,Oc as z,Pc as M,Qc as N,Ra as sn,Ub as ye,Wb as v,Xc as pn,Yb as b,Yc as Te,Zb as pe,_b as Ne,a as S,ac as I,b as D,bc as u,cc as a,dc as s,dd as Se,ec as x,fc as Z,gc as X,hc as cn,hd as Ut,ic as te,id as K,jc as ne,kb as Rt,kd as $t,lc as T,ma as tn,na as lt,nb as l,nd as pt,oa as nn,od as V,pd as jt,qd as ot,ra as on,rc as p,sa as w,sb as me,uc as c,ud as un,vb as Bt,vc as dt,wc as ue,ya as f,yc as Fe,yd as Pe,z as ce,za as h,zc as ke,zd as ut}from"./chunk-4BRW6LCZ.js";var ee=class r{http=w(Mn);baseUrl="/api/nginx";statusCache=null;async getStatus(){let t=await this.getData(`${this.baseUrl}/status`);return this.statusCache={instance:t.instance||null,status:t.status},t}async getStats(){let t=await this.getData(`${this.baseUrl}/stats`);return t.status&&(this.statusCache={instance:t.instance||null,status:t.status}),t}async bind(t){return await this.postData(`${this.baseUrl}/bind`,{path:t})}async unbind(){await this.postAction(`${this.baseUrl}/unbind`,{}),this.statusCache=null}getCachedStatusSnapshot(){return this.statusCache?{instance:this.statusCache.instance?S({},this.statusCache.instance):null,status:S({},this.statusCache.status)}:null}async getLocalIp(){return await this.getData(`${this.baseUrl}/local-ip`)}async start(){return this.executeWithRetry(()=>this.postData(`${this.baseUrl}/start`,{}))}async stop(){return this.executeWithRetry(()=>this.postData(`${this.baseUrl}/stop`,{}))}async reload(){return this.executeWithRetry(()=>this.postData(`${this.baseUrl}/reload`,{}))}async test(){return await ce(this.http.post(`${this.baseUrl}/test`,{}))}async getConfig(){return await this.getData(`${this.baseUrl}/config`)}async updateConfig(t){await this.putAction(`${this.baseUrl}/config`,{content:t})}async validateConfig(t){return await ce(this.http.post(`${this.baseUrl}/config/validate`,{content:t}))}async getConfigFiles(){return await this.getData(`${this.baseUrl}/config/files`)}async getConfigFile(t){let e=new ft().set("filePath",t);return await this.getData(`${this.baseUrl}/config/file`,e)}async updateConfigFile(t,e){await this.putAction(`${this.baseUrl}/config/file`,{filePath:t,content:e})}async getServers(){return await this.getData(`${this.baseUrl}/servers`)}async getServer(t){return await this.getData(`${this.baseUrl}/servers/${t}`)}async createServer(t){return await this.postData(`${this.baseUrl}/servers`,t)}async updateServer(t,e){return await this.putData(`${this.baseUrl}/servers/${t}`,e)}async deleteServer(t){return await this.deleteData(`${this.baseUrl}/servers/${t}`)}async restoreDeletedServer(t){return await this.postData(`${this.baseUrl}/servers/restore-deleted`,{snapshotId:t})}async enableServer(t){await this.patchAction(`${this.baseUrl}/servers/${t}/enable`,{})}async disableServer(t){await this.patchAction(`${this.baseUrl}/servers/${t}/disable`,{})}async validateSslPaths(t,e){return await this.postData(`${this.baseUrl}/servers/validate-ssl-paths`,{sslCert:t,sslKey:e})}async parseImportServers(t){return await this.postData(`${this.baseUrl}/servers/import/parse`,{content:t})}async analyzeImportServers(t){return await this.postData(`${this.baseUrl}/servers/import/analyze`,{requests:t})}async getUpstreams(){return await this.getData(`${this.baseUrl}/upstreams`)}async saveUpstreams(t){await this.putAction(`${this.baseUrl}/upstreams`,{upstreams:t})}async getSslCertificates(){return await this.getData(`${this.baseUrl}/ssl/certificates`)}async saveSslCertificates(t){await this.putAction(`${this.baseUrl}/ssl/certificates`,{certificates:t})}async getTrafficConfig(){return await this.getData(`${this.baseUrl}/traffic`)}async saveTrafficConfig(t){await this.putAction(`${this.baseUrl}/traffic`,t)}async getPerformanceConfig(){return await this.getData(`${this.baseUrl}/performance`)}async savePerformanceConfig(t){await this.putAction(`${this.baseUrl}/performance`,t)}async getModuleSettings(){return await this.getData(`${this.baseUrl}/module/settings`)}async saveModuleSettings(t){return await this.putData(`${this.baseUrl}/module/settings`,t)}async getErrorLogs(t=100){let e=new ft().set("tail",t.toString());return await this.getData(`${this.baseUrl}/logs/error`,e)}async getAccessLogs(t=100){let e=new ft().set("tail",t.toString());return await this.getData(`${this.baseUrl}/logs/access`,e)}async getLogsInfo(){return await this.getData(`${this.baseUrl}/logs/info`)}async executeWithRetry(t,e={}){let n=Math.max(0,e.retries??1),i=Math.max(0,e.delayMs??500),o;for(let m=0;m<=n;m++)try{return await t()}catch(_){if(o=_,m>=n)throw _;i>0&&await new Promise(C=>setTimeout(C,i))}throw o}async getData(t,e){return await ce(this.http.get(t,e))}async postData(t,e){return await ce(this.http.post(t,e))}async putData(t,e){return await ce(this.http.put(t,e))}async deleteData(t){return await ce(this.http.delete(t))}async postAction(t,e){await ce(this.http.post(t,e))}async putAction(t,e){await ce(this.http.put(t,e))}async patchAction(t,e){await ce(this.http.patch(t,e))}static \u0275fac=function(e){return new(e||r)};static \u0275prov=lt({token:r,factory:r.\u0275fac,providedIn:"root"})};function Wn(){let r=window;if(!r.monaco)return;let t=r.monaco;t.languages.getLanguages().some(e=>e.id==="nginx")||(t.languages.register({id:"nginx",extensions:[".conf"],aliases:["Nginx"]}),t.languages.setMonarchTokensProvider("nginx",{tokenizer:{root:[[/#.*$/,"comment"],[/^\s*(http|server|events|stream|upstream|location|map|geo|types|if|in|limit_except|split_clients|match)\b/,"keyword.control"],[/\b(root|index|try_files|alias|return|rewrite|proxy_pass|fastcgi_pass|scgi_pass|uwsgi_pass|include|set|add_header|expires|proxy_set_header|fastcgi_param|listen|server_name|error_page|default_server|upstream|zone|least_conn|ip_hash|keepalive|keepalive_requests|keepalive_timeout|worker_processes|worker_connections|use|multi_accept|accept_mutex|sendfile|tcp_nopush|tcp_nodelay|reset_timedout|resolver|resolver_timeout|client_max_body_size|client_body_buffer|gzip|gunzip|gzip_types|gzip_comp_level|gzip_vary|open_file_cache|open_file_cache_valid|open_file_cache_min_uses|log_format|access_log|error_log|pid|user|group|daemon|master_process|worker_rlimit_nofile|worker_rlimit_core|worker_shutdown|load_module|types|default_type|server_tokens|aio|directio|sendfile_max_chunk|proxy_buffering|proxy_buffer_size|proxy_buffers|proxy_busy_buffers_size|proxy_temp_path|proxy_temp_file_write_size|fastcgi_buffer_size|fastcgi_buffers|fastcgi_busy_buffers_size|fastcgi_temp_path|fastcgi_temp_file_write_size|fastcgi_cache|fastcgi_cache_key|fastcgi_cache_path|fastcgi_cache_valid|fastcgi_cache_use_stale|fastcgi_no_cache|fastcgi_cache_bypass|fastcgi_ignore_headers|fastcgi_intercept_errors|fastcgi_next_upstream|fastcgi_next_upstream_tries|fastcgi_connect_timeout|fastcgi_send_timeout|fastcgi_read_timeout|proxy_connect_timeout|proxy_send_timeout|proxy_read_timeout|proxy_ignore_client_abort|proxy_hide_header|proxy_pass_header|proxy_redirect|proxy_cookie_domain|proxy_cookie_path|proxy_set_header|proxy_http_version|proxy_force_ranges|proxy_cache|proxy_cache_key|proxy_cache_path|proxy_cache_valid|proxy_cache_use_stale|proxy_cache_background_update|proxy_cache_lock|proxy_cache_lock_timeout|proxy_no_cache|proxy_cache_bypass|proxy_ignore_headers|proxy_intercept_errors|proxy_next_upstream|proxy_next_upstream_tries|proxy_next_upstream_timeout|proxy_store|proxy_store_access|auth_basic|auth_basic_user_file|satisfy|allow|deny|limit_req|limit_req_zone|limit_req_status|limit_conn|limit_conn_zone|limit_conn_status|return|rewrite|break|set|if|set_by_lua|access_by_lua|content_by_lua|header_filter_by_lua|body_filter_by_lua|log_by_lua|rewrite_by_lua|init_by_lua|init_worker_by_lua|ssl_certificate|ssl_certificate_key|ssl_session_cache|ssl_session_timeout|ssl_protocols|ssl_ciphers|ssl_prefer_server_ciphers|ssl_verify_client|ssl_client_certificate|ssl_trusted_certificate|ssl_crl|real_ip_header|set_real_ip_from|geo|geoip_country|geoip_city|memcached_pass|memcached_connect_timeout|memcached_send_timeout|memcached_read_timeout|grpc_pass|grpc_connect_timeout|grpc_send_timeout|grpc_read_timeout|grpc_buffer_size|websocket|websocket_connect_timeout|websocket_send_timeout|websocket_read_timeout|websocket_ping_interval|websocket_ping_timeout|concat|concat_types|secure_link|secure_link_md5|add_before_body|add_after_body|addition_types|image_filter|xslt_stylesheet|xslt_types|random_index|geo|map|perl|perl_modules|perl_require|perl_handler|slice|mp4|mp4_buffer_size|mp4_max_buffer_size|flv|ogmp|status|status_format|check|check_http_send|check_http_expect_alive|check_shm_size|check_status|upstream_conf|js_set|js_content|js_header_filter_by_lua|js_body_filter_by_lua|js_log_by_lua|js_access_by_lua|js_content_by_lua|js_rewrite_by_lua|js_preread_by_lua|influxdb|set_|add_|proxy_|fastcgi_|uwsgi_|scgi_|grpc_|limit_|auth_|secure_|websocket_|ssl_|real_|memcached_|grpc_|proxy_next_upstream_tries|proxy_next_upstream_timeout)\b/,"keyword.directive"],[/\b(on|off|yes|no|true|false|default|none|any|auto|inline|upstream|down|backup|weight|max_fails|fail_timeout)\b/,"keyword.value"],[/\b\d+[kKmMgG]?\b/,"number"],[/"[^"]*"/,"string"],[/'[^']*'/,"string"],[/\$[a-zA-Z_][a-zA-Z0-9_]*/,"variable"],[/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(:\d+)?\b/,"number"],[/\b\d{1,5}\b/,"number"]]}}),t.editor.defineTheme("nginx-theme",{base:"vs",inherit:!0,rules:[{token:"comment",foreground:"6A9955",fontStyle:"italic"},{token:"keyword.control",foreground:"0000FF",fontStyle:"bold"},{token:"keyword.directive",foreground:"795E26"},{token:"keyword.value",foreground:"0000FF"},{token:"string",foreground:"A31515"},{token:"number",foreground:"098658"},{token:"variable",foreground:"001188"}]}))}var ii=["editorShell"];function oi(r,t){r&1&&x(0,"nz-icon",7)}function ri(r,t){if(r&1&&x(0,"nz-option",9),r&2){let e=t.$implicit,n=c();u("nzValue",e)("nzLabel",n.getFileLabel(e))}}function ai(r,t){r&1&&(x(0,"nz-icon",25),a(1,"span"),d(2,"\u914D\u7F6E\u9A8C\u8BC1\u901A\u8FC7"),s())}function si(r,t){r&1&&(x(0,"nz-icon",26),a(1,"span"),d(2,"\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25"),s())}function li(r,t){if(r&1&&(a(0,"div",27),d(1),s()),r&2){let e=t.$implicit;l(),y(e)}}function di(r,t){if(r&1&&(a(0,"div",23),L(1,li,2,1,"div",27,pe),s()),r&2){let e,n=c(2);l(),I((e=n.validationResult())==null?null:e.errors)}}function ci(r,t){if(r&1&&(a(0,"div",28),d(1),s()),r&2){let e=t.$implicit;l(),y(e)}}function mi(r,t){if(r&1&&(a(0,"div",24),L(1,ci,2,1,"div",28,pe),s()),r&2){let e,n=c(2);l(),I((e=n.validationResult())==null?null:e.warnings)}}function pi(r,t){if(r&1&&(a(0,"div",22),v(1,ai,3,0)(2,si,3,0),v(3,di,3,0,"div",23),v(4,mi,3,0,"div",24),s()),r&2){let e,n,i,o,m=c();F("error",!((e=m.validationResult())!=null&&e.valid)),l(),b((n=m.validationResult())!=null&&n.valid?1:2),l(2),b(!((i=m.validationResult())==null||i.errors==null)&&i.errors.length?3:-1),l(),b(!((o=m.validationResult())==null||o.warnings==null)&&o.warnings.length?4:-1)}}var zt=class r{refreshToken=0;editorShellRef;nginxService=w(ee);message=w($);config=g(null);configFiles=g([]);selectedFilePath=g("");originalContent=g("");editorContent=g("");filesLoading=g(!1);loading=g(!0);saving=g(!1);validating=g(!1);validationResult=g(null);editorHeight=g(520);editorOptions={language:"nginx"};mainConfigPath="";diffEditor=null;resizeObserver=null;async ngOnInit(){await this.loadConfig(!0),await this.loadConfigFiles()}ngAfterViewInit(){this.setupEditorHeightObserver(),this.updateEditorHeight()}ngOnChanges(t){let e=t.refreshToken;e&&!e.firstChange&&this.loadConfigFiles()}ngOnDestroy(){this.resizeObserver?.disconnect(),this.resizeObserver=null}onCodeEditorInitialized(t){Wn(),this.isDiffEditor(t)&&(this.diffEditor=t),this.scheduleLayout()}onEditorContentChange(t){this.editorContent.set(String(t??""))}async loadConfig(t=!1){this.loading.set(!0);try{let e=this.selectedFilePath(),n=t||!e||this.isSamePath(e,this.mainConfigPath||e),i=n?await this.nginxService.getConfig():await this.nginxService.getConfigFile(e);if(i.config){let o=i.config.content||"";this.config.set(i.config),this.originalContent.set(o),this.editorContent.set(o),this.validationResult.set(null),this.selectedFilePath.set(i.config.mainConfigPath||e),(n||!this.mainConfigPath)&&(this.mainConfigPath=i.config.mainConfigPath),this.mergeConfigFiles([i.config.mainConfigPath]),this.updateEditorHeight(),this.scheduleLayout()}}catch(e){this.message.error("\u52A0\u8F7D\u914D\u7F6E\u5931\u8D25: "+e.message)}finally{this.loading.set(!1)}}async saveConfig(){let t=this.selectedFilePath()||this.config()?.mainConfigPath||"";if(!t){this.message.error("\u672A\u9009\u62E9\u914D\u7F6E\u6587\u4EF6");return}this.saving.set(!0);try{let e=this.getCurrentEditorContent();this.isSamePath(t,this.mainConfigPath||t)?await this.nginxService.updateConfig(e):await this.nginxService.updateConfigFile(t,e),this.message.success("\u4FDD\u5B58\u6210\u529F"),await this.loadConfig(),await this.loadConfigFiles()}catch(e){this.message.error("\u4FDD\u5B58\u5931\u8D25: "+e.message)}finally{this.saving.set(!1)}}async validateConfig(){this.validating.set(!0);try{let t=await this.nginxService.validateConfig(this.getCurrentEditorContent());this.validationResult.set(t),t.valid?this.message.success("\u914D\u7F6E\u9A8C\u8BC1\u901A\u8FC7"):this.message.error("\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25")}catch(t){this.message.error("\u9A8C\u8BC1\u5931\u8D25: "+t.message)}finally{this.validating.set(!1)}}async loadConfigFiles(){this.filesLoading.set(!0);try{let e=(await this.nginxService.getConfigFiles()).files||[],n=this.buildFileList(e);this.configFiles.set(n);let i=this.selectedFilePath();i&&n.length&&!n.some(o=>this.isSamePath(o,i))&&(this.selectedFilePath.set(n[0]),await this.loadConfig())}catch(t){this.message.error("\u52A0\u8F7D\u6587\u4EF6\u5217\u8868\u5931\u8D25: "+t.message)}finally{this.filesLoading.set(!1)}}async onSelectConfigFile(t){let e=String(t||"").trim();!e||this.isSamePath(e,this.selectedFilePath())||(this.selectedFilePath.set(e),await this.loadConfig())}getFileLabel(t){let n=String(t||"").replace(/\\/g,"/").split("/");return n[n.length-1]||t}hasUnsavedChanges(){return this.getCurrentEditorContent()!==this.originalContent()}restoreFromOriginal(){let t=this.originalContent(),e=this.diffEditor?.getModel()?.modified;e&&e.setValue(t),this.editorContent.set(t),this.validationResult.set(null),this.scheduleLayout(),this.message.success("\u5DF2\u8FD8\u539F\u5230\u5DF2\u52A0\u8F7D\u7248\u672C")}getCurrentEditorContent(){let t=this.diffEditor?.getModel()?.modified;return t?t.getValue():this.editorContent()}mergeConfigFiles(t){let e=this.buildFileList([...this.configFiles(),...t]);this.configFiles.set(e)}buildFileList(t){let e=new Map;for(let i of t){let o=this.normalizePath(i);o&&(e.has(o)||e.set(o,i))}let n=Array.from(e.values());if(n.sort((i,o)=>i.localeCompare(o)),this.mainConfigPath){let i=n.findIndex(o=>this.isSamePath(o,this.mainConfigPath));if(i>0){let[o]=n.splice(i,1);n.unshift(o)}i<0&&n.unshift(this.mainConfigPath)}return n}isSamePath(t,e){return this.normalizePath(t)===this.normalizePath(e)}normalizePath(t){return String(t||"").trim().replace(/\\/g,"/").toLowerCase()}scheduleLayout(){setTimeout(()=>{try{this.updateEditorHeight(),this.syncDiffEditorHeight(),this.diffEditor?.layout()}catch{}},0)}setupEditorHeightObserver(){let t=this.editorShellRef?.nativeElement;!t||typeof ResizeObserver>"u"||(this.resizeObserver?.disconnect(),this.resizeObserver=new ResizeObserver(()=>{this.updateEditorHeight(),setTimeout(()=>{this.syncDiffEditorHeight(),this.diffEditor?.layout()},0)}),this.resizeObserver.observe(t))}updateEditorHeight(){let t=this.editorShellRef?.nativeElement;if(!t){this.editorHeight.set(520);return}let e=t.clientHeight>0?t.clientHeight:0,n=Math.max(520,e);this.editorHeight()!==n&&this.editorHeight.set(n)}syncDiffEditorHeight(){let t=this.diffEditor?.getContainerDomNode();if(!t)return;let e=`${this.editorHeight()}px`;t.style.height=e;let n=t.querySelector(".monaco-diff-editor");n&&(n.style.height=e,n.style.minHeight="520px")}isDiffEditor(t){return typeof t.getOriginalEditor=="function"}static \u0275fac=function(e){return new(e||r)};static \u0275cmp=P({type:r,selectors:[["app-nginx-config-editor"]],viewQuery:function(e,n){if(e&1&&Fe(ii,7),e&2){let i;ke(i=Oe())&&(n.editorShellRef=i.first)}},inputs:{refreshToken:"refreshToken"},features:[Ee],decls:31,vars:17,consts:[["editorShell",""],[1,"config-editor"],[1,"editor-toolbar"],[1,"toolbar-left"],[1,"file-info"],["nzType","file-text","nzTheme","outline"],[1,"file-path"],["nzType","lock","nzTheme","outline","nz-tooltip","","nzTooltipTitle","\u914D\u7F6E\u6587\u4EF6\u53EA\u8BFB\uFF0C\u53EF\u80FD\u9700\u8981\u7BA1\u7406\u5458\u6743\u9650"],["nzPlaceHolder","\u9009\u62E9\u914D\u7F6E\u6587\u4EF6",1,"file-selector",3,"ngModelChange","ngModel","nzDisabled"],[3,"nzValue","nzLabel"],["nz-button","","nzType","default",3,"click","nzLoading"],["nzType","reload","nzTheme","outline"],[1,"editor-actions"],["nz-button","",3,"click","nzLoading"],["nz-button","","nzType","default","nz-popconfirm","","nzPopconfirmTitle","\u786E\u8BA4\u8FD8\u539F\u4E3A\u5F53\u524D\u5DF2\u52A0\u8F7D\u7248\u672C\uFF1F","nzPopconfirmPlacement","top",3,"nzOnConfirm","disabled"],["nzType","rollback","nzTheme","outline"],["nzType","check-circle","nzTheme","outline"],["nz-button","","nzType","primary",3,"click","nzLoading","disabled"],["nzType","save","nzTheme","outline"],[1,"editor-container"],["nzEditorMode","diff",1,"code-editor",3,"ngModelChange","nzEditorInitialized","ngModel","nzOriginalText","nzEditorOption","nzLoading"],[1,"validation-result",3,"error"],[1,"validation-result"],[1,"error-list"],[1,"warning-list"],["nzType","check-circle","nzTheme","outline",1,"success-icon"],["nzType","close-circle","nzTheme","outline",1,"error-icon"],[1,"error-item"],[1,"warning-item"]],template:function(e,n){if(e&1){let i=T();a(0,"div",1)(1,"div",2)(2,"div",3)(3,"div",4),x(4,"nz-icon",5),a(5,"span",6),d(6),s(),v(7,oi,1,0,"nz-icon",7),s(),a(8,"nz-select",8),p("ngModelChange",function(m){return f(i),h(n.onSelectConfigFile(m))}),L(9,ri,1,2,"nz-option",9,Ne),s(),a(11,"button",10),p("click",function(){return f(i),h(n.loadConfigFiles())}),x(12,"nz-icon",11),d(13," \u5237\u65B0\u6587\u4EF6\u5217\u8868 "),s()(),a(14,"div",12)(15,"button",13),p("click",function(){return f(i),h(n.loadConfig())}),x(16,"nz-icon",11),d(17," \u5237\u65B0 "),s(),a(18,"button",14),p("nzOnConfirm",function(){return f(i),h(n.restoreFromOriginal())}),x(19,"nz-icon",15),d(20," \u8FD8\u539F "),s(),a(21,"button",13),p("click",function(){return f(i),h(n.validateConfig())}),x(22,"nz-icon",16),d(23," \u9A8C\u8BC1 "),s(),a(24,"button",17),p("click",function(){return f(i),h(n.saveConfig())}),x(25,"nz-icon",18),d(26," \u4FDD\u5B58 "),s()()(),a(27,"div",19,0)(29,"nz-code-editor",20),p("ngModelChange",function(m){return f(i),h(n.onEditorContentChange(m))})("nzEditorInitialized",function(m){return f(i),h(n.onCodeEditorInitialized(m))}),s()(),v(30,pi,5,5,"div",21),s()}if(e&2){let i,o,m;l(6),y(((i=n.config())==null?null:i.mainConfigPath)||"\u672A\u52A0\u8F7D"),l(),b(((o=n.config())==null?null:o.isWritable)===!1?7:-1),l(),u("ngModel",n.selectedFilePath())("nzDisabled",n.loading()||!n.configFiles().length),l(),I(n.configFiles()),l(2),u("nzLoading",n.filesLoading()),l(4),u("nzLoading",n.loading()),l(3),u("disabled",!n.hasUnsavedChanges()),l(3),u("nzLoading",n.validating()),l(3),u("nzLoading",n.saving())("disabled",!((m=n.config())!=null&&m.isWritable)),l(5),ct("height",n.editorHeight(),"px"),u("ngModel",n.editorContent())("nzOriginalText",n.originalContent())("nzEditorOption",n.editorOptions)("nzLoading",n.loading()),l(),b(n.validationResult()?30:-1)}},dependencies:[E,q,j,H,U,W,B,A,An,Bn,k,R,Ye,yt,he,ge,fe,zn,bt],styles:['.config-editor[_ngcontent-%COMP%]{display:flex;flex-direction:column;height:100%;border:1px solid #f0f0f0;border-radius:8px;overflow:hidden}.editor-toolbar[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;padding:12px 16px;background:#fafafa;border-bottom:1px solid #f0f0f0}.editor-toolbar[_ngcontent-%COMP%] .toolbar-left[_ngcontent-%COMP%]{min-width:0;flex:1;display:flex;flex-direction:row;align-items:center;flex-wrap:wrap;gap:10px}.editor-toolbar[_ngcontent-%COMP%] .file-info[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;font-size:var(--nginx-font-size-base, 14px);min-width:0}.editor-toolbar[_ngcontent-%COMP%] .file-info[_ngcontent-%COMP%] .file-path[_ngcontent-%COMP%]{font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace);color:#000000a6;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.editor-toolbar[_ngcontent-%COMP%] .file-selector[_ngcontent-%COMP%]{width:min(560px,100%)}.editor-toolbar[_ngcontent-%COMP%] .editor-actions[_ngcontent-%COMP%]{display:flex;gap:8px;flex-shrink:0}.editor-container[_ngcontent-%COMP%]{flex:1;min-height:520px;position:relative}.code-editor[_ngcontent-%COMP%]{display:block;min-height:520px;width:100%;border:1px solid #d9d9d9}.validation-result[_ngcontent-%COMP%]{padding:12px 16px;background:#f6ffed;border-top:1px solid #b7eb8f;display:flex;align-items:center;gap:8px}.validation-result.error[_ngcontent-%COMP%]{background:#fff2f0;border-top-color:#ffccc7}.validation-result[_ngcontent-%COMP%] .success-icon[_ngcontent-%COMP%]{color:#52c41a}.validation-result[_ngcontent-%COMP%] .error-icon[_ngcontent-%COMP%]{color:#ff4d4f}.validation-result[_ngcontent-%COMP%] .error-list[_ngcontent-%COMP%], .validation-result[_ngcontent-%COMP%] .warning-list[_ngcontent-%COMP%]{margin-top:8px;width:100%}.validation-result[_ngcontent-%COMP%] .error-list[_ngcontent-%COMP%] .error-item[_ngcontent-%COMP%], .validation-result[_ngcontent-%COMP%] .warning-list[_ngcontent-%COMP%] .error-item[_ngcontent-%COMP%]{color:#ff4d4f;font-size:var(--nginx-font-size-sm, 12px);padding:4px 0;font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace)}.validation-result[_ngcontent-%COMP%] .error-list[_ngcontent-%COMP%] .warning-item[_ngcontent-%COMP%], .validation-result[_ngcontent-%COMP%] .warning-list[_ngcontent-%COMP%] .warning-item[_ngcontent-%COMP%]{color:#faad14;font-size:var(--nginx-font-size-sm, 12px);padding:4px 0;font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace)}[_nghost-%COMP%] nz-code-editor.code-editor.ant-code-editor{width:100%;min-height:520px!important;display:block}[_nghost-%COMP%] nz-code-editor.code-editor .monaco-diff-editor{min-height:520px}']})};var ui=["logBody"];function gi(r,t){r&1&&(cn(0,"span",8),d(1," \u5B9E\u65F6 "))}function fi(r,t){if(r&1&&d(0),r&2){let e=c();J(" ",e.status," ")}}function hi(r,t){r&1&&(Z(0,"div",6),d(1,"\u6682\u65E0\u65E5\u5FD7"),X())}function xi(r,t){if(r&1&&(Z(0,"div",7)(1,"span",9),d(2),X(),Z(3,"span",10),d(4),X(),Z(5,"span",11),d(6),X()()),r&2){let e=t.$implicit,n=c();l(2),y(e.time),l(),Le(n.getLevelClass(e.level)),l(),J(" ",n.getLevelLabel(e.level)," "),l(2),y(e.msg)}}var De=class r{title="error.log";status="";statusTone="default";showRealtime=!1;maxHeight=0;logs=[];logBody;scrollToBottom(){this.logBody&&(this.logBody.nativeElement.scrollTop=this.logBody.nativeElement.scrollHeight)}getLevelClass(t){return t}getLevelLabel(t){return{info:"INFO",warn:"WARN",error:"ERR",ok:"OK"}[t]??t.toUpperCase()}static \u0275fac=function(e){return new(e||r)};static \u0275cmp=P({type:r,selectors:[["app-nginx-log-viewer"]],viewQuery:function(e,n){if(e&1&&Fe(ui,5),e&2){let i;ke(i=Oe())&&(n.logBody=i.first)}},inputs:{title:"title",status:"status",statusTone:"statusTone",showRealtime:"showRealtime",maxHeight:"maxHeight",logs:"logs"},decls:12,vars:13,consts:[["logBody",""],[1,"log-panel"],[1,"log-header"],[1,"log-header-title"],[1,"log-header-status"],[1,"log-body"],[1,"log-empty"],[1,"log-line"],[1,"realtime-dot"],[1,"log-time"],[1,"log-level"],[1,"log-msg"]],template:function(e,n){e&1&&(Z(0,"div",1)(1,"div",2)(2,"span",3),d(3),X(),Z(4,"span",4),v(5,gi,2,0)(6,fi,1,1),X()(),Z(7,"div",5,0),v(9,hi,2,0,"div",6),L(10,xi,7,5,"div",7,pe),X()()),e&2&&(l(3),y(n.title),l(),F("realtime",n.showRealtime)("status-ok",n.statusTone==="ok")("status-warn",n.statusTone==="warn")("status-error",n.statusTone==="error"),l(),b(n.showRealtime?5:6),l(2),ct("max-height",n.maxHeight,"px"),l(2),b(n.logs.length===0?9:-1),l(),I(n.logs))},dependencies:[E,k],styles:['[_nghost-%COMP%]{display:block}.log-panel[_ngcontent-%COMP%]{background:#1b2332;border-radius:6px;overflow:hidden}.log-header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;padding:8px 14px;background:#00000026}.log-header-title[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);font-weight:700;text-transform:uppercase;letter-spacing:.5px;color:#fff6}.log-header-status[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);color:#ffffff80;font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace);font-weight:600;display:flex;align-items:center;gap:5px}.log-header-status.realtime[_ngcontent-%COMP%], .log-header-status.status-ok[_ngcontent-%COMP%]{color:#3dd68c}.log-header-status.status-warn[_ngcontent-%COMP%]{color:#f7ba1e}.log-header-status.status-error[_ngcontent-%COMP%]{color:#ef5350}.realtime-dot[_ngcontent-%COMP%]{width:6px;height:6px;border-radius:50%;background:#3dd68c;animation:_ngcontent-%COMP%_pulse 2s ease-in-out infinite}@keyframes _ngcontent-%COMP%_pulse{0%,to{opacity:1}50%{opacity:.4}}.log-body[_ngcontent-%COMP%]{padding:10px 14px;max-height:180px;overflow-y:auto;font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace);font-size:var(--nginx-font-size-sm, 12px);line-height:1.8}.log-body[_ngcontent-%COMP%]::-webkit-scrollbar{width:6px}.log-body[_ngcontent-%COMP%]::-webkit-scrollbar-track{background:transparent}.log-body[_ngcontent-%COMP%]::-webkit-scrollbar-thumb{background:#333944;border-radius:3px}.log-empty[_ngcontent-%COMP%]{padding:16px 0;font-size:var(--nginx-font-size-sm, 12px);color:#ffffff59;text-align:center;font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace)}.log-line[_ngcontent-%COMP%]{display:flex;align-items:flex-start;gap:10px;cursor:default}.log-time[_ngcontent-%COMP%]{color:#ffffff80;flex-shrink:0;min-width:46px}.log-level[_ngcontent-%COMP%]{font-weight:700;flex-shrink:0;width:32px}.log-level.info[_ngcontent-%COMP%]{color:#165dff}.log-level.warn[_ngcontent-%COMP%]{color:#ff7d00}.log-level.error[_ngcontent-%COMP%]{color:#ef5350}.log-level.ok[_ngcontent-%COMP%]{color:#3dd68c}.log-msg[_ngcontent-%COMP%]{color:#ffffff8c;flex:1;word-break:break-all;white-space:pre-wrap}']})};var Nt=class r{nginxService=w(ee);wsClient=w(Nn);message=w($);wsSub;logViewerComponent;activeLogTab=g("error");isConnected=g(!1);loading=g(!1);errorLogs=g([]);accessLogs=g([]);currentLogs=g([]);maxLogLines=500;statusText=g("\u672A\u8FDE\u63A5");statusTone=g("default");ngOnInit(){this.setupWsSubscription(),this.loadInitialLogs()}ngOnDestroy(){this.unsubscribeWs(),this.wsSub?.unsubscribe()}switchLogTab(t){this.activeLogTab.set(t),this.updateCurrentLogs(),this.isConnected()&&(this.unsubscribeWs(),this.subscribeWs(t))}scrollToBottom(){this.logViewerComponent?.scrollToBottom()}async refreshLogs(){await this.loadInitialLogs(),this.message.success("\u65E5\u5FD7\u5DF2\u5237\u65B0")}clearLogs(){this.activeLogTab()==="error"?this.errorLogs.set([]):this.accessLogs.set([]),this.updateCurrentLogs()}setupWsSubscription(){this.wsClient.stateChanges().subscribe(t=>{let e=t==="open";this.isConnected.set(e),this.statusText.set(e?"\u5DF2\u8FDE\u63A5":t==="connecting"?"\u8FDE\u63A5\u4E2D...":"\u672A\u8FDE\u63A5"),this.statusTone.set(e?"ok":"default"),e&&this.subscribeWs(this.activeLogTab())}),this.wsSub=this.wsClient.messages().pipe(en(t=>t.op==="nginx.log.append"||t.op==="nginx.log.tail")).subscribe(t=>{t.op==="nginx.log.tail"?(this.handleLogTail(t),setTimeout(()=>{this.scrollToBottom()},100)):t.op==="nginx.log.append"&&this.handleLogAppend(t)}),this.wsClient.connect()}subscribeWs(t){this.wsClient.send({op:"sub",topic:"nginx",logType:t,tail:50})}unsubscribeWs(){this.wsClient.send({op:"unsub",topic:"nginx"})}handleLogTail(t){let e=t.lines.map(n=>this.parseLogLine(n));t.logType==="error"?this.errorLogs.set(e):this.accessLogs.set(e),this.updateCurrentLogs()}handleLogAppend(t){let e=this.parseLogLine(t.line),n=t.logType===this.activeLogTab();t.logType==="error"?this.errorLogs.update(i=>{let o=[...i,e];return o.length>this.maxLogLines?o.slice(-this.maxLogLines):o}):this.accessLogs.update(i=>{let o=[...i,e];return o.length>this.maxLogLines?o.slice(-this.maxLogLines):o}),n&&this.updateCurrentLogs()}updateCurrentLogs(){let e=this.activeLogTab()==="error"?this.errorLogs():this.accessLogs();this.currentLogs.set(e)}async loadInitialLogs(){this.loading.set(!0);try{let[t,e]=await Promise.all([this.nginxService.getErrorLogs(100),this.nginxService.getAccessLogs(100)]);t.lines&&this.errorLogs.set(t.lines.map(n=>this.parseLogLine(n))),e.lines&&this.accessLogs.set(e.lines.map(n=>this.parseLogLine(n))),this.updateCurrentLogs()}catch(t){this.message.error("\u52A0\u8F7D\u65E5\u5FD7\u5931\u8D25: "+t.message)}finally{this.loading.set(!1)}}parseLogLine(t){let e=t.match(/^(\d{4}\/\d{2}\/\d{2}\s+\d{2}:\d{2}:\d{2})/),n=t.match(/\[(error|warn|notice|info|crit|alert|emerg)\]/i),i="";if(e)i=e[1].split(/\s+/)[1]||e[1];else{let m=t.match(/(\d{2}:\d{2}:\d{2})/);i=m?m[1]:new Date().toLocaleTimeString("zh-CN",{hour12:!1})}let o="info";if(n){let m=n[1].toLowerCase();m==="error"||m==="crit"||m==="alert"||m==="emerg"?o="error":m==="warn"&&(o="warn")}return{time:i,level:o,msg:t}}static \u0275fac=function(e){return new(e||r)};static \u0275cmp=P({type:r,selectors:[["app-nginx-secondary-logs-tab"]],viewQuery:function(e,n){if(e&1&&Fe(De,5),e&2){let i;ke(i=Oe())&&(n.logViewerComponent=i.first)}},decls:14,vars:10,consts:[[1,"panel-header-row","compact"],[1,"log-tabs"],[1,"log-tab",3,"click"],[1,"log-actions"],["nz-button","","nzType","default",1,"log-action-btn",3,"click"],["nzType","vertical-align-bottom","nzTheme","outline"],["nz-button","","nzType","default",3,"click"],["nzType","reload","nzTheme","outline"],["nzType","delete","nzTheme","outline"],[3,"title","showRealtime","status","statusTone","logs","maxHeight"]],template:function(e,n){e&1&&(a(0,"div",0)(1,"div",1)(2,"button",2),p("click",function(){return n.switchLogTab("error")}),d(3," error.log "),s(),a(4,"button",2),p("click",function(){return n.switchLogTab("access")}),d(5," access.log "),s()(),a(6,"div",3)(7,"button",4),p("click",function(){return n.scrollToBottom()}),x(8,"nz-icon",5),s(),a(9,"button",6),p("click",function(){return n.refreshLogs()}),x(10,"nz-icon",7),s(),a(11,"button",4),p("click",function(){return n.clearLogs()}),x(12,"nz-icon",8),s()()(),x(13,"app-nginx-log-viewer",9)),e&2&&(l(2),F("active",n.activeLogTab()==="error"),l(2),F("active",n.activeLogTab()==="access"),l(9),u("title",n.activeLogTab()==="error"?"error.log":"access.log")("showRealtime",n.isConnected())("status",n.statusText())("statusTone",n.statusTone())("logs",n.currentLogs())("maxHeight",400))},dependencies:[E,U,W,B,A,k,R,De],styles:["[_nghost-%COMP%]{display:block}.panel-header-row[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;gap:8px;margin-bottom:12px}.panel-header-row.compact[_ngcontent-%COMP%]{margin-bottom:10px}.log-tabs[_ngcontent-%COMP%]{display:flex;gap:0}.log-tab[_ngcontent-%COMP%]{background:transparent;color:var(--text-3);font-size:var(--nginx-font-size-sm, 12px);font-weight:500;padding:6px 12px;cursor:pointer;transition:all .12s ease;border:none;border-bottom:2px solid transparent;margin-bottom:-1px}.log-tab[_ngcontent-%COMP%]:hover{color:var(--text-2)}.log-tab.active[_ngcontent-%COMP%]{color:var(--blue);border-bottom-color:var(--blue);font-weight:600}.log-actions[_ngcontent-%COMP%]{display:flex;gap:4px}.log-action-btn[_ngcontent-%COMP%] nz-icon[_ngcontent-%COMP%]{font-size:12px}"]})};var se=class r{constructor(t){this.nginxService=t}upstreams=g([]);sslCertificates=g([]);trafficConfig=g({rateLimitEnabled:!1,rateLimit:"",connLimitEnabled:!1,connLimit:0,blacklistIps:[]});performanceConfig=g({gzipEnabled:!1,gzipTypes:"",keepaliveTimeout:"",workerProcesses:"",sendfile:!1,tcpNopush:!1});moduleSettings=g({backupRetention:5,configBackupRetention:20});upstreamsLoading=g(!1);sslLoading=g(!1);trafficLoading=g(!1);performanceLoading=g(!1);settingsLoading=g(!1);async loadUpstreams(){this.upstreamsLoading.set(!0);try{let t=await this.nginxService.getUpstreams();return t.upstreams&&this.upstreams.set(t.upstreams),t}finally{this.upstreamsLoading.set(!1)}}async saveUpstreams(t){await this.nginxService.saveUpstreams(t),this.upstreams.set(t.map(e=>S({},e)))}async loadSslCertificates(){this.sslLoading.set(!0);try{let t=await this.nginxService.getSslCertificates();return t.certificates&&this.sslCertificates.set(t.certificates.map(e=>S({},e))),t}finally{this.sslLoading.set(!1)}}async saveSslCertificates(t){await this.nginxService.saveSslCertificates(t),this.sslCertificates.set(t.map(e=>S({},e)))}async loadTrafficConfig(){this.trafficLoading.set(!0);try{let t=await this.nginxService.getTrafficConfig();return t.traffic&&this.trafficConfig.set(D(S({},t.traffic),{connLimit:Math.max(0,Number(t.traffic.connLimit??0))})),t}finally{this.trafficLoading.set(!1)}}async saveTrafficConfig(t){await this.nginxService.saveTrafficConfig(t),this.trafficConfig.set(S({},t))}async loadPerformanceConfig(){this.performanceLoading.set(!0);try{let t=await this.nginxService.getPerformanceConfig();return t.performance&&this.performanceConfig.set(S({},t.performance)),t}finally{this.performanceLoading.set(!1)}}async savePerformanceConfig(t){await this.nginxService.savePerformanceConfig(t),this.performanceConfig.set(S({},t))}async loadModuleSettings(){this.settingsLoading.set(!0);try{let t=await this.nginxService.getModuleSettings();return t.settings&&this.moduleSettings.set({backupRetention:Math.max(1,Number(t.settings.backupRetention??5)),configBackupRetention:Math.max(1,Number(t.settings.configBackupRetention??20))}),t}finally{this.settingsLoading.set(!1)}}async saveModuleSettings(t){let e=await this.nginxService.saveModuleSettings(t);return e.settings&&this.moduleSettings.set({backupRetention:Math.max(1,Number(e.settings.backupRetention??5)),configBackupRetention:Math.max(1,Number(e.settings.configBackupRetention??20))}),e}static \u0275fac=function(e){return new(e||r)(on(ee))};static \u0275prov=lt({token:r,factory:r.\u0275fac,providedIn:"root"})};var Tt=class r{moduleStore=w(se);message=w($);saving=g(!1);dirty=g(!1);config=g({gzipEnabled:!1,gzipTypes:"",keepaliveTimeout:"",workerProcesses:"",sendfile:!1,tcpNopush:!1});async ngOnInit(){await this.load()}async load(){try{(await this.moduleStore.loadPerformanceConfig()).performance&&(this.config.set(S({},this.moduleStore.performanceConfig())),this.dirty.set(!1))}catch(t){this.message.error("\u52A0\u8F7D\u6027\u80FD\u914D\u7F6E\u5931\u8D25: "+t.message)}}setBoolean(t,e){this.config.update(n=>D(S({},n),{[t]:e})),this.markDirty()}markDirty(){this.dirty.set(!0)}async save(){let t=D(S({},this.config()),{gzipTypes:this.config().gzipTypes.trim(),keepaliveTimeout:this.config().keepaliveTimeout.trim(),workerProcesses:this.config().workerProcesses.trim()});this.saving.set(!0);try{await this.moduleStore.savePerformanceConfig(t),this.message.success("\u6027\u80FD\u4F18\u5316\u914D\u7F6E\u5DF2\u4FDD\u5B58"),this.dirty.set(!1),await this.load()}catch(e){this.message.error("\u4FDD\u5B58\u6027\u80FD\u914D\u7F6E\u5931\u8D25: "+e.message)}finally{this.saving.set(!1)}}static \u0275fac=function(e){return new(e||r)};static \u0275cmp=P({type:r,selectors:[["app-nginx-secondary-perf-tab"]],decls:53,vars:8,consts:[[1,"panel-header-row"],[1,"panel-tip"],["nz-button","","nzType","primary",3,"click","nzLoading","disabled"],["nzType","save","nzTheme","outline"],[1,"setting-row"],[1,"setting-label"],[1,"setting-desc"],[1,"setting-ctrl"],["nzSize","small","name","gzipEnabled",3,"ngModelChange","ngModel"],["placeholder","65s",1,"setting-input",3,"ngModelChange","ngModel"],["placeholder","auto",1,"setting-input",3,"ngModelChange","ngModel"],["nzSize","small","name","sendfile",3,"ngModelChange","ngModel"],["nzSize","small","name","tcpNopush",3,"ngModelChange","ngModel"],[1,"setting-row","no-border"],[1,"full-width"],["rows","3",1,"setting-textarea","mono",3,"ngModelChange","ngModel"]],template:function(e,n){e&1&&(a(0,"div",0)(1,"span",1),d(2,"\u6027\u80FD\u4F18\u5316\u914D\u7F6E"),s(),a(3,"button",2),p("click",function(){return n.save()}),x(4,"nz-icon",3),d(5," \u4FDD\u5B58 "),s()(),a(6,"div",4)(7,"div")(8,"div",5),d(9,"Gzip \u538B\u7F29"),s(),a(10,"div",6),d(11,"\u662F\u5426\u542F\u7528 gzip"),s()(),a(12,"div",7)(13,"nz-switch",8),p("ngModelChange",function(o){return n.setBoolean("gzipEnabled",o)}),s()()(),a(14,"div",4)(15,"div")(16,"div",5),d(17,"Keepalive \u8D85\u65F6"),s(),a(18,"div",6),d(19,"keepalive_timeout"),s()(),a(20,"div",7)(21,"input",9),N("ngModelChange",function(o){return M(n.config().keepaliveTimeout,o)||(n.config().keepaliveTimeout=o),o}),p("ngModelChange",function(){return n.markDirty()}),s()()(),a(22,"div",4)(23,"div")(24,"div",5),d(25,"Worker \u8FDB\u7A0B"),s(),a(26,"div",6),d(27,"worker_processes"),s()(),a(28,"div",7)(29,"input",10),N("ngModelChange",function(o){return M(n.config().workerProcesses,o)||(n.config().workerProcesses=o),o}),p("ngModelChange",function(){return n.markDirty()}),s()()(),a(30,"div",4)(31,"div")(32,"div",5),d(33,"sendfile"),s(),a(34,"div",6),d(35,"\u9759\u6001\u6587\u4EF6\u96F6\u62F7\u8D1D"),s()(),a(36,"div",7)(37,"nz-switch",11),p("ngModelChange",function(o){return n.setBoolean("sendfile",o)}),s()()(),a(38,"div",4)(39,"div")(40,"div",5),d(41,"tcp_nopush"),s(),a(42,"div",6),d(43,"\u4F18\u5316\u5927\u6587\u4EF6\u4F20\u8F93"),s()(),a(44,"div",7)(45,"nz-switch",12),p("ngModelChange",function(o){return n.setBoolean("tcpNopush",o)}),s()()(),a(46,"div",13)(47,"div",14)(48,"div",5),d(49,"Gzip Types"),s(),a(50,"div",6),d(51,"\u7A7A\u683C\u5206\u9694 MIME \u5217\u8868"),s(),a(52,"textarea",15),N("ngModelChange",function(o){return M(n.config().gzipTypes,o)||(n.config().gzipTypes=o),o}),p("ngModelChange",function(){return n.markDirty()}),s()()()),e&2&&(l(3),u("nzLoading",n.saving())("disabled",!n.dirty()),l(10),u("ngModel",n.config().gzipEnabled),l(8),z("ngModel",n.config().keepaliveTimeout),l(8),z("ngModel",n.config().workerProcesses),l(8),u("ngModel",n.config().sendfile),l(8),u("ngModel",n.config().tcpNopush),l(7),z("ngModel",n.config().gzipTypes))},dependencies:[E,q,Q,j,H,U,W,B,A,k,R,xe,ze],styles:['[_nghost-%COMP%]{display:block}.panel-header-row[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;gap:8px;margin-bottom:12px}.panel-tip[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);color:var(--text-3)}.setting-row[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:10px 0;border-bottom:1px solid var(--border-light)}.setting-row.no-border[_ngcontent-%COMP%]{border-bottom:none}.setting-label[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);font-weight:600;color:var(--text-1)}.setting-desc[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);color:var(--text-3);margin-top:2px}.setting-ctrl[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px}.setting-input[_ngcontent-%COMP%]{width:110px;padding:5px 8px;border-radius:4px;border:1px solid var(--border);background:var(--bg-input);color:var(--text-2);font-size:var(--nginx-font-size-sm, 12px);text-align:center;font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace);outline:none}.setting-input[_ngcontent-%COMP%]:focus, .setting-textarea[_ngcontent-%COMP%]:focus{border-color:var(--blue);box-shadow:0 0 0 2px var(--blue-border)}.setting-textarea[_ngcontent-%COMP%]{width:100%;margin-top:8px;border:1px solid var(--border);border-radius:6px;background:var(--bg-input);color:var(--text-2);font-size:var(--nginx-font-size-sm, 12px);padding:8px 10px;resize:vertical;outline:none}.mono[_ngcontent-%COMP%]{font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace)}']})};var Pt=class r{moduleStore=w(se);message=w($);instance=null;configFileCount=0;unbind=new me;backupRetention=g(5);configBackupRetention=g(20);settingsDirty=g(!1);saving=g(!1);async ngOnInit(){try{let t=await this.moduleStore.loadModuleSettings();t.settings&&this.patchSettingsFromResponse(t.settings)}catch{}}setBackupRetention(t){let e=Number(t),n=Number.isFinite(e)?Math.max(1,Math.trunc(e)):1;this.backupRetention.set(n),this.settingsDirty.set(!0)}setConfigBackupRetention(t){let e=Number(t),n=Number.isFinite(e)?Math.max(1,Math.trunc(e)):1;this.configBackupRetention.set(n),this.settingsDirty.set(!0)}async saveSettings(){this.saving.set(!0);try{let t=await this.moduleStore.saveModuleSettings({backupRetention:this.backupRetention(),configBackupRetention:this.configBackupRetention()});t.settings&&(this.patchSettingsFromResponse(t.settings),this.settingsDirty.set(!1),this.message.success("\u8BBE\u7F6E\u5DF2\u4FDD\u5B58"))}catch(t){this.message.error("\u4FDD\u5B58\u8BBE\u7F6E\u5931\u8D25: "+t.message)}finally{this.saving.set(!1)}}patchSettingsFromResponse(t){this.backupRetention.set(Math.max(1,Number(t.backupRetention??5))),this.configBackupRetention.set(Math.max(1,Number(t.configBackupRetention??20)))}static \u0275fac=function(e){return new(e||r)};static \u0275cmp=P({type:r,selectors:[["app-nginx-secondary-settings-tab"]],inputs:{instance:"instance",configFileCount:"configFileCount"},outputs:{unbind:"unbind"},decls:58,vars:7,consts:[[1,"setting-row"],[1,"setting-label"],[1,"setting-desc"],[1,"setting-ctrl"],[1,"mono","strong"],["nz-input","","type","number","min","1",1,"retention-input","mono",3,"ngModelChange","ngModel"],["nz-button","","nzType","default",3,"click","disabled"],[1,"danger-box"],[1,"setting-label","danger"],[1,"setting-row","danger-row"],["nz-button","","nzDanger","","nzType","default",3,"click"]],template:function(e,n){e&1&&(a(0,"div",0)(1,"div")(2,"div",1),d(3,"Nginx \u8DEF\u5F84"),s(),a(4,"div",2),d(5,"\u53EF\u6267\u884C\u6587\u4EF6\u4F4D\u7F6E"),s()(),a(6,"div",3)(7,"span",4),d(8),s()()(),a(9,"div",0)(10,"div")(11,"div",1),d(12,"\u914D\u7F6E\u6587\u4EF6"),s(),a(13,"div",2),d(14,"\u4E3B\u914D\u7F6E\u8DEF\u5F84"),s()(),a(15,"div",3)(16,"span",4),d(17),s()()(),a(18,"div",0)(19,"div")(20,"div",1),d(21,"\u914D\u7F6E\u6587\u4EF6\u6570"),s(),a(22,"div",2),d(23,"\u6839\u636E include \u6307\u4EE4\u89E3\u6790"),s()(),a(24,"div",3)(25,"span",4),d(26),s()()(),a(27,"div",0)(28,"div")(29,"div",1),d(30,"\u72B6\u6001\u5907\u4EFD\u4FDD\u7559\u6570"),s(),a(31,"div",2),d(32,".ngm-nginx-module.json.backup-* \u6700\u591A\u4FDD\u7559\u6570\u91CF"),s()(),a(33,"div",3)(34,"input",5),p("ngModelChange",function(o){return n.setBackupRetention(o)}),s(),a(35,"button",6),p("click",function(){return n.saveSettings()}),d(36," \u4FDD\u5B58 "),s()()(),a(37,"div",0)(38,"div")(39,"div",1),d(40,"\u914D\u7F6E\u5907\u4EFD\u4FDD\u7559\u6570"),s(),a(41,"div",2),d(42,"*.conf.backup-* \u6700\u591A\u4FDD\u7559\u6570\u91CF"),s()(),a(43,"div",3)(44,"input",5),p("ngModelChange",function(o){return n.setConfigBackupRetention(o)}),s(),a(45,"button",6),p("click",function(){return n.saveSettings()}),d(46," \u4FDD\u5B58 "),s()()(),a(47,"div",7)(48,"div",8),d(49,"\u5371\u9669\u64CD\u4F5C"),s(),a(50,"div",9)(51,"div")(52,"div",1),d(53,"\u89E3\u7ED1\u5B9E\u4F8B"),s(),a(54,"div",2),d(55,"\u4E0D\u5F71\u54CD Nginx \u670D\u52A1\u672C\u8EAB"),s()(),a(56,"button",10),p("click",function(){return n.unbind.emit()}),d(57," \u89E3\u7ED1 "),s()()()),e&2&&(l(8),y((n.instance==null?null:n.instance.path)||"-"),l(9),y((n.instance==null?null:n.instance.configPath)||"-"),l(9),y(n.configFileCount),l(8),u("ngModel",n.backupRetention()),l(),u("disabled",!n.settingsDirty()||n.saving()),l(9),u("ngModel",n.configBackupRetention()),l(),u("disabled",!n.settingsDirty()||n.saving()))},dependencies:[E,q,Q,Ct,j,vt,H,U,W,B,A,ae,re],styles:['.setting-row[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:10px 0;border-bottom:1px solid var(--border-light)}.setting-row[_ngcontent-%COMP%]:last-child{border-bottom:none}.setting-row.danger-row[_ngcontent-%COMP%]{padding:6px 0 0;border-bottom:none}.setting-label[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);font-weight:600;color:var(--text-1)}.setting-label.danger[_ngcontent-%COMP%]{color:var(--red);margin-bottom:4px}.setting-desc[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);color:var(--text-3);margin-top:2px}.setting-ctrl[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px}.retention-input[_ngcontent-%COMP%]{width:92px}.mono[_ngcontent-%COMP%]{font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace)}.mono.strong[_ngcontent-%COMP%]{color:var(--text-1);font-weight:600}.danger-box[_ngcontent-%COMP%]{margin-top:8px;padding:10px 12px;border:1px solid rgba(245,63,63,.2);background:var(--red-bg);border-radius:6px}@media (max-width: 768px){.setting-row[_ngcontent-%COMP%]{flex-direction:column;align-items:flex-start}}']})};var Ci=(r,t)=>t.id;function vi(r,t){r&1&&(a(0,"div",9),d(1,"\u6682\u65E0 SSL \u8BC1\u4E66\u914D\u7F6E\uFF0C\u70B9\u51FB\u201C\u65B0\u589E\u8BC1\u4E66\u201D\u5F00\u59CB\u7EF4\u62A4"),s())}function bi(r,t){if(r&1){let e=T();a(0,"div",12)(1,"div",13)(2,"div",14),d(3),s(),a(4,"span",15),d(5),s()(),a(6,"div",16)(7,"div",17)(8,"span",18),d(9,"\u5230\u671F\u65F6\u95F4"),s(),a(10,"span",19),d(11),s()(),a(12,"div",17)(13,"span",18),d(14,"\u81EA\u52A8\u7EED\u671F"),s(),a(15,"span",20),d(16),s()(),a(17,"div",21)(18,"span",18),d(19,"\u8BC1\u4E66\u8DEF\u5F84"),s(),a(20,"span",19),d(21),s()(),a(22,"div",21)(23,"span",18),d(24,"\u79C1\u94A5\u8DEF\u5F84"),s(),a(25,"span",19),d(26),s()()(),a(27,"div",22)(28,"button",23),p("click",function(){let i=f(e).$implicit,o=c(2);return h(o.openEditDrawer(i))}),d(29,"\u7F16\u8F91"),s(),a(30,"button",24),p("click",function(){let i=f(e).$implicit,o=c(2);return h(o.removeRow(i.id))}),d(31,"\u5220\u9664"),s()()()}if(r&2){let e=t.$implicit,n=c(2);l(3),y(e.domain),l(),u("ngClass",e.status),l(),y(n.statusText(e.status)),l(6),y(e.expireAt||"-"),l(5),y(e.autoRenew?"\u5DF2\u542F\u7528":"\u672A\u542F\u7528"),l(5),y(e.certPath||"-"),l(5),y(e.keyPath||"-")}}function yi(r,t){if(r&1&&L(0,bi,32,7,"div",12,Ci),r&2){let e=c();I(e.rows())}}function Si(r,t){if(r&1){let e=T();te(0),a(1,"div",25)(2,"form",26)(3,"nz-form-item")(4,"nz-form-label",27),d(5,"\u57DF\u540D"),s(),a(6,"nz-form-control")(7,"input",28),N("ngModelChange",function(i){f(e);let o=c();return M(o.drawerForm.domain,i)||(o.drawerForm.domain=i),h(i)}),s()()(),a(8,"div",29)(9,"nz-form-item")(10,"nz-form-label"),d(11,"\u72B6\u6001"),s(),a(12,"nz-form-control")(13,"nz-select",30),N("ngModelChange",function(i){f(e);let o=c();return M(o.drawerForm.status,i)||(o.drawerForm.status=i),h(i)}),x(14,"nz-option",31)(15,"nz-option",32)(16,"nz-option",33)(17,"nz-option",34),s()()(),a(18,"nz-form-item")(19,"nz-form-label"),d(20,"\u5230\u671F\u65F6\u95F4"),s(),a(21,"nz-form-control")(22,"input",35),N("ngModelChange",function(i){f(e);let o=c();return M(o.drawerForm.expireAt,i)||(o.drawerForm.expireAt=i),h(i)}),s()()()(),a(23,"nz-form-item")(24,"nz-form-label"),d(25,"\u81EA\u52A8\u7EED\u671F"),s(),a(26,"nz-form-control")(27,"nz-switch",36),N("ngModelChange",function(i){f(e);let o=c();return M(o.drawerForm.autoRenew,i)||(o.drawerForm.autoRenew=i),h(i)}),s()()(),a(28,"nz-form-item")(29,"nz-form-label",27),d(30,"\u8BC1\u4E66\u8DEF\u5F84"),s(),a(31,"nz-form-control")(32,"input",37),N("ngModelChange",function(i){f(e);let o=c();return M(o.drawerForm.certPath,i)||(o.drawerForm.certPath=i),h(i)}),s()()(),a(33,"nz-form-item")(34,"nz-form-label",27),d(35,"\u79C1\u94A5\u8DEF\u5F84"),s(),a(36,"nz-form-control")(37,"input",38),N("ngModelChange",function(i){f(e);let o=c();return M(o.drawerForm.keyPath,i)||(o.drawerForm.keyPath=i),h(i)}),s()()()()(),a(38,"div",39)(39,"button",3),p("click",function(){f(e);let i=c();return h(i.closeDrawer())}),d(40,"\u53D6\u6D88"),s(),a(41,"button",40),p("click",function(){f(e);let i=c();return h(i.submitDrawer())}),d(42,"\u786E\u5B9A"),s()(),ne()}if(r&2){let e=c();l(7),z("ngModel",e.drawerForm.domain),l(6),z("ngModel",e.drawerForm.status),l(9),z("ngModel",e.drawerForm.expireAt),l(5),z("ngModel",e.drawerForm.autoRenew),l(5),z("ngModel",e.drawerForm.certPath),l(5),z("ngModel",e.drawerForm.keyPath)}}var Dt=class r{moduleStore=w(se);message=w($);loading=g(!1);saving=g(!1);dirty=g(!1);rows=g([]);drawerVisible=g(!1);editingId=g(null);drawerForm=this.createEmptyForm();async ngOnInit(){await this.loadData()}async loadData(){this.loading.set(!0);try{(await this.moduleStore.loadSslCertificates()).certificates&&(this.rows.set(this.moduleStore.sslCertificates().map(e=>S({},e))),this.dirty.set(!1))}catch(t){this.message.error("\u52A0\u8F7D SSL \u914D\u7F6E\u5931\u8D25: "+t.message)}finally{this.loading.set(!1)}}openCreateDrawer(){this.editingId.set(null),this.drawerForm=this.createEmptyForm(),this.drawerVisible.set(!0)}openEditDrawer(t){this.editingId.set(t.id),this.drawerForm={domain:t.domain,certPath:t.certPath,keyPath:t.keyPath,expireAt:t.expireAt,status:t.status,autoRenew:t.autoRenew},this.drawerVisible.set(!0)}closeDrawer(){this.drawerVisible.set(!1)}submitDrawer(){let t=this.drawerForm.domain.trim();if(!t){this.message.warning("\u8BC1\u4E66\u57DF\u540D\u4E0D\u80FD\u4E3A\u7A7A");return}if(!this.drawerForm.certPath.trim()){this.message.warning("\u8BC1\u4E66\u8DEF\u5F84\u4E0D\u80FD\u4E3A\u7A7A");return}if(!this.drawerForm.keyPath.trim()){this.message.warning("\u79C1\u94A5\u8DEF\u5F84\u4E0D\u80FD\u4E3A\u7A7A");return}if(this.drawerForm.expireAt.trim()&&!this.isValidDateString(this.drawerForm.expireAt.trim())){this.message.warning("\u5230\u671F\u65F6\u95F4\u683C\u5F0F\u65E0\u6548\uFF0C\u8BF7\u4F7F\u7528 YYYY-MM-DD");return}let e={id:this.editingId()||this.makeId(),domain:t,certPath:this.drawerForm.certPath.trim(),keyPath:this.drawerForm.keyPath.trim(),expireAt:this.drawerForm.expireAt.trim(),status:this.normalizeStatus(this.drawerForm.status),autoRenew:this.drawerForm.autoRenew};if(this.rows().find(i=>this.editingId()&&i.id===this.editingId()?!1:this.buildSslUniqueKey(i)===this.buildSslUniqueKey(e))){this.message.warning("\u8BC1\u4E66\u57DF\u540D + \u8BC1\u4E66\u8DEF\u5F84 + \u79C1\u94A5\u8DEF\u5F84\u91CD\u590D");return}this.editingId()?this.rows.update(i=>i.map(o=>o.id===e.id?e:o)):this.rows.update(i=>[...i,e]),this.markDirty(),this.closeDrawer()}removeRow(t){this.rows.update(e=>e.filter(n=>n.id!==t)),this.markDirty()}markDirty(){this.dirty.set(!0)}statusText(t){switch(t){case"valid":return"\u6709\u6548";case"expiring":return"\u5373\u5C06\u8FC7\u671F";case"expired":return"\u5DF2\u8FC7\u671F";default:return"\u5F85\u63A5\u5165"}}async saveAll(){let t=[],e=new Set;for(let n of this.rows()){let i=n.domain.trim();if(!i){this.message.warning("\u8BC1\u4E66\u57DF\u540D\u4E0D\u80FD\u4E3A\u7A7A");return}let o=n.certPath.trim(),m=n.keyPath.trim();if(!o){this.message.warning(`\u57DF\u540D "${i}" \u7684\u8BC1\u4E66\u8DEF\u5F84\u4E0D\u80FD\u4E3A\u7A7A`);return}if(!m){this.message.warning(`\u57DF\u540D "${i}" \u7684\u79C1\u94A5\u8DEF\u5F84\u4E0D\u80FD\u4E3A\u7A7A`);return}let _=n.expireAt.trim();if(_&&!this.isValidDateString(_)){this.message.warning(`\u57DF\u540D "${i}" \u7684\u5230\u671F\u65F6\u95F4\u683C\u5F0F\u65E0\u6548\uFF0C\u8BF7\u4F7F\u7528 YYYY-MM-DD`);return}let C=this.buildSslUniqueKey({domain:i,certPath:o,keyPath:m});if(e.has(C)){this.message.warning(`\u68C0\u6D4B\u5230\u91CD\u590D\u8BC1\u4E66\u8BB0\u5F55: ${i}`);return}e.add(C),t.push(D(S({},n),{id:n.id||this.makeId(),domain:i,certPath:o,keyPath:m,expireAt:_,status:this.normalizeStatus(n.status)}))}this.saving.set(!0);try{await this.moduleStore.saveSslCertificates(t),this.message.success("SSL \u914D\u7F6E\u5DF2\u4FDD\u5B58"),this.dirty.set(!1),await this.loadData()}catch(n){this.message.error("\u4FDD\u5B58 SSL \u914D\u7F6E\u5931\u8D25: "+n.message)}finally{this.saving.set(!1)}}normalizeStatus(t){return t==="valid"||t==="expiring"||t==="expired"||t==="pending"?t:"pending"}makeId(){return`ssl-${Date.now()}-${Math.random().toString(16).slice(2,8)}`}isValidDateString(t){if(!/^\d{4}-\d{2}-\d{2}$/.test(t))return!1;let[e,n,i]=t.split("-").map(m=>Number(m));if(!Number.isInteger(e)||!Number.isInteger(n)||!Number.isInteger(i))return!1;let o=new Date(Date.UTC(e,n-1,i));return o.getUTCFullYear()===e&&o.getUTCMonth()===n-1&&o.getUTCDate()===i}buildSslUniqueKey(t){return`${t.domain.trim().toLowerCase()}|${t.certPath.trim().toLowerCase()}|${t.keyPath.trim().toLowerCase()}`}createEmptyForm(){return{domain:"",certPath:"",keyPath:"",expireAt:"",status:"pending",autoRenew:!1}}static \u0275fac=function(e){return new(e||r)};static \u0275cmp=P({type:r,selectors:[["app-nginx-secondary-ssl-tab"]],decls:16,vars:8,consts:[[1,"panel-header-row"],[1,"panel-tip"],[1,"header-actions"],["nz-button","","nzType","default",3,"click"],["nzType","plus","nzTheme","outline"],["nz-button","","nzType","primary",3,"click","nzLoading","disabled"],["nzType","save","nzTheme","outline"],[3,"nzSpinning"],[1,"ssl-cards"],[1,"empty-row"],[3,"nzOnClose","nzVisible","nzTitle","nzWidth","nzPlacement"],[4,"nzDrawerContent"],[1,"ssl-card"],[1,"card-head"],[1,"card-domain","mono"],[1,"status-badge",3,"ngClass"],[1,"meta-list"],[1,"meta-item"],[1,"meta-label"],[1,"meta-value","mono"],[1,"meta-value"],[1,"meta-item","block"],[1,"card-actions"],["nz-button","","nzType","default","nzSize","small",3,"click"],["nz-button","","nzType","default","nzDanger","","nzSize","small",3,"click"],[1,"drawer-body"],["nz-form","","nzLayout","vertical"],["nzRequired",""],["nz-input","","name","sslDomain","placeholder","example.com",1,"mono",3,"ngModelChange","ngModel"],[1,"form-grid"],["name","sslStatus",3,"ngModelChange","ngModel"],["nzValue","valid","nzLabel","\u6709\u6548"],["nzValue","expiring","nzLabel","\u5373\u5C06\u8FC7\u671F"],["nzValue","expired","nzLabel","\u5DF2\u8FC7\u671F"],["nzValue","pending","nzLabel","\u5F85\u63A5\u5165"],["nz-input","","name","sslExpireAt","placeholder","YYYY-MM-DD",1,"mono",3,"ngModelChange","ngModel"],["name","sslAutoRenew",3,"ngModelChange","ngModel"],["nz-input","","name","sslCertPath","placeholder","/etc/nginx/ssl/fullchain.pem",1,"mono",3,"ngModelChange","ngModel"],["nz-input","","name","sslKeyPath","placeholder","/etc/nginx/ssl/privkey.pem",1,"mono",3,"ngModelChange","ngModel"],[1,"drawer-footer"],["nz-button","","nzType","primary",3,"click"]],template:function(e,n){e&1&&(a(0,"div",0)(1,"span",1),d(2,"\u7BA1\u7406 SSL \u8BC1\u4E66\u4E0E\u5230\u671F\u72B6\u6001"),s(),a(3,"div",2)(4,"button",3),p("click",function(){return n.openCreateDrawer()}),x(5,"nz-icon",4),d(6," \u65B0\u589E\u8BC1\u4E66 "),s(),a(7,"button",5),p("click",function(){return n.saveAll()}),x(8,"nz-icon",6),d(9," \u4FDD\u5B58 "),s()()(),a(10,"nz-spin",7)(11,"div",8),v(12,vi,2,0,"div",9)(13,yi,2,0),s()(),a(14,"nz-drawer",10),p("nzOnClose",function(){return n.closeDrawer()}),O(15,Si,43,6,"ng-container",11),s()),e&2&&(l(7),u("nzLoading",n.saving())("disabled",!n.dirty()),l(3),u("nzSpinning",n.loading()),l(2),b(n.rows().length?13:12),l(2),u("nzVisible",n.drawerVisible())("nzTitle",n.editingId()?"\u7F16\u8F91\u8BC1\u4E66":"\u65B0\u589E\u8BC1\u4E66")("nzWidth",500)("nzPlacement","right"))},dependencies:[E,gt,q,Ke,Q,j,He,H,qe,U,W,B,A,Ue,We,Ae,tt,je,$e,Xe,Ze,et,Je,k,R,ae,re,he,ge,fe,we,Ge,xe,ze],styles:['[_nghost-%COMP%]{display:block}.panel-header-row[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;gap:8px;margin-bottom:12px}.panel-tip[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);color:var(--text-3)}.header-actions[_ngcontent-%COMP%]{display:flex;gap:8px}.ssl-cards[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:10px}.ssl-card[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:10px;border:1px solid var(--border-light);border-radius:6px;padding:10px;background:#fff}.card-head[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;gap:10px;border-bottom:1px solid var(--border-light);padding-bottom:8px}.card-domain[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-base, 14px);color:var(--text-1);font-weight:600;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-badge[_ngcontent-%COMP%]{display:inline-flex;align-items:center;height:24px;border-radius:12px;padding:0 10px;font-size:var(--nginx-font-size-sm, 12px);line-height:24px;border:1px solid transparent;white-space:nowrap}.status-badge.valid[_ngcontent-%COMP%]{color:var(--green);border-color:#00b42a33;background:var(--green-bg)}.status-badge.expiring[_ngcontent-%COMP%]{color:var(--orange);border-color:#ff7d0033;background:var(--orange-bg)}.status-badge.expired[_ngcontent-%COMP%]{color:var(--red);border-color:#f53f3f33;background:var(--red-bg)}.status-badge.pending[_ngcontent-%COMP%]{color:var(--text-2);border-color:var(--border);background:var(--bg-input)}.meta-list[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:8px;flex:1}.meta-item[_ngcontent-%COMP%]{display:grid;grid-template-columns:80px 1fr;gap:8px;min-width:0}.meta-item.block[_ngcontent-%COMP%]{grid-template-columns:1fr}.meta-label[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);color:var(--text-3);font-weight:600}.meta-value[_ngcontent-%COMP%]{color:var(--text-1);font-size:var(--nginx-font-size-sm, 12px);min-width:0;word-break:break-all}.mono[_ngcontent-%COMP%]{font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace)}.card-actions[_ngcontent-%COMP%]{display:flex;justify-content:flex-end;gap:8px}.drawer-body[_ngcontent-%COMP%]{padding:0 24px 16px}.form-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr 1fr;gap:12px}.drawer-footer[_ngcontent-%COMP%]{position:absolute;bottom:0;left:0;right:0;padding:12px 24px;border-top:1px solid rgba(0,0,0,.06);display:flex;justify-content:flex-end;gap:8px;background:#fff}.empty-row[_ngcontent-%COMP%]{grid-column:1 / -1;border:1px dashed var(--border);border-radius:6px;color:var(--text-3);font-size:var(--nginx-font-size-sm, 12px);text-align:center;padding:20px 12px;background:#fff}@media (max-width: 992px){.panel-header-row[_ngcontent-%COMP%]{flex-direction:column;align-items:flex-start}.header-actions[_ngcontent-%COMP%]{width:100%}.form-grid[_ngcontent-%COMP%]{grid-template-columns:1fr}}']})};var Et=class r{loading=!1;logs=[];runTest=new me;static \u0275fac=function(e){return new(e||r)};static \u0275cmp=P({type:r,selectors:[["app-nginx-secondary-test-tab"]],inputs:{loading:"loading",logs:"logs"},outputs:{runTest:"runTest"},decls:7,vars:5,consts:[[1,"panel-header-row"],[1,"panel-tip"],["nz-button","","nzType","default","nzSize","small",1,"run-test-btn",3,"click","nzLoading"],["nzType","check-circle","nzTheme","outline"],["statusTone","ok",3,"title","status","logs","maxHeight"]],template:function(e,n){e&1&&(a(0,"div",0)(1,"span",1),d(2,"\u9A8C\u8BC1 Nginx \u914D\u7F6E\u6587\u4EF6\u8BED\u6CD5\u6B63\u786E\u6027"),s(),a(3,"button",2),p("click",function(){return n.runTest.emit()}),x(4,"nz-icon",3),d(5," \u6267\u884C\u68C0\u6D4B "),s()(),x(6,"app-nginx-log-viewer",4)),e&2&&(l(3),u("nzLoading",n.loading),l(3),u("title","\u7ED3\u679C")("status","\u2713 syntax is ok")("logs",n.logs)("maxHeight",180))},dependencies:[E,U,W,B,A,k,R,De],styles:["[_nghost-%COMP%]{display:block}.panel-header-row[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;gap:8px;margin-bottom:12px}.panel-tip[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-base, 14px);color:var(--text-2)}.run-test-btn[_ngcontent-%COMP%]{background:var(--green);color:#fff;border-color:var(--green);font-weight:600;min-height:28px;padding-inline:10px}.run-test-btn[_ngcontent-%COMP%]:hover, .run-test-btn[_ngcontent-%COMP%]:focus{background:#00a122;border-color:#00a122;color:#fff}@media (max-width: 992px){.panel-header-row[_ngcontent-%COMP%]{flex-direction:column;align-items:flex-start}}"]})};var Ft=class r{moduleStore=w(se);message=w($);saving=g(!1);dirty=g(!1);config=g({rateLimitEnabled:!1,rateLimit:"",connLimitEnabled:!1,connLimit:0,blacklistIps:[]});blacklistText=g("");async ngOnInit(){await this.load()}async load(){try{if((await this.moduleStore.loadTrafficConfig()).traffic){let e=this.moduleStore.trafficConfig();this.config.set(D(S({},e),{connLimit:Math.max(0,Number(e.connLimit??0))})),this.blacklistText.set((e.blacklistIps||[]).join(`
|
|
2
|
+
`)),this.dirty.set(!1)}}catch(t){this.message.error("\u52A0\u8F7D\u6D41\u91CF\u914D\u7F6E\u5931\u8D25: "+t.message)}}setRateLimitEnabled(t){this.config.update(e=>D(S({},e),{rateLimitEnabled:t})),this.markDirty()}setConnLimitEnabled(t){this.config.update(e=>D(S({},e),{connLimitEnabled:t})),this.markDirty()}setBlacklistText(t){this.blacklistText.set(t||""),this.markDirty()}markDirty(){this.dirty.set(!0)}async save(){let t=D(S({},this.config()),{rateLimit:this.config().rateLimit.trim(),connLimit:this.config().connLimitEnabled?Math.max(1,Number(this.config().connLimit||1)):Math.max(0,Number(this.config().connLimit||0)),blacklistIps:this.blacklistText().split(/[\n,]/).map(e=>e.trim()).filter(Boolean)});this.saving.set(!0);try{await this.moduleStore.saveTrafficConfig(t),this.message.success("\u6D41\u91CF\u63A7\u5236\u914D\u7F6E\u5DF2\u4FDD\u5B58"),this.dirty.set(!1),await this.load()}catch(e){this.message.error("\u4FDD\u5B58\u6D41\u91CF\u63A7\u5236\u914D\u7F6E\u5931\u8D25: "+e.message)}finally{this.saving.set(!1)}}static \u0275fac=function(e){return new(e||r)};static \u0275cmp=P({type:r,selectors:[["app-nginx-secondary-traffic-tab"]],decls:31,vars:7,consts:[[1,"panel-header-row"],[1,"panel-tip"],["nz-button","","nzType","primary",3,"click","nzLoading","disabled"],["nzType","save","nzTheme","outline"],[1,"setting-row"],[1,"setting-label"],[1,"setting-desc"],[1,"setting-ctrl"],["placeholder","20r/s",1,"setting-input",3,"ngModelChange","ngModel"],["name","rateLimitEnabled","nzSize","small",3,"ngModelChange","ngModel"],["type","number","min","1",1,"setting-input",3,"ngModelChange","ngModel"],["name","connLimitEnabled","nzSize","small",3,"ngModelChange","ngModel"],[1,"setting-row","no-border"],[1,"full-width"],["rows","4","placeholder",`192.168.1.10
|
|
3
|
+
10.10.10.5`,1,"setting-textarea","mono",3,"ngModelChange","ngModel"]],template:function(e,n){e&1&&(a(0,"div",0)(1,"span",1),d(2,"\u6D41\u91CF\u63A7\u5236\u7B56\u7565"),s(),a(3,"button",2),p("click",function(){return n.save()}),x(4,"nz-icon",3),d(5," \u4FDD\u5B58 "),s()(),a(6,"div",4)(7,"div")(8,"div",5),d(9,"\u8BF7\u6C42\u9650\u6D41"),s(),a(10,"div",6),d(11,"\u6BCF\u4E2A IP \u6BCF\u79D2\u6700\u5927\u8BF7\u6C42\u6570"),s()(),a(12,"div",7)(13,"input",8),N("ngModelChange",function(o){return M(n.config().rateLimit,o)||(n.config().rateLimit=o),o}),p("ngModelChange",function(){return n.markDirty()}),s(),a(14,"nz-switch",9),p("ngModelChange",function(o){return n.setRateLimitEnabled(o)}),s()()(),a(15,"div",4)(16,"div")(17,"div",5),d(18,"\u8FDE\u63A5\u9650\u5236"),s(),a(19,"div",6),d(20,"\u5355 IP \u6700\u5927\u5E76\u53D1\u8FDE\u63A5\u6570"),s()(),a(21,"div",7)(22,"input",10),N("ngModelChange",function(o){return M(n.config().connLimit,o)||(n.config().connLimit=o),o}),p("ngModelChange",function(){return n.markDirty()}),s(),a(23,"nz-switch",11),p("ngModelChange",function(o){return n.setConnLimitEnabled(o)}),s()()(),a(24,"div",12)(25,"div",13)(26,"div",5),d(27,"\u9ED1\u540D\u5355 IP"),s(),a(28,"div",6),d(29,"\u9017\u53F7\u6216\u6362\u884C\u5206\u9694"),s(),a(30,"textarea",14),p("ngModelChange",function(o){return n.setBlacklistText(o)}),s()()()),e&2&&(l(3),u("nzLoading",n.saving())("disabled",!n.dirty()),l(10),z("ngModel",n.config().rateLimit),l(),u("ngModel",n.config().rateLimitEnabled),l(8),z("ngModel",n.config().connLimit),l(),u("ngModel",n.config().connLimitEnabled),l(7),u("ngModel",n.blacklistText()))},dependencies:[E,q,Q,Ct,j,vt,H,U,W,B,A,k,R,xe,ze],styles:['[_nghost-%COMP%]{display:block}.panel-header-row[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;gap:8px;margin-bottom:12px}.panel-tip[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);color:var(--text-3)}.setting-row[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:10px 0;border-bottom:1px solid var(--border-light)}.setting-row.no-border[_ngcontent-%COMP%]{border-bottom:none}.setting-label[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);font-weight:600;color:var(--text-1)}.setting-desc[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);color:var(--text-3);margin-top:2px}.setting-ctrl[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px}.setting-input[_ngcontent-%COMP%]{width:110px;padding:5px 8px;border-radius:4px;border:1px solid var(--border);background:var(--bg-input);color:var(--text-2);font-size:var(--nginx-font-size-sm, 12px);text-align:center;font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace);outline:none}.setting-input[_ngcontent-%COMP%]:focus, .setting-textarea[_ngcontent-%COMP%]:focus{border-color:var(--blue);box-shadow:0 0 0 2px var(--blue-border)}.setting-textarea[_ngcontent-%COMP%]{width:100%;margin-top:8px;border:1px solid var(--border);border-radius:6px;background:var(--bg-input);color:var(--text-2);font-size:var(--nginx-font-size-sm, 12px);padding:8px 10px;resize:vertical;outline:none}.mono[_ngcontent-%COMP%]{font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace)}']})};var wi=(r,t)=>t.id,zi=(r,t)=>t+"-"+r;function Mi(r,t){r&1&&(a(0,"div",17),x(1,"nz-icon",20),a(2,"p"),d(3,"\u6682\u65E0 Upstream \u914D\u7F6E"),s()())}function Ni(r,t){if(r&1&&(a(0,"span",27),d(1),s()),r&2){let e=t.$implicit;l(),y(e)}}function Ti(r,t){if(r&1){let e=T();a(0,"div",22)(1,"div",9)(2,"span",23),d(3),s()(),a(4,"div",10)(5,"span",24),d(6),s()(),a(7,"div",11)(8,"span",25),d(9),s()(),a(10,"div",12)(11,"div",26),L(12,Ni,2,1,"span",27,zi),s()(),a(14,"div",13)(15,"span",28),d(16),s()(),a(17,"div",14)(18,"div",29)(19,"button",30),p("click",function(){let i=f(e).$implicit,o=c(2);return h(o.openEditDrawer(i))}),x(20,"nz-icon",31),s(),a(21,"button",32),p("click",function(){let i=f(e).$implicit,o=c(2);return h(o.removeRow(i.id))}),x(22,"nz-icon",33),s()()()()}if(r&2){let e=t.$implicit,n=c(2);F("readonly-row",e.readonly),l(3),y(e.name),l(2),F("managed",e.managed),u("title",n.sourceHint(e)),l(),J(" ",n.sourceLabel(e)," "),l(3),y(e.strategy),l(3),I(e.nodes),l(4),y(e.nodes.length),l(3),u("disabled",e.readonly),l(2),u("disabled",e.readonly)}}function Pi(r,t){if(r&1&&L(0,Ti,23,11,"div",21,wi),r&2){let e=c();I(e.rows())}}function Di(r,t){if(r&1){let e=T();te(0),a(1,"div",34)(2,"form",35)(3,"nz-form-item")(4,"nz-form-label",36),d(5,"\u540D\u79F0"),s(),a(6,"nz-form-control")(7,"input",37),N("ngModelChange",function(i){f(e);let o=c();return M(o.drawerForm.name,i)||(o.drawerForm.name=i),h(i)}),s()()(),a(8,"nz-form-item")(9,"nz-form-label",36),d(10,"\u7B56\u7565"),s(),a(11,"nz-form-control")(12,"nz-select",38),N("ngModelChange",function(i){f(e);let o=c();return M(o.drawerForm.strategy,i)||(o.drawerForm.strategy=i),h(i)}),x(13,"nz-option",39)(14,"nz-option",40)(15,"nz-option",41)(16,"nz-option",42),s()()(),a(17,"nz-form-item")(18,"nz-form-label",36),d(19,"\u8282\u70B9\uFF08\u9017\u53F7\u6216\u6362\u884C\u5206\u9694\uFF09"),s(),a(20,"nz-form-control")(21,"textarea",43),N("ngModelChange",function(i){f(e);let o=c();return M(o.drawerForm.nodesText,i)||(o.drawerForm.nodesText=i),h(i)}),s()()()()(),a(22,"div",44)(23,"button",3),p("click",function(){f(e);let i=c();return h(i.closeDrawer())}),d(24,"\u53D6\u6D88"),s(),a(25,"button",45),p("click",function(){f(e);let i=c();return h(i.submitDrawer())}),d(26,"\u786E\u5B9A"),s()(),ne()}if(r&2){let e=c();l(7),z("ngModel",e.drawerForm.name),l(5),z("ngModel",e.drawerForm.strategy),l(9),z("ngModel",e.drawerForm.nodesText)}}var kt=class r{moduleStore=w(se);message=w($);loading=g(!1);saving=g(!1);dirty=g(!1);rows=g([]);drawerVisible=g(!1);editingId=g(null);drawerForm=this.createEmptyForm();async ngOnInit(){await this.loadData()}async loadData(){this.loading.set(!0);try{(await this.moduleStore.loadUpstreams()).upstreams&&(this.rows.set(this.moduleStore.upstreams().map(e=>({id:e.id,name:e.name,strategy:e.strategy,nodes:(e.nodes||[]).map(n=>n.trim()).filter(Boolean),sourceFile:e.sourceFile||"",managed:e.managed!==!1,readonly:e.readonly===!0||e.managed===!1}))),this.dirty.set(!1))}catch(t){this.message.error("\u52A0\u8F7D Upstream \u5931\u8D25: "+t.message)}finally{this.loading.set(!1)}}openCreateDrawer(){this.editingId.set(null),this.drawerForm=this.createEmptyForm(),this.drawerVisible.set(!0)}openEditDrawer(t){if(t.readonly){this.message.info("\u8BE5 Upstream \u6765\u81EA\u5916\u90E8\u914D\u7F6E\u6587\u4EF6\uFF0C\u5F53\u524D\u4E3A\u53EA\u8BFB\u5C55\u793A");return}this.editingId.set(t.id),this.drawerForm={name:t.name,strategy:t.strategy,nodesText:t.nodes.join(", ")},this.drawerVisible.set(!0)}closeDrawer(){this.drawerVisible.set(!1)}submitDrawer(){let t=this.drawerForm.name.trim();if(!t){this.message.warning("Upstream \u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");return}let e=this.parseNodes(this.drawerForm.nodesText);if(!e.length){this.message.warning(`Upstream "${t}" \u81F3\u5C11\u9700\u8981\u4E00\u4E2A\u8282\u70B9`);return}let n={id:this.editingId()||this.makeId(),name:t,strategy:this.drawerForm.strategy,nodes:e,sourceFile:"",managed:!0,readonly:!1};this.editingId()?this.rows.update(i=>i.map(o=>o.id===n.id?D(S({},n),{sourceFile:o.sourceFile,managed:o.managed,readonly:o.readonly}):o)):this.rows.update(i=>[...i,n]),this.markDirty(),this.closeDrawer()}removeRow(t){if(this.rows().find(n=>n.id===t)?.readonly){this.message.info("\u8BE5 Upstream \u6765\u81EA\u5916\u90E8\u914D\u7F6E\u6587\u4EF6\uFF0C\u5F53\u524D\u4E0D\u53EF\u5220\u9664");return}this.rows.update(n=>n.filter(i=>i.id!==t)),this.markDirty()}markDirty(){this.dirty.set(!0)}async saveAll(){let t=[];for(let e of this.rows()){if(e.readonly)continue;let n=e.name.trim();if(!n){this.message.warning("Upstream \u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");return}if(!/^[a-zA-Z0-9._-]+$/.test(n)){this.message.warning(`Upstream \u540D\u79F0\u4E0D\u5408\u6CD5: ${n}`);return}let i=(e.nodes||[]).map(o=>o.trim()).filter(Boolean);if(!i.length){this.message.warning(`Upstream "${n}" \u81F3\u5C11\u9700\u8981\u4E00\u4E2A\u8282\u70B9`);return}t.push({id:e.id,name:n,strategy:e.strategy,nodes:i,sourceFile:e.sourceFile,managed:!0,readonly:!1})}this.saving.set(!0);try{await this.moduleStore.saveUpstreams(t),this.message.success("Upstream \u914D\u7F6E\u5DF2\u4FDD\u5B58"),this.dirty.set(!1),await this.loadData()}catch(e){this.message.error("\u4FDD\u5B58 Upstream \u5931\u8D25: "+e.message)}finally{this.saving.set(!1)}}makeId(){return`upstream-${Date.now()}-${Math.random().toString(16).slice(2,8)}`}parseNodes(t){return t.split(/[,;\n]/).map(e=>e.trim()).filter(Boolean)}createEmptyForm(){return{name:"",strategy:"round-robin",nodesText:""}}sourceLabel(t){let n=(t.sourceFile||"").replace(/\\/g,"/");return n.split("/").pop()||n||(t.managed?"\u6258\u7BA1\u6587\u4EF6":"\u5916\u90E8\u6587\u4EF6")}sourceHint(t){return t.sourceFile?`${t.managed?"\u6258\u7BA1":"\u5916\u90E8"}: ${t.sourceFile}`:t.managed?"\u6258\u7BA1 upstream\uFF08\u6765\u6E90\u672A\u89E3\u6790\uFF09":"\u5916\u90E8 upstream\uFF08\u6765\u6E90\u672A\u89E3\u6790\uFF09"}static \u0275fac=function(e){return new(e||r)};static \u0275cmp=P({type:r,selectors:[["app-nginx-secondary-upstream-tab"]],decls:30,vars:8,consts:[[1,"list-header"],[1,"panel-tip"],[1,"header-actions"],["nz-button","","nzType","default",3,"click"],["nzType","plus","nzTheme","outline"],["nz-button","","nzType","primary",3,"click","nzLoading","disabled"],["nzType","save","nzTheme","outline"],[1,"upstream-grid-shell"],[1,"upstream-grid-head"],[1,"cell","name-col"],[1,"cell","source-col"],[1,"cell","strategy-col"],[1,"cell","nodes-col"],[1,"cell","count-col"],[1,"cell","action-col"],[3,"nzSpinning"],[1,"upstream-grid-body"],[1,"empty-state"],[3,"nzOnClose","nzVisible","nzTitle","nzWidth","nzPlacement"],[4,"nzDrawerContent"],["nzType","cluster","nzTheme","outline",1,"empty-icon"],[1,"upstream-grid-row",3,"readonly-row"],[1,"upstream-grid-row"],[1,"upstream-name","mono"],[1,"source-badge",3,"title"],[1,"strategy-pill","mono"],[1,"nodes-wrap"],[1,"node-chip","mono"],[1,"node-count"],[1,"row-actions"],["nz-button","","nzSize","small","nzType","link",3,"click","disabled"],["nzType","edit","nzTheme","outline"],["nz-button","","nzSize","small","nzType","link","nzDanger","",3,"click","disabled"],["nzType","delete","nzTheme","outline"],[1,"drawer-body"],["nz-form","","nzLayout","vertical"],["nzRequired",""],["nz-input","","name","upstreamName","placeholder","\u4F8B\u5982 backend_cluster",1,"mono",3,"ngModelChange","ngModel"],["name","upstreamStrategy",3,"ngModelChange","ngModel"],["nzValue","round-robin","nzLabel","round-robin"],["nzValue","least_conn","nzLabel","least_conn"],["nzValue","ip_hash","nzLabel","ip_hash"],["nzValue","hash","nzLabel","hash"],["nz-input","","rows","5","name","upstreamNodes","placeholder","127.0.0.1:3001, 127.0.0.1:3002",1,"mono",3,"ngModelChange","ngModel"],[1,"drawer-footer"],["nz-button","","nzType","primary",3,"click"]],template:function(e,n){e&1&&(a(0,"div",0)(1,"span",1),d(2,"\u7BA1\u7406\u540E\u7AEF\u670D\u52A1\u96C6\u7FA4\u7684\u8D1F\u8F7D\u5747\u8861\u914D\u7F6E"),s(),a(3,"div",2)(4,"button",3),p("click",function(){return n.openCreateDrawer()}),x(5,"nz-icon",4),d(6," \u65B0\u589E Upstream "),s(),a(7,"button",5),p("click",function(){return n.saveAll()}),x(8,"nz-icon",6),d(9," \u4FDD\u5B58 "),s()()(),a(10,"div",7)(11,"div",8)(12,"div",9),d(13,"UPSTREAM \u540D\u79F0"),s(),a(14,"div",10),d(15,"\u6765\u6E90"),s(),a(16,"div",11),d(17,"\u7B56\u7565"),s(),a(18,"div",12),d(19,"\u8282\u70B9"),s(),a(20,"div",13),d(21,"\u8282\u70B9\u6570"),s(),a(22,"div",14),d(23,"\u64CD\u4F5C"),s()(),a(24,"nz-spin",15)(25,"div",16),v(26,Mi,4,0,"div",17)(27,Pi,2,0),s()()(),a(28,"nz-drawer",18),p("nzOnClose",function(){return n.closeDrawer()}),O(29,Di,27,3,"ng-container",19),s()),e&2&&(l(7),u("nzLoading",n.saving())("disabled",!n.dirty()),l(17),u("nzSpinning",n.loading()),l(2),b(!n.loading()&&!n.rows().length?26:27),l(2),u("nzVisible",n.drawerVisible())("nzTitle",n.editingId()?"\u7F16\u8F91 Upstream":"\u65B0\u589E Upstream")("nzWidth",460)("nzPlacement","right"))},dependencies:[E,q,Ke,Q,j,He,H,qe,U,W,B,A,Ue,We,Ae,tt,je,$e,Xe,Ze,et,Je,k,R,ae,re,he,ge,fe,we,Ge],styles:['[_nghost-%COMP%]{display:block}.list-header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:12px}.panel-tip[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);color:var(--text-3)}.header-actions[_ngcontent-%COMP%]{display:flex;gap:8px;flex-shrink:0}.upstream-grid-shell[_ngcontent-%COMP%]{border:none;border-radius:0;overflow:hidden}.upstream-grid-head[_ngcontent-%COMP%], .upstream-grid-row[_ngcontent-%COMP%]{display:grid;grid-template-columns:minmax(180px,1fr) minmax(150px,.9fr) minmax(130px,.7fr) minmax(220px,1.6fr) 88px 116px;align-items:center;column-gap:8px;padding:0 12px}.upstream-grid-head[_ngcontent-%COMP%]{min-height:42px;background:#fafafa;border-bottom:1px solid rgba(0,0,0,.06)}.upstream-grid-head[_ngcontent-%COMP%] .cell[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);color:#00000073;text-transform:uppercase;letter-spacing:.4px;font-weight:700}.upstream-grid-body[_ngcontent-%COMP%]{background:#fff}.upstream-grid-row[_ngcontent-%COMP%]{min-height:58px;border-bottom:1px solid rgba(0,0,0,.05);transition:background .12s ease}.upstream-grid-row[_ngcontent-%COMP%]:last-child{border-bottom:none}.upstream-grid-row[_ngcontent-%COMP%]:hover{background:#00000005}.readonly-row[_ngcontent-%COMP%]{background:#00000004}.cell[_ngcontent-%COMP%]{min-width:0}.row-actions[_ngcontent-%COMP%]{display:flex;gap:4px;justify-content:flex-end}.upstream-name[_ngcontent-%COMP%]{display:inline-block;font-size:var(--nginx-font-size-base, 14px);font-weight:600;color:var(--text-1);word-break:break-all}.strategy-pill[_ngcontent-%COMP%]{display:inline-flex;align-items:center;height:22px;border-radius:11px;padding:0 10px;font-size:var(--nginx-font-size-sm, 12px);line-height:22px;color:var(--text-2);background:var(--bg-input);border:1px solid var(--border-light)}.source-badge[_ngcontent-%COMP%]{display:inline-flex;align-items:center;max-width:100%;height:22px;padding:0 8px;border-radius:4px;background:#0000000a;color:var(--text-3);border:1px solid rgba(0,0,0,.08);font-size:var(--nginx-font-size-sm, 12px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.source-badge.managed[_ngcontent-%COMP%]{background:#165dff14;color:#165dff;border-color:#165dff33}.nodes-wrap[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:6px;padding:8px 0}.node-chip[_ngcontent-%COMP%]{display:inline-flex;align-items:center;height:22px;padding:0 8px;border-radius:4px;border:1px solid rgba(22,93,255,.2);background:#165dff14;color:#165dff;font-size:var(--nginx-font-size-sm, 12px);max-width:100%;word-break:break-all}.node-count[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-base, 14px);color:var(--text-2);font-weight:600}.action-col[_ngcontent-%COMP%]{justify-self:end}.empty-state[_ngcontent-%COMP%]{text-align:center;padding:48px 0}.empty-state[_ngcontent-%COMP%] .empty-icon[_ngcontent-%COMP%]{font-size:48px;color:#0003;margin-bottom:16px}.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:#0006;margin:0}.mono[_ngcontent-%COMP%]{font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace)}.drawer-body[_ngcontent-%COMP%]{padding:0 24px 16px}.drawer-footer[_ngcontent-%COMP%]{position:absolute;bottom:0;left:0;right:0;padding:12px 24px;border-top:1px solid rgba(0,0,0,.06);display:flex;justify-content:flex-end;gap:8px;background:#fff}']})};var Ei=["*",[["","nginxCardActions",""]]],Fi=["*","[nginxCardActions]"];function ki(r,t){if(r&1&&(Z(0,"span",5),d(1),X()),r&2){let e=c(2);l(),y(e.subtitle)}}function Oi(r,t){if(r&1&&(Z(0,"div",1)(1,"div",3)(2,"span",4),d(3),X(),v(4,ki,2,1,"span",5),X(),Z(5,"div",6),ue(6,1),X()()),r&2){let e=c();l(3),y(e.title),l(),b(e.subtitle?4:-1)}}var Ot=class r{accent="blue";showHeader=!1;title="";subtitle="";noBodyPadding=!1;static \u0275fac=function(e){return new(e||r)};static \u0275cmp=P({type:r,selectors:[["app-nginx-section-card"]],inputs:{accent:"accent",showHeader:"showHeader",title:"title",subtitle:"subtitle",noBodyPadding:"noBodyPadding"},ngContentSelectors:Fi,decls:4,vars:9,consts:[[1,"card"],[1,"card-header"],[1,"card-body"],[1,"card-header-left"],[1,"card-title"],[1,"card-subtitle"],[1,"card-actions"]],template:function(e,n){e&1&&(dt(Ei),Z(0,"section",0),v(1,Oi,7,2,"div",1),Z(2,"div",2),ue(3),X()()),e&2&&(F("card-blue",n.accent==="blue")("card-green",n.accent==="green")("card-orange",n.accent==="orange"),l(),b(n.showHeader?1:-1),l(),F("no-padding",n.noBodyPadding))},styles:["[_nghost-%COMP%]{display:block}.card[_ngcontent-%COMP%]{background:var(--bg-white);border:1px solid var(--border);border-left-width:3px;border-radius:8px;box-shadow:var(--shadow-card);margin-bottom:14px;overflow:hidden;border-left-color:transparent}.card.card-blue[_ngcontent-%COMP%]{border-left-color:var(--blue)}.card.card-green[_ngcontent-%COMP%]{border-left-color:var(--green)}.card.card-orange[_ngcontent-%COMP%]{border-left-color:var(--orange)}.card-header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;padding:12px 16px 12px 20px;border-bottom:1px solid var(--border-light);gap:10px}.card-header-left[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;min-width:0}.card-title[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-base, 14px);font-weight:700;color:var(--text-1)}.card-subtitle[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);color:var(--text-3)}.card-actions[_ngcontent-%COMP%]{display:flex;gap:8px;flex-wrap:wrap;justify-content:flex-end}.card-body[_ngcontent-%COMP%]{padding:14px 18px}.card-body.no-padding[_ngcontent-%COMP%]{padding:0}@media (max-width: 768px){.card-header[_ngcontent-%COMP%]{flex-direction:column;align-items:flex-start}.card-actions[_ngcontent-%COMP%]{width:100%}}"]})};var Li=["input"],Ii=["inputNumberHost"],Vi=[[["","nzInputAddonBefore",""]],[["","nzInputAddonAfter",""]],[["","nzInputPrefix",""]],[["","nzInputSuffix",""]],[["","nzInputNumberUpIcon",""]],[["","nzInputNumberDownIcon",""]]],Ri=["[nzInputAddonBefore]","[nzInputAddonAfter]","[nzInputPrefix]","[nzInputSuffix]","[nzInputNumberUpIcon]","[nzInputNumberDownIcon]"];function Bi(r,t){}function Ai(r,t){if(r&1&&O(0,Bi,0,0,"ng-template",8),r&2){c();let e=oe(4);u("ngTemplateOutlet",e)}}function Wi(r,t){}function Ui(r,t){if(r&1&&O(0,Wi,0,0,"ng-template",8),r&2){c();let e=oe(8);u("ngTemplateOutlet",e)}}function $i(r,t){}function ji(r,t){if(r&1&&O(0,$i,0,0,"ng-template",8),r&2){c();let e=oe(12);u("ngTemplateOutlet",e)}}function Hi(r,t){if(r&1&&d(0),r&2){let e=c(3);y(e.nzAddonBefore())}}function qi(r,t){r&1&&(a(0,"div",10),ue(1,0,null,Hi,1,1),s())}function Ki(r,t){}function Qi(r,t){if(r&1&&O(0,Ki,0,0,"ng-template",8),r&2){c(2);let e=oe(6);u("ngTemplateOutlet",e)}}function Yi(r,t){}function Gi(r,t){if(r&1&&O(0,Yi,0,0,"ng-template",8),r&2){c(2);let e=oe(10);u("ngTemplateOutlet",e)}}function Zi(r,t){if(r&1&&d(0),r&2){let e=c(3);y(e.nzAddonAfter())}}function Xi(r,t){r&1&&(a(0,"div",10),ue(1,1,null,Zi,1,1),s())}function Ji(r,t){if(r&1&&(a(0,"div",9),v(1,qi,3,0,"div",10),v(2,Qi,1,1,null,8)(3,Gi,1,1,null,8),v(4,Xi,3,0,"div",10),s()),r&2){let e=c();l(),b(e.hasAddonBefore()?1:-1),l(),b(e.hasAffix()?2:3),l(2),b(e.hasAddonAfter()?4:-1)}}function eo(r,t){}function to(r,t){if(r&1&&(a(0,"div"),O(1,eo,0,0,"ng-template",8),s()),r&2){let e=c(),n=oe(8);Le(e.affixWrapperClass()),l(),u("ngTemplateOutlet",n)}}function no(r,t){if(r&1&&d(0),r&2){let e=c(3);y(e.nzPrefix())}}function io(r,t){r&1&&(a(0,"span",11),ue(1,2,null,no,1,1),s())}function oo(r,t){}function ro(r,t){if(r&1&&d(0),r&2){let e=c(3);y(e.nzSuffix())}}function ao(r,t){if(r&1&&x(0,"nz-form-item-feedback-icon",13),r&2){let e=c(3);u("status",e.finalStatus())}}function so(r,t){if(r&1&&(a(0,"span",12),ue(1,3,null,ro,1,1),v(3,ao,1,1,"nz-form-item-feedback-icon",13),s()),r&2){let e=c(2);l(3),b(e.hasFeedback()&&e.finalStatus()?3:-1)}}function lo(r,t){if(r&1&&(v(0,io,3,0,"span",11),O(1,oo,0,0,"ng-template",8),v(2,so,4,1,"span",12)),r&2){let e=c(),n=oe(10);b(e.hasPrefix()?0:-1),l(),u("ngTemplateOutlet",n),l(),b(e.hasSuffix()?2:-1)}}function co(r,t){}function mo(r,t){if(r&1&&(a(0,"div",null,5),O(2,co,0,0,"ng-template",8),s()),r&2){let e=c(),n=oe(12);Le(e.inputNumberClass()),l(2),u("ngTemplateOutlet",n)}}function po(r,t){r&1&&x(0,"nz-icon",20)}function uo(r,t){r&1&&x(0,"nz-icon",21)}function go(r,t){if(r&1){let e=T();a(0,"div",17,7),p("mouseup",function(){f(e);let i=c(2);return h(i.stopAutoStep())})("mouseleave",function(){f(e);let i=c(2);return h(i.stopAutoStep())}),a(2,"span",18),p("mousedown",function(i){f(e);let o=c(2);return h(o.onStepMouseDown(i,!0))}),ue(3,4,null,po,1,0),s(),a(5,"span",19),p("mousedown",function(i){f(e);let o=c(2);return h(o.onStepMouseDown(i,!1))}),ue(6,5,null,uo,1,0),s()()}if(r&2){let e=c(2);l(2),F("ant-input-number-handler-up-disabled",e.upDisabled()),ye("aria-disabled",e.upDisabled()),l(3),F("ant-input-number-handler-down-disabled",e.downDisabled()),ye("aria-disabled",e.downDisabled())}}function fo(r,t){if(r&1){let e=T();v(0,go,8,6,"div",14),a(1,"div",15)(2,"input",16,6),p("input",function(){f(e);let i=oe(3),o=c();return h(o.onInput(i.value))}),s()()}if(r&2){let e=c();b(e.nzControls()?0:-1),l(2),u("value",e.displayValue())("placeholder",e.nzPlaceHolder()??"")("disabled",e.finalDisabled())("readOnly",e.nzReadOnly()),ye("aria-valuemin",e.nzMin())("aria-valuemax",e.nzMax())("id",e.nzId())("step",e.nzStep())("value",e.displayValue())}}var Xt=(()=>{class r{nzId=V(null);nzSize=V("default");nzPlaceHolder=V(null);nzStatus=V("");nzVariant=V("outlined");nzStep=V(1,{transform:ut});nzMin=V(Number.MIN_SAFE_INTEGER,{transform:ut});nzMax=V(Number.MAX_SAFE_INTEGER,{transform:ut});nzPrecision=V(null);nzParser=V();nzFormatter=V();nzDisabled=V(!1,{transform:Pe});nzReadOnly=V(!1,{transform:Pe});nzAutoFocus=V(!1,{transform:Pe});nzBordered=V(!0,{transform:Pe});nzKeyboard=V(!0,{transform:Pe});nzControls=V(!0,{transform:Pe});nzPrefix=V();nzSuffix=V();nzAddonBefore=V();nzAddonAfter=V();nzBlur=pt();nzFocus=pt();nzOnStep=pt();onChange=()=>{};onTouched=()=>{};isDisabledFirstChange=!0;compactSize=w(xn,{optional:!0});inputRef=jt.required("input");hostRef=jt("inputNumberHost");elementRef=w(sn);injector=w(rn);focusMonitor=w(vn);directionality=w(fn);nzFormStatusService=w(bn,{optional:!0});autoStepTimer=null;defaultFormatter=e=>{let n=this.nzPrecision();return ht(n)?e.toFixed(n):e.toString()};value=g(null);displayValue=g("");dir=hn(this.directionality.change,{initialValue:this.directionality.value});focused=g(!1);hasFeedback=g(!1);finalStatus=$t(()=>this.nzStatus());finalDisabled=$t(()=>this.nzDisabled());prefix=ot(Qt);suffix=ot(Yt);addonBefore=ot(qt);addonAfter=ot(Kt);hasPrefix=K(()=>!!this.nzPrefix()||!!this.prefix());hasSuffix=K(()=>!!this.nzSuffix()||!!this.suffix()||this.hasFeedback());hasAffix=K(()=>this.hasPrefix()||this.hasSuffix());hasAddonBefore=K(()=>!!this.nzAddonBefore()||!!this.addonBefore());hasAddonAfter=K(()=>!!this.nzAddonAfter()||!!this.addonAfter());hasAddon=K(()=>this.hasAddonBefore()||this.hasAddonAfter());class=K(()=>this.hasAddon()?this.groupWrapperClass():this.hasAffix()?this.affixWrapperClass():this.inputNumberClass());inputNumberClass=K(()=>S(S({"ant-input-number":!0,"ant-input-number-lg":this.finalSize()==="large","ant-input-number-sm":this.finalSize()==="small","ant-input-number-disabled":this.finalDisabled(),"ant-input-number-readonly":this.nzReadOnly(),"ant-input-number-focused":this.focused(),"ant-input-number-rtl":this.dir()==="rtl","ant-input-number-in-form-item":!!this.nzFormStatusService,"ant-input-number-out-of-range":this.value()!==null&&!Zt(this.value(),this.nzMin(),this.nzMax())},_t("ant-input-number",this.nzVariant(),!this.nzBordered())),xt("ant-input-number",this.finalStatus(),this.hasFeedback())));affixWrapperClass=K(()=>S(S({"ant-input-number-affix-wrapper":!0,"ant-input-number-affix-wrapper-disabled":this.finalDisabled(),"ant-input-number-affix-wrapper-readonly":this.nzReadOnly(),"ant-input-number-affix-wrapper-focused":this.focused(),"ant-input-number-affix-wrapper-rtl":this.dir()==="rtl"},xt("ant-input-number-affix-wrapper",this.finalStatus(),this.hasFeedback())),_t("ant-input-number-affix-wrapper",this.nzVariant(),!this.nzBordered())));groupWrapperClass=K(()=>S(S({"ant-input-number-group-wrapper":!0,"ant-input-number-group-wrapper-rtl":this.dir()==="rtl"},xt("ant-input-number-group-wrapper",this.finalStatus(),this.hasFeedback())),_t("ant-input-number-group-wrapper",this.nzVariant(),!this.nzBordered())));finalSize=K(()=>this.compactSize?this.compactSize():this.nzSize());upDisabled=K(()=>!rt(this.value())&&this.value()>=this.nzMax());downDisabled=K(()=>!rt(this.value())&&this.value()<=this.nzMin());constructor(){let e=w(an);Bt(()=>{let n=this.hostRef(),i=n||this.elementRef;this.focusMonitor.monitor(i,!0).pipe(Ht(e)).subscribe(o=>{this.focused.set(!!o),o?this.nzFocus.emit():(this.fixValue(),this.onTouched(),this.nzBlur.emit())}),e.onDestroy(()=>{this.focusMonitor.stopMonitoring(i)})}),this.nzFormStatusService?.formStatusChanges.pipe(Ht()).subscribe(({status:n,hasFeedback:i})=>{this.finalStatus.set(n),this.hasFeedback.set(i)})}ngOnInit(){this.nzAutoFocus()&&Bt(()=>this.focus(),{injector:this.injector})}writeValue(e){rt(e)&&(e=null),Ut(()=>{this.value.set(e),this.setValue(e)})}registerOnChange(e){this.onChange=e}registerOnTouched(e){this.onTouched=e}setDisabledState(e){Ut(()=>{this.finalDisabled.set(this.isDisabledFirstChange&&this.nzDisabled()||e)}),this.isDisabledFirstChange=!1}focus(){this.inputRef().nativeElement.focus()}blur(){this.inputRef().nativeElement.blur()}step(e,n){if(n&&this.upDisabled()||!n&&this.downDisabled())return;let i=e.shiftKey?this.nzStep()*10:this.nzStep();n||(i=-i);let m=10**Qn(i),_=Kn((Math.round((this.value()||0)*m)+Math.round(i*m))/m,this.nzMin(),this.nzMax(),this.nzPrecision());this.setValue(_),this.nzOnStep.emit({type:n?"up":"down",value:this.value(),offset:this.nzStep()}),this.focus()}setValue(e){let n=this.nzFormatter()??this.defaultFormatter,i=this.nzPrecision();ht(i)&&(e&&=+e.toFixed(i));let o=rt(e)?"":n(e);this.displayValue.set(o),this.updateValue(e)}setValueByTyping(e){if(this.displayValue.set(e),e===""){this.updateValue(null);return}let i=(this.nzParser()??qn)(e);if(_o(e)||Number.isNaN(i))return;let o=this.nzFormatter();if(o){let m=o(i);this.displayValue.set(m)}Zt(i,this.nzMin(),this.nzMax())&&this.updateValue(i)}updateValue(e){this.value()!==e&&(this.value.set(e),this.onChange(e))}fixValue(){let e=this.displayValue();if(e==="")return;let i=(this.nzParser()??qn)(e);if(Number.isNaN(i))i=this.value();else{let o=this.nzPrecision();ht(o)&&Qn(i)!==o&&(i=+i.toFixed(o)),Zt(i,this.nzMin(),this.nzMax())||(i=Kn(i,this.nzMin(),this.nzMax(),o))}this.setValue(i)}stopAutoStep(){this.autoStepTimer!==null&&(clearTimeout(this.autoStepTimer),this.autoStepTimer=null)}onStepMouseDown(e,n){e.preventDefault(),this.stopAutoStep(),this.step(e,n);let i=()=>{this.step(e,n),this.autoStepTimer=setTimeout(i,ho)};this.autoStepTimer=setTimeout(i,xo)}onKeyDown(e){switch(e.keyCode){case 38:e.preventDefault(),this.nzKeyboard()&&this.step(e,!0);break;case 40:e.preventDefault(),this.nzKeyboard()&&this.step(e,!1);break;case 13:this.fixValue();break}}onInput(e){this.setValueByTyping(e)}static \u0275fac=function(n){return new(n||r)};static \u0275cmp=P({type:r,selectors:[["nz-input-number"]],contentQueries:function(n,i,o){n&1&&(it(o,i.prefix,Qt,5),it(o,i.suffix,Yt,5),it(o,i.addonBefore,qt,5),it(o,i.addonAfter,Kt,5)),n&2&&Wt(4)},viewQuery:function(n,i){n&1&&(At(i.inputRef,Li,5),At(i.hostRef,Ii,5)),n&2&&Wt(2)},hostVars:2,hostBindings:function(n,i){n&1&&p("keydown",function(m){return i.onKeyDown(m)}),n&2&&Le(i.class())},inputs:{nzId:[1,"nzId"],nzSize:[1,"nzSize"],nzPlaceHolder:[1,"nzPlaceHolder"],nzStatus:[1,"nzStatus"],nzVariant:[1,"nzVariant"],nzStep:[1,"nzStep"],nzMin:[1,"nzMin"],nzMax:[1,"nzMax"],nzPrecision:[1,"nzPrecision"],nzParser:[1,"nzParser"],nzFormatter:[1,"nzFormatter"],nzDisabled:[1,"nzDisabled"],nzReadOnly:[1,"nzReadOnly"],nzAutoFocus:[1,"nzAutoFocus"],nzBordered:[1,"nzBordered"],nzKeyboard:[1,"nzKeyboard"],nzControls:[1,"nzControls"],nzPrefix:[1,"nzPrefix"],nzSuffix:[1,"nzSuffix"],nzAddonBefore:[1,"nzAddonBefore"],nzAddonAfter:[1,"nzAddonAfter"]},outputs:{nzBlur:"nzBlur",nzFocus:"nzFocus",nzOnStep:"nzOnStep"},exportAs:["nzInputNumber"],features:[pn([{provide:Sn,useExisting:tn(()=>r),multi:!0},{provide:_n,useValue:"input-number"}]),dn([Cn])],ngContentSelectors:Ri,decls:13,vars:1,consts:[["inputNumberWithAddonInner",""],["inputNumberWithAffix",""],["inputNumberWithAffixInner",""],["inputNumber",""],["inputNumberInner",""],["inputNumberHost",""],["input",""],["handlers",""],[3,"ngTemplateOutlet"],[1,"ant-input-number-wrapper","ant-input-number-group"],[1,"ant-input-number-group-addon"],[1,"ant-input-number-prefix"],[1,"ant-input-number-suffix"],[3,"status"],[1,"ant-input-number-handler-wrap"],[1,"ant-input-number-input-wrap"],["autocomplete","off","role","spinbutton",1,"ant-input-number-input",3,"input","value","placeholder","disabled","readOnly"],[1,"ant-input-number-handler-wrap",3,"mouseup","mouseleave"],["role","button","unselectable","on",1,"ant-input-number-handler","ant-input-number-handler-up",3,"mousedown"],["role","button","unselectable","on",1,"ant-input-number-handler","ant-input-number-handler-down",3,"mousedown"],["nzType","up",1,"ant-input-number-handler-up-inner"],["nzType","down",1,"ant-input-number-handler-down-inner"]],template:function(n,i){n&1&&(dt(Vi),v(0,Ai,1,1,null,8)(1,Ui,1,1,null,8)(2,ji,1,1,null,8),O(3,Ji,5,3,"ng-template",null,0,Se)(5,to,2,3,"ng-template",null,1,Se)(7,lo,3,3,"ng-template",null,2,Se)(9,mo,3,3,"ng-template",null,3,Se)(11,fo,4,10,"ng-template",null,4,Se)),n&2&&b(i.hasAddon()?0:i.hasAffix()?1:2)},dependencies:[k,R,yn,gn],encapsulation:2,changeDetection:0})}return r})(),ho=200,xo=600;function qn(r){let t=r.trim().replace(/,/g,"").replace(/。/g,".");return t.length?+t:NaN}function Zt(r,t,e){return r>=t&&r<=e}function Kn(r,t,e,n=null){if(n===null)return r<t?t:r>e?e:r;let i=+r.toFixed(n),o=Math.pow(10,n);return i<t?Math.ceil(t*o)/o:i>e?Math.floor(e*o)/o:i}function Qn(r){return r.toString().split(".")[1]?.length||0}function _o(r){return/[.。](\d*0)?$/.test(r.toString())}var Yn=(()=>{class r{static \u0275fac=function(n){return new(n||r)};static \u0275mod=ln({type:r});static \u0275inj=nn({imports:[Xt]})}return r})();var bo=()=>[","," "];function yo(r,t){if(r&1&&x(0,"nz-option",14),r&2){let e=t.$implicit;u("nzValue",e)("nzLabel",e)}}function So(r,t){if(r&1){let e=T();a(0,"div",30)(1,"input",31),N("ngModelChange",function(i){f(e);let o=c(2);return M(o.frontendStaticRoot,i)||(o.frontendStaticRoot=i),h(i)}),s(),a(2,"input",32),N("ngModelChange",function(i){f(e);let o=c(2);return M(o.indexFile,i)||(o.indexFile=i),h(i)}),s()(),a(3,"div",16),d(4,"\u9759\u6001\u76EE\u5F55\u7528\u4E8E\u76F4\u63A5\u6258\u7BA1\u524D\u7AEF\u4EA7\u7269"),s()}if(r&2){let e=c(2);l(),z("ngModel",e.frontendStaticRoot),l(),z("ngModel",e.indexFile)}}function wo(r,t){if(r&1){let e=T();a(0,"div",30)(1,"input",33),N("ngModelChange",function(i){f(e);let o=c(2);return M(o.frontendWebService,i)||(o.frontendWebService=i),h(i)}),s()(),a(2,"div",16),d(3,"\u9002\u5408\u672C\u5730\u5F00\u53D1\u670D\u52A1\u6216\u53CD\u5411\u4EE3\u7406\u524D\u7AEF\u7F51\u5173"),s()}if(r&2){let e=c(2);l(),z("ngModel",e.frontendWebService)}}function zo(r,t){if(r&1){let e=T();a(0,"div",22)(1,"div",34)(2,"span"),d(3),s(),a(4,"button",35),p("click",function(){let i=f(e).$index,o=c(2);return h(o.removeApiProxy(i))}),x(5,"span",36),s()(),a(6,"div",37)(7,"input",38),N("ngModelChange",function(i){let o=f(e).$implicit;return M(o.pathPrefix,i)||(o.pathPrefix=i),h(i)}),s(),a(8,"input",39),N("ngModelChange",function(i){let o=f(e).$implicit;return M(o.backendService,i)||(o.backendService=i),h(i)}),s(),a(9,"label",40),N("ngModelChange",function(i){let o=f(e).$implicit;return M(o.isWebSocket,i)||(o.isWebSocket=i),h(i)}),d(10," WS "),s()()()}if(r&2){let e=t.$implicit,n=t.$index;l(3),J("\u8F6C\u53D1\u89C4\u5219 ",n+1),l(4),z("ngModel",e.pathPrefix),u("name","apiPathPrefix"+n),l(),z("ngModel",e.backendService),u("name","apiBackendService"+n),l(),z("ngModel",e.isWebSocket),u("name","apiIsWs"+n)}}function Mo(r,t){if(r&1){let e=T();a(0,"nz-form-item")(1,"nz-form-label",6),d(2,"SSL \u8BC1\u4E66\u8DEF\u5F84"),s(),a(3,"nz-form-control",41)(4,"input",42),N("ngModelChange",function(i){f(e);let o=c(2);return M(o.formData.sslCert,i)||(o.formData.sslCert=i),h(i)}),s()()(),a(5,"nz-form-item")(6,"nz-form-label",6),d(7,"SSL \u79C1\u94A5\u8DEF\u5F84"),s(),a(8,"nz-form-control",43)(9,"input",44),N("ngModelChange",function(i){f(e);let o=c(2);return M(o.formData.sslKey,i)||(o.formData.sslKey=i),h(i)}),s()()()}if(r&2){let e=c(2);l(4),z("ngModel",e.formData.sslCert),l(5),z("ngModel",e.formData.sslKey)}}function No(r,t){if(r&1){let e=T();te(0),a(1,"div",4)(2,"form",5)(3,"nz-form-item")(4,"nz-form-label",6),d(5,"Server \u540D\u79F0"),s(),a(6,"nz-form-control",7)(7,"input",8),N("ngModelChange",function(i){f(e);let o=c();return M(o.formData.name,i)||(o.formData.name=i),h(i)}),s()()(),a(8,"nz-form-item")(9,"nz-form-label",6),d(10,"\u8BBF\u95EE\u5730\u5740"),s(),a(11,"nz-form-control")(12,"div",9)(13,"nz-select",10),N("ngModelChange",function(i){f(e);let o=c();return M(o.formData.protocol,i)||(o.formData.protocol=i),h(i)}),x(14,"nz-option",11)(15,"nz-option",12),s(),a(16,"nz-select",13),N("ngModelChange",function(i){f(e);let o=c();return M(o.domainValues,i)||(o.domainValues=i),h(i)}),p("ngModelChange",function(){f(e);let i=c();return h(i.syncDomains())}),L(17,yo,1,2,"nz-option",14,Ne),s(),a(19,"nz-input-number",15),N("ngModelChange",function(i){f(e);let o=c();return M(o.listenPort,i)||(o.listenPort=i),h(i)}),s()()(),a(20,"div",16),d(21,"\u57DF\u540D\u652F\u6301\u591A\u4E2A\u503C\uFF0C\u7AEF\u53E3\u4E3A\u5355\u4E2A\u503C\uFF0C\u4F8B\u5982\uFF1Alocalhost, 192.168.1.100 / 8080"),s()(),a(22,"nz-form-item")(23,"nz-form-label",6),d(24,"\u524D\u7AEF\u670D\u52A1"),s(),a(25,"nz-form-control")(26,"nz-radio-group",17),N("ngModelChange",function(i){f(e);let o=c();return M(o.frontendServiceType,i)||(o.frontendServiceType=i),h(i)}),p("ngModelChange",function(i){f(e);let o=c();return h(o.onFrontendServiceTypeChange(i))}),a(27,"label",18),d(28,"Web\u670D\u52A1\u5730\u5740"),s(),a(29,"label",19),d(30,"\u9759\u6001\u6587\u4EF6\u76EE\u5F55"),s()(),v(31,So,5,2)(32,wo,4,1),s()(),a(33,"nz-form-item")(34,"nz-form-label",20),d(35,"\u4EE3\u7406\u8F6C\u53D1"),s(),a(36,"nz-form-control")(37,"div",21),L(38,zo,11,7,"div",22,pe),a(40,"button",23),p("click",function(){f(e);let i=c();return h(i.addApiProxy())}),x(41,"span",24),d(42," \u6DFB\u52A0\u4EE3\u7406\u89C4\u5219 "),s()(),a(43,"div",16),d(44,"\u53EF\u914D\u7F6E\u591A\u4E2A\u4E0D\u540C\u8DEF\u5F84\u7684\u4EE3\u7406\u89C4\u5219\uFF0C\u5982 /api\u3001/ws \u7B49"),s()()(),v(45,Mo,10,2),a(46,"nz-form-item")(47,"nz-form-label"),d(48,"\u81EA\u5B9A\u4E49\u914D\u7F6E\u7247\u6BB5"),s(),a(49,"nz-form-control")(50,"textarea",25),N("ngModelChange",function(i){f(e);let o=c();return M(o.formData.extraConfig,i)||(o.formData.extraConfig=i),h(i)}),s()(),a(51,"div",16),d(52," \u7528\u4E8E\u8865\u5145\u9AD8\u7EA7\u6307\u4EE4\uFF08`location` \u5E38\u89C4\u573A\u666F\u5EFA\u8BAE\u5728\u4E0A\u9762\u7684 \u4EE3\u7406\u8F6C\u53D1 \u4E2D\u914D\u7F6E\uFF09 "),s()()()(),a(53,"div",26)(54,"button",27),p("click",function(){f(e);let i=c();return h(i.onClose())}),d(55,"\u53D6\u6D88"),s(),a(56,"button",27),p("click",function(){f(e);let i=c();return h(i.previewConfig())}),d(57,"\u9884\u89C8\u914D\u7F6E"),s(),a(58,"button",28),p("click",function(){f(e);let i=c();return h(i.runConfigTest())}),d(59," \u6D4B\u8BD5\u914D\u7F6E "),s(),a(60,"button",29),p("click",function(){f(e);let i=c();return h(i.save())}),d(61,"\u4FDD\u5B58"),s()(),ne()}if(r&2){let e=c();l(7),z("ngModel",e.formData.name),l(6),z("ngModel",e.formData.protocol),l(3),u("nzMaxTagCount",1),z("ngModel",e.domainValues),u("nzTokenSeparators",Te(13,bo)),l(),I(e.commonDomainOptions),l(2),z("ngModel",e.listenPort),l(7),z("ngModel",e.frontendServiceType),l(5),b(e.frontendServiceType==="static"?31:32),l(3),u("nzTooltipIcon","question-circle"),l(4),I(e.apiProxies),l(7),b(e.formData.protocol==="https"?45:-1),l(5),z("ngModel",e.formData.extraConfig),l(8),u("nzLoading",e.validatingConfig()),l(2),u("nzLoading",e.saving())}}function To(r,t){if(r&1&&(te(0),a(1,"pre",45),d(2),s(),ne()),r&2){let e=c();l(2),y(e.previewContent())}}var Lt=class r{visible=!1;mode="create";editingServer=null;duplicateSourceServer=null;visibleChange=new me;saved=new me;nginxService=w(ee);message=w($);modal=w(Ie);cdr=w(un);resetTimer=null;visibleEmitTimer=null;saving=g(!1);validatingConfig=g(!1);previewVisible=g(!1);previewContent=g("");commonDomainOptions=["127.0.0.1"];localIp=null;hasFetchedLocalIp=!1;commonIndexOptions=["index.html"];listenPort=null;domainValues=["127.0.0.1"];indexFile="index.html";frontendServiceType="web";frontendStaticRoot="";frontendWebService="";apiProxies=[];formData={name:"",listen:[],domains:["127.0.0.1"],root:"",index:["index.html"],locations:[],ssl:!1,protocol:"http",enabled:!0,sslCert:"",sslKey:"",extraConfig:""};get drawerTitle(){return this.mode==="copy"?"\u590D\u5236 Server ":this.mode==="edit"?"\u7F16\u8F91 Server ":"\u65B0\u589E Server "}ngOnChanges(t){let e="visible"in t,n="mode"in t,i="editingServer"in t,o="duplicateSourceServer"in t;(e&&this.visible||n&&this.visible&&!t.mode?.firstChange||i&&this.visible&&!t.editingServer?.firstChange||o&&this.visible&&!t.duplicateSourceServer?.firstChange)&&(this.scheduleResetForm(),this.visible&&!this.hasFetchedLocalIp&&(this.hasFetchedLocalIp=!0,this.getLocalIp()))}ngOnDestroy(){this.resetTimer&&(clearTimeout(this.resetTimer),this.resetTimer=null),this.visibleEmitTimer&&(clearTimeout(this.visibleEmitTimer),this.visibleEmitTimer=null)}scheduleResetForm(){this.resetTimer&&clearTimeout(this.resetTimer),this.resetTimer=setTimeout(()=>{this.resetTimer=null,this.resetForm(),this.cdr.detectChanges()},0)}emitVisibleChange(t){this.visibleEmitTimer&&clearTimeout(this.visibleEmitTimer),this.visibleEmitTimer=setTimeout(()=>{this.visibleEmitTimer=null,this.visibleChange.emit(t)},0)}resetForm(){if(this.editingServer){let t=this.parseListenPort(this.editingServer.listen);this.formData={name:this.editingServer.name,listen:t?[String(t)]:["8080"],domains:[...this.editingServer.domains||[]],root:this.editingServer.root||"",index:[...this.editingServer.index?.length?this.editingServer.index:["index.html"]],locations:this.editingServer.locations.map(e=>S({},e)),ssl:this.editingServer.ssl,protocol:this.editingServer.ssl?"https":"http",enabled:this.editingServer.enabled,sslCert:this.editingServer.sslCert||"",sslKey:this.editingServer.sslKey||"",extraConfig:this.editingServer.extraConfig||""},this.listenPort=t||8080,this.domainValues=[...this.formData.domains||[]],this.indexFile=(this.formData.index||["index.html"])[0]||"index.html",this.initScenarioFromFormData()}else if(this.duplicateSourceServer){let t=this.parseListenPort(this.duplicateSourceServer.listen);this.formData={name:this.makeCopyName(this.duplicateSourceServer.name),listen:t?[String(t)]:[],domains:[...this.duplicateSourceServer.domains||["127.0.0.1"]],root:this.duplicateSourceServer.root||"",index:[...this.duplicateSourceServer.index?.length?this.duplicateSourceServer.index:["index.html"]],locations:this.duplicateSourceServer.locations.map(e=>S({},e)),ssl:this.duplicateSourceServer.ssl,protocol:this.duplicateSourceServer.ssl?"https":"http",enabled:this.duplicateSourceServer.enabled,sslCert:this.duplicateSourceServer.sslCert||"",sslKey:this.duplicateSourceServer.sslKey||"",extraConfig:this.duplicateSourceServer.extraConfig||""},this.listenPort=t,this.domainValues=[...this.formData.domains||[]],this.indexFile=(this.formData.index||["index.html"])[0]||"index.html",this.initScenarioFromFormData()}else this.formData={name:"",listen:["8080"],domains:["127.0.0.1"],root:"",index:["index.html"],locations:[],ssl:!1,protocol:"http",enabled:!0,sslCert:"",sslKey:"",extraConfig:""},this.listenPort=8080,this.domainValues=["127.0.0.1"],this.indexFile="index.html",this.frontendServiceType="web",this.frontendStaticRoot="",this.frontendWebService="",this.apiProxies=[]}makeCopyName(t){let e=String(t||"").trim();return e?`${e}-copy`:"server-copy"}syncDomains(){this.formData.domains=(this.domainValues||[]).flatMap(t=>t.split(/[,\s]+/)).map(t=>t.trim()).filter(t=>t.length>0).filter((t,e,n)=>n.indexOf(t)===e)}onClose(){this.emitVisibleChange(!1)}onFrontendServiceTypeChange(t){this.frontendServiceType=t,t==="static"?(this.frontendWebService="",this.frontendStaticRoot=this.frontendStaticRoot||String(this.formData.root||"").trim(),this.indexFile||(this.indexFile="index.html")):(this.frontendStaticRoot="",this.indexFile="index.html")}async getLocalIp(){try{let t=await this.nginxService.getLocalIp();if(t.ip){this.localIp=t.ip,this.commonDomainOptions.includes(t.ip)||(this.commonDomainOptions=[...this.commonDomainOptions,t.ip]);let e=this.domainValues||[];e.includes(t.ip)||(this.domainValues=[...e,t.ip],this.syncDomains())}}catch{}}addApiProxy(){this.apiProxies=[...this.apiProxies,{pathPrefix:"/api",backendService:"",isWebSocket:!1}]}removeApiProxy(t){let e=[...this.apiProxies];e.splice(t,1),this.apiProxies=e}previewConfig(){this.syncListen(),this.syncDomains(),this.syncScenarioToFormData();let t=this.toComparableRequestFromForm();this.previewContent.set(this.generatePreviewConfig(t)),this.previewVisible.set(!0)}async save(){if(!this.formData.name.trim()){this.message.warning("\u8BF7\u8F93\u5165 Server \u540D\u79F0");return}if(this.syncDomains(),!this.formData.domains?.length){this.message.warning("\u8BF7\u81F3\u5C11\u586B\u5199\u4E00\u4E2A\u57DF\u540D");return}let t=this.getInvalidDomains(this.formData.domains);if(t.length){this.message.warning(`\u57DF\u540D\u683C\u5F0F\u65E0\u6548: ${t.join(", ")}`);return}if(this.syncListen(),!this.formData.listen.length){this.message.warning("\u8BF7\u586B\u5199\u76D1\u542C\u7AEF\u53E3");return}if(this.frontendServiceType==="static"){let o=String(this.frontendStaticRoot||"").trim();if(!o){this.message.warning("\u9009\u62E9\u201C\u9759\u6001\u6587\u4EF6\u76EE\u5F55\u201D\u65F6\uFF0C\u8BF7\u586B\u5199\u524D\u7AEF\u9759\u6001\u76EE\u5F55");return}if(!this.isValidFilePath(o)){this.message.warning("\u524D\u7AEF\u9759\u6001\u76EE\u5F55\u8DEF\u5F84\u683C\u5F0F\u65E0\u6548\uFF0C\u8BF7\u586B\u5199\u7EDD\u5BF9\u8DEF\u5F84");return}}else{let o=String(this.frontendWebService||"").trim();if(!o){this.message.warning("\u9009\u62E9\u201CWeb\u670D\u52A1\u5730\u5740\u201D\u65F6\uFF0C\u8BF7\u586B\u5199\u524D\u7AEF\u670D\u52A1\u5730\u5740");return}if(!this.isValidHttpUrl(o)){this.message.warning("\u524D\u7AEF\u670D\u52A1\u5730\u5740\u65E0\u6548\uFF0C\u8BF7\u586B\u5199 http:// \u6216 https:// \u5F00\u5934\u7684\u5B8C\u6574\u5730\u5740");return}}for(let o=0;o<this.apiProxies.length;o++){let m=this.apiProxies[o],_=this.normalizeApiPathPrefix(m.pathPrefix);m.pathPrefix=_;let C=String(m.backendService||"").trim();if(C&&!this.isValidHttpUrl(C)){this.message.warning(`\u7B2C ${o+1} \u4E2A API \u4EE3\u7406\u7684\u540E\u7AEF\u670D\u52A1\u5730\u5740\u65E0\u6548\uFF0C\u8BF7\u586B\u5199 http:// \u6216 https:// \u5F00\u5934\u7684\u5B8C\u6574\u5730\u5740`);return}}if(this.formData.protocol==="https"){if(!this.formData.sslCert?.trim()){this.message.warning("\u8BF7\u586B\u5199 SSL \u8BC1\u4E66\u8DEF\u5F84");return}if(!this.formData.sslKey?.trim()){this.message.warning("\u8BF7\u586B\u5199 SSL \u79C1\u94A5\u8DEF\u5F84");return}if(!this.isValidFilePath(this.formData.sslCert)){this.message.warning("SSL \u8BC1\u4E66\u8DEF\u5F84\u683C\u5F0F\u65E0\u6548\uFF0C\u8BF7\u586B\u5199\u7EDD\u5BF9\u8DEF\u5F84");return}if(!this.isValidFilePath(this.formData.sslKey)){this.message.warning("SSL \u79C1\u94A5\u8DEF\u5F84\u683C\u5F0F\u65E0\u6548\uFF0C\u8BF7\u586B\u5199\u7EDD\u5BF9\u8DEF\u5F84");return}if(!await this.validateSslReadable())return}if(this.syncScenarioToFormData(),!(!await this.confirmDiffBeforeSave()||await this.detectPortConflict()||!await this.validateBeforeSave())){this.saving.set(!0);try{let o=this.mode==="edit"&&!!this.editingServer,m;o&&this.editingServer?m=await this.nginxService.updateServer(this.editingServer.id,this.formData):m=await this.nginxService.createServer(this.formData),this.message.success(o?"Server \u5DF2\u66F4\u65B0\uFF0C\u8BF7\u70B9\u51FB\u201C\u91CD\u8F7D\u201D\u4F7F\u53D8\u66F4\u751F\u6548":"Server \u5DF2\u521B\u5EFA\uFF0C\u8BF7\u70B9\u51FB\u201C\u91CD\u8F7D\u201D\u4F7F\u53D8\u66F4\u751F\u6548"),this.saved.emit(),this.emitVisibleChange(!1)}catch(o){this.message.error("\u64CD\u4F5C\u5931\u8D25: "+this.extractErrorMessage(o))}finally{this.saving.set(!1)}}}async runConfigTest(){this.syncListen(),this.syncDomains(),this.syncScenarioToFormData(),await this.validateBeforeSave(!0)}syncListen(){if(this.listenPort===null||this.listenPort===void 0){this.formData.listen=[];return}let t=Math.floor(this.listenPort);if(t<1||t>65535){this.message.warning(`\u76D1\u542C\u7AEF\u53E3 ${this.listenPort} \u65E0\u6548\uFF0C\u8BF7\u8F93\u5165 1-65535 \u7684\u6574\u6570`),this.formData.listen=[];return}this.formData.listen=[String(t)]}parseListenPort(t){if(!t||t.length===0)return null;for(let e of t){let n=String(e||"").match(/\d+/);if(!n)continue;let i=Number(n[0]);if(Number.isInteger(i)&&i>=1&&i<=65535)return i}return null}initScenarioFromFormData(){let t=[...this.formData.locations||[]],e=t.find(i=>String(i.path||"").trim()==="/");if(e?.proxyPass)this.frontendServiceType="web",this.frontendWebService=String(e.proxyPass||"").trim(),this.frontendStaticRoot="";else{this.frontendServiceType="static",this.frontendStaticRoot=String(e?.root||this.formData.root||"").trim(),this.frontendWebService="";let i=e?.index?.length?e.index:this.formData.index||[];this.indexFile=i[0]||"index.html"}let n=t.filter(i=>{let o=String(i.path||"").trim();return!!o&&o!=="/"&&!!i.proxyPass});n.length>0?this.apiProxies=n.map(i=>({pathPrefix:this.normalizeApiPathPrefix(String(i.path||"/api")),backendService:String(i.proxyPass||"").trim(),isWebSocket:!1})):this.apiProxies=[]}syncScenarioToFormData(){let t=[],e=String(this.frontendStaticRoot||"").trim(),n=String(this.frontendWebService||"").trim();if(this.frontendServiceType==="static"?(this.formData.root=e,this.formData.index=this.indexFile?[this.indexFile]:[]):(this.formData.root="",this.formData.index=[],n&&t.push({path:"/",proxyPass:n})),this.apiProxies.length>0)for(let i of this.apiProxies){let o=this.normalizeApiPathPrefix(i.pathPrefix),m=String(i.backendService||"").trim();if(o&&m){let _=i.isWebSocket?["proxy_http_version 1.1;","proxy_set_header Upgrade $http_upgrade;",'proxy_set_header Connection "upgrade";'].join(`
|
|
4
|
+
`):void 0;t.push({path:o,proxyPass:m,rawConfig:_})}}this.formData.locations=t}normalizeApiPathPrefix(t){let e=String(t||"").trim();return e?(e.startsWith("/")||(e=`/${e}`),e):"/api"}extractErrorMessage(t){let e=t;return e?.error?.error?.message||e?.error?.message||e?.message||"\u8BF7\u6C42\u5931\u8D25"}getInvalidDomains(t){return(t||[]).filter(e=>!this.isValidDomain(e))}isValidDomain(t){let e=String(t||"").trim();return e?e==="_"||e==="*"||e==="localhost"?!0:/^(\d{1,3}\.){3}\d{1,3}$/.test(e)?e.split(".").every(i=>Number(i)>=0&&Number(i)<=255):/^(?=.{1,253}$)(?!-)(?:[a-zA-Z0-9-]{1,63}\.)+[a-zA-Z]{2,63}$/.test(e):!1}isValidFilePath(t){let e=String(t||"").trim();return e?!!(/^[a-zA-Z]:\\/.test(e)||e.startsWith("/")):!1}isValidHttpUrl(t){let e=String(t||"").trim();if(!e)return!1;try{let n=new URL(e);return n.protocol==="http:"||n.protocol==="https:"}catch{return!1}}async validateSslReadable(){try{let t=String(this.formData.sslCert||"").trim(),e=String(this.formData.sslKey||"").trim(),n=await this.nginxService.validateSslPaths(t,e);return n.valid?!0:(n.cert?.exists?n.cert?.readable||this.message.warning(`SSL \u8BC1\u4E66\u4E0D\u53EF\u8BFB: ${t}`):this.message.warning(`SSL \u8BC1\u4E66\u4E0D\u5B58\u5728: ${t}`),n.key?.exists?n.key?.readable||this.message.warning(`SSL \u79C1\u94A5\u4E0D\u53EF\u8BFB: ${e}`):this.message.warning(`SSL \u79C1\u94A5\u4E0D\u5B58\u5728: ${e}`),!1)}catch(t){return this.message.warning("SSL \u6587\u4EF6\u6821\u9A8C\u5931\u8D25: "+this.extractErrorMessage(t)),!1}}async detectPortConflict(){try{let t=await this.nginxService.getServers();if(!t.servers?.length)return!1;let e=this.mode==="edit"?this.editingServer?.id:null,n=new Set((this.formData.listen||[]).map(o=>String(o).trim()).filter(Boolean));if(!n.size)return!1;let i=t.servers.find(o=>{if(!o.enabled||e&&o.id===e)return!1;let m=new Set((o.listen||[]).map(_=>this.extractListenPort(_)).filter(Boolean));for(let _ of n)if(m.has(_))return!0;return!1});return i?(this.message.warning(`\u68C0\u6D4B\u5230\u7AEF\u53E3\u53EF\u80FD\u51B2\u7A81\uFF1A${i.name}`),!0):!1}catch(t){return this.message.warning("\u7AEF\u53E3\u51B2\u7A81\u6821\u9A8C\u5931\u8D25\uFF0C\u5DF2\u963B\u6B62\u4FDD\u5B58: "+this.extractErrorMessage(t)),!0}}extractListenPort(t){let e=String(t||"").match(/(\d{1,5})/);return e?String(Number(e[1])):""}async validateBeforeSave(t=!1){this.validatingConfig.set(!0);try{let e=await this.nginxService.validateConfig();return e.valid?(t&&this.message.success("\u914D\u7F6E\u68C0\u6D4B\u901A\u8FC7"),!0):(this.message.error("\u914D\u7F6E\u68C0\u6D4B\u5931\u8D25\uFF0C\u8BF7\u5148\u4FEE\u590D\u5168\u5C40\u914D\u7F6E\u9519\u8BEF\u540E\u518D\u4FDD\u5B58"),(e.errors||[]).slice(0,3).forEach(n=>this.message.error(n)),!1)}catch(e){return this.message.error("\u914D\u7F6E\u68C0\u6D4B\u5931\u8D25: "+this.extractErrorMessage(e)),!1}finally{this.validatingConfig.set(!1)}}async confirmDiffBeforeSave(){if(this.mode!=="edit"||!this.editingServer)return!0;let t=this.toComparableRequestFromServer(this.editingServer),e=this.toComparableRequestFromForm(),n=this.buildDiffRows(t,e);if(!n.length)return this.message.info("\u672A\u68C0\u6D4B\u5230\u914D\u7F6E\u53D8\u66F4"),!1;let i=n.slice(0,12),o=this.renderDiffHtml(i,n.length-i.length);return await new Promise(m=>{this.modal.confirm({nzTitle:"\u786E\u8BA4\u4FDD\u5B58\u4EE5\u4E0B\u53D8\u66F4",nzContent:o,nzWidth:860,nzOkText:"\u786E\u8BA4\u4FDD\u5B58",nzCancelText:"\u53D6\u6D88",nzOnOk:()=>m(!0),nzOnCancel:()=>m(!1)})})}toComparableRequestFromServer(t){return{name:String(t.name||"").trim(),listen:this.normalizeStringArray(t.listen||[]),domains:this.normalizeStringArray(t.domains||[]),root:String(t.root||"").trim(),index:this.normalizeStringArray(t.index||[]),locations:this.normalizeLocationsForCompare(t.locations||[]),ssl:!!t.ssl,protocol:t.ssl?"https":"http",sslCert:String(t.sslCert||"").trim(),sslKey:String(t.sslKey||"").trim(),enabled:!!t.enabled,extraConfig:String(t.extraConfig||"").trim()}}toComparableRequestFromForm(){return{name:String(this.formData.name||"").trim(),listen:this.normalizeStringArray(this.formData.listen||[]),domains:this.normalizeStringArray(this.formData.domains||[]),root:String(this.formData.root||"").trim(),index:this.normalizeStringArray(this.formData.index||[]),locations:this.normalizeLocationsForCompare(this.formData.locations||[]),ssl:this.formData.protocol==="https",protocol:this.formData.protocol==="https"?"https":"http",sslCert:String(this.formData.sslCert||"").trim(),sslKey:String(this.formData.sslKey||"").trim(),enabled:this.formData.enabled!==!1,extraConfig:String(this.formData.extraConfig||"").trim()}}buildDiffRows(t,e){let n=[];return this.pushDiff(n,"\u540D\u79F0",t.name,e.name),this.pushDiff(n,"\u76D1\u542C\u7AEF\u53E3",(t.listen||[]).join(", "),(e.listen||[]).join(", ")),this.pushDiff(n,"\u57DF\u540D",(t.domains||[]).join(", "),(e.domains||[]).join(", ")),this.pushDiff(n,"\u6839\u76EE\u5F55",t.root||"",e.root||""),this.pushDiff(n,"\u9ED8\u8BA4\u9996\u9875",(t.index||[]).join(", "),(e.index||[]).join(", ")),this.pushDiff(n,"\u534F\u8BAE",t.protocol||"",e.protocol||""),this.pushDiff(n,"SSL\u8BC1\u4E66",t.sslCert||"",e.sslCert||""),this.pushDiff(n,"SSL\u79C1\u94A5",t.sslKey||"",e.sslKey||""),this.pushDiff(n,"\u542F\u7528\u72B6\u6001",String(!!t.enabled),String(!!e.enabled)),this.pushDiff(n,"\u81EA\u5B9A\u4E49\u914D\u7F6E",t.extraConfig||"",e.extraConfig||""),this.pushDiff(n,"Location \u89C4\u5219",this.serializeLocations(t.locations||[]),this.serializeLocations(e.locations||[])),n}pushDiff(t,e,n,i){let o=String(n||"").trim(),m=String(i||"").trim();o!==m&&t.push({label:e,before:o||"\u7A7A",after:m||"\u7A7A"})}normalizeStringArray(t){return Array.from(new Set((t||[]).map(e=>String(e||"").trim()).filter(Boolean))).sort((e,n)=>e.localeCompare(n,"zh-CN"))}normalizeLocationsForCompare(t){return(t||[]).map(e=>({path:String(e.path||"").trim(),proxyPass:String(e.proxyPass||"").trim()||void 0,root:String(e.root||"").trim()||void 0,index:this.normalizeStringArray(e.index||[]),tryFiles:this.normalizeStringArray(e.tryFiles||[]),rawConfig:String(e.rawConfig||"").trim()||void 0}))}serializeLocations(t){return(t||[]).map(n=>{let i=String(n.path||"/").trim()||"/",o=String(n.proxyPass||"").trim(),m=String(n.root||"").trim(),_=(n.index||[]).join(", "),C=(n.tryFiles||[]).join(" "),G=String(n.rawConfig||"").trim(),de=/proxy_set_header\s+upgrade\s+\$http_upgrade/i.test(G)||/proxy_set_header\s+connection\s+"?upgrade"?/i.test(G);return[`path=${i}`,o?`proxy=${o}`:"",m?`root=${m}`:"",_?`index=${_}`:"",C?`try_files=${C}`:"",de?"ws=on":"ws=off",G?`raw=${G.replace(/\s+/g," ")}`:""].filter(Boolean).join(" | ")}).sort((n,i)=>n.localeCompare(i,"zh-CN")).join(`
|
|
5
|
+
`)}generatePreviewConfig(t){let e=["server {"],n=this.normalizeStringArray(t.listen||[]),i=this.normalizeStringArray(t.domains||[]),o=this.normalizeStringArray(t.index||[]),m=t.protocol==="https"||t.ssl===!0;return e.push(` # ngm-name: ${t.name||"unnamed"}`),n.forEach(_=>{let C=String(_||"").trim();C&&(m&&C==="443"?e.push(` listen ${C} ssl;`):e.push(` listen ${C};`))}),e.push(` server_name ${(i.length?i:["_"]).join(" ")};`),t.root&&e.push(` root ${t.root};`),o.length&&e.push(` index ${o.join(" ")};`),m&&(e.push(""),e.push(" # SSL \u914D\u7F6E"),e.push(` ssl_certificate ${t.sslCert||"/path/to/cert.pem"};`),e.push(` ssl_certificate_key ${t.sslKey||"/path/to/key.pem"};`)),(t.locations||[]).forEach(_=>{let C=String(_.path||"/").trim()||"/",G=String(_.proxyPass||"").trim(),de=String(_.rawConfig||"").split(/\r?\n/).map(le=>le.trim()).filter(Boolean),nt=new Set(de.map(le=>le.replace(/\s+/g," "))),Jn=de.some(le=>/upgrade\s+\$http_upgrade/i.test(le));if(e.push(""),e.push(` location ${C} {`),G){e.push(` proxy_pass ${G};`);let le=["proxy_set_header Host $host;","proxy_set_header X-Real-IP $remote_addr;","proxy_set_header REMOTE-HOST $remote_addr;","proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;","proxy_set_header X-Forwarded-Proto $scheme;","proxy_set_header X-Forwarded-Host $host;","proxy_set_header X-Forwarded-Port $server_port;"];for(let st of le)nt.has(st)||e.push(` ${st}`);if(Jn){let st=["proxy_http_version 1.1;","proxy_set_header Upgrade $http_upgrade;",'proxy_set_header Connection "upgrade";'];for(let Jt of st)nt.has(Jt)||e.push(` ${Jt}`)}}_.root&&e.push(` root ${_.root};`),_.index?.length&&e.push(` index ${_.index.join(" ")};`),_.tryFiles?.length&&e.push(` try_files ${_.tryFiles.join(" ")};`),de.length&&de.forEach(le=>{e.push(` ${le.endsWith(";")?le:`${le};`}`)}),e.push(" }")}),t.extraConfig&&(e.push(""),t.extraConfig.split(/\r?\n/).map(_=>_.trimEnd()).filter(Boolean).forEach(_=>{e.push(` ${_}`)})),e.push("}"),e.join(`
|
|
6
|
+
`)}renderDiffHtml(t,e){let n=t.map(o=>{let m=this.formatDiffValue(o.before),_=this.formatDiffValue(o.after);return`<tr>
|
|
7
|
+
<td style="padding:8px 10px;border:1px solid #f0f0f0;vertical-align:top;font-weight:600;min-width:110px;">${this.escapeHtml(o.label)}</td>
|
|
8
|
+
<td style="padding:8px 10px;border:1px solid #f0f0f0;vertical-align:top;white-space:pre-wrap;word-break:break-word;max-width:360px;color:#595959;background:#fff7f7;">${m}</td>
|
|
9
|
+
<td style="padding:8px 10px;border:1px solid #f0f0f0;vertical-align:top;white-space:pre-wrap;word-break:break-word;max-width:360px;color:#262626;background:#f6ffed;">${_}</td>
|
|
10
|
+
</tr>`}).join(""),i=e>0?`<div style="margin-top:8px;color:#8c8c8c;font-size:12px;">\u8FD8\u6709 ${e} \u9879\u53D8\u66F4\u672A\u5C55\u5F00</div>`:"";return`
|
|
11
|
+
<div style="max-height:460px;overflow:auto;">
|
|
12
|
+
<div style="margin-bottom:10px;padding:8px 10px;background:#f6ffed;border:1px solid #b7eb8f;border-radius:6px;color:#237804;">
|
|
13
|
+
\u68C0\u6D4B\u5230 ${t.length} \u9879\u914D\u7F6E\u53D8\u66F4
|
|
14
|
+
</div>
|
|
15
|
+
<table style="width:100%;border-collapse:collapse;font-size:12px;">
|
|
16
|
+
<thead>
|
|
17
|
+
<tr>
|
|
18
|
+
<th style="padding:8px 10px;border:1px solid #f0f0f0;background:#fafafa;text-align:left;">\u5B57\u6BB5</th>
|
|
19
|
+
<th style="padding:8px 10px;border:1px solid #f0f0f0;background:#fff1f0;text-align:left;">\u539F\u503C</th>
|
|
20
|
+
<th style="padding:8px 10px;border:1px solid #f0f0f0;background:#f6ffed;text-align:left;">\u65B0\u503C</th>
|
|
21
|
+
</tr>
|
|
22
|
+
</thead>
|
|
23
|
+
<tbody>${n}</tbody>
|
|
24
|
+
</table>
|
|
25
|
+
${i}
|
|
26
|
+
</div>
|
|
27
|
+
`}formatDiffValue(t){let e=String(t||""),n=e.length>300?`${e.slice(0,300)} ...`:e;return this.escapeHtml(n).replace(/\n/g,"<br/>")}escapeHtml(t){return String(t||"").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}static \u0275fac=function(e){return new(e||r)};static \u0275cmp=P({type:r,selectors:[["app-nginx-server-drawer"]],inputs:{visible:"visible",mode:"mode",editingServer:"editingServer",duplicateSourceServer:"duplicateSourceServer"},outputs:{visibleChange:"visibleChange",saved:"saved"},features:[Ee],decls:4,vars:8,consts:[[3,"nzOnClose","nzVisible","nzPlacement","nzWidth","nzTitle","nzClosable","nzMaskClosable"],[4,"nzDrawerContent"],["nzTitle","\u914D\u7F6E\u9884\u89C8","nzWidth","900px",3,"nzOnCancel","nzVisible","nzFooter"],[4,"nzModalContent"],[1,"drawer-body"],["nz-form","","nzLayout","vertical"],["nzRequired",""],["nzHasFeedback","","nzErrorTip","\u8BF7\u8F93\u5165 Server \u540D\u79F0"],["nz-input","","name","serverName","placeholder","\u4F8B\u5982\uFF1Amain-site",3,"ngModelChange","ngModel"],["nz-input-group","","nzCompact","",1,"domain-row-wrapper"],["name","protocol","nzPlaceHolder","HTTP",1,"domain-row-protocol",3,"ngModelChange","ngModel"],["nzValue","http","nzLabel","HTTP"],["nzValue","https","nzLabel","HTTPS"],["nzMode","tags","name","domains","nzPlaceHolder","\u53EF\u8F93\u5165\u6216\u9009\u62E9\u591A\u4E2A\u57DF\u540D",1,"domain-row-domain",3,"ngModelChange","nzMaxTagCount","ngModel","nzTokenSeparators"],[3,"nzValue","nzLabel"],["name","listenPort","nzPlaceHolder","\u7AEF\u53E3","nzMin","1","nzMax","65535",1,"domain-row-listen",2,"width","100px",3,"ngModelChange","ngModel"],[1,"field-hint"],["name","frontendServiceType",3,"ngModelChange","ngModel"],["nz-radio","","nzValue","web"],["nz-radio","","nzValue","static"],["nzTooltipTitle","\u914D\u7F6E\u4EE3\u7406\u8F6C\u53D1\u89C4\u5219\uFF0C\u7528\u4E8E\u5C06\u7279\u5B9A\u8DEF\u5F84\u7684\u8BF7\u6C42\u8F6C\u53D1\u5230\u540E\u7AEF\u670D\u52A1",3,"nzTooltipIcon"],[1,"api-proxy-list"],[1,"api-proxy-item"],["nz-button","","nzType","default","type","button",1,"add-api-proxy-btn",3,"click"],["nz-icon","","nzType","plus"],["nz-input","","name","extraConfig","rows","4","placeholder",`# \u5728\u6B64\u6DFB\u52A0\u81EA\u5B9A\u4E49 nginx \u914D\u7F6E
|
|
28
|
+
location /api {
|
|
29
|
+
proxy_pass http://backend_cluster;
|
|
30
|
+
}`,1,"mono-textarea",3,"ngModelChange","ngModel"],[1,"drawer-footer"],["nz-button","","nzType","default",3,"click"],["nz-button","","nzType","default",3,"click","nzLoading"],["nz-button","","nzType","primary",3,"click","nzLoading"],[1,"scenario-panel"],["nz-input","","name","frontendStaticRoot","placeholder","\u9759\u6001\u76EE\u5F55\uFF0C\u5982 D:\\\\dist\\\\www",1,"mono-input",3,"ngModelChange","ngModel"],["nz-input","","name","frontendStaticIndex","placeholder","\u9ED8\u8BA4\u9996\u9875",1,"scenario-index",3,"ngModelChange","ngModel"],["nz-input","","name","frontendWebService","placeholder","Web \u670D\u52A1\u5730\u5740\uFF0C\u5982 http://localhost:4200",1,"mono-input",3,"ngModelChange","ngModel"],[1,"api-proxy-item-head"],["nz-button","","nzType","link","nzDanger","","nzSize","small","type","button",3,"click"],["nz-icon","","nzType","delete"],[1,"api-proxy-grid"],["nz-input","","placeholder","\u8F6C\u53D1\u8DEF\u5F84\uFF0C\u5982 /api",3,"ngModelChange","ngModel","name"],["nz-input","","placeholder","\u8F6C\u53D1\u5730\u5740\uFF0C\u5982 http://192.168.1.18:8080",1,"mono-input",3,"ngModelChange","ngModel","name"],["nz-checkbox","",3,"ngModelChange","ngModel","name"],["nzHasFeedback","","nzErrorTip","\u8BF7\u586B\u5199 SSL \u8BC1\u4E66\u8DEF\u5F84"],["nz-input","","name","sslCert","placeholder","/etc/nginx/ssl/cert.pem",1,"mono-input",3,"ngModelChange","ngModel"],["nzHasFeedback","","nzErrorTip","\u8BF7\u586B\u5199 SSL \u79C1\u94A5\u8DEF\u5F84"],["nz-input","","name","sslKey","placeholder","/etc/nginx/ssl/key.pem",1,"mono-input",3,"ngModelChange","ngModel"],[1,"config-preview"]],template:function(e,n){e&1&&(a(0,"nz-drawer",0),p("nzOnClose",function(){return n.onClose()}),O(1,No,62,14,"ng-container",1),s(),a(2,"nz-modal",2),p("nzOnCancel",function(){return n.previewVisible.set(!1)}),O(3,To,3,1,"ng-container",3),s()),e&2&&(u("nzVisible",n.visible)("nzPlacement","right")("nzWidth",520)("nzTitle",n.drawerTitle)("nzClosable",!0)("nzMaskClosable",!0),l(2),u("nzVisible",n.previewVisible())("nzFooter",null))},dependencies:[E,q,Ke,Q,j,He,H,qe,U,W,B,A,Ue,We,Ae,tt,je,$e,Xe,Ze,et,Je,k,R,ae,re,Yn,Xt,Be,Re,Ve,Ln,On,kn,he,ge,fe,xe,Qe,Ye,wt,St],styles:['[_nghost-%COMP%]{display:block}.drawer-body[_ngcontent-%COMP%]{padding:0 24px 16px}.mono-textarea[_ngcontent-%COMP%]{resize:none}.domain-row-wrapper[_ngcontent-%COMP%], .root-row-wrapper[_ngcontent-%COMP%]{display:flex;width:100%}.domain-row-protocol[_ngcontent-%COMP%]{width:90px;flex:0 0 90px}.domain-row-domain[_ngcontent-%COMP%]{flex:1 1 auto;min-width:0;margin-left:-1px}.domain-row-listen[_ngcontent-%COMP%]{width:110px;flex:0 0 110px;margin-left:-1px}.root-row-root[_ngcontent-%COMP%]{flex:1 1 auto;min-width:0}.root-row-index[_ngcontent-%COMP%]{width:140px;flex:0 0 140px;margin-left:-1px}.field-hint[_ngcontent-%COMP%]{margin-top:4px;font-size:12px;opacity:.7}.scenario-panel[_ngcontent-%COMP%]{margin-top:10px;display:flex;gap:8px}.scenario-index[_ngcontent-%COMP%]{width:140px}.local-ip-line[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;margin-top:8px}.checkbox-line[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:#000000bf}.api-proxy-list[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:8px}.api-proxy-item[_ngcontent-%COMP%]{border:1px solid rgba(0,0,0,.08);border-radius:8px;padding:10px;background:#fafafa}.api-proxy-item-head[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px;font-size:12px;color:#000000a6}.api-proxy-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:90px 1fr auto;align-items:center;gap:8px}.add-api-proxy-btn[_ngcontent-%COMP%]{margin-top:4px}.drawer-footer[_ngcontent-%COMP%]{position:absolute;bottom:0;left:0;right:0;padding:12px 24px;border-top:1px solid rgba(0,0,0,.06);display:flex;justify-content:flex-end;gap:8px;background:#fff}.config-preview[_ngcontent-%COMP%]{margin:0;padding:12px;border-radius:6px;border:1px solid rgba(0,0,0,.08);background:#fafafa;max-height:520px;overflow:auto;white-space:pre-wrap;word-break:break-word;font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace);font-size:12px;line-height:1.6}@media (max-width: 640px){.domain-row-wrapper[_ngcontent-%COMP%], .root-row-wrapper[_ngcontent-%COMP%]{flex-wrap:wrap;gap:8px}.domain-row-protocol[_ngcontent-%COMP%], .domain-row-domain[_ngcontent-%COMP%], .domain-row-listen[_ngcontent-%COMP%], .root-row-root[_ngcontent-%COMP%], .root-row-index[_ngcontent-%COMP%]{width:100%;flex:1 1 100%;margin-left:0}}.diff-modal-container[_ngcontent-%COMP%]{padding:8px 0}.diff-summary[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;margin-bottom:16px;padding:12px 16px;background:#f6ffed;border:1px solid #b7eb8f;border-radius:6px;color:#52c41a;font-size:14px}.diff-summary[_ngcontent-%COMP%] .anticon[_ngcontent-%COMP%]{font-size:16px}.diff-table[_ngcontent-%COMP%]{width:100%;border-collapse:collapse;font-size:13px;border-radius:6px;overflow:hidden}.diff-table[_ngcontent-%COMP%] .diff-th[_ngcontent-%COMP%]{padding:10px 12px;background:#fafafa;border-bottom:1px solid #f0f0f0;text-align:left;font-weight:600}.diff-table[_ngcontent-%COMP%] .diff-th-before[_ngcontent-%COMP%], .diff-table[_ngcontent-%COMP%] .diff-th-after[_ngcontent-%COMP%]{width:260px}.diff-table[_ngcontent-%COMP%] .diff-value-badge[_ngcontent-%COMP%]{display:inline-block;padding:2px 8px;border-radius:4px;font-size:12px;font-weight:500}.diff-table[_ngcontent-%COMP%] .diff-badge-before[_ngcontent-%COMP%]{background:#fff1f0;color:#ff4d4f}.diff-table[_ngcontent-%COMP%] .diff-badge-after[_ngcontent-%COMP%]{background:#f6ffed;color:#52c41a}.diff-table[_ngcontent-%COMP%] .diff-field-label[_ngcontent-%COMP%]{padding:10px 12px;border-bottom:1px solid #f0f0f0;font-weight:500;color:#000000d9;vertical-align:top}.diff-table[_ngcontent-%COMP%] .diff-field-value[_ngcontent-%COMP%]{padding:10px 12px;border-bottom:1px solid #f0f0f0;word-break:break-all;max-width:260px;vertical-align:top;line-height:1.6}.diff-table[_ngcontent-%COMP%] .diff-field-value.diff-before-value[_ngcontent-%COMP%]{color:#000000a6}.diff-table[_ngcontent-%COMP%] .diff-field-value.diff-after-value[_ngcontent-%COMP%]{color:#262626}.diff-table[_ngcontent-%COMP%] .diff-field-value.diff-empty[_ngcontent-%COMP%]{color:#00000040;font-style:italic}.diff-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child .diff-field-label[_ngcontent-%COMP%], .diff-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child .diff-field-value[_ngcontent-%COMP%]{border-bottom:none}.diff-hidden-hint[_ngcontent-%COMP%]{display:flex;align-items:center;gap:6px;margin-top:12px;color:#00000073;font-size:13px}.diff-hidden-hint[_ngcontent-%COMP%] .anticon[_ngcontent-%COMP%]{font-size:14px}']})};var Po=()=>[],Do=()=>({nzDanger:!0}),Zn=(r,t)=>t.id,Eo=(r,t)=>t.path+t.proxyPass;function Fo(r,t){if(r&1){let e=T();a(0,"div",43)(1,"span"),d(2),s(),a(3,"div",44)(4,"button",45),p("click",function(){f(e);let i=c(2);return h(i.undoLastAction())}),d(5,"\u64A4\u9500"),s(),a(6,"button",45),p("click",function(){f(e);let i=c(2);return h(i.dismissUndo())}),d(7,"\u5173\u95ED"),s()()()}if(r&2){let e=c(2);l(2),y(e.undoText())}}function ko(r,t){if(r&1){let e=T();a(0,"div",19)(1,"div",20)(2,"input",21),N("ngModelChange",function(i){f(e);let o=c();return M(o.keyword,i)||(o.keyword=i),h(i)}),s(),a(3,"nz-select",22),N("ngModelChange",function(i){f(e);let o=c();return M(o.sortField,i)||(o.sortField=i),h(i)}),x(4,"nz-option",23)(5,"nz-option",24)(6,"nz-option",25)(7,"nz-option",26),s(),a(8,"nz-select",27),N("ngModelChange",function(i){f(e);let o=c();return M(o.sortOrder,i)||(o.sortOrder=i),h(i)}),x(9,"nz-option",28)(10,"nz-option",29),s(),a(11,"nz-select",30),N("ngModelChange",function(i){f(e);let o=c();return M(o.runtimeFilter,i)||(o.runtimeFilter=i),h(i)}),x(12,"nz-option",31)(13,"nz-option",32)(14,"nz-option",33)(15,"nz-option",34)(16,"nz-option",35),s()(),a(17,"div",36)(18,"span",37),d(19),s(),a(20,"button",38),p("click",function(){f(e);let i=c();return h(i.bulkSetEnabled(!0))}),d(21," \u6279\u91CF\u542F\u7528 "),s(),a(22,"button",38),p("click",function(){f(e);let i=c();return h(i.bulkSetEnabled(!1))}),d(23," \u6279\u91CF\u7981\u7528 "),s(),a(24,"button",38),p("click",function(){f(e);let i=c();return h(i.clearSelection())}),d(25," \u6E05\u7A7A\u9009\u62E9 "),s(),a(26,"button",39),p("click",function(){f(e);let i=c();return h(i.importServer())}),x(27,"nz-icon",40),d(28," \u5BFC\u5165 "),s(),a(29,"button",41),p("click",function(){f(e);let i=c();return h(i.openDrawer(null))}),x(30,"nz-icon",42),d(31," \u65B0\u589E Server "),s()()(),v(32,Fo,8,1,"div",43)}if(r&2){let e=c();l(2),z("ngModel",e.keyword),l(),z("ngModel",e.sortField),l(5),z("ngModel",e.sortOrder),l(3),z("ngModel",e.runtimeFilter),l(8),J("\u5DF2\u9009 ",e.selectedCount," \u9879"),l(),u("disabled",!e.selectedCount),l(2),u("disabled",!e.selectedCount),l(2),u("disabled",!e.selectedCount),l(8),b(e.undoVisible()?32:-1)}}function Oo(r,t){r&1&&(a(0,"div",46)(1,"div",3),x(2,"div",47),s(),a(3,"div",5),x(4,"div",48),s(),a(5,"div",6),x(6,"div",49),s(),a(7,"div",7),x(8,"div",50),s(),a(9,"div",8),x(10,"div",50),s(),a(11,"div",9),x(12,"div",50),s(),a(13,"div",10),x(14,"div",50),s(),a(15,"div",11),x(16,"div",50),s(),a(17,"div",12),x(18,"div",51),s()())}function Lo(r,t){if(r&1&&L(0,Oo,19,0,"div",46,Ne),r&2){let e=c();I(e.skeletonRows)}}function Io(r,t){if(r&1){let e=T();a(0,"button",41),p("click",function(){f(e);let i=c(2);return h(i.openDrawer(null))}),d(1,"\u7ACB\u5373\u521B\u5EFA"),s()}}function Vo(r,t){if(r&1&&(a(0,"div",14),x(1,"nz-icon",52),a(2,"p"),d(3),s(),v(4,Io,2,0,"button",53),s()),r&2){let e=c();l(3),y(e.keyword.trim()?"\u672A\u5339\u914D\u5230 Server":"\u6682\u65E0 Server \u914D\u7F6E"),l(),b(e.keyword.trim()?-1:4)}}function Ro(r,t){if(r&1&&(a(0,"span",71),d(1),s()),r&2){let e=c().$implicit;l(),J(":",e," ssl")}}function Bo(r,t){if(r&1&&(a(0,"span",72),d(1),s()),r&2){let e=c().$implicit;l(),J(":",e)}}function Ao(r,t){if(r&1&&v(0,Ro,2,1,"span",71)(1,Bo,2,1,"span",72),r&2){let e=t.$implicit,n=c().$implicit;b(e==="443"||n.ssl?0:1)}}function Wo(r,t){if(r&1&&(a(0,"a",73),d(1),s()),r&2){let e=t.$implicit;u("href",e,Rt),l(),J(" ",e," ")}}function Uo(r,t){if(r&1&&(a(0,"div",62),L(1,Wo,2,2,"a",73,Ne),s()),r&2){let e=c().$implicit,n=c(2);l(),I(n.getAccessUrls(e))}}function $o(r,t){r&1&&(a(0,"span",61),d(1,"\u2014"),s())}function jo(r,t){if(r&1&&(a(0,"a",74)(1,"span",75),d(2),s(),a(3,"span",76),d(4,"\u2192"),s(),a(5,"span"),d(6),s()()),r&2){let e=t.$implicit;u("href",e.proxyPass,Rt),l(2),y(e.path),l(4),y(e.proxyPass)}}function Ho(r,t){if(r&1&&(a(0,"div",63),L(1,jo,7,3,"a",74,Eo),s()),r&2){let e=c().$implicit,n=c(2);l(),I(n.getProxyTargets(e))}}function qo(r,t){r&1&&(a(0,"span",61),d(1,"\u2014"),s())}function Ko(r,t){if(r&1){let e=T();a(0,"div",55)(1,"div",3)(2,"label",56),p("ngModelChange",function(i){let o=f(e).$implicit,m=c(2);return h(m.toggleSelectOne(o.id,i))}),s()(),a(3,"div",5)(4,"nz-switch",57),p("ngModelChange",function(i){let o=f(e).$implicit,m=c(2);return h(m.toggleServer(o.id,i))}),s()(),a(5,"div",6)(6,"div",58),x(7,"nz-icon",59),a(8,"span",60),d(9),s()()(),a(10,"div",7),L(11,Ao,2,1,null,null,pe),s(),a(13,"div",8)(14,"span",61),d(15),s()(),a(16,"div",9),v(17,Uo,3,0,"div",62)(18,$o,2,0,"span",61),s(),a(19,"div",10),v(20,Ho,3,0,"div",63)(21,qo,2,0,"span",61),s(),a(22,"div",11)(23,"span",64),d(24),s()(),a(25,"div",12)(26,"div",65)(27,"button",66),p("click",function(){let i=f(e).$implicit,o=c(2);return h(o.openDrawer(i))}),x(28,"nz-icon",67),s(),a(29,"button",66),p("click",function(){let i=f(e).$implicit,o=c(2);return h(o.copyServer(i))}),x(30,"nz-icon",68),s(),a(31,"button",69),p("nzOnConfirm",function(){let i=f(e).$implicit,o=c(2);return h(o.deleteServer(i))}),x(32,"nz-icon",70),s()()()()}if(r&2){let e=t.$implicit,n=c(2);F("disabled-row",!e.enabled),l(2),u("ngModel",n.selectedServerIds().has(e.id)),l(2),u("ngModel",e.enabled),l(5),y(e.name),l(2),I(e.listen),l(4),y((e.domains||Te(12,Po)).join(", ")||"\u2014"),l(2),b(n.getAccessUrls(e).length?17:18),l(3),b(n.getProxyTargets(e).length?20:21),l(3),u("title",e.root||""),l(),y(e.root||"\u2014"),l(7),u("nzPopconfirmTitle","\u5220\u9664\u540E\u65E0\u6CD5\u6062\u590D\uFF0C\u786E\u8BA4\u5220\u9664"+e.name+"\u5417\uFF1F")("nzOkButtonProps",Te(13,Do))}}function Qo(r,t){if(r&1&&L(0,Ko,33,14,"div",54,Zn),r&2){let e=c();I(e.renderedServers())}}function Yo(r,t){if(r&1&&(te(0),a(1,"pre",77),d(2),s(),ne()),r&2){let e=c();l(2),y(e.viewingConfig())}}function Go(r,t){r&1&&(a(0,"div",83),d(1,"\u6B63\u5728\u89E3\u6790\u914D\u7F6E..."),s())}function Zo(r,t){if(r&1){let e=T();a(0,"button",99),p("click",function(){f(e);let i=c().$implicit,o=c(3).$implicit,m=c(3);return h(m.focusImportField(o.id,i.field))}),d(1),s()}if(r&2){let e=c().$implicit;F("error",e.level==="error")("warning",e.level==="warning"),l(),J(" ",e.message," ")}}function Xo(r,t){if(r&1&&(a(0,"div",100),d(1),s()),r&2){let e=c().$implicit;F("error",e.level==="error")("warning",e.level==="warning"),l(),J(" ",e.message," ")}}function Jo(r,t){if(r&1&&v(0,Zo,2,5,"button",97)(1,Xo,2,5,"div",98),r&2){let e=t.$implicit;b(e.field?0:1)}}function er(r,t){if(r&1&&(a(0,"div",96),L(1,Jo,2,1,null,null,pe),s()),r&2){let e=c(2).$implicit,n=c(3);l(),I(n.getImportCandidateIssues(e))}}function tr(r,t){if(r&1){let e=T();a(0,"div",88)(1,"div",89)(2,"div",90)(3,"span",91),d(4,"\u540D\u79F0"),s(),a(5,"input",92),p("ngModelChange",function(i){f(e);let o=c().$implicit,m=c(3);return h(m.updateImportCandidateName(o.id,i))}),s()(),a(6,"div",90)(7,"span",91),d(8,"\u57DF\u540D"),s(),a(9,"input",93),p("ngModelChange",function(i){f(e);let o=c().$implicit,m=c(3);return h(m.updateImportCandidateDomains(o.id,i))}),s()(),a(10,"div",90)(11,"span",91),d(12,"\u7AEF\u53E3"),s(),a(13,"input",94),p("ngModelChange",function(i){f(e);let o=c().$implicit,m=c(3);return h(m.updateImportCandidateListen(o.id,i))}),s()()(),a(14,"div",95),d(15),s(),v(16,er,3,0,"div",96),s()}if(r&2){let e=c().$implicit,n=c(3);l(5),u("ngModel",e.request.name),ye("data-import-id",e.id),l(4),u("ngModel",n.getImportCandidateDomainsText(e)),ye("data-import-id",e.id),l(4),u("ngModel",n.getImportCandidateListenText(e)),ye("data-import-id",e.id),l(2),mt(" ",e.request.protocol||"http"," | ",e.request.ssl?"SSL":"No SSL"," "),l(),b(n.getImportCandidateIssues(e).length?16:-1)}}function nr(r,t){if(r&1&&(a(0,"div",88)(1,"div",101),d(2,"\u65E0\u6548 server "),s(),a(3,"div",95),d(4),s()()),r&2){let e=c().$implicit;l(4),y(e.error)}}function ir(r,t){if(r&1){let e=T();a(0,"div",86)(1,"label",87),p("ngModelChange",function(i){let o=f(e).$implicit,m=c(3);return h(m.toggleSelectImport(o.id,i))}),s(),v(2,tr,17,9,"div",88)(3,nr,5,1,"div",88),s()}if(r&2){let e=t.$implicit,n=c(3);F("invalid",!e.request)("conflict",n.isImportCandidateBlocked(e)),l(),u("ngModel",e.selected)("nzDisabled",!e.request||n.isImportCandidateBlocked(e)),l(),b(e.request?2:3)}}function or(r,t){if(r&1){let e=T();a(0,"div",82)(1,"label",4),p("ngModelChange",function(i){f(e);let o=c(2);return h(o.toggleSelectAllImport(i))}),d(2," \u5168\u9009\u53EF\u5BFC\u5165\u9879 "),s(),a(3,"span"),d(4),s()(),v(5,Go,2,0,"div",83),a(6,"div",84),L(7,ir,4,7,"div",85,Zn),s()}if(r&2){let e=c(2);l(),u("ngModel",e.allImportSelectableSelected)("nzIndeterminate",e.someImportSelectableSelected),l(3),mn("\u5171 ",e.importTotalCount," \u9879\uFF0C\u53EF\u5BFC\u5165 ",e.importValidCount," \u9879\uFF0C\u5DF2\u9009\u62E9 ",e.importSelectedCount," \u9879"),l(),b(e.parsingImport()?5:-1),l(2),I(e.importCandidates())}}function rr(r,t){if(r&1){let e=T();te(0),a(1,"div",78)(2,"button",39),p("click",function(){f(e);let i=c();return h(i.readFromClipboard())}),d(3," \u4ECE\u526A\u8D34\u677F\u8BFB\u53D6 "),s(),a(4,"label",79)(5,"input",80),p("change",function(i){f(e);let o=c();return h(o.onImportFileChange(i))}),s(),a(6,"span"),d(7,"\u4ECE\u6587\u4EF6\u5BFC\u5165"),s()()(),a(8,"textarea",81),p("ngModelChange",function(i){f(e);let o=c();return h(o.onImportTextChange(i))}),s(),v(9,or,9,6),ne()}if(r&2){let e=c();l(8),u("ngModel",e.importText()),l(),b(e.importTotalCount?9:-1)}}var It=class r{showToolbar=!0;nginxRunning=null;openCreateToken=0;refreshToken=0;summaryChange=new me;serverListMutated=new me;nginxService=w(ee);message=w($);modal=w(Ie);servers=g([]);loading=g(!1);selectedServerIds=g(new Set);keywordSig=g("");runtimeFilterSig=g("all");sortFieldSig=g("name");sortOrderSig=g("asc");get keyword(){return this.keywordSig()}set keyword(t){this.keywordSig.set(String(t||""))}get runtimeFilter(){return this.runtimeFilterSig()}set runtimeFilter(t){this.runtimeFilterSig.set(t)}get sortField(){return this.sortFieldSig()}set sortField(t){this.sortFieldSig.set(t)}get sortOrder(){return this.sortOrderSig()}set sortOrder(t){this.sortOrderSig.set(t)}drawerVisible=!1;editingServer=g(null);duplicateSourceServer=g(null);drawerMode=g("create");configModalVisible=!1;viewingConfig=g("");importModalVisible=!1;importText=g("");importing=g(!1);parsingImport=g(!1);importCandidates=g([]);skeletonRows=[1,2,3,4,5];undoVisible=g(!1);undoText=g("");undoHandler=null;undoTimer=null;importParseTimer=null;importParseRequestSeq=0;importConflictTimer=null;importConflictSeq=0;mutationInProgress=!1;deferReloadAfterMutation=!1;renderedServers=K(()=>{let t=[...this.servers()],e=this.keywordSig().trim().toLowerCase();return(e?t.filter(o=>[o.name||"",...o.domains||[],...o.listen||[]].map(_=>String(_).toLowerCase()).some(_=>_.includes(e))):t).filter(o=>this.matchesRuntimeFilter(o)).sort((o,m)=>this.compareServers(o,m))});ngOnInit(){this.loadServers()}ngOnDestroy(){this.clearUndoState(),this.importParseTimer&&(clearTimeout(this.importParseTimer),this.importParseTimer=null),this.importConflictTimer&&(clearTimeout(this.importConflictTimer),this.importConflictTimer=null)}ngOnChanges(t){let e=t.openCreateToken;e&&!e.firstChange&&this.openDrawer(null);let n=t.refreshToken;n&&!n.firstChange&&this.loadServers()}async loadServers(){this.loading.set(!0);try{let t=await this.nginxService.getServers();if(t.servers){if(this.mutationInProgress){this.deferReloadAfterMutation=!0;return}this.servers.set(t.servers),this.reconcileSelection(t.servers),this.emitSummary(t.servers)}}catch(t){this.message.error("\u52A0\u8F7D\u5931\u8D25: "+t.message)}finally{this.loading.set(!1)}}openDrawer(t){this.duplicateSourceServer.set(null),this.editingServer.set(t),this.drawerMode.set(t?"edit":"create"),this.drawerVisible=!0}openCopyDrawer(t){this.editingServer.set(null),this.duplicateSourceServer.set(t),this.drawerMode.set("copy"),this.drawerVisible=!0}onDrawerVisibleChange(t){this.drawerVisible=t,t||(this.editingServer.set(null),this.duplicateSourceServer.set(null),this.drawerMode.set("create"))}onSaved(){this.loadServers(),this.serverListMutated.emit()}importServer(){this.importText.set(""),this.importCandidates.set([]),this.importModalVisible=!0}closeImportModal(){this.importModalVisible=!1}async readFromClipboard(){try{let t=await navigator.clipboard.readText();this.importText.set(String(t||"").trim()),this.scheduleRefreshImportCandidates(),this.message.success("\u5DF2\u8BFB\u53D6\u526A\u8D34\u677F\u5185\u5BB9")}catch{this.message.warning("\u8BFB\u53D6\u526A\u8D34\u677F\u5931\u8D25\uFF0C\u8BF7\u624B\u52A8\u7C98\u8D34")}}async onImportFileChange(t){let e=t.target,n=e.files?.[0];if(n)try{let i=await n.text();this.importText.set(String(i||"").trim()),this.scheduleRefreshImportCandidates(),this.message.success(`\u5DF2\u8F7D\u5165\u6587\u4EF6\uFF1A${n.name}`)}catch{this.message.error("\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25")}finally{e.value=""}}async submitImport(){this.importCandidates().length||await this.refreshImportCandidates(),await this.recalculateImportConflicts();let t=this.importCandidates().filter(o=>o.selected&&o.request);if(!t.length){this.message.warning("\u8BF7\u81F3\u5C11\u9009\u62E9\u4E00\u6761\u53EF\u5BFC\u5165\u9879");return}let e=t.filter(o=>this.isImportCandidateBlocked(o));if(e.length){this.message.warning(`\u6709 ${e.length} \u6761\u5B58\u5728\u51B2\u7A81\uFF0C\u8BF7\u5148\u4FEE\u590D\u540E\u518D\u5BFC\u5165`);let o=e[0],m=(o.issues||[]).find(_=>_.level==="error"&&_.field);m?.field&&this.focusImportField(o.id,m.field);return}this.importing.set(!0);let n=[],i=0;for(let o of t){let m=o.request;try{await this.nginxService.createServer(m),i+=1}catch(_){n.push(_?.message||`\u5BFC\u5165\u5931\u8D25\uFF08${m.name}\uFF09`)}}this.importing.set(!1),i>0&&(this.message.success(`\u5BFC\u5165\u6210\u529F ${i} \u9879`),await this.loadServers(),this.serverListMutated.emit()),n.length&&this.message.warning(`\u5BFC\u5165\u5F02\u5E38 ${n.length} \u9879\uFF1A${n[0]}`),i>0&&(this.importModalVisible=!1,this.importText.set(""),this.importCandidates.set([]))}onImportTextChange(t){this.importText.set(t),this.scheduleRefreshImportCandidates()}get importTotalCount(){return this.importCandidates().length}get importValidCount(){return this.importCandidates().filter(t=>!!t.request).length}get importSelectedCount(){return this.importCandidates().filter(t=>t.selected&&!!t.request).length}get allImportSelectableSelected(){let e=this.importCandidates().filter(n=>!!n.request);return e.length>0&&e.every(n=>n.selected)}get someImportSelectableSelected(){let e=this.importCandidates().filter(i=>!!i.request);if(!e.length)return!1;let n=e.filter(i=>i.selected).length;return n>0&&n<e.length}toggleSelectAllImport(t){this.importCandidates.update(e=>e.map(n=>n.request?D(S({},n),{selected:t}):n))}toggleSelectImport(t,e){this.importCandidates.update(n=>n.map(i=>i.id===t?D(S({},i),{selected:e}):i))}updateImportCandidateName(t,e){let n=String(e||"").trim();this.importCandidates.update(i=>i.map(o=>o.id!==t||!o.request?o:D(S({},o),{request:D(S({},o.request),{name:n})}))),this.scheduleRecalculateImportConflicts()}getImportCandidateDomainsText(t){return(t.request?.domains||[]).join(", ")}updateImportCandidateDomains(t,e){let n=this.normalizeTagInput(e,["127.0.0.1"]);this.importCandidates.update(i=>i.map(o=>o.id!==t||!o.request?o:D(S({},o),{request:D(S({},o.request),{domains:n})}))),this.scheduleRecalculateImportConflicts()}getImportCandidateListenText(t){return(t.request?.listen||[]).join(", ")}updateImportCandidateListen(t,e){let n=this.normalizeListenInput(e);this.importCandidates.update(i=>i.map(o=>o.id!==t||!o.request?o:D(S({},o),{request:D(S({},o.request),{listen:n})}))),this.scheduleRecalculateImportConflicts()}getImportCandidateIssues(t){return t.issues||[]}isImportCandidateBlocked(t){return t.request?(t.issues||[]).some(e=>e.level==="error"):!0}focusImportField(t,e){let n=`input[data-import-id="${t}"][data-field="${e}"]`;setTimeout(()=>{let i=document.querySelector(n);i&&(i.focus(),i.select(),i.scrollIntoView({behavior:"smooth",block:"center"}))},0)}scheduleRefreshImportCandidates(){this.importParseTimer&&(clearTimeout(this.importParseTimer),this.importParseTimer=null),this.importParseTimer=setTimeout(()=>{this.importParseTimer=null,this.refreshImportCandidates()},300)}async refreshImportCandidates(){let t=this.importText().trim();if(!t){this.importCandidates.set([]);return}let e=++this.importParseRequestSeq;this.parsingImport.set(!0);let n=[];try{let i=await this.nginxService.parseImportServers(t);Array.isArray(i.candidates)&&(n=i.candidates.map((o,m)=>({id:`candidate-${m}`,selected:!!o.request,request:o.request,error:o.error||(o.request?void 0:"\u89E3\u6790\u5931\u8D25\uFF1A\u672A\u8BC6\u522B\u4E3A\u6807\u51C6 server \u5757"),issues:[]})))}catch{n=[]}finally{e===this.importParseRequestSeq&&this.parsingImport.set(!1)}e===this.importParseRequestSeq&&(this.importCandidates.set(n),this.scheduleRecalculateImportConflicts())}async scheduleRecalculateImportConflicts(){this.importConflictTimer&&(clearTimeout(this.importConflictTimer),this.importConflictTimer=null),this.importConflictTimer=setTimeout(()=>{this.importConflictTimer=null,this.recalculateImportConflicts()},250)}async recalculateImportConflicts(){let t=++this.importConflictSeq,e=this.importCandidates().filter(n=>!!n.request);if(e.length)try{let n=e.map(o=>o.request),i=await this.nginxService.analyzeImportServers(n);if(t!==this.importConflictSeq)return;if(Array.isArray(i.candidates)&&i.candidates.length===n.length){let o=0;this.importCandidates.update(m=>m.map(_=>{if(!_.request)return _;let G=i.candidates[o++]?.issues||[];return D(S({},_),{issues:G,selected:G.some(de=>de.level==="error")?!1:_.selected})}));return}this.markImportConflictsUnavailable("\u51B2\u7A81\u5206\u6790\u7ED3\u679C\u4E0D\u5B8C\u6574\uFF0C\u5DF2\u963B\u6B62\u5BFC\u5165");return}catch{this.markImportConflictsUnavailable("\u51B2\u7A81\u5206\u6790\u670D\u52A1\u6682\u65F6\u4E0D\u53EF\u7528\uFF0C\u5DF2\u963B\u6B62\u5BFC\u5165");return}}markImportConflictsUnavailable(t){this.importCandidates.update(e=>e.map(n=>{if(!n.request)return n;let i=(n.issues||[]).filter(o=>o.message!=="\u51B2\u7A81\u5206\u6790\u4E0D\u53EF\u7528\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5");return D(S({},n),{selected:!1,issues:[...i,{level:"error",message:"\u51B2\u7A81\u5206\u6790\u4E0D\u53EF\u7528\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",field:"listen"}]})})),this.message.warning(t)}normalizeTagInput(t,e=[]){let n=String(t||"").split(/[,\s]+/).map(o=>o.trim()).filter(Boolean),i=Array.from(new Set(n));return i.length?i:[...e]}normalizeListenInput(t){let n=this.normalizeTagInput(t).map(o=>Number(o)).filter(o=>Number.isInteger(o)&&o>=1&&o<=65535).map(o=>String(o)),i=Array.from(new Set(n));return i.length?i:["8080"]}get selectedCount(){return this.selectedServerIds().size}get allVisibleSelected(){let t=this.renderedServers();if(!t.length)return!1;let e=this.selectedServerIds();return t.every(n=>e.has(n.id))}get someVisibleSelected(){let t=this.renderedServers();if(!t.length)return!1;let e=this.selectedServerIds(),n=t.filter(i=>e.has(i.id)).length;return n>0&&n<t.length}toggleSelectAllVisible(t){let e=new Set(this.selectedServerIds()),n=this.renderedServers().map(i=>i.id);t?n.forEach(i=>e.add(i)):n.forEach(i=>e.delete(i)),this.selectedServerIds.set(e)}toggleSelectOne(t,e){let n=new Set(this.selectedServerIds());e?n.add(t):n.delete(t),this.selectedServerIds.set(n)}clearSelection(){this.selectedServerIds.set(new Set)}async bulkSetEnabled(t){let e=Array.from(this.selectedServerIds());if(!e.length){this.message.warning("\u8BF7\u5148\u9009\u62E9\u8981\u64CD\u4F5C\u7684 Server");return}let n=this.servers();this.mutationInProgress=!0,this.deferReloadAfterMutation=!1,this.applyOptimisticEnabled(e,t);try{let i=[];await Promise.all(e.map(async o=>{try{t?await this.nginxService.enableServer(o):await this.nginxService.disableServer(o)}catch{i.push(o)}})),i.length?(this.rollbackEnabled(n,i),this.selectedServerIds.set(new Set(i)),this.message.warning(`${i.length} \u9879\u64CD\u4F5C\u5931\u8D25\uFF0C\u5DF2\u56DE\u6EDA`)):(this.message.success(t?"\u6279\u91CF\u542F\u7528\u6210\u529F\uFF0C\u8BF7\u70B9\u51FB\u201C\u91CD\u8F7D\u201D\u4F7F\u53D8\u66F4\u751F\u6548":"\u6279\u91CF\u7981\u7528\u6210\u529F\uFF0C\u8BF7\u70B9\u51FB\u201C\u91CD\u8F7D\u201D\u4F7F\u53D8\u66F4\u751F\u6548"),this.clearSelection())}finally{this.mutationInProgress=!1,this.deferReloadAfterMutation&&(this.deferReloadAfterMutation=!1)}}async toggleServer(t,e){let n=this.servers();this.mutationInProgress=!0,this.deferReloadAfterMutation=!1,this.applyOptimisticEnabled([t],e);try{e?await this.nginxService.enableServer(t):await this.nginxService.disableServer(t),this.message.success(e?"\u5DF2\u542F\u7528\uFF0C\u8BF7\u70B9\u51FB\u201C\u91CD\u8F7D\u201D\u4F7F\u53D8\u66F4\u751F\u6548":"\u5DF2\u7981\u7528\uFF0C\u8BF7\u70B9\u51FB\u201C\u91CD\u8F7D\u201D\u4F7F\u53D8\u66F4\u751F\u6548")}catch(i){this.rollbackEnabled(n,[t]),this.message.error("\u64CD\u4F5C\u5931\u8D25: "+i.message)}finally{this.mutationInProgress=!1,this.deferReloadAfterMutation&&(this.deferReloadAfterMutation=!1)}}copyServer(t){this.openCopyDrawer(t),this.message.info("\u590D\u5236 Server - \u8BF7\u4FEE\u6539\u540E\u4FDD\u5B58")}async deleteServer(t){if(this.shouldBlockDelete(t)){this.message.warning("\u8BE5 Server \u4ECD\u5728\u8FD0\u884C\u4E2D\uFF0C\u8BF7\u5148\u505C\u7528\u5E76\u91CD\u8F7D\u540E\u518D\u5220\u9664");return}try{let e=await this.nginxService.deleteServer(t.id);this.message.success("\u5DF2\u5220\u9664"),this.removeServerLocally(t.id);let n=String(e.snapshotId||"").trim();this.registerUndo("\u5DF2\u5220\u9664\uFF0C\u53EF\u64A4\u9500",async()=>{if(!n)throw await this.loadServers(),new Error("\u6062\u590D\u5FEB\u7167\u4E0D\u5B58\u5728\uFF0C\u8BF7\u5237\u65B0\u540E\u91CD\u8BD5");await this.nginxService.restoreDeletedServer(n),await this.loadServers(),this.message.success("\u5DF2\u6062\u590D\u5220\u9664\u9879")}),this.serverListMutated.emit()}catch(e){this.message.error("\u5220\u9664\u5931\u8D25: "+e.message)}}shouldBlockDelete(t){return!!(this.resolveRuntimeTone(t)==="running"||this.nginxRunning&&t.runtimeStatus==="pending")}getAccessUrls(t){return this.buildAccessUrls(t)}getProxyTargets(t){return(t.locations||[]).map(e=>({path:String(e.path||"/").trim()||"/",proxyPass:String(e.proxyPass||"").trim()})).filter(e=>!!e.proxyPass)}buildAccessUrls(t){let e=t.ssl?"https":"http",n=this.extractPorts(t.listen),i=this.extractHosts(t),o=n.length?n:[t.ssl?8443:8080];if(!i.length)return[];let m=new Set;return i.forEach(_=>{o.forEach(C=>{let G=this.buildUrl(e,_,C);G&&m.add(G)})}),Array.from(m.values())}emitSummary(t){this.summaryChange.emit({total:t.length,enabled:t.filter(e=>e.enabled).length})}reconcileSelection(t){let e=new Set(t.map(i=>i.id)),n=new Set;this.selectedServerIds().forEach(i=>{e.has(i)&&n.add(i)}),this.selectedServerIds.set(n)}compareServers(t,e){let n=0;return this.sortField==="enabled"?n=Number(t.enabled)-Number(e.enabled):this.sortField==="runtime"?n=this.getRuntimeRank(t)-this.getRuntimeRank(e):this.sortField==="ports"?n=this.getPrimaryPort(t)-this.getPrimaryPort(e):n=String(t.name||"").localeCompare(String(e.name||""),"zh-CN"),this.sortOrder==="asc"?n:-n}getPrimaryPort(t){return this.extractPorts(t.listen)[0]??0}matchesRuntimeFilter(t){return this.runtimeFilter==="all"?!0:this.resolveRuntimeTone(t)===this.runtimeFilter}getRuntimeRank(t){let e=this.resolveRuntimeTone(t);return e==="running"?3:e==="disabled"?2:e==="pending"?1:e==="stopped"?0:-1}resolveRuntimeTone(t){let e=t.runtimeStatus;return e==="running"||e==="stopped"||e==="disabled"||e==="pending"||e==="unknown"?e:this.nginxRunning===null?"unknown":this.nginxRunning?t.enabled?"running":"disabled":"stopped"}applyOptimisticEnabled(t,e){let n=new Set(t),i=this.servers().map(o=>n.has(o.id)?D(S({},o),{enabled:e,runtimeStatus:this.resolveRuntimeStatusAfterToggle(o,e)}):o);this.servers.set(i),this.emitSummary(i)}rollbackEnabled(t,e){let n=new Map(t.map(m=>[m.id,m])),i=new Set(e),o=this.servers().map(m=>{if(!i.has(m.id))return m;let _=n.get(m.id);return _?D(S({},m),{enabled:_.enabled,runtimeStatus:_.runtimeStatus}):m});this.servers.set(o),this.emitSummary(o)}resolveRuntimeStatusAfterToggle(t,e){let n=t.runtimeStatus;return n==="pending"||n==="unknown"?n:this.nginxRunning?"pending":this.nginxRunning===null?"unknown":e?"stopped":"disabled"}async undoLastAction(){let t=this.undoHandler;if(t){this.clearUndoState();try{await t(),this.serverListMutated.emit()}catch(e){this.message.error(e?.message||"\u64A4\u9500\u5931\u8D25")}}}dismissUndo(){this.clearUndoState()}registerUndo(t,e){this.clearUndoState(),this.undoText.set(t),this.undoHandler=e,this.undoVisible.set(!0),this.undoTimer=setTimeout(()=>{this.clearUndoState()},5e3)}clearUndoState(){this.undoTimer&&(clearTimeout(this.undoTimer),this.undoTimer=null),this.undoHandler=null,this.undoVisible.set(!1),this.undoText.set("")}removeServerLocally(t){let e=this.servers().filter(i=>i.id!==t);this.servers.set(e),this.emitSummary(e);let n=new Set(this.selectedServerIds());n.delete(t),this.selectedServerIds.set(n)}extractPorts(t){let e=new Set;for(let n of t||[]){let i=this.parseListenPort(n);i!==null&&e.add(i)}return Array.from(e.values()).sort((n,i)=>n-i)}parseListenPort(t){let e=String(t||"").trim();if(!e||/^unix:/i.test(e))return null;let n=e.split(/\s+/)[0]||"",i=n;/^\[[^\]]+\]:\d+$/.test(n)?i=n.replace(/^.*\]:/,""):n.includes(":")&&(i=n.slice(n.lastIndexOf(":")+1));let o=Number(i);return!Number.isInteger(o)||o<1||o>65535?null:o}extractHosts(t){let e=new Set;for(let n of t.domains||[]){let i=String(n||"").trim();!i||i==="_"||i==="*"||e.add(i)}if(!e.size){let n=this.parseListenHost(t.listen?.[0]||"");n&&e.add(n)}return e.size||e.add("127.0.0.1"),Array.from(e.values())}parseListenHost(t){let e=String(t||"").trim();if(!e||/^unix:/i.test(e))return null;let n=e.split(/\s+/)[0]||"";if(/^\[[^\]]+\]:\d+$/.test(n)){let i=n.slice(1,n.indexOf("]")).trim();return this.normalizeHost(i)}if(n.includes(":")){let i=n.slice(0,n.lastIndexOf(":")).trim();return this.normalizeHost(i)}return null}normalizeHost(t){return!t||t==="*"||t==="0.0.0.0"||t==="::"||t==="[::]"?null:t}buildUrl(t,e,n){let i=this.normalizeHostForUrl(e);return i?`${t}://${i}${t==="http"&&n===80||t==="https"&&n===443?"":`:${n}`}`:""}normalizeHostForUrl(t){let e=String(t||"").trim();return e?e.includes(":")&&!e.startsWith("[")&&!e.endsWith("]")?`[${e}]`:e:""}static \u0275fac=function(e){return new(e||r)};static \u0275cmp=P({type:r,selectors:[["app-nginx-server-list"]],inputs:{showToolbar:"showToolbar",nginxRunning:"nginxRunning",openCreateToken:"openCreateToken",refreshToken:"refreshToken"},outputs:{summaryChange:"summaryChange",serverListMutated:"serverListMutated"},features:[Ee],decls:31,vars:14,consts:[[1,"server-list"],[1,"server-grid-shell"],[1,"server-grid-head"],[1,"cell","select-col"],["nz-checkbox","",3,"ngModelChange","ngModel","nzIndeterminate"],[1,"cell","status-col"],[1,"cell"],[1,"cell","listen-col"],[1,"cell","domain-col"],[1,"cell","access-col"],[1,"cell","proxy-col"],[1,"cell","root-col"],[1,"cell","action-col"],[1,"server-grid-body"],[1,"empty-state"],[3,"visibleChange","saved","visible","mode","editingServer","duplicateSourceServer"],["nzTitle","Server \u914D\u7F6E","nzWidth","800px",3,"nzVisibleChange","nzOnCancel","nzVisible","nzFooter"],[4,"nzModalContent"],["nzTitle","\u5BFC\u5165 Nginx Server","nzWidth","860px",3,"nzVisibleChange","nzOnOk","nzOnCancel","nzVisible","nzOkText","nzCancelText","nzOkLoading"],[1,"list-header"],[1,"header-left"],["nz-input","","placeholder","\u641C\u7D22\u540D\u79F0/\u57DF\u540D/\u7AEF\u53E3",1,"header-search",3,"ngModelChange","ngModel"],["nzPlaceHolder","\u6392\u5E8F\u5B57\u6BB5",1,"header-sort-field",3,"ngModelChange","ngModel"],["nzValue","name","nzLabel","\u6309\u540D\u79F0"],["nzValue","enabled","nzLabel","\u6309\u542F\u7528\u72B6\u6001"],["nzValue","ports","nzLabel","\u6309\u7AEF\u53E3"],["nzValue","runtime","nzLabel","\u6309\u8FD0\u884C\u6001"],["nzPlaceHolder","\u6392\u5E8F\u65B9\u5411",1,"header-sort-order",3,"ngModelChange","ngModel"],["nzValue","asc","nzLabel","\u5347\u5E8F"],["nzValue","desc","nzLabel","\u964D\u5E8F"],["nzPlaceHolder","\u8FD0\u884C\u6001\u7B5B\u9009",1,"header-runtime-filter",3,"ngModelChange","ngModel"],["nzValue","all","nzLabel","\u5168\u90E8\u72B6\u6001"],["nzValue","running","nzLabel","\u8FD0\u884C\u4E2D"],["nzValue","pending","nzLabel","\u5F85\u91CD\u8F7D"],["nzValue","stopped","nzLabel","\u5DF2\u505C\u6B62"],["nzValue","disabled","nzLabel","\u5DF2\u7981\u7528"],[1,"header-right"],[1,"selection-summary"],["nz-button","","nzType","default",3,"click","disabled"],["nz-button","","nzType","default",3,"click"],["nzType","upload","nzTheme","outline"],["nz-button","","nzType","primary",3,"click"],["nzType","plus","nzTheme","outline"],[1,"undo-banner"],[1,"undo-actions"],["nz-button","","nzType","link",3,"click"],[1,"server-grid-row","skeleton-row"],[1,"skeleton-block","skeleton-checkbox"],[1,"skeleton-block","skeleton-switch"],[1,"skeleton-block","skeleton-title"],[1,"skeleton-block"],[1,"skeleton-block","skeleton-actions"],["nzType","inbox","nzTheme","outline",1,"empty-icon"],["nz-button","","nzType","primary"],[1,"server-grid-row",3,"disabled-row"],[1,"server-grid-row"],["nz-checkbox","",3,"ngModelChange","ngModel"],["nzSize","small",3,"ngModelChange","ngModel"],[1,"server-name"],["nzType","file","nzTheme","outline",1,"conf-icon"],[1,"server-name-text"],[1,"server-domain"],[1,"access-links"],[1,"proxy-links"],[1,"server-root",3,"title"],[1,"row-actions"],["nz-button","","nzType","link","nzSize","small",3,"click"],["nzType","edit","nzTheme","outline"],["nzType","copy","nzTheme","outline"],["nz-button","","nzDanger","","nzType","link","nzSize","small","nz-popconfirm","","nzPopconfirmOkText","\u5220\u9664","nzPopconfirmCancelText","\u53D6\u6D88",3,"nzOnConfirm","nzPopconfirmTitle","nzOkButtonProps"],["nzType","delete","nzTheme","outline"],[1,"server-listen","ssl"],[1,"server-listen"],["target","_blank","rel","noopener noreferrer",1,"access-link",3,"href"],["target","_blank","rel","noopener noreferrer",1,"proxy-link",3,"href"],[1,"proxy-path"],[1,"proxy-arrow"],[1,"config-preview"],[1,"import-toolbar"],[1,"import-file-label"],["type","file","accept",".conf,.txt",3,"change"],["nz-input","","rows","18","placeholder","\u7C98\u8D34\u5305\u542B server { ... } \u7684 nginx \u914D\u7F6E\uFF0C\u53EF\u5305\u542B\u591A\u4E2A server ",1,"import-editor",3,"ngModelChange","ngModel"],[1,"import-preview-head"],[1,"import-parsing-hint"],[1,"import-preview-list"],[1,"import-preview-item",3,"invalid","conflict"],[1,"import-preview-item"],["nz-checkbox","",3,"ngModelChange","ngModel","nzDisabled"],[1,"import-preview-meta"],[1,"import-edit-grid"],[1,"field"],[1,"field-label"],["nz-input","","data-field","name","placeholder","server \u540D\u79F0",3,"ngModelChange","ngModel"],["nz-input","","data-field","domains","placeholder","\u5982: example.com, localhost",3,"ngModelChange","ngModel"],["nz-input","","data-field","listen","placeholder","\u5982: 8080, 8443",3,"ngModelChange","ngModel"],[1,"sub"],[1,"issue-list"],["type","button",1,"issue-item","issue-link",3,"error","warning"],[1,"issue-item",3,"error","warning"],["type","button",1,"issue-item","issue-link",3,"click"],[1,"issue-item"],[1,"name"]],template:function(e,n){e&1&&(a(0,"div",0),v(1,ko,33,9),a(2,"div",1)(3,"div",2)(4,"div",3)(5,"label",4),p("ngModelChange",function(o){return n.toggleSelectAllVisible(o)}),s()(),a(6,"div",5),d(7,"\u72B6\u6001"),s(),a(8,"div",6),d(9,"Server \u540D\u79F0"),s(),a(10,"div",7),d(11,"\u76D1\u542C\u7AEF\u53E3"),s(),a(12,"div",8),d(13,"\u57DF\u540D"),s(),a(14,"div",9),d(15,"\u8BBF\u95EE\u5730\u5740"),s(),a(16,"div",10),d(17,"\u8F6C\u53D1\u5730\u5740"),s(),a(18,"div",11),d(19,"\u6839\u76EE\u5F55"),s(),a(20,"div",12),d(21,"\u64CD\u4F5C"),s()(),a(22,"div",13),v(23,Lo,2,0)(24,Vo,5,2,"div",14)(25,Qo,2,0),s()()(),a(26,"app-nginx-server-drawer",15),p("visibleChange",function(o){return n.onDrawerVisibleChange(o)})("saved",function(){return n.onSaved()}),s(),a(27,"nz-modal",16),N("nzVisibleChange",function(o){return M(n.configModalVisible,o)||(n.configModalVisible=o),o}),p("nzOnCancel",function(){return n.configModalVisible=!1}),O(28,Yo,3,1,"ng-container",17),s(),a(29,"nz-modal",18),N("nzVisibleChange",function(o){return M(n.importModalVisible,o)||(n.importModalVisible=o),o}),p("nzOnOk",function(){return n.submitImport()})("nzOnCancel",function(){return n.closeImportModal()}),O(30,rr,10,2,"ng-container",17),s()),e&2&&(l(),b(n.showToolbar?1:-1),l(4),u("ngModel",n.allVisibleSelected)("nzIndeterminate",n.someVisibleSelected),l(18),b(n.loading()?23:n.renderedServers().length?25:24),l(3),u("visible",n.drawerVisible)("mode",n.drawerMode())("editingServer",n.editingServer())("duplicateSourceServer",n.duplicateSourceServer()),l(),z("nzVisible",n.configModalVisible),u("nzFooter",null),l(2),z("nzVisible",n.importModalVisible),u("nzOkText","\u89E3\u6790\u5E76\u5BFC\u5165")("nzCancelText","\u53D6\u6D88")("nzOkLoading",n.importing()))},dependencies:[E,q,Q,j,H,U,W,B,A,wt,St,k,R,ae,re,Be,Re,Ve,he,ge,fe,we,Qe,xe,ze,Ye,yt,Lt],styles:['.server-list[_ngcontent-%COMP%] .list-header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px 16px}.server-list[_ngcontent-%COMP%] .list-header[_ngcontent-%COMP%] .header-left[_ngcontent-%COMP%]{display:flex;align-items:center;flex-wrap:wrap;gap:8px}.server-list[_ngcontent-%COMP%] .list-header[_ngcontent-%COMP%] .header-right[_ngcontent-%COMP%]{display:flex;align-items:center;flex-wrap:wrap;justify-content:flex-end;gap:8px}.header-search[_ngcontent-%COMP%]{width:240px}.header-sort-field[_ngcontent-%COMP%], .header-sort-order[_ngcontent-%COMP%]{width:130px}.header-runtime-filter[_ngcontent-%COMP%]{width:140px}.selection-summary[_ngcontent-%COMP%]{font-size:12px;color:#0000008c}.undo-banner[_ngcontent-%COMP%]{margin-bottom:10px;padding:8px 12px;border-radius:8px;background:#fffbe6;border:1px solid #ffe58f;display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:12px}.undo-actions[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:4px}.server-grid-shell[_ngcontent-%COMP%]{border:none;border-radius:0;overflow:hidden}.server-grid-head[_ngcontent-%COMP%], .server-grid-row[_ngcontent-%COMP%]{display:grid;grid-template-columns:42px 72px minmax(200px,1.2fr) minmax(130px,.8fr) minmax(150px,1fr) minmax(220px,1.2fr) minmax(220px,1.2fr) minmax(180px,1fr) 120px;align-items:center;column-gap:8px;padding:0 12px}.skeleton-row[_ngcontent-%COMP%] .skeleton-block[_ngcontent-%COMP%]{height:12px;border-radius:6px;background:linear-gradient(90deg,#f2f2f2 25%,#e8e8e8 37%,#f2f2f2 63%);background-size:400% 100%;animation:_ngcontent-%COMP%_nginx-skeleton-shimmer 1.4s ease infinite}.skeleton-row[_ngcontent-%COMP%] .skeleton-checkbox[_ngcontent-%COMP%]{width:14px;height:14px}.skeleton-row[_ngcontent-%COMP%] .skeleton-switch[_ngcontent-%COMP%]{width:28px}.skeleton-row[_ngcontent-%COMP%] .skeleton-title[_ngcontent-%COMP%]{width:70%;height:14px}.skeleton-row[_ngcontent-%COMP%] .skeleton-actions[_ngcontent-%COMP%]{width:58px}.server-grid-head[_ngcontent-%COMP%]{min-height:42px;background:#fafafa;border-bottom:1px solid rgba(0,0,0,.06)}.server-grid-head[_ngcontent-%COMP%] .cell[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);color:#00000073;text-transform:uppercase;letter-spacing:.4px;font-weight:700}.server-grid-body[_ngcontent-%COMP%]{background:#fff}.server-grid-row[_ngcontent-%COMP%]{min-height:56px;border-bottom:1px solid rgba(0,0,0,.05);transition:background .12s ease}.server-grid-row[_ngcontent-%COMP%]:last-child{border-bottom:none}.server-grid-row[_ngcontent-%COMP%]:hover{background:#00000005}.cell[_ngcontent-%COMP%]{min-width:0}.select-col[_ngcontent-%COMP%]{justify-self:center}.action-col[_ngcontent-%COMP%]{justify-self:end}.server-name-text[_ngcontent-%COMP%]{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.server-name[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;font-weight:500;font-size:var(--nginx-font-size-base, 14px)}.conf-icon[_ngcontent-%COMP%]{color:#00000059;flex-shrink:0}.server-listen[_ngcontent-%COMP%]{font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace);font-size:var(--nginx-font-size-sm, 12px);color:#e5a832;background:#e5a8321f;padding:2px 8px;border-radius:4px;margin-right:4px}.server-listen.ssl[_ngcontent-%COMP%]{color:#5ea6f7;background:#5ea6f71f}.server-domain[_ngcontent-%COMP%]{font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace);font-size:var(--nginx-font-size-sm, 12px);color:#0000008c}.server-root[_ngcontent-%COMP%]{font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace);font-size:var(--nginx-font-size-sm, 12px);color:#0006;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block}.access-link[_ngcontent-%COMP%], .proxy-link[_ngcontent-%COMP%]{font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace);font-size:var(--nginx-font-size-sm, 12px);color:var(--blue);text-decoration:none;display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.access-link[_ngcontent-%COMP%]:hover, .proxy-link[_ngcontent-%COMP%]:hover{text-decoration:underline}.access-links[_ngcontent-%COMP%], .proxy-links[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:2px}.row-actions[_ngcontent-%COMP%]{display:flex;gap:4px;justify-content:flex-end}.empty-state[_ngcontent-%COMP%]{text-align:center;padding:48px 0}.empty-state[_ngcontent-%COMP%] .empty-icon[_ngcontent-%COMP%]{font-size:48px;color:#0003;margin-bottom:16px}.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:#0006;margin:0 0 12px}@keyframes _ngcontent-%COMP%_nginx-skeleton-shimmer{0%{background-position:100% 50%}to{background-position:0 50%}}@media (max-width: 1100px){.server-list[_ngcontent-%COMP%] .list-header[_ngcontent-%COMP%]{flex-direction:column;align-items:stretch}.server-list[_ngcontent-%COMP%] .header-right[_ngcontent-%COMP%]{justify-content:flex-start}.header-search[_ngcontent-%COMP%], .header-sort-field[_ngcontent-%COMP%], .header-sort-order[_ngcontent-%COMP%], .header-runtime-filter[_ngcontent-%COMP%]{width:100%}.server-grid-head[_ngcontent-%COMP%]{display:none}.server-grid-row[_ngcontent-%COMP%]{grid-template-columns:1fr;gap:8px;padding:12px;align-items:stretch}.status-col[_ngcontent-%COMP%], .select-col[_ngcontent-%COMP%], .listen-col[_ngcontent-%COMP%], .domain-col[_ngcontent-%COMP%], .access-col[_ngcontent-%COMP%], .proxy-col[_ngcontent-%COMP%], .root-col[_ngcontent-%COMP%], .action-col[_ngcontent-%COMP%]{justify-self:start}.action-col[_ngcontent-%COMP%]{width:100%}.row-actions[_ngcontent-%COMP%]{opacity:1}}.config-preview[_ngcontent-%COMP%]{background:#f6ffed;border:1px solid #b7eb8f;border-radius:4px;padding:16px;margin:0;font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace);font-size:var(--nginx-font-size-base, 14px);line-height:1.6;overflow-x:auto;white-space:pre-wrap}.import-toolbar[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;margin-bottom:10px}.import-file-label[_ngcontent-%COMP%]{position:relative;display:inline-flex;align-items:center;border:1px solid #d9d9d9;border-radius:6px;padding:4px 12px;cursor:pointer;-webkit-user-select:none;user-select:none}.import-file-label[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{position:absolute;inset:0;opacity:0;cursor:pointer}.import-editor[_ngcontent-%COMP%]{font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace);resize:vertical}.import-preview-head[_ngcontent-%COMP%]{margin-top:10px;display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:12px;color:#000000a6}.import-preview-list[_ngcontent-%COMP%]{margin-top:8px;max-height:180px;overflow:auto;border:1px solid rgba(0,0,0,.08);border-radius:8px;background:#fafafa}.import-preview-item[_ngcontent-%COMP%]{display:flex;align-items:flex-start;gap:8px;padding:8px 10px;border-bottom:1px solid rgba(0,0,0,.06)}.import-preview-item[_ngcontent-%COMP%]:last-child{border-bottom:none}.import-preview-item.invalid[_ngcontent-%COMP%]{background:#ff4d4f0d}.import-preview-item.conflict[_ngcontent-%COMP%]{border-left:3px solid #ff4d4f;background:#ff4d4f0f}.proxy-path[_ngcontent-%COMP%]{display:inline-block;min-width:48px;margin-right:6px;color:#0009}.proxy-arrow[_ngcontent-%COMP%]{margin-right:6px;color:#00000073}.import-parsing-hint[_ngcontent-%COMP%]{margin-top:6px;font-size:12px;color:#0000008c}.import-preview-meta[_ngcontent-%COMP%]{min-width:0}.import-preview-meta[_ngcontent-%COMP%] .name[_ngcontent-%COMP%]{font-size:13px;font-weight:600;color:#000000d9;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.import-preview-meta[_ngcontent-%COMP%] .sub[_ngcontent-%COMP%]{margin-top:2px;font-size:12px;color:#0000008c;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.import-edit-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(3,minmax(120px,1fr));gap:8px}.field[_ngcontent-%COMP%]{min-width:0}.field-label[_ngcontent-%COMP%]{display:inline-block;margin-bottom:4px;font-size:11px;color:#0000008c}.issue-list[_ngcontent-%COMP%]{margin-top:6px;display:flex;flex-direction:column;gap:4px}.issue-item[_ngcontent-%COMP%]{font-size:12px;line-height:1.4}.issue-item.error[_ngcontent-%COMP%]{color:#cf1322}.issue-item.warning[_ngcontent-%COMP%]{color:#ad6800}.issue-link[_ngcontent-%COMP%]{border:none;background:transparent;padding:0;text-align:left;cursor:pointer;text-decoration:underline}@media (max-width: 900px){.import-edit-grid[_ngcontent-%COMP%]{grid-template-columns:1fr}}']})};var Vt=class r{label="";value="-";sub="";toneClass="";static \u0275fac=function(e){return new(e||r)};static \u0275cmp=P({type:r,selectors:[["app-nginx-stat-card"]],inputs:{label:"label",value:"value",sub:"sub",toneClass:"toneClass"},decls:7,vars:4,consts:[[1,"stat-card"],[1,"stat-label"],[1,"stat-value",3,"ngClass"],[1,"stat-sub"]],template:function(e,n){e&1&&(a(0,"div",0)(1,"div",1),d(2),s(),a(3,"div",2),d(4),s(),a(5,"div",3),d(6),s()()),e&2&&(l(2),y(n.label),l(),u("ngClass",n.toneClass),l(),y(n.value),l(2),y(n.sub))},dependencies:[E,gt],styles:['[_nghost-%COMP%]{display:block}.stat-card[_ngcontent-%COMP%]{background:var(--bg-white);border:1px solid var(--border);border-radius:8px;padding:14px;box-shadow:var(--shadow-card);transition:all .14s ease}.stat-card[_ngcontent-%COMP%]:hover{box-shadow:var(--shadow-hover);transform:translateY(-1px)}.stat-label[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);color:var(--text-3);font-weight:600;text-transform:uppercase;letter-spacing:.5px;margin-bottom:6px}.stat-value[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-kpi, 22px);line-height:1.1;font-weight:800;color:var(--text-1);font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace);margin-bottom:4px}.stat-value.green[_ngcontent-%COMP%]{color:var(--green)}.stat-value.blue[_ngcontent-%COMP%]{color:var(--blue)}.stat-value.purple[_ngcontent-%COMP%]{color:var(--purple)}.stat-value.orange[_ngcontent-%COMP%]{color:var(--orange)}.stat-value.red[_ngcontent-%COMP%]{color:var(--red)}.stat-sub[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);color:var(--text-3);font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace)}']})};var ar=()=>({padding:"0"});function sr(r,t){if(r&1){let e=T();a(0,"span",6),x(1,"span",7),d(2),s(),a(3,"button",8),p("click",function(){f(e);let i=c();return h(i.refreshAll())}),x(4,"nz-icon",9),d(5," \u5237\u65B0 "),s(),a(6,"button",10),p("click",function(){f(e);let i=c();return h(i.switchSecondaryTab("settings"))}),x(7,"nz-icon",11),s()}if(r&2){let e,n,i=c();F("running",(e=i.status())==null?null:e.isRunning),l(2),mt(" ",((n=i.instance())==null?null:n.version)||"unknown"," \xB7 ",i.pidText," "),l(),u("nzLoading",i.configLoading())}}function lr(r,t){r&1&&(a(0,"nz-layout",3)(1,"nz-content",12),x(2,"nz-spin",13),s()())}function dr(r,t){if(r&1){let e=T();a(0,"button",15),p("click",function(){f(e);let i=c(2);return h(i.showBindModal())}),d(1,"\u7ED1\u5B9A Nginx"),s()}}function cr(r,t){if(r&1&&(a(0,"nz-layout",3)(1,"nz-content",12)(2,"nz-empty",14),O(3,dr,2,0,"ng-template",null,0,Se),s()()()),r&2){let e=oe(4);l(2),u("nzNotFoundContent","\u8BF7\u5148\u7ED1\u5B9A\u672C\u5730 Nginx \u5B9E\u4F8B")("nzNotFoundFooter",e)}}function mr(r,t){if(r&1&&(a(0,"div",38),x(1,"app-nginx-config-editor",50),s()),r&2){let e=c(2);l(),u("refreshToken",e.configEditorRefreshToken())}}function pr(r,t){r&1&&x(0,"app-nginx-secondary-upstream-tab")}function ur(r,t){r&1&&x(0,"app-nginx-secondary-ssl-tab")}function gr(r,t){r&1&&x(0,"app-nginx-secondary-traffic-tab")}function fr(r,t){r&1&&x(0,"app-nginx-secondary-perf-tab")}function hr(r,t){r&1&&x(0,"app-nginx-secondary-logs-tab")}function xr(r,t){if(r&1){let e=T();a(0,"app-nginx-secondary-test-tab",51),p("runTest",function(){f(e);let i=c(2);return h(i.testConfig())}),s()}if(r&2){let e=c(2);u("loading",e.loading())("logs",e.recentLogs())}}function _r(r,t){if(r&1){let e=T();a(0,"app-nginx-secondary-settings-tab",52),p("unbind",function(){f(e);let i=c(2);return h(i.unbind())}),s()}if(r&2){let e=c(2);u("instance",e.instance())("configFileCount",e.configFiles().length)}}function Cr(r,t){if(r&1){let e=T();a(0,"nz-layout",3)(1,"nz-content",16)(2,"div",17),x(3,"app-nginx-stat-card",18)(4,"app-nginx-stat-card",19)(5,"app-nginx-stat-card",20)(6,"app-nginx-stat-card",21),s(),a(7,"div",22)(8,"div",23)(9,"span",24),d(10,"\u670D\u52A1\u63A7\u5236"),s(),a(11,"button",25),p("click",function(){f(e);let i=c();return h(i.startNginx())}),x(12,"nz-icon",26),d(13," \u542F\u52A8 "),s(),a(14,"button",25),p("click",function(){f(e);let i=c();return h(i.stopNginx())}),x(15,"nz-icon",27),d(16," \u505C\u6B62 "),s(),a(17,"button",25),p("click",function(){f(e);let i=c();return h(i.reloadNginx())}),x(18,"nz-icon",9),d(19," \u91CD\u8F7D "),s(),a(20,"button",28),p("click",function(){f(e);let i=c();return h(i.testConfig())}),x(21,"nz-icon",29),d(22," \u68C0\u6D4B "),s()(),a(23,"span",30),d(24),s()(),a(25,"app-nginx-section-card",31)(26,"app-nginx-server-list",32),p("summaryChange",function(i){f(e);let o=c();return h(o.onServerSummaryChange(i))})("serverListMutated",function(){f(e);let i=c();return h(i.onServerListMutated())}),s()(),a(27,"app-nginx-section-card",33)(28,"button",34),p("click",function(){f(e);let i=c();return h(i.toggleConfigExpanded())}),a(29,"div",35)(30,"span",36),d(31,"\u914D\u7F6E\u6587\u4EF6"),s()(),x(32,"nz-icon",37),s(),v(33,mr,2,1,"div",38),s(),a(34,"app-nginx-section-card",39)(35,"nz-tabs",40),p("nzSelectedIndexChange",function(i){f(e);let o=c();return h(o.onSecondaryTabIndexChange(i))}),a(36,"nz-tab",41),v(37,pr,1,0,"app-nginx-secondary-upstream-tab"),s(),a(38,"nz-tab",42),v(39,ur,1,0,"app-nginx-secondary-ssl-tab"),s(),a(40,"nz-tab",43),v(41,gr,1,0,"app-nginx-secondary-traffic-tab"),s(),a(42,"nz-tab",44),v(43,fr,1,0,"app-nginx-secondary-perf-tab"),s(),a(44,"nz-tab",45),v(45,hr,1,0,"app-nginx-secondary-logs-tab"),s(),a(46,"nz-tab",46),v(47,xr,1,2,"app-nginx-secondary-test-tab",47),s(),a(48,"nz-tab",48),v(49,_r,1,2,"app-nginx-secondary-settings-tab",49),s()()()()()}if(r&2){let e,n,i,o,m,_,C=c();l(3),u("value",C.serviceStatusText)("toneClass",(e=C.status())!=null&&e.isRunning?"green":"red")("sub",C.pidText),l(),u("value",C.uptimeText)("sub",C.uptimeSubText),l(),u("value",C.activeConnectionText)("sub",C.activeConnectionSubText),l(),u("value",C.serverSummary().total)("sub",C.enabledServerText),l(5),u("disabled",C.controlling()||((n=C.status())==null?null:n.isRunning)),l(3),u("disabled",C.controlling()||!((i=C.status())!=null&&i.isRunning)),l(3),u("disabled",C.controlling()||!((o=C.status())!=null&&o.isRunning)),l(7),y(((m=C.instance())==null?null:m.path)||"-"),l(),u("showHeader",!0)("noBodyPadding",!0),l(),u("showToolbar",!0)("nginxRunning",((_=C.status())==null?null:_.isRunning)??null)("openCreateToken",C.openServerDrawerToken())("refreshToken",C.serverListRefreshToken()),l(),u("noBodyPadding",!0),l(),F("open",C.configExpanded()),l(5),b(C.configExpanded()?33:-1),l(),u("noBodyPadding",!0),l(),u("nzSelectedIndex",C.secondaryTabIndex()),l(2),b(C.secondaryTab()==="upstream"?37:-1),l(2),b(C.secondaryTab()==="ssl"?39:-1),l(2),b(C.secondaryTab()==="traffic"?41:-1),l(2),b(C.secondaryTab()==="perf"?43:-1),l(2),b(C.secondaryTab()==="logs"?45:-1),l(2),b(C.secondaryTab()==="test"?47:-1),l(2),b(C.secondaryTab()==="settings"?49:-1)}}function vr(r,t){if(r&1){let e=T();te(0),a(1,"div",53)(2,"div",54),x(3,"nz-icon",55),s(),a(4,"div",56),d(5,"\u7ED1\u5B9A\u672C\u5730 Nginx"),s(),a(6,"div",57),d(7," \u6307\u5B9A\u672C\u673A Nginx \u53EF\u6267\u884C\u6587\u4EF6\u8DEF\u5F84\uFF0C\u5B8C\u6210\u5B9E\u4F8B\u7ED1\u5B9A\u540E\u5373\u53EF\u4F7F\u7528\u53EF\u89C6\u5316\u7BA1\u7406\u529F\u80FD "),s(),a(8,"div",58)(9,"input",59),N("ngModelChange",function(i){f(e);let o=c();return M(o.bindPath,i)||(o.bindPath=i),h(i)}),p("keyup.enter",function(){f(e);let i=c();return h(i.bindNginx())}),s(),a(10,"button",28),p("click",function(){f(e);let i=c();return h(i.showPathHint())}),x(11,"nz-icon",60),d(12," \u6D4F\u89C8 "),s()(),a(13,"button",61),p("click",function(){f(e);let i=c();return h(i.bindNginx())}),x(14,"nz-icon",55),d(15," \u7ED1\u5B9A Nginx "),s()(),ne()}if(r&2){let e=c();l(9),z("ngModel",e.bindPath),l(4),u("nzLoading",e.binding())("disabled",!e.bindPath.trim())}}var Xn=class r{nginxService=w(ee);message=w($);modal=w(Ie);instance=g(null);status=g(null);loading=g(!1);binding=g(!1);statusReady=g(!1);controlling=g(!1);bindModalVisible=!1;bindPath="";secondaryTab=g("upstream");configExpanded=g(!1);openServerDrawerToken=g(0);serverListRefreshToken=g(0);configEditorRefreshToken=g(0);configLoading=g(!1);configFiles=g([]);serverSummary=g({total:0,enabled:0});recentLogs=g([]);runtimeDisplay=g("-");runtimeStartedAtLabel=g("-");runtimeBaseSeconds=null;runtimeBaseTimestamp=0;runtimeRafId=null;runtimeRenderBucket=null;secondaryTabs=[{id:"upstream",label:"Upstream \u7BA1\u7406"},{id:"ssl",label:"SSL \u8BC1\u4E66"},{id:"traffic",label:"\u6D41\u91CF\u63A7\u5236"},{id:"perf",label:"\u6027\u80FD\u4F18\u5316"},{id:"logs",label:"\u65E5\u5FD7"},{id:"test",label:"\u914D\u7F6E\u68C0\u6D4B"},{id:"settings",label:"\u8BBE\u7F6E"}];async ngOnInit(){this.hydrateFromCache(),await this.loadStatus(),await this.loadConfigFiles()}ngOnDestroy(){this.stopRuntimeTicker()}switchSecondaryTab(t){this.secondaryTab.set(t)}onSecondaryTabIndexChange(t){let e=this.secondaryTabs[t];e&&this.secondaryTab.set(e.id)}secondaryTabIndex(){let t=this.secondaryTabs.findIndex(e=>e.id===this.secondaryTab());return t>=0?t:0}toggleConfigExpanded(){this.configExpanded.update(t=>!t)}requestCreateServer(){this.openServerDrawerToken.update(t=>t+1)}importServer(){this.message.info("\u5BFC\u5165\u529F\u80FD\u5F00\u53D1\u4E2D")}onServerSummaryChange(t){this.serverSummary.set(t)}onServerListMutated(){this.loadConfigFiles(),this.configExpanded()&&this.configEditorRefreshToken.update(t=>t+1)}get serviceStatusText(){return this.status()?.isRunning?"\u8FD0\u884C\u4E2D":"\u5DF2\u505C\u6B62"}get uptimeText(){return this.status()?.isRunning&&(this.runtimeDisplay()||this.status()?.uptime)||"-"}get uptimeSubText(){if(!this.status()?.isRunning)return"\u670D\u52A1\u672A\u8FD0\u884C";let t=this.runtimeStartedAtLabel();return t&&t!=="-"?`\u5F00\u59CB\u65F6\u95F4 ${t}`:"\u5F00\u59CB\u65F6\u95F4\u672A\u77E5"}get pidText(){return this.status()?.pid?`PID ${this.status()?.pid}`:"\u672A\u68C0\u6D4B\u5230 PID"}get activeConnectionText(){let t=this.status()?.activeConnections;return Number.isFinite(t)?String(t):this.status()?.isRunning?"N/A":"-"}get activeConnectionSubText(){let t=this.status()?.activeConnections;return this.status()?.isRunning?Number.isFinite(t)?"ESTABLISHED TCP \u8FDE\u63A5\u6570":"\u5F53\u524D\u73AF\u5883\u6682\u4E0D\u53EF\u7528":"\u670D\u52A1\u672A\u8FD0\u884C"}get enabledServerText(){let t=this.serverSummary();return`${t.enabled} \u542F\u7528 / ${Math.max(t.total-t.enabled,0)} \u7981\u7528`}async refreshAll(){await Promise.all([this.loadStatus(),this.loadConfigFiles()]),this.message.success("\u72B6\u6001\u5DF2\u5237\u65B0")}async loadStatus(){this.loading.set(!0);try{let t=await this.nginxService.getStats();if(t.status){this.instance.set(t.instance||null),this.status.set(t.status),this.syncRuntimeState(t.status),t.serverSummary&&this.serverSummary.set({total:t.serverSummary.total,enabled:t.serverSummary.enabled});return}let e=await this.nginxService.getStatus();this.instance.set(e.instance),this.status.set(e.status),this.syncRuntimeState(e.status)}catch{}finally{this.statusReady.set(!0),this.loading.set(!1)}}async loadConfigFiles(){this.configLoading.set(!0);try{let t=await this.nginxService.getConfigFiles();this.configFiles.set(t.files||[])}catch{this.configFiles.set([])}finally{this.configLoading.set(!1)}}showBindModal(){this.bindPath=this.getBindPathCandidates()[0]||"",this.bindModalVisible=!0}showPathHint(){this.message.info("\u5F53\u524D\u7248\u672C\u8BF7\u624B\u52A8\u8F93\u5165\u8DEF\u5F84\uFF0C\u6587\u4EF6\u6D4F\u89C8\u9009\u62E9\u80FD\u529B\u540E\u7EED\u63A5\u5165")}autoDetectBindPath(){let t=this.getBindPathCandidates();if(!t.length){this.message.warning("\u672A\u8BC6\u522B\u5230\u53EF\u7528\u7684\u9ED8\u8BA4\u8DEF\u5F84\uFF0C\u8BF7\u624B\u52A8\u8F93\u5165");return}this.bindPath=t[0],this.message.success(`\u5DF2\u586B\u5145\u8DEF\u5F84\uFF1A${this.bindPath}`)}async bindNginx(){if(!this.bindPath.trim()){this.message.warning("\u8BF7\u8F93\u5165 Nginx \u8DEF\u5F84");return}this.binding.set(!0);try{let t=await this.nginxService.bind(this.bindPath.trim());t.instance&&(this.instance.set(t.instance),this.bindModalVisible=!1,this.message.success("\u7ED1\u5B9A\u6210\u529F"),await this.refreshAll())}catch(t){this.message.error("\u7ED1\u5B9A\u5931\u8D25: "+t.message)}finally{this.binding.set(!1)}}unbind(){this.modal.confirm({nzTitle:"\u786E\u8BA4\u89E3\u7ED1",nzContent:"\u89E3\u7ED1\u540E\u5C06\u65E0\u6CD5\u7BA1\u7406 Nginx\uFF0C\u662F\u5426\u7EE7\u7EED\uFF1F",nzOkText:"\u89E3\u7ED1",nzOkType:"primary",nzOnOk:async()=>{try{await this.nginxService.unbind(),this.instance.set(null),this.status.set(null),this.syncRuntimeState(null),this.serverSummary.set({total:0,enabled:0}),this.configFiles.set([]),this.message.success("\u89E3\u7ED1\u6210\u529F")}catch(t){this.message.error("\u89E3\u7ED1\u5931\u8D25: "+t.message)}}})}async startNginx(){if(!this.controlling()){this.controlling.set(!0),this.loading.set(!0);try{await this.nginxService.start(),this.appendLog("ok","nginx start executed"),this.message.success("\u542F\u52A8\u6210\u529F"),await this.loadStatus(),this.serverListRefreshToken.update(t=>t+1)}catch(t){this.message.error("\u542F\u52A8\u5931\u8D25: "+t.message)}finally{this.loading.set(!1),this.controlling.set(!1)}}}async stopNginx(){if(!this.controlling()){this.controlling.set(!0),this.loading.set(!0);try{await this.nginxService.stop(),this.appendLog("warn","nginx stop executed"),this.message.success("\u505C\u6B62\u6210\u529F"),await this.loadStatus(),this.serverListRefreshToken.update(t=>t+1)}catch(t){this.message.error("\u505C\u6B62\u5931\u8D25: "+t.message)}finally{this.loading.set(!1),this.controlling.set(!1)}}}async reloadNginx(){if(!this.controlling()){this.controlling.set(!0),this.loading.set(!0);try{await this.nginxService.reload(),this.appendLog("ok","nginx reload executed"),this.message.success("\u91CD\u8F7D\u6210\u529F"),await this.loadStatus(),this.serverListRefreshToken.update(t=>t+1)}catch(t){this.message.error("\u91CD\u8F7D\u5931\u8D25: "+t.message)}finally{this.loading.set(!1),this.controlling.set(!1)}}}async restartNginx(){if(!this.controlling()){this.controlling.set(!0),this.loading.set(!0);try{await this.nginxService.stop(),await this.nginxService.start(),this.appendLog("info","nginx restart executed"),this.message.success("\u91CD\u542F\u6210\u529F"),await this.loadStatus(),this.serverListRefreshToken.update(t=>t+1)}catch(t){this.message.error("\u91CD\u542F\u5931\u8D25: "+t.message)}finally{this.loading.set(!1),this.controlling.set(!1)}}}async testConfig(){this.loading.set(!0);try{let t=await this.nginxService.test();t.valid?(this.appendLog("ok","configuration test passed"),this.message.success("\u914D\u7F6E\u9A8C\u8BC1\u901A\u8FC7"),t.warnings?.length&&t.warnings.forEach(e=>this.message.warning(e))):(this.appendLog("error","configuration test failed"),this.message.error("\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25"),t.errors?.forEach(e=>this.message.error(e)))}catch(t){this.message.error("\u6D4B\u8BD5\u5931\u8D25: "+t.message)}finally{this.loading.set(!1)}}appendLog(t,e){let n=new Date().toLocaleTimeString("zh-CN",{hour12:!1,hour:"2-digit",minute:"2-digit",second:"2-digit"});this.recentLogs.update(i=>[{time:n,level:t,msg:e},...i].slice(0,120))}getBindPathCandidates(){let t=typeof navigator<"u"?navigator.userAgent.toLowerCase():"";return t.includes("windows")?["C:\\nginx\\nginx.exe","D:\\nginx\\nginx.exe"]:t.includes("mac")?["/opt/homebrew/bin/nginx","/usr/local/bin/nginx"]:["/usr/sbin/nginx","/usr/local/nginx/sbin/nginx","/usr/local/bin/nginx"]}syncRuntimeState(t){if(!t?.isRunning){this.stopRuntimeTicker(),this.runtimeBaseSeconds=null,this.runtimeBaseTimestamp=0,this.runtimeDisplay.set("-"),this.runtimeStartedAtLabel.set("-");return}let e=this.parseUptimeSeconds(t.uptime);if(e===null){this.stopRuntimeTicker(),this.runtimeBaseSeconds=null,this.runtimeBaseTimestamp=0,this.runtimeDisplay.set(t.uptime||"-"),this.runtimeStartedAtLabel.set("-");return}this.runtimeBaseSeconds=e,this.runtimeBaseTimestamp=Date.now(),this.runtimeRenderBucket=null;let n=new Date(this.runtimeBaseTimestamp-e*1e3);this.runtimeStartedAtLabel.set(this.formatDateTime(n)),this.updateRuntimeDisplay(),this.startRuntimeTicker()}hydrateFromCache(){let t=this.nginxService.getCachedStatusSnapshot();t&&(this.instance.set(t.instance),this.status.set(t.status),this.syncRuntimeState(t.status),this.statusReady.set(!0))}startRuntimeTicker(){if(typeof window>"u"||this.runtimeRafId!==null)return;let t=()=>{if(this.runtimeBaseSeconds===null||!this.status()?.isRunning){this.stopRuntimeTicker();return}this.updateRuntimeDisplay(),this.runtimeRafId=window.requestAnimationFrame(t)};this.runtimeRafId=window.requestAnimationFrame(t)}stopRuntimeTicker(){typeof window>"u"||(this.runtimeRafId!==null&&(window.cancelAnimationFrame(this.runtimeRafId),this.runtimeRafId=null),this.runtimeRenderBucket=null)}updateRuntimeDisplay(){if(this.runtimeBaseSeconds===null)return;let t=this.runtimeBaseSeconds+Math.max(0,Math.floor((Date.now()-this.runtimeBaseTimestamp)/1e3)),n=t>=86400?Math.floor(t/60):t;this.runtimeRenderBucket!==n&&(this.runtimeRenderBucket=n,this.runtimeDisplay.set(this.formatElapsed(t)))}parseUptimeSeconds(t){let e=String(t||"").trim();if(!e)return null;let n=e.match(/^(\d+)\s*d\s*(\d{1,2}):(\d{1,2}):(\d{1,2})$/i);if(n){let i=Number(n[1]),o=Number(n[2]),m=Number(n[3]),_=Number(n[4]);return i*86400+o*3600+m*60+_}if(n=e.match(/^(\d+)-(\d{1,2}):(\d{1,2}):(\d{1,2})$/),n){let i=Number(n[1]),o=Number(n[2]),m=Number(n[3]),_=Number(n[4]);return i*86400+o*3600+m*60+_}if(n=e.match(/^(\d{1,2}):(\d{1,2}):(\d{1,2})$/),n){let i=Number(n[1]),o=Number(n[2]),m=Number(n[3]);return i*3600+o*60+m}if(n=e.match(/^(\d{1,2}):(\d{1,2})$/),n){let i=Number(n[1]),o=Number(n[2]);return i*60+o}return null}formatElapsed(t){let e=Math.max(0,Math.floor(t));if(e>=86400){let G=Math.floor(e/86400),de=Math.floor(e%86400/3600),nt=Math.floor(e%3600/60);return`${G}\u5929 ${de}\u5C0F\u65F6 ${nt}\u5206\u949F`}let n=Math.floor(e/3600),i=Math.floor(e%3600/60),o=e%60,m=String(n).padStart(2,"0"),_=String(i).padStart(2,"0"),C=String(o).padStart(2,"0");return`${m}:${_}:${C}`}formatDateTime(t){let e=t.getFullYear(),n=String(t.getMonth()+1).padStart(2,"0"),i=String(t.getDate()).padStart(2,"0"),o=String(t.getHours()).padStart(2,"0"),m=String(t.getMinutes()).padStart(2,"0"),_=String(t.getSeconds()).padStart(2,"0");return`${e}-${n}-${i} ${o}:${m}:${_}`}static \u0275fac=function(e){return new(e||r)};static \u0275cmp=P({type:r,selectors:[["app-nginx"]],decls:8,vars:12,consts:[["bindFooter",""],[3,"title","loading","isFullscreen","isOverflowYAuto"],["ngProjectAs","actions",5,["actions"]],[1,"console-shell"],[3,"nzVisibleChange","nzOnCancel","nzVisible","nzFooter","nzWidth","nzCentered","nzBodyStyle"],[4,"nzModalContent"],[1,"top-status"],[1,"status-dot"],["nz-button","","nzType","default",3,"click","nzLoading"],["nzType","reload","nzTheme","outline"],["nz-button","","nzType","text","nz-tooltip","","nzTooltipTitle","\u8BBE\u7F6E",3,"click"],["nzType","setting","nzTheme","outline"],[1,"unbound-content"],["nzTip","\u52A0\u8F7D Nginx \u72B6\u6001\u4E2D...",2,"width","160px"],["nzNotFoundImage","simple",3,"nzNotFoundContent","nzNotFoundFooter"],["nz-button","","nzType","primary",3,"click"],[1,"console-content"],[1,"stats-row"],["label","\u670D\u52A1\u72B6\u6001",3,"value","toneClass","sub"],["label","\u8FD0\u884C\u65F6\u957F","toneClass","blue",3,"value","sub"],["label","\u6D3B\u8DC3\u8FDE\u63A5","toneClass","purple",3,"value","sub"],["label","Server","toneClass","orange",3,"value","sub"],[1,"service-control-row"],[1,"service-control-left"],[1,"service-control-label"],["nz-button","","nzType","default",3,"click","disabled"],["nzType","caret-right","nzTheme","outline"],["nzType","pause","nzTheme","outline"],["nz-button","","nzType","default",3,"click"],["nzType","check-circle","nzTheme","outline"],[1,"service-control-path","mono"],["accent","blue","title","\u57FA\u7840\u914D\u7F6E","subtitle","Server \u7BA1\u7406",3,"showHeader","noBodyPadding"],[3,"summaryChange","serverListMutated","showToolbar","nginxRunning","openCreateToken","refreshToken"],["accent","green",3,"noBodyPadding"],["type","button",1,"config-summary",3,"click"],[1,"config-summary-left"],[1,"config-title"],["nzType","down","nzTheme","outline",1,"expand-icon"],[1,"config-expanded"],["accent","orange",3,"noBodyPadding"],[1,"secondary-tabset",3,"nzSelectedIndexChange","nzSelectedIndex"],["nzTitle","Upstream \u7BA1\u7406"],["nzTitle","SSL \u8BC1\u4E66"],["nzTitle","\u6D41\u91CF\u63A7\u5236"],["nzTitle","\u6027\u80FD\u4F18\u5316"],["nzTitle","\u65E5\u5FD7"],["nzTitle","\u914D\u7F6E\u68C0\u6D4B"],[3,"loading","logs"],["nzTitle","\u8BBE\u7F6E"],[3,"instance","configFileCount"],[3,"refreshToken"],[3,"runTest","loading","logs"],[3,"unbind","instance","configFileCount"],[1,"bind-modal"],[1,"bind-icon"],["nzType","link","nzTheme","outline"],[1,"bind-title"],[1,"bind-desc"],[1,"bind-input-group"],["nz-input","","placeholder","/usr/local/nginx/sbin/nginx",1,"mono","bind-path-input",3,"ngModelChange","keyup.enter","ngModel"],["nzType","folder-open","nzTheme","outline"],["nz-button","","nzType","primary",1,"bind-submit-btn",3,"click","nzLoading","disabled"]],template:function(e,n){e&1&&(a(0,"app-page-layout",1),te(1,2),v(2,sr,8,5),ne(),v(3,lr,3,0,"nz-layout",3)(4,cr,5,2,"nz-layout",3)(5,Cr,50,32,"nz-layout",3),a(6,"nz-modal",4),N("nzVisibleChange",function(o){return M(n.bindModalVisible,o)||(n.bindModalVisible=o),o}),p("nzOnCancel",function(){return n.bindModalVisible=!1}),O(7,vr,16,3,"ng-container",5),s()()),e&2&&(u("title","Nginx \u7BA1\u7406")("loading",n.loading())("isFullscreen",!0)("isOverflowYAuto",!1),l(2),b(n.instance()?2:-1),l(),b(n.statusReady()?n.instance()?5:4:3),l(3),z("nzVisible",n.bindModalVisible),u("nzFooter",null)("nzWidth",560)("nzCentered",!0)("nzBodyStyle",Te(11,ar)))},dependencies:[E,q,Q,j,H,U,W,B,A,k,R,ae,re,Fn,En,Dn,Be,Re,Ve,we,Ge,Rn,Vn,In,Pn,Tn,Qe,bt,wn,zt,kt,Dt,Ft,Tt,Nt,Et,Pt,Ot,It,Vt],styles:['[_nghost-%COMP%]{--nginx-font-size-sm: 12px;--nginx-font-size-base: 14px;--nginx-font-size-kpi: 22px;--nginx-font-family-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;--bg-page: #f5f7fa;--bg-white: #ffffff;--bg-hover: #f8f9fc;--bg-input: #f7f8fa;--border: #e8ebf0;--border-light: #eef1f5;--text-1: #1d2129;--text-2: #4e5969;--text-3: #86909c;--text-4: #c9cdd4;--blue: #165dff;--blue-bg: #f2f6ff;--blue-border: rgba(22, 93, 255, .15);--green: #00b42a;--green-bg: #f2fff6;--green-border: rgba(0, 180, 42, .15);--red: #f53f3f;--red-bg: #fff2f2;--orange: #ff7d00;--orange-bg: #fff7e8;--orange-border: rgba(255, 125, 0, .15);--purple: #722ed1;--shadow-card: 0 1px 4px rgba(0, 0, 0, .04);--shadow-hover: 0 4px 12px rgba(0, 0, 0, .06)}.console-shell[_ngcontent-%COMP%]{height:100%;background:var(--bg-page)}.console-content[_ngcontent-%COMP%]{padding:18px 20px 30px;overflow-y:auto}.unbound-content[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:center;width:100%}[_nghost-%COMP%] .unbound-content .ant-spin-text{white-space:nowrap;word-break:keep-all;min-width:160px}.stats-row[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin-bottom:14px}.service-control-row[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;gap:10px;background:#f2f3f5;border:1px solid #e5e6eb;border-radius:6px;padding:10px 12px;margin-bottom:14px}.service-control-left[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.service-control-label[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);color:var(--text-2);font-weight:600;margin-right:2px}.service-control-path[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);color:var(--text-3);padding:4px 8px;border:1px solid #dcdfe5;border-radius:4px;background:#f7f8fa}.config-title[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-base, 14px);font-weight:700;color:var(--text-1)}.config-summary[_ngcontent-%COMP%]{width:100%;display:flex;align-items:center;justify-content:space-between;padding:10px 16px 10px 20px;border:none;background:#fff;cursor:pointer;text-align:left;transition:background .12s ease}.config-summary[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.config-summary.open[_ngcontent-%COMP%] .expand-icon[_ngcontent-%COMP%]{transform:rotate(180deg)}.config-summary-left[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;min-width:0}.expand-icon[_ngcontent-%COMP%]{color:var(--text-3);transition:transform .2s ease}.config-expanded[_ngcontent-%COMP%]{border-top:1px solid var(--border-light)}.mono[_ngcontent-%COMP%]{font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace)}.mono.strong[_ngcontent-%COMP%]{color:var(--text-1);font-weight:600}.mono.dim[_ngcontent-%COMP%]{color:var(--text-2);font-size:var(--nginx-font-size-sm, 12px)}.bind-modal[_ngcontent-%COMP%]{padding:32px;text-align:center}.bind-icon[_ngcontent-%COMP%]{width:56px;height:56px;margin:0 auto 18px;border-radius:50%;display:flex;align-items:center;justify-content:center;color:var(--blue);background:var(--blue-bg);border:1px solid var(--blue-border);font-size:24px}.bind-title[_ngcontent-%COMP%]{font-size:18px;font-weight:700;color:var(--text-1);margin-bottom:8px}.bind-desc[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);line-height:1.7;color:var(--text-3);margin-bottom:22px}.bind-input-group[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;margin-bottom:12px}.bind-path-input[_ngcontent-%COMP%]{flex:1}.bind-or[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);color:var(--text-3);margin-bottom:12px}.bind-auto-detect[_ngcontent-%COMP%]{width:100%;margin-bottom:16px;border:1px solid var(--border);border-radius:6px;background:var(--bg-input);cursor:pointer;padding:10px 12px;display:flex;align-items:center;gap:10px;transition:all .12s ease;text-align:left}.bind-auto-detect[_ngcontent-%COMP%]:hover{border-color:var(--blue);box-shadow:0 0 0 2px var(--blue-border);background:#fff}.bind-auto-detect[_ngcontent-%COMP%] .anticon[_ngcontent-%COMP%]{font-size:16px;color:var(--blue)}.bind-auto-detect-text[_ngcontent-%COMP%]{min-width:0}.bind-auto-detect-title[_ngcontent-%COMP%]{color:var(--text-1);font-size:var(--nginx-font-size-base, 14px);font-weight:600}.bind-auto-detect-hint[_ngcontent-%COMP%]{margin-top:2px;color:var(--text-3);font-size:var(--nginx-font-size-sm, 12px)}.bind-submit-btn[_ngcontent-%COMP%]{width:100%;height:36px;font-size:var(--nginx-font-size-base, 14px);display:inline-flex;align-items:center;justify-content:center}@media (max-width: 768px){.bind-modal[_ngcontent-%COMP%]{padding:20px 16px}.bind-input-group[_ngcontent-%COMP%]{flex-direction:column;align-items:stretch}}[_nghost-%COMP%] .top-status{display:inline-flex;align-items:center;gap:6px;font-size:var(--nginx-font-size-sm, 12px);font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace);color:var(--red);background:var(--red-bg);border:1px solid rgba(245,63,63,.2);border-radius:16px;padding:4px 10px}[_nghost-%COMP%] .top-status.running{color:var(--green);background:var(--green-bg);border-color:var(--green-border)}[_nghost-%COMP%] .top-status .status-dot{width:6px;height:6px;border-radius:50%;background:currentColor;animation:_ngcontent-%COMP%_pulse 2s ease-in-out infinite}[_nghost-%COMP%] .secondary-tabset .ant-tabs-nav{margin:0;padding:0 16px;border-bottom:1px solid var(--border-light)}[_nghost-%COMP%] .secondary-tabset .ant-tabs-content-holder{padding:14px 18px}@keyframes _ngcontent-%COMP%_pulse{0%,to{opacity:1}50%{opacity:.35}}@media (max-width: 1280px){.stats-row[_ngcontent-%COMP%]{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (max-width: 992px){.service-control-row[_ngcontent-%COMP%]{flex-direction:column;align-items:flex-start}}@media (max-width: 768px){.console-content[_ngcontent-%COMP%]{padding:12px}.stats-row[_ngcontent-%COMP%]{grid-template-columns:1fr}.config-summary-left[_ngcontent-%COMP%]{flex-direction:column;align-items:flex-start}}']})};export{Xn as NginxComponent};
|