@wener/utils 1.1.51 → 1.1.54

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 (497) hide show
  1. package/lib/arrays/MaybeArray.js +58 -8
  2. package/lib/arrays/arrayFromAsync.js +254 -6
  3. package/lib/asyncs/AsyncInterval.js +145 -9
  4. package/lib/asyncs/MaybePromise.js +0 -2
  5. package/lib/asyncs/Promises.js +95 -48
  6. package/lib/asyncs/createAsyncIterator.js +313 -23
  7. package/lib/asyncs/createLazyPromise.js +72 -31
  8. package/lib/asyncs/createLazyPromise.test.js +367 -0
  9. package/lib/asyncs/firstOfAsyncIterator.js +6 -6
  10. package/lib/asyncs/generatorOfStream.js +125 -14
  11. package/lib/asyncs/isIterator.js +1 -3
  12. package/lib/asyncs/isPromise.js +2 -4
  13. package/lib/asyncs/isThenable.js +0 -2
  14. package/lib/asyncs/nextOfAsyncIterator.js +15 -9
  15. package/lib/asyncs/promiseOfCallback.js +2 -4
  16. package/lib/asyncs/timeout.js +122 -13
  17. package/lib/browsers/copy.js +7 -8
  18. package/lib/browsers/download.js +215 -40
  19. package/lib/browsers/getFileFromDataTransfer.js +17 -14
  20. package/lib/browsers/loaders.js +251 -18
  21. package/lib/crypto/base.js +3 -3
  22. package/lib/crypto/getNodeCrypto.js +3 -5
  23. package/lib/crypto/hashing.js +236 -30
  24. package/lib/crypto/hashing.test.js +323 -0
  25. package/lib/crypto/md5.bench.js +11 -11
  26. package/lib/crypto/md5.d.js +0 -2
  27. package/lib/crypto/md5.js +0 -2
  28. package/lib/crypto/md5.test.js +7 -0
  29. package/lib/crypto/pem/pem.js +197 -35
  30. package/lib/crypto/pem/pem.test.js +104 -0
  31. package/lib/crypto/randomUUIDv7.js +0 -2
  32. package/lib/crypto/ulid.js +84 -48
  33. package/lib/crypto/ulid.test.js +115 -0
  34. package/lib/emitter/types.js +0 -2
  35. package/lib/errors/DetailError.js +297 -0
  36. package/lib/errors/Errors.js +136 -137
  37. package/lib/errors/Errors.test.js +24 -0
  38. package/lib/fetch/HttpStatus.js +1 -3
  39. package/lib/fetch/createFetchWith.js +188 -19
  40. package/lib/fetch/createFetchWithLogging.js +17 -16
  41. package/lib/fetch/createFetchWithRetry.js +40 -24
  42. package/lib/fetch/dumpRequest.js +467 -41
  43. package/lib/fetch/dumpRequest.test.js +384 -0
  44. package/lib/fetch/dumpResponse.js +271 -16
  45. package/lib/fetch/dumpResponse.test.js +393 -0
  46. package/lib/fetch/http.types.js +0 -2
  47. package/lib/fetch/index.js +5 -7
  48. package/lib/fetch/isTextContentType.js +5 -0
  49. package/lib/fetch/resolveRequest.js +7 -0
  50. package/lib/fetch/types.js +0 -2
  51. package/lib/i18n/createTranslate.js +40 -20
  52. package/lib/i18n/createTranslate.test.js +177 -0
  53. package/lib/index.js +75 -76
  54. package/lib/io/AbstractEncoding.js +0 -2
  55. package/lib/io/ArrayBuffer.test-d.js +4 -6
  56. package/lib/io/ArrayBuffers.base64.test.js +60 -0
  57. package/lib/io/ArrayBuffers.js +396 -171
  58. package/lib/io/ArrayBuffers.test.js +77 -0
  59. package/lib/io/Buffer.js +190 -20
  60. package/lib/io/Buffer.test.js +22 -0
  61. package/lib/io/ByteBuffer.js +752 -441
  62. package/lib/io/ByteBuffer.test.js +184 -0
  63. package/lib/io/base64.js +17 -19
  64. package/lib/io/dump.js +16 -16
  65. package/lib/io/isBuffer.js +2 -3
  66. package/lib/io/isBuffer.test.js +8 -0
  67. package/lib/io/isTransferable.js +16 -8
  68. package/lib/io/isTransferable.test.js +17 -0
  69. package/lib/io/parseDataUri.js +288 -40
  70. package/lib/io/parseDataUri.test.js +286 -0
  71. package/lib/io/types.js +1 -0
  72. package/lib/langs/AsyncCloser.js +270 -34
  73. package/lib/langs/Closer.js +95 -29
  74. package/lib/langs/MaybeFunction.js +38 -5
  75. package/lib/langs/classOf.js +0 -2
  76. package/lib/langs/deepEqual.js +82 -22
  77. package/lib/langs/deepEqual.test.js +11 -0
  78. package/lib/langs/deepFreeze.js +28 -9
  79. package/lib/langs/getGlobalStates.js +14 -10
  80. package/lib/langs/getObjectId.js +4 -6
  81. package/lib/langs/ifPresent.js +0 -2
  82. package/lib/langs/isClass.js +0 -2
  83. package/lib/langs/isDefined.js +0 -2
  84. package/lib/langs/isEmptyObject.js +1 -3
  85. package/lib/langs/isFunction.js +0 -2
  86. package/lib/langs/isNil.js +3 -0
  87. package/lib/langs/isPlainObject.js +2 -4
  88. package/lib/langs/langs.test.js +126 -0
  89. package/lib/langs/memoize.js +11 -7
  90. package/lib/langs/mixin.js +7 -4
  91. package/lib/langs/mixin.test.js +135 -0
  92. package/lib/langs/parseBoolean.js +11 -8
  93. package/lib/langs/parseDate.js +20 -0
  94. package/lib/langs/shallowClone.js +5 -3
  95. package/lib/langs/shallowEqual.js +8 -6
  96. package/lib/libs/ms.js +28 -26
  97. package/lib/libs/ms.test.js +301 -0
  98. package/lib/logger/const.js +15 -0
  99. package/lib/logger/index.js +1 -0
  100. package/lib/logger/types.js +1 -0
  101. package/lib/maths/clamp.js +81 -12
  102. package/lib/maths/clamp.test.js +186 -0
  103. package/lib/maths/createRandom.test.js +36 -0
  104. package/lib/maths/random.js +162 -13
  105. package/lib/modules/isModule.js +0 -2
  106. package/lib/modules/parseModuleId.js +14 -15
  107. package/lib/modules/parseModuleId.test.js +153 -0
  108. package/lib/objects/computeIfAbsent.js +8 -3
  109. package/lib/objects/get.js +26 -8
  110. package/lib/objects/get.test-d.js +23 -25
  111. package/lib/objects/merge/index.js +1 -3
  112. package/lib/objects/merge/isMergeableObject.js +5 -3
  113. package/lib/objects/merge/merge.js +82 -26
  114. package/lib/objects/merge/merge.test.js +1397 -0
  115. package/lib/objects/parseObjectPath.js +47 -15
  116. package/lib/objects/parseObjectPath.test.js +138 -0
  117. package/lib/objects/set.js +25 -19
  118. package/lib/objects/set.test.js +522 -0
  119. package/lib/schema/typebox/index.js +2 -3
  120. package/lib/schema/typebox/typebox.js +6 -6
  121. package/lib/scripts/getGenerateContext.js +386 -77
  122. package/lib/server/crypto/md5.js +0 -2
  123. package/lib/server/fetch/createFetchWithProxy.js +2 -4
  124. package/lib/server/fetch/createFetchWithProxyByNodeFetch.js +258 -31
  125. package/lib/server/fetch/createFetchWithProxyByUndici.js +307 -49
  126. package/lib/server/getPackageDir.js +2 -3
  127. package/lib/server/index.js +5 -7
  128. package/lib/server/jsdom.js +1 -3
  129. package/lib/server/node-fetch.js +2 -4
  130. package/lib/server/polyfill/polyfillBrowser.js +163 -9
  131. package/lib/server/polyfill/polyfillBrowser.test.js +164 -0
  132. package/lib/server/polyfill/polyfillCrypto.js +157 -9
  133. package/lib/server/polyfill/polyfillFetch.js +13 -13
  134. package/lib/server/polyfill/polyfillJsDom.js +264 -58
  135. package/lib/server/polyfill/polyfillWebSocket.js +11 -11
  136. package/lib/server/ws.js +1 -3
  137. package/lib/strings/bytes.test.js +327 -0
  138. package/lib/strings/camelCase.js +23 -14
  139. package/lib/strings/formatBytes.js +29 -20
  140. package/lib/strings/parseBytes.js +54 -0
  141. package/lib/strings/renderTemplate.js +17 -12
  142. package/lib/strings/renderTemplate.test.js +104 -0
  143. package/lib/typedoc.js +2 -4
  144. package/lib/types.d.js +0 -2
  145. package/lib/validations/asserts.js +0 -2
  146. package/lib/validations/isUUID.js +0 -2
  147. package/lib/validations/isUUID.test.js +87 -0
  148. package/lib/validations/parseTimestamp.js +12 -7
  149. package/lib/validations/parseTimestamp.test.js +6 -0
  150. package/lib/web/getGlobalThis.js +3 -4
  151. package/lib/web/getRandomValues.js +28 -20
  152. package/lib/web/randomUUID.js +7 -8
  153. package/lib/web/requestIdleCallback.js +13 -9
  154. package/lib/web/structuredClone.js +35 -28
  155. package/lib/web/structuredClone.test.js +81 -0
  156. package/package.json +9 -14
  157. package/src/arrays/MaybeArray.ts +22 -22
  158. package/src/arrays/arrayFromAsync.ts +3 -3
  159. package/src/asyncs/AsyncInterval.ts +8 -8
  160. package/src/asyncs/Promises.ts +51 -51
  161. package/src/asyncs/createAsyncIterator.ts +33 -33
  162. package/src/asyncs/createLazyPromise.test.ts +73 -73
  163. package/src/asyncs/createLazyPromise.ts +68 -73
  164. package/src/asyncs/firstOfAsyncIterator.ts +5 -5
  165. package/src/asyncs/generatorOfStream.ts +12 -12
  166. package/src/asyncs/isIterator.ts +1 -1
  167. package/src/asyncs/isThenable.ts +2 -2
  168. package/src/asyncs/nextOfAsyncIterator.ts +20 -20
  169. package/src/asyncs/promiseOfCallback.ts +13 -13
  170. package/src/asyncs/timeout.ts +23 -23
  171. package/src/browsers/copy.ts +48 -48
  172. package/src/browsers/download.ts +38 -36
  173. package/src/browsers/getFileFromDataTransfer.ts +35 -35
  174. package/src/browsers/loaders.ts +49 -49
  175. package/src/crypto/base.ts +3 -3
  176. package/src/crypto/getNodeCrypto.ts +2 -2
  177. package/src/crypto/hashing.test.ts +33 -47
  178. package/src/crypto/hashing.ts +67 -67
  179. package/src/crypto/md5.bench.ts +20 -24
  180. package/src/crypto/md5.test.ts +3 -3
  181. package/src/crypto/pem/pem.test.ts +26 -42
  182. package/src/crypto/pem/pem.ts +65 -65
  183. package/src/crypto/ulid.test.ts +31 -31
  184. package/src/crypto/ulid.ts +116 -116
  185. package/src/emitter/types.ts +6 -6
  186. package/src/errors/DetailError.ts +151 -0
  187. package/src/errors/Errors.test.ts +15 -15
  188. package/src/errors/Errors.ts +97 -238
  189. package/src/fetch/HttpStatus.ts +77 -77
  190. package/src/fetch/createFetchWith.ts +25 -25
  191. package/src/fetch/createFetchWithLogging.ts +12 -15
  192. package/src/fetch/createFetchWithRetry.ts +79 -79
  193. package/src/fetch/dumpRequest.test.ts +176 -0
  194. package/src/fetch/dumpRequest.ts +149 -52
  195. package/src/fetch/dumpResponse.test.ts +160 -0
  196. package/src/fetch/dumpResponse.ts +48 -20
  197. package/src/fetch/http.types.ts +35 -35
  198. package/src/fetch/isTextContentType.ts +12 -0
  199. package/src/fetch/resolveRequest.ts +1 -0
  200. package/src/fetch/types.ts +2 -2
  201. package/src/i18n/createTranslate.test.ts +90 -113
  202. package/src/i18n/createTranslate.ts +55 -55
  203. package/src/index.ts +26 -26
  204. package/src/io/AbstractEncoding.ts +12 -12
  205. package/src/io/ArrayBuffer.test-d.ts +1 -1
  206. package/src/io/ArrayBuffers.base64.test.ts +52 -52
  207. package/src/io/ArrayBuffers.test.ts +14 -14
  208. package/src/io/ArrayBuffers.ts +645 -415
  209. package/src/io/Buffer.test.ts +17 -17
  210. package/src/io/Buffer.ts +17 -17
  211. package/src/io/ByteBuffer.test.ts +37 -37
  212. package/src/io/ByteBuffer.ts +574 -566
  213. package/src/io/base64.ts +46 -44
  214. package/src/io/dump.ts +22 -22
  215. package/src/io/isBuffer.test.ts +2 -2
  216. package/src/io/isBuffer.ts +1 -1
  217. package/src/io/isTransferable.test.ts +4 -4
  218. package/src/io/isTransferable.ts +29 -29
  219. package/src/io/parseDataUri.test.ts +22 -27
  220. package/src/io/parseDataUri.ts +57 -57
  221. package/src/io/types.ts +13 -0
  222. package/src/langs/AsyncCloser.ts +34 -34
  223. package/src/langs/Closer.ts +28 -28
  224. package/src/langs/MaybeFunction.ts +5 -5
  225. package/src/langs/classOf.ts +1 -1
  226. package/src/langs/deepEqual.test.ts +1 -12
  227. package/src/langs/deepEqual.ts +82 -82
  228. package/src/langs/deepFreeze.ts +11 -11
  229. package/src/langs/getGlobalStates.ts +16 -16
  230. package/src/langs/getObjectId.ts +10 -13
  231. package/src/langs/ifPresent.ts +2 -2
  232. package/src/langs/isClass.ts +1 -1
  233. package/src/langs/isDefined.ts +1 -1
  234. package/src/langs/isEmptyObject.ts +1 -1
  235. package/src/langs/isFunction.ts +1 -1
  236. package/src/langs/isNil.ts +3 -0
  237. package/src/langs/isPlainObject.ts +4 -4
  238. package/src/langs/langs.test.ts +18 -18
  239. package/src/langs/memoize.ts +21 -21
  240. package/src/langs/mixin.test.ts +22 -26
  241. package/src/langs/mixin.ts +6 -9
  242. package/src/langs/parseBoolean.ts +30 -26
  243. package/src/langs/parseDate.ts +13 -0
  244. package/src/langs/shallowClone.ts +11 -11
  245. package/src/langs/shallowEqual.ts +19 -19
  246. package/src/libs/ms.test.ts +274 -274
  247. package/src/libs/ms.ts +137 -137
  248. package/src/logger/const.ts +18 -0
  249. package/src/logger/index.ts +2 -0
  250. package/src/logger/types.ts +10 -0
  251. package/src/maths/clamp.test.ts +18 -18
  252. package/src/maths/clamp.ts +17 -17
  253. package/src/maths/createRandom.test.ts +12 -0
  254. package/src/maths/random.ts +50 -14
  255. package/src/modules/isModule.ts +4 -4
  256. package/src/modules/parseModuleId.test.ts +61 -68
  257. package/src/modules/parseModuleId.ts +29 -43
  258. package/src/objects/computeIfAbsent.ts +10 -10
  259. package/src/objects/get.test-d.ts +33 -51
  260. package/src/objects/get.ts +31 -31
  261. package/src/objects/merge/isMergeableObject.ts +5 -5
  262. package/src/objects/merge/merge.test.ts +658 -880
  263. package/src/objects/merge/merge.ts +84 -84
  264. package/src/objects/parseObjectPath.test.ts +13 -13
  265. package/src/objects/parseObjectPath.ts +25 -25
  266. package/src/objects/set.test.ts +271 -366
  267. package/src/objects/set.ts +36 -36
  268. package/src/schema/typebox/typebox.ts +20 -26
  269. package/src/scripts/getGenerateContext.ts +79 -79
  270. package/src/server/crypto/md5.ts +1 -1
  271. package/src/server/fetch/createFetchWithProxyByNodeFetch.ts +28 -31
  272. package/src/server/fetch/createFetchWithProxyByUndici.ts +63 -69
  273. package/src/server/getPackageDir.ts +7 -7
  274. package/src/server/polyfill/polyfillBrowser.test.ts +10 -10
  275. package/src/server/polyfill/polyfillBrowser.ts +3 -3
  276. package/src/server/polyfill/polyfillCrypto.ts +6 -6
  277. package/src/server/polyfill/polyfillFetch.ts +11 -21
  278. package/src/server/polyfill/polyfillJsDom.ts +59 -71
  279. package/src/server/polyfill/polyfillWebSocket.ts +14 -14
  280. package/src/strings/bytes.test.ts +69 -0
  281. package/src/strings/camelCase.ts +58 -63
  282. package/src/strings/formatBytes.ts +50 -29
  283. package/src/strings/parseBytes.ts +66 -0
  284. package/src/strings/renderTemplate.test.ts +10 -17
  285. package/src/strings/renderTemplate.ts +19 -22
  286. package/src/types.d.ts +9 -9
  287. package/src/validations/asserts.ts +8 -8
  288. package/src/validations/isUUID.test.ts +8 -8
  289. package/src/validations/isUUID.ts +1 -1
  290. package/src/validations/parseTimestamp.test.ts +2 -2
  291. package/src/validations/parseTimestamp.ts +21 -21
  292. package/src/web/getGlobalThis.ts +6 -6
  293. package/src/web/getRandomValues.ts +29 -29
  294. package/src/web/randomUUID.ts +5 -5
  295. package/src/web/requestIdleCallback.ts +7 -10
  296. package/src/web/structuredClone.test.ts +8 -8
  297. package/src/web/structuredClone.ts +62 -62
  298. package/tsconfig.json +26 -34
  299. package/lib/arrays/MaybeArray.js.map +0 -1
  300. package/lib/arrays/arrayFromAsync.js.map +0 -1
  301. package/lib/asyncs/AsyncInterval.js.map +0 -1
  302. package/lib/asyncs/MaybePromise.js.map +0 -1
  303. package/lib/asyncs/Promises.js.map +0 -1
  304. package/lib/asyncs/createAsyncIterator.js.map +0 -1
  305. package/lib/asyncs/createLazyPromise.js.map +0 -1
  306. package/lib/asyncs/firstOfAsyncIterator.js.map +0 -1
  307. package/lib/asyncs/generatorOfStream.js.map +0 -1
  308. package/lib/asyncs/isIterator.js.map +0 -1
  309. package/lib/asyncs/isPromise.js.map +0 -1
  310. package/lib/asyncs/isThenable.js.map +0 -1
  311. package/lib/asyncs/nextOfAsyncIterator.js.map +0 -1
  312. package/lib/asyncs/promiseOfCallback.js.map +0 -1
  313. package/lib/asyncs/timeout.js.map +0 -1
  314. package/lib/browsers/copy.js.map +0 -1
  315. package/lib/browsers/download.js.map +0 -1
  316. package/lib/browsers/getFileFromDataTransfer.js.map +0 -1
  317. package/lib/browsers/loaders.js.map +0 -1
  318. package/lib/cn/division/DivisionCode.js +0 -215
  319. package/lib/cn/division/DivisionCode.js.map +0 -1
  320. package/lib/cn/division/binarySearch.js +0 -27
  321. package/lib/cn/division/binarySearch.js.map +0 -1
  322. package/lib/cn/formatChineseAmount.js +0 -77
  323. package/lib/cn/formatChineseAmount.js.map +0 -1
  324. package/lib/cn/id/Mod11.js +0 -43
  325. package/lib/cn/id/Mod11.js.map +0 -1
  326. package/lib/cn/id/ResidentIdNumber.js +0 -98
  327. package/lib/cn/id/ResidentIdNumber.js.map +0 -1
  328. package/lib/cn/id/types.js +0 -8
  329. package/lib/cn/id/types.js.map +0 -1
  330. package/lib/cn/index.js +0 -14
  331. package/lib/cn/index.js.map +0 -1
  332. package/lib/cn/parseChineseNumber.js +0 -94
  333. package/lib/cn/parseChineseNumber.js.map +0 -1
  334. package/lib/cn/pinyin/cartesianProduct.js +0 -22
  335. package/lib/cn/pinyin/cartesianProduct.js.map +0 -1
  336. package/lib/cn/pinyin/data.json +0 -413
  337. package/lib/cn/pinyin/loader.js +0 -15
  338. package/lib/cn/pinyin/loader.js.map +0 -1
  339. package/lib/cn/pinyin/preload.js +0 -4
  340. package/lib/cn/pinyin/preload.js.map +0 -1
  341. package/lib/cn/pinyin/toPinyinPure.js +0 -32
  342. package/lib/cn/pinyin/toPinyinPure.js.map +0 -1
  343. package/lib/cn/pinyin/transform.js +0 -14
  344. package/lib/cn/pinyin/transform.js.map +0 -1
  345. package/lib/cn/types.js +0 -3
  346. package/lib/cn/types.js.map +0 -1
  347. package/lib/cn/uscc/Mod31.js +0 -49
  348. package/lib/cn/uscc/Mod31.js.map +0 -1
  349. package/lib/cn/uscc/USCC.js +0 -94
  350. package/lib/cn/uscc/USCC.js.map +0 -1
  351. package/lib/cn/uscc/isUSCC.js +0 -8
  352. package/lib/cn/uscc/isUSCC.js.map +0 -1
  353. package/lib/crypto/base.js.map +0 -1
  354. package/lib/crypto/getNodeCrypto.js.map +0 -1
  355. package/lib/crypto/hashing.js.map +0 -1
  356. package/lib/crypto/md5.bench.js.map +0 -1
  357. package/lib/crypto/md5.d.js.map +0 -1
  358. package/lib/crypto/md5.js.map +0 -1
  359. package/lib/crypto/pem/pem.js.map +0 -1
  360. package/lib/crypto/randomUUIDv7.js.map +0 -1
  361. package/lib/crypto/ulid.js.map +0 -1
  362. package/lib/emitter/types.js.map +0 -1
  363. package/lib/errors/Errors.js.map +0 -1
  364. package/lib/fetch/HttpStatus.js.map +0 -1
  365. package/lib/fetch/createFetchWith.js.map +0 -1
  366. package/lib/fetch/createFetchWithLogging.js.map +0 -1
  367. package/lib/fetch/createFetchWithRetry.js.map +0 -1
  368. package/lib/fetch/dumpRequest.js.map +0 -1
  369. package/lib/fetch/dumpResponse.js.map +0 -1
  370. package/lib/fetch/http.types.js.map +0 -1
  371. package/lib/fetch/index.js.map +0 -1
  372. package/lib/fetch/types.js.map +0 -1
  373. package/lib/i18n/createTranslate.js.map +0 -1
  374. package/lib/index.js.map +0 -1
  375. package/lib/io/AbstractEncoding.js.map +0 -1
  376. package/lib/io/ArrayBuffer.test-d.js.map +0 -1
  377. package/lib/io/ArrayBuffers.js.map +0 -1
  378. package/lib/io/Buffer.js.map +0 -1
  379. package/lib/io/ByteBuffer.js.map +0 -1
  380. package/lib/io/base64.js.map +0 -1
  381. package/lib/io/dump.js.map +0 -1
  382. package/lib/io/isBuffer.js.map +0 -1
  383. package/lib/io/isTransferable.js.map +0 -1
  384. package/lib/io/parseDataUri.js.map +0 -1
  385. package/lib/langs/AsyncCloser.js.map +0 -1
  386. package/lib/langs/Closer.js.map +0 -1
  387. package/lib/langs/MaybeFunction.js.map +0 -1
  388. package/lib/langs/classOf.js.map +0 -1
  389. package/lib/langs/deepEqual.js.map +0 -1
  390. package/lib/langs/deepFreeze.js.map +0 -1
  391. package/lib/langs/getGlobalStates.js.map +0 -1
  392. package/lib/langs/getObjectId.js.map +0 -1
  393. package/lib/langs/ifPresent.js.map +0 -1
  394. package/lib/langs/isClass.js.map +0 -1
  395. package/lib/langs/isDefined.js.map +0 -1
  396. package/lib/langs/isEmptyObject.js.map +0 -1
  397. package/lib/langs/isFunction.js.map +0 -1
  398. package/lib/langs/isNullish.js +0 -5
  399. package/lib/langs/isNullish.js.map +0 -1
  400. package/lib/langs/isPlainObject.js.map +0 -1
  401. package/lib/langs/memoize.js.map +0 -1
  402. package/lib/langs/mixin.js.map +0 -1
  403. package/lib/langs/parseBoolean.js.map +0 -1
  404. package/lib/langs/shallowClone.js.map +0 -1
  405. package/lib/langs/shallowEqual.js.map +0 -1
  406. package/lib/libs/ms.js.map +0 -1
  407. package/lib/logging/Logger.js +0 -5
  408. package/lib/logging/Logger.js.map +0 -1
  409. package/lib/logging/createChildLogger.js +0 -16
  410. package/lib/logging/createChildLogger.js.map +0 -1
  411. package/lib/logging/createLogger.js +0 -63
  412. package/lib/logging/createLogger.js.map +0 -1
  413. package/lib/logging/createNoopLogger.js +0 -13
  414. package/lib/logging/createNoopLogger.js.map +0 -1
  415. package/lib/logging/slog.js +0 -143
  416. package/lib/logging/slog.js.map +0 -1
  417. package/lib/maths/clamp.js.map +0 -1
  418. package/lib/maths/random.js.map +0 -1
  419. package/lib/mitt/index.js +0 -77
  420. package/lib/mitt/index.js.map +0 -1
  421. package/lib/modules/isModule.js.map +0 -1
  422. package/lib/modules/parseModuleId.js.map +0 -1
  423. package/lib/objects/computeIfAbsent.js.map +0 -1
  424. package/lib/objects/get.js.map +0 -1
  425. package/lib/objects/get.test-d.js.map +0 -1
  426. package/lib/objects/merge/index.js.map +0 -1
  427. package/lib/objects/merge/isMergeableObject.js.map +0 -1
  428. package/lib/objects/merge/merge.js.map +0 -1
  429. package/lib/objects/parseObjectPath.js.map +0 -1
  430. package/lib/objects/set.js.map +0 -1
  431. package/lib/schema/typebox/index.js.map +0 -1
  432. package/lib/schema/typebox/typebox.js.map +0 -1
  433. package/lib/scripts/getGenerateContext.js.map +0 -1
  434. package/lib/server/crypto/md5.js.map +0 -1
  435. package/lib/server/fetch/createFetchWithProxy.js.map +0 -1
  436. package/lib/server/fetch/createFetchWithProxyByNodeFetch.js.map +0 -1
  437. package/lib/server/fetch/createFetchWithProxyByUndici.js.map +0 -1
  438. package/lib/server/getPackageDir.js.map +0 -1
  439. package/lib/server/index.js.map +0 -1
  440. package/lib/server/jsdom.js.map +0 -1
  441. package/lib/server/node-fetch.js.map +0 -1
  442. package/lib/server/polyfill/polyfillBrowser.js.map +0 -1
  443. package/lib/server/polyfill/polyfillCrypto.js.map +0 -1
  444. package/lib/server/polyfill/polyfillFetch.js.map +0 -1
  445. package/lib/server/polyfill/polyfillJsDom.js.map +0 -1
  446. package/lib/server/polyfill/polyfillWebSocket.js.map +0 -1
  447. package/lib/server/ws.js.map +0 -1
  448. package/lib/strings/camelCase.js.map +0 -1
  449. package/lib/strings/formatBytes.js.map +0 -1
  450. package/lib/strings/renderTemplate.js.map +0 -1
  451. package/lib/typedoc.js.map +0 -1
  452. package/lib/types.d.js.map +0 -1
  453. package/lib/validations/asserts.js.map +0 -1
  454. package/lib/validations/isUUID.js.map +0 -1
  455. package/lib/validations/parseTimestamp.js.map +0 -1
  456. package/lib/web/getGlobalThis.js.map +0 -1
  457. package/lib/web/getRandomValues.js.map +0 -1
  458. package/lib/web/randomUUID.js.map +0 -1
  459. package/lib/web/requestIdleCallback.js.map +0 -1
  460. package/lib/web/structuredClone.js.map +0 -1
  461. package/src/cn/README.md +0 -3
  462. package/src/cn/division/DivisionCode.ts +0 -173
  463. package/src/cn/division/binarySearch.test.ts +0 -64
  464. package/src/cn/division/binarySearch.ts +0 -25
  465. package/src/cn/division/division.test.ts +0 -22
  466. package/src/cn/formatChineseAmount.ts +0 -61
  467. package/src/cn/id/Mod11.ts +0 -26
  468. package/src/cn/id/ResidentIdNumber.ts +0 -126
  469. package/src/cn/id/id.test.ts +0 -20
  470. package/src/cn/id/types.ts +0 -26
  471. package/src/cn/index.ts +0 -17
  472. package/src/cn/parseChineseNumber.test.ts +0 -159
  473. package/src/cn/parseChineseNumber.ts +0 -97
  474. package/src/cn/pinyin/cartesianProduct.test.ts +0 -64
  475. package/src/cn/pinyin/cartesianProduct.ts +0 -24
  476. package/src/cn/pinyin/data.json +0 -413
  477. package/src/cn/pinyin/loader.ts +0 -12
  478. package/src/cn/pinyin/preload.ts +0 -3
  479. package/src/cn/pinyin/toPinyin.test.ts +0 -12
  480. package/src/cn/pinyin/toPinyinPure.ts +0 -43
  481. package/src/cn/pinyin/transform.ts +0 -12
  482. package/src/cn/scripts/gen.test.ts +0 -131
  483. package/src/cn/types.ts +0 -11
  484. package/src/cn/uscc/Mod31.ts +0 -38
  485. package/src/cn/uscc/USCC.ts +0 -94
  486. package/src/cn/uscc/isUSCC.ts +0 -8
  487. package/src/cn/uscc/uscc.test.ts +0 -16
  488. package/src/langs/isNullish.ts +0 -3
  489. package/src/logging/Logger.ts +0 -25
  490. package/src/logging/createChildLogger.ts +0 -16
  491. package/src/logging/createLogger.ts +0 -50
  492. package/src/logging/createNoopLogger.ts +0 -13
  493. package/src/logging/logger.test.ts +0 -36
  494. package/src/logging/slog.test.ts +0 -8
  495. package/src/logging/slog.ts +0 -221
  496. package/src/mitt/README.md +0 -1
  497. package/src/mitt/index.ts +0 -114
@@ -2,87 +2,75 @@ import type { ConstructorOptions, ResourceLoaderConstructorOptions } from 'jsdom
2
2
  import { getGlobalThis } from '../../web/getGlobalThis';
3
3
 
4
4
  export async function polyfillJsDom() {
5
- if (typeof window !== 'undefined') {
6
- return false;
7
- }
5
+ if (typeof window !== 'undefined') {
6
+ return false;
7
+ }
8
8
 
9
- const globalThis = getGlobalThis();
9
+ const globalThis = getGlobalThis();
10
10
 
11
- const { ResourceLoader, JSDOM } = await import('jsdom');
11
+ const { ResourceLoader, JSDOM } = await import('jsdom');
12
12
 
13
- // https://github.com/lukechilds/window/blob/master/src/index.js
14
- // eslint-disable-next-line @typescript-eslint/no-extraneous-class
15
- class Window {
16
- constructor(opts: ResourceLoaderConstructorOptions & ConstructorOptions = {}) {
17
- const { proxy, strictSSL, userAgent, ...jsdomOpts } = opts;
18
- const resources = new ResourceLoader({
19
- proxy,
20
- strictSSL,
21
- userAgent,
22
- });
23
- return new JSDOM(
24
- '',
25
- Object.assign(jsdomOpts, {
26
- resources,
27
- }),
28
- ).window;
29
- }
30
- }
13
+ // https://github.com/lukechilds/window/blob/master/src/index.js
14
+ // eslint-disable-next-line @typescript-eslint/no-extraneous-class
15
+ class Window {
16
+ constructor(opts: ResourceLoaderConstructorOptions & ConstructorOptions = {}) {
17
+ const { proxy, strictSSL, userAgent, ...jsdomOpts } = opts;
18
+ const resources = new ResourceLoader({ proxy, strictSSL, userAgent });
19
+ return new JSDOM('', Object.assign(jsdomOpts, { resources })).window;
20
+ }
21
+ }
31
22
 
32
- // https://github.com/lukechilds/browser-env/blob/master/src/index.js
33
- // Default jsdom config.
34
- // These settings must override any custom settings to make sure we can iterate
35
- // over the window object.
36
- const defaultJsdomConfig = {
37
- // features: {
38
- // FetchExternalResources: false,
39
- // ProcessExternalResources: false,
40
- // },
41
- };
42
- // IIFE executed on import to return an array of global Node.js properties that
43
- // conflict with global browser properties.
44
- const protectedProperties = (() =>
45
- Object.getOwnPropertyNames(new Window(defaultJsdomConfig)).filter(
46
- (prop) => typeof globalThis[prop as keyof typeof globalThis] !== 'undefined',
47
- ))();
23
+ // https://github.com/lukechilds/browser-env/blob/master/src/index.js
24
+ // Default jsdom config.
25
+ // These settings must override any custom settings to make sure we can iterate
26
+ // over the window object.
27
+ const defaultJsdomConfig = {
28
+ // features: {
29
+ // FetchExternalResources: false,
30
+ // ProcessExternalResources: false,
31
+ // },
32
+ };
33
+ // IIFE executed on import to return an array of global Node.js properties that
34
+ // conflict with global browser properties.
35
+ const protectedProperties = (() =>
36
+ Object.getOwnPropertyNames(new Window(defaultJsdomConfig)).filter(
37
+ (prop) => typeof globalThis[prop as keyof typeof globalThis] !== 'undefined',
38
+ ))();
48
39
 
49
- function installEnv(...args: any[]) {
50
- // Sets up global browser environment
51
- // Extract options from args
52
- const properties = args.filter((arg: any) => Array.isArray(arg))[0];
53
- const userJsdomConfig = args.filter((arg: any) => !Array.isArray(arg))[0];
40
+ function installEnv(...args: any[]) {
41
+ // Sets up global browser environment
42
+ // Extract options from args
43
+ const properties = args.filter((arg: any) => Array.isArray(arg))[0];
44
+ const userJsdomConfig = args.filter((arg: any) => !Array.isArray(arg))[0];
54
45
 
55
- // Create window object
56
- const window = new Window(Object.assign({}, userJsdomConfig, defaultJsdomConfig));
46
+ // Create window object
47
+ const window = new Window(Object.assign({}, userJsdomConfig, defaultJsdomConfig));
57
48
 
58
- // Get all global browser properties
59
- Object.getOwnPropertyNames(window)
49
+ // Get all global browser properties
50
+ Object.getOwnPropertyNames(window)
60
51
 
61
- // Remove protected properties
62
- .filter((prop) => !protectedProperties.includes(prop))
52
+ // Remove protected properties
53
+ .filter((prop) => !protectedProperties.includes(prop))
63
54
 
64
- // If we're only applying specific required properties remove everything else
65
- .filter((prop) => !(properties && properties.indexOf(prop) === -1))
66
- .filter((prop) => {
67
- switch (prop) {
68
- case 'undefined':
69
- return false;
70
- }
71
- return true;
72
- })
55
+ // If we're only applying specific required properties remove everything else
56
+ .filter((prop) => !(properties && properties.indexOf(prop) === -1))
57
+ .filter((prop) => {
58
+ switch (prop) {
59
+ case 'undefined':
60
+ return false;
61
+ }
62
+ return true;
63
+ })
73
64
 
74
- // Copy what's left to the Node.js global scope
75
- .forEach((prop) => {
76
- // console.debug(`define globalThis.${prop}`);
77
- Object.defineProperty(globalThis, prop, {
78
- configurable: true,
79
- get: () => window[prop as keyof Window] as any,
80
- });
81
- });
65
+ // Copy what's left to the Node.js global scope
66
+ .forEach((prop) => {
67
+ // console.debug(`define globalThis.${prop}`);
68
+ Object.defineProperty(globalThis, prop, { configurable: true, get: () => window[prop as keyof Window] as any });
69
+ });
82
70
 
83
- return window;
84
- }
71
+ return window;
72
+ }
85
73
 
86
- installEnv({ url: 'http://localhost' });
87
- return true;
74
+ installEnv({ url: 'http://localhost' });
75
+ return true;
88
76
  }
@@ -4,18 +4,18 @@ import { getGlobalThis } from '../../web/getGlobalThis';
4
4
  export function polyfillWebSocket(ws: any): boolean;
5
5
  export function polyfillWebSocket(ws?: undefined): Promise<boolean>;
6
6
  export function polyfillWebSocket(ws?: any): MaybePromise<boolean> {
7
- const globalThis = getGlobalThis();
8
- if ('WebSocket' in globalThis) {
9
- return false;
10
- }
11
- if (ws && 'then' in ws) {
12
- return ws.then((v: any) => {
13
- return polyfillWebSocket(v?.default || v);
14
- });
15
- }
16
- if (ws) {
17
- const { WebSocket } = ws;
18
- Object.assign(globalThis, { WebSocket });
19
- }
20
- return import('ws').then((ws) => polyfillWebSocket(ws));
7
+ const globalThis = getGlobalThis();
8
+ if ('WebSocket' in globalThis) {
9
+ return false;
10
+ }
11
+ if (ws && 'then' in ws) {
12
+ return ws.then((v: any) => {
13
+ return polyfillWebSocket(v?.default || v);
14
+ });
15
+ }
16
+ if (ws) {
17
+ const { WebSocket } = ws;
18
+ Object.assign(globalThis, { WebSocket });
19
+ }
20
+ return import('ws').then((ws) => polyfillWebSocket(ws));
21
21
  }
@@ -0,0 +1,69 @@
1
+ import { describe, expect, test } from 'vitest';
2
+ import { formatBytes } from './formatBytes';
3
+ import { parseBytes } from './parseBytes';
4
+
5
+ describe('bytes', () => {
6
+ describe('formatBytes', () => {
7
+ const testCases: [number, any, string][] = [
8
+ // IEC standard by default
9
+ [1024, undefined, '1.0 KiB'],
10
+ [1024 * 1024, undefined, '1.0 MiB'],
11
+ [1536, undefined, '1.5 KiB'],
12
+ // SI standard
13
+ [1000, true, '1.0 kB'],
14
+ [1000 * 1000, true, '1.0 MB'],
15
+ [1500, true, '1.5 kB'],
16
+ // Small byte values
17
+ [100, undefined, '100 B'],
18
+ [999, undefined, '999 B'],
19
+ [1023, undefined, '1023 B'],
20
+ // SI small byte values
21
+ [100, true, '100 B'],
22
+ [999, true, '999 B'],
23
+ // Decimal places
24
+ [1536, { dp: 2 }, '1.50 KiB'],
25
+ [1536, { dp: 3 }, '1.500 KiB'],
26
+ // Force unit
27
+ [1024 * 1024, { unit: 'KiB' }, '1024.0 KiB'],
28
+ [1000 * 1000, { si: true, unit: 'kB' }, '1000.0 kB'],
29
+ ];
30
+
31
+ test('should format bytes correctly', () => {
32
+ for (const [bytes, options, expected] of testCases) {
33
+ expect(formatBytes(bytes, options as any)).toBe(expected);
34
+ }
35
+ });
36
+ });
37
+
38
+ describe('parseBytes', () => {
39
+ const validTestCases: [string, ReturnType<typeof parseBytes>][] = [
40
+ ['1B', { value: 1, unit: 'B', bytes: 1 }],
41
+ ['1KB', { value: 1, unit: 'KB', bytes: 1000 }],
42
+ ['1KiB', { value: 1, unit: 'KiB', bytes: 1024 }],
43
+ ['1.5GB', { value: 1.5, unit: 'GB', bytes: 1.5 * 1000 ** 3 }],
44
+ ['2TiB', { value: 2, unit: 'TiB', bytes: 2 * 1024 ** 4 }],
45
+ // single letter
46
+ ['1G', { value: 1, unit: 'G', bytes: 1000 ** 3 }],
47
+ ['1.5T', { value: 1.5, unit: 'T', bytes: 1.5 * 1000 ** 4 }],
48
+ // case-insensitive
49
+ ['1gb', { value: 1, unit: 'gb', bytes: 1000 ** 3 }],
50
+ ['1.5 mib', { value: 1.5, unit: 'mib', bytes: 1.5 * 1024 ** 2 }],
51
+ // whitespace
52
+ [' 1.5 GB ', { value: 1.5, unit: 'GB', bytes: 1.5 * 1000 ** 3 }],
53
+ ];
54
+
55
+ test('should parse valid byte strings', () => {
56
+ for (const [str, expected] of validTestCases) {
57
+ expect(parseBytes(str)).toEqual(expected);
58
+ }
59
+ });
60
+
61
+ const invalidTestCases = ['abc', '1.5XB', ''];
62
+
63
+ test('should return undefined for invalid strings', () => {
64
+ for (const str of invalidTestCases) {
65
+ expect(parseBytes(str)).toBeUndefined();
66
+ }
67
+ });
68
+ });
69
+ });
@@ -1,83 +1,78 @@
1
1
  // https://github.com/sindresorhus/camelcase/blob/master/index.js
2
2
 
3
3
  function preserveCamelCase(string: string) {
4
- let isLastCharLower = false;
5
- let isLastCharUpper = false;
6
- let isLastLastCharUpper = false;
4
+ let isLastCharLower = false;
5
+ let isLastCharUpper = false;
6
+ let isLastLastCharUpper = false;
7
7
 
8
- for (let i = 0; i < string.length; i++) {
9
- const character = string[i];
8
+ for (let i = 0; i < string.length; i++) {
9
+ const character = string[i];
10
10
 
11
- if (isLastCharLower && /[a-zA-Z]/.test(character) && character.toUpperCase() === character) {
12
- string = string.slice(0, i) + '-' + string.slice(i);
13
- isLastCharLower = false;
14
- isLastLastCharUpper = isLastCharUpper;
15
- isLastCharUpper = true;
16
- i++;
17
- } else if (
18
- isLastCharUpper &&
19
- isLastLastCharUpper &&
20
- /[a-zA-Z]/.test(character) &&
21
- character.toLowerCase() === character
22
- ) {
23
- string = string.slice(0, i - 1) + '-' + string.slice(i - 1);
24
- isLastLastCharUpper = isLastCharUpper;
25
- isLastCharUpper = false;
26
- isLastCharLower = true;
27
- } else {
28
- isLastCharLower = character.toLowerCase() === character && character.toUpperCase() !== character;
29
- isLastLastCharUpper = isLastCharUpper;
30
- isLastCharUpper = character.toUpperCase() === character && character.toLowerCase() !== character;
31
- }
32
- }
11
+ if (isLastCharLower && /[a-zA-Z]/.test(character) && character.toUpperCase() === character) {
12
+ string = string.slice(0, i) + '-' + string.slice(i);
13
+ isLastCharLower = false;
14
+ isLastLastCharUpper = isLastCharUpper;
15
+ isLastCharUpper = true;
16
+ i++;
17
+ } else if (
18
+ isLastCharUpper
19
+ && isLastLastCharUpper
20
+ && /[a-zA-Z]/.test(character)
21
+ && character.toLowerCase() === character
22
+ ) {
23
+ string = string.slice(0, i - 1) + '-' + string.slice(i - 1);
24
+ isLastLastCharUpper = isLastCharUpper;
25
+ isLastCharUpper = false;
26
+ isLastCharLower = true;
27
+ } else {
28
+ isLastCharLower = character.toLowerCase() === character && character.toUpperCase() !== character;
29
+ isLastLastCharUpper = isLastCharUpper;
30
+ isLastCharUpper = character.toUpperCase() === character && character.toLowerCase() !== character;
31
+ }
32
+ }
33
33
 
34
- return string;
34
+ return string;
35
35
  }
36
36
 
37
37
  export function pascalCase(input: string | string[]) {
38
- return camelCase(input, { pascalCase: true });
38
+ return camelCase(input, { pascalCase: true });
39
39
  }
40
40
 
41
- export function camelCase(
42
- input: string | string[],
43
- options: { pascalCase: boolean } = {
44
- pascalCase: false,
45
- },
46
- ) {
47
- if (!(typeof input === 'string' || Array.isArray(input))) {
48
- throw new TypeError('Expected the input to be `string | string[]`');
49
- }
41
+ export function camelCase(input: string | string[], options: { pascalCase: boolean } = { pascalCase: false }) {
42
+ if (!(typeof input === 'string' || Array.isArray(input))) {
43
+ throw new TypeError('Expected the input to be `string | string[]`');
44
+ }
50
45
 
51
- const postProcess = (x: string) => (options.pascalCase ? x.charAt(0).toUpperCase() + x.slice(1) : x);
46
+ const postProcess = (x: string) => (options.pascalCase ? x.charAt(0).toUpperCase() + x.slice(1) : x);
52
47
 
53
- if (Array.isArray(input)) {
54
- input = input
55
- .map((x) => x.trim())
56
- .filter((x) => x.length)
57
- .join('-');
58
- } else {
59
- input = input.trim();
60
- }
48
+ if (Array.isArray(input)) {
49
+ input = input
50
+ .map((x) => x.trim())
51
+ .filter((x) => x.length)
52
+ .join('-');
53
+ } else {
54
+ input = input.trim();
55
+ }
61
56
 
62
- if (input.length === 0) {
63
- return '';
64
- }
57
+ if (input.length === 0) {
58
+ return '';
59
+ }
65
60
 
66
- if (input.length === 1) {
67
- return options.pascalCase ? input.toUpperCase() : input.toLowerCase();
68
- }
61
+ if (input.length === 1) {
62
+ return options.pascalCase ? input.toUpperCase() : input.toLowerCase();
63
+ }
69
64
 
70
- const hasUpperCase = input !== input.toLowerCase();
65
+ const hasUpperCase = input !== input.toLowerCase();
71
66
 
72
- if (hasUpperCase) {
73
- input = preserveCamelCase(input);
74
- }
67
+ if (hasUpperCase) {
68
+ input = preserveCamelCase(input);
69
+ }
75
70
 
76
- input = input
77
- .replace(/^[_.\- ]+/, '')
78
- .toLowerCase()
79
- .replace(/[_.\- ]+(\w|$)/g, (_, p1) => p1.toUpperCase())
80
- .replace(/\d+(\w|$)/g, (m) => m.toUpperCase());
71
+ input = input
72
+ .replace(/^[_.\- ]+/, '')
73
+ .toLowerCase()
74
+ .replace(/[_.\- ]+(\w|$)/g, (_, p1) => p1.toUpperCase())
75
+ .replace(/\d+(\w|$)/g, (m) => m.toUpperCase());
81
76
 
82
- return postProcess(input);
77
+ return postProcess(input);
83
78
  }
@@ -1,30 +1,51 @@
1
- /**
2
- * Format bytes as human-readable text.
3
- *
4
- * @param bytes Number of bytes.
5
- * @param si True to use metric (SI) units, aka powers of 1000. False to use
6
- * binary (IEC), aka powers of 1024.
7
- * @param dp Number of decimal places to display.
8
- *
9
- * @return Formatted string.
10
- */
11
- export function formatBytes(bytes: number, si = false, dp = 1) {
12
- const thresh = si ? 1000 : 1024;
13
-
14
- if (Math.abs(bytes) < thresh) {
15
- return `${bytes} B`;
16
- }
17
-
18
- const units = si
19
- ? ['kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
20
- : ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'];
21
- let u = -1;
22
- const r = 10 ** dp;
23
-
24
- do {
25
- bytes /= thresh;
26
- ++u;
27
- } while (Math.round(Math.abs(bytes) * r) / r >= thresh && u < units.length - 1);
28
-
29
- return bytes.toFixed(dp) + ' ' + units[u];
1
+ type SIUnit = 'B' | 'kB' | 'MB' | 'GB' | 'TB' | 'PB' | 'EB' | 'ZB' | 'YB';
2
+ type IECUnit = 'B' | 'KiB' | 'MiB' | 'GiB' | 'TiB' | 'PiB' | 'EiB' | 'ZiB' | 'YiB';
3
+ type Unit = SIUnit | IECUnit;
4
+
5
+ interface FormatBytesOptions {
6
+ /** True to use metric (SI) units (powers of 1000). Default is false (binary IEC, powers of 1024). */
7
+ si?: boolean;
8
+ /** Number of decimal places to display. Default is 1. */
9
+ dp?: number;
10
+ /** Force formatting to a specific unit. */
11
+ unit?: Unit;
12
+ }
13
+
14
+ export function formatBytes(bytes: number, options?: FormatBytesOptions): string;
15
+ export function formatBytes(bytes: number, si?: boolean, dp?: number): string;
16
+ export function formatBytes(bytes: number, optionsOrSi: boolean | FormatBytesOptions = false, dp = 1): string {
17
+ let options: FormatBytesOptions;
18
+ if (typeof optionsOrSi === 'boolean') {
19
+ options = { si: optionsOrSi, dp };
20
+ } else {
21
+ options = optionsOrSi || {};
22
+ }
23
+
24
+ const { si = false, dp: decimalPlaces = 1, unit: forceUnit } = options;
25
+ const thresh = si ? 1000 : 1024;
26
+ const units = si
27
+ ? ['kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
28
+ : ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'];
29
+
30
+ if (Math.abs(bytes) < thresh && !forceUnit) {
31
+ return `${bytes} B`;
32
+ }
33
+
34
+ if (forceUnit && forceUnit !== 'B') {
35
+ const unitIndex = units.findIndex((u) => u.toLowerCase() === forceUnit.toLowerCase());
36
+ if (unitIndex !== -1) {
37
+ const value = bytes / Math.pow(thresh, unitIndex + 1);
38
+ return `${value.toFixed(decimalPlaces)} ${units[unitIndex]}`;
39
+ }
40
+ }
41
+
42
+ let u = -1;
43
+ const r = 10 ** decimalPlaces;
44
+
45
+ do {
46
+ bytes /= thresh;
47
+ ++u;
48
+ } while (Math.round(Math.abs(bytes) * r) / r >= thresh && u < units.length - 1);
49
+
50
+ return `${bytes.toFixed(decimalPlaces)} ${units[u]}`;
30
51
  }
@@ -0,0 +1,66 @@
1
+ const UnitMultipliers: Record<string, number> = {
2
+ B: 1,
3
+ // SI
4
+ K: 1000,
5
+ KB: 1000,
6
+ M: 1000 ** 2,
7
+ MB: 1000 ** 2,
8
+ G: 1000 ** 3,
9
+ GB: 1000 ** 3,
10
+ T: 1000 ** 4,
11
+ TB: 1000 ** 4,
12
+ P: 1000 ** 5,
13
+ PB: 1000 ** 5,
14
+ E: 1000 ** 6,
15
+ EB: 1000 ** 6,
16
+ Z: 1000 ** 7,
17
+ ZB: 1000 ** 7,
18
+ Y: 1000 ** 8,
19
+ YB: 1000 ** 8,
20
+ // IEC
21
+ KIB: 1024,
22
+ MIB: 1024 ** 2,
23
+ GIB: 1024 ** 3,
24
+ TIB: 1024 ** 4,
25
+ PIB: 1024 ** 5,
26
+ EIB: 1024 ** 6,
27
+ ZIB: 1024 ** 7,
28
+ YIB: 1024 ** 8,
29
+ };
30
+
31
+ type ParseBytesResult = {
32
+ bytes: number;
33
+ unit: string;
34
+ value: number;
35
+ };
36
+
37
+ export function parseBytes(str: string): ParseBytesResult | undefined {
38
+ if (typeof str !== 'string' || str.length === 0) {
39
+ return undefined;
40
+ }
41
+
42
+ const match = str.trim().match(/^([\d.]+)\s*([a-z]+)?$/i);
43
+ if (!match) {
44
+ return undefined;
45
+ }
46
+
47
+ const value = parseFloat(match[1]);
48
+ let unit = (match[2] || 'B').toUpperCase();
49
+ let multiplier = UnitMultipliers[unit];
50
+
51
+ // Handle cases like G -> GB
52
+ if (multiplier === undefined && unit.length === 1 && unit !== 'B') {
53
+ unit += 'B';
54
+ multiplier = UnitMultipliers[unit];
55
+ }
56
+
57
+ if (isNaN(value) || multiplier === undefined) {
58
+ return undefined;
59
+ }
60
+
61
+ return {
62
+ value,
63
+ unit: match[2] || 'B',
64
+ bytes: value * multiplier,
65
+ };
66
+ }
@@ -3,21 +3,14 @@ import { expect, test } from 'vitest';
3
3
  import { renderTemplate } from './renderTemplate';
4
4
 
5
5
  test('renderTemplate', () => {
6
- const obj = {
7
- name: 'wener',
8
- authors: [
9
- {
10
- name: 'wener',
11
- },
12
- ],
13
- };
14
- for (const [k, v] of Object.entries({
15
- 'My name is ${name}': 'My name is wener',
16
- 'My name is ${ authors[0].name }': 'My name is wener',
17
- })) {
18
- expect(renderTemplate(k, obj)).toBe(v);
19
- }
20
- expect(renderTemplate('My name is ${name}', (v) => v)).toBe('My name is name');
21
- expect(renderTemplate('My name is ${name}', obj, 'common')).toBe('My name is ${name}');
22
- expect(renderTemplate('My name is {{name}}', obj, 'common')).toBe('My name is wener');
6
+ const obj = { name: 'wener', authors: [{ name: 'wener' }] };
7
+ for (const [k, v] of Object.entries({
8
+ 'My name is ${name}': 'My name is wener',
9
+ 'My name is ${ authors[0].name }': 'My name is wener',
10
+ })) {
11
+ expect(renderTemplate(k, obj)).toBe(v);
12
+ }
13
+ expect(renderTemplate('My name is ${name}', (v) => v)).toBe('My name is name');
14
+ expect(renderTemplate('My name is ${name}', obj, 'common')).toBe('My name is ${name}');
15
+ expect(renderTemplate('My name is {{name}}', obj, 'common')).toBe('My name is wener');
23
16
  });
@@ -10,28 +10,25 @@ import { get } from '../objects/get';
10
10
  * @param match `js` for `${name}`, common for `{{name}}`
11
11
  */
12
12
  export function renderTemplate(
13
- template: string,
14
- data: ((v: string) => any) | object | undefined,
15
- match: 'js' | 'common' | RegExp = 'js',
13
+ template: string,
14
+ data: ((v: string) => any) | object | undefined,
15
+ match: 'js' | 'common' | RegExp = 'js',
16
16
  ) {
17
- let getter: Function;
18
- if (!data) {
19
- // todo warning in dev
20
- getter = () => '';
21
- } else if (typeof data === 'function') {
22
- getter = data;
23
- } else {
24
- getter = (v: string) => get(data, v);
25
- }
26
- if (typeof match === 'string') {
27
- match = Matches[match] || Matches.js;
28
- }
29
- return template.replace(match, (_, g) => {
30
- return getter(g.trim());
31
- });
17
+ let getter: Function;
18
+ if (!data) {
19
+ // todo warning in dev
20
+ getter = () => '';
21
+ } else if (typeof data === 'function') {
22
+ getter = data;
23
+ } else {
24
+ getter = (v: string) => get(data, v);
25
+ }
26
+ if (typeof match === 'string') {
27
+ match = Matches[match] || Matches.js;
28
+ }
29
+ return template.replace(match, (_, g) => {
30
+ return getter(g.trim());
31
+ });
32
32
  }
33
33
 
34
- const Matches: Record<string, RegExp> = {
35
- js: /\${(.*?)}/g,
36
- common: /{{(.*?)}}/g,
37
- };
34
+ const Matches: Record<string, RegExp> = { js: /\${(.*?)}/g, common: /{{(.*?)}}/g };
package/src/types.d.ts CHANGED
@@ -1,17 +1,17 @@
1
1
  declare var __DEV__: boolean;
2
2
 
3
3
  namespace NodeJS {
4
- interface Process {
5
- // webpack check
6
- readonly browser?: boolean;
7
- }
8
- interface ProcessEnv {
9
- readonly NODE_ENV: 'development' | 'production' | 'test';
10
- }
4
+ interface Process {
5
+ // webpack check
6
+ readonly browser?: boolean;
7
+ }
8
+ interface ProcessEnv {
9
+ readonly NODE_ENV: 'development' | 'production' | 'test';
10
+ }
11
11
  }
12
12
 
13
- export type AbstractConstructor<T = {}> = abstract new (...args: any[]) => T;
14
- export type Constructor<T = {}> = new (...args: any[]) => T;
13
+ export type AbstractConstructor<T = any> = abstract new (...args: any[]) => T;
14
+ export type Constructor<T = any> = new (...args: any[]) => T;
15
15
  export type Optional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
16
16
  export type PartialRequired<T, K extends keyof T> = Partial<Omit<T, K>> & Required<Pick<T, K>>;
17
17