@wener/utils 1.1.50 → 1.1.53

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 (506) 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 +2 -202
  37. package/lib/errors/Errors.mod.js +206 -0
  38. package/lib/errors/Errors.test.js +24 -0
  39. package/lib/fetch/HttpStatus.js +1 -3
  40. package/lib/fetch/createFetchWith.js +188 -19
  41. package/lib/fetch/createFetchWithLogging.js +17 -16
  42. package/lib/fetch/createFetchWithRetry.js +40 -24
  43. package/lib/fetch/dumpRequest.js +467 -41
  44. package/lib/fetch/dumpRequest.test.js +384 -0
  45. package/lib/fetch/dumpResponse.js +271 -16
  46. package/lib/fetch/dumpResponse.test.js +393 -0
  47. package/lib/fetch/http.types.js +0 -2
  48. package/lib/fetch/index.js +5 -7
  49. package/lib/fetch/isTextContentType.js +5 -0
  50. package/lib/fetch/resolveRequest.js +7 -0
  51. package/lib/fetch/types.js +0 -2
  52. package/lib/i18n/createTranslate.js +40 -20
  53. package/lib/i18n/createTranslate.test.js +177 -0
  54. package/lib/index.js +75 -75
  55. package/lib/io/AbstractEncoding.js +0 -2
  56. package/lib/io/ArrayBuffer.test-d.js +4 -6
  57. package/lib/io/ArrayBuffers.base64.test.js +60 -0
  58. package/lib/io/ArrayBuffers.js +2 -334
  59. package/lib/io/ArrayBuffers.mod.js +531 -0
  60. package/lib/io/ArrayBuffers.test.js +77 -0
  61. package/lib/io/Buffer.js +190 -20
  62. package/lib/io/Buffer.test.js +22 -0
  63. package/lib/io/ByteBuffer.js +752 -441
  64. package/lib/io/ByteBuffer.test.js +184 -0
  65. package/lib/io/base64.js +17 -19
  66. package/lib/io/dump.js +16 -16
  67. package/lib/io/isBuffer.js +2 -3
  68. package/lib/io/isBuffer.test.js +8 -0
  69. package/lib/io/isTransferable.js +16 -8
  70. package/lib/io/isTransferable.test.js +17 -0
  71. package/lib/io/parseDataUri.js +288 -40
  72. package/lib/io/parseDataUri.test.js +286 -0
  73. package/lib/io/types.js +1 -0
  74. package/lib/langs/AsyncCloser.js +276 -0
  75. package/lib/langs/Closer.js +100 -0
  76. package/lib/langs/MaybeFunction.js +38 -5
  77. package/lib/langs/classOf.js +0 -2
  78. package/lib/langs/deepEqual.js +82 -22
  79. package/lib/langs/deepEqual.test.js +11 -0
  80. package/lib/langs/deepFreeze.js +28 -9
  81. package/lib/langs/getGlobalStates.js +19 -7
  82. package/lib/langs/getObjectId.js +4 -6
  83. package/lib/langs/ifPresent.js +3 -0
  84. package/lib/langs/isClass.js +0 -2
  85. package/lib/langs/isDefined.js +0 -2
  86. package/lib/langs/isEmptyObject.js +1 -3
  87. package/lib/langs/isFunction.js +0 -2
  88. package/lib/langs/isNil.js +3 -0
  89. package/lib/langs/isPlainObject.js +2 -4
  90. package/lib/langs/langs.test.js +126 -0
  91. package/lib/langs/memoize.js +11 -7
  92. package/lib/langs/mixin.js +7 -4
  93. package/lib/langs/mixin.test.js +135 -0
  94. package/lib/langs/parseBoolean.js +11 -8
  95. package/lib/langs/shallowClone.js +5 -3
  96. package/lib/langs/shallowEqual.js +8 -6
  97. package/lib/libs/ms.js +28 -26
  98. package/lib/libs/ms.test.js +301 -0
  99. package/lib/logger/const.js +15 -0
  100. package/lib/logger/index.js +1 -0
  101. package/lib/logger/types.js +1 -0
  102. package/lib/maths/clamp.js +81 -12
  103. package/lib/maths/clamp.test.js +186 -0
  104. package/lib/maths/createRandom.test.js +36 -0
  105. package/lib/maths/random.js +162 -13
  106. package/lib/modules/isModule.js +0 -2
  107. package/lib/modules/parseModuleId.js +14 -15
  108. package/lib/modules/parseModuleId.test.js +153 -0
  109. package/lib/objects/computeIfAbsent.js +8 -3
  110. package/lib/objects/get.js +26 -8
  111. package/lib/objects/get.test-d.js +23 -25
  112. package/lib/objects/merge/index.js +1 -3
  113. package/lib/objects/merge/isMergeableObject.js +5 -3
  114. package/lib/objects/merge/merge.js +82 -26
  115. package/lib/objects/merge/merge.test.js +1397 -0
  116. package/lib/objects/parseObjectPath.js +47 -15
  117. package/lib/objects/parseObjectPath.test.js +138 -0
  118. package/lib/objects/set.js +25 -19
  119. package/lib/objects/set.test.js +522 -0
  120. package/lib/schema/typebox/index.js +2 -3
  121. package/lib/schema/typebox/typebox.js +6 -6
  122. package/lib/scripts/getGenerateContext.js +386 -76
  123. package/lib/server/crypto/md5.js +0 -2
  124. package/lib/server/fetch/createFetchWithProxy.js +2 -4
  125. package/lib/server/fetch/createFetchWithProxyByNodeFetch.js +258 -31
  126. package/lib/server/fetch/createFetchWithProxyByUndici.js +307 -49
  127. package/lib/server/getPackageDir.js +2 -3
  128. package/lib/server/index.js +5 -7
  129. package/lib/server/jsdom.js +1 -3
  130. package/lib/server/node-fetch.js +2 -4
  131. package/lib/server/polyfill/polyfillBrowser.js +163 -9
  132. package/lib/server/polyfill/polyfillBrowser.test.js +164 -0
  133. package/lib/server/polyfill/polyfillCrypto.js +157 -9
  134. package/lib/server/polyfill/polyfillFetch.js +13 -13
  135. package/lib/server/polyfill/polyfillJsDom.js +264 -58
  136. package/lib/server/polyfill/polyfillWebSocket.js +11 -11
  137. package/lib/server/ws.js +1 -3
  138. package/lib/strings/bytes.test.js +327 -0
  139. package/lib/strings/camelCase.js +23 -14
  140. package/lib/strings/formatBytes.js +29 -20
  141. package/lib/strings/parseBytes.js +54 -0
  142. package/lib/strings/renderTemplate.js +17 -12
  143. package/lib/strings/renderTemplate.test.js +104 -0
  144. package/lib/typedoc.js +2 -4
  145. package/lib/types.d.js +0 -2
  146. package/lib/validations/asserts.js +0 -2
  147. package/lib/validations/isUUID.js +0 -2
  148. package/lib/validations/isUUID.test.js +87 -0
  149. package/lib/validations/parseTimestamp.js +12 -7
  150. package/lib/validations/parseTimestamp.test.js +6 -0
  151. package/lib/{runtime → web}/getGlobalThis.js +3 -4
  152. package/lib/web/getRandomValues.js +44 -0
  153. package/lib/web/randomUUID.js +15 -0
  154. package/lib/web/requestIdleCallback.js +17 -0
  155. package/lib/{runtime → web}/structuredClone.js +35 -28
  156. package/lib/web/structuredClone.test.js +81 -0
  157. package/package.json +10 -18
  158. package/src/arrays/MaybeArray.ts +22 -22
  159. package/src/arrays/arrayFromAsync.ts +3 -3
  160. package/src/asyncs/AsyncInterval.ts +8 -8
  161. package/src/asyncs/Promises.ts +51 -51
  162. package/src/asyncs/createAsyncIterator.ts +34 -34
  163. package/src/asyncs/createLazyPromise.test.ts +73 -73
  164. package/src/asyncs/createLazyPromise.ts +68 -73
  165. package/src/asyncs/firstOfAsyncIterator.ts +5 -5
  166. package/src/asyncs/generatorOfStream.ts +12 -12
  167. package/src/asyncs/isIterator.ts +1 -1
  168. package/src/asyncs/isThenable.ts +2 -2
  169. package/src/asyncs/nextOfAsyncIterator.ts +20 -20
  170. package/src/asyncs/promiseOfCallback.ts +13 -13
  171. package/src/asyncs/timeout.ts +23 -23
  172. package/src/browsers/copy.ts +48 -48
  173. package/src/browsers/download.ts +38 -36
  174. package/src/browsers/getFileFromDataTransfer.ts +35 -35
  175. package/src/browsers/loaders.ts +49 -49
  176. package/src/crypto/base.ts +3 -3
  177. package/src/crypto/getNodeCrypto.ts +3 -3
  178. package/src/crypto/hashing.test.ts +34 -48
  179. package/src/crypto/hashing.ts +67 -67
  180. package/src/crypto/md5.bench.ts +20 -24
  181. package/src/crypto/md5.test.ts +3 -3
  182. package/src/crypto/pem/pem.test.ts +26 -42
  183. package/src/crypto/pem/pem.ts +65 -65
  184. package/src/crypto/ulid.test.ts +32 -32
  185. package/src/crypto/ulid.ts +117 -117
  186. package/src/emitter/types.ts +6 -6
  187. package/src/errors/DetailError.ts +151 -0
  188. package/src/errors/Errors.mod.ts +104 -0
  189. package/src/errors/Errors.test.ts +15 -15
  190. package/src/errors/Errors.ts +1 -247
  191. package/src/fetch/HttpStatus.ts +77 -77
  192. package/src/fetch/createFetchWith.ts +27 -27
  193. package/src/fetch/createFetchWithLogging.ts +13 -16
  194. package/src/fetch/createFetchWithRetry.ts +80 -80
  195. package/src/fetch/dumpRequest.test.ts +176 -0
  196. package/src/fetch/dumpRequest.ts +149 -52
  197. package/src/fetch/dumpResponse.test.ts +160 -0
  198. package/src/fetch/dumpResponse.ts +48 -20
  199. package/src/fetch/http.types.ts +35 -35
  200. package/src/fetch/isTextContentType.ts +12 -0
  201. package/src/fetch/resolveRequest.ts +1 -0
  202. package/src/fetch/types.ts +2 -2
  203. package/src/i18n/createTranslate.test.ts +90 -113
  204. package/src/i18n/createTranslate.ts +55 -55
  205. package/src/index.ts +26 -27
  206. package/src/io/AbstractEncoding.ts +12 -12
  207. package/src/io/ArrayBuffer.test-d.ts +1 -1
  208. package/src/io/ArrayBuffers.base64.test.ts +52 -52
  209. package/src/io/ArrayBuffers.mod.ts +670 -0
  210. package/src/io/ArrayBuffers.test.ts +14 -14
  211. package/src/io/ArrayBuffers.ts +1 -446
  212. package/src/io/Buffer.test.ts +17 -17
  213. package/src/io/Buffer.ts +17 -17
  214. package/src/io/ByteBuffer.test.ts +37 -37
  215. package/src/io/ByteBuffer.ts +574 -566
  216. package/src/io/base64.ts +46 -44
  217. package/src/io/dump.ts +22 -22
  218. package/src/io/isBuffer.test.ts +2 -2
  219. package/src/io/isBuffer.ts +1 -1
  220. package/src/io/isTransferable.test.ts +4 -4
  221. package/src/io/isTransferable.ts +30 -30
  222. package/src/io/parseDataUri.test.ts +22 -27
  223. package/src/io/parseDataUri.ts +57 -57
  224. package/src/io/types.ts +13 -0
  225. package/src/langs/AsyncCloser.ts +45 -0
  226. package/src/langs/Closer.ts +39 -0
  227. package/src/langs/MaybeFunction.ts +5 -5
  228. package/src/langs/classOf.ts +1 -1
  229. package/src/langs/deepEqual.test.ts +1 -12
  230. package/src/langs/deepEqual.ts +82 -82
  231. package/src/langs/deepFreeze.ts +11 -11
  232. package/src/langs/getGlobalStates.ts +21 -11
  233. package/src/langs/getObjectId.ts +10 -13
  234. package/src/langs/ifPresent.ts +3 -0
  235. package/src/langs/isClass.ts +1 -1
  236. package/src/langs/isDefined.ts +1 -1
  237. package/src/langs/isEmptyObject.ts +1 -1
  238. package/src/langs/isFunction.ts +1 -1
  239. package/src/langs/isNil.ts +3 -0
  240. package/src/langs/isPlainObject.ts +4 -4
  241. package/src/langs/langs.test.ts +18 -18
  242. package/src/langs/memoize.ts +21 -21
  243. package/src/langs/mixin.test.ts +22 -26
  244. package/src/langs/mixin.ts +6 -9
  245. package/src/langs/parseBoolean.ts +30 -26
  246. package/src/langs/shallowClone.ts +11 -11
  247. package/src/langs/shallowEqual.ts +19 -19
  248. package/src/libs/ms.test.ts +274 -274
  249. package/src/libs/ms.ts +137 -137
  250. package/src/logger/const.ts +18 -0
  251. package/src/logger/index.ts +2 -0
  252. package/src/logger/types.ts +10 -0
  253. package/src/maths/clamp.test.ts +18 -18
  254. package/src/maths/clamp.ts +17 -17
  255. package/src/maths/createRandom.test.ts +12 -0
  256. package/src/maths/random.ts +50 -14
  257. package/src/modules/isModule.ts +4 -4
  258. package/src/modules/parseModuleId.test.ts +61 -68
  259. package/src/modules/parseModuleId.ts +29 -43
  260. package/src/objects/computeIfAbsent.ts +10 -10
  261. package/src/objects/get.test-d.ts +33 -51
  262. package/src/objects/get.ts +31 -31
  263. package/src/objects/merge/isMergeableObject.ts +5 -5
  264. package/src/objects/merge/merge.test.ts +658 -880
  265. package/src/objects/merge/merge.ts +84 -84
  266. package/src/objects/parseObjectPath.test.ts +13 -13
  267. package/src/objects/parseObjectPath.ts +25 -25
  268. package/src/objects/set.test.ts +271 -366
  269. package/src/objects/set.ts +36 -36
  270. package/src/schema/typebox/typebox.ts +20 -26
  271. package/src/scripts/getGenerateContext.ts +82 -80
  272. package/src/server/crypto/md5.ts +1 -1
  273. package/src/server/fetch/createFetchWithProxyByNodeFetch.ts +30 -33
  274. package/src/server/fetch/createFetchWithProxyByUndici.ts +64 -70
  275. package/src/server/getPackageDir.ts +7 -7
  276. package/src/server/polyfill/polyfillBrowser.test.ts +10 -10
  277. package/src/server/polyfill/polyfillBrowser.ts +3 -3
  278. package/src/server/polyfill/polyfillCrypto.ts +7 -7
  279. package/src/server/polyfill/polyfillFetch.ts +11 -21
  280. package/src/server/polyfill/polyfillJsDom.ts +60 -72
  281. package/src/server/polyfill/polyfillWebSocket.ts +15 -15
  282. package/src/strings/bytes.test.ts +69 -0
  283. package/src/strings/camelCase.ts +58 -63
  284. package/src/strings/formatBytes.ts +50 -29
  285. package/src/strings/parseBytes.ts +66 -0
  286. package/src/strings/renderTemplate.test.ts +10 -17
  287. package/src/strings/renderTemplate.ts +19 -22
  288. package/src/types.d.ts +9 -9
  289. package/src/validations/asserts.ts +8 -8
  290. package/src/validations/isUUID.test.ts +9 -9
  291. package/src/validations/isUUID.ts +1 -1
  292. package/src/validations/parseTimestamp.test.ts +2 -2
  293. package/src/validations/parseTimestamp.ts +21 -21
  294. package/src/{runtime → web}/getGlobalThis.ts +6 -6
  295. package/src/web/getRandomValues.ts +41 -0
  296. package/src/web/randomUUID.ts +19 -0
  297. package/src/web/requestIdleCallback.ts +11 -0
  298. package/src/{runtime → web}/structuredClone.test.ts +8 -8
  299. package/src/web/structuredClone.ts +88 -0
  300. package/tsconfig.json +35 -34
  301. package/lib/arrays/MaybeArray.js.map +0 -1
  302. package/lib/arrays/arrayFromAsync.js.map +0 -1
  303. package/lib/asyncs/AsyncInterval.js.map +0 -1
  304. package/lib/asyncs/MaybePromise.js.map +0 -1
  305. package/lib/asyncs/Promises.js.map +0 -1
  306. package/lib/asyncs/createAsyncIterator.js.map +0 -1
  307. package/lib/asyncs/createLazyPromise.js.map +0 -1
  308. package/lib/asyncs/firstOfAsyncIterator.js.map +0 -1
  309. package/lib/asyncs/generatorOfStream.js.map +0 -1
  310. package/lib/asyncs/isIterator.js.map +0 -1
  311. package/lib/asyncs/isPromise.js.map +0 -1
  312. package/lib/asyncs/isThenable.js.map +0 -1
  313. package/lib/asyncs/nextOfAsyncIterator.js.map +0 -1
  314. package/lib/asyncs/promiseOfCallback.js.map +0 -1
  315. package/lib/asyncs/timeout.js.map +0 -1
  316. package/lib/browsers/copy.js.map +0 -1
  317. package/lib/browsers/download.js.map +0 -1
  318. package/lib/browsers/getFileFromDataTransfer.js.map +0 -1
  319. package/lib/browsers/loaders.js.map +0 -1
  320. package/lib/cn/division/DivisionCode.js +0 -209
  321. package/lib/cn/division/DivisionCode.js.map +0 -1
  322. package/lib/cn/division/binarySearch.js +0 -27
  323. package/lib/cn/division/binarySearch.js.map +0 -1
  324. package/lib/cn/formatChineseAmount.js +0 -77
  325. package/lib/cn/formatChineseAmount.js.map +0 -1
  326. package/lib/cn/id/Mod11.js +0 -43
  327. package/lib/cn/id/Mod11.js.map +0 -1
  328. package/lib/cn/id/ResidentIdNumber.js +0 -98
  329. package/lib/cn/id/ResidentIdNumber.js.map +0 -1
  330. package/lib/cn/id/types.js +0 -8
  331. package/lib/cn/id/types.js.map +0 -1
  332. package/lib/cn/index.js +0 -14
  333. package/lib/cn/index.js.map +0 -1
  334. package/lib/cn/parseChineseNumber.js +0 -94
  335. package/lib/cn/parseChineseNumber.js.map +0 -1
  336. package/lib/cn/pinyin/cartesianProduct.js +0 -22
  337. package/lib/cn/pinyin/cartesianProduct.js.map +0 -1
  338. package/lib/cn/pinyin/data.json +0 -413
  339. package/lib/cn/pinyin/loader.js +0 -15
  340. package/lib/cn/pinyin/loader.js.map +0 -1
  341. package/lib/cn/pinyin/preload.js +0 -4
  342. package/lib/cn/pinyin/preload.js.map +0 -1
  343. package/lib/cn/pinyin/toPinyinPure.js +0 -32
  344. package/lib/cn/pinyin/toPinyinPure.js.map +0 -1
  345. package/lib/cn/pinyin/transform.js +0 -14
  346. package/lib/cn/pinyin/transform.js.map +0 -1
  347. package/lib/cn/types.js +0 -3
  348. package/lib/cn/types.js.map +0 -1
  349. package/lib/cn/uscc/Mod31.js +0 -49
  350. package/lib/cn/uscc/Mod31.js.map +0 -1
  351. package/lib/cn/uscc/USCC.js +0 -94
  352. package/lib/cn/uscc/USCC.js.map +0 -1
  353. package/lib/cn/uscc/isUSCC.js +0 -8
  354. package/lib/cn/uscc/isUSCC.js.map +0 -1
  355. package/lib/crypto/base.js.map +0 -1
  356. package/lib/crypto/getNodeCrypto.js.map +0 -1
  357. package/lib/crypto/getRandomValues.js +0 -36
  358. package/lib/crypto/getRandomValues.js.map +0 -1
  359. package/lib/crypto/hashing.js.map +0 -1
  360. package/lib/crypto/md5.bench.js.map +0 -1
  361. package/lib/crypto/md5.d.js.map +0 -1
  362. package/lib/crypto/md5.js.map +0 -1
  363. package/lib/crypto/pem/pem.js.map +0 -1
  364. package/lib/crypto/randomUUID.js +0 -16
  365. package/lib/crypto/randomUUID.js.map +0 -1
  366. package/lib/crypto/randomUUIDv7.js.map +0 -1
  367. package/lib/crypto/ulid.js.map +0 -1
  368. package/lib/emitter/types.js.map +0 -1
  369. package/lib/errors/Errors.js.map +0 -1
  370. package/lib/fetch/HttpStatus.js.map +0 -1
  371. package/lib/fetch/createFetchWith.js.map +0 -1
  372. package/lib/fetch/createFetchWithLogging.js.map +0 -1
  373. package/lib/fetch/createFetchWithRetry.js.map +0 -1
  374. package/lib/fetch/dumpRequest.js.map +0 -1
  375. package/lib/fetch/dumpResponse.js.map +0 -1
  376. package/lib/fetch/http.types.js.map +0 -1
  377. package/lib/fetch/index.js.map +0 -1
  378. package/lib/fetch/types.js.map +0 -1
  379. package/lib/i18n/createTranslate.js.map +0 -1
  380. package/lib/index.js.map +0 -1
  381. package/lib/io/AbstractEncoding.js.map +0 -1
  382. package/lib/io/ArrayBuffer.test-d.js.map +0 -1
  383. package/lib/io/ArrayBuffers.js.map +0 -1
  384. package/lib/io/Buffer.js.map +0 -1
  385. package/lib/io/ByteBuffer.js.map +0 -1
  386. package/lib/io/base64.js.map +0 -1
  387. package/lib/io/dump.js.map +0 -1
  388. package/lib/io/isBuffer.js.map +0 -1
  389. package/lib/io/isTransferable.js.map +0 -1
  390. package/lib/io/parseDataUri.js.map +0 -1
  391. package/lib/langs/MaybeFunction.js.map +0 -1
  392. package/lib/langs/classOf.js.map +0 -1
  393. package/lib/langs/deepEqual.js.map +0 -1
  394. package/lib/langs/deepFreeze.js.map +0 -1
  395. package/lib/langs/getGlobalStates.js.map +0 -1
  396. package/lib/langs/getObjectId.js.map +0 -1
  397. package/lib/langs/isClass.js.map +0 -1
  398. package/lib/langs/isDefined.js.map +0 -1
  399. package/lib/langs/isEmptyObject.js.map +0 -1
  400. package/lib/langs/isFunction.js.map +0 -1
  401. package/lib/langs/isNullish.js +0 -5
  402. package/lib/langs/isNullish.js.map +0 -1
  403. package/lib/langs/isPlainObject.js.map +0 -1
  404. package/lib/langs/memoize.js.map +0 -1
  405. package/lib/langs/mixin.js.map +0 -1
  406. package/lib/langs/parseBoolean.js.map +0 -1
  407. package/lib/langs/shallowClone.js.map +0 -1
  408. package/lib/langs/shallowEqual.js.map +0 -1
  409. package/lib/libs/ms.js.map +0 -1
  410. package/lib/logging/Logger.js +0 -5
  411. package/lib/logging/Logger.js.map +0 -1
  412. package/lib/logging/createChildLogger.js +0 -16
  413. package/lib/logging/createChildLogger.js.map +0 -1
  414. package/lib/logging/createLogger.js +0 -63
  415. package/lib/logging/createLogger.js.map +0 -1
  416. package/lib/logging/createNoopLogger.js +0 -13
  417. package/lib/logging/createNoopLogger.js.map +0 -1
  418. package/lib/logging/slog.js +0 -143
  419. package/lib/logging/slog.js.map +0 -1
  420. package/lib/maths/clamp.js.map +0 -1
  421. package/lib/maths/random.js.map +0 -1
  422. package/lib/mitt/index.js +0 -77
  423. package/lib/mitt/index.js.map +0 -1
  424. package/lib/modules/isModule.js.map +0 -1
  425. package/lib/modules/parseModuleId.js.map +0 -1
  426. package/lib/objects/computeIfAbsent.js.map +0 -1
  427. package/lib/objects/get.js.map +0 -1
  428. package/lib/objects/get.test-d.js.map +0 -1
  429. package/lib/objects/merge/index.js.map +0 -1
  430. package/lib/objects/merge/isMergeableObject.js.map +0 -1
  431. package/lib/objects/merge/merge.js.map +0 -1
  432. package/lib/objects/parseObjectPath.js.map +0 -1
  433. package/lib/objects/set.js.map +0 -1
  434. package/lib/runtime/AsyncCloser.js +0 -40
  435. package/lib/runtime/AsyncCloser.js.map +0 -1
  436. package/lib/runtime/Closer.js +0 -34
  437. package/lib/runtime/Closer.js.map +0 -1
  438. package/lib/runtime/getGlobalThis.js.map +0 -1
  439. package/lib/runtime/structuredClone.js.map +0 -1
  440. package/lib/schema/typebox/index.js.map +0 -1
  441. package/lib/schema/typebox/typebox.js.map +0 -1
  442. package/lib/scripts/getGenerateContext.js.map +0 -1
  443. package/lib/server/crypto/md5.js.map +0 -1
  444. package/lib/server/fetch/createFetchWithProxy.js.map +0 -1
  445. package/lib/server/fetch/createFetchWithProxyByNodeFetch.js.map +0 -1
  446. package/lib/server/fetch/createFetchWithProxyByUndici.js.map +0 -1
  447. package/lib/server/getPackageDir.js.map +0 -1
  448. package/lib/server/index.js.map +0 -1
  449. package/lib/server/jsdom.js.map +0 -1
  450. package/lib/server/node-fetch.js.map +0 -1
  451. package/lib/server/polyfill/polyfillBrowser.js.map +0 -1
  452. package/lib/server/polyfill/polyfillCrypto.js.map +0 -1
  453. package/lib/server/polyfill/polyfillFetch.js.map +0 -1
  454. package/lib/server/polyfill/polyfillJsDom.js.map +0 -1
  455. package/lib/server/polyfill/polyfillWebSocket.js.map +0 -1
  456. package/lib/server/ws.js.map +0 -1
  457. package/lib/strings/camelCase.js.map +0 -1
  458. package/lib/strings/formatBytes.js.map +0 -1
  459. package/lib/strings/renderTemplate.js.map +0 -1
  460. package/lib/typedoc.js.map +0 -1
  461. package/lib/types.d.js.map +0 -1
  462. package/lib/validations/asserts.js.map +0 -1
  463. package/lib/validations/isUUID.js.map +0 -1
  464. package/lib/validations/parseTimestamp.js.map +0 -1
  465. package/src/cn/README.md +0 -3
  466. package/src/cn/division/DivisionCode.ts +0 -155
  467. package/src/cn/division/binarySearch.test.ts +0 -64
  468. package/src/cn/division/binarySearch.ts +0 -25
  469. package/src/cn/division/division.test.ts +0 -6
  470. package/src/cn/formatChineseAmount.ts +0 -61
  471. package/src/cn/id/Mod11.ts +0 -26
  472. package/src/cn/id/ResidentIdNumber.ts +0 -126
  473. package/src/cn/id/id.test.ts +0 -20
  474. package/src/cn/id/types.ts +0 -26
  475. package/src/cn/index.ts +0 -17
  476. package/src/cn/parseChineseNumber.test.ts +0 -159
  477. package/src/cn/parseChineseNumber.ts +0 -97
  478. package/src/cn/pinyin/cartesianProduct.test.ts +0 -64
  479. package/src/cn/pinyin/cartesianProduct.ts +0 -24
  480. package/src/cn/pinyin/data.json +0 -413
  481. package/src/cn/pinyin/loader.ts +0 -12
  482. package/src/cn/pinyin/preload.ts +0 -3
  483. package/src/cn/pinyin/toPinyin.test.ts +0 -12
  484. package/src/cn/pinyin/toPinyinPure.ts +0 -43
  485. package/src/cn/pinyin/transform.ts +0 -12
  486. package/src/cn/scripts/gen.test.ts +0 -131
  487. package/src/cn/types.ts +0 -11
  488. package/src/cn/uscc/Mod31.ts +0 -38
  489. package/src/cn/uscc/USCC.ts +0 -94
  490. package/src/cn/uscc/isUSCC.ts +0 -8
  491. package/src/cn/uscc/uscc.test.ts +0 -16
  492. package/src/crypto/getRandomValues.ts +0 -41
  493. package/src/crypto/randomUUID.ts +0 -19
  494. package/src/langs/isNullish.ts +0 -3
  495. package/src/logging/Logger.ts +0 -25
  496. package/src/logging/createChildLogger.ts +0 -16
  497. package/src/logging/createLogger.ts +0 -50
  498. package/src/logging/createNoopLogger.ts +0 -13
  499. package/src/logging/logger.test.ts +0 -36
  500. package/src/logging/slog.test.ts +0 -8
  501. package/src/logging/slog.ts +0 -221
  502. package/src/mitt/README.md +0 -1
  503. package/src/mitt/index.ts +0 -114
  504. package/src/runtime/AsyncCloser.ts +0 -45
  505. package/src/runtime/Closer.ts +0 -39
  506. package/src/runtime/structuredClone.ts +0 -88
@@ -3,25 +3,15 @@ import type { MaybePromise } from '../../asyncs/MaybePromise';
3
3
  export function polyfillFetch(nodeFetch: typeof import('node-fetch')): boolean;
4
4
  export function polyfillFetch(nodeFetch?: undefined): Promise<boolean>;
5
5
  export function polyfillFetch(nodeFetch?: typeof import('node-fetch')): MaybePromise<boolean> {
6
- if ('fetch' in globalThis) {
7
- return false;
8
- }
9
- // sync mode
10
- if (nodeFetch) {
11
- const { default: fetch, Response, Headers, Request, AbortError, FetchError, FormData, Blob, File } = nodeFetch;
12
- Object.assign(globalThis, {
13
- fetch,
14
- Response,
15
- Headers,
16
- Request,
17
- AbortError,
18
- FetchError,
19
- FormData,
20
- Blob,
21
- File,
22
- });
23
- // abort controller
24
- return true;
25
- }
26
- return import('node-fetch').then((v) => polyfillFetch(v));
6
+ if ('fetch' in globalThis) {
7
+ return false;
8
+ }
9
+ // sync mode
10
+ if (nodeFetch) {
11
+ const { default: fetch, Response, Headers, Request, AbortError, FetchError, FormData, Blob, File } = nodeFetch;
12
+ Object.assign(globalThis, { fetch, Response, Headers, Request, AbortError, FetchError, FormData, Blob, File });
13
+ // abort controller
14
+ return true;
15
+ }
16
+ return import('node-fetch').then((v) => polyfillFetch(v));
27
17
  }
@@ -1,88 +1,76 @@
1
1
  import type { ConstructorOptions, ResourceLoaderConstructorOptions } from 'jsdom';
2
- import { getGlobalThis } from '../../runtime/getGlobalThis';
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
  }
@@ -1,21 +1,21 @@
1
1
  import type { MaybePromise } from '../../asyncs/MaybePromise';
2
- import { getGlobalThis } from '../../runtime/getGlobalThis';
2
+ import { getGlobalThis } from '../../web/getGlobalThis';
3
3
 
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
  });