@anjianshi/utils 2.9.0 → 3.0.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 (164) hide show
  1. package/README.md +10 -0
  2. package/eslint.config.cjs +33 -0
  3. package/package.json +19 -10
  4. package/publish-prepare.cjs +16 -0
  5. package/src/env-browser/device.ts +62 -0
  6. package/src/env-browser/global.ts +21 -0
  7. package/src/env-browser/load-script.ts +13 -0
  8. package/src/env-browser/logging.ts +58 -0
  9. package/src/env-browser/manage-vconsole.ts +54 -0
  10. package/src/env-node/crypto-random.ts +30 -0
  11. package/src/env-node/fs.ts +50 -0
  12. package/src/env-node/index.ts +5 -0
  13. package/src/env-node/logging/handlers.ts +190 -0
  14. package/src/env-node/logging/index.ts +16 -0
  15. package/{env-react/emotion-register-globals.d.ts → src/env-react/emotion-register-globals.ts} +5 -2
  16. package/src/env-react/emotion.tsx +42 -0
  17. package/src/env-react/hooks.ts +59 -0
  18. package/src/env-react/index.ts +1 -0
  19. package/src/env-react/react-register-globals.ts +53 -0
  20. package/src/env-service/controllers.ts +93 -0
  21. package/src/env-service/env-reader.ts +141 -0
  22. package/src/env-service/index.ts +6 -0
  23. package/src/env-service/prisma/adapt-logging.ts +39 -0
  24. package/src/env-service/prisma/extensions/exist.ts +21 -0
  25. package/src/env-service/prisma/extensions/find-and-count.ts +24 -0
  26. package/src/env-service/prisma/extensions/soft-delete.ts +162 -0
  27. package/src/env-service/prisma/extensions/with-transaction.ts +65 -0
  28. package/src/env-service/prisma/index.ts +6 -0
  29. package/src/env-service/prisma/transaction-contexted.ts +80 -0
  30. package/src/env-service/redis-cache.ts +142 -0
  31. package/src/env-service/tasks.ts +45 -0
  32. package/src/index.ts +4 -0
  33. package/src/init-dayjs.ts +8 -0
  34. package/src/lang/async.ts +47 -0
  35. package/src/lang/color.ts +119 -0
  36. package/src/lang/index.ts +8 -0
  37. package/src/lang/object.ts +39 -0
  38. package/src/lang/random.ts +25 -0
  39. package/src/lang/result.ts +78 -0
  40. package/src/lang/string.ts +95 -0
  41. package/src/lang/time.ts +19 -0
  42. package/{lang/types.d.ts → src/lang/types.ts} +43 -23
  43. package/src/logging/adapt.ts +49 -0
  44. package/src/logging/formatters.ts +23 -0
  45. package/src/logging/index.ts +106 -0
  46. package/src/md5.ts +318 -0
  47. package/src/safe-request.ts +193 -0
  48. package/src/url.ts +185 -0
  49. package/src/validators/array.ts +97 -0
  50. package/src/validators/base.ts +145 -0
  51. package/src/validators/boolean.ts +21 -0
  52. package/src/validators/datetime.ts +39 -0
  53. package/src/validators/factory.ts +244 -0
  54. package/src/validators/index.ts +9 -0
  55. package/src/validators/number.ts +54 -0
  56. package/src/validators/object.ts +101 -0
  57. package/src/validators/one-of.ts +33 -0
  58. package/src/validators/string.ts +72 -0
  59. package/env-browser/device.d.ts +0 -24
  60. package/env-browser/device.js +0 -50
  61. package/env-browser/global.d.ts +0 -10
  62. package/env-browser/global.js +0 -15
  63. package/env-browser/load-script.d.ts +0 -5
  64. package/env-browser/load-script.js +0 -13
  65. package/env-browser/logging.d.ts +0 -18
  66. package/env-browser/logging.js +0 -49
  67. package/env-browser/manage-vconsole.d.ts +0 -16
  68. package/env-browser/manage-vconsole.js +0 -38
  69. package/env-node/crypto-random.d.ts +0 -13
  70. package/env-node/crypto-random.js +0 -28
  71. package/env-node/fs.d.ts +0 -19
  72. package/env-node/fs.js +0 -48
  73. package/env-node/index.d.ts +0 -6
  74. package/env-node/index.js +0 -6
  75. package/env-node/logging/handlers.d.ts +0 -58
  76. package/env-node/logging/handlers.js +0 -154
  77. package/env-node/logging/index.d.ts +0 -11
  78. package/env-node/logging/index.js +0 -14
  79. package/env-node/safe-request.d.ts +0 -26
  80. package/env-node/safe-request.js +0 -40
  81. package/env-react/emotion-register-globals.js +0 -5
  82. package/env-react/emotion.d.ts +0 -20
  83. package/env-react/emotion.jsx +0 -34
  84. package/env-react/hooks.d.ts +0 -4
  85. package/env-react/hooks.js +0 -16
  86. package/env-react/index.d.ts +0 -1
  87. package/env-react/index.js +0 -1
  88. package/env-react/react-register-globals.d.ts +0 -21
  89. package/env-react/react-register-globals.js +0 -19
  90. package/env-service/controllers.d.ts +0 -30
  91. package/env-service/controllers.js +0 -41
  92. package/env-service/env-reader.d.ts +0 -55
  93. package/env-service/env-reader.js +0 -79
  94. package/env-service/index.d.ts +0 -6
  95. package/env-service/index.js +0 -6
  96. package/env-service/prisma/adapt-logging.d.ts +0 -21
  97. package/env-service/prisma/adapt-logging.js +0 -30
  98. package/env-service/prisma/extensions/exist.d.ts +0 -10
  99. package/env-service/prisma/extensions/exist.js +0 -16
  100. package/env-service/prisma/extensions/find-and-count.d.ts +0 -7
  101. package/env-service/prisma/extensions/find-and-count.js +0 -19
  102. package/env-service/prisma/extensions/soft-delete.d.ts +0 -52
  103. package/env-service/prisma/extensions/soft-delete.js +0 -123
  104. package/env-service/prisma/extensions/with-transaction.d.ts +0 -9
  105. package/env-service/prisma/extensions/with-transaction.js +0 -54
  106. package/env-service/prisma/index.d.ts +0 -6
  107. package/env-service/prisma/index.js +0 -6
  108. package/env-service/prisma/transaction-contexted.d.ts +0 -11
  109. package/env-service/prisma/transaction-contexted.js +0 -52
  110. package/env-service/redis-cache.d.ts +0 -39
  111. package/env-service/redis-cache.js +0 -116
  112. package/env-service/tasks.d.ts +0 -12
  113. package/env-service/tasks.js +0 -37
  114. package/index.d.ts +0 -3
  115. package/index.js +0 -3
  116. package/init-dayjs.d.ts +0 -2
  117. package/init-dayjs.js +0 -7
  118. package/lang/async.d.ts +0 -19
  119. package/lang/async.js +0 -34
  120. package/lang/color.d.ts +0 -37
  121. package/lang/color.js +0 -111
  122. package/lang/index.d.ts +0 -8
  123. package/lang/index.js +0 -8
  124. package/lang/may-success.d.ts +0 -40
  125. package/lang/may-success.js +0 -27
  126. package/lang/object.d.ts +0 -12
  127. package/lang/object.js +0 -41
  128. package/lang/random.d.ts +0 -13
  129. package/lang/random.js +0 -24
  130. package/lang/string.d.ts +0 -29
  131. package/lang/string.js +0 -92
  132. package/lang/time.d.ts +0 -10
  133. package/lang/time.js +0 -18
  134. package/lang/types.js +0 -28
  135. package/logging/adapt.d.ts +0 -10
  136. package/logging/adapt.js +0 -43
  137. package/logging/formatters.d.ts +0 -10
  138. package/logging/formatters.js +0 -22
  139. package/logging/index.d.ts +0 -45
  140. package/logging/index.js +0 -90
  141. package/md5.d.ts +0 -30
  142. package/md5.js +0 -308
  143. package/url.d.ts +0 -77
  144. package/url.js +0 -149
  145. package/validators/array.d.ts +0 -30
  146. package/validators/array.js +0 -47
  147. package/validators/base.d.ts +0 -82
  148. package/validators/base.js +0 -42
  149. package/validators/boolean.d.ts +0 -3
  150. package/validators/boolean.js +0 -22
  151. package/validators/datetime.d.ts +0 -12
  152. package/validators/datetime.js +0 -30
  153. package/validators/factory.d.ts +0 -70
  154. package/validators/factory.js +0 -121
  155. package/validators/index.d.ts +0 -9
  156. package/validators/index.js +0 -9
  157. package/validators/number.d.ts +0 -19
  158. package/validators/number.js +0 -26
  159. package/validators/object.d.ts +0 -28
  160. package/validators/object.js +0 -49
  161. package/validators/one-of.d.ts +0 -10
  162. package/validators/one-of.js +0 -15
  163. package/validators/string.d.ts +0 -22
  164. package/validators/string.js +0 -35
package/lang/async.js DELETED
@@ -1,34 +0,0 @@
1
- /**
2
- * 异步行为相关函数
3
- */
4
- async function sleep(ms, resolveValue) {
5
- return new Promise(resolve => {
6
- setTimeout(() => resolve(resolveValue), ms);
7
- });
8
- }
9
- export { sleep };
10
- /**
11
- * 给 Promise 增加时限。
12
- * - 若 silent 为 false,超时时 reject 一个 TimeoutError
13
- * - 若 silent 为 true,则超时后,promise 永远不会 resolve 或 reject
14
- */
15
- export async function timeout(promise, timeoutMS, silent = false) {
16
- return new Promise((resolve, reject) => {
17
- let isTimeout = false;
18
- setTimeout(() => {
19
- isTimeout = true;
20
- if (!silent)
21
- reject(new TimeoutError('timeout'));
22
- }, timeoutMS);
23
- promise.then(result => {
24
- if (!isTimeout)
25
- resolve(result);
26
- }, (error) => {
27
- if (!isTimeout)
28
- reject(error);
29
- });
30
- });
31
- }
32
- export class TimeoutError extends Error {
33
- isTimeout = true;
34
- }
package/lang/color.d.ts DELETED
@@ -1,37 +0,0 @@
1
- /**
2
- * 计算颜色数值
3
- */
4
- /**
5
- * hex 颜色字符串转换为 rgba 数值
6
- * 例如 '#22334455' => [34,51,68,0.33]
7
- *
8
- * hex 字符串支持以下格式:
9
- * - 带/不带开头的 #
10
- * - #RGB
11
- * - #RGBA
12
- * - #RRGGBB
13
- * - #RRGGBBAA
14
- */
15
- export declare function hex2rgba(rawHex: string): readonly [number, number, number, number];
16
- /**
17
- * 把 rgba 数组转换为 hex 颜色字符串
18
- * 如果 alpha 部分为 1,会将其省略
19
- * [34,51,68,0.33] => '#22334455'
20
- */
21
- export declare function rgba2hex(rgba: [number, number, number, number]): string;
22
- /**
23
- * rgb 转成 hsl 值(以便计算亮度)
24
- * https://www.rapidtables.com/convert/color/rgb-to-hsl.html
25
- */
26
- export declare function rgb2hsl([r, g, b]: [number, number, number]): readonly [number, number, number];
27
- /**
28
- * hsl 转成 rgb
29
- * https://www.rapidtables.com/convert/color/hsl-to-rgb.html
30
- */
31
- export declare function hsl2rgb([h, s, l]: [number, number, number]): readonly [number, number, number];
32
- /**
33
- * 调整颜色深浅
34
- * lightness('#111', 0.2) => lighten(20%)
35
- * lightness('#111', -0.5) => darken(50%)
36
- */
37
- export declare function lightness(hex: string, ratio: number): string;
package/lang/color.js DELETED
@@ -1,111 +0,0 @@
1
- /**
2
- * 计算颜色数值
3
- */
4
- /**
5
- * hex 颜色字符串转换为 rgba 数值
6
- * 例如 '#22334455' => [34,51,68,0.33]
7
- *
8
- * hex 字符串支持以下格式:
9
- * - 带/不带开头的 #
10
- * - #RGB
11
- * - #RGBA
12
- * - #RRGGBB
13
- * - #RRGGBBAA
14
- */
15
- export function hex2rgba(rawHex) {
16
- let hex = rawHex;
17
- if (hex.startsWith('#'))
18
- hex = hex.slice(1); // 去掉开头的 #
19
- if (hex.length === 3)
20
- hex = `${hex[0]}${hex[0]}${hex[1]}${hex[1]}${hex[2]}${hex[2]}FF`;
21
- if (hex.length === 4)
22
- hex = `${hex[0]}${hex[0]}${hex[1]}${hex[1]}${hex[2]}${hex[2]}${hex[3]}${hex[3]}`;
23
- if (hex.length === 6)
24
- hex = `${hex}FF`;
25
- if (hex.length !== 8)
26
- throw new Error(`不支持的颜色值:${rawHex}`);
27
- hex = hex.toUpperCase(); // 转成全大写
28
- const [r, g, b, a255] = [hex.slice(0, 2), hex.slice(2, 4), hex.slice(4, 6), hex.slice(6)].map(part => parseInt(part, 16));
29
- const a = Math.round((a255 / 255) * 100) / 100;
30
- return [r, g, b, a];
31
- }
32
- /**
33
- * 把 rgba 数组转换为 hex 颜色字符串
34
- * 如果 alpha 部分为 1,会将其省略
35
- * [34,51,68,0.33] => '#22334455'
36
- */
37
- export function rgba2hex(rgba) {
38
- const withAlpha = rgba[3] !== 1;
39
- return ('#' +
40
- [
41
- rgba[0].toString(16),
42
- rgba[1].toString(16),
43
- rgba[2].toString(16),
44
- ...(withAlpha ? [Math.round(rgba[3] * 255).toString(16)] : []),
45
- ]
46
- .map(v => (v.length === 1 ? `0${v}` : v))
47
- .join(''));
48
- }
49
- /**
50
- * rgb 转成 hsl 值(以便计算亮度)
51
- * https://www.rapidtables.com/convert/color/rgb-to-hsl.html
52
- */
53
- export function rgb2hsl([r, g, b]) {
54
- const [r1, g1, b1] = [r, g, b].map(v => v / 255);
55
- const cMax = Math.max(r1, g1, b1);
56
- const cMin = Math.min(r1, g1, b1);
57
- const delta = cMax - cMin;
58
- let h;
59
- if (delta === 0)
60
- h = 0;
61
- else if (cMax === r1)
62
- h = 60 * (((g1 - b1) / delta) % 6);
63
- else if (cMax === g1)
64
- h = 60 * ((b1 - r1) / delta + 2);
65
- else
66
- h = 60 * ((r1 - g1) / delta + 4);
67
- if (h < 0)
68
- h = 360 + h;
69
- const roundH = Math.round(h);
70
- const l = (cMax + cMin) / 2;
71
- const roundL = Math.round(l * 100) / 100;
72
- const s = delta === 0 ? 0 : delta / (1 - Math.abs(2 * l - 1));
73
- const roundS = Math.round(s * 100) / 100;
74
- return [roundH, roundS, roundL];
75
- }
76
- /**
77
- * hsl 转成 rgb
78
- * https://www.rapidtables.com/convert/color/hsl-to-rgb.html
79
- */
80
- export function hsl2rgb([h, s, l]) {
81
- const c = (1 - Math.abs(2 * l - 1)) * s;
82
- const x = c * (1 - Math.abs(((h / 60) % 2) - 1));
83
- const m = l - c / 2;
84
- const [r1, g1, b1] = (() => {
85
- if (h < 60)
86
- return [c, x, 0];
87
- if (h < 120)
88
- return [x, c, 0];
89
- if (h < 180)
90
- return [0, c, x];
91
- if (h < 240)
92
- return [0, x, c];
93
- if (h < 300)
94
- return [x, 0, c];
95
- return [c, 0, x];
96
- })();
97
- const [r, g, b] = [r1 + m, g1 + m, b1 + m].map(v => Math.round(v * 255));
98
- return [r, g, b];
99
- }
100
- /**
101
- * 调整颜色深浅
102
- * lightness('#111', 0.2) => lighten(20%)
103
- * lightness('#111', -0.5) => darken(50%)
104
- */
105
- export function lightness(hex, ratio) {
106
- const [r, g, b, a] = hex2rgba(hex);
107
- const [h, s, l] = rgb2hsl([r, g, b]);
108
- const l1 = Math.max(0, Math.min(1, l + ratio));
109
- const [r1, g1, b1] = hsl2rgb([h, s, l1]);
110
- return rgba2hex([r1, g1, b1, a]);
111
- }
package/lang/index.d.ts DELETED
@@ -1,8 +0,0 @@
1
- export * from './types.js';
2
- export * from './may-success.js';
3
- export * from './string.js';
4
- export * from './object.js';
5
- export * from './time.js';
6
- export * from './async.js';
7
- export * from './random.js';
8
- export * from './color.js';
package/lang/index.js DELETED
@@ -1,8 +0,0 @@
1
- export * from './types.js';
2
- export * from './may-success.js';
3
- export * from './string.js';
4
- export * from './object.js';
5
- export * from './time.js';
6
- export * from './async.js';
7
- export * from './random.js';
8
- export * from './color.js';
@@ -1,40 +0,0 @@
1
- /**
2
- * MaySuccess:代表一种“可能失败”的操作结果,可以作为函数返回值,也可以作为接口响应值。
3
- * 它的灵感来自 Scala 的 Option 类型。
4
- *
5
- * 原本,在 JavaScript 里一个可能失败的操作有两种表示失败的方式:
6
- * 1. 返回空值,如 null、0、''
7
- * 2. 抛出异常
8
- * 返回空值的方式无法附带失败信息;而抛出异常会导致层层嵌套的 try catch 语句,且其实性能不好。
9
- *
10
- * MaySuccess 就是为了解决这两个痛点:
11
- * 1. 它的 Failed 类型可以携带失败信息。
12
- * 2. 无需 try catch,只需简单的 result.success 判断
13
- */
14
- /** 类型定义 */
15
- export interface Success<T = void> {
16
- success: true;
17
- data: T;
18
- }
19
- export interface Failed<T = void> {
20
- success: false;
21
- message: string;
22
- code?: string | number;
23
- data: T;
24
- }
25
- export type MaySuccess<T = void, FT = void> = Success<T> | Failed<FT>;
26
- /** 生成 Success 数据 */
27
- declare function success(): Success;
28
- declare function success<T>(data: T): Success<T>;
29
- export { success };
30
- /** 生成 Failed 数据 */
31
- declare function failed(message: string, code?: string | number): Failed;
32
- declare function failed<T>(message: string, code: string | number | undefined, data: T): Failed<T>;
33
- export { failed };
34
- /**
35
- * 若传入值为 success,格式化其 data;否则原样返回错误
36
- * 支持传入会返回 MaySuccess 的 Promise
37
- */
38
- declare function formatSuccess<T1, T2, FT = void>(value: MaySuccess<T1, FT>, formatter: (value: T1) => T2): MaySuccess<T2, FT>;
39
- declare function formatSuccess<T1, T2, FT = void>(value: Promise<MaySuccess<T1, FT>>, formatter: (value: T1) => T2): Promise<MaySuccess<T2, FT>>;
40
- export { formatSuccess };
@@ -1,27 +0,0 @@
1
- /**
2
- * MaySuccess:代表一种“可能失败”的操作结果,可以作为函数返回值,也可以作为接口响应值。
3
- * 它的灵感来自 Scala 的 Option 类型。
4
- *
5
- * 原本,在 JavaScript 里一个可能失败的操作有两种表示失败的方式:
6
- * 1. 返回空值,如 null、0、''
7
- * 2. 抛出异常
8
- * 返回空值的方式无法附带失败信息;而抛出异常会导致层层嵌套的 try catch 语句,且其实性能不好。
9
- *
10
- * MaySuccess 就是为了解决这两个痛点:
11
- * 1. 它的 Failed 类型可以携带失败信息。
12
- * 2. 无需 try catch,只需简单的 result.success 判断
13
- */
14
- function success(data) {
15
- return { success: true, data };
16
- }
17
- export { success };
18
- function failed(message, code, data) {
19
- return { success: false, message, code, data: data };
20
- }
21
- export { failed };
22
- function formatSuccess(value, formatter) {
23
- if ('then' in value)
24
- return value.then(finalValue => formatSuccess(finalValue, formatter));
25
- return value.success ? success(formatter(value.data)) : value;
26
- }
27
- export { formatSuccess };
package/lang/object.d.ts DELETED
@@ -1,12 +0,0 @@
1
- /**
2
- * 对两个对象进行浅比较
3
- * 代码取自 react-addons-shallow-compare 包
4
- */
5
- export declare function shallowEqual(objA: unknown, objB: unknown): boolean;
6
- /**
7
- * 获取对象的方法,并将它的 this 锁定在原对象
8
- *
9
- * const method = getBoundMethod(object, 'someMethod')
10
- * method(1,2,3) // 不用担心 this 改变
11
- */
12
- export declare function getBoundMethod<T extends object, K extends keyof T>(object: T, key: K): T[K];
package/lang/object.js DELETED
@@ -1,41 +0,0 @@
1
- /**
2
- * 对两个对象进行浅比较
3
- * 代码取自 react-addons-shallow-compare 包
4
- */
5
- export function shallowEqual(objA, objB) {
6
- if (is(objA, objB))
7
- return true;
8
- if (!isObject(objA) || !isObject(objB))
9
- return false;
10
- const keysA = Object.keys(objA);
11
- const keysB = Object.keys(objB);
12
- if (keysA.length !== keysB.length)
13
- return false;
14
- // eslint-disable-next-line @typescript-eslint/prefer-for-of
15
- for (let i = 0; i < keysA.length; i++) {
16
- const key = keysA[i];
17
- // eslint-disable-next-line prefer-object-has-own
18
- if (!Object.prototype.hasOwnProperty.call(objB, key) || !is(objA[key], objB[key]))
19
- return false;
20
- }
21
- return true;
22
- }
23
- function is(x, y) {
24
- if (x === y)
25
- return x !== 0 || y !== 0 || 1 / x === 1 / y;
26
- else
27
- return x !== x && y !== y; // eslint-disable-line no-self-compare
28
- }
29
- function isObject(value) {
30
- return typeof value === 'object' && value !== null;
31
- }
32
- /**
33
- * 获取对象的方法,并将它的 this 锁定在原对象
34
- *
35
- * const method = getBoundMethod(object, 'someMethod')
36
- * method(1,2,3) // 不用担心 this 改变
37
- */
38
- export function getBoundMethod(object, key) {
39
- const property = object[key];
40
- return (typeof property === 'function' ? property.bind(object) : property);
41
- }
package/lang/random.d.ts DELETED
@@ -1,13 +0,0 @@
1
- /**
2
- * 返回随机数,包含 min 和 max
3
- */
4
- export declare function getRandomInt(min: number, max: number): number;
5
- /**
6
- * 返回随机字符串
7
- */
8
- export declare function getRandomString(length?: number, seed?: string): string;
9
- /**
10
- * 从给定的选择中随机选中一项
11
- * 如果数组为空,会返回 undefined
12
- */
13
- export declare function choiceRandom<T>(choices: T[]): T | undefined;
package/lang/random.js DELETED
@@ -1,24 +0,0 @@
1
- /**
2
- * 返回随机数,包含 min 和 max
3
- */
4
- export function getRandomInt(min, max) {
5
- const minCeiled = Math.ceil(min);
6
- const maxFloored = Math.floor(max);
7
- return Math.floor(Math.random() * (maxFloored - minCeiled + 1) + minCeiled);
8
- }
9
- /**
10
- * 返回随机字符串
11
- */
12
- export function getRandomString(length = 6, seed = '0123456789abcdefghijklmnopqrstuvwxyz') {
13
- let result = '';
14
- while (result.length < length)
15
- result += seed[getRandomInt(0, seed.length - 1)];
16
- return result;
17
- }
18
- /**
19
- * 从给定的选择中随机选中一项
20
- * 如果数组为空,会返回 undefined
21
- */
22
- export function choiceRandom(choices) {
23
- return choices[getRandomInt(0, choices.length - 1)];
24
- }
package/lang/string.d.ts DELETED
@@ -1,29 +0,0 @@
1
- /**
2
- * 将数字字符串化,并在左侧填充 0 直到达到 length 参数指定的长度
3
- * 若数字本身达到或超过此长度,则不填充
4
- */
5
- export declare function zfill(num: number, length?: number): string;
6
- export declare function keywordCompare(keyword: string, target: string): boolean;
7
- export declare function numericCompare(a: string, b: string): number;
8
- /**
9
- * 字符串解析成整数,补充安全措施:
10
- * 1. 默认设置 radix 为 10,无需再手动指定
11
- * 2. 支持指定 fallback,当解析出来的数字是 NaN 时返回这个值
12
- */
13
- export declare function safeParseInt(value: string | number, fallback?: number, redix?: number): number;
14
- /**
15
- * 字符串解析成浮点数;若解析结果是 NaN,返回 fallback
16
- */
17
- export declare function safeParseFloat(value: string | number, fallback: number): number;
18
- /**
19
- * 返回人类可读的文件尺寸
20
- * 来自:https://stackoverflow.com/a/14919494
21
- *
22
- * si: true 则使用 1000 进制,否则 1024 进制(默认 false)
23
- * dp: 保留几位小数
24
- */
25
- export declare function readableSize(bytes: number, si?: boolean, dp?: number): string;
26
- /**
27
- * 解析 JSON,失败时不抛出异常,而是返回 undefined
28
- */
29
- export declare function safeParseJSON<T>(json: string): T | undefined;
package/lang/string.js DELETED
@@ -1,92 +0,0 @@
1
- /**
2
- * 字符串处理相关函数
3
- */
4
- import escapeRegExp from 'lodash/escapeRegExp.js';
5
- import padStart from 'lodash/padStart.js';
6
- /**
7
- * 将数字字符串化,并在左侧填充 0 直到达到 length 参数指定的长度
8
- * 若数字本身达到或超过此长度,则不填充
9
- */
10
- export function zfill(num, length = 2) {
11
- return padStart(String(num), length, '0');
12
- }
13
- /**
14
- * 执行关键词匹配
15
- * 成功返回 true;失败返回 false
16
- */
17
- const kwCache = {}; // 避免大量重复构建正则表达式影响性能
18
- export function keywordCompare(keyword, target) {
19
- if (!keyword)
20
- return true;
21
- if (!(keyword in kwCache)) {
22
- const regStr = keyword.split('').map(escapeRegExp).join('.*');
23
- kwCache[keyword] = new RegExp(regStr, 'i');
24
- }
25
- return kwCache[keyword].test(target);
26
- }
27
- /**
28
- * 对两个字符串进行排序,支持处理逻辑上的数字。
29
- * 两个字符串都完全由数字组成,且都不以 0 开头时,以数字大小排序;否则以字符串形式排序。
30
- *
31
- * 以 0 开头是特例,例如 019 和 12 两个字符串,按直觉还是应该 019 在前面,毕竟本质还是字符串排序。
32
- *
33
- * "123" "456" 数字排序
34
- * "123你好" "133我好" 字符串排序
35
- * "019" "12" 字符串排序
36
- */
37
- const _pattern = /^[1-9][0-9]*$/;
38
- export function numericCompare(a, b) {
39
- if (_pattern.exec(a) && _pattern.exec(b))
40
- return parseInt(a, 10) - parseInt(b, 10);
41
- return a.localeCompare(b);
42
- }
43
- /**
44
- * 字符串解析成整数,补充安全措施:
45
- * 1. 默认设置 radix 为 10,无需再手动指定
46
- * 2. 支持指定 fallback,当解析出来的数字是 NaN 时返回这个值
47
- */
48
- export function safeParseInt(value, fallback, redix = 10) {
49
- const raw = parseInt(String(value), redix);
50
- return isFinite(raw) ? raw : (fallback ?? raw);
51
- }
52
- /**
53
- * 字符串解析成浮点数;若解析结果是 NaN,返回 fallback
54
- */
55
- export function safeParseFloat(value, fallback) {
56
- const raw = parseFloat(String(value));
57
- return isFinite(raw) ? raw : fallback;
58
- }
59
- /**
60
- * 返回人类可读的文件尺寸
61
- * 来自:https://stackoverflow.com/a/14919494
62
- *
63
- * si: true 则使用 1000 进制,否则 1024 进制(默认 false)
64
- * dp: 保留几位小数
65
- */
66
- export function readableSize(bytes, si = false, dp = 1) {
67
- const thresh = si ? 1000 : 1024;
68
- if (Math.abs(bytes) < thresh)
69
- return bytes.toString() + ' B';
70
- const units = si
71
- ? ['kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
72
- : ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'];
73
- let u = -1;
74
- const r = 10 ** dp;
75
- do {
76
- bytes /= thresh;
77
- ++u;
78
- } while (Math.round(Math.abs(bytes) * r) / r >= thresh && u < units.length - 1);
79
- return `${bytes.toFixed(dp)} ${units[u]}`;
80
- }
81
- /**
82
- * 解析 JSON,失败时不抛出异常,而是返回 undefined
83
- */
84
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters
85
- export function safeParseJSON(json) {
86
- try {
87
- return JSON.parse(json);
88
- }
89
- catch (e) {
90
- return undefined;
91
- }
92
- }
package/lang/time.d.ts DELETED
@@ -1,10 +0,0 @@
1
- /**
2
- * 时间处理相关函数
3
- */
4
- /**
5
- * 返回指定时间长度的 毫秒数
6
- */
7
- export declare function daysMS(n: number): number;
8
- export declare function hoursMS(n: number): number;
9
- export declare function minutesMS(n: number): number;
10
- export declare function secondsMS(n: number): number;
package/lang/time.js DELETED
@@ -1,18 +0,0 @@
1
- /**
2
- * 时间处理相关函数
3
- */
4
- /**
5
- * 返回指定时间长度的 毫秒数
6
- */
7
- export function daysMS(n) {
8
- return hoursMS(n * 24);
9
- }
10
- export function hoursMS(n) {
11
- return minutesMS(n * 60);
12
- }
13
- export function minutesMS(n) {
14
- return secondsMS(n * 60);
15
- }
16
- export function secondsMS(n) {
17
- return n * 1000;
18
- }
package/lang/types.js DELETED
@@ -1,28 +0,0 @@
1
- /**
2
- * 对类型系统的辅助、补充
3
- */
4
- /**
5
- * 解决 TypeScript 中,数组字面量 [1, 'a'] 无法自动识别为 tuple 的问题
6
- *
7
- * 使用方法:
8
- * const t = tuple(1, 'a') // 类型会识别为 [1, 'a'] 而不是 (number | string)[]
9
- *
10
- * 待官方提供语言层面的支持
11
- * https://github.com/microsoft/TypeScript/issues/27179
12
- * https://github.com/microsoft/TypeScript/issues/16656
13
- */
14
- export function tuple(...elements) {
15
- return elements;
16
- }
17
- function truthy(value) {
18
- return value !== null && value !== undefined && value !== '' && value !== 0 && value !== false;
19
- }
20
- export { truthy };
21
- /**
22
- * 有些场景不适合用 undefined 判断一个变量是否被赋值(例如它允许被赋值成 undefined)
23
- * 此时可以用这个 symbol 来做判断。
24
- *
25
- * if (value === noValue) console.log('未赋值')
26
- * else console.log('已赋值', value)
27
- */
28
- export const noValue = Symbol('no-value');
@@ -1,10 +0,0 @@
1
- import { type Logger } from './index.js';
2
- interface Debug {
3
- enable: (namespaces: string) => void;
4
- log: (...args: any[]) => any;
5
- }
6
- /**
7
- * 适配 debug package
8
- */
9
- export declare function adaptDebugLib(debugLib: Debug, enable?: string, logger?: Logger): void;
10
- export {};
package/logging/adapt.js DELETED
@@ -1,43 +0,0 @@
1
- import { getLogger } from './index.js';
2
- /**
3
- * 适配 debug package
4
- */
5
- export function adaptDebugLib(debugLib, enable = '', logger) {
6
- // 不在 localStorage 里记录 debugLib enable 状态,
7
- // 以解决 web worker 里读不到 localStorage 而无法启用 debugLib 日志的问题
8
- const emulate = {
9
- storage: {
10
- data: {},
11
- getItem(name) {
12
- return emulate.storage.data[name];
13
- },
14
- setItem(name, value) {
15
- emulate.storage.data[name] = value;
16
- },
17
- removeItem(name) {
18
- // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
19
- delete emulate.storage.data[name];
20
- },
21
- },
22
- save(namespaces) {
23
- if (namespaces)
24
- emulate.storage.setItem('debug', namespaces);
25
- else
26
- emulate.storage.removeItem('debug');
27
- },
28
- load() {
29
- return emulate.storage.getItem('debug');
30
- },
31
- };
32
- Object.assign(debugLib, emulate);
33
- // 将 debugLib 日志转发给 logger
34
- if (!logger)
35
- logger = getLogger('3rd-library');
36
- debugLib.log = logger.debug.bind(logger);
37
- if (enable) {
38
- // 有些库(例如 prisma)重新实现了自己的 debug 库,且模仿 debug 也读取 DEBUG 环境变量。
39
- // 这里除了设置 debug 库,顺便也适配这些遵循 debug 库模式的自定义库。
40
- process.env.DEBUG = enable;
41
- debugLib.enable(enable);
42
- }
43
- }
@@ -1,10 +0,0 @@
1
- /**
2
- * 日志常用数据的格式化函数
3
- */
4
- import { type LogInfo } from './index.js';
5
- declare const formatters: {
6
- time(info: LogInfo): string;
7
- datetime(info: LogInfo): string;
8
- level(info: LogInfo): string;
9
- };
10
- export default formatters;
@@ -1,22 +0,0 @@
1
- /**
2
- * 日志常用数据的格式化函数
3
- */
4
- import { LogLevel } from './index.js';
5
- const formatters = {
6
- time(info) {
7
- return info.time.format('HH:mm:ss.SSS');
8
- },
9
- datetime(info) {
10
- return info.time.format('YY-MM-DD HH:mm:ss.SSS');
11
- },
12
- level(info) {
13
- const map = {
14
- [LogLevel.Debug]: 'debug',
15
- [LogLevel.Info]: 'info',
16
- [LogLevel.Warning]: 'warn',
17
- [LogLevel.Error]: 'error',
18
- };
19
- return map[info.level];
20
- },
21
- };
22
- export default formatters;