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/.console.log +992 -0
- package/CHANGELOG.md +21 -0
- package/dist/server.js +1 -1
- package/dist/uiServer/index.js +2 -2
- package/package.json +4 -2
- package/public/assets/index-CNjldWLQ.js +85 -0
- package/public/assets/index-FC0ApKa6.css +1 -0
- package/public/index.html +2 -2
- package/src/server.test.ts +171 -0
- package/src/server.ts +117 -105
- package/src/types/rule.ts +7 -4
- package/src/uiServer/router.ts +9 -7
- package/public/assets/index-BWNZu5u4.css +0 -1
- package/public/assets/index-ZlpNVKm2.js +0 -85
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
|
|
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});
|
package/dist/uiServer/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var
|
|
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
|
-
`)}
|
|
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.
|
|
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",
|