@jonathanleelx/meddle 0.2.2 → 0.3.1
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/README.md +29 -0
- package/bin/commands/session/create.js +20 -17
- package/bin/commands/start.js +16 -13
- package/bin/commands/supervise.js +16 -7
- package/bin/lib/dispatch.js +34 -0
- package/bin/lib/spawn-proxy.js +51 -0
- package/bin/main.js +34 -0
- package/mcp-server.js +22 -16
- package/package.json +2 -2
- package/web/dist/assets/{checkbox-D0y07vOb.js → checkbox-BWULYytd.js} +1 -1
- package/web/dist/assets/{code-fixer-DOrMk-4V.js → code-fixer-5eQnwT8X.js} +2 -2
- package/web/dist/assets/{detail-panel-CGfKk7-i.js → detail-panel-BpOhMCBc.js} +1 -1
- package/web/dist/assets/{global-panel-shell-COyDpKbS.js → global-panel-shell-BAYOGxQQ.js} +1 -1
- package/web/dist/assets/{health-panel-CgEmCIeC.js → health-panel-kmPJnyYQ.js} +1 -1
- package/web/dist/assets/{index-DTeCUv1G.js → index-DboWpNx1.js} +2 -2
- package/web/dist/assets/{mobile-proxy-panel-BCUn96iR.js → mobile-proxy-panel-DmB_Xpfw.js} +1 -1
- package/web/dist/assets/mock-config-iBp0BDov.js +1 -0
- package/web/dist/assets/{mock-editor-panel-Ctf1EX-d.js → mock-editor-panel-CXXDTlEW.js} +1 -1
- package/web/dist/assets/{monaco-editor-DboIGERI.js → monaco-editor-Z1BRT9kx.js} +2 -2
- package/web/dist/assets/{plugin-code-editor-DuaSNWGF.js → plugin-code-editor-BlDjbDTI.js} +1 -1
- package/web/dist/assets/{plugin-config-D7H47wsJ.js → plugin-config-CAt68TW2.js} +1 -1
- package/web/dist/assets/{plugin-generator-xGpWo1Fc.js → plugin-generator-DQPeKPiv.js} +1 -1
- package/web/dist/assets/{plugin-test-dialog-BfxPpCfE.js → plugin-test-dialog-DzxpHPhR.js} +1 -1
- package/web/dist/assets/{route-preview-CvoRZiwx.js → route-preview-DE5VQpeQ.js} +1 -1
- package/web/dist/assets/{rule-ai-assistant-panel-B0UlJVO3.js → rule-ai-assistant-panel-CzFwse2h.js} +1 -1
- package/web/dist/assets/rule-config-CSjkrM2g.js +15 -0
- package/web/dist/assets/{select-CH0aJ3Dd.js → select-DOK-k_l8.js} +1 -1
- package/web/dist/assets/{settings-panel-BvaGZmBw.js → settings-panel-Ccdeqa9n.js} +1 -1
- package/web/dist/index.html +1 -1
- package/dist/core/plugin-compiler.d.ts +0 -37
- package/dist/core/plugin-compiler.d.ts.map +0 -1
- package/dist/core/plugin-compiler.js +0 -172
- package/dist/core/plugin-compiler.js.map +0 -1
- package/web/dist/assets/mock-config-DNMSOrLv.js +0 -1
- package/web/dist/assets/rule-config-BmrlYakh.js +0 -15
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e,f as t,l as n,t as r,u as i}from"./button-BTToMaBW.js";import"./dist-C6eaYCUo.js";import{t as ee}from"./chevron-down-CPngAx4M.js";import{t as te}from"./chevron-right-V1DGIDbL.js";import{t as a}from"./code-5_eJ_XpJ.js";import{n as ne,t as o}from"./checkbox-D0y07vOb.js";import{t as s}from"./plus-tVxSydJ8.js";import{t as re}from"./wand-sparkles-wkul5vje.js";import"./es2015-CfXu88Y7.js";import{o as ie,r as ae}from"./ai-config-store-DQXVJVn_.js";import{A as c,G as l,d as oe,f as se,g as ce,h as le,lt as ue,m as u,p as de,rt as fe,u as d,v as pe,y as me,z as f}from"./index-DTeCUv1G.js";import{r as p}from"./syntax-highlight-DVhPdkuV.js";import{a as he,i as m,n as ge,o as h,r as g,t as _}from"./table-CT97lAYq.js";import{n as _e}from"./monaco-editor-DboIGERI.js";import{n as ve,t as ye}from"./code-fixer-DOrMk-4V.js";import{t as v}from"./file-system-access-CtcvBfj4.js";var y=n(`file-up`,[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M12 12v6`,key:`3ahymv`}],[`path`,{d:`m15 15-3-3-3 3`,key:`15xj92`}]]),b=t(i(),1),x=e();function be(e){return e.trim().startsWith(`data:image/`)}var xe={name:``,urlPattern:``,method:`*`,statusCode:200,delay:0,bodyType:`inline`,headers:{},body:``,enabled:!0};function S({mockRules:e,fetchMocks:t,createMock:n,updateMock:i,deleteMock:S,initialEditData:C,onInitialEditConsumed:w}){let[T,E]=(0,b.useState)(!1),[D]=(0,b.useState)(null),[O,Se]=(0,b.useState)(xe),[k,A]=(0,b.useState)(!1),[j,M]=(0,b.useState)(!1),[N,Ce]=(0,b.useState)(300),we=(0,b.useRef)(null),P=(0,b.useRef)(null),[F,I]=(0,b.useState)(``),[L,R]=(0,b.useState)(``),[z,B]=(0,b.useState)(null),[V,H]=(0,b.useState)(null),[U,W]=(0,b.useState)(!1),[G,K]=(0,b.useState)(!1),[q,J]=(0,b.useState)(null),Te=e=>e.type.startsWith(`image/`),Ee=e=>({json:`application/json`,js:`application/javascript`,css:`text/css`,html:`text/html`,htm:`text/html`,xml:`application/xml`,txt:`text/plain`,csv:`text/csv`,png:`image/png`,jpg:`image/jpeg`,jpeg:`image/jpeg`,gif:`image/gif`,webp:`image/webp`,svg:`image/svg+xml`,ico:`image/x-icon`,bmp:`image/bmp`})[e.toLowerCase().split(`.`).pop()||``]||`text/plain`,Y=e=>{let t=Ee(e);return(O.headers||{})[`Content-Type`]?null:t},X=async e=>Te(e)?new Promise(t=>{let n=new FileReader;n.onload=e=>{t(e.target?.result)},n.readAsDataURL(e)}):await e.text(),De=(0,b.useCallback)(async()=>{if(v(window))try{let[e]=await window.showOpenFilePicker({types:[{description:`响应文件`,accept:{"application/json":[`.json`],"text/html":[`.html`,`.htm`],"text/plain":[`.txt`,`.js`,`.css`,`.xml`,`.csv`,`.png`,`.jpg`,`.jpeg`,`.gif`,`.webp`],"image/png":[`.png`],"image/jpeg":[`.jpg`,`.jpeg`],"image/gif":[`.gif`],"image/webp":[`.webp`]}}],multiple:!1}),t=await e.getFile();$(`body`,await X(t)),J(Y(t.name));return}catch(e){console.log(`File System Access API not available or cancelled:`,e)}P.current?.click()},[]),Oe=(0,b.useCallback)(e=>{let t=e.target.files?.[0];t&&X(t).then(e=>{$(`body`,e),J(Y(t.name))}),e.target.value=``},[]);(0,b.useEffect)(()=>{t()},[t]),(0,b.useEffect)(()=>{C&&(window.dispatchEvent(new CustomEvent(`global-panel:open-panel`,{detail:{id:`mock.create`,title:`新建 Mock 规则`,size:`lg`,params:{initialData:C}}})),w?.())},[C,w]),(0,b.useEffect)(()=>{T||(I(``),R(``),M(!1),H(null),B(null))},[T]);let ke=(0,b.useCallback)(e=>{if(!e.trim()){H(null);return}let t=p(e);t.valid?H(null):H(t.error||`内容格式错误`)},[]),Z=(0,b.useCallback)(()=>{window.dispatchEvent(new CustomEvent(`global-panel:open-panel`,{detail:{id:`mock.create`,title:`新建 Mock 规则`,size:`lg`}}))},[]),Ae=(0,b.useCallback)(e=>{window.dispatchEvent(new CustomEvent(`global-panel:open-panel`,{detail:{id:`mock.edit`,title:`编辑 Mock:${e.name||e.urlPattern}`,size:`lg`,params:{id:e.id}}}))},[]),je=(0,b.useCallback)(e=>{e.preventDefault();let t=e.clientY,n=N,r=e=>{let r=e.clientY-t;Ce(Math.max(150,n+r))},i=()=>{document.removeEventListener(`mousemove`,r),document.removeEventListener(`mouseup`,i)};document.addEventListener(`mousemove`,r),document.addEventListener(`mouseup`,i)},[N]),Q=(0,b.useCallback)(async()=>{if(O.bodyType===`inline`&&O.body.trim()){let e=p(O.body);if(!e.valid){let t=e.error||`内容格式错误`;H(t),d.error(t);return}}A(!0);try{if(!(D==null?await n(O):await i(D,O)))throw Error(`保存 Mock 规则失败`);d.success(`Mock 规则保存成功`),E(!1)}catch(e){d.error(e instanceof Error?e.message:`保存失败`)}finally{A(!1)}},[D,O,n,i]);oe({active:T,enabled:!k&&!!O.urlPattern,priority:se.modal,onSave:Q});let Me=(0,b.useCallback)(async(e,t)=>{await i(e.id,{enabled:t})},[i]),Ne=(0,b.useCallback)(async e=>{await S(e)},[S]),$=(e,t)=>{Se(n=>({...n,[e]:t})),e===`body`&&typeof t==`string`&&ke(t)},Pe=(0,b.useCallback)(async()=>{K(!0);try{let{formatted:e,type:t}=await ve(O.body);$(`body`,e),B(null),console.log(`已格式化为 ${t}`)}catch(e){B(e instanceof Error?e.message:`格式化失败`),setTimeout(()=>B(null),3e3)}finally{K(!1)}},[O.body]),Fe=(0,b.useCallback)(async()=>{W(!0);try{let e=await ye(O.body,!0);e.success?($(`body`,e.fixed),H(null),B(null),console.log(`代码已修复 (方法: ${e.method===`ai`?`AI`:`规则`})`)):(B(`自动修复失败,请手动修正语法错误`),setTimeout(()=>B(null),3e3))}catch(e){B(e instanceof Error?e.message:`修复失败`),setTimeout(()=>B(null),3e3)}finally{W(!1)}},[O.body]);return(0,x.jsxs)(`div`,{className:`app-page-stack`,children:[(0,x.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,x.jsx)(`h3`,{className:`text-sm font-medium`,children:`规则列表`}),(0,x.jsxs)(r,{variant:`outline`,size:`sm`,onClick:Z,children:[(0,x.jsx)(s,{"data-icon":`inline-start`}),`新增规则`]})]}),(0,x.jsx)(`div`,{className:`rounded-md border`,children:(0,x.jsxs)(_,{children:[(0,x.jsx)(he,{children:(0,x.jsxs)(h,{children:[(0,x.jsx)(m,{className:`w-12`,children:`启用`}),(0,x.jsx)(m,{className:`w-40`,children:`名称`}),(0,x.jsx)(m,{children:`URL 匹配`}),(0,x.jsx)(m,{className:`w-20`,children:`方法`}),(0,x.jsx)(m,{className:`w-20`,children:`状态码`}),(0,x.jsx)(m,{className:`w-16`,children:`类型`}),(0,x.jsx)(m,{className:`w-16`,children:`延迟`}),(0,x.jsx)(m,{className:`w-16`,children:`响应头`}),(0,x.jsx)(m,{className:`w-20`,children:`操作`})]})}),(0,x.jsx)(ge,{children:e.length===0?(0,x.jsx)(h,{children:(0,x.jsx)(g,{colSpan:9,className:`text-center text-muted-foreground py-8`,children:`暂无 Mock 规则,点击"新增规则"或从请求日志详情中创建`})}):e.map(e=>(0,x.jsxs)(h,{children:[(0,x.jsx)(g,{children:(0,x.jsx)(o,{checked:e.enabled,onCheckedChange:t=>Me(e,t===!0)})}),(0,x.jsx)(g,{className:`font-medium text-sm`,children:e.name||(0,x.jsx)(`span`,{className:`text-muted-foreground italic`,children:`未命名`})}),(0,x.jsx)(g,{className:`font-mono text-xs truncate max-w-[300px]`,title:e.urlPattern,children:e.urlPattern}),(0,x.jsx)(g,{children:(0,x.jsx)(f,{variant:`outline`,className:`text-xs`,children:e.method||`*`})}),(0,x.jsx)(g,{children:(0,x.jsx)(f,{variant:e.statusCode>=400?`destructive`:e.statusCode>=300?`secondary`:`default`,children:e.statusCode})}),(0,x.jsx)(g,{children:e.bodyType===`file`?(0,x.jsxs)(f,{variant:`secondary`,children:[(0,x.jsx)(ue,{}),`文件`]}):(0,x.jsxs)(f,{variant:`outline`,children:[(0,x.jsx)(a,{}),`内容`]})}),(0,x.jsx)(g,{className:`text-xs text-muted-foreground font-mono`,children:e.delay?`${e.delay}ms`:`-`}),(0,x.jsx)(g,{children:e.headers&&Object.keys(e.headers).length>0?(0,x.jsx)(f,{variant:`secondary`,className:`text-xs`,children:Object.keys(e.headers).length}):(0,x.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`-`})}),(0,x.jsx)(g,{children:(0,x.jsxs)(`div`,{className:`flex gap-1`,children:[(0,x.jsx)(r,{variant:`ghost`,size:`icon-sm`,onClick:()=>Ae(e),className:`text-muted-foreground hover:text-primary`,"aria-label":`编辑 Mock 规则`,children:(0,x.jsx)(fe,{})}),(0,x.jsx)(r,{variant:`ghost`,size:`icon-sm`,onClick:()=>Ne(e.id),className:`text-muted-foreground hover:text-destructive`,"aria-label":`删除 Mock 规则`,children:(0,x.jsx)(l,{})})]})})]},e.id))})]})}),(0,x.jsx)(le,{open:T,onOpenChange:E,children:(0,x.jsxs)(ce,{className:`p-0 flex flex-col`,resizable:!0,defaultWidth:700,storageKey:`mock-config-editor`,children:[(0,x.jsx)(pe,{className:`px-4 pt-4 pb-2`,children:(0,x.jsx)(me,{className:`text-base`,children:D==null?`新建 Mock 规则`:`编辑 Mock 规则`})}),(0,x.jsx)(u,{}),(0,x.jsxs)(`div`,{className:`app-panel-content`,children:[(0,x.jsxs)(`div`,{className:`app-field-group`,children:[(0,x.jsx)(`label`,{className:`text-xs font-medium text-muted-foreground`,children:`规则名称`}),(0,x.jsx)(c,{value:O.name,onChange:e=>$(`name`,e.target.value),placeholder:`如:模拟欠费状态`,className:`h-8`})]}),(0,x.jsxs)(`div`,{className:`app-field-group`,children:[(0,x.jsx)(`label`,{className:`text-xs font-medium text-muted-foreground`,children:`URL 匹配(支持正则)`}),(0,x.jsx)(c,{value:O.urlPattern,onChange:e=>$(`urlPattern`,e.target.value),placeholder:`如:/api/console/user/corp/.*`,className:`h-8 font-mono text-sm`})]}),(0,x.jsxs)(`div`,{className:`grid grid-cols-3 gap-3`,children:[(0,x.jsxs)(`div`,{className:`app-field-group`,children:[(0,x.jsx)(`label`,{className:`text-xs font-medium text-muted-foreground`,children:`HTTP 方法`}),(0,x.jsxs)(`select`,{value:O.method,onChange:e=>$(`method`,e.target.value),className:`flex h-8 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm`,children:[(0,x.jsx)(`option`,{value:`*`,children:`全部`}),(0,x.jsx)(`option`,{value:`GET`,children:`GET`}),(0,x.jsx)(`option`,{value:`POST`,children:`POST`}),(0,x.jsx)(`option`,{value:`PUT`,children:`PUT`}),(0,x.jsx)(`option`,{value:`DELETE`,children:`DELETE`}),(0,x.jsx)(`option`,{value:`PATCH`,children:`PATCH`})]})]}),(0,x.jsxs)(`div`,{className:`app-field-group`,children:[(0,x.jsx)(`label`,{className:`text-xs font-medium text-muted-foreground`,children:`响应状态码`}),(0,x.jsx)(c,{type:`number`,value:O.statusCode,onChange:e=>$(`statusCode`,parseInt(e.target.value)||200),className:`h-8`})]}),(0,x.jsxs)(`div`,{className:`app-field-group`,children:[(0,x.jsx)(`label`,{className:`text-xs font-medium text-muted-foreground`,children:`响应延迟 (ms)`}),(0,x.jsx)(c,{type:`number`,value:O.delay,onChange:e=>$(`delay`,parseInt(e.target.value)||0),placeholder:`0`,className:`h-8`})]})]}),(0,x.jsxs)(`div`,{className:`app-field-group`,children:[(0,x.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,x.jsx)(`label`,{className:`text-xs font-medium text-muted-foreground`,children:`响应内容 (Body)`}),(0,x.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,x.jsxs)(r,{variant:`outline`,size:`sm`,className:`h-6 text-xs`,onClick:De,children:[(0,x.jsx)(y,{className:`h-3 w-3 mr-1`}),`从文件加载`]}),(0,x.jsxs)(r,{variant:`outline`,size:`sm`,className:`h-6 text-xs`,onClick:async()=>{let e=window.prompt(`请输入文件 URL:`);if(e)try{let t=await fetch(e);if((t.headers.get(`content-type`)||``).startsWith(`image/`)||e.match(/\.(png|jpg|jpeg|gif|webp|svg|ico|bmp)$/i)){let e=await t.blob(),n=new FileReader;n.onload=()=>{$(`body`,n.result)},n.readAsDataURL(e)}else $(`body`,await t.text())}catch(e){alert(`无法加载文件: `+e.message)}},children:[(0,x.jsx)(y,{className:`h-3 w-3 mr-1`}),`从URL导入`]}),z&&(0,x.jsx)(`span`,{className:`text-xs text-red-500`,children:z}),O.body.trim()&&ie(ae())&&(0,x.jsxs)(r,{variant:`outline`,size:`sm`,className:`h-6 text-xs`,onClick:Fe,disabled:U,children:[(0,x.jsx)(re,{className:`h-3 w-3 mr-1`}),U?`修复中...`:`AI修复`]}),(0,x.jsxs)(r,{variant:`ghost`,size:`sm`,className:`h-6 text-xs`,onClick:Pe,disabled:G,children:[(0,x.jsx)(a,{className:`h-3 w-3 mr-1`}),G?`格式化中...`:`智能格式化`]})]})]}),(0,x.jsx)(`input`,{ref:P,type:`file`,className:`hidden`,onChange:Oe,accept:`image/*,.json,.html,.htm,.txt,.js,.css,.xml,.csv`}),O.body.trim()&&be(O.body)?(0,x.jsxs)(`div`,{className:`space-y-2`,children:[(0,x.jsx)(`div`,{className:`border rounded-md p-2 bg-muted/30`,children:(0,x.jsx)(`img`,{src:O.body,alt:`Preview`,className:`max-w-full max-h-96 object-contain`})}),(0,x.jsxs)(`div`,{className:`flex gap-2`,children:[(0,x.jsx)(r,{variant:`outline`,size:`sm`,className:`h-6 text-xs`,onClick:()=>$(`body`,``),children:`删除图片`}),(0,x.jsx)(r,{variant:`ghost`,size:`sm`,className:`h-6 text-xs`,onClick:()=>{navigator.clipboard.writeText(O.body),alert(`图片内容已复制到剪贴板`)},children:`复制内容`})]})]}):(0,x.jsxs)(`div`,{ref:we,className:`relative group`,children:[(0,x.jsx)(_e,{value:O.body,onChange:e=>$(`body`,e),placeholder:`支持 JSON, HTML, JS, CSS 等格式,或从文件/URL导入`,height:`${N}px`}),(0,x.jsx)(`div`,{className:`absolute bottom-0 left-0 right-0 h-4 cursor-ns-resize flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity bg-gradient-to-t from-border/50 to-transparent`,onMouseDown:je,children:(0,x.jsx)(ne,{className:`h-4 w-4 text-muted-foreground`})})]}),V&&(0,x.jsxs)(`div`,{className:`flex items-start gap-2 p-2 rounded-md bg-red-50 dark:bg-red-950/20 border border-red-200 dark:border-red-900`,children:[(0,x.jsx)(`span`,{className:`text-xs text-red-600 dark:text-red-400 font-medium`,children:`语法错误:`}),(0,x.jsx)(`span`,{className:`text-xs text-red-600 dark:text-red-400 flex-1`,children:V})]})]}),(0,x.jsxs)(`div`,{className:`space-y-2`,children:[(0,x.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,x.jsxs)(`button`,{type:`button`,className:`flex items-center gap-1 text-xs font-medium text-muted-foreground hover:text-foreground`,onClick:()=>M(!j),children:[j?(0,x.jsx)(ee,{className:`h-3 w-3`}):(0,x.jsx)(te,{className:`h-3 w-3`}),`响应头 (Headers)`,Object.keys(O.headers||{}).length>0&&(0,x.jsx)(f,{variant:`secondary`,className:`ml-1 text-xs`,children:Object.keys(O.headers||{}).length})]}),q&&(0,x.jsxs)(`div`,{className:`flex items-center gap-2 text-xs`,children:[(0,x.jsxs)(`span`,{className:`text-amber-600 dark:text-amber-400`,children:[`检测到内容类型变更,建议更新为 `,q,`?`]}),(0,x.jsx)(r,{variant:`outline`,size:`sm`,className:`h-6 text-xs`,onClick:()=>{$(`headers`,{...O.headers||{},"Content-Type":q}),J(null)},children:`更新`}),(0,x.jsx)(r,{variant:`ghost`,size:`sm`,className:`h-6 text-xs`,onClick:()=>J(null),children:`忽略`})]})]}),j&&(0,x.jsxs)(`div`,{className:`space-y-2 pl-4 border-l-2 border-muted`,children:[Object.entries(O.headers||{}).length>0?(0,x.jsx)(`div`,{className:`space-y-1`,children:Object.entries(O.headers||{}).map(([e,t])=>(0,x.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,x.jsx)(c,{value:e,onChange:n=>{let r={...O.headers};delete r[e],n.target.value&&(r[n.target.value]=t),$(`headers`,r)},placeholder:`Header 名称`,className:`h-7 font-mono text-xs flex-1`}),(0,x.jsx)(c,{value:t,onChange:t=>{$(`headers`,{...O.headers,[e]:t.target.value})},placeholder:`Header 值`,className:`h-7 font-mono text-xs flex-1`}),(0,x.jsx)(r,{variant:`ghost`,size:`sm`,className:`h-7 w-7 p-0 text-muted-foreground hover:text-destructive`,onClick:()=>{let t={...O.headers};delete t[e],$(`headers`,t)},children:(0,x.jsx)(l,{className:`h-3.5 w-3.5`})})]},e))}):(0,x.jsx)(`p`,{className:`text-xs text-muted-foreground italic`,children:`暂无自定义响应头`}),(0,x.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,x.jsx)(c,{value:F,onChange:e=>I(e.target.value),placeholder:`Header 名称`,className:`h-7 font-mono text-xs flex-1`}),(0,x.jsx)(c,{value:L,onChange:e=>R(e.target.value),placeholder:`Header 值`,className:`h-7 font-mono text-xs flex-1`}),(0,x.jsx)(r,{variant:`outline`,size:`sm`,className:`h-7`,onClick:()=>{F&&L&&($(`headers`,{...O.headers,[F]:L}),I(``),R(``))},disabled:!F||!L,children:(0,x.jsx)(s,{className:`h-3.5 w-3.5`})})]})]})]}),(0,x.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,x.jsx)(o,{checked:O.enabled,onCheckedChange:e=>$(`enabled`,!!e)}),(0,x.jsx)(`label`,{className:`text-sm`,children:`启用此规则`})]})]}),(0,x.jsx)(u,{}),(0,x.jsxs)(`div`,{className:`px-4 py-3 flex justify-end gap-2`,children:[(0,x.jsx)(r,{variant:`outline`,size:`sm`,onClick:()=>E(!1),children:`取消`}),(0,x.jsx)(de,{size:`sm`,onClick:Q,disabled:k||!O.urlPattern,children:k?`保存中...`:`保存`})]})]})})]})}export{S as MockConfig};
|