@ybgnb/utils 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -2,3 +2,5 @@ export * from './types/error';
2
2
  export * from './types/extended-type';
3
3
  export * from './utils/base-utils';
4
4
  export * from './utils/biz-result';
5
+ export * from './utils/network-utils';
6
+ export * from './utils/page-utils';
package/dist/index.mjs CHANGED
@@ -1,15 +1,4 @@
1
1
  import dayjs from "dayjs";
2
- class CommonError {
3
- message;
4
- constructor(message) {
5
- this.message = message;
6
- }
7
- }
8
- class AbortedError extends CommonError {
9
- constructor() {
10
- super("操作已取消");
11
- }
12
- }
13
2
  class BaseUtils {
14
3
  /**
15
4
  * 判断是否为通用异常
@@ -32,7 +21,7 @@ class BaseUtils {
32
21
  */
33
22
  static prependErrorMessage(error, preMsg) {
34
23
  if (preMsg) {
35
- error.message = `${preMsg}${error.message}`;
24
+ error.message = `${preMsg} ${error.message}`;
36
25
  }
37
26
  return error;
38
27
  }
@@ -56,24 +45,37 @@ class BaseUtils {
56
45
  * 格式化时间为 2020-02-02 20:20:20 的字符串
57
46
  * @param date 需要格式化的时间,为空则获取当前时间
58
47
  */
59
- static getFormatedDateTime(date) {
48
+ static getFormattedDateTime(date) {
60
49
  return dayjs(date).format("YYYY-MM-DD HH:mm:ss");
61
50
  }
62
51
  /**
63
52
  * 格式化时间为 2020-02-02 的字符串
64
53
  * @param date 需要格式化的时间,为空则获取当前时间
65
54
  */
66
- static getFormatedDate(date) {
55
+ static getFormattedDate(date) {
67
56
  return dayjs(date).format("YYYY-MM-DD");
68
57
  }
69
58
  /**
70
59
  * 格式化时间为 20:20:20 的字符串
71
60
  * @param date 需要格式化的时间,为空则获取当前时间
72
61
  */
73
- static getFormatedTime(date) {
62
+ static getFormattedTime(date) {
74
63
  return dayjs(date).format("HH:mm:ss");
75
64
  }
76
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
+ }
77
79
  class BizResult {
78
80
  success;
79
81
  msg;
@@ -107,11 +109,72 @@ const execBiz = async (run) => {
107
109
  return BizResult.createError(e);
108
110
  }
109
111
  };
112
+ function isConnection(obj) {
113
+ return obj && typeof obj === "object" && "downlink" in obj && "rtt" in obj && "effectiveType" in obj;
114
+ }
115
+ function getNetworkInfo() {
116
+ if (!navigator.onLine) {
117
+ return "offline";
118
+ }
119
+ if ("connection" in navigator && isConnection(navigator.connection)) {
120
+ const connection = navigator.connection;
121
+ return {
122
+ downlink: connection.downlink,
123
+ rtt: connection.rtt,
124
+ effectiveType: connection.effectiveType
125
+ };
126
+ } else {
127
+ return "online";
128
+ }
129
+ }
130
+ function onNetworkChange(listener) {
131
+ const handleChange = () => {
132
+ listener(getNetworkInfo());
133
+ };
134
+ if ("connection" in navigator && isConnection(navigator.connection)) {
135
+ let connection = navigator.connection;
136
+ connection.addEventListener("change", handleChange);
137
+ return () => connection.removeEventListener("change", handleChange);
138
+ } else {
139
+ window.addEventListener("online", handleChange);
140
+ window.addEventListener("offline", handleChange);
141
+ return () => {
142
+ window.removeEventListener("online", handleChange);
143
+ window.removeEventListener("offline", handleChange);
144
+ };
145
+ }
146
+ }
147
+ function onVisibilityChange(listener) {
148
+ let hiddenPropName = void 0, hiddenEventName = void 0;
149
+ if (typeof document.hidden !== "undefined") {
150
+ hiddenPropName = "hidden";
151
+ hiddenEventName = "visibilitychange";
152
+ } else if ("msHidden" in document && typeof document.msHidden !== "undefined") {
153
+ hiddenPropName = "msHidden";
154
+ hiddenEventName = "msvisibilitychange";
155
+ } else if ("webkitHidden" in document && typeof document.webkitHidden !== "undefined") {
156
+ hiddenPropName = "webkitHidden";
157
+ hiddenEventName = "webkitvisibilitychange";
158
+ }
159
+ if (!hiddenPropName || !hiddenEventName) {
160
+ return null;
161
+ }
162
+ const handler = () => {
163
+ listener(document[hiddenPropName]);
164
+ };
165
+ document.addEventListener(hiddenEventName, handler);
166
+ return () => {
167
+ document.removeEventListener(hiddenEventName, handler);
168
+ };
169
+ }
110
170
  export {
111
171
  AbortedError,
112
172
  BaseUtils,
113
173
  BizResult,
114
174
  CommonError,
115
- execBiz
175
+ execBiz,
176
+ getNetworkInfo,
177
+ onNetworkChange,
178
+ onVisibilityChange
116
179
  };
117
180
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/types/error.ts","../src/utils/base-utils.ts","../src/utils/biz-result.ts"],"sourcesContent":["/**\n * 通用异常\n */\nexport class CommonError {\n message: string;\n\n constructor(message: string) {\n this.message = message;\n }\n}\n\n/**\n * 终止异常\n */\nexport class AbortedError extends CommonError {\n constructor() {\n super(\"操作已取消\");\n }\n}\n","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 getFormatedDateTime(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 getFormatedDate(date?: Date): string {\n return dayjs(date).format('YYYY-MM-DD')\n }\n\n /**\n * 格式化时间为 20:20:20 的字符串\n * @param date 需要格式化的时间,为空则获取当前时间\n */\n static getFormatedTime(date?: Date): string {\n return dayjs(date).format('HH:mm:ss')\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"],"names":[],"mappings":";AAGO,MAAM,YAAY;AAAA,EACvB;AAAA,EAEA,YAAY,SAAiB;AAC3B,SAAK,UAAU;AAAA,EACjB;AACF;AAKO,MAAM,qBAAqB,YAAY;AAAA,EAC5C,cAAc;AACZ,UAAM,OAAO;AAAA,EACf;AACF;ACZO,MAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,EAKrB,OAAO,cAAc,OAAsC;AACzD,WAAO,iBAAiB;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,gBAAgB,OAAwB;AAC7C,WAAO,KAAK,qBAAqB,KAAK,EAAE;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,oBAAoB,OAAoB,QAA8B;AAC3E,QAAI,QAAQ;AACV,YAAM,UAAU,GAAG,MAAM,GAAG,MAAM,OAAO;AAAA,IAC3C;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,qBAAqB,OAAgB,QAA8B;AACxE,QAAI,KAAK,cAAc,KAAK,GAAG;AAC7B,aAAO,KAAK,oBAAoB,OAAO,MAAM;AAAA,IAC/C;AACA,QACE,OAAO,UAAU,YACjB,UAAU,QACV,aAAa,SACb,OAAQ,MAAkC,YAAY,UACtD;AACA,YAAM,WAAW;AACjB,aAAO,KAAK,oBAAoB,IAAI,YAAY,SAAS,OAAO,GAAG,MAAM;AAAA,IAC3E,OAAO;AAEL,aAAO,KAAK,oBAAoB,IAAI,YAAY,OAAO,KAAK,CAAC,GAAG,MAAM;AAAA,IACxE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,oBAAoB,MAAqB;AAC9C,WAAO,MAAM,IAAI,EAAE,OAAO,qBAAqB;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,gBAAgB,MAAqB;AAC1C,WAAO,MAAM,IAAI,EAAE,OAAO,YAAY;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,gBAAgB,MAAqB;AAC1C,WAAO,MAAM,IAAI,EAAE,OAAO,UAAU;AAAA,EACtC;AACF;AC3EO,MAAM,UAAa;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,SAAkB,KAAa,MAAU;AACnD,SAAK,UAAU;AACf,SAAK,MAAM;AACX,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,OAAO,cAAiB,MAAS;AAC/B,WAAO,IAAI,UAAU,MAAM,QAAQ,IAAI;AAAA,EACzC;AAAA,EAEA,OAAO,WAAc,MAAc,QAAQ,MAAU;AACnD,WAAO,IAAI,UAAU,OAAO,KAAK,IAAI;AAAA,EACvC;AAAA,EAEA,OAAO,YAAe,GAAY;AAChC,WAAO,IAAI,UAAa,OAAO,UAAU,gBAAgB,CAAC,CAAC;AAAA,EAC7D;AAAA,EAOA,MAAM,YAAkC;AACtC,QAAI,KAAK,SAAS;AAChB,aAAO,KAAK;AAAA,IACd,OAAO;AACL,YAAM,IAAI,YAAY,KAAK,GAAG;AAAA,IAChC;AAAA,EACF;AACF;AAMO,MAAM,UAAU,OAAU,QAAiD;AAChF,MAAI;AACF,WAAO,UAAU,cAAiB,MAAM,KAAK;AAAA,EAC/C,SAAS,GAAG;AACV,WAAO,UAAU,YAAY,CAAC;AAAA,EAChC;AACF;"}
1
+ {"version":3,"file":"index.mjs","sources":["../src/utils/base-utils.ts","../src/types/error.ts","../src/utils/biz-result.ts","../src/utils/network-utils.ts","../src/utils/page-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","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"],"names":[],"mappings":"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"}
package/dist/index.umd.js CHANGED
@@ -2,17 +2,6 @@
2
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
3
  })(this, (function(exports2, dayjs) {
4
4
  "use strict";
5
- class CommonError {
6
- message;
7
- constructor(message) {
8
- this.message = message;
9
- }
10
- }
11
- class AbortedError extends CommonError {
12
- constructor() {
13
- super("操作已取消");
14
- }
15
- }
16
5
  class BaseUtils {
17
6
  /**
18
7
  * 判断是否为通用异常
@@ -35,7 +24,7 @@
35
24
  */
36
25
  static prependErrorMessage(error, preMsg) {
37
26
  if (preMsg) {
38
- error.message = `${preMsg}${error.message}`;
27
+ error.message = `${preMsg} ${error.message}`;
39
28
  }
40
29
  return error;
41
30
  }
@@ -59,24 +48,37 @@
59
48
  * 格式化时间为 2020-02-02 20:20:20 的字符串
60
49
  * @param date 需要格式化的时间,为空则获取当前时间
61
50
  */
62
- static getFormatedDateTime(date) {
51
+ static getFormattedDateTime(date) {
63
52
  return dayjs(date).format("YYYY-MM-DD HH:mm:ss");
64
53
  }
65
54
  /**
66
55
  * 格式化时间为 2020-02-02 的字符串
67
56
  * @param date 需要格式化的时间,为空则获取当前时间
68
57
  */
69
- static getFormatedDate(date) {
58
+ static getFormattedDate(date) {
70
59
  return dayjs(date).format("YYYY-MM-DD");
71
60
  }
72
61
  /**
73
62
  * 格式化时间为 20:20:20 的字符串
74
63
  * @param date 需要格式化的时间,为空则获取当前时间
75
64
  */
76
- static getFormatedTime(date) {
65
+ static getFormattedTime(date) {
77
66
  return dayjs(date).format("HH:mm:ss");
78
67
  }
79
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
+ }
80
82
  class BizResult {
81
83
  success;
82
84
  msg;
@@ -110,11 +112,72 @@
110
112
  return BizResult.createError(e);
111
113
  }
112
114
  };
115
+ function isConnection(obj) {
116
+ return obj && typeof obj === "object" && "downlink" in obj && "rtt" in obj && "effectiveType" in obj;
117
+ }
118
+ function getNetworkInfo() {
119
+ if (!navigator.onLine) {
120
+ return "offline";
121
+ }
122
+ if ("connection" in navigator && isConnection(navigator.connection)) {
123
+ const connection = navigator.connection;
124
+ return {
125
+ downlink: connection.downlink,
126
+ rtt: connection.rtt,
127
+ effectiveType: connection.effectiveType
128
+ };
129
+ } else {
130
+ return "online";
131
+ }
132
+ }
133
+ function onNetworkChange(listener) {
134
+ const handleChange = () => {
135
+ listener(getNetworkInfo());
136
+ };
137
+ if ("connection" in navigator && isConnection(navigator.connection)) {
138
+ let connection = navigator.connection;
139
+ connection.addEventListener("change", handleChange);
140
+ return () => connection.removeEventListener("change", handleChange);
141
+ } else {
142
+ window.addEventListener("online", handleChange);
143
+ window.addEventListener("offline", handleChange);
144
+ return () => {
145
+ window.removeEventListener("online", handleChange);
146
+ window.removeEventListener("offline", handleChange);
147
+ };
148
+ }
149
+ }
150
+ function onVisibilityChange(listener) {
151
+ let hiddenPropName = void 0, hiddenEventName = void 0;
152
+ if (typeof document.hidden !== "undefined") {
153
+ hiddenPropName = "hidden";
154
+ hiddenEventName = "visibilitychange";
155
+ } else if ("msHidden" in document && typeof document.msHidden !== "undefined") {
156
+ hiddenPropName = "msHidden";
157
+ hiddenEventName = "msvisibilitychange";
158
+ } else if ("webkitHidden" in document && typeof document.webkitHidden !== "undefined") {
159
+ hiddenPropName = "webkitHidden";
160
+ hiddenEventName = "webkitvisibilitychange";
161
+ }
162
+ if (!hiddenPropName || !hiddenEventName) {
163
+ return null;
164
+ }
165
+ const handler = () => {
166
+ listener(document[hiddenPropName]);
167
+ };
168
+ document.addEventListener(hiddenEventName, handler);
169
+ return () => {
170
+ document.removeEventListener(hiddenEventName, handler);
171
+ };
172
+ }
113
173
  exports2.AbortedError = AbortedError;
114
174
  exports2.BaseUtils = BaseUtils;
115
175
  exports2.BizResult = BizResult;
116
176
  exports2.CommonError = CommonError;
117
177
  exports2.execBiz = execBiz;
178
+ exports2.getNetworkInfo = getNetworkInfo;
179
+ exports2.onNetworkChange = onNetworkChange;
180
+ exports2.onVisibilityChange = onVisibilityChange;
118
181
  Object.defineProperty(exports2, Symbol.toStringTag, { value: "Module" });
119
182
  }));
120
183
  //# sourceMappingURL=index.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.js","sources":["../src/types/error.ts","../src/utils/base-utils.ts","../src/utils/biz-result.ts"],"sourcesContent":["/**\n * 通用异常\n */\nexport class CommonError {\n message: string;\n\n constructor(message: string) {\n this.message = message;\n }\n}\n\n/**\n * 终止异常\n */\nexport class AbortedError extends CommonError {\n constructor() {\n super(\"操作已取消\");\n }\n}\n","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 getFormatedDateTime(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 getFormatedDate(date?: Date): string {\n return dayjs(date).format('YYYY-MM-DD')\n }\n\n /**\n * 格式化时间为 20:20:20 的字符串\n * @param date 需要格式化的时间,为空则获取当前时间\n */\n static getFormatedTime(date?: Date): string {\n return dayjs(date).format('HH:mm:ss')\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"],"names":[],"mappings":";;;;EAGO,MAAM,YAAY;AAAA,IACvB;AAAA,IAEA,YAAY,SAAiB;AAC3B,WAAK,UAAU;AAAA,IACjB;AAAA,EACF;AAAA,EAKO,MAAM,qBAAqB,YAAY;AAAA,IAC5C,cAAc;AACZ,YAAM,OAAO;AAAA,IACf;AAAA,EACF;AAAA,ECZO,MAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,IAKrB,OAAO,cAAc,OAAsC;AACzD,aAAO,iBAAiB;AAAA,IAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,OAAO,gBAAgB,OAAwB;AAC7C,aAAO,KAAK,qBAAqB,KAAK,EAAE;AAAA,IAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,OAAO,oBAAoB,OAAoB,QAA8B;AAC3E,UAAI,QAAQ;AACV,cAAM,UAAU,GAAG,MAAM,GAAG,MAAM,OAAO;AAAA,MAC3C;AACA,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,OAAO,qBAAqB,OAAgB,QAA8B;AACxE,UAAI,KAAK,cAAc,KAAK,GAAG;AAC7B,eAAO,KAAK,oBAAoB,OAAO,MAAM;AAAA,MAC/C;AACA,UACE,OAAO,UAAU,YACjB,UAAU,QACV,aAAa,SACb,OAAQ,MAAkC,YAAY,UACtD;AACA,cAAM,WAAW;AACjB,eAAO,KAAK,oBAAoB,IAAI,YAAY,SAAS,OAAO,GAAG,MAAM;AAAA,MAC3E,OAAO;AAEL,eAAO,KAAK,oBAAoB,IAAI,YAAY,OAAO,KAAK,CAAC,GAAG,MAAM;AAAA,MACxE;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,OAAO,oBAAoB,MAAqB;AAC9C,aAAO,MAAM,IAAI,EAAE,OAAO,qBAAqB;AAAA,IACjD;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,OAAO,gBAAgB,MAAqB;AAC1C,aAAO,MAAM,IAAI,EAAE,OAAO,YAAY;AAAA,IACxC;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,OAAO,gBAAgB,MAAqB;AAC1C,aAAO,MAAM,IAAI,EAAE,OAAO,UAAU;AAAA,IACtC;AAAA,EACF;AAAA,EC3EO,MAAM,UAAa;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IAEA,YAAY,SAAkB,KAAa,MAAU;AACnD,WAAK,UAAU;AACf,WAAK,MAAM;AACX,WAAK,OAAO;AAAA,IACd;AAAA,IAEA,OAAO,cAAiB,MAAS;AAC/B,aAAO,IAAI,UAAU,MAAM,QAAQ,IAAI;AAAA,IACzC;AAAA,IAEA,OAAO,WAAc,MAAc,QAAQ,MAAU;AACnD,aAAO,IAAI,UAAU,OAAO,KAAK,IAAI;AAAA,IACvC;AAAA,IAEA,OAAO,YAAe,GAAY;AAChC,aAAO,IAAI,UAAa,OAAO,UAAU,gBAAgB,CAAC,CAAC;AAAA,IAC7D;AAAA,IAOA,MAAM,YAAkC;AACtC,UAAI,KAAK,SAAS;AAChB,eAAO,KAAK;AAAA,MACd,OAAO;AACL,cAAM,IAAI,YAAY,KAAK,GAAG;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAMO,QAAM,UAAU,OAAU,QAAiD;AAChF,QAAI;AACF,aAAO,UAAU,cAAiB,MAAM,KAAK;AAAA,IAC/C,SAAS,GAAG;AACV,aAAO,UAAU,YAAY,CAAC;AAAA,IAChC;AAAA,EACF;;;;;;;;"}
1
+ {"version":3,"file":"index.umd.js","sources":["../src/utils/base-utils.ts","../src/types/error.ts","../src/utils/biz-result.ts","../src/utils/network-utils.ts","../src/utils/page-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","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"],"names":[],"mappings":"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"}
@@ -3,10 +3,11 @@
3
3
  */
4
4
  export declare class CommonError {
5
5
  message: string;
6
- constructor(message: string);
6
+ error?: unknown;
7
+ constructor(message: string, error?: unknown);
7
8
  }
8
9
  /**
9
- * 终止异常
10
+ * 中止异常
10
11
  */
11
12
  export declare class AbortedError extends CommonError {
12
13
  constructor();
@@ -29,15 +29,15 @@ export declare class BaseUtils {
29
29
  * 格式化时间为 2020-02-02 20:20:20 的字符串
30
30
  * @param date 需要格式化的时间,为空则获取当前时间
31
31
  */
32
- static getFormatedDateTime(date?: Date): string;
32
+ static getFormattedDateTime(date?: Date): string;
33
33
  /**
34
34
  * 格式化时间为 2020-02-02 的字符串
35
35
  * @param date 需要格式化的时间,为空则获取当前时间
36
36
  */
37
- static getFormatedDate(date?: Date): string;
37
+ static getFormattedDate(date?: Date): string;
38
38
  /**
39
39
  * 格式化时间为 20:20:20 的字符串
40
40
  * @param date 需要格式化的时间,为空则获取当前时间
41
41
  */
42
- static getFormatedTime(date?: Date): string;
42
+ static getFormattedTime(date?: Date): string;
43
43
  }
@@ -0,0 +1,23 @@
1
+ interface NetworkInformation extends EventTarget {
2
+ downlink: number;
3
+ rtt: number;
4
+ effectiveType: 'slow-2g' | '2g' | '3g' | '4g';
5
+ }
6
+ /**
7
+ * 网络状态信息
8
+ * - 'offline': 无网络
9
+ * - 'online': 在线但不支持 NetworkInformation API
10
+ * - NetworkInformation: 含详细网络信息
11
+ */
12
+ export type NetworkInfo = 'offline' | Omit<NetworkInformation, keyof EventTarget> | 'online';
13
+ /**
14
+ * 获取网络信息
15
+ */
16
+ export declare function getNetworkInfo(): NetworkInfo;
17
+ /**
18
+ * 监听网络状态变化
19
+ * @param listener 监听器
20
+ * @returns 成功监听时返回解绑函数
21
+ */
22
+ export declare function onNetworkChange(listener: (info: NetworkInfo) => void): () => void;
23
+ export {};
@@ -0,0 +1,9 @@
1
+ export interface VisibilityChangeListener {
2
+ (hidden: boolean): void;
3
+ }
4
+ /**
5
+ * 监听页面可见性变化(兼容旧的IE/Chrome)
6
+ * @param listener 监听器
7
+ * @returns 成功监听时返回解绑函数
8
+ */
9
+ export declare function onVisibilityChange(listener: VisibilityChangeListener): (() => void) | null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ybgnb/utils",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "author": "hzhilong",
5
5
  "private": false,
6
6
  "description": "自用工具库",
@@ -18,9 +18,13 @@
18
18
  "dist"
19
19
  ],
20
20
  "scripts": {
21
+ "类型检查": "tsc --noEmit",
22
+ "代码检查": "eslint .",
21
23
  "build": "barrelsby -c barrelsby.json --delete --noHeader && vite build",
22
- "npm login": " npm login",
23
- "npm publish": " npm publish --access public"
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"
24
28
  },
25
29
  "repository": {
26
30
  "type": "git",
@@ -37,8 +41,11 @@
37
41
  "homepage": "https://github.com/hzhilong/ybgnb-js#readme",
38
42
  "devDependencies": {
39
43
  "barrelsby": "^2.8.1",
40
- "rimraf": "^5.0.5",
44
+ "eslint": "^9.35.0",
45
+ "eslint-config-prettier": "^10.1.8",
41
46
  "typescript": "^5.8.3",
47
+ "typescript-eslint": "^8.43.0",
48
+ "jiti": "^2.5.1",
42
49
  "vite": "^7.1.5",
43
50
  "vite-plugin-dts": "^4.5.4"
44
51
  },