whistle.interceptors 0.0.4 → 0.0.6

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/CHANGELOG.md CHANGED
@@ -2,6 +2,27 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
4
 
5
+
6
+ ### 0.0.6 (2026-01-31)
7
+
8
+ ### Features
9
+
10
+ * **Server**: 支持模糊匹配 (fuzzy) 和精确匹配 (exact) 模式,并增加测试用例 coverage
11
+ * **UI**: 升级通用组件 Button 和 Select 的样式,参考 PrimeVue 暗黑模式
12
+ * **UI**: 增加 VS Code 风格的匹配模式切换按钮 (ab 图标)
13
+ * **UI**: 为 RuleDetail 增加条件搜索功能,支持高亮和上下导航定位
14
+ * **UI**: 优化 Toast 组件为单实例模式,防止提示重叠
15
+ * **UI**: 优化规则列表与详情页布局,增加分割线并固定备注框为 textarea
16
+ * **UI**: 全局删除按钮替换为图标并抽离为 DeleteButton 独立组件
17
+ * **Chore**: 优化自动保存逻辑与高性能匹配 (内存缓存与 Map 索引)
18
+
19
+ ### 0.0.5 (2025-07-13)
20
+
21
+
22
+ ### Features
23
+
24
+ * 1.单个条件支持添加多个键值对 ([12f67cf](https://github.com/lyx-jay/whistle.interceptors/commit/12f67cf99c9d7ad7c023c1a95eba8608c0e16330))
25
+
5
26
  ### 0.0.4 (2025-05-23)
6
27
 
7
28
 
package/dist/server.js CHANGED
@@ -1 +1 @@
1
- var d=Object.defineProperty;var P=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var y=Object.prototype.hasOwnProperty;var O=(o,t)=>{for(var e in t)d(o,e,{get:t[e],enumerable:!0})},f=(o,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of T(t))!y.call(o,n)&&n!==e&&d(o,n,{get:()=>t[n],enumerable:!(r=P(t,n))||r.enumerable});return o};var S=o=>f(d({},"__esModule",{value:!0}),o);var h=(o,t,e)=>new Promise((r,n)=>{var c=s=>{try{l(e.next(s))}catch(a){n(a)}},i=s=>{try{l(e.throw(s))}catch(a){n(a)}},l=s=>s.done?r(s.value):Promise.resolve(s.value).then(c,i);l((e=e.apply(o,t)).next())});var w={};O(w,{default:()=>v});module.exports=S(w);var g="whistle.interceptors",p={NETWORK:"network",MOCK:"mock"};function A(o){let t={};return(o.startsWith("?")?o.substring(1):o).split("&").forEach(r=>{let[n,c]=r.split("=");n&&c&&(t[decodeURIComponent(n)]=decodeURIComponent(c))}),t}function W(o){return new Promise(t=>{o.getReqSession(e=>{t(JSON.parse(e.req.body))})})}function C({conditions:o,payload:t,res:e,req:r,options:n,extra:c}){if(!o.every(l=>{let{key:s,value:a,enabled:u}=l;return u&&t[s]&&t[s]===a}))return!0;e.setHeader("whistle-plugin","whistle.interceptors"),e.setHeader("Content-Type","application/json; charset=UTF-8"),e.setHeader("Access-Control-Allow-Origin",c.origin),e.setHeader("Access-Control-Allow-Credentials","true"),e.setHeader("Access-Control-Allow-Headers","Content-Type, Authorization, X-Requested-With"),e.setHeader("Access-Control-Allow-Methods","POST,GET,OPTIONS,PUT,DELETE,HEAD"),e.end(o[0].response)}function m({conditions:o,payload:t,res:e,req:r,options:n,extra:c}){let i=o.find(({key:l,value:s,enabled:a})=>a&&t[l]===s);if(console.log("matchCondition",i),!i)return!0;if(i.proxyMode===p.NETWORK)return r.getSession(l=>{console.log("\u8FD4\u56DE\u5185\u5BB9",l.res.body),n.localStorage.setProperty(`${g}_${i.ruleId}_${i.key}_${i.value}`,l.res.body)}),!0;e.setHeader("whistle-plugin","whistle.interceptors"),e.setHeader("Content-Type","application/json; charset=UTF-8"),e.setHeader("Access-Control-Allow-Origin",c.origin),e.setHeader("Access-Control-Allow-Credentials","true"),e.setHeader("Access-Control-Allow-Headers","Content-Type, Authorization, X-Requested-With"),e.setHeader("Access-Control-Allow-Methods","POST,GET,OPTIONS,PUT,DELETE,HEAD"),e.end(i.response)}function E({matchType:o,conditions:t,payload:e,res:r,req:n,options:c}){({and:C,or:m})[o]({conditions:t,payload:e,res:r,req:n,options:c,extra:{origin:n.headers.origin}})&&n.passThrough()}var v=(o,t)=>{o.on("request",(e,r)=>h(null,null,function*(){try{let n=e.originalReq.ruleValue,i=(JSON.parse(t.storage.getProperty(g))||[]).filter(R=>R.id===n)[0],{matchType:l,method:s,conditions:a}=i.config;if(e.method!==s){e.passThrough();return}let u;s==="POST"&&(u=yield W(e)),s==="GET"&&(u=A(t.parseUrl(e.fullUrl).query)),E({matchType:l,conditions:a,res:r,req:e,options:t,payload:u})}catch(n){e.passThrough()}})),o.on("upgrade",(e,r)=>{e.passThrough()}),o.on("connect",(e,r)=>{e.passThrough()})};
1
+ var h=Object.defineProperty;var T=Object.getOwnPropertyDescriptor;var M=Object.getOwnPropertyNames;var C=Object.prototype.hasOwnProperty;var S=(n,t)=>{for(var e in t)h(n,e,{get:t[e],enumerable:!0})},x=(n,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of M(t))!C.call(n,s)&&s!==e&&h(n,s,{get:()=>t[s],enumerable:!(r=T(t,s))||r.enumerable});return n};var w=n=>x(h({},"__esModule",{value:!0}),n);var R=(n,t,e)=>new Promise((r,s)=>{var a=o=>{try{l(e.next(o))}catch(c){s(c)}},i=o=>{try{l(e.throw(o))}catch(c){s(c)}},l=o=>o.done?r(o.value):Promise.resolve(o.value).then(a,i);l((e=e.apply(n,t)).next())});var v={};S(v,{default:()=>W,getBody:()=>O,handleOrMode:()=>m,parseQuery:()=>y});module.exports=w(v);var p="whistle.interceptors",P={NETWORK:"network",MOCK:"mock"};var f=new Map,d=null;function A(n){let t=n.getProperty(p);if(t!==d)try{let e=JSON.parse(t)||[];f=new Map(e.map(r=>[r.id,r])),d=t}catch(e){d===null&&(f=new Map,d=t)}}function y(n){if(!n)return{};let t={},e=n.startsWith("?")?n.substring(1):n;if(!e)return{};let r=e.split("&");for(let s=0;s<r.length;s++){let a=r[s],i=a.indexOf("=");if(i>0){let l=a.substring(0,i),o=a.substring(i+1);o&&(t[decodeURIComponent(l)]=decodeURIComponent(o))}}return t}function O(n){return new Promise(t=>{n.getReqSession(e=>{try{t(JSON.parse(e.req.body||"{}"))}catch(r){t({})}})})}function m({conditions:n,payload:t,res:e,req:r,options:s,extra:a}){let i=null,l=-1;for(let o=0;o<n.length;o++){let c=n[o];if(!c.enabled)continue;if(c.pairs.every(u=>{if(!u.key||!u.value)return!1;let g=String(t[u.key]||"");return u.matchMode==="exact"?g===u.value:(console.log("\u6A21\u7CCA\u5339\u914D","actualValue",g,"pair.value",u.value),g.includes(u.value))})){i=c,l=o;break}}return i?i.proxyMode===P.NETWORK?(r.getSession(o=>{let c=`${i.ruleId}_${l}`;s.localStorage.setProperty(`${p}_${c}`,o.res.body)}),!0):(e.setHeader("whistle-plugin","whistle.interceptors"),e.setHeader("Content-Type","application/json; charset=UTF-8"),e.setHeader("Access-Control-Allow-Origin",a.origin||"*"),e.setHeader("Access-Control-Allow-Credentials","true"),e.setHeader("Access-Control-Allow-Headers","Content-Type, Authorization, X-Requested-With"),e.setHeader("Access-Control-Allow-Methods","POST,GET,OPTIONS,PUT,DELETE,HEAD"),e.end(i.response),!1):!0}var W=(n,t)=>{n.on("request",(e,r)=>R(null,null,function*(){try{let s=e.originalReq.ruleValue;if(!s){e.passThrough();return}A(t.storage);let a=f.get(s);if(!a){e.passThrough();return}let{conditions:i}=a.config,l;e.method==="POST"||e.method==="PUT"||e.method==="PATCH"?l=yield O(e):l=y(t.parseUrl(e.fullUrl).query),m({conditions:i,payload:l,res:r,req:e,options:t,extra:{origin:e.headers.origin}})&&e.passThrough()}catch(s){e.passThrough()}}))};0&&(module.exports={getBody,handleOrMode,parseQuery});
@@ -1,3 +1,3 @@
1
- var C=Object.create;var l=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var b=Object.getPrototypeOf,E=Object.prototype.hasOwnProperty;var O=(t,e)=>{for(var o in e)l(t,o,{get:e[o],enumerable:!0})},p=(t,e,o,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of P(e))!E.call(t,s)&&s!==o&&l(t,s,{get:()=>e[s],enumerable:!(r=h(e,s))||r.enumerable});return t};var a=(t,e,o)=>(o=t!=null?C(b(t)):{},p(e||!t||!t.__esModule?l(o,"default",{value:t,enumerable:!0}):o,t)),v=t=>p(l({},"__esModule",{value:!0}),t);var q={};O(q,{default:()=>_});module.exports=v(q);var d=a(require("koa")),g=a(require("koa-bodyparser")),m=a(require("@koa/cors")),y=a(require("koa-static")),c=a(require("path")),f=a(require("koa-router"));var i="whistle.interceptors";var n={get:"/collections/query",add:"/collections/add",delete:"/collections/delete",sse:"/collections/sse"};var u=t=>{t.get(n.get,e=>{try{let o=e.storage.getProperty(i);e.body={result:"ok",data:o?JSON.parse(o):[]}}catch(o){e.body={result:"error",data:"get rules error "+o}}}),t.post(n.add,e=>{console.log("ssss",e.request.body,typeof e.request.body),e.storage.setProperty(i,JSON.stringify(e.request.body)),e.body={result:"ok",data:null}}),t.delete(n.delete,e=>{console.log("ssss",e),e.body="ok"}),t.get(n.sse,e=>{let o=e.query.storage_prefix;e.set("Content-Type","text/event-stream"),e.set("Cache-Control","no-cache"),e.set("Connection","keep-alive"),e.status=200,e.respond=!1,e.res.flushHeaders();let r=R=>{e.res.write(`data: ${R}
1
+ var R=Object.create;var l=Object.defineProperty;var C=Object.getOwnPropertyDescriptor;var h=Object.getOwnPropertyNames;var P=Object.getPrototypeOf,E=Object.prototype.hasOwnProperty;var O=(o,e)=>{for(var t in e)l(o,t,{get:e[t],enumerable:!0})},p=(o,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of h(e))!E.call(o,s)&&s!==t&&l(o,s,{get:()=>e[s],enumerable:!(r=C(e,s))||r.enumerable});return o};var a=(o,e,t)=>(t=o!=null?R(P(o)):{},p(e||!o||!o.__esModule?l(t,"default",{value:o,enumerable:!0}):t,o)),b=o=>p(l({},"__esModule",{value:!0}),o);var v={};O(v,{default:()=>_});module.exports=b(v);var d=a(require("koa")),g=a(require("koa-bodyparser")),m=a(require("@koa/cors")),c=a(require("koa-static")),f=a(require("path")),y=a(require("koa-router"));var i="whistle.interceptors";var n={get:"/collections/query",add:"/collections/add",delete:"/collections/delete",sse:"/collections/sse"};var u=o=>{o.get(n.get,e=>{try{let t=e.storage.getProperty(i);e.body={result:"ok",data:t?JSON.parse(t):[]}}catch(t){e.body={result:"error",data:"get rules error "+t}}}),o.post(n.add,e=>{e.storage.setProperty(i,JSON.stringify(e.request.body)),e.body={result:"ok",data:null}}),o.delete(n.delete,e=>{e.body="ok"}),o.get(n.sse,e=>{let t=e.query.storage_prefix;e.set("Content-Type","text/event-stream"),e.set("Cache-Control","no-cache"),e.set("Connection","keep-alive"),e.status=200,e.respond=!1,e.res.flushHeaders(),(s=>{e.res.write(`data: ${s}
2
2
 
3
- `)},s=setInterval(()=>{r(e.storage.getProperty(o))},1e3);e.req.on("close",()=>{clearInterval(s),e.storage.removeProperty(o)})})};var k=1e3*60*5,_=(t,e)=>{let o=new d.default;o.context.storage=e.storage,o.proxy=!0,o.silent=!0,o.use((0,m.default)({allowMethods:["GET","POST","PUT","DELETE"]}));let r=new f.default;u(r),o.use((0,g.default)()),o.use(r.routes()),o.use(r.allowedMethods()),o.use((0,y.default)(c.default.join(__dirname,"../../public"),{maxage:k})),t.on("request",o.callback())};
3
+ `)})(e.storage.getProperty(t)),e.req.on("close",()=>{e.storage.removeProperty(t)})})};var k=1e3*60*5,_=(o,e)=>{let t=new d.default;t.context.storage=e.storage,t.proxy=!0,t.silent=!0,t.use((0,m.default)({allowMethods:["GET","POST","PUT","DELETE"]}));let r=new y.default;u(r),t.use((0,g.default)()),t.use(r.routes()),t.use(r.allowedMethods()),t.use((0,c.default)(f.default.join(__dirname,"../../public"),{maxage:k})),o.on("request",t.callback())};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "whistle.interceptors",
3
- "version": "0.0.4",
3
+ "version": "0.0.6",
4
4
  "description": "flexible interception requests",
5
5
  "author": {
6
6
  "name": "lvyuanxin",
@@ -9,6 +9,7 @@
9
9
  "scripts": {
10
10
  "dev": "tsup --watch",
11
11
  "build": "tsup",
12
+ "test": "vitest run",
12
13
  "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s",
13
14
  "version": "conventional-changelog -p angular -i CHANGELOG.md -s && git add CHANGELOG.md",
14
15
  "release": "standard-version",
@@ -29,7 +30,8 @@
29
30
  "conventional-changelog-cli": "^4.1.0",
30
31
  "standard-version": "^9.5.0",
31
32
  "tsup": "^8.0.0",
32
- "typescript": "^4.6.2"
33
+ "typescript": "^4.6.2",
34
+ "vitest": "^4.0.18"
33
35
  },
34
36
  "dependencies": {
35
37
  "@koa/cors": "^5.0.0",