@ybgnb/utils 0.0.8 → 0.1.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 (49) hide show
  1. package/dist/{utils → common}/biz-result.d.ts +1 -0
  2. package/dist/common/biz-result.d.ts.map +1 -0
  3. package/dist/common/biz-result.js +42 -0
  4. package/dist/common/biz-result.js.map +1 -0
  5. package/dist/{types → common}/error.d.ts +1 -0
  6. package/dist/common/error.d.ts.map +1 -0
  7. package/dist/common/error.js +19 -0
  8. package/dist/common/error.js.map +1 -0
  9. package/dist/index.d.ts +9 -9
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +9 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/types/type-helpers.d.ts +49 -0
  14. package/dist/types/type-helpers.d.ts.map +1 -0
  15. package/dist/types/type-helpers.js +3 -0
  16. package/dist/types/type-helpers.js.map +1 -0
  17. package/dist/utils/{page-utils.d.ts → dom.d.ts} +1 -0
  18. package/dist/utils/dom.d.ts.map +1 -0
  19. package/dist/utils/dom.js +36 -0
  20. package/dist/utils/dom.js.map +1 -0
  21. package/dist/utils/error.d.ts +22 -0
  22. package/dist/utils/error.d.ts.map +1 -0
  23. package/dist/utils/error.js +46 -0
  24. package/dist/utils/error.js.map +1 -0
  25. package/dist/utils/function.d.ts +22 -0
  26. package/dist/utils/function.d.ts.map +1 -0
  27. package/dist/utils/function.js +41 -0
  28. package/dist/utils/function.js.map +1 -0
  29. package/dist/utils/{network-utils.d.ts → network.d.ts} +1 -0
  30. package/dist/utils/network.d.ts.map +1 -0
  31. package/dist/utils/network.js +48 -0
  32. package/dist/utils/network.js.map +1 -0
  33. package/dist/utils/{random-utils.d.ts → random.d.ts} +5 -0
  34. package/dist/utils/random.d.ts.map +1 -0
  35. package/dist/utils/random.js +53 -0
  36. package/dist/utils/random.js.map +1 -0
  37. package/dist/utils/time.d.ts +11 -0
  38. package/dist/utils/time.d.ts.map +1 -0
  39. package/dist/utils/time.js +16 -0
  40. package/dist/utils/time.js.map +1 -0
  41. package/package.json +13 -27
  42. package/dist/index.mjs +0 -231
  43. package/dist/index.mjs.map +0 -1
  44. package/dist/index.umd.js +0 -234
  45. package/dist/index.umd.js.map +0 -1
  46. package/dist/types/extended-type.d.ts +0 -6
  47. package/dist/utils/array-utils.d.ts +0 -0
  48. package/dist/utils/base-utils.d.ts +0 -43
  49. package/dist/utils/function-utils.d.ts +0 -6
@@ -20,3 +20,4 @@ export declare class BizResult<T> {
20
20
  * @param run 执行方法
21
21
  */
22
22
  export declare const execBiz: <T>(run: () => Promise<T>) => Promise<BizResult<T>>;
23
+ //# sourceMappingURL=biz-result.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"biz-result.d.ts","sourceRoot":"","sources":["../../src/common/biz-result.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,qBAAa,SAAS,CAAC,CAAC;IACtB,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,CAAC,CAAA;gBAEI,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;IAMnD,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IAI/B,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,GAAE,MAAe,EAAE,IAAI,CAAC,EAAE,CAAC;IAInD,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO;IAIhC;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAC1B,SAAS,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC;CAQjC;AAED;;;GAGG;AACH,eAAO,MAAM,OAAO,GAAU,CAAC,EAAE,KAAK,MAAM,OAAO,CAAC,CAAC,CAAC,KAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAM5E,CAAA"}
@@ -0,0 +1,42 @@
1
+ import { CommonError } from "./error.js";
2
+ import { getErrorMessage } from "../utils/error.js";
3
+ /**
4
+ * 业务执行结果
5
+ */
6
+ export class BizResult {
7
+ constructor(success, msg, data) {
8
+ this.success = success;
9
+ this.msg = msg;
10
+ this.data = data;
11
+ }
12
+ static createSuccess(data) {
13
+ return new BizResult(true, '操作成功', data);
14
+ }
15
+ static createFail(msg = '操作失败', data) {
16
+ return new BizResult(false, msg, data);
17
+ }
18
+ static createError(e) {
19
+ return new BizResult(false, getErrorMessage(e));
20
+ }
21
+ async toPromise() {
22
+ if (this.success) {
23
+ return this.data;
24
+ }
25
+ else {
26
+ throw new CommonError(this.msg);
27
+ }
28
+ }
29
+ }
30
+ /**
31
+ * 执行业务(自动包裹BuResult)
32
+ * @param run 执行方法
33
+ */
34
+ export const execBiz = async (run) => {
35
+ try {
36
+ return BizResult.createSuccess(await run());
37
+ }
38
+ catch (e) {
39
+ return BizResult.createError(e);
40
+ }
41
+ };
42
+ //# sourceMappingURL=biz-result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"biz-result.js","sourceRoot":"","sources":["../../src/common/biz-result.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,YAAY,CAAC;AACvC,OAAO,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAElD;;GAEG;AACH,MAAM,OAAO,SAAS;IAKpB,YAAY,OAAgB,EAAE,GAAW,EAAE,IAAQ;QACjD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;IAED,MAAM,CAAC,aAAa,CAAI,IAAO;QAC7B,OAAO,IAAI,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;IAC1C,CAAC;IAED,MAAM,CAAC,UAAU,CAAI,MAAc,MAAM,EAAE,IAAQ;QACjD,OAAO,IAAI,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;IACxC,CAAC;IAED,MAAM,CAAC,WAAW,CAAI,CAAU;QAC9B,OAAO,IAAI,SAAS,CAAI,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,CAAA;IACpD,CAAC;IAOD,KAAK,CAAC,SAAS;QACb,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC,IAAS,CAAA;QACvB,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACjC,CAAC;IACH,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAAK,GAAqB,EAAyB,EAAE;IAC/E,IAAI,CAAC;QACH,OAAO,SAAS,CAAC,aAAa,CAAI,MAAM,GAAG,EAAE,CAAC,CAAA;IAChD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;IACjC,CAAC;AACH,CAAC,CAAA"}
@@ -12,3 +12,4 @@ export declare class CommonError {
12
12
  export declare class AbortedError extends CommonError {
13
13
  constructor();
14
14
  }
15
+ //# sourceMappingURL=error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../src/common/error.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;gBAEJ,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,WAAW;;CAI5C"}
@@ -0,0 +1,19 @@
1
+ import { getErrorMessage } from "../utils/error.js";
2
+ /**
3
+ * 通用异常
4
+ */
5
+ export class CommonError {
6
+ constructor(message, error) {
7
+ this.message = error ? `${message} ${getErrorMessage(error)}` : message;
8
+ this.error = error;
9
+ }
10
+ }
11
+ /**
12
+ * 中止异常
13
+ */
14
+ export class AbortedError extends CommonError {
15
+ constructor() {
16
+ super("操作已取消");
17
+ }
18
+ }
19
+ //# sourceMappingURL=error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/common/error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAElD;;GAEG;AACH,MAAM,OAAO,WAAW;IAItB,YAAY,OAAe,EAAE,KAAe;QAC1C,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QACxE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,YAAa,SAAQ,WAAW;IAC3C;QACE,KAAK,CAAC,OAAO,CAAC,CAAC;IACjB,CAAC;CACF"}
package/dist/index.d.ts CHANGED
@@ -1,9 +1,9 @@
1
- export * from './types/error';
2
- export * from './types/extended-type';
3
- export * from './utils/array-utils';
4
- export * from './utils/base-utils';
5
- export * from './utils/biz-result';
6
- export * from './utils/function-utils';
7
- export * from './utils/network-utils';
8
- export * from './utils/page-utils';
9
- export * from './utils/random-utils';
1
+ export * from "./types/type-helpers.js";
2
+ export * from "./common/error.js";
3
+ export * from "./common/biz-result.js";
4
+ export * from "./utils/error.js";
5
+ export * from "./utils/function.js";
6
+ export * from "./utils/network.js";
7
+ export * from "./utils/dom.js";
8
+ export * from "./utils/random.js";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AAExC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AAEvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ export * from "./types/type-helpers.js";
2
+ export * from "./common/error.js";
3
+ export * from "./common/biz-result.js";
4
+ export * from "./utils/error.js";
5
+ export * from "./utils/function.js";
6
+ export * from "./utils/network.js";
7
+ export * from "./utils/dom.js";
8
+ export * from "./utils/random.js";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AAExC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AAEvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * 提取getter属性
3
+ */
4
+ export type ExtractGetterProperties<T> = {
5
+ [K in keyof T as K extends `get${infer Rest}` ? Uncapitalize<Rest> : never]: T[K] extends (...args: any[]) => Promise<infer R> ? R : never;
6
+ };
7
+ /**
8
+ * 至少包含一个字段
9
+ */
10
+ export type RequireAtLeastOne<T, Keys extends keyof T = keyof T> = Pick<T, Exclude<keyof T, Keys>> & {
11
+ [K in Keys]: Required<Pick<T, K>> & Partial<Pick<T, Exclude<Keys, K>>>;
12
+ }[Keys];
13
+ /**
14
+ * 用元组限制长度
15
+ */
16
+ export type MaxLengthArray<T, N extends number> = T[] & {
17
+ length: N;
18
+ };
19
+ /**
20
+ * 提取 T 中所有值类型为 V 的键
21
+ */
22
+ export type KeysMatching<T, V> = {
23
+ [K in keyof T]: T[K] extends V ? K : never;
24
+ }[keyof T];
25
+ /**
26
+ * 任意方法
27
+ */
28
+ export type AnyFn = (...args: any[]) => any;
29
+ /**
30
+ * 提取所有方法
31
+ */
32
+ export type MethodKeys<T> = {
33
+ [K in keyof T]-?: T[K] extends AnyFn ? K : never;
34
+ }[keyof T];
35
+ /**
36
+ * 方法参数类型
37
+ */
38
+ export type MethodParams<T> = T extends (...args: infer P) => any ? P : never;
39
+ /**
40
+ * 方法返回类型
41
+ */
42
+ export type MethodReturn<T> = T extends (...args: any[]) => infer R ? R : never;
43
+ /**
44
+ * 提取所有函数 key
45
+ */
46
+ export type FunctionKeys<T> = {
47
+ [K in keyof T]: T[K] extends AnyFn ? K : never;
48
+ }[keyof T];
49
+ //# sourceMappingURL=type-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-helpers.d.ts","sourceRoot":"","sources":["../../src/types/type-helpers.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,MAAM,uBAAuB,CAAC,CAAC,IAAI;KACtC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,MAAM,MAAM,IAAI,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CACtF,GAAG,IAAI,EAAE,GAAG,EAAE,KACX,OAAO,CAAC,MAAM,CAAC,CAAC,GACnB,CAAC,GACD,KAAK;CACV,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,iBAAiB,CAAC,CAAC,EAAE,IAAI,SAAS,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,GAChG;KACG,CAAC,IAAI,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;CACvE,CAAC,IAAI,CAAC,CAAA;AAET;;GAEG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,IAAI,CAAC,EAAE,GAAG;IACtD,MAAM,EAAE,CAAC,CAAA;CAEV,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,EAAE,CAAC,IAAI;KAC9B,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK;CAC3C,CAAC,MAAM,CAAC,CAAC,CAAA;AAEV;;GAEG;AACH,MAAM,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAA;AAE3C;;GAEG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI;KACzB,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,GAAG,CAAC,GAAG,KAAK;CACjD,CAAC,MAAM,CAAC,CAAC,CAAA;AAEV;;GAEG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,KAAK,CAAA;AAE7E;;GAEG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;AAE/E;;GAEG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI;KAC3B,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,GAAG,CAAC,GAAG,KAAK;CAC/C,CAAC,MAAM,CAAC,CAAC,CAAA"}
@@ -0,0 +1,3 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ export {};
3
+ //# sourceMappingURL=type-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-helpers.js","sourceRoot":"","sources":["../../src/types/type-helpers.ts"],"names":[],"mappings":"AAAA,uDAAuD"}
@@ -7,3 +7,4 @@ export interface VisibilityChangeListener {
7
7
  * @returns 成功监听时返回解绑函数
8
8
  */
9
9
  export declare function onVisibilityChange(listener: VisibilityChangeListener): (() => void) | null;
10
+ //# sourceMappingURL=dom.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom.d.ts","sourceRoot":"","sources":["../../src/utils/dom.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,wBAAwB;IACvC,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;CACzB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,wBAAwB,uBAiCpE"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * 监听页面可见性变化(兼容旧的IE/Chrome)
3
+ * @param listener 监听器
4
+ * @returns 成功监听时返回解绑函数
5
+ */
6
+ export function onVisibilityChange(listener) {
7
+ let hiddenPropName = undefined, hiddenEventName = undefined;
8
+ if (typeof document.hidden !== "undefined") {
9
+ // 现代 Web API
10
+ hiddenPropName = 'hidden';
11
+ hiddenEventName = 'visibilitychange';
12
+ }
13
+ else if ('msHidden' in document && typeof document.msHidden !== "undefined") {
14
+ // 旧 IE
15
+ hiddenPropName = 'msHidden';
16
+ hiddenEventName = 'msvisibilitychange';
17
+ }
18
+ else if ('webkitHidden' in document && typeof document.webkitHidden !== "undefined") {
19
+ // 旧 Chrome
20
+ hiddenPropName = 'webkitHidden';
21
+ hiddenEventName = 'webkitvisibilitychange';
22
+ }
23
+ if (!hiddenPropName || !hiddenEventName) {
24
+ return null;
25
+ }
26
+ const handler = () => {
27
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
28
+ // @ts-ignore
29
+ listener(document[hiddenPropName]);
30
+ };
31
+ document.addEventListener(hiddenEventName, handler);
32
+ return () => {
33
+ document.removeEventListener(hiddenEventName, handler);
34
+ };
35
+ }
36
+ //# sourceMappingURL=dom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom.js","sourceRoot":"","sources":["../../src/utils/dom.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAkC;IACnE,IAAI,cAAc,GAAuB,SAAS,EAChD,eAAe,GAAuB,SAAS,CAAC;IAElD,IAAI,OAAO,QAAQ,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QAC3C,aAAa;QACb,cAAc,GAAG,QAAQ,CAAC;QAC1B,eAAe,GAAG,kBAAkB,CAAA;IACtC,CAAC;SAAM,IAAI,UAAU,IAAI,QAAQ,IAAI,OAAO,QAAQ,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;QAC9E,OAAO;QACP,cAAc,GAAG,UAAU,CAAC;QAC5B,eAAe,GAAG,oBAAoB,CAAA;IACxC,CAAC;SAAM,IAAI,cAAc,IAAI,QAAQ,IAAI,OAAO,QAAQ,CAAC,YAAY,KAAK,WAAW,EAAE,CAAC;QACtF,WAAW;QACX,cAAc,GAAG,cAAc,CAAC;QAChC,eAAe,GAAG,wBAAwB,CAAA;IAC5C,CAAC;IAED,IAAI,CAAC,cAAc,IAAI,CAAC,eAAe,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,6DAA6D;QAC7D,aAAa;QACb,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC;IAEF,QAAQ,CAAC,gBAAgB,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IAEpD,OAAO,GAAG,EAAE;QACV,QAAQ,CAAC,mBAAmB,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { CommonError } from '../common/error.js';
2
+ /**
3
+ * 判断是否为通用异常
4
+ */
5
+ export declare function isCommonError(error: unknown): error is CommonError;
6
+ /**
7
+ * 设置异常信息的前置提示
8
+ * @param error 异常
9
+ * @param preMsg 前置信息 `${preMsg}${error.message}`
10
+ */
11
+ export declare function prependErrorMessage(error: CommonError, preMsg?: string): CommonError;
12
+ /**
13
+ * 转换到通用异常
14
+ * @param error 异常
15
+ * @param preMsg 前置提示 `${preMsg}${error.message}`
16
+ */
17
+ export declare function convertToCommonError(error: unknown, preMsg?: string): CommonError;
18
+ /**
19
+ * 获取错误信息
20
+ */
21
+ export declare function getErrorMessage(error: unknown): string;
22
+ //# sourceMappingURL=error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../src/utils/error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,oBAAoB,CAAC;AAE/C;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAElE;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,WAAW,CAKpF;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,WAAW,CAgBjF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEtD"}
@@ -0,0 +1,46 @@
1
+ import { CommonError } from '../common/error.js';
2
+ /**
3
+ * 判断是否为通用异常
4
+ */
5
+ export function isCommonError(error) {
6
+ return error instanceof CommonError;
7
+ }
8
+ /**
9
+ * 设置异常信息的前置提示
10
+ * @param error 异常
11
+ * @param preMsg 前置信息 `${preMsg}${error.message}`
12
+ */
13
+ export function prependErrorMessage(error, preMsg) {
14
+ if (preMsg) {
15
+ error.message = `${preMsg} ${error.message}`;
16
+ }
17
+ return error;
18
+ }
19
+ /**
20
+ * 转换到通用异常
21
+ * @param error 异常
22
+ * @param preMsg 前置提示 `${preMsg}${error.message}`
23
+ */
24
+ export function convertToCommonError(error, preMsg) {
25
+ if (isCommonError(error)) {
26
+ return prependErrorMessage(error, preMsg);
27
+ }
28
+ if (typeof error === 'object' &&
29
+ error !== null &&
30
+ 'message' in error &&
31
+ typeof error.message === 'string') {
32
+ const newError = error;
33
+ return prependErrorMessage(new CommonError(newError.message), preMsg);
34
+ }
35
+ else {
36
+ // 如果抛出的异常不是object
37
+ return prependErrorMessage(new CommonError(String(error)), preMsg);
38
+ }
39
+ }
40
+ /**
41
+ * 获取错误信息
42
+ */
43
+ export function getErrorMessage(error) {
44
+ return convertToCommonError(error).message;
45
+ }
46
+ //# sourceMappingURL=error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/utils/error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,oBAAoB,CAAC;AAE/C;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,KAAK,YAAY,WAAW,CAAA;AACrC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAkB,EAAE,MAAe;IACrE,IAAI,MAAM,EAAE,CAAC;QACX,KAAK,CAAC,OAAO,GAAG,GAAG,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAA;IAC9C,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAc,EAAE,MAAe;IAClE,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IAC3C,CAAC;IACD,IACE,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,SAAS,IAAI,KAAK;QAClB,OAAQ,KAAiC,CAAC,OAAO,KAAK,QAAQ,EAC9D,CAAC;QACD,MAAM,QAAQ,GAAG,KAA4B,CAAA;QAC7C,OAAO,mBAAmB,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAA;IACvE,CAAC;SAAM,CAAC;QACN,kBAAkB;QAClB,OAAO,mBAAmB,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;IACpE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,OAAO,oBAAoB,CAAC,KAAK,CAAC,CAAC,OAAO,CAAA;AAC5C,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * 随机运行参数
3
+ * @param fns
4
+ * @param maxCount 最多执行次数(1 ~ fns.length)
5
+ */
6
+ export declare function runRandomFunctions(fns: Array<() => void>, maxCount?: number): void;
7
+ /**
8
+ * 将数字范围按批次处理,每个批次调用一次异步函数
9
+ *
10
+ * @param start - 起始值(包含)
11
+ * @param end - 结束值(包含)
12
+ * @param batchSize - 每批最大元素个数
13
+ * @param processor - 处理单批数字数组的异步函数
14
+ *
15
+ * @example
16
+ * // 分批处理 1..10,每批最多 3 个数字
17
+ * await processRangeInBatches(1, 10, 3, async (batch) => {
18
+ * console.log(batch) // 输出: [1,2,3], [4,5,6], [7,8,9], [10]
19
+ * })
20
+ */
21
+ export declare function processRangeInBatches(start: number, end: number, batchSize: number, processor: (batch: number[]) => Promise<void>): Promise<void>;
22
+ //# sourceMappingURL=function.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"function.d.ts","sourceRoot":"","sources":["../../src/utils/function.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAelF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,GAC5C,OAAO,CAAC,IAAI,CAAC,CAQf"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * 随机运行参数
3
+ * @param fns
4
+ * @param maxCount 最多执行次数(1 ~ fns.length)
5
+ */
6
+ export function runRandomFunctions(fns, maxCount) {
7
+ maxCount = maxCount ?? fns.length;
8
+ const count = Math.floor(Math.random() * maxCount) + 1;
9
+ const shuffled = [...fns];
10
+ for (let i = shuffled.length - 1; i > 0; i--) {
11
+ const j = Math.floor(Math.random() * (i + 1));
12
+ [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];
13
+ }
14
+ const selected = shuffled.slice(0, count);
15
+ for (const fn of selected) {
16
+ fn();
17
+ }
18
+ }
19
+ /**
20
+ * 将数字范围按批次处理,每个批次调用一次异步函数
21
+ *
22
+ * @param start - 起始值(包含)
23
+ * @param end - 结束值(包含)
24
+ * @param batchSize - 每批最大元素个数
25
+ * @param processor - 处理单批数字数组的异步函数
26
+ *
27
+ * @example
28
+ * // 分批处理 1..10,每批最多 3 个数字
29
+ * await processRangeInBatches(1, 10, 3, async (batch) => {
30
+ * console.log(batch) // 输出: [1,2,3], [4,5,6], [7,8,9], [10]
31
+ * })
32
+ */
33
+ export async function processRangeInBatches(start, end, batchSize, processor) {
34
+ for (let current = start; current <= end; current += batchSize) {
35
+ const remaining = end - current + 1;
36
+ const actualSize = Math.min(batchSize, remaining);
37
+ const batch = Array.from({ length: actualSize }, (_, idx) => current + idx);
38
+ await processor(batch);
39
+ }
40
+ }
41
+ //# sourceMappingURL=function.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"function.js","sourceRoot":"","sources":["../../src/utils/function.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAsB,EAAE,QAAiB;IAC1E,QAAQ,GAAG,QAAQ,IAAI,GAAG,CAAC,MAAM,CAAA;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAA;IAEtD,MAAM,QAAQ,GAAG,CAAC,GAAG,GAAG,CAAC,CAAA;IACzB,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAC5C;QAAA,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;IAC1D,CAAC;IAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;IAEzC,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC1B,EAAE,EAAE,CAAA;IACN,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,KAAa,EACb,GAAW,EACX,SAAiB,EACjB,SAA6C;IAE7C,KAAK,IAAI,OAAO,GAAG,KAAK,EAAE,OAAO,IAAI,GAAG,EAAE,OAAO,IAAI,SAAS,EAAE,CAAC;QAC/D,MAAM,SAAS,GAAG,GAAG,GAAG,OAAO,GAAG,CAAC,CAAA;QACnC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;QACjD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,OAAO,GAAG,GAAG,CAAC,CAAA;QAE3E,MAAM,SAAS,CAAC,KAAK,CAAC,CAAA;IACxB,CAAC;AACH,CAAC"}
@@ -21,3 +21,4 @@ export declare function getNetworkInfo(): NetworkInfo;
21
21
  */
22
22
  export declare function onNetworkChange(listener: (info: NetworkInfo) => void): () => void;
23
23
  export {};
24
+ //# sourceMappingURL=network.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../../src/utils/network.ts"],"names":[],"mappings":"AAAA,UAAU,kBAAmB,SAAQ,WAAW;IAE9C,QAAQ,EAAE,MAAM,CAAC;IAEjB,GAAG,EAAE,MAAM,CAAC;IAEZ,aAAa,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;CAC/C;AAED;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,IAAI,CAAC,kBAAkB,EAAE,MAAM,WAAW,CAAC,GAAG,QAAQ,CAAA;AAM5F;;GAEG;AACH,wBAAgB,cAAc,IAAI,WAAW,CAiB5C;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,cAoBpE"}
@@ -0,0 +1,48 @@
1
+ function isConnection(obj) {
2
+ return obj !== null && typeof obj === 'object' && 'downlink' in obj && 'rtt' in obj && 'effectiveType' in obj;
3
+ }
4
+ /**
5
+ * 获取网络信息
6
+ */
7
+ export function getNetworkInfo() {
8
+ if (!navigator.onLine) {
9
+ return 'offline';
10
+ }
11
+ if ('connection' in navigator && isConnection(navigator.connection)) {
12
+ // 现代 Web API 直接获取网络连接的信息
13
+ const connection = navigator.connection;
14
+ return {
15
+ downlink: connection.downlink,
16
+ rtt: connection.rtt,
17
+ effectiveType: connection.effectiveType
18
+ };
19
+ }
20
+ else {
21
+ return 'online';
22
+ }
23
+ }
24
+ /**
25
+ * 监听网络状态变化
26
+ * @param listener 监听器
27
+ * @returns 成功监听时返回解绑函数
28
+ */
29
+ export function onNetworkChange(listener) {
30
+ const handleChange = () => {
31
+ listener(getNetworkInfo());
32
+ };
33
+ if ('connection' in navigator && isConnection(navigator.connection)) {
34
+ // 现代 Web API
35
+ const connection = navigator.connection;
36
+ connection.addEventListener('change', handleChange);
37
+ return () => connection.removeEventListener('change', handleChange);
38
+ }
39
+ else {
40
+ window.addEventListener('online', handleChange);
41
+ window.addEventListener('offline', handleChange);
42
+ return () => {
43
+ window.removeEventListener('online', handleChange);
44
+ window.removeEventListener('offline', handleChange);
45
+ };
46
+ }
47
+ }
48
+ //# sourceMappingURL=network.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.js","sourceRoot":"","sources":["../../src/utils/network.ts"],"names":[],"mappings":"AAiBA,SAAS,YAAY,CAAC,GAAY;IAChC,OAAO,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,UAAU,IAAI,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,eAAe,IAAI,GAAG,CAAC;AAChH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;QACtB,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,IAAI,YAAY,IAAI,SAAS,IAAI,YAAY,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;QACpE,yBAAyB;QACzB,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC;QACxC,OAAO;YACL,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,GAAG,EAAE,UAAU,CAAC,GAAG;YACnB,aAAa,EAAE,UAAU,CAAC,aAAa;SACxC,CAAA;IACH,CAAC;SAAM,CAAC;QACN,OAAO,QAAQ,CAAA;IACjB,CAAC;AAEH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,QAAqC;IAEnE,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,QAAQ,CAAC,cAAc,EAAE,CAAC,CAAA;IAC5B,CAAC,CAAA;IAED,IAAI,YAAY,IAAI,SAAS,IAAI,YAAY,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;QACpE,aAAa;QACb,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC;QACxC,UAAU,CAAC,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;QACnD,OAAO,GAAG,EAAE,CAAC,UAAU,CAAC,mBAAmB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACtE,CAAC;SAAM,CAAC;QAEN,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;QAC/C,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA;QAChD,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YACnD,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QACtD,CAAC,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -2,6 +2,10 @@
2
2
  * 数组洗牌
3
3
  */
4
4
  export declare function shuffle<T>(arr: T[]): T[];
5
+ /**
6
+ * 获取 [min, max] 的随机整数
7
+ */
8
+ export declare function randomInt(min: number, max: number): number;
5
9
  /**
6
10
  * 获取 [min, max) 的随机浮点数
7
11
  */
@@ -22,3 +26,4 @@ export declare function sampleOne<T>(arr: T[]): T;
22
26
  * 获取 1~n 的随机数
23
27
  */
24
28
  export declare function random1ToN(n: number): number;
29
+ //# sourceMappingURL=random.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"random.d.ts","sourceRoot":"","sources":["../../src/utils/random.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAOxC;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,CAEtD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,CAOrE;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAExC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE5C"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * 数组洗牌
3
+ */
4
+ export function shuffle(arr) {
5
+ const clone = arr.slice();
6
+ for (let i = clone.length - 1; i > 0; i--) {
7
+ const j = Math.floor(Math.random() * (i + 1));
8
+ [clone[i], clone[j]] = [clone[j], clone[i]];
9
+ }
10
+ return clone;
11
+ }
12
+ /**
13
+ * 获取 [min, max] 的随机整数
14
+ */
15
+ export function randomInt(min, max) {
16
+ return Math.floor(Math.random() * (max - min + 1)) + min;
17
+ }
18
+ /**
19
+ * 获取 [min, max) 的随机浮点数
20
+ */
21
+ export function randomFloat(min, max) {
22
+ return Math.random() * (max - min) + min;
23
+ }
24
+ /**
25
+ * 从数组中随机取若干项,不可重复
26
+ */
27
+ export function sample(arr, count) {
28
+ return shuffle(arr).slice(0, count);
29
+ }
30
+ /**
31
+ * 从数组中随机取若干项,可重复
32
+ */
33
+ export function sampleWithReplacement(arr, count) {
34
+ const result = [];
35
+ for (let i = 0; i < count; i++) {
36
+ const index = randomInt(0, arr.length - 1);
37
+ result.push(arr[index]);
38
+ }
39
+ return result;
40
+ }
41
+ /**
42
+ * 从数组中获取随机项
43
+ */
44
+ export function sampleOne(arr) {
45
+ return arr[randomInt(0, arr.length - 1)];
46
+ }
47
+ /**
48
+ * 获取 1~n 的随机数
49
+ */
50
+ export function random1ToN(n) {
51
+ return randomInt(1, n);
52
+ }
53
+ //# sourceMappingURL=random.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"random.js","sourceRoot":"","sources":["../../src/utils/random.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,OAAO,CAAI,GAAQ;IACjC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC;IAC1B,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,GAAW;IAChD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW,EAAE,GAAW;IAClD,OAAO,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,MAAM,CAAI,GAAQ,EAAE,KAAa;IAC/C,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAI,GAAQ,EAAE,KAAa;IAC9D,MAAM,MAAM,GAAQ,EAAE,CAAC;IACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAI,GAAQ;IACnC,OAAO,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,CAAS;IAClC,OAAO,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACzB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * 格式化时间为 2020-02-02 20:20:20 的字符串
3
+ * @param date 需要格式化的时间,为空则获取当前时间
4
+ */
5
+ export declare function getFormattedDateTime(date?: Date): string;
6
+ /**
7
+ * 格式化时间为 20:20:20 的字符串
8
+ * @param date 需要格式化的时间,为空则获取当前时间
9
+ */
10
+ export declare function getFormattedTime(date?: Date): string;
11
+ //# sourceMappingURL=time.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../src/utils/time.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,MAAM,CAExD;AAGD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,MAAM,CAEpD"}
@@ -0,0 +1,16 @@
1
+ import dayjs from "dayjs";
2
+ /**
3
+ * 格式化时间为 2020-02-02 20:20:20 的字符串
4
+ * @param date 需要格式化的时间,为空则获取当前时间
5
+ */
6
+ export function getFormattedDateTime(date) {
7
+ return dayjs(date).format('YYYY-MM-DD HH:mm:ss');
8
+ }
9
+ /**
10
+ * 格式化时间为 20:20:20 的字符串
11
+ * @param date 需要格式化的时间,为空则获取当前时间
12
+ */
13
+ export function getFormattedTime(date) {
14
+ return dayjs(date).format('HH:mm:ss');
15
+ }
16
+ //# sourceMappingURL=time.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time.js","sourceRoot":"","sources":["../../src/utils/time.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAW;IAC9C,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAA;AAClD,CAAC;AAGD;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAW;IAC1C,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;AACvC,CAAC"}
package/package.json CHANGED
@@ -1,30 +1,20 @@
1
1
  {
2
2
  "name": "@ybgnb/utils",
3
- "version": "0.0.8",
3
+ "version": "0.1.0",
4
4
  "author": "hzhilong",
5
5
  "private": false,
6
6
  "description": "自用工具库",
7
- "main": "dist/index.umd.js",
8
- "module": "dist/index.mjs",
9
- "types": "dist/index.d.ts",
10
- "exports": {
11
- ".": {
12
- "types": "./dist/index.d.ts",
13
- "import": "./dist/index.mjs",
14
- "require": "./dist/index.umd.js"
15
- }
16
- },
7
+ "type": "module",
8
+ "main": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
17
10
  "files": [
18
11
  "dist"
19
12
  ],
20
13
  "scripts": {
21
- "类型检查": "tsc --noEmit",
22
- "代码检查": "eslint .",
23
- "build": "barrelsby -c barrelsby.json --delete --noHeader && vite build",
24
- "npm 登录": " npm login",
25
- "npm 发布": " npm publish --access public",
26
- "本地发布": "yalc publish",
27
- "本地构建并发布": "barrelsby -c barrelsby.json --delete --noHeader && vite build --mode library && yalc publish"
14
+ "check": "tsc --noEmit && eslint .",
15
+ "build": "tsc",
16
+ "npm login": "npm login",
17
+ "npm publish": "npm publish --access public"
28
18
  },
29
19
  "repository": {
30
20
  "type": "git",
@@ -40,17 +30,13 @@
40
30
  },
41
31
  "homepage": "https://github.com/hzhilong/ybgnb-js#readme",
42
32
  "devDependencies": {
43
- "barrelsby": "^2.8.1",
44
- "eslint": "^9.35.0",
33
+ "eslint": "^9.39.4",
45
34
  "eslint-config-prettier": "^10.1.8",
46
- "typescript": "^5.8.3",
47
- "typescript-eslint": "^8.43.0",
48
- "jiti": "^2.5.1",
49
- "vite": "^7.1.5",
50
- "vite-plugin-dts": "^4.5.4"
35
+ "prettier": "^3.8.1",
36
+ "typescript": "^6.0.2",
37
+ "typescript-eslint": "^8.58.0"
51
38
  },
52
39
  "peerDependencies": {
53
- "dayjs": "^1.11.13",
54
- "nanoid": "^5.1.5"
40
+ "dayjs": "^1.11.13"
55
41
  }
56
42
  }
package/dist/index.mjs DELETED
@@ -1,231 +0,0 @@
1
- import dayjs from "dayjs";
2
- class BaseUtils {
3
- /**
4
- * 判断是否为通用异常
5
- * @param error 需要判断的异常
6
- */
7
- static isCommonError(error) {
8
- return error instanceof CommonError;
9
- }
10
- /**
11
- * 获取错误信息
12
- * @param error
13
- */
14
- static getErrorMessage(error) {
15
- return this.convertToCommonError(error).message;
16
- }
17
- /**
18
- * 设置异常信息的前置提示
19
- * @param error 异常
20
- * @param preMsg 前置信息 `${preMsg}${error.message}`
21
- */
22
- static prependErrorMessage(error, preMsg) {
23
- if (preMsg) {
24
- error.message = `${preMsg} ${error.message}`;
25
- }
26
- return error;
27
- }
28
- /**
29
- * 转换到通用异常
30
- * @param error 异常
31
- * @param preMsg 前置提示 `${preMsg}${error.message}`
32
- */
33
- static convertToCommonError(error, preMsg) {
34
- if (this.isCommonError(error)) {
35
- return this.prependErrorMessage(error, preMsg);
36
- }
37
- if (typeof error === "object" && error !== null && "message" in error && typeof error.message === "string") {
38
- const newError = error;
39
- return this.prependErrorMessage(new CommonError(newError.message), preMsg);
40
- } else {
41
- return this.prependErrorMessage(new CommonError(String(error)), preMsg);
42
- }
43
- }
44
- /**
45
- * 格式化时间为 2020-02-02 20:20:20 的字符串
46
- * @param date 需要格式化的时间,为空则获取当前时间
47
- */
48
- static getFormattedDateTime(date) {
49
- return dayjs(date).format("YYYY-MM-DD HH:mm:ss");
50
- }
51
- /**
52
- * 格式化时间为 2020-02-02 的字符串
53
- * @param date 需要格式化的时间,为空则获取当前时间
54
- */
55
- static getFormattedDate(date) {
56
- return dayjs(date).format("YYYY-MM-DD");
57
- }
58
- /**
59
- * 格式化时间为 20:20:20 的字符串
60
- * @param date 需要格式化的时间,为空则获取当前时间
61
- */
62
- static getFormattedTime(date) {
63
- return dayjs(date).format("HH:mm:ss");
64
- }
65
- }
66
- class CommonError {
67
- message;
68
- error;
69
- constructor(message, error) {
70
- this.message = error ? `${message} ${BaseUtils.getErrorMessage(error)}` : message;
71
- this.error = error;
72
- }
73
- }
74
- class AbortedError extends CommonError {
75
- constructor() {
76
- super("操作已取消");
77
- }
78
- }
79
- class BizResult {
80
- success;
81
- msg;
82
- data;
83
- constructor(success, msg, data) {
84
- this.success = success;
85
- this.msg = msg;
86
- this.data = data;
87
- }
88
- static createSuccess(data) {
89
- return new BizResult(true, "操作成功", data);
90
- }
91
- static createFail(msg = "操作失败", data) {
92
- return new BizResult(false, msg, data);
93
- }
94
- static createError(e) {
95
- return new BizResult(false, BaseUtils.getErrorMessage(e));
96
- }
97
- async toPromise() {
98
- if (this.success) {
99
- return this.data;
100
- } else {
101
- throw new CommonError(this.msg);
102
- }
103
- }
104
- }
105
- const execBiz = async (run) => {
106
- try {
107
- return BizResult.createSuccess(await run());
108
- } catch (e) {
109
- return BizResult.createError(e);
110
- }
111
- };
112
- function runRandomFunctions(fns, maxCount) {
113
- maxCount = maxCount ?? fns.length;
114
- const count = Math.floor(Math.random() * maxCount) + 1;
115
- const shuffled = [...fns];
116
- for (let i = shuffled.length - 1; i > 0; i--) {
117
- const j = Math.floor(Math.random() * (i + 1));
118
- [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];
119
- }
120
- const selected = shuffled.slice(0, count);
121
- for (const fn of selected) {
122
- fn();
123
- }
124
- }
125
- function isConnection(obj) {
126
- return obj && typeof obj === "object" && "downlink" in obj && "rtt" in obj && "effectiveType" in obj;
127
- }
128
- function getNetworkInfo() {
129
- if (!navigator.onLine) {
130
- return "offline";
131
- }
132
- if ("connection" in navigator && isConnection(navigator.connection)) {
133
- const connection = navigator.connection;
134
- return {
135
- downlink: connection.downlink,
136
- rtt: connection.rtt,
137
- effectiveType: connection.effectiveType
138
- };
139
- } else {
140
- return "online";
141
- }
142
- }
143
- function onNetworkChange(listener) {
144
- const handleChange = () => {
145
- listener(getNetworkInfo());
146
- };
147
- if ("connection" in navigator && isConnection(navigator.connection)) {
148
- let connection = navigator.connection;
149
- connection.addEventListener("change", handleChange);
150
- return () => connection.removeEventListener("change", handleChange);
151
- } else {
152
- window.addEventListener("online", handleChange);
153
- window.addEventListener("offline", handleChange);
154
- return () => {
155
- window.removeEventListener("online", handleChange);
156
- window.removeEventListener("offline", handleChange);
157
- };
158
- }
159
- }
160
- function onVisibilityChange(listener) {
161
- let hiddenPropName = void 0, hiddenEventName = void 0;
162
- if (typeof document.hidden !== "undefined") {
163
- hiddenPropName = "hidden";
164
- hiddenEventName = "visibilitychange";
165
- } else if ("msHidden" in document && typeof document.msHidden !== "undefined") {
166
- hiddenPropName = "msHidden";
167
- hiddenEventName = "msvisibilitychange";
168
- } else if ("webkitHidden" in document && typeof document.webkitHidden !== "undefined") {
169
- hiddenPropName = "webkitHidden";
170
- hiddenEventName = "webkitvisibilitychange";
171
- }
172
- if (!hiddenPropName || !hiddenEventName) {
173
- return null;
174
- }
175
- const handler = () => {
176
- listener(document[hiddenPropName]);
177
- };
178
- document.addEventListener(hiddenEventName, handler);
179
- return () => {
180
- document.removeEventListener(hiddenEventName, handler);
181
- };
182
- }
183
- function shuffle(arr) {
184
- const clone = arr.slice();
185
- for (let i = clone.length - 1; i > 0; i--) {
186
- const j = Math.floor(Math.random() * (i + 1));
187
- [clone[i], clone[j]] = [clone[j], clone[i]];
188
- }
189
- return clone;
190
- }
191
- function randomInt(min, max) {
192
- return Math.floor(Math.random() * (max - min + 1)) + min;
193
- }
194
- function randomFloat(min, max) {
195
- return Math.random() * (max - min) + min;
196
- }
197
- function sample(arr, count) {
198
- return shuffle(arr).slice(0, count);
199
- }
200
- function sampleWithReplacement(arr, count) {
201
- const result = [];
202
- for (let i = 0; i < count; i++) {
203
- const index = randomInt(0, arr.length - 1);
204
- result.push(arr[index]);
205
- }
206
- return result;
207
- }
208
- function sampleOne(arr) {
209
- return arr[randomInt(0, arr.length - 1)];
210
- }
211
- function random1ToN(n) {
212
- return randomInt(1, n);
213
- }
214
- export {
215
- AbortedError,
216
- BaseUtils,
217
- BizResult,
218
- CommonError,
219
- execBiz,
220
- getNetworkInfo,
221
- onNetworkChange,
222
- onVisibilityChange,
223
- random1ToN,
224
- randomFloat,
225
- runRandomFunctions,
226
- sample,
227
- sampleOne,
228
- sampleWithReplacement,
229
- shuffle
230
- };
231
- //# sourceMappingURL=index.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/utils/base-utils.ts","../src/types/error.ts","../src/utils/biz-result.ts","../src/utils/function-utils.ts","../src/utils/network-utils.ts","../src/utils/page-utils.ts","../src/utils/random-utils.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { CommonError } from '../types/error';\n\n/**\n * 基础工具集\n */\nexport class BaseUtils {\n /**\n * 判断是否为通用异常\n * @param error 需要判断的异常\n */\n static isCommonError(error: unknown): error is CommonError {\n return error instanceof CommonError\n }\n\n /**\n * 获取错误信息\n * @param error\n */\n static getErrorMessage(error: unknown): string {\n return this.convertToCommonError(error).message\n }\n\n /**\n * 设置异常信息的前置提示\n * @param error 异常\n * @param preMsg 前置信息 `${preMsg}${error.message}`\n */\n static prependErrorMessage(error: CommonError, preMsg?: string): CommonError {\n if (preMsg) {\n error.message = `${preMsg} ${error.message}`\n }\n return error\n }\n\n /**\n * 转换到通用异常\n * @param error 异常\n * @param preMsg 前置提示 `${preMsg}${error.message}`\n */\n static convertToCommonError(error: unknown, preMsg?: string): CommonError {\n if (this.isCommonError(error)) {\n return this.prependErrorMessage(error, preMsg)\n }\n if (\n typeof error === 'object' &&\n error !== null &&\n 'message' in error &&\n typeof (error as Record<string, unknown>).message === 'string'\n ) {\n const newError = error as { message: string }\n return this.prependErrorMessage(new CommonError(newError.message), preMsg)\n } else {\n // 如果抛出的异常不是object\n return this.prependErrorMessage(new CommonError(String(error)), preMsg)\n }\n }\n\n /**\n * 格式化时间为 2020-02-02 20:20:20 的字符串\n * @param date 需要格式化的时间,为空则获取当前时间\n */\n static getFormattedDateTime(date?: Date): string {\n return dayjs(date).format('YYYY-MM-DD HH:mm:ss')\n }\n\n /**\n * 格式化时间为 2020-02-02 的字符串\n * @param date 需要格式化的时间,为空则获取当前时间\n */\n static getFormattedDate(date?: Date): string {\n return dayjs(date).format('YYYY-MM-DD')\n }\n\n /**\n * 格式化时间为 20:20:20 的字符串\n * @param date 需要格式化的时间,为空则获取当前时间\n */\n static getFormattedTime(date?: Date): string {\n return dayjs(date).format('HH:mm:ss')\n }\n}\n","import {BaseUtils} from \"../utils/base-utils.ts\";\n\n/**\n * 通用异常\n */\nexport class CommonError {\n message: string;\n error?: unknown;\n\n constructor(message: string, error?: unknown) {\n this.message = error ? `${message} ${BaseUtils.getErrorMessage(error)}` : message;\n this.error = error;\n }\n}\n\n/**\n * 中止异常\n */\nexport class AbortedError extends CommonError {\n constructor() {\n super(\"操作已取消\");\n }\n}\n","import { CommonError } from '../types/error'\nimport { BaseUtils } from './base-utils'\n\n/**\n * 业务执行结果\n */\nexport class BizResult<T> {\n success: boolean\n msg: string\n data?: T\n\n constructor(success: boolean, msg: string, data?: T) {\n this.success = success\n this.msg = msg\n this.data = data\n }\n\n static createSuccess<T>(data: T) {\n return new BizResult(true, '操作成功', data)\n }\n\n static createFail<T>(msg: string = '操作失败', data?: T) {\n return new BizResult(false, msg, data)\n }\n\n static createError<T>(e: unknown) {\n return new BizResult<T>(false, BaseUtils.getErrorMessage(e))\n }\n\n /**\n * 展开成Promise\n */\n async toPromise(): Promise<void>\n async toPromise<T>(): Promise<T>\n async toPromise<T = void>(): Promise<T> {\n if (this.success) {\n return this.data as T\n } else {\n throw new CommonError(this.msg)\n }\n }\n}\n\n/**\n * 执行业务(自动包裹BuResult)\n * @param run 执行方法\n */\nexport const execBiz = async <T>(run: () => Promise<T>): Promise<BizResult<T>> => {\n try {\n return BizResult.createSuccess<T>(await run())\n } catch (e) {\n return BizResult.createError(e)\n }\n}\n","/**\n * 随机运行参数\n * @param fns\n * @param maxCount 最多执行次数(1 ~ fns.length)\n */\nexport function runRandomFunctions(fns: Array<() => void>, maxCount?: number): void {\n maxCount = maxCount ?? fns.length\n const count = Math.floor(Math.random() * maxCount) + 1\n\n const shuffled = [...fns]\n for (let i = shuffled.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1))\n ;[shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]\n }\n\n const selected = shuffled.slice(0, count)\n\n for (const fn of selected) {\n fn()\n }\n}\n","interface NetworkInformation extends EventTarget {\n // 带宽(估算)\n downlink: number;\n // 延迟(估算)\n rtt: number;\n // 类型(估算)\n effectiveType: 'slow-2g' | '2g' | '3g' | '4g';\n}\n\n/**\n * 网络状态信息\n * - 'offline': 无网络\n * - 'online': 在线但不支持 NetworkInformation API\n * - NetworkInformation: 含详细网络信息\n */\nexport type NetworkInfo = 'offline' | Omit<NetworkInformation, keyof EventTarget> | 'online'\n\nfunction isConnection(obj: any): obj is NetworkInformation {\n return obj && typeof obj === 'object' && 'downlink' in obj && 'rtt' in obj && 'effectiveType' in obj;\n}\n\n/**\n * 获取网络信息\n */\nexport function getNetworkInfo(): NetworkInfo {\n if (!navigator.onLine) {\n return 'offline'\n }\n\n if ('connection' in navigator && isConnection(navigator.connection)) {\n // 现代 Web API 直接获取网络连接的信息\n const connection = navigator.connection;\n return {\n downlink: connection.downlink,\n rtt: connection.rtt,\n effectiveType: connection.effectiveType\n }\n } else {\n return 'online'\n }\n\n}\n\n/**\n * 监听网络状态变化\n * @param listener 监听器\n * @returns 成功监听时返回解绑函数\n */\nexport function onNetworkChange(listener: (info: NetworkInfo) => void) {\n\n const handleChange = () => {\n listener(getNetworkInfo())\n }\n\n if ('connection' in navigator && isConnection(navigator.connection)) {\n // 现代 Web API\n let connection = navigator.connection;\n connection.addEventListener('change', handleChange)\n return () => connection.removeEventListener('change', handleChange);\n } else {\n\n window.addEventListener('online', handleChange)\n window.addEventListener('offline', handleChange)\n return () => {\n window.removeEventListener('online', handleChange);\n window.removeEventListener('offline', handleChange);\n };\n }\n}\n","// 可见性改变的监听器\nexport interface VisibilityChangeListener {\n (hidden: boolean): void;\n}\n\n/**\n * 监听页面可见性变化(兼容旧的IE/Chrome)\n * @param listener 监听器\n * @returns 成功监听时返回解绑函数\n */\nexport function onVisibilityChange(listener: VisibilityChangeListener) {\n let hiddenPropName: string | undefined = undefined,\n hiddenEventName: string | undefined = undefined;\n\n if (typeof document.hidden !== \"undefined\") {\n // 现代 Web API\n hiddenPropName = 'hidden';\n hiddenEventName = 'visibilitychange'\n } else if ('msHidden' in document && typeof document.msHidden !== \"undefined\") {\n // 旧 IE\n hiddenPropName = 'msHidden';\n hiddenEventName = 'msvisibilitychange'\n } else if ('webkitHidden' in document && typeof document.webkitHidden !== \"undefined\") {\n // 旧 Chrome\n hiddenPropName = 'webkitHidden';\n hiddenEventName = 'webkitvisibilitychange'\n }\n\n if (!hiddenPropName || !hiddenEventName) {\n return null;\n }\n\n const handler = () => {\n // @ts-ignore\n listener(document[hiddenPropName]);\n };\n\n document.addEventListener(hiddenEventName, handler);\n\n return () => {\n document.removeEventListener(hiddenEventName, handler);\n };\n}\n\n","/**\n * 数组洗牌\n */\nexport function shuffle<T>(arr: T[]): T[] {\n const clone = arr.slice();\n for (let i = clone.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [clone[i], clone[j]] = [clone[j], clone[i]];\n }\n return clone;\n}\n\n/**\n * 获取 [min, max] 的随机整数\n */\nfunction randomInt(min: number, max: number): number {\n return Math.floor(Math.random() * (max - min + 1)) + min;\n}\n\n/**\n * 获取 [min, max) 的随机浮点数\n */\nexport function randomFloat(min: number, max: number): number {\n return Math.random() * (max - min) + min;\n}\n\n/**\n * 从数组中随机取若干项,不可重复\n */\nexport function sample<T>(arr: T[], count: number): T[] {\n return shuffle(arr).slice(0, count);\n}\n\n/**\n * 从数组中随机取若干项,可重复\n */\nexport function sampleWithReplacement<T>(arr: T[], count: number): T[] {\n const result: T[] = [];\n for (let i = 0; i < count; i++) {\n const index = randomInt(0, arr.length - 1);\n result.push(arr[index]);\n }\n return result;\n}\n\n/**\n * 从数组中获取随机项\n */\nexport function sampleOne<T>(arr: T[]): T {\n return arr[randomInt(0, arr.length - 1)];\n}\n\n/**\n * 获取 1~n 的随机数\n */\nexport function random1ToN(n: number): number {\n return randomInt(1, n);\n}\n"],"names":[],"mappings":"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"}
package/dist/index.umd.js DELETED
@@ -1,234 +0,0 @@
1
- (function(global, factory) {
2
- typeof exports === "object" && typeof module !== "undefined" ? factory(exports, require("dayjs")) : typeof define === "function" && define.amd ? define(["exports", "dayjs"], factory) : (global = typeof globalThis !== "undefined" ? globalThis : global || self, factory(global["ybgnb-js-utils"] = {}, global.dayjs));
3
- })(this, (function(exports2, dayjs) {
4
- "use strict";
5
- class BaseUtils {
6
- /**
7
- * 判断是否为通用异常
8
- * @param error 需要判断的异常
9
- */
10
- static isCommonError(error) {
11
- return error instanceof CommonError;
12
- }
13
- /**
14
- * 获取错误信息
15
- * @param error
16
- */
17
- static getErrorMessage(error) {
18
- return this.convertToCommonError(error).message;
19
- }
20
- /**
21
- * 设置异常信息的前置提示
22
- * @param error 异常
23
- * @param preMsg 前置信息 `${preMsg}${error.message}`
24
- */
25
- static prependErrorMessage(error, preMsg) {
26
- if (preMsg) {
27
- error.message = `${preMsg} ${error.message}`;
28
- }
29
- return error;
30
- }
31
- /**
32
- * 转换到通用异常
33
- * @param error 异常
34
- * @param preMsg 前置提示 `${preMsg}${error.message}`
35
- */
36
- static convertToCommonError(error, preMsg) {
37
- if (this.isCommonError(error)) {
38
- return this.prependErrorMessage(error, preMsg);
39
- }
40
- if (typeof error === "object" && error !== null && "message" in error && typeof error.message === "string") {
41
- const newError = error;
42
- return this.prependErrorMessage(new CommonError(newError.message), preMsg);
43
- } else {
44
- return this.prependErrorMessage(new CommonError(String(error)), preMsg);
45
- }
46
- }
47
- /**
48
- * 格式化时间为 2020-02-02 20:20:20 的字符串
49
- * @param date 需要格式化的时间,为空则获取当前时间
50
- */
51
- static getFormattedDateTime(date) {
52
- return dayjs(date).format("YYYY-MM-DD HH:mm:ss");
53
- }
54
- /**
55
- * 格式化时间为 2020-02-02 的字符串
56
- * @param date 需要格式化的时间,为空则获取当前时间
57
- */
58
- static getFormattedDate(date) {
59
- return dayjs(date).format("YYYY-MM-DD");
60
- }
61
- /**
62
- * 格式化时间为 20:20:20 的字符串
63
- * @param date 需要格式化的时间,为空则获取当前时间
64
- */
65
- static getFormattedTime(date) {
66
- return dayjs(date).format("HH:mm:ss");
67
- }
68
- }
69
- class CommonError {
70
- message;
71
- error;
72
- constructor(message, error) {
73
- this.message = error ? `${message} ${BaseUtils.getErrorMessage(error)}` : message;
74
- this.error = error;
75
- }
76
- }
77
- class AbortedError extends CommonError {
78
- constructor() {
79
- super("操作已取消");
80
- }
81
- }
82
- class BizResult {
83
- success;
84
- msg;
85
- data;
86
- constructor(success, msg, data) {
87
- this.success = success;
88
- this.msg = msg;
89
- this.data = data;
90
- }
91
- static createSuccess(data) {
92
- return new BizResult(true, "操作成功", data);
93
- }
94
- static createFail(msg = "操作失败", data) {
95
- return new BizResult(false, msg, data);
96
- }
97
- static createError(e) {
98
- return new BizResult(false, BaseUtils.getErrorMessage(e));
99
- }
100
- async toPromise() {
101
- if (this.success) {
102
- return this.data;
103
- } else {
104
- throw new CommonError(this.msg);
105
- }
106
- }
107
- }
108
- const execBiz = async (run) => {
109
- try {
110
- return BizResult.createSuccess(await run());
111
- } catch (e) {
112
- return BizResult.createError(e);
113
- }
114
- };
115
- function runRandomFunctions(fns, maxCount) {
116
- maxCount = maxCount ?? fns.length;
117
- const count = Math.floor(Math.random() * maxCount) + 1;
118
- const shuffled = [...fns];
119
- for (let i = shuffled.length - 1; i > 0; i--) {
120
- const j = Math.floor(Math.random() * (i + 1));
121
- [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];
122
- }
123
- const selected = shuffled.slice(0, count);
124
- for (const fn of selected) {
125
- fn();
126
- }
127
- }
128
- function isConnection(obj) {
129
- return obj && typeof obj === "object" && "downlink" in obj && "rtt" in obj && "effectiveType" in obj;
130
- }
131
- function getNetworkInfo() {
132
- if (!navigator.onLine) {
133
- return "offline";
134
- }
135
- if ("connection" in navigator && isConnection(navigator.connection)) {
136
- const connection = navigator.connection;
137
- return {
138
- downlink: connection.downlink,
139
- rtt: connection.rtt,
140
- effectiveType: connection.effectiveType
141
- };
142
- } else {
143
- return "online";
144
- }
145
- }
146
- function onNetworkChange(listener) {
147
- const handleChange = () => {
148
- listener(getNetworkInfo());
149
- };
150
- if ("connection" in navigator && isConnection(navigator.connection)) {
151
- let connection = navigator.connection;
152
- connection.addEventListener("change", handleChange);
153
- return () => connection.removeEventListener("change", handleChange);
154
- } else {
155
- window.addEventListener("online", handleChange);
156
- window.addEventListener("offline", handleChange);
157
- return () => {
158
- window.removeEventListener("online", handleChange);
159
- window.removeEventListener("offline", handleChange);
160
- };
161
- }
162
- }
163
- function onVisibilityChange(listener) {
164
- let hiddenPropName = void 0, hiddenEventName = void 0;
165
- if (typeof document.hidden !== "undefined") {
166
- hiddenPropName = "hidden";
167
- hiddenEventName = "visibilitychange";
168
- } else if ("msHidden" in document && typeof document.msHidden !== "undefined") {
169
- hiddenPropName = "msHidden";
170
- hiddenEventName = "msvisibilitychange";
171
- } else if ("webkitHidden" in document && typeof document.webkitHidden !== "undefined") {
172
- hiddenPropName = "webkitHidden";
173
- hiddenEventName = "webkitvisibilitychange";
174
- }
175
- if (!hiddenPropName || !hiddenEventName) {
176
- return null;
177
- }
178
- const handler = () => {
179
- listener(document[hiddenPropName]);
180
- };
181
- document.addEventListener(hiddenEventName, handler);
182
- return () => {
183
- document.removeEventListener(hiddenEventName, handler);
184
- };
185
- }
186
- function shuffle(arr) {
187
- const clone = arr.slice();
188
- for (let i = clone.length - 1; i > 0; i--) {
189
- const j = Math.floor(Math.random() * (i + 1));
190
- [clone[i], clone[j]] = [clone[j], clone[i]];
191
- }
192
- return clone;
193
- }
194
- function randomInt(min, max) {
195
- return Math.floor(Math.random() * (max - min + 1)) + min;
196
- }
197
- function randomFloat(min, max) {
198
- return Math.random() * (max - min) + min;
199
- }
200
- function sample(arr, count) {
201
- return shuffle(arr).slice(0, count);
202
- }
203
- function sampleWithReplacement(arr, count) {
204
- const result = [];
205
- for (let i = 0; i < count; i++) {
206
- const index = randomInt(0, arr.length - 1);
207
- result.push(arr[index]);
208
- }
209
- return result;
210
- }
211
- function sampleOne(arr) {
212
- return arr[randomInt(0, arr.length - 1)];
213
- }
214
- function random1ToN(n) {
215
- return randomInt(1, n);
216
- }
217
- exports2.AbortedError = AbortedError;
218
- exports2.BaseUtils = BaseUtils;
219
- exports2.BizResult = BizResult;
220
- exports2.CommonError = CommonError;
221
- exports2.execBiz = execBiz;
222
- exports2.getNetworkInfo = getNetworkInfo;
223
- exports2.onNetworkChange = onNetworkChange;
224
- exports2.onVisibilityChange = onVisibilityChange;
225
- exports2.random1ToN = random1ToN;
226
- exports2.randomFloat = randomFloat;
227
- exports2.runRandomFunctions = runRandomFunctions;
228
- exports2.sample = sample;
229
- exports2.sampleOne = sampleOne;
230
- exports2.sampleWithReplacement = sampleWithReplacement;
231
- exports2.shuffle = shuffle;
232
- Object.defineProperty(exports2, Symbol.toStringTag, { value: "Module" });
233
- }));
234
- //# sourceMappingURL=index.umd.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.umd.js","sources":["../src/utils/base-utils.ts","../src/types/error.ts","../src/utils/biz-result.ts","../src/utils/function-utils.ts","../src/utils/network-utils.ts","../src/utils/page-utils.ts","../src/utils/random-utils.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { CommonError } from '../types/error';\n\n/**\n * 基础工具集\n */\nexport class BaseUtils {\n /**\n * 判断是否为通用异常\n * @param error 需要判断的异常\n */\n static isCommonError(error: unknown): error is CommonError {\n return error instanceof CommonError\n }\n\n /**\n * 获取错误信息\n * @param error\n */\n static getErrorMessage(error: unknown): string {\n return this.convertToCommonError(error).message\n }\n\n /**\n * 设置异常信息的前置提示\n * @param error 异常\n * @param preMsg 前置信息 `${preMsg}${error.message}`\n */\n static prependErrorMessage(error: CommonError, preMsg?: string): CommonError {\n if (preMsg) {\n error.message = `${preMsg} ${error.message}`\n }\n return error\n }\n\n /**\n * 转换到通用异常\n * @param error 异常\n * @param preMsg 前置提示 `${preMsg}${error.message}`\n */\n static convertToCommonError(error: unknown, preMsg?: string): CommonError {\n if (this.isCommonError(error)) {\n return this.prependErrorMessage(error, preMsg)\n }\n if (\n typeof error === 'object' &&\n error !== null &&\n 'message' in error &&\n typeof (error as Record<string, unknown>).message === 'string'\n ) {\n const newError = error as { message: string }\n return this.prependErrorMessage(new CommonError(newError.message), preMsg)\n } else {\n // 如果抛出的异常不是object\n return this.prependErrorMessage(new CommonError(String(error)), preMsg)\n }\n }\n\n /**\n * 格式化时间为 2020-02-02 20:20:20 的字符串\n * @param date 需要格式化的时间,为空则获取当前时间\n */\n static getFormattedDateTime(date?: Date): string {\n return dayjs(date).format('YYYY-MM-DD HH:mm:ss')\n }\n\n /**\n * 格式化时间为 2020-02-02 的字符串\n * @param date 需要格式化的时间,为空则获取当前时间\n */\n static getFormattedDate(date?: Date): string {\n return dayjs(date).format('YYYY-MM-DD')\n }\n\n /**\n * 格式化时间为 20:20:20 的字符串\n * @param date 需要格式化的时间,为空则获取当前时间\n */\n static getFormattedTime(date?: Date): string {\n return dayjs(date).format('HH:mm:ss')\n }\n}\n","import {BaseUtils} from \"../utils/base-utils.ts\";\n\n/**\n * 通用异常\n */\nexport class CommonError {\n message: string;\n error?: unknown;\n\n constructor(message: string, error?: unknown) {\n this.message = error ? `${message} ${BaseUtils.getErrorMessage(error)}` : message;\n this.error = error;\n }\n}\n\n/**\n * 中止异常\n */\nexport class AbortedError extends CommonError {\n constructor() {\n super(\"操作已取消\");\n }\n}\n","import { CommonError } from '../types/error'\nimport { BaseUtils } from './base-utils'\n\n/**\n * 业务执行结果\n */\nexport class BizResult<T> {\n success: boolean\n msg: string\n data?: T\n\n constructor(success: boolean, msg: string, data?: T) {\n this.success = success\n this.msg = msg\n this.data = data\n }\n\n static createSuccess<T>(data: T) {\n return new BizResult(true, '操作成功', data)\n }\n\n static createFail<T>(msg: string = '操作失败', data?: T) {\n return new BizResult(false, msg, data)\n }\n\n static createError<T>(e: unknown) {\n return new BizResult<T>(false, BaseUtils.getErrorMessage(e))\n }\n\n /**\n * 展开成Promise\n */\n async toPromise(): Promise<void>\n async toPromise<T>(): Promise<T>\n async toPromise<T = void>(): Promise<T> {\n if (this.success) {\n return this.data as T\n } else {\n throw new CommonError(this.msg)\n }\n }\n}\n\n/**\n * 执行业务(自动包裹BuResult)\n * @param run 执行方法\n */\nexport const execBiz = async <T>(run: () => Promise<T>): Promise<BizResult<T>> => {\n try {\n return BizResult.createSuccess<T>(await run())\n } catch (e) {\n return BizResult.createError(e)\n }\n}\n","/**\n * 随机运行参数\n * @param fns\n * @param maxCount 最多执行次数(1 ~ fns.length)\n */\nexport function runRandomFunctions(fns: Array<() => void>, maxCount?: number): void {\n maxCount = maxCount ?? fns.length\n const count = Math.floor(Math.random() * maxCount) + 1\n\n const shuffled = [...fns]\n for (let i = shuffled.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1))\n ;[shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]\n }\n\n const selected = shuffled.slice(0, count)\n\n for (const fn of selected) {\n fn()\n }\n}\n","interface NetworkInformation extends EventTarget {\n // 带宽(估算)\n downlink: number;\n // 延迟(估算)\n rtt: number;\n // 类型(估算)\n effectiveType: 'slow-2g' | '2g' | '3g' | '4g';\n}\n\n/**\n * 网络状态信息\n * - 'offline': 无网络\n * - 'online': 在线但不支持 NetworkInformation API\n * - NetworkInformation: 含详细网络信息\n */\nexport type NetworkInfo = 'offline' | Omit<NetworkInformation, keyof EventTarget> | 'online'\n\nfunction isConnection(obj: any): obj is NetworkInformation {\n return obj && typeof obj === 'object' && 'downlink' in obj && 'rtt' in obj && 'effectiveType' in obj;\n}\n\n/**\n * 获取网络信息\n */\nexport function getNetworkInfo(): NetworkInfo {\n if (!navigator.onLine) {\n return 'offline'\n }\n\n if ('connection' in navigator && isConnection(navigator.connection)) {\n // 现代 Web API 直接获取网络连接的信息\n const connection = navigator.connection;\n return {\n downlink: connection.downlink,\n rtt: connection.rtt,\n effectiveType: connection.effectiveType\n }\n } else {\n return 'online'\n }\n\n}\n\n/**\n * 监听网络状态变化\n * @param listener 监听器\n * @returns 成功监听时返回解绑函数\n */\nexport function onNetworkChange(listener: (info: NetworkInfo) => void) {\n\n const handleChange = () => {\n listener(getNetworkInfo())\n }\n\n if ('connection' in navigator && isConnection(navigator.connection)) {\n // 现代 Web API\n let connection = navigator.connection;\n connection.addEventListener('change', handleChange)\n return () => connection.removeEventListener('change', handleChange);\n } else {\n\n window.addEventListener('online', handleChange)\n window.addEventListener('offline', handleChange)\n return () => {\n window.removeEventListener('online', handleChange);\n window.removeEventListener('offline', handleChange);\n };\n }\n}\n","// 可见性改变的监听器\nexport interface VisibilityChangeListener {\n (hidden: boolean): void;\n}\n\n/**\n * 监听页面可见性变化(兼容旧的IE/Chrome)\n * @param listener 监听器\n * @returns 成功监听时返回解绑函数\n */\nexport function onVisibilityChange(listener: VisibilityChangeListener) {\n let hiddenPropName: string | undefined = undefined,\n hiddenEventName: string | undefined = undefined;\n\n if (typeof document.hidden !== \"undefined\") {\n // 现代 Web API\n hiddenPropName = 'hidden';\n hiddenEventName = 'visibilitychange'\n } else if ('msHidden' in document && typeof document.msHidden !== \"undefined\") {\n // 旧 IE\n hiddenPropName = 'msHidden';\n hiddenEventName = 'msvisibilitychange'\n } else if ('webkitHidden' in document && typeof document.webkitHidden !== \"undefined\") {\n // 旧 Chrome\n hiddenPropName = 'webkitHidden';\n hiddenEventName = 'webkitvisibilitychange'\n }\n\n if (!hiddenPropName || !hiddenEventName) {\n return null;\n }\n\n const handler = () => {\n // @ts-ignore\n listener(document[hiddenPropName]);\n };\n\n document.addEventListener(hiddenEventName, handler);\n\n return () => {\n document.removeEventListener(hiddenEventName, handler);\n };\n}\n\n","/**\n * 数组洗牌\n */\nexport function shuffle<T>(arr: T[]): T[] {\n const clone = arr.slice();\n for (let i = clone.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [clone[i], clone[j]] = [clone[j], clone[i]];\n }\n return clone;\n}\n\n/**\n * 获取 [min, max] 的随机整数\n */\nfunction randomInt(min: number, max: number): number {\n return Math.floor(Math.random() * (max - min + 1)) + min;\n}\n\n/**\n * 获取 [min, max) 的随机浮点数\n */\nexport function randomFloat(min: number, max: number): number {\n return Math.random() * (max - min) + min;\n}\n\n/**\n * 从数组中随机取若干项,不可重复\n */\nexport function sample<T>(arr: T[], count: number): T[] {\n return shuffle(arr).slice(0, count);\n}\n\n/**\n * 从数组中随机取若干项,可重复\n */\nexport function sampleWithReplacement<T>(arr: T[], count: number): T[] {\n const result: T[] = [];\n for (let i = 0; i < count; i++) {\n const index = randomInt(0, arr.length - 1);\n result.push(arr[index]);\n }\n return result;\n}\n\n/**\n * 从数组中获取随机项\n */\nexport function sampleOne<T>(arr: T[]): T {\n return arr[randomInt(0, arr.length - 1)];\n}\n\n/**\n * 获取 1~n 的随机数\n */\nexport function random1ToN(n: number): number {\n return randomInt(1, n);\n}\n"],"names":[],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- /**
2
- * 提取getter属性
3
- */
4
- export type ExtractGetterProperties<T> = {
5
- [K in keyof T as K extends `get${infer Rest}` ? Uncapitalize<Rest> : never]: T[K] extends (...args: any[]) => Promise<infer R> ? R : never;
6
- };
File without changes
@@ -1,43 +0,0 @@
1
- import { CommonError } from '../types/error';
2
- /**
3
- * 基础工具集
4
- */
5
- export declare class BaseUtils {
6
- /**
7
- * 判断是否为通用异常
8
- * @param error 需要判断的异常
9
- */
10
- static isCommonError(error: unknown): error is CommonError;
11
- /**
12
- * 获取错误信息
13
- * @param error
14
- */
15
- static getErrorMessage(error: unknown): string;
16
- /**
17
- * 设置异常信息的前置提示
18
- * @param error 异常
19
- * @param preMsg 前置信息 `${preMsg}${error.message}`
20
- */
21
- static prependErrorMessage(error: CommonError, preMsg?: string): CommonError;
22
- /**
23
- * 转换到通用异常
24
- * @param error 异常
25
- * @param preMsg 前置提示 `${preMsg}${error.message}`
26
- */
27
- static convertToCommonError(error: unknown, preMsg?: string): CommonError;
28
- /**
29
- * 格式化时间为 2020-02-02 20:20:20 的字符串
30
- * @param date 需要格式化的时间,为空则获取当前时间
31
- */
32
- static getFormattedDateTime(date?: Date): string;
33
- /**
34
- * 格式化时间为 2020-02-02 的字符串
35
- * @param date 需要格式化的时间,为空则获取当前时间
36
- */
37
- static getFormattedDate(date?: Date): string;
38
- /**
39
- * 格式化时间为 20:20:20 的字符串
40
- * @param date 需要格式化的时间,为空则获取当前时间
41
- */
42
- static getFormattedTime(date?: Date): string;
43
- }
@@ -1,6 +0,0 @@
1
- /**
2
- * 随机运行参数
3
- * @param fns
4
- * @param maxCount 最多执行次数(1 ~ fns.length)
5
- */
6
- export declare function runRandomFunctions(fns: Array<() => void>, maxCount?: number): void;