@whitesev/utils 2.11.11 → 2.11.13

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 (39) hide show
  1. package/dist/index.amd.js +220 -62
  2. package/dist/index.amd.js.map +1 -1
  3. package/dist/index.amd.min.js +1 -1
  4. package/dist/index.amd.min.js.map +1 -1
  5. package/dist/index.cjs.js +220 -62
  6. package/dist/index.cjs.js.map +1 -1
  7. package/dist/index.cjs.min.js +1 -1
  8. package/dist/index.cjs.min.js.map +1 -1
  9. package/dist/index.esm.js +220 -62
  10. package/dist/index.esm.js.map +1 -1
  11. package/dist/index.esm.min.js +1 -1
  12. package/dist/index.esm.min.js.map +1 -1
  13. package/dist/index.iife.js +220 -62
  14. package/dist/index.iife.js.map +1 -1
  15. package/dist/index.iife.min.js +1 -1
  16. package/dist/index.iife.min.js.map +1 -1
  17. package/dist/index.system.js +220 -62
  18. package/dist/index.system.js.map +1 -1
  19. package/dist/index.system.min.js +1 -1
  20. package/dist/index.system.min.js.map +1 -1
  21. package/dist/index.umd.js +220 -62
  22. package/dist/index.umd.js.map +1 -1
  23. package/dist/index.umd.min.js +1 -1
  24. package/dist/index.umd.min.js.map +1 -1
  25. package/dist/types/src/Dictionary.d.ts +13 -2
  26. package/dist/types/src/Utils.d.ts +37 -11
  27. package/dist/types/src/ajaxHooker/ajaxHooker.d.ts +8 -2
  28. package/dist/types/src/ajaxHooker/ajaxHooker1.2.4.d.ts +8 -2
  29. package/dist/types/src/types/Httpx.d.ts +16 -16
  30. package/dist/types/src/types/ajaxHooker.d.ts +92 -56
  31. package/package.json +3 -4
  32. package/src/Dictionary.ts +24 -3
  33. package/src/Httpx.ts +18 -18
  34. package/src/LockFunction.ts +3 -6
  35. package/src/Utils.ts +85 -53
  36. package/src/ajaxHooker/ajaxHooker.js +55 -5
  37. package/src/ajaxHooker/ajaxHooker1.2.4.js +58 -14
  38. package/src/types/Httpx.d.ts +16 -16
  39. package/src/types/ajaxHooker.d.ts +92 -56
@@ -242,7 +242,7 @@ System.register('Utils', [], (function (exports) {
242
242
  const setInterval$1 = (...args) => loadOrReturnBroker().setInterval(...args);
243
243
  const setTimeout$1 = (...args) => loadOrReturnBroker().setTimeout(...args);
244
244
 
245
- const version = "2.11.11";
245
+ const version = "2.11.13";
246
246
 
247
247
  /* eslint-disable */
248
248
  // ==UserScript==
@@ -377,8 +377,12 @@ System.register('Utils', [], (function (exports) {
377
377
  }));
378
378
  }
379
379
  waitForRequestKeys() {
380
+ /**
381
+ * @type {Set<typeof hookInst>}
382
+ */
383
+ const winHookInsts = win.__ajaxHooker.hookInsts;
380
384
  if (!this.request.async) {
381
- win.__ajaxHooker.hookInsts.forEach(({ hookFns, filters }) => {
385
+ winHookInsts.forEach(({ hookFns, filters }) => {
382
386
  if (this.shouldFilter(filters))
383
387
  return;
384
388
  hookFns.forEach((fn) => {
@@ -394,10 +398,10 @@ System.register('Utils', [], (function (exports) {
394
398
  }
395
399
  const promises = [];
396
400
  const ignoreKeys = new Set(["type", "async", "response"]);
397
- win.__ajaxHooker.hookInsts.forEach(({ hookFns, filters }) => {
401
+ winHookInsts.forEach(({ hookFns, filters }) => {
398
402
  if (this.shouldFilter(filters))
399
403
  return;
400
- promises.push(Promise.all(hookFns.map((fn) => catchError(fn, this.request))).then(() => {
404
+ promises.push(Promise.all(hookFns.map((fn, index) => catchError(fn, this.request, index))).then(() => {
401
405
  const requestKeys = [];
402
406
  for (const key in this.request)
403
407
  !ignoreKeys.has(key) && requestKeys.push(key);
@@ -819,11 +823,52 @@ System.register('Utils', [], (function (exports) {
819
823
  });
820
824
  });
821
825
  }
826
+ /**
827
+ *
828
+ * @type {import("./../types/ajaxHooker.d.ts").UtilsAjaxHookResult["removeHook"]}
829
+ */
830
+ const removeHook = (fn, onlyRemove = false) => {
831
+ let flag = false;
832
+ for (let index = hookInst.hookFns.length - 1; index >= 0; index--) {
833
+ const __fn__ = hookInst.hookFns[index];
834
+ if (fn === __fn__) {
835
+ hookInst.hookFns.splice(index, 1);
836
+ flag = true;
837
+ if (onlyRemove) {
838
+ break;
839
+ }
840
+ }
841
+ }
842
+ return flag;
843
+ };
844
+ /**
845
+ *
846
+ * @type {import("./../types/ajaxHooker.d.ts").UtilsAjaxHookResult["removeFilter"]}
847
+ */
848
+ const removeFilter = () => {
849
+ if (Array.isArray(hookInst.filters)) {
850
+ hookInst.filters.length = 0;
851
+ }
852
+ else {
853
+ hookInst.filters = [];
854
+ }
855
+ };
822
856
  return {
823
- hook: (fn) => hookInst.hookFns.push(fn),
857
+ hook: (fn) => {
858
+ hookInst.hookFns.push(fn);
859
+ return {
860
+ remove: () => {
861
+ return removeHook(fn, true);
862
+ }
863
+ };
864
+ },
824
865
  filter: (arr) => {
825
- if (Array.isArray(arr))
866
+ if (Array.isArray(arr)) {
826
867
  hookInst.filters = arr;
868
+ }
869
+ return {
870
+ remove: removeFilter
871
+ };
827
872
  },
828
873
  protect: () => {
829
874
  readonly(win, "XMLHttpRequest", winAh.fakeXHR);
@@ -839,6 +884,8 @@ System.register('Utils', [], (function (exports) {
839
884
  delete win.__ajaxHooker;
840
885
  }
841
886
  },
887
+ removeHook: removeHook,
888
+ removeFilter: removeFilter
842
889
  };
843
890
  };
844
891
 
@@ -1237,10 +1284,50 @@ System.register('Utils', [], (function (exports) {
1237
1284
  Object.keys(realXhr).forEach((key) => (fakeXhr[key] = realXhr[key]));
1238
1285
  fakeXhr.prototype = realXhr.prototype;
1239
1286
  win.fetch = fakeFetch;
1287
+ /**
1288
+ *
1289
+ * @type {import("./../types/ajaxHooker.d.ts").UtilsAjaxHookResult["removeHook"]}
1290
+ */
1291
+ const removeHook = (fn, onlyRemove = false) => {
1292
+ let flag = false;
1293
+ for (let index = hookFns.length - 1; index >= 0; index--) {
1294
+ const __fn__ = hookFns[index];
1295
+ if (fn === __fn__) {
1296
+ hookFns.splice(index, 1);
1297
+ flag = true;
1298
+ if (onlyRemove) {
1299
+ break;
1300
+ }
1301
+ }
1302
+ }
1303
+ return flag;
1304
+ };
1305
+ /**
1306
+ *
1307
+ * @type {import("./../types/ajaxHooker.d.ts").UtilsAjaxHookResult["removeFilter"]}
1308
+ */
1309
+ const removeFilter = () => {
1310
+ if (Array.isArray(filter)) {
1311
+ filter.length = 0;
1312
+ }
1313
+ else {
1314
+ filter = void 0;
1315
+ }
1316
+ };
1240
1317
  return {
1241
- hook: (fn) => hookFns.push(fn),
1318
+ hook: (fn) => {
1319
+ hookFns.push(fn);
1320
+ return {
1321
+ remove: () => {
1322
+ return removeHook(fn, true);
1323
+ }
1324
+ };
1325
+ },
1242
1326
  filter: (arr) => {
1243
1327
  filter = Array.isArray(arr) && arr.map(toFilterObj);
1328
+ return {
1329
+ remove: removeFilter
1330
+ };
1244
1331
  },
1245
1332
  protect: () => {
1246
1333
  readonly(win, "XMLHttpRequest", fakeXhr);
@@ -1250,6 +1337,8 @@ System.register('Utils', [], (function (exports) {
1250
1337
  writable(win, "XMLHttpRequest", realXhr);
1251
1338
  writable(win, "fetch", realFetch);
1252
1339
  },
1340
+ removeHook: removeHook,
1341
+ removeFilter: removeFilter
1253
1342
  };
1254
1343
  })();
1255
1344
  };
@@ -1834,13 +1923,25 @@ System.register('Utils', [], (function (exports) {
1834
1923
  }
1835
1924
  /**
1836
1925
  * 迭代字典
1837
- * @param callbackfn 回调函数
1926
+ * @param cb 回调函数
1838
1927
  */
1839
- forEach(callbackfn) {
1928
+ forEach(cb) {
1840
1929
  this.items.forEach((value, key) => {
1841
- callbackfn(value, key, this);
1930
+ cb(value, key, this);
1842
1931
  });
1843
1932
  }
1933
+ /**
1934
+ * 找到字典中对应的键和值
1935
+ * @param cb 回调函数
1936
+ */
1937
+ find(cb) {
1938
+ for (const [key, value] of this.items.entries()) {
1939
+ const result = cb(value, key, this);
1940
+ if (result) {
1941
+ return result;
1942
+ }
1943
+ }
1944
+ }
1844
1945
  /**
1845
1946
  * 检查已有的键中是否以xx开头
1846
1947
  * @param key 需要匹配的键
@@ -2674,42 +2775,42 @@ System.register('Utils', [], (function (exports) {
2674
2775
  const method = requestOption.method;
2675
2776
  if (method === "GET" || method === "HEAD") {
2676
2777
  // GET类型,data如果有,那么需要转为searchParams
2677
- const urlObj = new URL(requestOption.url);
2778
+ const urlInst = new URL(requestOption.url);
2678
2779
  let urlSearch = "";
2679
- let isHandler = false;
2780
+ let deleteData = false;
2680
2781
  if (typeof requestOption.data === "string") {
2681
- isHandler = true;
2782
+ deleteData = true;
2682
2783
  urlSearch = requestOption.data;
2683
2784
  }
2684
2785
  else if (typeof requestOption.data === "object") {
2685
- isHandler = true;
2786
+ deleteData = true;
2686
2787
  // URLSearchParams参数可以转普通的string:string,包括FormData
2687
2788
  const searchParams = new URLSearchParams(requestOption.data);
2688
2789
  urlSearch = searchParams.toString();
2689
2790
  }
2690
- if (isHandler) {
2791
+ if (deleteData) {
2691
2792
  // GET/HEAD请求不支持data参数
2692
2793
  // 对data进行处理了才可以删除
2693
2794
  Reflect.deleteProperty(requestOption, "data");
2694
2795
  }
2695
- if (urlSearch != "") {
2696
- if (urlObj.search === "") {
2796
+ if (urlSearch.trim() != "") {
2797
+ if (urlInst.search.trim() === "") {
2697
2798
  // url没有search参数,直接覆盖
2698
- urlObj.search = urlSearch;
2799
+ urlInst.search = urlSearch;
2699
2800
  }
2700
2801
  else {
2701
2802
  // 有search参数
2702
- if (urlObj.search.endsWith("&")) {
2803
+ if (urlInst.search.trim().endsWith("&")) {
2703
2804
  // xxx=xxx&
2704
- urlObj.search = urlObj.search + urlSearch;
2805
+ urlInst.search = urlInst.search + urlSearch;
2705
2806
  }
2706
2807
  else {
2707
2808
  // xxx=xxx&xxx=
2708
- urlObj.search = `${urlObj.search}&${urlSearch}`;
2809
+ urlInst.search = `${urlInst.search}&${urlSearch}`;
2709
2810
  }
2710
2811
  }
2711
2812
  }
2712
- requestOption.url = urlObj.toString();
2813
+ requestOption.url = urlInst.toString();
2713
2814
  }
2714
2815
  else if (method === "POST" && requestOption.headers != null) {
2715
2816
  // POST类型,data如果是FormData,那么需要转为string
@@ -2719,10 +2820,10 @@ System.register('Utils', [], (function (exports) {
2719
2820
  typeof requestOption.headers[headerKey] === "string");
2720
2821
  });
2721
2822
  if (ContentTypeIndex !== -1) {
2722
- const ContentTypeKey = headersKeyList[ContentTypeIndex];
2723
- const ContentType = requestOption.headers[ContentTypeKey];
2823
+ const contentTypeKey = headersKeyList[ContentTypeIndex];
2824
+ const contentType = requestOption.headers[contentTypeKey].toLowerCase();
2724
2825
  // 设置了Content-Type
2725
- if (ContentType.includes("application/json")) {
2826
+ if (contentType.includes("application/json")) {
2726
2827
  // application/json
2727
2828
  if (requestOption.data instanceof FormData) {
2728
2829
  const entries = {};
@@ -2735,16 +2836,16 @@ System.register('Utils', [], (function (exports) {
2735
2836
  requestOption.data = JSON.stringify(requestOption.data);
2736
2837
  }
2737
2838
  }
2738
- else if (ContentType.includes("application/x-www-form-urlencoded")) {
2839
+ else if (contentType.includes("application/x-www-form-urlencoded")) {
2739
2840
  // application/x-www-form-urlencoded
2740
2841
  if (typeof requestOption.data === "object") {
2741
2842
  requestOption.data = new URLSearchParams(requestOption.data).toString();
2742
2843
  }
2743
2844
  }
2744
- else if (ContentType.includes("multipart/form-data")) {
2845
+ else if (contentType.includes("multipart/form-data")) {
2745
2846
  // multipart/form-data
2746
2847
  if (requestOption.data instanceof FormData) {
2747
- Reflect.deleteProperty(requestOption.headers, ContentTypeKey);
2848
+ Reflect.deleteProperty(requestOption.headers, contentTypeKey);
2748
2849
  }
2749
2850
  }
2750
2851
  }
@@ -5702,20 +5803,25 @@ System.register('Utils', [], (function (exports) {
5702
5803
  }
5703
5804
  /**
5704
5805
  * ajax劫持库,支持xhr和fetch劫持。
5705
- * + 来源:https://bbs.tampermonkey.net.cn/thread-3284-1-1.html
5706
- * + 作者:cxxjackie
5707
- * + 版本:1.4.8
5708
- * + 旧版本:1.2.4
5709
- * + 文档:https://scriptcat.org/zh-CN/script-show-page/637/
5710
- * @param useOldVersion 是否使用旧版本,默认false
5711
- */
5712
- ajaxHooker = (useOldVersion = false) => {
5713
- if (useOldVersion) {
5714
- return AjaxHooker1_2_4();
5715
- }
5716
- else {
5717
- return ajaxHooker();
5718
- }
5806
+ * + 来源: https://bbs.tampermonkey.net.cn/thread-3284-1-1.html
5807
+ * + 作者: cxxjackie
5808
+ * + 实现方式: Proxy
5809
+ * + 版本: `1.4.8`
5810
+ * + 文档: https://scriptcat.org/zh-CN/script-show-page/637/
5811
+ */
5812
+ ajaxHooker = () => {
5813
+ return ajaxHooker();
5814
+ };
5815
+ /**
5816
+ * ajax劫持库,支持xhr和fetch劫持。
5817
+ * + 来源: https://bbs.tampermonkey.net.cn/thread-3284-1-1.html
5818
+ * + 作者: cxxjackie
5819
+ * + 实现方式: Object.defineProperty
5820
+ * + 版本: `1.2.4`
5821
+ * + 文档: https://scriptcat.org/zh-CN/script-show-page/637/
5822
+ */
5823
+ oldAjaxHooker = () => {
5824
+ return AjaxHooker1_2_4();
5719
5825
  };
5720
5826
  canvasClickByPosition(canvasElement, clientX = 0, clientY = 0, view = this.windowApi.window) {
5721
5827
  if (!(canvasElement instanceof HTMLCanvasElement)) {
@@ -7240,6 +7346,26 @@ System.register('Utils', [], (function (exports) {
7240
7346
  }
7241
7347
  return content;
7242
7348
  }
7349
+ /**
7350
+ * 监听页面元素改变并处理
7351
+ * @param target 需要监听的元素,如果不存在,可以等待它出现
7352
+ * @param observer_config MutationObserver的配置
7353
+ * @example
7354
+ Utils.mutationObserver(document.querySelector("div.xxxx"),{
7355
+ "callback":(mutations, observer)=>{},
7356
+ "config":{childList:true,attributes:true}
7357
+ });
7358
+ * @example
7359
+ Utils.mutationObserver(document.querySelectorAll("div.xxxx"),{
7360
+ "callback":(mutations, observer)=>{},
7361
+ "config":{childList:true,attributes:true}}
7362
+ );
7363
+ * @example
7364
+ Utils.mutationObserver($("div.xxxx"),{
7365
+ "callback":(mutations, observer)=>{},
7366
+ "config":{childList:true,attributes:true}}
7367
+ );
7368
+ **/
7243
7369
  mutationObserver(target, observer_config) {
7244
7370
  const that = this;
7245
7371
  const default_obverser_config = {
@@ -7282,16 +7408,24 @@ System.register('Utils', [], (function (exports) {
7282
7408
  characterDataOldValue: void 0,
7283
7409
  },
7284
7410
  immediate: false,
7411
+ once: false,
7285
7412
  };
7286
7413
  observer_config = that.assign(default_obverser_config, observer_config);
7287
7414
  const windowMutationObserver = this.windowApi.window.MutationObserver ||
7288
7415
  this.windowApi.window.webkitMutationObserver ||
7289
7416
  this.windowApi.window.MozMutationObserver;
7290
7417
  // 观察者对象
7291
- const mutationObserver = new windowMutationObserver(function (mutations, observer) {
7418
+ const handler = (mutations, observer) => {
7419
+ if (observer_config.once) {
7420
+ // 仅触发一次
7421
+ observer.disconnect();
7422
+ }
7292
7423
  if (typeof observer_config.callback === "function") {
7293
7424
  observer_config.callback(mutations, observer);
7294
7425
  }
7426
+ };
7427
+ const mutationObserver = new windowMutationObserver(function (mutations, observer) {
7428
+ handler(mutations, observer);
7295
7429
  });
7296
7430
  if (Array.isArray(target) || target instanceof NodeList) {
7297
7431
  // 传入的是数组或者元素数组
@@ -7300,7 +7434,7 @@ System.register('Utils', [], (function (exports) {
7300
7434
  });
7301
7435
  }
7302
7436
  else if (that.isJQuery(target)) {
7303
- /* 传入的参数是jQuery对象 */
7437
+ // 传入的参数是jQuery对象
7304
7438
  target.each((_, item) => {
7305
7439
  mutationObserver.observe(item, observer_config.config);
7306
7440
  });
@@ -7309,16 +7443,14 @@ System.register('Utils', [], (function (exports) {
7309
7443
  mutationObserver.observe(target, observer_config.config);
7310
7444
  }
7311
7445
  if (observer_config.immediate) {
7312
- /* 主动触发一次 */
7313
- if (typeof observer_config.callback === "function") {
7314
- observer_config.callback([], mutationObserver);
7315
- }
7446
+ // 主动触发一次
7447
+ handler([], mutationObserver);
7316
7448
  }
7317
7449
  return mutationObserver;
7318
7450
  }
7319
7451
  /**
7320
7452
  * 使用观察器观察元素出现在视图内,出现的话触发回调
7321
- * @param target 目标元素
7453
+ * @param $el 目标元素
7322
7454
  * @param callback 触发的回调
7323
7455
  * @param options 观察器配置
7324
7456
  * @example
@@ -7326,34 +7458,47 @@ System.register('Utils', [], (function (exports) {
7326
7458
  * console.log("该元素出现在视图内");
7327
7459
  * }))
7328
7460
  */
7329
- mutationVisible(target, callback, options) {
7461
+ mutationVisible($el, callback, options) {
7330
7462
  if (typeof IntersectionObserver === "undefined") {
7331
7463
  throw new TypeError("IntersectionObserver is not defined");
7332
7464
  }
7333
- if (target == null) {
7465
+ if ($el == null) {
7334
7466
  throw new TypeError("mutatuinVisible target is null");
7335
7467
  }
7468
+ options = options || {};
7336
7469
  let defaultOptions = {
7337
7470
  root: null,
7338
7471
  rootMargin: "0px 0px 0px 0px",
7339
7472
  threshold: [0.01, 0.99],
7340
7473
  };
7341
- defaultOptions = this.assign(defaultOptions, options || {});
7474
+ defaultOptions = this.assign(defaultOptions, options);
7475
+ const handler = (entries, observer) => {
7476
+ if (options.once) {
7477
+ // 仅触发一次
7478
+ observer.disconnect();
7479
+ }
7480
+ if (typeof callback === "function") {
7481
+ callback(entries, observer);
7482
+ }
7483
+ };
7342
7484
  const intersectionObserver = new IntersectionObserver((entries, observer) => {
7343
7485
  if (entries[0].isIntersecting) {
7344
- if (typeof callback === "function") {
7345
- callback(entries, observer);
7346
- }
7486
+ handler(entries, observer);
7347
7487
  }
7348
7488
  }, defaultOptions);
7349
- if (Array.isArray(target)) {
7350
- target.forEach((item) => {
7351
- intersectionObserver.observe(item);
7489
+ if (Array.isArray($el)) {
7490
+ $el.forEach(($elItem) => {
7491
+ intersectionObserver.observe($elItem);
7352
7492
  });
7353
7493
  }
7354
7494
  else {
7355
- intersectionObserver.observe(target);
7495
+ intersectionObserver.observe($el);
7356
7496
  }
7497
+ if (options.immediate) {
7498
+ // 立即触发
7499
+ handler([], intersectionObserver);
7500
+ }
7501
+ return intersectionObserver;
7357
7502
  }
7358
7503
  /**
7359
7504
  * 去除全局window下的Utils,返回控制权
@@ -8142,12 +8287,25 @@ System.register('Utils', [], (function (exports) {
8142
8287
  }
8143
8288
  /**
8144
8289
  * 将UrlSearchParams格式的字符串转为对象
8290
+ * @param searhParamsStr 字符串或对象
8291
+ * @example
8292
+ * Utils.searchParamStrToObj("xxx=xx&xx2=xx2")
8293
+ * @example
8294
+ * Utils.searchParamStrToObj(new URLSearchParams({
8295
+ * test1: 1,
8296
+ * test2: 2
8297
+ * }))
8145
8298
  */
8146
8299
  searchParamStrToObj(searhParamsStr) {
8147
- if (typeof searhParamsStr !== "string") {
8148
- return {};
8300
+ const params = {};
8301
+ if (searhParamsStr == null) {
8302
+ return params;
8149
8303
  }
8150
- return Object.fromEntries(new URLSearchParams(searhParamsStr));
8304
+ const urlSearchParams = searhParamsStr instanceof URLSearchParams ? searhParamsStr : new URLSearchParams(searhParamsStr);
8305
+ urlSearchParams.forEach((value, key) => {
8306
+ Reflect.set(params, key, value);
8307
+ });
8308
+ return params;
8151
8309
  }
8152
8310
  /**
8153
8311
  * 提供一个封装了 try-catch 的函数,可以执行传入的函数并捕获其可能抛出的错误,并通过传入的错误处理函数进行处理。