@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
@@ -1,80 +1,80 @@
1
1
  // http://httpstat.us/
2
2
  // https://en.wikipedia.org/wiki/List_of_HTTP_status_codes
3
3
  const HttpStatus: Record<string, string> = {
4
- 100: 'Continue',
5
- 101: 'Switching Protocols',
6
- 102: 'Processing',
7
- 103: 'Early Hints',
8
- 200: 'OK',
9
- 201: 'Created',
10
- 202: 'Accepted',
11
- 203: 'Non-Authoritative Information',
12
- 204: 'No Content',
13
- 205: 'Reset Content',
14
- 206: 'Partial Content',
15
- 207: 'Multi-Status',
16
- 208: 'Already Reported',
17
- 226: 'IM Used',
18
- 300: 'Multiple Choices',
19
- 301: 'Moved Permanently',
20
- 302: 'Found',
21
- 303: 'See Other',
22
- 304: 'Not Modified',
23
- 305: 'Use Proxy',
24
- 306: 'Unused',
25
- 307: 'Temporary Redirect',
26
- 308: 'Permanent Redirect',
4
+ 100: 'Continue',
5
+ 101: 'Switching Protocols',
6
+ 102: 'Processing',
7
+ 103: 'Early Hints',
8
+ 200: 'OK',
9
+ 201: 'Created',
10
+ 202: 'Accepted',
11
+ 203: 'Non-Authoritative Information',
12
+ 204: 'No Content',
13
+ 205: 'Reset Content',
14
+ 206: 'Partial Content',
15
+ 207: 'Multi-Status',
16
+ 208: 'Already Reported',
17
+ 226: 'IM Used',
18
+ 300: 'Multiple Choices',
19
+ 301: 'Moved Permanently',
20
+ 302: 'Found',
21
+ 303: 'See Other',
22
+ 304: 'Not Modified',
23
+ 305: 'Use Proxy',
24
+ 306: 'Unused',
25
+ 307: 'Temporary Redirect',
26
+ 308: 'Permanent Redirect',
27
27
 
28
- 400: 'Bad Request',
29
- 401: 'Unauthorized',
30
- 402: 'Payment Required',
31
- 403: 'Forbidden',
32
- 404: 'Not Found',
33
- 405: 'Method Not Allowed',
34
- 406: 'Not Acceptable',
35
- 407: 'Proxy Authentication Required',
36
- 408: 'Request Timeout',
37
- 409: 'Conflict',
38
- 410: 'Gone',
39
- 411: 'Length Required',
40
- 412: 'Precondition Required',
41
- 413: 'Request Entry Too Large',
42
- 414: 'Request-URI Too Long',
43
- 415: 'Unsupported Media Type',
44
- 416: 'Requested Range Not Satisfiable',
45
- 417: 'Expectation Failed',
46
- 418: "I'm a teapot",
47
- 421: 'Misdirected Request',
48
- 422: 'Unprocessable Entity',
49
- 423: 'Locked',
50
- 424: 'Failed Dependency',
51
- 425: 'Too Early',
52
- 426: 'Upgrade Required',
53
- 428: 'Precondition Required',
54
- 429: 'Too Many Requests',
55
- 431: 'Request Header Fields Too Large',
56
- 451: 'Unavailable For Legal Reasons',
57
- 500: 'Internal Server Error',
58
- 501: 'Not Implemented',
59
- 502: 'Bad Gateway',
60
- 503: 'Service Unavailable',
61
- 504: 'Gateway Timeout',
62
- 505: 'HTTP Version Not Supported',
63
- 506: 'Variant Also Negotiates',
64
- 507: 'Insufficient Storage',
65
- 508: 'Loop Detected',
66
- 509: 'Bandwidth Limit Exceeded',
67
- 510: 'Not Extended',
68
- 511: 'Network Authentication Required',
28
+ 400: 'Bad Request',
29
+ 401: 'Unauthorized',
30
+ 402: 'Payment Required',
31
+ 403: 'Forbidden',
32
+ 404: 'Not Found',
33
+ 405: 'Method Not Allowed',
34
+ 406: 'Not Acceptable',
35
+ 407: 'Proxy Authentication Required',
36
+ 408: 'Request Timeout',
37
+ 409: 'Conflict',
38
+ 410: 'Gone',
39
+ 411: 'Length Required',
40
+ 412: 'Precondition Required',
41
+ 413: 'Request Entry Too Large',
42
+ 414: 'Request-URI Too Long',
43
+ 415: 'Unsupported Media Type',
44
+ 416: 'Requested Range Not Satisfiable',
45
+ 417: 'Expectation Failed',
46
+ 418: "I'm a teapot",
47
+ 421: 'Misdirected Request',
48
+ 422: 'Unprocessable Entity',
49
+ 423: 'Locked',
50
+ 424: 'Failed Dependency',
51
+ 425: 'Too Early',
52
+ 426: 'Upgrade Required',
53
+ 428: 'Precondition Required',
54
+ 429: 'Too Many Requests',
55
+ 431: 'Request Header Fields Too Large',
56
+ 451: 'Unavailable For Legal Reasons',
57
+ 500: 'Internal Server Error',
58
+ 501: 'Not Implemented',
59
+ 502: 'Bad Gateway',
60
+ 503: 'Service Unavailable',
61
+ 504: 'Gateway Timeout',
62
+ 505: 'HTTP Version Not Supported',
63
+ 506: 'Variant Also Negotiates',
64
+ 507: 'Insufficient Storage',
65
+ 508: 'Loop Detected',
66
+ 509: 'Bandwidth Limit Exceeded',
67
+ 510: 'Not Extended',
68
+ 511: 'Network Authentication Required',
69
69
  };
70
70
 
71
71
  export function getHttpStatusText(status: number | string): string | undefined {
72
- return HttpStatus[status];
72
+ return HttpStatus[status];
73
73
  }
74
74
 
75
75
  export function isRetryableHttpStatus(status: number) {
76
- switch (status) {
77
- /*
76
+ switch (status) {
77
+ /*
78
78
  408 Request Timeout
79
79
  425 Too Early
80
80
  429 Too Many Requests
@@ -83,14 +83,14 @@ export function isRetryableHttpStatus(status: number) {
83
83
  503 Service Unavailable
84
84
  504 Gateway Timeout
85
85
  */
86
- case 408:
87
- case 425:
88
- case 429:
89
- case 502:
90
- case 503:
91
- case 504:
92
- return true;
93
- default:
94
- return false;
95
- }
86
+ case 408:
87
+ case 425:
88
+ case 429:
89
+ case 502:
90
+ case 503:
91
+ case 504:
92
+ return true;
93
+ default:
94
+ return false;
95
+ }
96
96
  }
@@ -1,33 +1,33 @@
1
1
  import type { MaybePromise } from '../asyncs/MaybePromise';
2
- import { getGlobalThis } from '../runtime/getGlobalThis';
3
- import { type FetchLike } from './types';
2
+ import { getGlobalThis } from '../web/getGlobalThis';
3
+ import type { FetchLike } from './types';
4
4
 
5
5
  export function createFetchWith({
6
- fetch = getGlobalThis().fetch,
7
- onRequest = (ctx) => ctx.next(ctx.url, ctx.req),
8
- onResponse = (ctx) => ctx.res,
6
+ fetch = getGlobalThis().fetch,
7
+ onRequest = (ctx) => ctx.next(ctx.url, ctx.req),
8
+ onResponse = (ctx) => ctx.res,
9
9
  }: {
10
- fetch?: FetchLike;
11
- onRequest?: (ctx: {
12
- url: string;
13
- req: RequestInit;
14
- next: (url: string, req: RequestInit) => Promise<Response>;
15
- }) => MaybePromise<Response | void>;
16
- onResponse?: (ctx: { url: string; req: RequestInit; res: Response }) => MaybePromise<Response>;
10
+ fetch?: FetchLike;
11
+ onRequest?: (ctx: {
12
+ url: string;
13
+ req: RequestInit;
14
+ next: (url: string, req: RequestInit) => Promise<Response>;
15
+ }) => MaybePromise<Response | void>;
16
+ onResponse?: (ctx: { url: string; req: RequestInit; res: Response }) => MaybePromise<Response>;
17
17
  }) {
18
- return async (urlOrRequest: string | URL | Request, init?: RequestInit & { fetch?: FetchLike }) => {
19
- const url = String(urlOrRequest);
20
- let req = init || {};
21
- const nextFetch = req.fetch || fetch;
22
- const res =
23
- (await onRequest({
24
- url,
25
- req,
26
- next: (url, init) => {
27
- req = init;
28
- return nextFetch(url, init);
29
- },
30
- })) ?? (await nextFetch(url, init));
31
- return onResponse({ url, req, res });
32
- };
18
+ return async (urlOrRequest: string | URL | Request, init?: RequestInit & { fetch?: FetchLike }) => {
19
+ const url = String(urlOrRequest);
20
+ let req = init || {};
21
+ const nextFetch = req.fetch || fetch;
22
+ const res =
23
+ (await onRequest({
24
+ url,
25
+ req,
26
+ next: (url, init) => {
27
+ req = init;
28
+ return nextFetch(url, init);
29
+ },
30
+ })) ?? (await nextFetch(url, init));
31
+ return onResponse({ url, req, res });
32
+ };
33
33
  }
@@ -1,22 +1,19 @@
1
1
  import { createFetchWith } from './createFetchWith';
2
2
  import { dumpRequest } from './dumpRequest';
3
3
  import { dumpResponse } from './dumpResponse';
4
- import { type FetchLike } from './types';
4
+ import type { FetchLike } from './types';
5
5
 
6
6
  export function createFetchWithLogging({
7
- fetch,
8
- log = console.log,
9
- }: {
10
- fetch?: FetchLike;
11
- log?: (s: string) => void;
12
- } = {}): FetchLike {
13
- return createFetchWith({
14
- fetch,
15
- onRequest: ({ url, req }) => {
16
- void dumpRequest({ url, req, log });
17
- },
18
- onResponse: ({ url, req, res }) => {
19
- return dumpResponse({ url, req, res, log });
20
- },
21
- });
7
+ fetch,
8
+ log = console.log,
9
+ }: { fetch?: FetchLike; log?: (s: string) => void } = {}): FetchLike {
10
+ return createFetchWith({
11
+ fetch,
12
+ onRequest: ({ url, req }) => {
13
+ void dumpRequest({ url, req, log });
14
+ },
15
+ onResponse: ({ url, req, res }) => {
16
+ return dumpResponse({ url, req, res, log });
17
+ },
18
+ });
22
19
  }
@@ -1,95 +1,95 @@
1
- import { getGlobalThis } from '../runtime/getGlobalThis';
1
+ import { getGlobalThis } from '../web/getGlobalThis';
2
2
  import type { FetchLike } from './types';
3
3
 
4
4
  type RequestDelayFunction = (attempt: number, error: Error | null, response: Response | null) => number;
5
5
  type RequestRetryOnFunction = (
6
- attempt: number,
7
- error: Error | null,
8
- response: Response | null,
6
+ attempt: number,
7
+ error: Error | null,
8
+ response: Response | null,
9
9
  ) => boolean | Promise<boolean>;
10
10
 
11
11
  export interface FetchWithRetryOptions {
12
- fetch?: FetchLike;
13
- retries?: number;
14
- retryDelay?: number | RequestDelayFunction;
15
- retryOn?: number[] | RequestRetryOnFunction;
12
+ fetch?: FetchLike;
13
+ retries?: number;
14
+ retryDelay?: number | RequestDelayFunction;
15
+ retryOn?: number[] | RequestRetryOnFunction;
16
16
  }
17
17
 
18
18
  export function createFetchWithRetry({
19
- fetch = getGlobalThis().fetch,
20
- retries = 3,
21
- retryDelay = 1000,
22
- retryOn = [],
19
+ fetch = getGlobalThis().fetch,
20
+ retries = 3,
21
+ retryDelay = 1000,
22
+ retryOn = [],
23
23
  }: FetchWithRetryOptions = {}): FetchLike {
24
- // https://github.com/jonbern/fetch-retry/blob/master/index.js
24
+ // https://github.com/jonbern/fetch-retry/blob/master/index.js
25
25
 
26
- return function fetchRetry(input: string | URL | Request, init?: RequestInit) {
27
- return new Promise(function (resolve, reject) {
28
- var wrappedFetch = function (attempt: number) {
29
- // As of node 18, this is no longer needed since node comes with native support for fetch:
30
- /* istanbul ignore next */
31
- var _input = typeof Request !== 'undefined' && input instanceof Request ? input.clone() : input;
32
- fetch(_input, init)
33
- .then(function (response) {
34
- if (Array.isArray(retryOn) && retryOn.indexOf(response.status) === -1) {
35
- resolve(response);
36
- } else if (typeof retryOn === 'function') {
37
- try {
38
- return Promise.resolve(retryOn(attempt, null, response))
39
- .then(function (retryOnResponse) {
40
- if (retryOnResponse) {
41
- retry(attempt, null, response);
42
- } else {
43
- resolve(response);
44
- }
45
- })
46
- .catch(reject);
47
- } catch (error) {
48
- reject(error);
49
- }
50
- } else {
51
- if (attempt < retries) {
52
- retry(attempt, null, response);
53
- } else {
54
- resolve(response);
55
- }
56
- }
57
- return;
58
- })
59
- .catch(function (error) {
60
- if (typeof retryOn === 'function') {
61
- try {
62
- // eslint-disable-next-line no-undef
63
- Promise.resolve(retryOn(attempt, error, null))
64
- .then(function (retryOnResponse) {
65
- if (retryOnResponse) {
66
- retry(attempt, error, null);
67
- } else {
68
- reject(error);
69
- }
70
- })
71
- .catch(function (error) {
72
- reject(error);
73
- });
74
- } catch (error) {
75
- reject(error);
76
- }
77
- } else if (attempt < retries) {
78
- retry(attempt, error, null);
79
- } else {
80
- reject(error);
81
- }
82
- });
83
- };
26
+ return function fetchRetry(input: string | URL | Request, init?: RequestInit) {
27
+ return new Promise(function (resolve, reject) {
28
+ var wrappedFetch = function (attempt: number) {
29
+ // As of node 18, this is no longer needed since node comes with native support for fetch:
30
+ /* istanbul ignore next */
31
+ var _input = typeof Request !== 'undefined' && input instanceof Request ? input.clone() : input;
32
+ fetch(_input, init)
33
+ .then(function (response) {
34
+ if (Array.isArray(retryOn) && retryOn.indexOf(response.status) === -1) {
35
+ resolve(response);
36
+ } else if (typeof retryOn === 'function') {
37
+ try {
38
+ return Promise.resolve(retryOn(attempt, null, response))
39
+ .then(function (retryOnResponse) {
40
+ if (retryOnResponse) {
41
+ retry(attempt, null, response);
42
+ } else {
43
+ resolve(response);
44
+ }
45
+ })
46
+ .catch(reject);
47
+ } catch (error) {
48
+ reject(error);
49
+ }
50
+ } else {
51
+ if (attempt < retries) {
52
+ retry(attempt, null, response);
53
+ } else {
54
+ resolve(response);
55
+ }
56
+ }
57
+ return;
58
+ })
59
+ .catch(function (error) {
60
+ if (typeof retryOn === 'function') {
61
+ try {
62
+ // eslint-disable-next-line no-undef
63
+ Promise.resolve(retryOn(attempt, error, null))
64
+ .then(function (retryOnResponse) {
65
+ if (retryOnResponse) {
66
+ retry(attempt, error, null);
67
+ } else {
68
+ reject(error);
69
+ }
70
+ })
71
+ .catch(function (error) {
72
+ reject(error);
73
+ });
74
+ } catch (error) {
75
+ reject(error);
76
+ }
77
+ } else if (attempt < retries) {
78
+ retry(attempt, error, null);
79
+ } else {
80
+ reject(error);
81
+ }
82
+ });
83
+ };
84
84
 
85
- function retry(attempt: number, error: any, response: Response | null) {
86
- let delay = typeof retryDelay === 'function' ? retryDelay(attempt, error, response) : retryDelay;
87
- setTimeout(function () {
88
- wrappedFetch(++attempt);
89
- }, delay);
90
- }
85
+ function retry(attempt: number, error: any, response: Response | null) {
86
+ let delay = typeof retryDelay === 'function' ? retryDelay(attempt, error, response) : retryDelay;
87
+ setTimeout(function () {
88
+ wrappedFetch(++attempt);
89
+ }, delay);
90
+ }
91
91
 
92
- wrappedFetch(0);
93
- });
94
- };
92
+ wrappedFetch(0);
93
+ });
94
+ };
95
95
  }
@@ -0,0 +1,176 @@
1
+ import { describe, expect, it, vi } from 'vitest';
2
+ import { dumpRequest } from './dumpRequest';
3
+
4
+ describe('dumpRequest', () => {
5
+ it('should preview ReadableStream content with size limit', async () => {
6
+ const logSpy = vi.fn();
7
+
8
+ // Create a ReadableStream with text content
9
+ const encoder = new TextEncoder();
10
+ const stream = new ReadableStream({
11
+ start(controller) {
12
+ controller.enqueue(encoder.encode('{"message": "hello"}'));
13
+ controller.close();
14
+ },
15
+ });
16
+
17
+ await dumpRequest({
18
+ url: 'https://api.example.com/test',
19
+ req: {
20
+ method: 'POST',
21
+ body: stream,
22
+ headers: { 'content-type': 'application/json' },
23
+ },
24
+ log: logSpy,
25
+ });
26
+
27
+ const loggedOutput = logSpy.mock.calls[0][0];
28
+
29
+ expect(loggedOutput).toContain('-> POST https://api.example.com/test');
30
+ expect(loggedOutput).toContain('{"message": "hello"}');
31
+ expect(loggedOutput).not.toContain('[... truncated]');
32
+ });
33
+
34
+ it('should truncate large ReadableStream content', async () => {
35
+ const logSpy = vi.fn();
36
+
37
+ // Create a large stream that exceeds preview limit
38
+ const encoder = new TextEncoder();
39
+ const largeData = 'x'.repeat(2000); // 2KB, exceeds 1KB limit
40
+
41
+ const stream = new ReadableStream({
42
+ start(controller) {
43
+ controller.enqueue(encoder.encode(largeData));
44
+ controller.close();
45
+ },
46
+ });
47
+
48
+ await dumpRequest({
49
+ url: 'https://api.example.com/large',
50
+ req: {
51
+ method: 'POST',
52
+ body: stream,
53
+ },
54
+ log: logSpy,
55
+ });
56
+
57
+ const loggedOutput = logSpy.mock.calls[0][0];
58
+
59
+ expect(loggedOutput).toContain('-> POST https://api.example.com/large');
60
+ expect(loggedOutput).toContain('[... truncated]');
61
+ // Should contain some 'x' characters but not all 2000
62
+ expect(loggedOutput).toContain('xxx');
63
+ expect(loggedOutput.length).toBeLessThan(2500); // Much less than full content
64
+ });
65
+
66
+ it('should handle FormData correctly', async () => {
67
+ const logSpy = vi.fn();
68
+
69
+ const formData = new FormData();
70
+ formData.append('username', 'john');
71
+ formData.append('email', 'john@example.com');
72
+
73
+ await dumpRequest({
74
+ url: 'https://api.example.com/form',
75
+ req: {
76
+ method: 'POST',
77
+ body: formData,
78
+ },
79
+ log: logSpy,
80
+ });
81
+
82
+ const loggedOutput = logSpy.mock.calls[0][0];
83
+
84
+ expect(loggedOutput).toContain('-> POST https://api.example.com/form');
85
+ expect(loggedOutput).toContain('[FormData content]');
86
+ expect(loggedOutput).toContain('username: john');
87
+ expect(loggedOutput).toContain('email: john@example.com');
88
+ });
89
+
90
+ it('should use optional body parameter instead of req.body to avoid tee-ing', async () => {
91
+ const logSpy = vi.fn();
92
+
93
+ // Create a ReadableStream that we want to preserve
94
+ const encoder = new TextEncoder();
95
+ const originalStream = new ReadableStream({
96
+ start(controller) {
97
+ controller.enqueue(encoder.encode('{"original": "data"}'));
98
+ controller.close();
99
+ },
100
+ });
101
+
102
+ // Pass separate body to display without affecting original stream
103
+ const displayBody = '{"display": "body"}';
104
+
105
+ await dumpRequest({
106
+ url: 'https://api.example.com/preserve',
107
+ req: {
108
+ method: 'POST',
109
+ body: originalStream,
110
+ headers: { 'content-type': 'application/json' },
111
+ },
112
+ body: displayBody, // This should be displayed instead
113
+ log: logSpy,
114
+ });
115
+
116
+ const loggedOutput = logSpy.mock.calls[0][0];
117
+
118
+ expect(loggedOutput).toContain('-> POST https://api.example.com/preserve');
119
+ expect(loggedOutput).toContain('{"display": "body"}');
120
+ expect(loggedOutput).not.toContain('{"original": "data"}');
121
+
122
+ // Verify original stream is still readable (not tee'd)
123
+ const reader = originalStream.getReader();
124
+ const { value } = await reader.read();
125
+ const decoded = new TextDecoder().decode(value);
126
+ expect(decoded).toBe('{"original": "data"}');
127
+ });
128
+
129
+ it('should handle external ReadableStream in body parameter', async () => {
130
+ const logSpy = vi.fn();
131
+
132
+ // Create a ReadableStream to pass as body parameter
133
+ const encoder = new TextEncoder();
134
+ const externalStream = new ReadableStream({
135
+ start(controller) {
136
+ controller.enqueue(encoder.encode('external stream data'));
137
+ controller.close();
138
+ },
139
+ });
140
+
141
+ await dumpRequest({
142
+ url: 'https://api.example.com/external',
143
+ req: {
144
+ method: 'POST',
145
+ headers: { 'content-type': 'application/json' },
146
+ },
147
+ body: externalStream,
148
+ log: logSpy,
149
+ });
150
+
151
+ const loggedOutput = logSpy.mock.calls[0][0];
152
+
153
+ expect(loggedOutput).toContain('-> POST https://api.example.com/external');
154
+ expect(loggedOutput).toContain('[ReadableStream - cannot preview external stream]');
155
+ });
156
+
157
+ it('should handle string body parameter', async () => {
158
+ const logSpy = vi.fn();
159
+
160
+ await dumpRequest({
161
+ url: 'https://api.example.com/string',
162
+ req: {
163
+ method: 'POST',
164
+ headers: { 'content-type': 'application/json' },
165
+ },
166
+ body: '{"custom": "body"}',
167
+ method: 'PATCH', // Test method override too
168
+ log: logSpy,
169
+ });
170
+
171
+ const loggedOutput = logSpy.mock.calls[0][0];
172
+
173
+ expect(loggedOutput).toContain('-> PATCH https://api.example.com/string');
174
+ expect(loggedOutput).toContain('{"custom": "body"}');
175
+ });
176
+ });