@jonathanleelx/meddle 0.5.0-beta.15 → 0.5.0-beta.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/web/dist/assets/{checkbox-CE4zQ4Yd.js → checkbox-Dd4_B7PJ.js} +1 -1
- package/web/dist/assets/{detail-panel-BE03zbRM.js → detail-panel-3Qo1aGrc.js} +2 -2
- package/web/dist/assets/{global-panel-shell-B_KrFgrG.js → global-panel-shell-uD1rAdJu.js} +3 -3
- package/web/dist/assets/health-panel-BbfIoIlv.js +1 -0
- package/web/dist/assets/index-BYLl2Q6S.js +18 -0
- package/web/dist/assets/index-C-RXDbGt.css +2 -0
- package/web/dist/assets/mobile-proxy-panel-B4AbSF0h.js +8 -0
- package/web/dist/assets/{mock-config-B0E2-aH2.js → mock-config-IWupj9Lm.js} +1 -1
- package/web/dist/assets/{mock-editor-panel-BvPtitwB.js → mock-editor-panel-kCiocuZT.js} +2 -2
- package/web/dist/assets/{monaco-editor-C-8a2RcV.js → monaco-editor-DnP2y6oW.js} +1 -1
- package/web/dist/assets/plugin-code-editor-CHx7wKXJ.js +2 -0
- package/web/dist/assets/{plugin-config-BpNDvl12.js → plugin-config-kDoUjUQX.js} +1 -1
- package/web/dist/assets/{plugin-generator-88t2qEJf.js → plugin-generator-BhjalAD8.js} +2 -2
- package/web/dist/assets/plugin-test-dialog-DM_tn7ZX.js +7 -0
- package/web/dist/assets/{route-preview-jIx1yelT.js → route-preview-Du8Iq2qN.js} +1 -1
- package/web/dist/assets/{rule-ai-assistant-panel-B_Jt1DJA.js → rule-ai-assistant-panel-DOu_JHOY.js} +2 -2
- package/web/dist/assets/rule-config-AiMHRZTk.js +15 -0
- package/web/dist/assets/rule-overview-panel-BkkI1pg1.js +1 -0
- package/web/dist/assets/{settings-panel-1cLPk1j5.js → settings-panel-DP_S8V4C.js} +1 -1
- package/web/dist/assets/{switch-B568YFGZ.js → switch-_QmVA6k1.js} +1 -1
- package/web/dist/index.html +2 -2
- package/web/dist/assets/health-panel-Cx7_kL4v.js +0 -1
- package/web/dist/assets/index-BI-mGxIe.css +0 -2
- package/web/dist/assets/index-BSDW5a57.js +0 -18
- package/web/dist/assets/mobile-proxy-panel-yPd3yUkm.js +0 -8
- package/web/dist/assets/plugin-code-editor-M-RHHFw3.js +0 -2
- package/web/dist/assets/plugin-test-dialog-DdaPFHRu.js +0 -7
- package/web/dist/assets/rule-config-CQj7iV_7.js +0 -15
- package/web/dist/assets/rule-overview-panel-8qC9Q6T-.js +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{f as e,s as t,t as n,u as r}from"./button-yArHqw81.js";import"./dist-CwP5Ad1_.js";import{t as i}from"./refresh-cw-DdzbeDXU.js";import{t as a}from"./table-2-BE3hfnr0.js";import{A as o,D as s,E as c,H as ee,L as te,O as l,R as u,T as d,U as f,Z as p,at as m,k as h,lt as g,mt as _,o as v,w as y,z as b}from"./index-BSDW5a57.js";import{a as x,i as S,n as C,o as w,r as T,t as E}from"./table-BY-pIs96.js";var D=e(r(),1),O=t(),k=`border-l-2 border-l-transparent`,A=`text-muted-foreground opacity-75`;function j(e){return e.length>0?e.map(e=>`!${e}`).join(` `):`—`}function M({rules:e,activeFileName:t,onLocateRule:r,onSelectFile:M}){let[N,ne]=(0,D.useState)(null),[P,F]=(0,D.useState)(!0),[I,L]=(0,D.useState)(null),[R,z]=(0,D.useState)(`merged`),[B,V]=(0,D.useState)(``),H=(0,D.useDeferredValue)(B),U=(0,D.useCallback)(async()=>{F(!0),L(null);try{let e=await fetch(`/api/rule-files/overview`);if(!e.ok)throw Error(`加载失败(${e.status})`);ne(await e.json())}catch(e){L(e instanceof Error?e.message:`加载失败`)}finally{F(!1)}},[]);(0,D.useEffect)(()=>{U()},[U]);let W=(0,D.useMemo)(()=>N?.perFileRules.find(e=>e.name===t)??null,[N,t]),G=(0,D.useMemo)(()=>{if(!W||W.error)return!1;let t=W.rules.map(e=>({rule:e.rawRule,target:e.rawTarget,enabled:e.enabled,exclusions:e.exclusions}));return v(e)!==v(t)},[W,e]),K=(0,D.useMemo)(()=>{let e=new Map;for(let t of N?.conflicts??[])e.set(t.pattern,t);return e},[N]),q=(0,D.useCallback)(e=>{let t=H.trim().toLowerCase();return t?e.some(e=>e&&e.toLowerCase().includes(t)):!0},[H]),J=(0,D.useMemo)(()=>(N?.mergedRules??[]).map(e=>({winner:e,shadowed:K.get(e.pattern)?.shadowed??[]})).filter(({winner:e,shadowed:t})=>q([e.rawRule,e.rawTarget,e.file])||t.some(e=>q([e.rawRule,e.rawTarget,e.file]))),[N,K,q]),Y=N?.mergedRules.length??0,X=N?.conflicts.reduce((e,t)=>e+t.shadowed.length,0)??0,Z=(0,D.useMemo)(()=>(N?.perFileRules??[]).map(e=>({...e,matched:e.rules.filter(t=>q([t.rawRule,t.rawTarget,e.name]))})).filter(e=>e.error!=null||q([e.name])||e.matched.length>0),[N,q]),re=N?.perFileRules.reduce((e,t)=>e+t.rules.length,0)??0,ie=Z.reduce((e,t)=>e+t.matched.length,0),Q=(0,D.useCallback)((e,t,n)=>{r(e,t,n)},[r]),ae=(0,D.useCallback)((e,t)=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),M(t))},[M]),oe=()=>{if(P)return(0,O.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col gap-2 p-2`,children:[(0,O.jsx)(f,{className:`h-8 w-full`}),(0,O.jsx)(f,{className:`h-8 w-full`}),(0,O.jsx)(f,{className:`h-8 w-3/4`})]});if(I)return(0,O.jsxs)(d,{className:`min-h-0 flex-1`,children:[(0,O.jsxs)(l,{children:[(0,O.jsx)(h,{variant:`icon`,children:(0,O.jsx)(p,{})}),(0,O.jsx)(o,{children:`加载失败`}),(0,O.jsx)(s,{children:I})]}),(0,O.jsx)(c,{children:(0,O.jsxs)(n,{variant:`outline`,onClick:()=>void U(),children:[(0,O.jsx)(i,{"data-icon":`inline-start`}),`重试`]})})]});let e=(N?.files.length??0)>0,t=N?.perFileRules.some(e=>e.rules.length>0||e.error!=null)??!1,r=H.trim().length>0;return e?t?R===`merged`&&!r&&(N?.mergedRules.length??0)===0?(0,O.jsx)(d,{className:`min-h-0 flex-1`,children:(0,O.jsxs)(l,{children:[(0,O.jsx)(h,{variant:`icon`,children:(0,O.jsx)(g,{})}),(0,O.jsx)(o,{children:`没有生效中的规则`}),(0,O.jsx)(s,{children:`规则全部被禁用,或没有启用任何规则文件;切换到「按文件」查看全部规则`})]})}):r&&R===`merged`&&J.length===0||r&&R===`files`&&Z.every(e=>e.matched.length===0&&e.error==null)?$():R===`merged`?se():ce():(0,O.jsx)(d,{className:`min-h-0 flex-1`,children:(0,O.jsxs)(l,{children:[(0,O.jsx)(h,{variant:`icon`,children:(0,O.jsx)(_,{})}),(0,O.jsx)(o,{children:`所有规则文件都是空的`}),(0,O.jsx)(s,{children:`还没有任何路由规则,先去路由规则页添加一条吧`})]})}):(0,O.jsx)(d,{className:`min-h-0 flex-1`,children:(0,O.jsxs)(l,{children:[(0,O.jsx)(h,{variant:`icon`,children:(0,O.jsx)(a,{})}),(0,O.jsx)(o,{children:`还没有规则文件`}),(0,O.jsx)(s,{children:`在路由规则页点击「+」创建第一个规则文件`})]})})},$=()=>(0,O.jsxs)(d,{className:`min-h-0 flex-1`,children:[(0,O.jsxs)(l,{children:[(0,O.jsx)(h,{variant:`icon`,children:(0,O.jsx)(m,{})}),(0,O.jsx)(o,{children:`无匹配结果`}),(0,O.jsxs)(s,{children:[`没有找到符合「`,H.trim(),`」的规则`]})]}),(0,O.jsx)(c,{children:(0,O.jsx)(n,{variant:`outline`,onClick:()=>V(``),children:`清空筛选`})})]}),se=()=>(0,O.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col overflow-hidden rounded-md border`,children:[(0,O.jsx)(`div`,{className:`meddle-thin-scroll shrink-0 overflow-x-auto bg-card`,children:(0,O.jsxs)(E,{className:`table-fixed`,children:[(0,O.jsxs)(`colgroup`,{children:[(0,O.jsx)(`col`,{style:{width:`6rem`}}),(0,O.jsx)(`col`,{}),(0,O.jsx)(`col`,{style:{width:`8rem`}}),(0,O.jsx)(`col`,{})]}),(0,O.jsx)(x,{children:(0,O.jsxs)(w,{children:[(0,O.jsx)(S,{children:`来源`}),(0,O.jsx)(S,{children:`规则`}),(0,O.jsx)(S,{className:`hidden md:table-cell`,children:`排除`}),(0,O.jsx)(S,{children:`目标`})]})})]})}),(0,O.jsx)(y,{className:`min-h-0 flex-1`,children:(0,O.jsxs)(E,{className:`table-fixed`,children:[(0,O.jsxs)(`colgroup`,{children:[(0,O.jsx)(`col`,{style:{width:`6rem`}}),(0,O.jsx)(`col`,{}),(0,O.jsx)(`col`,{style:{width:`8rem`}}),(0,O.jsx)(`col`,{})]}),(0,O.jsx)(C,{children:J.map(({winner:e,shadowed:t})=>(0,O.jsxs)(D.Fragment,{children:[(0,O.jsxs)(w,{className:`${k} cursor-pointer`,onClick:()=>Q(e.file,e.rawRule,e.rawTarget),title:`点击定位到该规则`,children:[(0,O.jsx)(T,{className:`truncate text-xs text-muted-foreground`,children:e.file}),(0,O.jsxs)(T,{className:`break-all font-mono text-xs`,children:[e.rawRule,t.length>0&&(0,O.jsx)(b,{variant:`default`,className:`ml-2 px-1 py-0 text-[10px]`,title:`同名规则最终生效的定义`,children:`生效`})]}),(0,O.jsx)(T,{className:`hidden break-all font-mono text-xs text-muted-foreground md:table-cell`,children:j(e.exclusions)}),(0,O.jsx)(T,{className:`break-all font-mono text-xs`,children:e.rawTarget})]}),t.map((t,n)=>(0,O.jsxs)(w,{className:`${k} cursor-pointer ${A}`,onClick:()=>Q(t.file,t.rawRule,t.rawTarget),title:`点击定位到该规则`,children:[(0,O.jsx)(T,{className:`truncate text-xs`,children:t.file}),(0,O.jsx)(T,{className:`break-all font-mono text-xs`,children:(0,O.jsxs)(`span`,{className:`inline-flex flex-wrap items-center gap-1.5`,children:[t.rawRule,(0,O.jsx)(b,{variant:`destructive`,className:`px-1 py-0 text-[10px]`,title:`已被 ${e.file} 中的同名规则覆盖,实际不生效`,children:`已被覆盖`})]})}),(0,O.jsx)(T,{className:`hidden break-all font-mono text-xs md:table-cell`,children:`—`}),(0,O.jsx)(T,{className:`break-all font-mono text-xs`,children:t.rawTarget})]},`merged-shadowed-${n}`))]},`merged-group-${e.pattern}`))})]})})]}),ce=()=>(0,O.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col overflow-hidden rounded-md border`,children:[(0,O.jsx)(`div`,{className:`meddle-thin-scroll shrink-0 overflow-x-auto bg-card`,children:(0,O.jsxs)(E,{className:`table-fixed`,children:[(0,O.jsxs)(`colgroup`,{children:[(0,O.jsx)(`col`,{style:{width:`3.5rem`}}),(0,O.jsx)(`col`,{}),(0,O.jsx)(`col`,{style:{width:`8rem`}}),(0,O.jsx)(`col`,{})]}),(0,O.jsx)(x,{children:(0,O.jsxs)(w,{children:[(0,O.jsx)(S,{children:`状态`}),(0,O.jsx)(S,{children:`规则`}),(0,O.jsx)(S,{className:`hidden md:table-cell`,children:`排除`}),(0,O.jsx)(S,{children:`目标`})]})})]})}),(0,O.jsx)(y,{className:`min-h-0 flex-1`,children:(0,O.jsxs)(E,{className:`table-fixed`,children:[(0,O.jsxs)(`colgroup`,{children:[(0,O.jsx)(`col`,{style:{width:`3.5rem`}}),(0,O.jsx)(`col`,{}),(0,O.jsx)(`col`,{style:{width:`8rem`}}),(0,O.jsx)(`col`,{})]}),(0,O.jsx)(C,{children:Z.map(e=>(0,O.jsxs)(D.Fragment,{children:[(0,O.jsx)(w,{className:`hover:bg-accent/60`,children:(0,O.jsx)(T,{colSpan:4,className:`cursor-pointer bg-muted/50 p-2 align-middle`,role:`button`,tabIndex:0,onClick:()=>M(e.name),onKeyDown:t=>ae(t,e.name),title:`点击切换到该规则文件`,children:(0,O.jsxs)(`span`,{className:`flex flex-wrap items-center gap-2 font-medium`,children:[e.name,(0,O.jsx)(b,{variant:e.enabled?`default`:`secondary`,className:`px-1 py-0 text-[10px]`,children:e.enabled?`启用`:`禁用`}),(0,O.jsx)(b,{variant:`secondary`,className:`px-1 py-0 text-[10px]`,children:e.rules.length})]})})}),e.error&&(0,O.jsx)(w,{className:`text-destructive`,children:(0,O.jsx)(T,{colSpan:4,className:`p-2 text-xs`,children:(0,O.jsxs)(`span`,{className:`flex items-center gap-2`,children:[(0,O.jsx)(p,{className:`h-3.5 w-3.5 shrink-0`}),`读取失败:`,e.error]})})}),e.matched.map((t,n)=>(0,O.jsxs)(w,{className:`cursor-pointer ${t.enabled?``:`opacity-60`}`,onClick:()=>Q(e.name,t.rawRule,t.rawTarget),title:`点击定位到该规则`,children:[(0,O.jsx)(T,{children:(0,O.jsx)(b,{variant:t.enabled?`default`:`secondary`,className:`px-1 py-0 text-[10px]`,children:t.enabled?`启用`:`禁用`})}),(0,O.jsx)(T,{className:`break-all font-mono text-xs`,children:t.rawRule}),(0,O.jsx)(T,{className:`hidden break-all font-mono text-xs text-muted-foreground md:table-cell`,children:j(t.exclusions)}),(0,O.jsx)(T,{className:`break-all font-mono text-xs ${t.enabled?``:`line-through`}`,children:t.rawTarget})]},`file-rule-${n}`))]},`file-group-${e.name}`))})]})})]}),le=R===`merged`?Y+X:re,ue=R===`merged`?J.reduce((e,t)=>e+1+t.shadowed.length,0):ie;return(0,O.jsxs)(`div`,{className:`app-panel-content flex h-full flex-col gap-3`,children:[(0,O.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,O.jsxs)(te,{type:`single`,value:R,onValueChange:e=>{e&&z(e)},variant:`outline`,size:`sm`,className:`bg-background`,"aria-label":`总览视图`,children:[(0,O.jsx)(u,{value:`merged`,children:`生效规则`}),(0,O.jsx)(u,{value:`files`,children:`按文件`})]}),(0,O.jsxs)(`div`,{className:`relative min-w-40 flex-1`,children:[(0,O.jsx)(m,{className:`pointer-events-none absolute top-1/2 left-2 h-4 w-4 -translate-y-1/2 text-muted-foreground`}),(0,O.jsx)(ee,{value:B,onChange:e=>V(e.target.value),placeholder:`搜索规则 / 目标 / 文件名`,className:`h-8 pl-8`,"aria-label":`搜索规则`})]}),(0,O.jsx)(n,{type:`button`,variant:`ghost`,size:`icon-sm`,onClick:()=>void U(),disabled:P,"aria-label":`刷新总览`,title:`刷新`,children:(0,O.jsx)(i,{})})]}),G&&(0,O.jsxs)(`div`,{className:`flex items-center gap-2 rounded-md border border-amber-200 bg-amber-50 px-3 py-2 text-xs text-amber-800`,children:[(0,O.jsx)(p,{className:`h-3.5 w-3.5 shrink-0`}),(0,O.jsxs)(`span`,{children:[`「`,t,`」有未保存修改,此处展示的是代理当前使用的`,(0,O.jsx)(`b`,{children:`已保存内容`})]})]}),!P&&!I&&(N?.files.length??0)>0&&(0,O.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2 text-xs text-muted-foreground`,children:[(0,O.jsxs)(`span`,{children:[ue,` / `,le,` 条`,R===`merged`&&H.trim()===``&&X>0?`,其中 ${X} 条被同名规则覆盖`:``]}),R===`merged`&&(0,O.jsx)(`span`,{children:`按代理实际生效顺序排列(后定义覆盖先定义)`}),R===`files`&&(0,O.jsx)(`span`,{children:`点击文件名切换到该文件`})]}),oe()]})}export{M as RuleOverviewPanel};
|