@snack-kit/lib 0.2.0 → 0.4.0

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 (43) hide show
  1. package/README.md +248 -17
  2. package/dist/cjs/chunk-U6KYHCBL.cjs +264 -0
  3. package/dist/cjs/chunk-U6KYHCBL.cjs.map +1 -0
  4. package/dist/cjs/{chunk-N7BJS6LI.cjs → chunk-XEQEQWDB.cjs} +48 -14
  5. package/dist/cjs/chunk-XEQEQWDB.cjs.map +1 -0
  6. package/dist/cjs/{chunk-YOWLTZM5.cjs → chunk-ZJMTV2GJ.cjs} +7 -6
  7. package/dist/cjs/chunk-ZJMTV2GJ.cjs.map +1 -0
  8. package/dist/cjs/debugger.cjs +7 -3
  9. package/dist/cjs/http.cjs +13 -13
  10. package/dist/cjs/index.cjs +157 -16
  11. package/dist/cjs/index.cjs.map +1 -1
  12. package/dist/cjs/utils.cjs +144 -0
  13. package/dist/cjs/utils.cjs.map +1 -0
  14. package/dist/es/{chunk-4DLFIN3C.js → chunk-4SGFAIRT.js} +4 -3
  15. package/dist/es/chunk-4SGFAIRT.js.map +1 -0
  16. package/dist/es/chunk-WJX5Q3WL.js +229 -0
  17. package/dist/es/chunk-WJX5Q3WL.js.map +1 -0
  18. package/dist/es/{chunk-JQYH5FWE.js → chunk-YV6SGXUJ.js} +48 -15
  19. package/dist/es/chunk-YV6SGXUJ.js.map +1 -0
  20. package/dist/es/debugger.js +2 -2
  21. package/dist/es/http.js +1 -1
  22. package/dist/es/index.js +4 -3
  23. package/dist/es/index.js.map +1 -1
  24. package/dist/es/utils.js +3 -0
  25. package/dist/es/utils.js.map +1 -0
  26. package/dist/types/context-C4dFUDbw.d.ts +237 -0
  27. package/dist/types/debugger.d.ts +3 -0
  28. package/dist/types/http.d.ts +61 -236
  29. package/dist/types/index.d.ts +4 -2
  30. package/dist/types/utils.d.ts +410 -0
  31. package/dist/umd/debugger.global.js +28 -5
  32. package/dist/umd/debugger.global.js.map +1 -1
  33. package/dist/umd/http.global.js +45 -12
  34. package/dist/umd/http.global.js.map +1 -1
  35. package/dist/umd/index.global.js +308 -13
  36. package/dist/umd/index.global.js.map +1 -1
  37. package/dist/umd/utils.global.js +269 -0
  38. package/dist/umd/utils.global.js.map +1 -0
  39. package/package.json +6 -1
  40. package/dist/cjs/chunk-N7BJS6LI.cjs.map +0 -1
  41. package/dist/cjs/chunk-YOWLTZM5.cjs.map +0 -1
  42. package/dist/es/chunk-4DLFIN3C.js.map +0 -1
  43. package/dist/es/chunk-JQYH5FWE.js.map +0 -1
@@ -11625,7 +11625,7 @@ var SnackKit = (function (exports, crypto2, url, http, https, http2, util2, zlib
11625
11625
  });
11626
11626
 
11627
11627
  // package.json
11628
- var version = "0.2.0";
11628
+ var version = "0.4.0";
11629
11629
 
11630
11630
  // node_modules/axios/lib/helpers/bind.js
11631
11631
  function bind(fn, thisArg) {
@@ -15376,6 +15376,7 @@ var SnackKit = (function (exports, crypto2, url, http, https, http2, util2, zlib
15376
15376
  } = axios_default;
15377
15377
 
15378
15378
  // src/http/context.ts
15379
+ var DEBUGGER_ACTIVE_KEY = "__snackkit_debugger__active";
15379
15380
  var HttpContext = class {
15380
15381
  constructor() {
15381
15382
  this._store = /* @__PURE__ */ new Map();
@@ -15384,12 +15385,24 @@ var SnackKit = (function (exports, crypto2, url, http, https, http2, util2, zlib
15384
15385
  /**
15385
15386
  * 加载服务地址映射
15386
15387
  *
15388
+ * 支持三种调用方式:
15389
+ * - **传入字符串**:作为网关地址,自动请求 `GET /ngw/context` 获取映射表
15390
+ * - **传入对象**:直接注入键值映射,不发起网络请求
15391
+ * - **不传参数**:
15392
+ * - 生产环境(`NODE_ENV === 'production'`):以当前页面 `Origin` 为网关地址自动加载
15393
+ * - 开发环境:立即返回,不做任何操作(应由 `Debugger.init()` 接管加载流程)
15394
+ *
15387
15395
  * 远程加载时,响应中的 `$info` 元数据字段会被单独存储,不计入路由映射表。
15388
15396
  *
15389
- * @param source 远程加载传入网关 URL;本地注入传入键值对象
15397
+ * @param source 网关 URL / 键值对象 / 省略
15390
15398
  * @param timeout 远程加载超时(ms),默认 5000
15391
15399
  *
15392
- * @example 远程加载
15400
+ * @example 不传参——生产环境自动使用当前页面 Origin
15401
+ * ```ts
15402
+ * await Context.load()
15403
+ * ```
15404
+ *
15405
+ * @example 传入网关地址
15393
15406
  * ```ts
15394
15407
  * await Context.load('http://172.16.32.155:20000', 3000)
15395
15408
  * ```
@@ -15400,6 +15413,11 @@ var SnackKit = (function (exports, crypto2, url, http, https, http2, util2, zlib
15400
15413
  * ```
15401
15414
  */
15402
15415
  async load(source, timeout = 5e3) {
15416
+ if (source === void 0) {
15417
+ if (globalThis[DEBUGGER_ACTIVE_KEY]) return;
15418
+ if (!Origin) return;
15419
+ source = Origin;
15420
+ }
15403
15421
  if (typeof source === "string") {
15404
15422
  const url2 = `${source}/ngw/context`;
15405
15423
  const res = await axios_default.get(url2, { timeout });
@@ -15553,20 +15571,35 @@ var SnackKit = (function (exports, crypto2, url, http, https, http2, util2, zlib
15553
15571
  Unregister(cancelId);
15554
15572
  }
15555
15573
  }
15556
- function Get(url2, config) {
15557
- return Request({ ...config, method: "GET", url: url2 });
15574
+ function Get(urlOrConfig, config) {
15575
+ if (typeof urlOrConfig === "string") {
15576
+ return Request({ ...config, method: "GET", url: urlOrConfig });
15577
+ }
15578
+ return Request({ ...urlOrConfig, method: "GET" });
15558
15579
  }
15559
- function Post(url2, data, config) {
15560
- return Request({ ...config, method: "POST", url: url2, data });
15580
+ function Post(urlOrConfig, data, config) {
15581
+ if (typeof urlOrConfig === "string") {
15582
+ return Request({ ...config, method: "POST", url: urlOrConfig, data });
15583
+ }
15584
+ return Request({ ...urlOrConfig, method: "POST" });
15561
15585
  }
15562
- function Put(url2, data, config) {
15563
- return Request({ ...config, method: "PUT", url: url2, data });
15586
+ function Put(urlOrConfig, data, config) {
15587
+ if (typeof urlOrConfig === "string") {
15588
+ return Request({ ...config, method: "PUT", url: urlOrConfig, data });
15589
+ }
15590
+ return Request({ ...urlOrConfig, method: "PUT" });
15564
15591
  }
15565
- function Patch(url2, data, config) {
15566
- return Request({ ...config, method: "PATCH", url: url2, data });
15592
+ function Patch(urlOrConfig, data, config) {
15593
+ if (typeof urlOrConfig === "string") {
15594
+ return Request({ ...config, method: "PATCH", url: urlOrConfig, data });
15595
+ }
15596
+ return Request({ ...urlOrConfig, method: "PATCH" });
15567
15597
  }
15568
- function Del(url2, config) {
15569
- return Request({ ...config, method: "DELETE", url: url2 });
15598
+ function Del(urlOrConfig, config) {
15599
+ if (typeof urlOrConfig === "string") {
15600
+ return Request({ ...config, method: "DELETE", url: urlOrConfig });
15601
+ }
15602
+ return Request({ ...urlOrConfig, method: "DELETE" });
15570
15603
  }
15571
15604
 
15572
15605
  // src/debugger/debugger.ts
@@ -16139,6 +16172,7 @@ var SnackKit = (function (exports, crypto2, url, http, https, http2, util2, zlib
16139
16172
  * ```
16140
16173
  */
16141
16174
  static async init(options) {
16175
+ globalThis[DEBUGGER_ACTIVE_KEY] = true;
16142
16176
  const instance = new _Debugger({ timeout: 1e4, ...options });
16143
16177
  instance.injectStyle();
16144
16178
  instance.buildDOM();
@@ -16429,6 +16463,232 @@ var SnackKit = (function (exports, crypto2, url, http, https, http2, util2, zlib
16429
16463
  this.footerEl.className = `dbg-footer${cls ? ` ${cls}` : ""}`;
16430
16464
  }
16431
16465
  };
16466
+
16467
+ // src/utils/detect.ts
16468
+ var _toString = (val) => Object.prototype.toString.call(val);
16469
+ var IsNumber = (val) => !isNaN(parseFloat(val)) && isFinite(val);
16470
+ var IsRealNumber = (val) => typeof val === "number" && !isNaN(val);
16471
+ var IsString = (val) => _toString(val) === "[object String]";
16472
+ var IsBoolean = (val) => _toString(val) === "[object Boolean]";
16473
+ var IsArray = (val) => Array.isArray(val);
16474
+ var IsFunction = (val) => _toString(val) === "[object Function]";
16475
+ var IsObject = (val) => _toString(val) === "[object Object]";
16476
+ var IsNull = (val) => val === null || val === void 0 || val === "";
16477
+ var IsEqual = (a, b) => {
16478
+ if (a === b) return true;
16479
+ if (typeof a !== typeof b) return false;
16480
+ if (a === null || b === null) return false;
16481
+ if (typeof a !== "object") return false;
16482
+ if (Array.isArray(a) !== Array.isArray(b)) return false;
16483
+ const keysA = Object.keys(a);
16484
+ const keysB = Object.keys(b);
16485
+ if (keysA.length !== keysB.length) return false;
16486
+ for (const key of keysA) {
16487
+ if (!IsEqual(a[key], b[key])) {
16488
+ return false;
16489
+ }
16490
+ }
16491
+ return true;
16492
+ };
16493
+
16494
+ // src/utils/validate.ts
16495
+ var REGEX = {
16496
+ /** 手机号(宽松:13-19 开头) */
16497
+ phone: /^(?:(?:\+|00)86)?1[3-9]\d{9}$/,
16498
+ /** 手机号(严谨,基于工信部 2019 年最新公布号段) */
16499
+ strictPhone: /^(?:(?:\+|00)86)?1(?:(?:3\d)|(?:4[5-79])|(?:5[0-35-9])|(?:6[5-7])|(?:7[0-8])|(?:8\d)|(?:9[189]))\d{8}$/,
16500
+ /** 邮箱(符合 RFC 标准) */
16501
+ email: /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-_0-9]+\.)+[a-zA-Z]{2,}))$/,
16502
+ /** URL(支持 http / https / ftp) */
16503
+ url: /^(https?|ftp):\/\/[\w\-]+(\.[\w\-]+)+([\w\-.,@?^=%&:/~+#]*[\w\-@?^=%&/~+#])?/,
16504
+ /** IPv4 地址 */
16505
+ ipv4: /^((25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\.){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)$/,
16506
+ /** 整数(含负数和零) */
16507
+ integer: /^[+-]?\d+$/,
16508
+ /** 正整数(不含零) */
16509
+ positiveInteger: /^[1-9]\d*$/,
16510
+ /** 二代身份证 */
16511
+ idcard: /^[1-9]\d{5}(?:18|19|20)\d{2}(?:0[1-9]|10|11|12)(?:0[1-9]|[1-2]\d|30|31)\d{3}[\dXx]$/,
16512
+ /** 日期(宽松,如 2022-9-1) */
16513
+ date: /^\d{1,4}-(1[0-2]|0?[1-9])-(0?[1-9]|[1-2]\d|30|31)$/,
16514
+ /** 16 进制颜色值 */
16515
+ color: /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/
16516
+ };
16517
+ var IsEmail = (val) => REGEX.email.test(val);
16518
+ var IsPhone = (val) => REGEX.phone.test(val);
16519
+ var IsUrl = (val) => REGEX.url.test(val);
16520
+ var IsIpv4 = (val) => REGEX.ipv4.test(val);
16521
+ var IsInteger = (val) => REGEX.integer.test(val);
16522
+ var IsPositiveInteger = (val) => REGEX.positiveInteger.test(val);
16523
+
16524
+ // src/utils/array.ts
16525
+ var Unique = (arr) => [...new Set(arr)];
16526
+ var UniqueByKey = (arr, key) => {
16527
+ const seen = /* @__PURE__ */ new Set();
16528
+ const result = [];
16529
+ for (const item of arr) {
16530
+ const k = item[key];
16531
+ if (!seen.has(k)) {
16532
+ seen.add(k);
16533
+ result.push(item);
16534
+ }
16535
+ }
16536
+ return result;
16537
+ };
16538
+ var Minus = (arr, other) => {
16539
+ const otherSet = new Set(other);
16540
+ return arr.filter((item) => !otherSet.has(item));
16541
+ };
16542
+
16543
+ // src/utils/object.ts
16544
+ var DeepClone = (obj) => {
16545
+ if (typeof structuredClone === "function") {
16546
+ return structuredClone(obj);
16547
+ }
16548
+ return JSON.parse(JSON.stringify(obj));
16549
+ };
16550
+ var CleanObject = (obj) => {
16551
+ const result = {};
16552
+ for (const key in obj) {
16553
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
16554
+ const val = obj[key];
16555
+ if (val !== null && val !== void 0) {
16556
+ result[key] = val;
16557
+ }
16558
+ }
16559
+ }
16560
+ return result;
16561
+ };
16562
+ var Pick = (obj, keys) => {
16563
+ const result = {};
16564
+ for (const key of keys) {
16565
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
16566
+ result[key] = obj[key];
16567
+ }
16568
+ }
16569
+ return result;
16570
+ };
16571
+ var Omit = (obj, keys) => {
16572
+ const excludeSet = new Set(keys);
16573
+ const result = {};
16574
+ for (const key in obj) {
16575
+ if (Object.prototype.hasOwnProperty.call(obj, key) && !excludeSet.has(key)) {
16576
+ result[key] = obj[key];
16577
+ }
16578
+ }
16579
+ return result;
16580
+ };
16581
+
16582
+ // src/utils/func.ts
16583
+ var Debounce = (fn, delay = 300) => {
16584
+ let timer = null;
16585
+ return function(...args) {
16586
+ if (timer !== null) clearTimeout(timer);
16587
+ timer = setTimeout(() => {
16588
+ fn.apply(this, args);
16589
+ timer = null;
16590
+ }, delay);
16591
+ };
16592
+ };
16593
+ var Throttle = (fn, delay = 50) => {
16594
+ let lastTime = 0;
16595
+ return function(...args) {
16596
+ const now = Date.now();
16597
+ if (now - lastTime >= delay) {
16598
+ lastTime = now;
16599
+ fn.apply(this, args);
16600
+ }
16601
+ };
16602
+ };
16603
+ var Delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
16604
+
16605
+ // src/utils/string.ts
16606
+ var UUID = () => {
16607
+ if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") {
16608
+ return crypto.randomUUID();
16609
+ }
16610
+ return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
16611
+ const arr = new Uint8Array(1);
16612
+ crypto.getRandomValues(arr);
16613
+ const r = arr[0] & 15;
16614
+ const v = c === "x" ? r : r & 3 | 8;
16615
+ return v.toString(16);
16616
+ });
16617
+ };
16618
+ var GetURLParam = (name, url2 = typeof window !== "undefined" ? window.location.href : "") => {
16619
+ try {
16620
+ return new URL(url2).searchParams.get(name) ?? "";
16621
+ } catch {
16622
+ return "";
16623
+ }
16624
+ };
16625
+ var GetURLParams = (url2 = typeof window !== "undefined" ? window.location.href : "") => {
16626
+ try {
16627
+ const result = {};
16628
+ new URL(url2).searchParams.forEach((val, key) => {
16629
+ result[key] = val;
16630
+ });
16631
+ return result;
16632
+ } catch {
16633
+ return {};
16634
+ }
16635
+ };
16636
+ var ObjectToQuery = (obj) => {
16637
+ const params = new URLSearchParams();
16638
+ for (const [key, val] of Object.entries(obj)) {
16639
+ if (val !== null && val !== void 0) {
16640
+ params.append(key, String(val));
16641
+ }
16642
+ }
16643
+ const str = params.toString();
16644
+ return str ? `?${str}` : "";
16645
+ };
16646
+ var QueryToObject = (query) => {
16647
+ const str = query.startsWith("?") ? query.slice(1) : query;
16648
+ const result = {};
16649
+ new URLSearchParams(str).forEach((val, key) => {
16650
+ result[key] = val;
16651
+ });
16652
+ return result;
16653
+ };
16654
+
16655
+ // src/utils/time.ts
16656
+ var FormatDate = (date = /* @__PURE__ */ new Date(), format = "yyyy-MM-dd HH:mm:ss") => {
16657
+ const d = date instanceof Date ? date : new Date(date);
16658
+ if (isNaN(d.getTime())) return "";
16659
+ const map = {
16660
+ "M+": d.getMonth() + 1,
16661
+ "d+": d.getDate(),
16662
+ "H+": d.getHours(),
16663
+ "m+": d.getMinutes(),
16664
+ "s+": d.getSeconds()
16665
+ };
16666
+ let result = format.replace(
16667
+ /(y+)/,
16668
+ (_, p) => String(d.getFullYear()).slice(4 - p.length)
16669
+ );
16670
+ for (const [pattern, value] of Object.entries(map)) {
16671
+ result = result.replace(
16672
+ new RegExp(`(${pattern})`),
16673
+ (_, p) => String(value).padStart(p.length, "0")
16674
+ );
16675
+ }
16676
+ return result;
16677
+ };
16678
+ var GetDateOffset = (date = /* @__PURE__ */ new Date(), days = 0, format = "yyyy-MM-dd HH:mm:ss") => {
16679
+ const d = new Date(date.getTime());
16680
+ d.setDate(d.getDate() + days);
16681
+ return FormatDate(d, format);
16682
+ };
16683
+ var GetDayRange = (date = /* @__PURE__ */ new Date()) => {
16684
+ const y = date.getFullYear();
16685
+ const m = date.getMonth();
16686
+ const d = date.getDate();
16687
+ return {
16688
+ start: new Date(y, m, d, 0, 0, 0, 0).getTime(),
16689
+ end: new Date(y, m, d, 23, 59, 59, 999).getTime()
16690
+ };
16691
+ };
16432
16692
  /*! Bundled license information:
16433
16693
 
16434
16694
  mime-db/index.js:
@@ -16450,17 +16710,52 @@ var SnackKit = (function (exports, crypto2, url, http, https, http2, util2, zlib
16450
16710
 
16451
16711
  exports.Cancel = Cancel2;
16452
16712
  exports.CancelAll = CancelAll;
16713
+ exports.CleanObject = CleanObject;
16453
16714
  exports.Context = Context;
16454
16715
  exports.Ctx = Ctx;
16716
+ exports.DEBUGGER_ACTIVE_KEY = DEBUGGER_ACTIVE_KEY;
16717
+ exports.Debounce = Debounce;
16455
16718
  exports.Debugger = Debugger;
16719
+ exports.DeepClone = DeepClone;
16456
16720
  exports.Del = Del;
16721
+ exports.Delay = Delay;
16722
+ exports.FormatDate = FormatDate;
16457
16723
  exports.Get = Get;
16724
+ exports.GetDateOffset = GetDateOffset;
16725
+ exports.GetDayRange = GetDayRange;
16726
+ exports.GetURLParam = GetURLParam;
16727
+ exports.GetURLParams = GetURLParams;
16458
16728
  exports.HttpContext = HttpContext;
16729
+ exports.IsArray = IsArray;
16730
+ exports.IsBoolean = IsBoolean;
16731
+ exports.IsEmail = IsEmail;
16732
+ exports.IsEqual = IsEqual;
16733
+ exports.IsFunction = IsFunction;
16734
+ exports.IsInteger = IsInteger;
16735
+ exports.IsIpv4 = IsIpv4;
16736
+ exports.IsNull = IsNull;
16737
+ exports.IsNumber = IsNumber;
16738
+ exports.IsObject = IsObject;
16739
+ exports.IsPhone = IsPhone;
16740
+ exports.IsPositiveInteger = IsPositiveInteger;
16741
+ exports.IsRealNumber = IsRealNumber;
16742
+ exports.IsString = IsString;
16743
+ exports.IsUrl = IsUrl;
16744
+ exports.Minus = Minus;
16745
+ exports.ObjectToQuery = ObjectToQuery;
16746
+ exports.Omit = Omit;
16459
16747
  exports.Origin = Origin;
16460
16748
  exports.Patch = Patch;
16749
+ exports.Pick = Pick;
16461
16750
  exports.Post = Post;
16462
16751
  exports.Put = Put;
16752
+ exports.QueryToObject = QueryToObject;
16753
+ exports.REGEX = REGEX;
16463
16754
  exports.Request = Request;
16755
+ exports.Throttle = Throttle;
16756
+ exports.UUID = UUID;
16757
+ exports.Unique = Unique;
16758
+ exports.UniqueByKey = UniqueByKey;
16464
16759
  exports.VERSION = version;
16465
16760
 
16466
16761
  return exports;