@anjianshi/utils 2.7.0 → 2.8.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 (153) hide show
  1. package/env-browser/device.d.ts +24 -0
  2. package/env-browser/device.js +50 -0
  3. package/env-browser/global.d.ts +10 -0
  4. package/env-browser/global.js +15 -0
  5. package/env-browser/load-script.d.ts +5 -0
  6. package/env-browser/load-script.js +13 -0
  7. package/env-browser/logging.d.ts +18 -0
  8. package/env-browser/logging.js +49 -0
  9. package/env-browser/manage-vconsole.d.ts +16 -0
  10. package/env-browser/manage-vconsole.js +38 -0
  11. package/env-node/crypto-random.d.ts +13 -0
  12. package/env-node/crypto-random.js +28 -0
  13. package/env-node/fs.d.ts +19 -0
  14. package/env-node/fs.js +48 -0
  15. package/env-node/index.d.ts +6 -0
  16. package/env-node/index.js +6 -0
  17. package/env-node/logging/handlers.d.ts +58 -0
  18. package/env-node/logging/handlers.js +154 -0
  19. package/env-node/logging/index.d.ts +11 -0
  20. package/env-node/logging/index.js +14 -0
  21. package/env-node/safe-request.d.ts +26 -0
  22. package/env-node/safe-request.js +40 -0
  23. package/env-react/emotion.d.ts +20 -0
  24. package/env-react/emotion.jsx +34 -0
  25. package/env-service/controllers.d.ts +30 -0
  26. package/env-service/controllers.js +41 -0
  27. package/env-service/env-reader.d.ts +55 -0
  28. package/env-service/env-reader.js +79 -0
  29. package/env-service/index.d.ts +6 -0
  30. package/env-service/index.js +6 -0
  31. package/env-service/prisma/adapt-logging.d.ts +21 -0
  32. package/env-service/prisma/adapt-logging.js +30 -0
  33. package/env-service/prisma/extensions/exist.d.ts +10 -0
  34. package/env-service/prisma/extensions/exist.js +16 -0
  35. package/env-service/prisma/extensions/find-and-count.d.ts +7 -0
  36. package/env-service/prisma/extensions/find-and-count.js +19 -0
  37. package/env-service/prisma/extensions/soft-delete.d.ts +52 -0
  38. package/env-service/prisma/extensions/soft-delete.js +123 -0
  39. package/env-service/prisma/extensions/with-transaction.d.ts +9 -0
  40. package/env-service/prisma/extensions/with-transaction.js +54 -0
  41. package/env-service/prisma/index.d.ts +6 -0
  42. package/env-service/prisma/index.js +6 -0
  43. package/env-service/prisma/transaction-contexted.d.ts +11 -0
  44. package/env-service/prisma/transaction-contexted.js +52 -0
  45. package/env-service/redis-cache.d.ts +39 -0
  46. package/env-service/redis-cache.js +116 -0
  47. package/env-service/tasks.d.ts +12 -0
  48. package/env-service/tasks.js +37 -0
  49. package/index.d.ts +3 -0
  50. package/index.js +3 -0
  51. package/init-dayjs.d.ts +2 -0
  52. package/init-dayjs.js +7 -0
  53. package/lang/async.d.ts +19 -0
  54. package/lang/async.js +34 -0
  55. package/lang/color.d.ts +37 -0
  56. package/lang/color.js +111 -0
  57. package/lang/index.d.ts +7 -0
  58. package/lang/index.js +7 -0
  59. package/lang/may-success.d.ts +40 -0
  60. package/lang/may-success.js +27 -0
  61. package/lang/object.d.ts +12 -0
  62. package/lang/object.js +41 -0
  63. package/lang/random.d.ts +13 -0
  64. package/lang/random.js +24 -0
  65. package/lang/string.d.ts +29 -0
  66. package/lang/string.js +92 -0
  67. package/lang/time.d.ts +10 -0
  68. package/lang/time.js +18 -0
  69. package/{src/lang/types.ts → lang/types.d.ts} +23 -43
  70. package/lang/types.js +28 -0
  71. package/logging/adapt.d.ts +10 -0
  72. package/logging/adapt.js +43 -0
  73. package/logging/formatters.d.ts +10 -0
  74. package/logging/formatters.js +22 -0
  75. package/logging/index.d.ts +45 -0
  76. package/logging/index.js +90 -0
  77. package/md5.d.ts +30 -0
  78. package/md5.js +308 -0
  79. package/package.json +14 -20
  80. package/url.d.ts +77 -0
  81. package/url.js +149 -0
  82. package/validators/array.d.ts +30 -0
  83. package/validators/array.js +47 -0
  84. package/validators/base.d.ts +82 -0
  85. package/validators/base.js +42 -0
  86. package/validators/boolean.d.ts +3 -0
  87. package/validators/boolean.js +22 -0
  88. package/validators/datetime.d.ts +12 -0
  89. package/validators/datetime.js +30 -0
  90. package/validators/factory.d.ts +70 -0
  91. package/validators/factory.js +121 -0
  92. package/validators/index.d.ts +9 -0
  93. package/validators/index.js +9 -0
  94. package/validators/number.d.ts +19 -0
  95. package/validators/number.js +26 -0
  96. package/validators/object.d.ts +28 -0
  97. package/validators/object.js +49 -0
  98. package/validators/one-of.d.ts +10 -0
  99. package/validators/one-of.js +15 -0
  100. package/validators/string.d.ts +22 -0
  101. package/validators/string.js +35 -0
  102. package/README.md +0 -10
  103. package/eslint.config.cjs +0 -33
  104. package/publish-prepare.cjs +0 -16
  105. package/src/env-browser/device.ts +0 -62
  106. package/src/env-browser/global.ts +0 -21
  107. package/src/env-browser/load-script.ts +0 -13
  108. package/src/env-browser/logging.ts +0 -58
  109. package/src/env-browser/manage-vconsole.ts +0 -54
  110. package/src/env-node/crypto-random.ts +0 -30
  111. package/src/env-node/fs.ts +0 -50
  112. package/src/env-node/index.ts +0 -6
  113. package/src/env-node/logging/handlers.ts +0 -190
  114. package/src/env-node/logging/index.ts +0 -16
  115. package/src/env-node/safe-request.ts +0 -66
  116. package/src/env-react/emotion.tsx +0 -42
  117. package/src/env-service/controllers.ts +0 -93
  118. package/src/env-service/env-reader.ts +0 -141
  119. package/src/env-service/index.ts +0 -6
  120. package/src/env-service/prisma/adapt-logging.ts +0 -39
  121. package/src/env-service/prisma/extensions/exist.ts +0 -21
  122. package/src/env-service/prisma/extensions/find-and-count.ts +0 -24
  123. package/src/env-service/prisma/extensions/soft-delete.ts +0 -162
  124. package/src/env-service/prisma/extensions/with-transaction.ts +0 -65
  125. package/src/env-service/prisma/index.ts +0 -6
  126. package/src/env-service/prisma/transaction-contexted.ts +0 -80
  127. package/src/env-service/redis-cache.ts +0 -142
  128. package/src/env-service/tasks.ts +0 -45
  129. package/src/index.ts +0 -3
  130. package/src/init-dayjs.ts +0 -8
  131. package/src/lang/async.ts +0 -47
  132. package/src/lang/color.ts +0 -119
  133. package/src/lang/index.ts +0 -7
  134. package/src/lang/may-success.ts +0 -57
  135. package/src/lang/object.ts +0 -39
  136. package/src/lang/random.ts +0 -25
  137. package/src/lang/string.ts +0 -95
  138. package/src/lang/time.ts +0 -19
  139. package/src/logging/adapt.ts +0 -49
  140. package/src/logging/formatters.ts +0 -23
  141. package/src/logging/index.ts +0 -106
  142. package/src/md5.ts +0 -318
  143. package/src/url.ts +0 -185
  144. package/src/validators/array.ts +0 -97
  145. package/src/validators/base.ts +0 -145
  146. package/src/validators/boolean.ts +0 -21
  147. package/src/validators/datetime.ts +0 -39
  148. package/src/validators/factory.ts +0 -244
  149. package/src/validators/index.ts +0 -9
  150. package/src/validators/number.ts +0 -54
  151. package/src/validators/object.ts +0 -101
  152. package/src/validators/one-of.ts +0 -33
  153. package/src/validators/string.ts +0 -72
@@ -1,106 +0,0 @@
1
- import dayjs, { type Dayjs } from 'dayjs'
2
- export { default as formatters } from './formatters.js'
3
- export * from './adapt.js'
4
- import { initDayJs } from '../init-dayjs.js'
5
-
6
- // 引入 logging 库会自动初始化 dayjs
7
- initDayJs()
8
-
9
- export enum LogLevel {
10
- Debug = 1,
11
- Info = 2,
12
- Warning = 3,
13
- Error = 4,
14
- }
15
-
16
- export const logLevelMap: Record<string, LogLevel> = {
17
- debug: LogLevel.Debug,
18
- info: LogLevel.Info,
19
- warn: LogLevel.Warning,
20
- warning: LogLevel.Warning,
21
- err: LogLevel.Error,
22
- error: LogLevel.Error,
23
- }
24
-
25
- export interface LogInfo {
26
- logger: string // logger name;有多级 logger 的情况下,这是最初的 logger 名称
27
- level: LogLevel
28
- time: Dayjs
29
- args: unknown[] // log content
30
- }
31
-
32
- export class LogHandler {
33
- log(info: LogInfo) {} // eslint-disable-line @typescript-eslint/no-unused-vars
34
- }
35
-
36
- export class Logger {
37
- level = LogLevel.Info
38
- handlers = new Set<LogHandler>()
39
-
40
- constructor(
41
- public name = '',
42
- public base: Logger | null = null, // 指定上级 logger,当前 logger 记录的日志也会传递给上级
43
- ) {}
44
-
45
- static getRealLevel(raw: LogLevel | string) {
46
- if (typeof raw === 'string') {
47
- raw = raw.toLowerCase()
48
- if (logLevelMap[raw] === undefined) throw new Error('Not supported log level: ' + raw)
49
- return logLevelMap[raw]!
50
- }
51
- return raw
52
- }
53
-
54
- setLevel(level: LogLevel | string) {
55
- this.level = Logger.getRealLevel(level)
56
- }
57
-
58
- addHandler(handler: LogHandler) {
59
- this.handlers.add(handler)
60
- }
61
-
62
- /**
63
- * 创建一个以当前 logger 为 base 的 child logger
64
- */
65
- getChild(name: string) {
66
- const fullname = this.name ? `${this.name}/${name}` : name
67
- type Constructor = new (...args: ConstructorParameters<typeof Logger>) => Logger
68
- // 这里加上 `as this` 才能让 TypeScript 判定,对继承了 Logger 的类调用此方法时,返回的是那个类而不是原始的 Logger 类的实例
69
- return new (this.constructor as Constructor)(fullname, this) as this
70
- }
71
-
72
- log(level: LogLevel | string, args: unknown[]) {
73
- level = Logger.getRealLevel(level)
74
- this.logByInfo({ logger: this.name, level, time: dayjs(), args })
75
- }
76
- protected logByInfo(info: LogInfo) {
77
- if (this.base) this.base.logByInfo(info)
78
- if (this.level > info.level) return
79
- for (const handler of this.handlers) {
80
- handler.log(info)
81
- }
82
- }
83
-
84
- debug(...args: any[]) {
85
- this.log(LogLevel.Debug, args)
86
- }
87
- info(...args: any[]) {
88
- this.log(LogLevel.Info, args)
89
- }
90
- warn(...args: any[]) {
91
- this.log(LogLevel.Warning, args)
92
- }
93
- error(...args: any[]) {
94
- this.log(LogLevel.Error, args)
95
- }
96
- }
97
-
98
- /**
99
- * 提供一套默认配置好的 logger
100
- */
101
- const defaultLogger = new Logger()
102
- export { defaultLogger as logger }
103
-
104
- export function getLogger(name: string) {
105
- return defaultLogger.getChild(name)
106
- }
package/src/md5.ts DELETED
@@ -1,318 +0,0 @@
1
- /* eslint-disable no-multi-assign */
2
- /**
3
- * MD5 算法来自:https://github.com/emn178/js-md5
4
- */
5
-
6
- export function md5(content: string | ArrayBuffer) {
7
- const md5 = new MD5()
8
- md5.update(content)
9
- return md5.hex()
10
- }
11
-
12
- // -------------------------------------------------------------------
13
-
14
- /**
15
- * 使用方法:
16
- * const md5 = new MD5()
17
- * md5.update(xxx) // 对于大文件,可以拆分开,多次调用 md5.update()
18
- * const hash = md5.hex()
19
- */
20
- export class MD5 {
21
- private readonly buffer8: Uint8Array
22
- private readonly blocks: Uint32Array
23
-
24
- private h0 = 0
25
- private h1 = 0
26
- private h2 = 0
27
- private h3 = 0
28
- private start = 0
29
- private bytes = 0
30
- private hBytes = 0
31
- private lastByteIndex = 0
32
-
33
- private finalized = false
34
- private hashed = false
35
- private first = true
36
-
37
- constructor() {
38
- const buffer = new ArrayBuffer(68)
39
- this.buffer8 = new Uint8Array(buffer)
40
- this.blocks = new Uint32Array(buffer)
41
- }
42
-
43
- update(message: string | number[] | Uint8Array | ArrayBuffer) {
44
- if (this.finalized) return
45
-
46
- if (message instanceof ArrayBuffer) {
47
- message = new Uint8Array(message)
48
- }
49
- if (typeof message !== 'string' && !Array.isArray(message) && !ArrayBuffer.isView(message)) {
50
- throw new Error('input is invalid type')
51
- }
52
-
53
- const length = message.length
54
- const { blocks, buffer8 } = this
55
-
56
- let code: number
57
- let index = 0
58
- let i: number
59
-
60
- while (index < length) {
61
- if (this.hashed) {
62
- this.hashed = false
63
- blocks[0] = blocks[16]!
64
- // prettier-ignore
65
- blocks[16] = blocks[1] = blocks[2] = blocks[3] = blocks[4] = blocks[5] =
66
- blocks[6] = blocks[7] = blocks[8] = blocks[9] = blocks[10] =
67
- blocks[11] = blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0
68
- }
69
-
70
- if (typeof message !== 'string') {
71
- for (i = this.start; index < length && i < 64; ++index) {
72
- buffer8[i++] = message[index]!
73
- }
74
- } else {
75
- for (i = this.start; index < length && i < 64; ++index) {
76
- code = message.charCodeAt(index)
77
- if (code < 0x80) {
78
- buffer8[i++] = code
79
- } else if (code < 0x800) {
80
- buffer8[i++] = 0xc0 | (code >> 6)
81
- buffer8[i++] = 0x80 | (code & 0x3f)
82
- } else if (code < 0xd800 || code >= 0xe000) {
83
- buffer8[i++] = 0xe0 | (code >> 12)
84
- buffer8[i++] = 0x80 | ((code >> 6) & 0x3f)
85
- buffer8[i++] = 0x80 | (code & 0x3f)
86
- } else {
87
- code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff))
88
- buffer8[i++] = 0xf0 | (code >> 18)
89
- buffer8[i++] = 0x80 | ((code >> 12) & 0x3f)
90
- buffer8[i++] = 0x80 | ((code >> 6) & 0x3f)
91
- buffer8[i++] = 0x80 | (code & 0x3f)
92
- }
93
- }
94
- }
95
- this.lastByteIndex = i
96
- this.bytes += i - this.start
97
- if (i >= 64) {
98
- this.start = i - 64
99
- this.hash()
100
- this.hashed = true
101
- } else {
102
- this.start = i
103
- }
104
- }
105
- if (this.bytes > 4294967295) {
106
- this.hBytes += (this.bytes / 4294967296) << 0
107
- this.bytes = this.bytes % 4294967296
108
- }
109
- }
110
-
111
- private finalize() {
112
- if (this.finalized) return
113
- this.finalized = true
114
- const { blocks } = this
115
- const i = this.lastByteIndex
116
- const EXTRA = [128, 32768, 8388608, -2147483648]
117
- blocks[i >> 2]! |= EXTRA[i & 3]!
118
- if (i >= 56) {
119
- if (!this.hashed) this.hash()
120
- blocks[0] = blocks[16]!
121
- // prettier-ignore
122
- blocks[16] = blocks[1] = blocks[2] = blocks[3] = blocks[4] = blocks[5] =
123
- blocks[6] = blocks[7] = blocks[8] = blocks[9] = blocks[10] =
124
- blocks[11] = blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0
125
- }
126
- blocks[14] = this.bytes << 3
127
- blocks[15] = (this.hBytes << 3) | (this.bytes >>> 29)
128
- this.hash()
129
- }
130
-
131
- private hash() {
132
- let a: number, b: number, c: number, d: number, bc: number, da: number
133
- const { blocks } = this
134
-
135
- if (this.first) {
136
- a = blocks[0]! - 680876937
137
- a = (((a << 7) | (a >>> 25)) - 271733879) << 0
138
- d = (-1732584194 ^ (a & 2004318071)) + blocks[1]! - 117830708
139
- d = (((d << 12) | (d >>> 20)) + a) << 0
140
- c = (-271733879 ^ (d & (a ^ -271733879))) + blocks[2]! - 1126478375
141
- c = (((c << 17) | (c >>> 15)) + d) << 0
142
- b = (a ^ (c & (d ^ a))) + blocks[3]! - 1316259209
143
- b = (((b << 22) | (b >>> 10)) + c) << 0
144
- } else {
145
- a = this.h0
146
- b = this.h1
147
- c = this.h2
148
- d = this.h3
149
- a += (d ^ (b & (c ^ d))) + blocks[0]! - 680876936
150
- a = (((a << 7) | (a >>> 25)) + b) << 0
151
- d += (c ^ (a & (b ^ c))) + blocks[1]! - 389564586
152
- d = (((d << 12) | (d >>> 20)) + a) << 0
153
- c += (b ^ (d & (a ^ b))) + blocks[2]! + 606105819
154
- c = (((c << 17) | (c >>> 15)) + d) << 0
155
- b += (a ^ (c & (d ^ a))) + blocks[3]! - 1044525330
156
- b = (((b << 22) | (b >>> 10)) + c) << 0
157
- }
158
-
159
- a += (d ^ (b & (c ^ d))) + blocks[4]! - 176418897
160
- a = (((a << 7) | (a >>> 25)) + b) << 0
161
- d += (c ^ (a & (b ^ c))) + blocks[5]! + 1200080426
162
- d = (((d << 12) | (d >>> 20)) + a) << 0
163
- c += (b ^ (d & (a ^ b))) + blocks[6]! - 1473231341
164
- c = (((c << 17) | (c >>> 15)) + d) << 0
165
- b += (a ^ (c & (d ^ a))) + blocks[7]! - 45705983
166
- b = (((b << 22) | (b >>> 10)) + c) << 0
167
- a += (d ^ (b & (c ^ d))) + blocks[8]! + 1770035416
168
- a = (((a << 7) | (a >>> 25)) + b) << 0
169
- d += (c ^ (a & (b ^ c))) + blocks[9]! - 1958414417
170
- d = (((d << 12) | (d >>> 20)) + a) << 0
171
- c += (b ^ (d & (a ^ b))) + blocks[10]! - 42063
172
- c = (((c << 17) | (c >>> 15)) + d) << 0
173
- b += (a ^ (c & (d ^ a))) + blocks[11]! - 1990404162
174
- b = (((b << 22) | (b >>> 10)) + c) << 0
175
- a += (d ^ (b & (c ^ d))) + blocks[12]! + 1804603682
176
- a = (((a << 7) | (a >>> 25)) + b) << 0
177
- d += (c ^ (a & (b ^ c))) + blocks[13]! - 40341101
178
- d = (((d << 12) | (d >>> 20)) + a) << 0
179
- c += (b ^ (d & (a ^ b))) + blocks[14]! - 1502002290
180
- c = (((c << 17) | (c >>> 15)) + d) << 0
181
- b += (a ^ (c & (d ^ a))) + blocks[15]! + 1236535329
182
- b = (((b << 22) | (b >>> 10)) + c) << 0
183
- a += (c ^ (d & (b ^ c))) + blocks[1]! - 165796510
184
- a = (((a << 5) | (a >>> 27)) + b) << 0
185
- d += (b ^ (c & (a ^ b))) + blocks[6]! - 1069501632
186
- d = (((d << 9) | (d >>> 23)) + a) << 0
187
- c += (a ^ (b & (d ^ a))) + blocks[11]! + 643717713
188
- c = (((c << 14) | (c >>> 18)) + d) << 0
189
- b += (d ^ (a & (c ^ d))) + blocks[0]! - 373897302
190
- b = (((b << 20) | (b >>> 12)) + c) << 0
191
- a += (c ^ (d & (b ^ c))) + blocks[5]! - 701558691
192
- a = (((a << 5) | (a >>> 27)) + b) << 0
193
- d += (b ^ (c & (a ^ b))) + blocks[10]! + 38016083
194
- d = (((d << 9) | (d >>> 23)) + a) << 0
195
- c += (a ^ (b & (d ^ a))) + blocks[15]! - 660478335
196
- c = (((c << 14) | (c >>> 18)) + d) << 0
197
- b += (d ^ (a & (c ^ d))) + blocks[4]! - 405537848
198
- b = (((b << 20) | (b >>> 12)) + c) << 0
199
- a += (c ^ (d & (b ^ c))) + blocks[9]! + 568446438
200
- a = (((a << 5) | (a >>> 27)) + b) << 0
201
- d += (b ^ (c & (a ^ b))) + blocks[14]! - 1019803690
202
- d = (((d << 9) | (d >>> 23)) + a) << 0
203
- c += (a ^ (b & (d ^ a))) + blocks[3]! - 187363961
204
- c = (((c << 14) | (c >>> 18)) + d) << 0
205
- b += (d ^ (a & (c ^ d))) + blocks[8]! + 1163531501
206
- b = (((b << 20) | (b >>> 12)) + c) << 0
207
- a += (c ^ (d & (b ^ c))) + blocks[13]! - 1444681467
208
- a = (((a << 5) | (a >>> 27)) + b) << 0
209
- d += (b ^ (c & (a ^ b))) + blocks[2]! - 51403784
210
- d = (((d << 9) | (d >>> 23)) + a) << 0
211
- c += (a ^ (b & (d ^ a))) + blocks[7]! + 1735328473
212
- c = (((c << 14) | (c >>> 18)) + d) << 0
213
- b += (d ^ (a & (c ^ d))) + blocks[12]! - 1926607734
214
- b = (((b << 20) | (b >>> 12)) + c) << 0
215
- bc = b ^ c
216
- a += (bc ^ d) + blocks[5]! - 378558
217
- a = (((a << 4) | (a >>> 28)) + b) << 0
218
- d += (bc ^ a) + blocks[8]! - 2022574463
219
- d = (((d << 11) | (d >>> 21)) + a) << 0
220
- da = d ^ a
221
- c += (da ^ b) + blocks[11]! + 1839030562
222
- c = (((c << 16) | (c >>> 16)) + d) << 0
223
- b += (da ^ c) + blocks[14]! - 35309556
224
- b = (((b << 23) | (b >>> 9)) + c) << 0
225
- bc = b ^ c
226
- a += (bc ^ d) + blocks[1]! - 1530992060
227
- a = (((a << 4) | (a >>> 28)) + b) << 0
228
- d += (bc ^ a) + blocks[4]! + 1272893353
229
- d = (((d << 11) | (d >>> 21)) + a) << 0
230
- da = d ^ a
231
- c += (da ^ b) + blocks[7]! - 155497632
232
- c = (((c << 16) | (c >>> 16)) + d) << 0
233
- b += (da ^ c) + blocks[10]! - 1094730640
234
- b = (((b << 23) | (b >>> 9)) + c) << 0
235
- bc = b ^ c
236
- a += (bc ^ d) + blocks[13]! + 681279174
237
- a = (((a << 4) | (a >>> 28)) + b) << 0
238
- d += (bc ^ a) + blocks[0]! - 358537222
239
- d = (((d << 11) | (d >>> 21)) + a) << 0
240
- da = d ^ a
241
- c += (da ^ b) + blocks[3]! - 722521979
242
- c = (((c << 16) | (c >>> 16)) + d) << 0
243
- b += (da ^ c) + blocks[6]! + 76029189
244
- b = (((b << 23) | (b >>> 9)) + c) << 0
245
- bc = b ^ c
246
- a += (bc ^ d) + blocks[9]! - 640364487
247
- a = (((a << 4) | (a >>> 28)) + b) << 0
248
- d += (bc ^ a) + blocks[12]! - 421815835
249
- d = (((d << 11) | (d >>> 21)) + a) << 0
250
- da = d ^ a
251
- c += (da ^ b) + blocks[15]! + 530742520
252
- c = (((c << 16) | (c >>> 16)) + d) << 0
253
- b += (da ^ c) + blocks[2]! - 995338651
254
- b = (((b << 23) | (b >>> 9)) + c) << 0
255
- a += (c ^ (b | ~d)) + blocks[0]! - 198630844
256
- a = (((a << 6) | (a >>> 26)) + b) << 0
257
- d += (b ^ (a | ~c)) + blocks[7]! + 1126891415
258
- d = (((d << 10) | (d >>> 22)) + a) << 0
259
- c += (a ^ (d | ~b)) + blocks[14]! - 1416354905
260
- c = (((c << 15) | (c >>> 17)) + d) << 0
261
- b += (d ^ (c | ~a)) + blocks[5]! - 57434055
262
- b = (((b << 21) | (b >>> 11)) + c) << 0
263
- a += (c ^ (b | ~d)) + blocks[12]! + 1700485571
264
- a = (((a << 6) | (a >>> 26)) + b) << 0
265
- d += (b ^ (a | ~c)) + blocks[3]! - 1894986606
266
- d = (((d << 10) | (d >>> 22)) + a) << 0
267
- c += (a ^ (d | ~b)) + blocks[10]! - 1051523
268
- c = (((c << 15) | (c >>> 17)) + d) << 0
269
- b += (d ^ (c | ~a)) + blocks[1]! - 2054922799
270
- b = (((b << 21) | (b >>> 11)) + c) << 0
271
- a += (c ^ (b | ~d)) + blocks[8]! + 1873313359
272
- a = (((a << 6) | (a >>> 26)) + b) << 0
273
- d += (b ^ (a | ~c)) + blocks[15]! - 30611744
274
- d = (((d << 10) | (d >>> 22)) + a) << 0
275
- c += (a ^ (d | ~b)) + blocks[6]! - 1560198380
276
- c = (((c << 15) | (c >>> 17)) + d) << 0
277
- b += (d ^ (c | ~a)) + blocks[13]! + 1309151649
278
- b = (((b << 21) | (b >>> 11)) + c) << 0
279
- a += (c ^ (b | ~d)) + blocks[4]! - 145523070
280
- a = (((a << 6) | (a >>> 26)) + b) << 0
281
- d += (b ^ (a | ~c)) + blocks[11]! - 1120210379
282
- d = (((d << 10) | (d >>> 22)) + a) << 0
283
- c += (a ^ (d | ~b)) + blocks[2]! + 718787259
284
- c = (((c << 15) | (c >>> 17)) + d) << 0
285
- b += (d ^ (c | ~a)) + blocks[9]! - 343485551
286
- b = (((b << 21) | (b >>> 11)) + c) << 0
287
-
288
- if (this.first) {
289
- this.h0 = (a + 1732584193) << 0
290
- this.h1 = (b - 271733879) << 0
291
- this.h2 = (c - 1732584194) << 0
292
- this.h3 = (d + 271733878) << 0
293
- this.first = false
294
- } else {
295
- this.h0 = (this.h0 + a) << 0
296
- this.h1 = (this.h1 + b) << 0
297
- this.h2 = (this.h2 + c) << 0
298
- this.h3 = (this.h3 + d) << 0
299
- }
300
- }
301
-
302
- hex() {
303
- this.finalize()
304
-
305
- const { h0, h1, h2, h3 } = this
306
- const HEX_CHARS = '0123456789abcdef'.split('')
307
- return (
308
- // prettier-ignore
309
- HEX_CHARS[(h0 >> 4) & 0x0f]! + HEX_CHARS[h0 & 0x0f]! + HEX_CHARS[(h0 >> 12) & 0x0f]! + HEX_CHARS[(h0 >> 8) & 0x0f]! + HEX_CHARS[(h0 >> 20) & 0x0f]! +
310
- HEX_CHARS[(h0 >> 16) & 0x0f]! + HEX_CHARS[(h0 >> 28) & 0x0f]! + HEX_CHARS[(h0 >> 24) & 0x0f]! + HEX_CHARS[(h1 >> 4) & 0x0f]! + HEX_CHARS[h1 & 0x0f]! +
311
- HEX_CHARS[(h1 >> 12) & 0x0f]! + HEX_CHARS[(h1 >> 8) & 0x0f]! + HEX_CHARS[(h1 >> 20) & 0x0f]! + HEX_CHARS[(h1 >> 16) & 0x0f]! + HEX_CHARS[(h1 >> 28) & 0x0f]! +
312
- HEX_CHARS[(h1 >> 24) & 0x0f]! + HEX_CHARS[(h2 >> 4) & 0x0f]! + HEX_CHARS[h2 & 0x0f]! + HEX_CHARS[(h2 >> 12) & 0x0f]! + HEX_CHARS[(h2 >> 8) & 0x0f]! +
313
- HEX_CHARS[(h2 >> 20) & 0x0f]! + HEX_CHARS[(h2 >> 16) & 0x0f]! + HEX_CHARS[(h2 >> 28) & 0x0f]! + HEX_CHARS[(h2 >> 24) & 0x0f]! + HEX_CHARS[(h3 >> 4) & 0x0f]! +
314
- HEX_CHARS[h3 & 0x0f]! + HEX_CHARS[(h3 >> 12) & 0x0f]! + HEX_CHARS[(h3 >> 8) & 0x0f]! + HEX_CHARS[(h3 >> 20) & 0x0f]! + HEX_CHARS[(h3 >> 16) & 0x0f]! +
315
- HEX_CHARS[(h3 >> 28) & 0x0f]! + HEX_CHARS[(h3 >> 24) & 0x0f]!
316
- )
317
- }
318
- }
package/src/url.ts DELETED
@@ -1,185 +0,0 @@
1
- /**
2
- * URL 工具函数
3
- * 部分灵感来自:https://www.npmjs.com/package/qs
4
- *
5
- * [名词定义]
6
- * query: 指 a=1&b=2 格式的“查询字符串”或此类字符串的解析结果。
7
- * search: URL 中的 search 部分,与 location.search 一致,空字符串或以 '?' 开头。
8
- * hash: URL 中的 hash 部分,与 location.hash 一直,空字符串或以 '#' 开头。
9
- */
10
- import isPlainObject from 'lodash/isPlainObject.js'
11
-
12
- /**
13
- * 从 URL 中解析出 query 对象
14
- * 注意:不带 ? 号的纯 query 内容需手动加上 ? 再传入。
15
- *
16
- * [array]
17
- * 是否把重复出现的 key 保存为数组(默认不开启)
18
- * a=1&a=2 => { a: [1,2] }
19
- *
20
- * [loose]
21
- * 是否开启“宽松模式”(默认不开启)
22
- * 1. hash 里的内容也会被解析,以兼容拼接错误的 URL(把 query 拼到了 hash 后面)。
23
- * 2. 出现多个 ? 符号时,会把 ? 也当做 & 分隔符(index.html?a=1&b=2?c=3)
24
- *
25
- * [decode]
26
- * 是否对 query 值进行 decode(默认开启)
27
- */
28
- function parseQuery(url: string, options?: { array?: false, loose?: boolean, decode?: boolean }): Record<string, string> // prettier-ignore
29
- function parseQuery(url: string, options: { array: true, loose?: boolean, decode?: boolean }): Record<string, string | string[]> // prettier-ignore
30
- function parseQuery(
31
- url: string,
32
- options?: { array?: boolean; loose?: boolean; decode?: boolean },
33
- ): Record<string, string | string[]> {
34
- const { array = false, loose = false, decode = true } = options ?? {}
35
-
36
- // 正常状态下,将仅剩 a=1&b=1(即不会再有 ? 和 #);loose 模式下,可能为 a=1&b=2#c=3?d=4
37
- const queryString = (loose ? /(\?|#)(.+)/ : /(\?)(.+?)(#|$)/).exec(url)?.[2] ?? ''
38
- if (!queryString) return {}
39
-
40
- const query: Record<string, string | string[]> = {}
41
- const reg = /([^#?&]*)=([^#?&]*)/g
42
- let re = reg.exec(queryString)
43
- while (re) {
44
- const [name, rawValue] = [re[1]!, re[2]!] as [string, string]
45
- const value = decode ? safeDecode(rawValue) : rawValue
46
- if (array && query[name] !== undefined) {
47
- const prev = query[name]
48
- query[name] = Array.isArray(prev) ? [...prev, value] : [prev, value]
49
- } else {
50
- query[name] = value
51
- }
52
- re = reg.exec(queryString)
53
- }
54
- return query
55
- }
56
- export { parseQuery }
57
-
58
- /**
59
- * 把对象合并成 query string。
60
- * - 支持字符串、数值、布尔值、数组。
61
- * - 布尔值会替换成 0 和 1。
62
- * - 数组会多次赋值:{ a: [1,2,3] } => 'a=1&a=2&a=3',不支持嵌套数组
63
- * - encode 为 true 时会对 value 执行 encodeURIComponent(默认为 true)
64
- */
65
- export type StringifyVal = string | number | boolean
66
- export type StringifyQuery = Record<string, StringifyVal | StringifyVal[] | undefined>
67
- export function stringifyQuery(obj: StringifyQuery, encode = true) {
68
- if (!isPlainObject(obj)) return ''
69
- return (
70
- Object.entries(obj)
71
- // 过滤值为 undefined 的项目,使其完全不出现在最终的 query 中
72
- .filter((entry): entry is [string, StringifyVal | StringifyVal[]] => entry[1] !== undefined)
73
- .map(([name, value]) => stringifyQueryItem(name, value, encode))
74
- .join('&')
75
- )
76
- }
77
- function stringifyQueryItem(
78
- name: string,
79
- value: StringifyVal | StringifyVal[],
80
- encode: boolean,
81
- ): string {
82
- if (Array.isArray(value))
83
- return value.map(subValue => stringifyQueryItem(name, subValue, encode)).join('&')
84
- if (typeof value === 'boolean') value = value ? '1' : '0'
85
- if (typeof value === 'number') value = value.toString()
86
- if (encode) value = encodeURIComponent(value)
87
- return `${name}=${value}`
88
- }
89
-
90
- /**
91
- * 拆分 URL 的各个部分
92
- *
93
- * bare 为 true,则 search 不带 '?',hash 不带 '#'
94
- * 否则和 location.search / hash 一样
95
- * (默认为 true)
96
- */
97
- export function splitUrl(url: string, bare = true): { base: string; search: string; hash: string } {
98
- let hashIndex = url.indexOf('#')
99
- if (hashIndex === -1) hashIndex = url.length
100
- const bareHash = url.slice(hashIndex + 1)
101
-
102
- let searchIndex = url.slice(0, hashIndex).indexOf('?')
103
- if (searchIndex === -1) searchIndex = hashIndex
104
- const bareSearch = url.slice(searchIndex + 1, hashIndex)
105
-
106
- return {
107
- base: url.slice(0, searchIndex),
108
- search: bare ? bareSearch : bareSearch ? '?' + bareSearch : '',
109
- hash: bare ? bareHash : bareHash ? '#' + bareHash : '',
110
- }
111
- }
112
-
113
- /**
114
- * 把 query 和 hash 内容合并到 url 上
115
- *
116
- * query object 与现有 search 合并,替换同名项(值为数组的,用新数组代替老的,不会合并数组)
117
- * hash string 带不带开头的 '#' 皆可。会代替 url 已有的 hash。
118
- */
119
- export function combineUrl(origUrl: string, query: StringifyQuery = {}, hash = '') {
120
- if (hash.startsWith('#')) hash = hash.slice(1)
121
-
122
- // 拆分原 url 的 search、hash
123
- const { base, search: origSearch, hash: origHash } = splitUrl(origUrl)
124
-
125
- // 拼接新 URL
126
- let newUrl = base
127
- const newSearch = stringifyQuery({ ...parseQuery(origSearch), ...query })
128
- const newHash = hash || origHash
129
- if (newSearch) newUrl += `?${newSearch}`
130
- if (newHash) newUrl += `#${newHash}`
131
- return newUrl
132
- }
133
-
134
- /**
135
- * 移除路径中所有非必须的 "/"
136
- * 清理后的字符串只有这几种可能的格式:''、'abc'、'abc/def'
137
- * 例如 /abc/def 和 abc/def/ 都会变成 abc/def
138
- *
139
- * 注意:此操作不会统一大小写,因此不保证处理后两个字符串在代码层面全等(a === b)
140
- */
141
- export function clearSlash(path: string) {
142
- if (path.startsWith('/')) path = path.slice(1)
143
- if (path.endsWith('/')) path = path.slice(0, -1)
144
- path = path.replace(/\/+/g, '/')
145
- return path
146
- }
147
-
148
- /**
149
- * 合并几段路径,保证合并处只有一个斜杠
150
- */
151
- export function joinPath(...nodes: string[]) {
152
- // - node 为 '' 时忽略 node
153
- // - path 可能的格式:'' 'a' 'a/' ‘/a/'
154
- // - path 为 '',则 node 开头 '/' 保持原样
155
- // - 否则,根据 path 结尾有没有 '/',决定 node 开头带不带 '/'
156
- // - node 开头、结尾若有多个 '/' 均替换成单个
157
- return nodes.reduce((path, node) => {
158
- if (!node) return path
159
- type Matched = RegExpExecArray & { 1: string; 2: string; 3: string }
160
- const [, origPrefix, content, origSuffix] = /^(\/*)(.*?)(\/*)$/.exec(node)! as Matched
161
- const prefix = (path === '' ? !!origPrefix : !path.endsWith('/')) ? '/' : ''
162
- const suffix = origSuffix ? '/' : ''
163
- const result = `${path}${prefix}${content}${suffix}`
164
- return result
165
- }, '')
166
- }
167
-
168
- /**
169
- * decodeURIComponent() 对于不规范编码的字符串可能会报错(例如字符串里出现了“%”)
170
- * 用此函数代替可避免此问题
171
- */
172
- export function safeDecode(content: string) {
173
- try {
174
- return decodeURIComponent(content)
175
- } catch (e) {
176
- return content
177
- }
178
- }
179
-
180
- /**
181
- * 将 URL 中的 http:// 协议改成 https://
182
- */
183
- export function ensureHttps(url: string | undefined) {
184
- return url?.replace(/http:\/\//g, 'https://')
185
- }