@fairys/mocker-cli 0.0.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.
Files changed (65) hide show
  1. package/README.md +36 -0
  2. package/bin/fairys-mocker +22 -0
  3. package/esm/base.d.ts +28 -0
  4. package/esm/base.js +80 -0
  5. package/esm/ci.d.ts +2 -0
  6. package/esm/ci.js +49 -0
  7. package/esm/connect.d.ts +15 -0
  8. package/esm/connect.js +38 -0
  9. package/esm/controller/base.d.ts +2 -0
  10. package/esm/controller/base.js +3 -0
  11. package/esm/controller/index.d.ts +3 -0
  12. package/esm/controller/index.js +3 -0
  13. package/esm/controller/mock.router.d.ts +21 -0
  14. package/esm/controller/mock.router.js +497 -0
  15. package/esm/controller/proxy.router.d.ts +18 -0
  16. package/esm/controller/proxy.router.js +503 -0
  17. package/esm/index.d.ts +5 -0
  18. package/esm/index.js +5 -0
  19. package/esm/main.d.ts +15 -0
  20. package/esm/main.js +38 -0
  21. package/esm/plugins/rsbuild.d.ts +2 -0
  22. package/esm/plugins/rsbuild.js +12 -0
  23. package/esm/router/base.d.ts +12 -0
  24. package/esm/router/base.js +23 -0
  25. package/esm/router/index.d.ts +3 -0
  26. package/esm/router/index.js +3 -0
  27. package/esm/router/mock.d.ts +7 -0
  28. package/esm/router/mock.js +32 -0
  29. package/esm/router/proxy.d.ts +14 -0
  30. package/esm/router/proxy.js +67 -0
  31. package/esm/utils/decorator.d.ts +18 -0
  32. package/esm/utils/decorator.js +55 -0
  33. package/esm/utils/index.d.ts +2 -0
  34. package/esm/utils/index.js +2 -0
  35. package/esm/utils/mcok.proxy.d.ts +36 -0
  36. package/esm/utils/mcok.proxy.js +141 -0
  37. package/esm/utils/utils.d.ts +20 -0
  38. package/esm/utils/utils.js +31 -0
  39. package/package.json +52 -0
  40. package/public/_fairys_mocker/favicon.png +0 -0
  41. package/public/_fairys_mocker/index.html +1 -0
  42. package/public/_fairys_mocker/static/css/index.2ba69ff5.css +1 -0
  43. package/public/_fairys_mocker/static/js/514.950758f1.js +2 -0
  44. package/public/_fairys_mocker/static/js/514.950758f1.js.LICENSE.txt +5 -0
  45. package/public/_fairys_mocker/static/js/index.f70ed1dc.js +1 -0
  46. package/public/_fairys_mocker/static/js/lib-react.2748fa4b.js +2 -0
  47. package/public/_fairys_mocker/static/js/lib-react.2748fa4b.js.LICENSE.txt +49 -0
  48. package/src/base.ts +125 -0
  49. package/src/ci.ts +61 -0
  50. package/src/connect.ts +62 -0
  51. package/src/controller/base.ts +4 -0
  52. package/src/controller/index.ts +3 -0
  53. package/src/controller/mock.router.ts +175 -0
  54. package/src/controller/proxy.router.ts +182 -0
  55. package/src/index.ts +5 -0
  56. package/src/main.ts +59 -0
  57. package/src/plugins/rsbuild.ts +14 -0
  58. package/src/router/base.ts +36 -0
  59. package/src/router/index.ts +3 -0
  60. package/src/router/mock.ts +38 -0
  61. package/src/router/proxy.ts +89 -0
  62. package/src/utils/decorator.ts +90 -0
  63. package/src/utils/index.ts +2 -0
  64. package/src/utils/mcok.proxy.ts +162 -0
  65. package/src/utils/utils.ts +46 -0
@@ -0,0 +1,5 @@
1
+ /*!
2
+ Mock - 模拟请求 & 模拟数据
3
+ https://github.com/nuysoft/Mock
4
+ 墨智 mozhi.gyy@taobao.com nuysoft@gmail.com
5
+ */
@@ -0,0 +1 @@
1
+ (()=>{"use strict";var e,t,r,n,s={711(e,t,r){var n=r(85),s=r(873),o=r(41),i=r(424),a=r.n(i),l=r(346),c=r(990);class d extends l.ProxyInstanceObject{constructor(...e){var t;super(...e),t=this,(0,c._)(this,"open",function(e,r){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:3e3,s=new Date().valueOf().toString();t.store.messageList.push((0,l.ref)({type:e,message:r,id:s}));let o=setTimeout(()=>{t.store.messageList=t.store.messageList.filter(e=>e.id!==s),clearTimeout(o)},n)})}}let x=new d()._ctor({tabKey:"mock",messageList:[],isServer:!0}),{MainProxyProvider:u,useMainProxyStore:m}=(0,l.createCommonMainStore)({proxyInstance:x,namespace:"global"}),b=window.location.origin;function h(e){let{columns:t,dataSource:r,rowKey:s}=e,i=(0,o.useMemo)(()=>(0,n.jsx)("tr",{className:"bg-zinc-100 dark:bg-zinc-800 sticky -top-px z-10",children:t.map((e,t)=>(0,n.jsx)("th",{className:"px-2 py-2 text-left text-xs font-medium text-zinc-700 dark:text-zinc-300 border-b border-zinc-200 dark:border-zinc-700",children:e.title},e.dataIndex||t))}),[t]);return(0,n.jsx)("div",{className:"flex-1 flex flex-col box-border overflow-auto",children:(0,n.jsxs)("table",{className:"border-collapse min-w-full border border-zinc-200 dark:border-zinc-700 relative",children:[(0,n.jsx)("thead",{children:i}),(0,n.jsx)("tbody",{children:r.map((e,r)=>{let o="function"==typeof s?s(e):s?e[s]:r;return(0,n.jsx)("tr",{className:"hover:bg-zinc-50 dark:hover:bg-zinc-800",children:t.map(t=>{let s=t.dataIndex?e[t.dataIndex]:e;if(t.isIndex&&(s=r+1),t.render){var i;s=null==(i=t.render)?void 0:i.call(t,e,r)}return(0,n.jsx)("td",{className:`px-2 py-2 border-b border-zinc-200 dark:border-zinc-700 ${t.tdClassName||""}`,children:s},`${o}-${t.dataIndex}`)})},o)})})]})})}var p=r(224);let f=e=>{let{value:t,onChange:r,placeholder:s,className:o}=e;return(0,n.jsx)(p.A,{value:t,language:"json",placeholder:s,onChange:e=>null==r?void 0:r(e.target.value),padding:15,className:o,style:{fontFamily:"ui-monospace,SFMono-Regular,SF Mono,Consolas,Liberation Mono,Menlo,monospace",minHeight:280}})};var g=r(144);function y(){let{state:e,proxyInstance:t}=m(),r=e.isServer,{state:s,dispatch:i,proxyInstance:c}=(0,l.useProxyStore)({rootDir:"",dir:"mock",fileName:"index.mock",mockList:[],response:"",isModalOpen:!1,currentIndex:null,modalBody:"",isEnabledStart:!1},{sync:!0}),d=s.mockList,x=s.response,u=s.isModalOpen,p=s.currentIndex,y=s.modalBody,k=s.rootDir,v=s.dir,j=s.fileName,z=s.isEnabledStart,N=async()=>{try{let e=await fetch(`${b}/_fairys/_mock/_is_enabled`).then(e=>e.json());200===e.code&&i({isEnabledStart:e.data})}catch(e){console.error("检查 mock 配置服务是否启用失败:",e)}};(0,o.useEffect)(()=>{N()},[]);let w=async()=>{try{let e=await fetch(`${b}/_fairys/_mock/_destroy`).then(e=>e.json());200===e.code?(i({isEnabledStart:!1}),t.open("success","销毁 Mock 数据服务成功")):t.open("error",e.message||"销毁 Mock 数据服务失败")}catch(e){console.error("销毁 mock 数据服务失败:",e)}},C=async()=>{try{let e=await fetch(`${b}/_fairys/_mock/_start`).then(e=>e.json());200===e.code?(t.open("success","加载 Mock 数据服务成功"),i({isEnabledStart:!0})):t.open("error",e.message||"加载 Mock 数据服务失败")}catch(e){console.error("加载 mock 数据服务失败:",e)}},S=async e=>{try{let t;if(!0===e)t=await fetch(`${b}/_fairys/_mock`);else{let e=`dir=${decodeURIComponent(v)}&fileName=${decodeURIComponent(j)}&rootDir=${decodeURIComponent(k)}`;t=await fetch(`${b}/_fairys/_mock?${e}`)}let r=await t.json();200===r.code?i({mockList:r.data,dir:r.dir,fileName:r.fileName,rootDir:r.rootDir}):i({mockList:[]})}catch(e){t.store.isServer=!1,console.error("获取缓存数据失败:",e)}};(0,o.useEffect)(()=>{S(!0)},[]);let O=(e,t,r)=>{i({mockList:(c.store.mockList||[]).map((n,s)=>s===e?{...n,[t]:r}:n)})},_=async e=>{e.preventDefault();let s=!0,o="";for(let e=0;e<d.length;e++){let t=d[e];if(!t.url.trim()){s=!1,o=`接口配置 #${e+1} 的 接口地址 不能为空`;break}if(!t.method){s=!1,o=`接口配置 #${e+1} 的 请求方法 不能为空`;break}if(!t.status.trim()){s=!1,o=`接口配置 #${e+1} 的 状态码 不能为空`;break}if(!t.body){s=!1,o=`接口配置 #${e+1} 的 响应体 不能为空`;break}}if(!s)return void t.open("error",o);let l=new Map;for(let e=0;e<d.length;e++){let t=d[e],r=`${t.url.trim()}:${t.method}`;if(l.has(r)){var c;null==(c=l.get(r))||c.push(e+1)}else l.set(r,[e+1])}if(l.size>0){let e=[];for(let[t,r]of l)r.length>1&&e.push((0,n.jsxs)("div",{children:["第 ",r.join(",")," 行数据 接口地址和请求方法 组合重复;"]},t));if(e.length>0)return void t.open("error",e,5e3)}try{if(r){let e=await fetch(`${b}/_fairys/_mock`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({mockList:d,dir:v,fileName:j,rootDir:k})}),r=await e.json();d.length>0?i({response:JSON.stringify(r,null,2)}):200===r.code&&t.open("success","保存成功"),i({rootDir:r.rootDir})}else if(d.length>0){let e=d.map(e=>(function(e){let{data:t,...r}={...e.body},n={},s=Object.keys(t),o=e.listCount||20;for(let e=0;e<s.length;e++){let r=s[e],i=t[r];if(/^(\_\|)/.test(r)){let[e,t,s]=r.split("|"),l=`${s||""}`.trim();i&&(n[t]=Array.from({length:l?Number(l):o},()=>a().mock(i)))}else Object.assign(n,a().mock({[r]:i}))}r.data=n;let i=0;if(Array.isArray(e.delay)){let[t,r]=e.delay;i=Math.floor(Math.random()*(r-t+1))+t}else i=e.delay;return{...e,body:r,delay:i}})(e));i({response:JSON.stringify(e,null,2)})}else t.open("success","操作成功")}catch(e){i({response:"Error: "+e.message})}},I=()=>{i({currentIndex:void 0,modalBody:"",isModalOpen:!1}),document.body.style.overflow="auto"};return(0,n.jsxs)("div",{className:"space-y-6 flex-1 flex flex-col box-border overflow-hidden",children:[(0,n.jsxs)("div",{className:"mb-6 text-xs text-zinc-600 dark:text-zinc-300 box-border flex justify-between",children:[(0,n.jsxs)("div",{children:["当前配置总条数: ",d.length]}),r?(0,n.jsxs)("div",{className:"flex gap-2",children:[(0,n.jsxs)("button",{type:"button",onClick:C,className:"px-3 py-1 bg-blue-500 text-white rounded-md hover:bg-blue-600 transition-colors text-xs",children:[z?"重启":"启动"," mock 数据服务"]}),z?(0,n.jsx)("button",{type:"button",onClick:w,className:"px-3 py-1 bg-red-500 text-white rounded-md hover:bg-red-600 transition-colors text-xs",children:"销毁 mock 数据服务"}):(0,n.jsx)(o.Fragment,{})]}):(0,n.jsx)(o.Fragment,{})]}),(0,n.jsxs)("div",{className:"mb-6",children:[(0,n.jsx)("label",{className:"block text-xs font-medium text-zinc-700 dark:text-zinc-300 mb-1",children:"数据保存到本地"}),(0,n.jsxs)("div",{className:"flex gap-4",children:[(0,n.jsxs)("div",{className:"flex-1 flex items-center gap-2",children:[(0,n.jsx)("label",{className:"block text-xs font-medium text-zinc-700 dark:text-zinc-300 mb-1",children:"根目录"}),(0,n.jsx)("input",{type:"text",value:k,onChange:e=>{i({rootDir:e.target.value})},className:"flex-1 px-2 py-1 border border-zinc-300 dark:border-zinc-700 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-zinc-800 dark:text-white text-xs"})]}),(0,n.jsxs)("div",{className:"flex-1 flex items-center gap-2",children:[(0,n.jsx)("label",{className:"block text-xs font-medium text-zinc-700 dark:text-zinc-300 mb-1",children:"目录名"}),(0,n.jsx)("input",{type:"text",value:v,onChange:e=>{i({dir:e.target.value})},className:"flex-1 px-2 py-1 border border-zinc-300 dark:border-zinc-700 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-zinc-800 dark:text-white text-xs"})]}),(0,n.jsxs)("div",{className:"flex-1 flex items-center gap-2",children:[(0,n.jsx)("label",{className:"block text-xs font-medium text-zinc-700 dark:text-zinc-300 mb-1",children:"文件名"}),(0,n.jsx)("input",{type:"text",value:j,onChange:e=>{i({fileName:e.target.value})},className:"flex-1 px-2 py-1 border border-zinc-300 dark:border-zinc-700 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-zinc-800 dark:text-white text-xs"})]}),(0,n.jsx)("button",{type:"button",onClick:()=>S(!1),className:"px-3 py-1 bg-blue-500 text-white rounded-md hover:bg-blue-600 transition-colors whitespace-nowrap text-xs",children:"查询"})]}),(0,n.jsx)("p",{className:"text-xs text-zinc-500 dark:text-zinc-400 mt-1",children:"默认保存到当前工作目录的 mock 文件夹"})]}),d.length>0?(0,n.jsx)("div",{className:"flex-1 flex flex-col box-border overflow-auto",children:(0,n.jsx)(h,{columns:[{title:"#",isIndex:!0,tdClassName:"px-2 py-2 text-xs text-zinc-800 dark:text-zinc-100 border-b border-zinc-200 dark:border-zinc-700"},{title:"接口地址",dataIndex:"url",render:(e,t)=>(0,n.jsx)("input",{type:"text",placeholder:"请输入接口地址",value:e.url,onChange:e=>O(t,"url",e.target.value),className:"w-full px-2 py-1 border border-zinc-300 dark:border-zinc-700 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-zinc-800 dark:text-white text-xs"})},{title:"请求方法",dataIndex:"method",render:(e,t)=>(0,n.jsxs)("select",{value:e.method,onChange:e=>O(t,"method",e.target.value),className:"w-full px-2 py-1 border border-zinc-300 dark:border-zinc-700 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-zinc-800 dark:text-white text-xs",children:[(0,n.jsx)("option",{value:"GET",children:"GET"}),(0,n.jsx)("option",{value:"POST",children:"POST"}),(0,n.jsx)("option",{value:"PUT",children:"PUT"}),(0,n.jsx)("option",{value:"DELETE",children:"DELETE"}),(0,n.jsx)("option",{value:"PATCH",children:"PATCH"}),(0,n.jsx)("option",{value:"HEAD",children:"HEAD"}),(0,n.jsx)("option",{value:"OPTIONS",children:"OPTIONS"})]})},{title:"状态码",dataIndex:"status",render:(e,t)=>(0,n.jsx)("input",{type:"text",value:e.status,onChange:e=>O(t,"status",e.target.value),className:"w-full px-2 py-1 border border-zinc-300 dark:border-zinc-700 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-zinc-800 dark:text-white text-xs",placeholder:"例如: 200, 400, 500"})},{title:"响应延迟时间(ms)",dataIndex:"delay",render:(e,t)=>(0,n.jsx)("input",{type:"text",value:Array.isArray(e.delay)?`${e.delay[0]},${e.delay[1]}`:e.delay||"",onChange:e=>{let r=e.target.value;if(r.includes(",")){let[e,n]=r.split(",").map(Number);O(t,"delay",[e,n])}else O(t,"delay",parseInt(r)||0)},className:"w-full px-2 py-1 border border-zinc-300 dark:border-zinc-700 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-zinc-800 dark:text-white text-xs",placeholder:"例如: 1000 或 500,2000"})},{title:"生成数据条数",dataIndex:"listCount",render:(e,t)=>(0,n.jsx)("input",{type:"number",value:e.listCount,onChange:e=>O(t,"listCount",parseInt(e.target.value)||1),min:"1",max:"100",className:"w-full px-2 py-1 border border-zinc-300 dark:border-zinc-700 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-zinc-800 dark:text-white text-xs"})},{title:"响应体数据",dataIndex:"body",render:e=>(0,n.jsx)("div",{className:"text-zinc-500 dark:text-zinc-400 text-xs w-[400px]",children:JSON.stringify(e.body,null,2)})},{title:"操作",dataIndex:"operation",render:(e,t)=>(0,n.jsxs)("div",{className:"flex space-x-1",children:[(0,n.jsx)("button",{type:"button",onClick:()=>{i({currentIndex:t,modalBody:JSON.stringify(d[t].body,null,2),isModalOpen:!0}),document.body.style.overflow="hidden"},className:"px-2 py-0.5 bg-blue-500 text-white rounded-md hover:bg-blue-600 transition-colors text-xs",children:"编辑响应体数据"}),(0,n.jsx)("button",{type:"button",onClick:()=>{i({mockList:(c.store.mockList||[]).filter((e,r)=>r!==t)})},className:"px-2 py-0.5 bg-red-500 text-white rounded-md hover:bg-red-600 transition-colors text-xs",children:"删除"})]})}],dataSource:d})}):(0,n.jsx)("div",{className:"text-center py-8 text-zinc-500 dark:text-zinc-400",children:'暂无接口配置,请点击"添加接口配置"按钮添加'}),(0,n.jsxs)("div",{className:"flex justify-center",children:[(0,n.jsx)("button",{type:"button",onClick:()=>{i({mockList:[...c.store.mockList||[]].concat([{url:"",method:"POST",status:"200",delay:0,body:{code:200,data:{id:"@id",name:"@name",email:"@email"},message:"success"},listCount:20}])})},className:"px-3 py-1 bg-green-500 text-white rounded-md hover:bg-green-600 transition-colors mr-4 text-xs",children:"添加接口配置"}),(0,n.jsx)("button",{type:"button",onClick:_,className:"px-4 py-1 bg-blue-500 text-white rounded-md hover:bg-blue-600 transition-colors text-xs",children:"保存配置"})]}),x&&(0,n.jsx)("div",{className:"fixed inset-0 bg-black/30 flex items-center justify-center z-50",children:(0,n.jsxs)("div",{className:"bg-white/90 dark:bg-zinc-900/90 backdrop-blur-sm rounded-lg shadow-xl p-4 flex flex-col w-full max-w-2xl max-h-[80%]",children:[(0,n.jsxs)("div",{className:"flex justify-between items-center mb-2",children:[(0,n.jsx)("h2",{className:"text-sm font-medium text-zinc-800 dark:text-zinc-100",children:"mock 数据"}),(0,n.jsxs)("div",{className:"flex gap-4",children:[(0,n.jsx)("button",{type:"button",title:"复制",onClick:()=>{navigator.clipboard.writeText(x),t.open("success","复制成功")},className:"px-2 py-0.5 bg-blue-500 text-white rounded-md hover:bg-blue-600 transition-colors text-xs",children:"复制"}),(0,n.jsx)("button",{type:"button",onClick:()=>i({response:""}),className:"px-2 py-0.5 bg-gray-500 text-white rounded-md hover:bg-gray-600 transition-colors text-xs",children:"关闭"})]})]}),(0,n.jsx)("pre",{className:"flex-1 overflow-auto bg-zinc-100 dark:bg-zinc-800 p-3 rounded-md overflow-x-auto text-xs text-zinc-800 dark:text-zinc-100",children:x})]})}),u&&null!==p&&(null==d?void 0:d[p])&&(0,g.createPortal)((0,n.jsx)("div",{className:"fixed inset-0 bg-black/30 flex items-center justify-center z-50 box-border",children:(0,n.jsxs)("div",{className:"bg-white/90 dark:bg-zinc-900/90 backdrop-blur-sm rounded-lg shadow-xl p-4 w-full max-w-2xl box-border",children:[(0,n.jsxs)("div",{className:"flex justify-between items-center mb-3 box-border",children:[(0,n.jsxs)("h2",{className:"text-sm font-medium text-zinc-700 dark:text-zinc-300",children:["编辑响应体数据 - 接口配置 #",p+1]}),(0,n.jsx)("button",{type:"button",onClick:I,className:"text-zinc-500 hover:text-zinc-700 dark:text-zinc-400 dark:hover:text-zinc-200",children:"\xd7"})]}),(0,n.jsxs)("div",{className:"space-y-3",children:[(0,n.jsx)("div",{children:(0,n.jsxs)("label",{className:"block text-xs font-medium text-zinc-700 dark:text-zinc-300 mb-1",children:["响应体格式 ",(0,n.jsx)("span",{className:"text-red-500",children:"*"})]})}),(0,n.jsxs)("div",{children:[(0,n.jsx)("label",{className:"block text-xs font-medium text-zinc-700 dark:text-zinc-300 mb-1",children:"生成数据条数"}),(0,n.jsx)("input",{type:"number",value:d[p].listCount,onChange:e=>O(p,"listCount",parseInt(e.target.value)||1),min:"1",max:"100",className:"w-full px-2 py-1 border border-zinc-300 dark:border-zinc-700 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-zinc-800 dark:text-white text-xs"})]}),(0,n.jsxs)("div",{children:[(0,n.jsxs)("label",{className:"block text-xs font-medium text-zinc-700 dark:text-zinc-300 mb-1",children:["响应体 JSON ",(0,n.jsx)("span",{className:"text-red-500",children:"*"})]}),(0,n.jsx)(f,{value:y,onChange:e=>i({modalBody:e}),placeholder:'例如: {"code": 200, "data": {"id": "@id", "name": "@name"}, "message": "success"} 或 {"code": 200, "data": {"rows": [{"id": "@id", "name": "@name"}], "total": "@integer(20, 100)"}, "message": "success"}',className:"w-full px-2 py-1 border border-zinc-300 dark:border-zinc-700 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-zinc-800 dark:text-white min-h-[300px] text-xs"})]})]}),(0,n.jsxs)("div",{className:"text-xs text-zinc-500 dark:text-zinc-400 mt-1",children:["支持使用 ",(0,n.jsx)("a",{href:"http://mockjs.com/examples.html",target:"_blank",rel:"noopener noreferrer",className:"text-blue-500 hover:underline",children:"Mock.js 语法"}),",如 @id, @name, @email 等,",(0,n.jsxs)("div",{className:"text-red-500",children:["数组数据为特殊处理,使用`_|`开头,后面拼接字段:",(0,n.jsx)("b",{children:"_|字段|条数"})," 或者 ",(0,n.jsx)("b",{children:"_|字段"})]})]}),(0,n.jsxs)("div",{className:"flex justify-end space-x-2 mt-3 box-border",children:[(0,n.jsx)("button",{type:"button",onClick:I,className:"px-3 py-1 border border-zinc-300 dark:border-zinc-600 bg-white dark:bg-zinc-700 text-zinc-800 dark:text-zinc-200 rounded-md hover:bg-zinc-100 dark:hover:bg-zinc-600 transition-colors text-xs",children:"取消"}),(0,n.jsx)("button",{type:"button",onClick:()=>{if(null!==p)try{let e=Function("return "+y)();O(p,"body",e),I()}catch(e){t.open("error","JSON 格式错误,请检查输入")}},className:"px-3 py-1 bg-blue-500 text-white rounded-md hover:bg-blue-600 transition-colors text-xs",children:"保存"})]})]})}),document.body)]})}function k(){let{state:e,proxyInstance:t}=m(),r=e.isServer,{state:s,dispatch:i,proxyInstance:a}=(0,l.useProxyStore)({rootDir:"",dir:"mock",fileName:"proxy",proxyList:[],response:"",isModalOpen:!1,currentIndex:null,modalBody:"",isEnabledStart:!1},{sync:!0}),c=s.proxyList,d=s.response,x=s.isModalOpen,u=s.currentIndex,p=s.modalBody,y=s.rootDir,k=s.dir,v=s.fileName,j=s.isEnabledStart,z=async()=>{try{let e=await fetch(`${b}/_fairys/_proxy/_is_enabled`).then(e=>e.json());200===e.code&&i({isEnabledStart:e.data})}catch(e){console.error("检查 Proxy 配置服务是否启用失败:",e)}};(0,o.useEffect)(()=>{z()},[]);let N=async()=>{try{let e=await fetch(`${b}/_fairys/_proxy/_destroy`).then(e=>e.json());200===e.code?(i({isEnabledStart:!1}),t.open("success","销毁 Proxy 服务成功")):t.open("error",e.message||"销毁 Proxy 服务失败")}catch(e){console.error("销毁 Proxy 服务失败:",e)}},w=async()=>{try{let e=await fetch(`${b}/_fairys/_proxy/_start`).then(e=>e.json());200===e.code?(t.open("success","加载 Proxy 服务成功"),i({isEnabledStart:!0})):t.open("error",e.message||"加载 Proxy 服务失败")}catch(e){console.error("加载 Proxy 服务失败:",e)}},C=async()=>{try{let e=`dir=${decodeURIComponent(k)}&fileName=${decodeURIComponent(v)}&rootDir=${decodeURIComponent(y)}`,t=await fetch(`${b}/_fairys/_proxy?${e}`),r=await t.json();if(200===r.code){let e=r.data;Array.isArray(r.data)||(e=[]),i({proxyList:e,dir:r.dir,fileName:r.fileName,rootDir:r.rootDir})}else i({proxyList:[]})}catch(e){t.store.isServer=!1,console.error("获取缓存数据失败:",e)}};(0,o.useEffect)(()=>{C()},[]);let S=(e,t,r)=>{i({proxyList:(a.store.proxyList||[]).map((n,s)=>s===e?{...n,[t]:r}:n)})},O=async e=>{e.preventDefault();let s=!0,o="";for(let e=0;e<c.length;e++){let t=c[e];if(!t.path.trim()){s=!1,o=`代理配置 #${e+1} 的 接口地址 不能为空`;break}if(!t.target.trim()){s=!1,o=`代理配置 #${e+1} 的 目标地址 不能为空`;break}}if(!s)return void t.open("error",o);let a=new Map;for(let e=0;e<c.length;e++){let t=c[e],r=`${t.path.trim()}`;if(a.has(r)){var l;null==(l=a.get(r))||l.push(e+1)}else a.set(r,[e+1])}if(a.size>0){let e=[];for(let[t,r]of a)r.length>1&&e.push((0,n.jsxs)("div",{children:["第 ",r.join(",")," 行数据 接口地址重复;"]},t));if(e.length>0)return void t.open("error",e,5e3)}try{if(r){let e=await fetch(`${b}/_fairys/_proxy`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({proxyList:c,dir:k,fileName:v,rootDir:y})}),r=await e.json();c.length>0?i({response:JSON.stringify(r,null,2)}):200===r.code&&t.open("success","保存成功"),i({rootDir:r.rootDir})}else if(c.length>0){let e=c.reduce((e,t)=>{let{path:r,...n}={...t};return{...e,[r]:n}},{});i({response:JSON.stringify(e,null,2)})}else t.open("success","操作成功")}catch(e){i({response:"Error: "+e.message})}},_=()=>{i({currentIndex:void 0,modalBody:"",isModalOpen:!1}),document.body.style.overflow="auto"};return(0,n.jsxs)("div",{className:"space-y-6 flex-1 flex flex-col box-border overflow-hidden",children:[(0,n.jsxs)("div",{className:"mb-6 text-xs text-zinc-600 dark:text-zinc-300 box-border flex justify-between",children:[(0,n.jsxs)("div",{children:["当前配置总条数: ",c.length]}),r?(0,n.jsxs)("div",{className:"flex gap-2",children:[(0,n.jsxs)("button",{type:"button",onClick:w,className:"px-3 py-1 bg-blue-500 text-white rounded-md hover:bg-blue-600 transition-colors text-xs",children:[j?"重启":"启动"," proxy 服务"]}),j?(0,n.jsx)("button",{type:"button",onClick:N,className:"px-3 py-1 bg-red-500 text-white rounded-md hover:bg-red-600 transition-colors text-xs",children:"销毁 proxy 服务"}):(0,n.jsx)(o.Fragment,{})]}):(0,n.jsx)(o.Fragment,{})]}),(0,n.jsxs)("div",{className:"mb-6",children:[(0,n.jsx)("label",{className:"block text-xs font-medium text-zinc-700 dark:text-zinc-300 mb-1",children:"数据保存到本地"}),(0,n.jsxs)("div",{className:"flex gap-4",children:[(0,n.jsxs)("div",{className:"flex-1 flex items-center gap-2",children:[(0,n.jsx)("label",{className:"block text-xs font-medium text-zinc-700 dark:text-zinc-300 mb-1",children:"根目录"}),(0,n.jsx)("input",{type:"text",value:y,onChange:e=>{i({rootDir:e.target.value})},className:"flex-1 px-2 py-1 border border-zinc-300 dark:border-zinc-700 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-zinc-800 dark:text-white text-xs"})]}),(0,n.jsxs)("div",{className:"flex-1 flex items-center gap-2",children:[(0,n.jsx)("label",{className:"block text-xs font-medium text-zinc-700 dark:text-zinc-300 mb-1",children:"目录名"}),(0,n.jsx)("input",{type:"text",value:k,onChange:e=>{i({dir:e.target.value})},className:"flex-1 px-2 py-1 border border-zinc-300 dark:border-zinc-700 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-zinc-800 dark:text-white text-xs"})]}),(0,n.jsxs)("div",{className:"flex-1 flex items-center gap-2",children:[(0,n.jsx)("label",{className:"block text-xs font-medium text-zinc-700 dark:text-zinc-300 mb-1",children:"文件名"}),(0,n.jsx)("input",{type:"text",value:v,onChange:e=>{i({fileName:e.target.value})},className:"flex-1 px-2 py-1 border border-zinc-300 dark:border-zinc-700 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-zinc-800 dark:text-white text-xs"})]}),(0,n.jsx)("button",{type:"button",onClick:()=>C(),className:"px-3 py-1 bg-blue-500 text-white rounded-md hover:bg-blue-600 transition-colors whitespace-nowrap text-xs",children:"查询"})]}),(0,n.jsx)("p",{className:"text-xs text-zinc-500 dark:text-zinc-400 mt-1",children:"默认保存到当前工作目录的 mock 文件夹"})]}),c.length>0?(0,n.jsx)("div",{className:"flex-1 flex flex-col box-border overflow-auto",children:(0,n.jsx)(h,{columns:[{title:"#",tdClassName:"px-2 py-2 text-xs text-zinc-800 dark:text-zinc-100 border-b border-zinc-200 dark:border-zinc-700",isIndex:!0},{title:"接口地址",dataIndex:"path",render:(e,t)=>(0,n.jsx)("input",{type:"text",value:e.path,placeholder:"请使用 ^ 开头",onChange:e=>S(t,"path",e.target.value),className:"w-full px-2 py-1 border border-zinc-300 dark:border-zinc-700 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-zinc-800 dark:text-white text-xs"})},{title:"目标地址",dataIndex:"target",render:(e,t)=>(0,n.jsx)("input",{type:"text",value:e.target,onChange:e=>{S(t,"target",e.target.value||"")},className:"w-full px-2 py-1 border border-zinc-300 dark:border-zinc-700 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-zinc-800 dark:text-white text-xs",placeholder:"目标地址"})},{title:"启用 WebSocket",dataIndex:"enableWebSocket",render:(e,t)=>(0,n.jsx)("input",{type:"checkbox",checked:e.ws||!1,onChange:e=>{S(t,"ws",e.target.checked)},className:"mr-2"})},{title:"路径重写数据",dataIndex:"pathRewrite",render:e=>(0,n.jsx)("div",{className:"text-zinc-500 dark:text-zinc-400 text-xs w-[250px]",children:JSON.stringify(e.pathRewrite,null,2)})},{title:"操作",dataIndex:"operation",render:(e,t)=>(0,n.jsxs)("div",{className:"flex space-x-1",children:[(0,n.jsx)("button",{type:"button",onClick:()=>{i({currentIndex:t,modalBody:JSON.stringify(c[t].pathRewrite,null,2),isModalOpen:!0}),document.body.style.overflow="hidden"},className:"px-2 py-0.5 bg-blue-500 text-white rounded-md hover:bg-blue-600 transition-colors text-xs",children:"编辑路径重写数据"}),(0,n.jsx)("button",{type:"button",onClick:()=>{i({proxyList:(a.store.proxyList||[]).filter((e,r)=>r!==t)})},className:"px-2 py-0.5 bg-red-500 text-white rounded-md hover:bg-red-600 transition-colors text-xs",children:"删除"})]})}],dataSource:c})}):(0,n.jsx)("div",{className:"text-center py-8 text-zinc-500 dark:text-zinc-400",children:'暂无接口配置,请点击"添加接口配置"按钮添加'}),(0,n.jsxs)("div",{className:"flex justify-center",children:[(0,n.jsx)("button",{type:"button",onClick:()=>{i({proxyList:[...a.store.proxyList||[]].concat([{path:"",target:""}])})},className:"px-3 py-1 bg-green-500 text-white rounded-md hover:bg-green-600 transition-colors mr-4 text-xs",children:"添加接口配置"}),(0,n.jsx)("button",{type:"button",onClick:O,className:"px-4 py-1 bg-blue-500 text-white rounded-md hover:bg-blue-600 transition-colors text-xs",children:"保存配置"})]}),d&&(0,n.jsx)("div",{className:"fixed inset-0 bg-black/30 flex items-center justify-center z-50",children:(0,n.jsxs)("div",{className:"bg-white/90 dark:bg-zinc-900/90 backdrop-blur-sm rounded-lg shadow-xl p-4 flex flex-col w-full max-w-2xl max-h-[80%]",children:[(0,n.jsxs)("div",{className:"flex justify-between items-center mb-2",children:[(0,n.jsx)("h2",{className:"text-sm font-medium text-zinc-800 dark:text-zinc-100",children:"proxy 数据"}),(0,n.jsxs)("div",{className:"flex gap-4",children:[(0,n.jsx)("button",{type:"button",title:"复制",onClick:()=>{navigator.clipboard.writeText(d),t.open("success","复制成功")},className:"px-2 py-0.5 bg-blue-500 text-white rounded-md hover:bg-blue-600 transition-colors text-xs",children:"复制"}),(0,n.jsx)("button",{type:"button",onClick:()=>i({response:""}),className:"px-2 py-0.5 bg-gray-500 text-white rounded-md hover:bg-gray-600 transition-colors text-xs",children:"关闭"})]})]}),(0,n.jsx)("pre",{className:"flex-1 overflow-auto bg-zinc-100 dark:bg-zinc-800 p-3 rounded-md overflow-x-auto text-xs text-zinc-800 dark:text-zinc-100",children:d})]})}),x&&null!==u&&(null==c?void 0:c[u])&&(0,g.createPortal)((0,n.jsx)("div",{className:"fixed inset-0 bg-black/30 flex items-center justify-center z-50",children:(0,n.jsxs)("div",{className:"bg-white/90 dark:bg-zinc-900/90 backdrop-blur-sm rounded-lg shadow-xl p-4 w-full max-w-2xl",children:[(0,n.jsxs)("div",{className:"flex justify-between items-center mb-3",children:[(0,n.jsxs)("h2",{className:"text-sm font-medium text-zinc-700 dark:text-zinc-300",children:["编辑响应体数据 - 接口配置 #",u+1]}),(0,n.jsx)("button",{type:"button",onClick:_,className:"text-zinc-500 hover:text-zinc-700 dark:text-zinc-400 dark:hover:text-zinc-200",children:"\xd7"})]}),(0,n.jsx)("div",{className:"space-y-3",children:(0,n.jsxs)("div",{children:[(0,n.jsxs)("label",{className:"block text-xs font-medium text-zinc-700 dark:text-zinc-300 mb-1",children:["路径重写 JSON ",(0,n.jsx)("span",{className:"text-red-500",children:"*"})]}),(0,n.jsx)(f,{value:p,onChange:e=>i({modalBody:e}),className:"w-full px-2 py-1 border border-zinc-300 dark:border-zinc-700 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-zinc-800 dark:text-white min-h-[300px] text-xs",placeholder:'例如: { "^/api":"" , "^/api/test":"/api" }'})]})}),(0,n.jsxs)("div",{className:"flex justify-end space-x-2 mt-3 box-border",children:[(0,n.jsx)("button",{type:"button",onClick:_,className:"px-3 py-1 border border-zinc-300 dark:border-zinc-600 bg-white dark:bg-zinc-700 text-zinc-800 dark:text-zinc-200 rounded-md hover:bg-zinc-100 dark:hover:bg-zinc-600 transition-colors text-xs",children:"取消"}),(0,n.jsx)("button",{type:"button",onClick:()=>{if(null!==u)try{let e=Function("return "+p)();S(u,"pathRewrite",e),_()}catch(e){t.open("error","JSON 格式错误,请检查输入")}},className:"px-3 py-1 bg-blue-500 text-white rounded-md hover:bg-blue-600 transition-colors text-xs",children:"保存"})]})]})}),document.body)]})}let v={success:"text-green-500",info:"text-blue-500",error:"text-red-500",warning:"text-orange-500"},j={info:e=>(0,n.jsx)("span",{...e,children:(0,n.jsx)("svg",{viewBox:"64 64 896 896",focusable:"false","data-icon":"info-circle",width:"1em",height:"1em",fill:"currentColor",children:(0,n.jsx)("path",{d:"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm32 664c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V456c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v272zm-32-344a48.01 48.01 0 010-96 48.01 48.01 0 010 96z"})})}),success:e=>(0,n.jsx)("span",{...e,children:(0,n.jsx)("svg",{viewBox:"64 64 896 896",focusable:"false","data-icon":"check-circle",width:"1em",height:"1em",fill:"currentColor",children:(0,n.jsx)("path",{d:"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm193.5 301.7l-210.6 292a31.8 31.8 0 01-51.7 0L318.5 484.9c-3.8-5.3 0-12.7 6.5-12.7h46.9c10.2 0 19.9 4.9 25.9 13.3l71.2 98.8 157.2-218c6-8.3 15.6-13.3 25.9-13.3H699c6.5 0 10.3 7.4 6.5 12.7z"})})}),error:e=>(0,n.jsx)("span",{...e,children:(0,n.jsx)("svg",{fillRule:"evenodd",viewBox:"64 64 896 896",focusable:"false","data-icon":"close-circle",width:"1em",height:"1em",fill:"currentColor",children:(0,n.jsx)("path",{d:"M512 64c247.4 0 448 200.6 448 448S759.4 960 512 960 64 759.4 64 512 264.6 64 512 64zm127.98 274.82h-.04l-.08.06L512 466.75 384.14 338.88c-.04-.05-.06-.06-.08-.06a.12.12 0 00-.07 0c-.03 0-.05.01-.09.05l-45.02 45.02a.2.2 0 00-.05.09.12.12 0 000 .07v.02a.27.27 0 00.06.06L466.75 512 338.88 639.86c-.05.04-.06.06-.06.08a.12.12 0 000 .07c0 .03.01.05.05.09l45.02 45.02a.2.2 0 00.09.05.12.12 0 00.07 0c.02 0 .04-.01.08-.05L512 557.25l127.86 127.87c.04.04.06.05.08.05a.12.12 0 00.07 0c.03 0 .05-.01.09-.05l45.02-45.02a.2.2 0 00.05-.09.12.12 0 000-.07v-.02a.27.27 0 00-.05-.06L557.25 512l127.87-127.86c.04-.04.05-.06.05-.08a.12.12 0 000-.07c0-.03-.01-.05-.05-.09l-45.02-45.02a.2.2 0 00-.09-.05.12.12 0 00-.07 0z"})})}),warning:e=>(0,n.jsx)("span",{...e,children:(0,n.jsx)("svg",{viewBox:"64 64 896 896",focusable:"false","data-icon":"exclamation-circle",width:"1em",height:"1em",fill:"currentColor",children:(0,n.jsx)("path",{d:"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm-32 232c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v272c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V296zm32 440a48.01 48.01 0 010-96 48.01 48.01 0 010 96z"})})})},z=document.getElementById("root");z&&s.createRoot(z).render((0,n.jsxs)(u,{children:[(0,n.jsx)(function(){let{state:e,dispatch:t}=m(),[r,s]=(0,o.useState)({mock:!0,proxy:!1}),i=e.tabKey,a=e=>{s(t=>({...t,[e]:!0})),t({tabKey:e})};return(0,n.jsx)("div",{className:"h-full bg-zinc-50 dark:bg-black p-4 sm:p-6 box-border overflow-hidden flex flex-col",children:(0,n.jsxs)("div",{className:"flex-1 w-full bg-white dark:bg-zinc-900 rounded-lg shadow-md p-6 box-border flex flex-col overflow-hidden",children:[(0,n.jsxs)("div",{className:"flex border-b border-zinc-200 dark:border-zinc-700 mb-6",children:[(0,n.jsx)("button",{className:`px-4 py-2 text-xs font-medium transition-colors ${"mock"===i?"border-b-2 border-blue-500 text-blue-600 dark:text-blue-400":"text-zinc-500 hover:text-zinc-700 dark:text-zinc-400 dark:hover:text-zinc-200"}`,onClick:()=>a("mock"),children:"Mocker 数据配置"}),(0,n.jsx)("button",{className:`px-4 py-2 text-xs font-medium transition-colors ${"proxy"===i?"border-b-2 border-blue-500 text-blue-600 dark:text-blue-400":"text-zinc-500 hover:text-zinc-700 dark:text-zinc-400 dark:hover:text-zinc-200"}`,onClick:()=>a("proxy"),children:"代理配置"})]}),(0,n.jsxs)("div",{className:"flex-1 relative overflow-hidden",children:[r.mock&&(0,n.jsx)("div",{className:`absolute inset-0 flex flex-col box-border overflow-hidden transition-all duration-300 ease-in-out ${"mock"===i?"opacity-100 translate-x-0":"opacity-0 translate-x-4 pointer-events-none"}`,children:(0,n.jsx)(y,{})}),r.proxy&&(0,n.jsx)("div",{className:`absolute inset-0 flex flex-col box-border overflow-hidden transition-all duration-300 ease-in-out ${"proxy"===i?"opacity-100 translate-x-0":"opacity-0 translate-x-4 pointer-events-none"}`,children:(0,n.jsx)(k,{})})]})]})})},{}),(0,n.jsx)(()=>{let{state:e}=m(),t=e.messageList;return Array.isArray(t)&&t.length?(0,n.jsx)("div",{className:"fixed inset-0 flex flex-col items-center z-90 gap-2 py-2 box-border pointer-events-none",children:t.map(e=>{let t=j[e.type],r=v[e.type];return(0,n.jsxs)("div",{className:"shadow-md py-2 px-4 box-border rounded-lg bg-white text-xs flex items-center gap-2 flex-wrap",children:[t?(0,n.jsx)(t,{className:r}):(0,n.jsx)(n.Fragment,{}),(0,n.jsx)("div",{children:e.message})]},e.id)})}):(0,n.jsx)(n.Fragment,{})},{})]}))}},o={};function i(e){var t=o[e];if(void 0!==t)return t.exports;var r=o[e]={exports:{}};return s[e].call(r.exports,r,r.exports,i),r.exports}i.m=s,i.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return i.d(t,{a:t}),t},i.d=(e,t)=>{for(var r in t)i.o(t,r)&&!i.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),i.r=e=>{"u">typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},e=[],i.O=(t,r,n,s)=>{if(r){s=s||0;for(var o=e.length;o>0&&e[o-1][2]>s;o--)e[o]=e[o-1];e[o]=[r,n,s];return}for(var a=1/0,o=0;o<e.length;o++){for(var[r,n,s]=e[o],l=!0,c=0;c<r.length;c++)(!1&s||a>=s)&&Object.keys(i.O).every(e=>i.O[e](r[c]))?r.splice(c--,1):(l=!1,s<a&&(a=s));if(l){e.splice(o--,1);var d=n();void 0!==d&&(t=d)}}return t},t={410:0},i.O.j=e=>0===t[e],r=(e,r)=>{var n,s,[o,a,l]=r,c=0;if(o.some(e=>0!==t[e])){for(n in a)i.o(a,n)&&(i.m[n]=a[n]);if(l)var d=l(i)}for(e&&e(r);c<o.length;c++)s=o[c],i.o(t,s)&&t[s]&&t[s][0](),t[s]=0;return i.O(d)},(n=self.webpackChunk_fairys_mocker_ui=self.webpackChunk_fairys_mocker_ui||[]).forEach(r.bind(null,0)),n.push=r.bind(null,n.push.bind(n));var a=i.O(void 0,["783","514"],()=>i(711));a=i.O(a)})();