@wener/utils 1.1.26 → 1.1.29

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 (351) hide show
  1. package/README.md +4 -0
  2. package/lib/arrays/MaybeArray.js +36 -25
  3. package/lib/arrays/MaybeArray.js.map +1 -1
  4. package/lib/arrays/arrayFromAsync.js +5 -7
  5. package/lib/arrays/arrayFromAsync.js.map +1 -1
  6. package/lib/asyncs/AsyncInterval.js +11 -12
  7. package/lib/asyncs/AsyncInterval.js.map +1 -1
  8. package/lib/asyncs/MaybePromise.js +3 -0
  9. package/lib/asyncs/MaybePromise.js.map +1 -0
  10. package/lib/asyncs/createAsyncIterator.js +37 -35
  11. package/lib/asyncs/createAsyncIterator.js.map +1 -1
  12. package/lib/asyncs/createLazyPromise.js +59 -60
  13. package/lib/asyncs/createLazyPromise.js.map +1 -1
  14. package/lib/asyncs/firstOfAsyncIterator.js +7 -9
  15. package/lib/asyncs/firstOfAsyncIterator.js.map +1 -1
  16. package/lib/asyncs/generatorOfStream.js +16 -0
  17. package/lib/asyncs/generatorOfStream.js.map +1 -0
  18. package/lib/asyncs/isIterator.js +3 -4
  19. package/lib/asyncs/isIterator.js.map +1 -1
  20. package/lib/asyncs/isPromise.js +3 -4
  21. package/lib/asyncs/isPromise.js.map +1 -1
  22. package/lib/asyncs/isThenable.js +6 -0
  23. package/lib/asyncs/isThenable.js.map +1 -0
  24. package/lib/asyncs/nextOfAsyncIterator.js +20 -14
  25. package/lib/asyncs/nextOfAsyncIterator.js.map +1 -1
  26. package/lib/asyncs/promiseOfCallback.js +17 -0
  27. package/lib/asyncs/promiseOfCallback.js.map +1 -0
  28. package/lib/asyncs/sleep.js +2 -3
  29. package/lib/asyncs/sleep.js.map +1 -1
  30. package/lib/asyncs/timeout.js +22 -26
  31. package/lib/asyncs/timeout.js.map +1 -1
  32. package/lib/browsers/copy.js +47 -45
  33. package/lib/browsers/copy.js.map +1 -1
  34. package/lib/browsers/download.js +38 -27
  35. package/lib/browsers/download.js.map +1 -1
  36. package/lib/browsers/getFileFromDataTransfer.js +41 -28
  37. package/lib/browsers/getFileFromDataTransfer.js.map +1 -1
  38. package/lib/browsers/loaders.js +43 -43
  39. package/lib/browsers/loaders.js.map +1 -1
  40. package/lib/crypto/base.js +5 -4
  41. package/lib/crypto/base.js.map +1 -1
  42. package/lib/crypto/getNodeCrypto.js +14 -13
  43. package/lib/crypto/getNodeCrypto.js.map +1 -1
  44. package/lib/crypto/getRandomValues.js +22 -26
  45. package/lib/crypto/getRandomValues.js.map +1 -1
  46. package/lib/crypto/hashing.js +42 -50
  47. package/lib/crypto/hashing.js.map +1 -1
  48. package/lib/crypto/md5.bench.js +21 -0
  49. package/lib/crypto/md5.bench.js.map +1 -0
  50. package/lib/crypto/md5.d.js +3 -0
  51. package/lib/crypto/md5.d.js.map +1 -0
  52. package/lib/crypto/md5.js +119 -121
  53. package/lib/crypto/md5.js.map +1 -1
  54. package/lib/crypto/pem/pem.js +32 -35
  55. package/lib/crypto/pem/pem.js.map +1 -1
  56. package/lib/crypto/randomUUID.js +12 -11
  57. package/lib/crypto/randomUUID.js.map +1 -1
  58. package/lib/crypto/ulid.js +123 -112
  59. package/lib/crypto/ulid.js.map +1 -1
  60. package/lib/errors/Errors.js +167 -149
  61. package/lib/errors/Errors.js.map +1 -1
  62. package/lib/fetch/createFetchWith.js +20 -23
  63. package/lib/fetch/createFetchWith.js.map +1 -1
  64. package/lib/fetch/createFetchWithLogging.js +20 -16
  65. package/lib/fetch/createFetchWithLogging.js.map +1 -1
  66. package/lib/fetch/createFetchWithRetry.js +61 -65
  67. package/lib/fetch/createFetchWithRetry.js.map +1 -1
  68. package/lib/fetch/dumpRequest.js +39 -42
  69. package/lib/fetch/dumpRequest.js.map +1 -1
  70. package/lib/fetch/dumpResponse.js +13 -20
  71. package/lib/fetch/dumpResponse.js.map +1 -1
  72. package/lib/fetch/index.js +7 -0
  73. package/lib/fetch/index.js.map +1 -0
  74. package/lib/fetch/types.js +3 -0
  75. package/lib/fetch/types.js.map +1 -0
  76. package/lib/http/HttpStatus.js +89 -80
  77. package/lib/http/HttpStatus.js.map +1 -1
  78. package/lib/i18n/createTranslate.js +48 -48
  79. package/lib/i18n/createTranslate.js.map +1 -1
  80. package/lib/index.js +30 -14
  81. package/lib/index.js.map +1 -1
  82. package/lib/io/AbstractEncoding.js +7 -0
  83. package/lib/io/AbstractEncoding.js.map +1 -0
  84. package/lib/io/ArrayBuffer.test-d.js +7 -0
  85. package/lib/io/ArrayBuffer.test-d.js.map +1 -0
  86. package/lib/io/ArrayBuffers.js +198 -172
  87. package/lib/io/ArrayBuffers.js.map +1 -1
  88. package/lib/io/Buffer.js +21 -20
  89. package/lib/io/Buffer.js.map +1 -1
  90. package/lib/io/base64.js +49 -48
  91. package/lib/io/base64.js.map +1 -1
  92. package/lib/io/isBuffer.js +7 -5
  93. package/lib/io/isBuffer.js.map +1 -1
  94. package/lib/io/isTransferable.js +23 -19
  95. package/lib/io/isTransferable.js.map +1 -1
  96. package/lib/isomorphics/getGlobalThis.js +17 -12
  97. package/lib/isomorphics/getGlobalThis.js.map +1 -1
  98. package/lib/isomorphics/structuredClone.js +71 -63
  99. package/lib/isomorphics/structuredClone.js.map +1 -1
  100. package/lib/langs/MaybeFunction.js +7 -7
  101. package/lib/langs/MaybeFunction.js.map +1 -1
  102. package/lib/langs/classOf.js +3 -4
  103. package/lib/langs/classOf.js.map +1 -1
  104. package/lib/langs/deepEqual.js +77 -85
  105. package/lib/langs/deepEqual.js.map +1 -1
  106. package/lib/langs/deepFreeze.js +20 -0
  107. package/lib/langs/deepFreeze.js.map +1 -0
  108. package/lib/langs/hashCode.ignored.js +112 -0
  109. package/lib/langs/hashCode.ignored.js.map +1 -0
  110. package/lib/langs/isClass.js +3 -4
  111. package/lib/langs/isClass.js.map +1 -1
  112. package/lib/langs/isDefined.js +3 -4
  113. package/lib/langs/isDefined.js.map +1 -1
  114. package/lib/langs/isEmptyObject.js +3 -5
  115. package/lib/langs/isEmptyObject.js.map +1 -1
  116. package/lib/langs/isFunction.js +5 -0
  117. package/lib/langs/isFunction.js.map +1 -0
  118. package/lib/langs/isPlainObject.js +7 -8
  119. package/lib/langs/isPlainObject.js.map +1 -1
  120. package/lib/langs/memoize.js +19 -21
  121. package/lib/langs/memoize.js.map +1 -1
  122. package/lib/langs/parseBoolean.js +26 -27
  123. package/lib/langs/parseBoolean.js.map +1 -1
  124. package/lib/langs/shallowClone.js +12 -12
  125. package/lib/langs/shallowClone.js.map +1 -1
  126. package/lib/langs/shallowEqual.js +21 -18
  127. package/lib/langs/shallowEqual.js.map +1 -1
  128. package/lib/libs/ms.js +123 -103
  129. package/lib/libs/ms.js.map +1 -1
  130. package/lib/logging/Logger.js +5 -0
  131. package/lib/logging/Logger.js.map +1 -0
  132. package/lib/logging/createChildLogger.js +12 -14
  133. package/lib/logging/createChildLogger.js.map +1 -1
  134. package/lib/logging/createLogger.js +59 -33
  135. package/lib/logging/createLogger.js.map +1 -1
  136. package/lib/logging/createNoopLogger.js +11 -12
  137. package/lib/logging/createNoopLogger.js.map +1 -1
  138. package/lib/logging/slog.js +143 -0
  139. package/lib/logging/slog.js.map +1 -0
  140. package/lib/maths/clamp.js +21 -0
  141. package/lib/maths/clamp.js.map +1 -0
  142. package/lib/maths/random.js +14 -15
  143. package/lib/maths/random.js.map +1 -1
  144. package/lib/modules/isModule.js +5 -4
  145. package/lib/modules/isModule.js.map +1 -1
  146. package/lib/modules/parseModuleId.js +36 -31
  147. package/lib/modules/parseModuleId.js.map +1 -1
  148. package/lib/objects/get.js +13 -11
  149. package/lib/objects/get.js.map +1 -1
  150. package/lib/objects/get.test-d.js +33 -0
  151. package/lib/objects/get.test-d.js.map +1 -0
  152. package/lib/objects/merge/index.js +3 -0
  153. package/lib/objects/merge/index.js.map +1 -0
  154. package/lib/objects/merge/isMergeableObject.js +11 -10
  155. package/lib/objects/merge/isMergeableObject.js.map +1 -1
  156. package/lib/objects/merge/merge.js +65 -66
  157. package/lib/objects/merge/merge.js.map +1 -1
  158. package/lib/objects/parseObjectPath.js +35 -23
  159. package/lib/objects/parseObjectPath.js.map +1 -1
  160. package/lib/objects/set.js +33 -34
  161. package/lib/objects/set.js.map +1 -1
  162. package/lib/schema/typebox/gen/codegen/common/encoder.js +100 -0
  163. package/lib/schema/typebox/gen/codegen/common/encoder.js.map +1 -0
  164. package/lib/schema/typebox/gen/codegen/common/formatter.js +33 -0
  165. package/lib/schema/typebox/gen/codegen/common/formatter.js.map +1 -0
  166. package/lib/schema/typebox/gen/codegen/common/index.js +5 -0
  167. package/lib/schema/typebox/gen/codegen/common/index.js.map +1 -0
  168. package/lib/schema/typebox/gen/codegen/common/jsdoc.js +117 -0
  169. package/lib/schema/typebox/gen/codegen/common/jsdoc.js.map +1 -0
  170. package/lib/schema/typebox/gen/codegen/expression/compiler.js +367 -0
  171. package/lib/schema/typebox/gen/codegen/expression/compiler.js.map +1 -0
  172. package/lib/schema/typebox/gen/codegen/expression/errors.js +259 -0
  173. package/lib/schema/typebox/gen/codegen/expression/errors.js.map +1 -0
  174. package/lib/schema/typebox/gen/codegen/expression/evaluator.js +254 -0
  175. package/lib/schema/typebox/gen/codegen/expression/evaluator.js.map +1 -0
  176. package/lib/schema/typebox/gen/codegen/expression/expression.js +384 -0
  177. package/lib/schema/typebox/gen/codegen/expression/expression.js.map +1 -0
  178. package/lib/schema/typebox/gen/codegen/expression/index.js +6 -0
  179. package/lib/schema/typebox/gen/codegen/expression/index.js.map +1 -0
  180. package/lib/schema/typebox/gen/codegen/index.js +5 -0
  181. package/lib/schema/typebox/gen/codegen/index.js.map +1 -0
  182. package/lib/schema/typebox/gen/codegen/model/index.js +16 -0
  183. package/lib/schema/typebox/gen/codegen/model/index.js.map +1 -0
  184. package/lib/schema/typebox/gen/codegen/model/model-to-arktype.js +239 -0
  185. package/lib/schema/typebox/gen/codegen/model/model-to-arktype.js.map +1 -0
  186. package/lib/schema/typebox/gen/codegen/model/model-to-expression.js +359 -0
  187. package/lib/schema/typebox/gen/codegen/model/model-to-expression.js.map +1 -0
  188. package/lib/schema/typebox/gen/codegen/model/model-to-grpc.js +217 -0
  189. package/lib/schema/typebox/gen/codegen/model/model-to-grpc.js.map +1 -0
  190. package/lib/schema/typebox/gen/codegen/model/model-to-io-ts.js +253 -0
  191. package/lib/schema/typebox/gen/codegen/model/model-to-io-ts.js.map +1 -0
  192. package/lib/schema/typebox/gen/codegen/model/model-to-javascript.js +47 -0
  193. package/lib/schema/typebox/gen/codegen/model/model-to-javascript.js.map +1 -0
  194. package/lib/schema/typebox/gen/codegen/model/model-to-json-schema.js +171 -0
  195. package/lib/schema/typebox/gen/codegen/model/model-to-json-schema.js.map +1 -0
  196. package/lib/schema/typebox/gen/codegen/model/model-to-typebox.js +33 -0
  197. package/lib/schema/typebox/gen/codegen/model/model-to-typebox.js.map +1 -0
  198. package/lib/schema/typebox/gen/codegen/model/model-to-typescript.js +164 -0
  199. package/lib/schema/typebox/gen/codegen/model/model-to-typescript.js.map +1 -0
  200. package/lib/schema/typebox/gen/codegen/model/model-to-valibot.js +218 -0
  201. package/lib/schema/typebox/gen/codegen/model/model-to-valibot.js.map +1 -0
  202. package/lib/schema/typebox/gen/codegen/model/model-to-value.js +43 -0
  203. package/lib/schema/typebox/gen/codegen/model/model-to-value.js.map +1 -0
  204. package/lib/schema/typebox/gen/codegen/model/model-to-yrel.js +206 -0
  205. package/lib/schema/typebox/gen/codegen/model/model-to-yrel.js.map +1 -0
  206. package/lib/schema/typebox/gen/codegen/model/model-to-yup.js +204 -0
  207. package/lib/schema/typebox/gen/codegen/model/model-to-yup.js.map +1 -0
  208. package/lib/schema/typebox/gen/codegen/model/model-to-zod.js +227 -0
  209. package/lib/schema/typebox/gen/codegen/model/model-to-zod.js.map +1 -0
  210. package/lib/schema/typebox/gen/codegen/model/model.js +27 -0
  211. package/lib/schema/typebox/gen/codegen/model/model.js.map +1 -0
  212. package/lib/schema/typebox/gen/codegen/typescript/index.js +4 -0
  213. package/lib/schema/typebox/gen/codegen/typescript/index.js.map +1 -0
  214. package/lib/schema/typebox/gen/codegen/typescript/typescript-to-model.js +48 -0
  215. package/lib/schema/typebox/gen/codegen/typescript/typescript-to-model.js.map +1 -0
  216. package/lib/schema/typebox/gen/codegen/typescript/typescript-to-typebox.js +596 -0
  217. package/lib/schema/typebox/gen/codegen/typescript/typescript-to-typebox.js.map +1 -0
  218. package/lib/schema/typebox/gen/index.js +3 -0
  219. package/lib/schema/typebox/gen/index.js.map +1 -0
  220. package/lib/schema/typebox/index.js +3 -0
  221. package/lib/schema/typebox/index.js.map +1 -0
  222. package/lib/schema/typebox/typebox.js +23 -0
  223. package/lib/schema/typebox/typebox.js.map +1 -0
  224. package/lib/server.js +2 -1
  225. package/lib/server.js.map +1 -1
  226. package/lib/servers/crypto/md5.js +3 -5
  227. package/lib/servers/crypto/md5.js.map +1 -1
  228. package/lib/servers/fetch/createFetchWithProxy.js +2 -4
  229. package/lib/servers/fetch/createFetchWithProxy.js.map +1 -1
  230. package/lib/servers/fetch/createFetchWithProxyByNodeFetch.js +34 -34
  231. package/lib/servers/fetch/createFetchWithProxyByNodeFetch.js.map +1 -1
  232. package/lib/servers/fetch/createFetchWithProxyByUndici.js +59 -45
  233. package/lib/servers/fetch/createFetchWithProxyByUndici.js.map +1 -1
  234. package/lib/servers/getPackageDir.js +8 -10
  235. package/lib/servers/getPackageDir.js.map +1 -1
  236. package/lib/servers/jsdom.js +3 -2
  237. package/lib/servers/jsdom.js.map +1 -1
  238. package/lib/servers/node-fetch.js +4 -3
  239. package/lib/servers/node-fetch.js.map +1 -1
  240. package/lib/servers/polyfill/polyfillBrowser.js +17 -0
  241. package/lib/servers/polyfill/polyfillBrowser.js.map +1 -0
  242. package/lib/servers/polyfill/polyfillCrypto.js +8 -10
  243. package/lib/servers/polyfill/polyfillCrypto.js.map +1 -1
  244. package/lib/servers/polyfill/polyfillFetch.js +23 -22
  245. package/lib/servers/polyfill/polyfillFetch.js.map +1 -1
  246. package/lib/servers/polyfill/polyfillJsDom.js +59 -52
  247. package/lib/servers/polyfill/polyfillJsDom.js.map +1 -1
  248. package/lib/servers/polyfill/polyfillWebSocket.js +13 -13
  249. package/lib/servers/polyfill/polyfillWebSocket.js.map +1 -1
  250. package/lib/servers/ws.js +3 -2
  251. package/lib/servers/ws.js.map +1 -1
  252. package/lib/strings/camelCase.js +51 -49
  253. package/lib/strings/camelCase.js.map +1 -1
  254. package/lib/strings/formatBytes.js +41 -15
  255. package/lib/strings/formatBytes.js.map +1 -1
  256. package/lib/strings/renderTemplate.js +27 -20
  257. package/lib/strings/renderTemplate.js.map +1 -1
  258. package/lib/typedoc.js +4 -0
  259. package/lib/typedoc.js.map +1 -0
  260. package/lib/types/global.d.js +2 -0
  261. package/lib/types/global.d.js.map +1 -0
  262. package/lib/types/index.d.js +6 -0
  263. package/lib/types/index.d.js.map +1 -0
  264. package/lib/validations/asserts.js +14 -0
  265. package/lib/validations/asserts.js.map +1 -0
  266. package/lib/validations/isUUID.js +3 -4
  267. package/lib/validations/isUUID.js.map +1 -1
  268. package/lib/validations/parseTimestamp.js +25 -21
  269. package/lib/validations/parseTimestamp.js.map +1 -1
  270. package/package.json +59 -44
  271. package/src/index.ts +3 -3
  272. package/src/langs/deepFreeze.ts +19 -0
  273. package/src/langs/hashCode.ignored.ts +125 -0
  274. package/src/libs/README.md +2 -0
  275. package/src/logging/slog.ts +121 -0
  276. package/src/maths/clamp.test.ts +19 -0
  277. package/src/maths/clamp.ts +23 -1
  278. package/src/objects/get.ts +14 -14
  279. package/src/objects/set.ts +5 -5
  280. package/src/schema/typebox/gen/codegen/common/encoder.ts +99 -0
  281. package/src/schema/typebox/gen/codegen/common/formatter.ts +31 -0
  282. package/src/schema/typebox/gen/codegen/common/index.ts +29 -0
  283. package/src/schema/typebox/gen/codegen/common/jsdoc.ts +93 -0
  284. package/src/schema/typebox/gen/codegen/expression/compiler.ts +377 -0
  285. package/src/schema/typebox/gen/codegen/expression/errors.ts +302 -0
  286. package/src/schema/typebox/gen/codegen/expression/evaluator.ts +268 -0
  287. package/src/schema/typebox/gen/codegen/expression/expression.ts +538 -0
  288. package/src/schema/typebox/gen/codegen/expression/index.ts +32 -0
  289. package/src/schema/typebox/gen/codegen/index.ts +29 -0
  290. package/src/schema/typebox/gen/codegen/model/index.ts +40 -0
  291. package/src/schema/typebox/gen/codegen/model/model-to-arktype.ts +266 -0
  292. package/src/schema/typebox/gen/codegen/model/model-to-expression.ts +378 -0
  293. package/src/schema/typebox/gen/codegen/model/model-to-grpc.ts +244 -0
  294. package/src/schema/typebox/gen/codegen/model/model-to-io-ts.ts +294 -0
  295. package/src/schema/typebox/gen/codegen/model/model-to-javascript.ts +42 -0
  296. package/src/schema/typebox/gen/codegen/model/model-to-json-schema.ts +166 -0
  297. package/src/schema/typebox/gen/codegen/model/model-to-typebox.ts +32 -0
  298. package/src/schema/typebox/gen/codegen/model/model-to-typescript.ts +189 -0
  299. package/src/schema/typebox/gen/codegen/model/model-to-valibot.ts +236 -0
  300. package/src/schema/typebox/gen/codegen/model/model-to-value.ts +42 -0
  301. package/src/schema/typebox/gen/codegen/model/model-to-yrel.ts +232 -0
  302. package/src/schema/typebox/gen/codegen/model/model-to-yup.ts +226 -0
  303. package/src/schema/typebox/gen/codegen/model/model-to-zod.ts +251 -0
  304. package/src/schema/typebox/gen/codegen/model/model.ts +33 -0
  305. package/src/schema/typebox/gen/codegen/typescript/index.ts +28 -0
  306. package/src/schema/typebox/gen/codegen/typescript/typescript-to-model.ts +61 -0
  307. package/src/schema/typebox/gen/codegen/typescript/typescript-to-typebox.ts +647 -0
  308. package/src/schema/typebox/gen/gen.test.ts +12 -0
  309. package/src/schema/typebox/gen/index.ts +1 -0
  310. package/src/schema/typebox/index.ts +1 -0
  311. package/src/schema/typebox/typebox.ts +34 -0
  312. package/src/servers/fetch/createFetchWithProxyByUndici.ts +16 -1
  313. package/src/types/index.d.ts +1 -0
  314. package/dist/LICENSE.txt +0 -1
  315. package/dist/cjs/getGlobalThis-304f74e0.js +0 -2
  316. package/dist/cjs/getGlobalThis-304f74e0.js.map +0 -1
  317. package/dist/cjs/index.cjs +0 -21
  318. package/dist/cjs/index.cjs.map +0 -1
  319. package/dist/cjs/server.cjs +0 -2
  320. package/dist/cjs/server.cjs.map +0 -1
  321. package/dist/cjs/servers/jsdom.cjs +0 -2
  322. package/dist/cjs/servers/jsdom.cjs.map +0 -1
  323. package/dist/cjs/servers/node-fetch.cjs +0 -2
  324. package/dist/cjs/servers/node-fetch.cjs.map +0 -1
  325. package/dist/cjs/servers/ws.cjs +0 -2
  326. package/dist/cjs/servers/ws.cjs.map +0 -1
  327. package/dist/esm/getGlobalThis-b7ad0cf9.js +0 -2
  328. package/dist/esm/getGlobalThis-b7ad0cf9.js.map +0 -1
  329. package/dist/esm/index.js +0 -21
  330. package/dist/esm/index.js.map +0 -1
  331. package/dist/esm/server.js +0 -2
  332. package/dist/esm/server.js.map +0 -1
  333. package/dist/esm/servers/jsdom.js +0 -2
  334. package/dist/esm/servers/jsdom.js.map +0 -1
  335. package/dist/esm/servers/node-fetch.js +0 -2
  336. package/dist/esm/servers/node-fetch.js.map +0 -1
  337. package/dist/esm/servers/ws.js +0 -2
  338. package/dist/esm/servers/ws.js.map +0 -1
  339. package/dist/system/getGlobalThis-8951eb0e.js +0 -2
  340. package/dist/system/getGlobalThis-8951eb0e.js.map +0 -1
  341. package/dist/system/index.js +0 -21
  342. package/dist/system/index.js.map +0 -1
  343. package/dist/system/server.js +0 -2
  344. package/dist/system/server.js.map +0 -1
  345. package/dist/system/servers/jsdom.js +0 -2
  346. package/dist/system/servers/jsdom.js.map +0 -1
  347. package/dist/system/servers/node-fetch.js +0 -2
  348. package/dist/system/servers/node-fetch.js.map +0 -1
  349. package/dist/system/servers/ws.js +0 -2
  350. package/dist/system/servers/ws.js.map +0 -1
  351. package/src/langs/hashCode.ts +0 -37
@@ -0,0 +1,14 @@
1
+ export function assert(condition, msg) {
2
+ // if (!condition) {
3
+ // throw new AssertionError(msg);
4
+ // }
5
+ console.assert(!condition, msg);
6
+ }
7
+ export function assertIsDefined(val) {
8
+ // if (val === undefined || val === null) {
9
+ // throw new AssertionError(`Expected 'val' to be defined, but received ${val}`);
10
+ // }
11
+ console.assert(val === undefined || val === null, 'Expected defined');
12
+ }
13
+
14
+ //# sourceMappingURL=asserts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/validations/asserts.ts"],"sourcesContent":["export function assert(condition: any, msg?: string): asserts condition {\n // if (!condition) {\n // throw new AssertionError(msg);\n // }\n console.assert(!condition, msg);\n}\n\nexport function assertIsDefined<T>(val: T): asserts val is NonNullable<T> {\n // if (val === undefined || val === null) {\n // throw new AssertionError(`Expected 'val' to be defined, but received ${val}`);\n // }\n console.assert(val === undefined || val === null, 'Expected defined');\n}\n"],"names":["assert","condition","msg","console","assertIsDefined","val","undefined"],"mappings":"AAAA,OAAO,SAASA,OAAOC,SAAc,EAAEC,GAAY;IACjD,oBAAoB;IACpB,mCAAmC;IACnC,IAAI;IACJC,QAAQH,MAAM,CAAC,CAACC,WAAWC;AAC7B;AAEA,OAAO,SAASE,gBAAmBC,GAAM;IACvC,2CAA2C;IAC3C,mFAAmF;IACnF,IAAI;IACJF,QAAQH,MAAM,CAACK,QAAQC,aAAaD,QAAQ,MAAM;AACpD"}
@@ -1,6 +1,5 @@
1
- function isUUID(str) {
2
- return Boolean(str) && /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(String(str));
1
+ export function isUUID(str) {
2
+ return Boolean(str) && /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(String(str));
3
3
  }
4
4
 
5
- export { isUUID };
6
- //# sourceMappingURL=isUUID.js.map
5
+ //# sourceMappingURL=isUUID.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"isUUID.js","sources":["../../src/validations/isUUID.ts"],"sourcesContent":["export function isUUID(str: string | undefined | null) {\n return Boolean(str) && /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(String(str));\n}\n"],"names":[],"mappings":"AAAO,SAAS,OAAO,GAAgC,EAAA;AACrD,EAAA,OAAO,QAAQ,GAAG,CAAA,IAAK,yEAAyE,IAAK,CAAA,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA;AAClH;;;;"}
1
+ {"version":3,"sources":["../../src/validations/isUUID.ts"],"sourcesContent":["export function isUUID(str: string | undefined | null) {\n return Boolean(str) && /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(String(str));\n}\n"],"names":["isUUID","str","Boolean","test","String"],"mappings":"AAAA,OAAO,SAASA,OAAOC,GAA8B;IACnD,OAAOC,QAAQD,QAAQ,yEAAyEE,IAAI,CAACC,OAAOH;AAC9G"}
@@ -1,25 +1,29 @@
1
- function parseTimestamp(raw) {
2
- if (!raw) {
3
- return void 0;
4
- }
5
- if (raw instanceof Date) {
6
- return raw;
7
- }
8
- if (typeof raw === "string" && /^[0-9.]+$/.test(raw)) {
9
- let n = parseFloat(raw);
10
- const len = Math.floor(n).toString().length;
11
- if (len <= 11) {
12
- n *= 1e3;
1
+ export function parseTimestamp(raw) {
2
+ if (!raw) {
3
+ return undefined;
13
4
  }
14
- return new Date(n);
15
- } else if (typeof raw === "string") {
16
- const date = new Date(raw);
17
- if (!isNaN(+date)) {
18
- return date;
5
+ if (raw instanceof Date) {
6
+ return raw;
19
7
  }
20
- }
21
- throw new Error(`parseTimestamp: invalid "${raw}"`);
8
+ if (typeof raw === 'string' && /^[0-9.]+$/.test(raw)) {
9
+ let n = parseFloat(raw);
10
+ const len = Math.floor(n).toString().length;
11
+ /*
12
+ 最常见的是 10 位和 13 位
13
+ 9999999999 - 10*9 - 1970-04-26
14
+ 99999999999 - 11*9 - 1973
15
+ 999999999999 - 12*9 - 2001
16
+ */ if (len <= 11) {
17
+ n *= 1000;
18
+ }
19
+ return new Date(n);
20
+ } else if (typeof raw === 'string') {
21
+ const date = new Date(raw);
22
+ if (!isNaN(+date)) {
23
+ return date;
24
+ }
25
+ }
26
+ throw new Error(`parseTimestamp: invalid "${raw}"`);
22
27
  }
23
28
 
24
- export { parseTimestamp };
25
- //# sourceMappingURL=parseTimestamp.js.map
29
+ //# sourceMappingURL=parseTimestamp.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"parseTimestamp.js","sources":["../../src/validations/parseTimestamp.ts"],"sourcesContent":["export function parseTimestamp(raw?: string | number | Date): Date | undefined {\n if (!raw) {\n return undefined;\n }\n if (raw instanceof Date) {\n return raw;\n }\n\n if (typeof raw === 'string' && /^[0-9.]+$/.test(raw)) {\n let n = parseFloat(raw);\n const len = Math.floor(n).toString().length;\n /*\n 最常见的是 10 位和 13 位\n 9999999999 - 10*9 - 1970-04-26\n 99999999999 - 11*9 - 1973\n 999999999999 - 12*9 - 2001\n */\n if (len <= 11) {\n n *= 1000;\n }\n return new Date(n);\n } else if (typeof raw === 'string') {\n const date = new Date(raw);\n if (!isNaN(+date)) {\n return date;\n }\n }\n throw new Error(`parseTimestamp: invalid \"${raw}\"`);\n}\n"],"names":[],"mappings":"AAAO,SAAS,eAAe,GAAgD,EAAA;AAC7E,EAAA,IAAI,CAAC,GAAK,EAAA;AACR,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACT;AACA,EAAA,IAAI,eAAe,IAAM,EAAA;AACvB,IAAO,OAAA,GAAA,CAAA;AAAA,GACT;AAEA,EAAA,IAAI,OAAO,GAAQ,KAAA,QAAA,IAAY,WAAY,CAAA,IAAA,CAAK,GAAG,CAAG,EAAA;AACpD,IAAI,IAAA,CAAA,GAAI,WAAW,GAAG,CAAA,CAAA;AACtB,IAAA,MAAM,MAAM,IAAK,CAAA,KAAA,CAAM,CAAC,CAAA,CAAE,UAAW,CAAA,MAAA,CAAA;AAOrC,IAAA,IAAI,OAAO,EAAI,EAAA;AACb,MAAK,CAAA,IAAA,GAAA,CAAA;AAAA,KACP;AACA,IAAO,OAAA,IAAI,KAAK,CAAC,CAAA,CAAA;AAAA,GACnB,MAAA,IAAW,OAAO,GAAA,KAAQ,QAAU,EAAA;AAClC,IAAM,MAAA,IAAA,GAAO,IAAI,IAAA,CAAK,GAAG,CAAA,CAAA;AACzB,IAAA,IAAI,CAAC,KAAA,CAAM,CAAC,IAAI,CAAG,EAAA;AACjB,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AAAA,GACF;AACA,EAAA,MAAM,IAAI,KAAA,CAAM,CAA4B,yBAAA,EAAA,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA;AACpD;;;;"}
1
+ {"version":3,"sources":["../../src/validations/parseTimestamp.ts"],"sourcesContent":["export function parseTimestamp(raw?: string | number | Date): Date | undefined {\n if (!raw) {\n return undefined;\n }\n if (raw instanceof Date) {\n return raw;\n }\n\n if (typeof raw === 'string' && /^[0-9.]+$/.test(raw)) {\n let n = parseFloat(raw);\n const len = Math.floor(n).toString().length;\n /*\n 最常见的是 10 位和 13 位\n 9999999999 - 10*9 - 1970-04-26\n 99999999999 - 11*9 - 1973\n 999999999999 - 12*9 - 2001\n */\n if (len <= 11) {\n n *= 1000;\n }\n return new Date(n);\n } else if (typeof raw === 'string') {\n const date = new Date(raw);\n if (!isNaN(+date)) {\n return date;\n }\n }\n throw new Error(`parseTimestamp: invalid \"${raw}\"`);\n}\n"],"names":["parseTimestamp","raw","undefined","Date","test","n","parseFloat","len","Math","floor","toString","length","date","isNaN","Error"],"mappings":"AAAA,OAAO,SAASA,eAAeC,GAA4B;IACzD,IAAI,CAACA,KAAK;QACR,OAAOC;IACT;IACA,IAAID,eAAeE,MAAM;QACvB,OAAOF;IACT;IAEA,IAAI,OAAOA,QAAQ,YAAY,YAAYG,IAAI,CAACH,MAAM;QACpD,IAAII,IAAIC,WAAWL;QACnB,MAAMM,MAAMC,KAAKC,KAAK,CAACJ,GAAGK,QAAQ,GAAGC,MAAM;QAC3C;;;;;KAKC,GACD,IAAIJ,OAAO,IAAI;YACbF,KAAK;QACP;QACA,OAAO,IAAIF,KAAKE;IAClB,OAAO,IAAI,OAAOJ,QAAQ,UAAU;QAClC,MAAMW,OAAO,IAAIT,KAAKF;QACtB,IAAI,CAACY,MAAM,CAACD,OAAO;YACjB,OAAOA;QACT;IACF;IACA,MAAM,IAAIE,MAAM,CAAC,yBAAyB,EAAEb,IAAI,CAAC,CAAC;AACpD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wener/utils",
3
- "version": "1.1.26",
3
+ "version": "1.1.29",
4
4
  "type": "module",
5
5
  "description": "Utils for daily use",
6
6
  "repository": {
@@ -30,6 +30,12 @@
30
30
  "template",
31
31
  "lodash"
32
32
  ],
33
+ "scripts": {
34
+ "build": "make prepublish",
35
+ "clean": "make clean",
36
+ "dev": "make dev",
37
+ "test": "make test"
38
+ },
33
39
  "peerDependencies": {
34
40
  "undici": "*"
35
41
  },
@@ -39,16 +45,56 @@
39
45
  }
40
46
  },
41
47
  "devDependencies": {
42
- "@types/lodash": "^4.14.200",
43
- "@types/ws": "^8.5.8",
48
+ "@sinclair/typebox": "^0.32.8",
49
+ "@types/lodash": "^4.14.202",
50
+ "@types/ws": "^8.5.10",
44
51
  "https-proxy-agent": "^7.0.2",
45
52
  "lodash": "^4.17.21",
46
53
  "node-fetch": "^3.3.2",
47
- "undici": "^5.27.0"
54
+ "undici": "^6.3.0",
55
+ "zod": "^3.22.4"
48
56
  },
49
57
  "publishConfig": {
50
58
  "registry": "https://registry.npmjs.org",
51
- "access": "public"
59
+ "access": "public",
60
+ "exports": {
61
+ ".": {
62
+ "types": "./src/index.ts",
63
+ "typescript": "./src/index.ts",
64
+ "system": "./dist/system/index.js",
65
+ "import": "./lib/index.js"
66
+ },
67
+ "./types": {
68
+ "types": "./types.d.ts"
69
+ },
70
+ "./server": {
71
+ "types": "./src/server.ts",
72
+ "typescript": "./src/server.ts",
73
+ "system": "./dist/system/server.js",
74
+ "import": "./lib/server.js"
75
+ },
76
+ "./server/node-fetch": {
77
+ "types": "./server/node-fetch.ts",
78
+ "default": "./lib/servers/node-fetch.js"
79
+ },
80
+ "./server/jsdom": {
81
+ "types": "./server/jsdom.ts",
82
+ "default": "./lib/servers/jsdom.js"
83
+ },
84
+ "./server/ws": {
85
+ "types": "./server/ws.ts",
86
+ "default": "./lib/servers/ws.js"
87
+ },
88
+ "./schema/typebox": {
89
+ "types": "./schema/typebox/index.ts",
90
+ "default": "./lib/schema/typebox/index.js"
91
+ },
92
+ "./schema/typebox/gen": {
93
+ "types": "./schema/typebox/gen/index.ts",
94
+ "default": "./lib/schema/typebox/gen/index.js"
95
+ },
96
+ "./package.json": "./package.json"
97
+ }
52
98
  },
53
99
  "sideEffects": false,
54
100
  "rollup": {
@@ -57,7 +103,9 @@
57
103
  "./src/server.ts",
58
104
  "./src/servers/ws.ts",
59
105
  "./src/servers/jsdom.ts",
60
- "./src/servers/node-fetch.ts"
106
+ "./src/servers/node-fetch.ts",
107
+ "./src/schema/typebox/index.ts",
108
+ "./src/schema/typebox/gen/index.ts"
61
109
  ],
62
110
  "external": [
63
111
  "crypto",
@@ -65,43 +113,10 @@
65
113
  "node-fetch",
66
114
  "ws",
67
115
  "https-proxy-agent",
68
- "undici"
116
+ "undici",
117
+ "zod",
118
+ "typescript",
119
+ "@sinclair/typebox"
69
120
  ]
70
- },
71
- "scripts": {
72
- "build": "make prepublish",
73
- "clean": "make clean",
74
- "dev": "make dev",
75
- "test": "make test"
76
- },
77
- "exports": {
78
- ".": {
79
- "types": "./src/index.ts",
80
- "typescript": "./src/index.ts",
81
- "system": "./dist/system/index.js",
82
- "import": "./lib/index.js"
83
- },
84
- "./types": {
85
- "types": "./types.d.ts"
86
- },
87
- "./server": {
88
- "types": "./src/server.ts",
89
- "typescript": "./src/server.ts",
90
- "system": "./dist/system/server.js",
91
- "import": "./lib/server.js"
92
- },
93
- "./server/node-fetch": {
94
- "types": "./server/node-fetch.ts",
95
- "default": "./lib/servers/node-fetch.js"
96
- },
97
- "./server/jsdom": {
98
- "types": "./server/jsdom.ts",
99
- "default": "./lib/servers/jsdom.js"
100
- },
101
- "./server/ws": {
102
- "types": "./server/ws.ts",
103
- "default": "./lib/servers/ws.js"
104
- },
105
- "./package.json": "./package.json"
106
121
  }
107
- }
122
+ }
package/src/index.ts CHANGED
@@ -32,6 +32,7 @@ export { isPromise } from './asyncs/isPromise';
32
32
  // langs
33
33
  export { shallowEqual } from './langs/shallowEqual';
34
34
  export { deepEqual } from './langs/deepEqual';
35
+ export { deepFreeze } from './langs/deepFreeze';
35
36
  export { classOf } from './langs/classOf';
36
37
  export { shallowClone } from './langs/shallowClone';
37
38
  export { isClass } from './langs/isClass';
@@ -79,8 +80,6 @@ export { getFileFromDataTransfer } from './browsers/getFileFromDataTransfer';
79
80
  // polyfills
80
81
  export { getGlobalThis } from './isomorphics/getGlobalThis';
81
82
  export { structuredClone } from './isomorphics/structuredClone';
82
- // should not export as sideEffect
83
- // export { globalThis } from './isomorphics/globalThis';
84
83
 
85
84
  // crypto
86
85
  export { randomUUID } from './crypto/randomUUID';
@@ -91,8 +90,9 @@ export { hex } from './crypto/base';
91
90
  export { isULID, createULID, ulid, parseULID } from './crypto/ulid';
92
91
  export { PEM } from './crypto/pem/pem';
93
92
 
94
- // misc
93
+ // math
95
94
  export { createRandom } from './maths/random';
95
+ export { clamp } from './maths/clamp';
96
96
 
97
97
  // network
98
98
  export {
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Freezes the given object and all its nested objects recursively.
3
+ *
4
+ * @param {T} obj - The object to freeze.
5
+ * @returns {T} - The frozen object.
6
+ */
7
+ export function deepFreeze<T>(obj: T): T {
8
+ if (obj === null || typeof obj !== 'object') {
9
+ return obj;
10
+ }
11
+ const props = Object.getOwnPropertyNames(obj);
12
+ for (const prop of props) {
13
+ const value = (obj as any)[prop];
14
+ if (value && typeof value === 'object') {
15
+ deepFreeze(value);
16
+ }
17
+ }
18
+ return Object.freeze(obj);
19
+ }
@@ -0,0 +1,125 @@
1
+ function sortObjectKeys(obj?: Record<string, any>) {
2
+ if (obj === null || obj === undefined) {
3
+ return obj;
4
+ }
5
+ if (typeof obj !== 'object') {
6
+ // it is a primitive: number/string (in an array)
7
+ return obj;
8
+ }
9
+ return Object.keys(obj)
10
+ .sort()
11
+ .reduce(
12
+ (acc, key) => {
13
+ if (Array.isArray(obj[key])) {
14
+ acc[key] = obj[key].map(sortObjectKeys);
15
+ } else if (typeof obj[key] === 'object') {
16
+ acc[key] = sortObjectKeys(obj[key]);
17
+ } else {
18
+ acc[key] = obj[key];
19
+ }
20
+ return acc;
21
+ },
22
+ {} as Record<string, any>,
23
+ );
24
+ }
25
+
26
+ function toDeterministicJson(o: any) {
27
+ // https://github.com/kikobeats/json-stringify-deterministic
28
+ // https://stackoverflow.com/a/54902696/1870054
29
+ // https://github.com/sinclairzx81/typebox#hash
30
+ // https://github.com/sinclairzx81/typebox/blob/master/src/value/hash.ts
31
+ // LCS longest common subsequence
32
+ // https://github.com/sinclairzx81/typebox/issues/272
33
+ let sorted: any = sortObjectKeys(o);
34
+ let out = JSON.stringify(sorted, function (_, v) {
35
+ return v === undefined ? 'undef' : v;
36
+ });
37
+
38
+ // Remove all whitespace
39
+ return out.replace(/\s+/g, '');
40
+ }
41
+
42
+ interface Visitor<C> {
43
+ array: (o: any[], ctx: C) => any;
44
+ object: (o: Record<string, any>, ctx: C) => any;
45
+ boolean: (o: boolean, ctx: C) => any;
46
+ number: (o: number, ctx: C) => any;
47
+ string: (o: string, ctx: C) => any;
48
+ symbol: (o: symbol, ctx: C) => any;
49
+ bigint: (o: bigint, ctx: C) => any;
50
+ date: (o: Date, ctx: C) => any;
51
+ buffer: (o: ArrayBuffer, ctx: C) => any;
52
+ null: (o: null, ctx: C) => any;
53
+ undefined: (o: undefined, ctx: C) => any;
54
+ unknown: (o: unknown, ctx: C) => any;
55
+ visit: (o: any, ctx: C) => any;
56
+ }
57
+
58
+ function visit<C>(o: any, _v: Partial<Visitor<C>>, ctx: C) {
59
+ const v = {
60
+ array: (o: any[], ctx: C): any => o.map((x) => v.visit(x, ctx)),
61
+ object: (o: Record<string, any>, ctx: C) => {
62
+ return Object.fromEntries(Object.entries(o).map(([k, v]) => [k, v.visit(v, ctx)]));
63
+ },
64
+ buffer: (o: ArrayBuffer) => {
65
+ return o;
66
+ },
67
+ boolean: (o: boolean) => o,
68
+ number: (o: number) => o,
69
+ string: (o: string) => o,
70
+ symbol: (o: symbol) => o,
71
+ bigint: (o: bigint) => o,
72
+ date: (o: Date) => o,
73
+ null: (o: null) => o,
74
+ undefined: (o: undefined) => o,
75
+ unknown: (o: unknown, ctx: C): any => {
76
+ if (o instanceof Map) {
77
+ return new Map([...o.entries()].map(([k, v]) => [k, v.visit(v, ctx)]));
78
+ }
79
+ if (o instanceof Set) {
80
+ return new Set([...o.values()].map((v) => v.visit(v, ctx)));
81
+ }
82
+ return o;
83
+ },
84
+ visit: (o: any, ctx: C): any => {
85
+ if (o === null) {
86
+ return v.null(o, ctx);
87
+ }
88
+ switch (typeof o) {
89
+ case 'object':
90
+ if (o instanceof ArrayBuffer) {
91
+ return v.buffer(o, ctx);
92
+ }
93
+ if (Array.isArray(o)) {
94
+ return v.array(o, ctx);
95
+ }
96
+ if (o instanceof Date) {
97
+ return v.date(o, ctx);
98
+ }
99
+ // plain object
100
+ if (o.constructor === Object) {
101
+ return v.object(o, ctx);
102
+ }
103
+ //
104
+ return v.unknown(o, ctx);
105
+ case 'boolean':
106
+ return v.boolean(o, ctx);
107
+ case 'number':
108
+ return v.number(o, ctx);
109
+ case 'string':
110
+ return v.string(o, ctx);
111
+ case 'symbol':
112
+ return v.symbol(o, ctx);
113
+ case 'bigint':
114
+ return v.bigint(o, ctx);
115
+ case 'undefined':
116
+ return v.undefined(o, ctx);
117
+ default:
118
+ return v.unknown(o, ctx);
119
+ }
120
+ },
121
+ ..._v,
122
+ };
123
+
124
+ return v.visit(o, ctx);
125
+ }
@@ -1 +1,3 @@
1
1
  - https://github.com/vercel/ms/blob/master/src/index.ts
2
+ - Apr 22, 2022
3
+ - dfd18036f359a3b80bf38d3d8c0bb850c0dc9b66
@@ -98,3 +98,124 @@ createLogger.writer = (record: LogRecord) => {
98
98
  const { level } = record;
99
99
  console[level || 'info'](stringify(record));
100
100
  };
101
+
102
+ // https://github.com/alexeyraspopov/picocolors/blob/main/picocolors.js
103
+ /*
104
+ MDN: Styling console output
105
+ https://developer.mozilla.org/en-US/docs/Web/API/console#Usage
106
+
107
+ Chrome: Console API Reference
108
+ https://developers.google.com/web/tools/chrome-devtools/console/console-write#styling_console_output_with_css
109
+
110
+ WebKit: Console Object API
111
+ https://webkit.org/web-inspector/console-object-api/
112
+
113
+ https://stackoverflow.com/questions/7505623
114
+
115
+ console.log('\x1b[36m Hello \x1b[34m Colored \x1b[35m World!');
116
+ console.log('\x1B[31mHello\x1B[34m World');
117
+ console.log('\x1b[43mHighlighted');
118
+
119
+
120
+ NestJS Formatter
121
+ https://github.com/nestjs/nest/blob/d4bda940fc10238eb18f14ebf66d66b7ef8bff41/packages/common/services/console-logger.service.ts#L201-L227
122
+
123
+ */
124
+
125
+ export type Formatter = (input: string | number | null | undefined) => string;
126
+
127
+ export interface Colors {
128
+ isColorSupported: boolean;
129
+ reset: Formatter;
130
+ bold: Formatter;
131
+ dim: Formatter;
132
+ italic: Formatter;
133
+ underline: Formatter;
134
+ inverse: Formatter;
135
+ hidden: Formatter;
136
+ strikethrough: Formatter;
137
+ black: Formatter;
138
+ red: Formatter;
139
+ green: Formatter;
140
+ yellow: Formatter;
141
+ blue: Formatter;
142
+ magenta: Formatter;
143
+ cyan: Formatter;
144
+ white: Formatter;
145
+ gray: Formatter;
146
+ bgBlack: Formatter;
147
+ bgRed: Formatter;
148
+ bgGreen: Formatter;
149
+ bgYellow: Formatter;
150
+ bgBlue: Formatter;
151
+ bgMagenta: Formatter;
152
+ bgCyan: Formatter;
153
+ bgWhite: Formatter;
154
+ }
155
+
156
+ let formatter =
157
+ (open: string, close: string, replace: string = open) =>
158
+ (input: string) => {
159
+ let string = '' + input;
160
+ let index = string.indexOf(close, open.length);
161
+ return ~index ? open + replaceClose(string, close, replace, index) + close : open + string + close;
162
+ };
163
+
164
+ let replaceClose = (string: string, close: string, replace: string, index: number): string => {
165
+ let start = string.substring(0, index) + replace;
166
+ let end = string.substring(index + close.length);
167
+ let nextIndex = end.indexOf(close);
168
+ return ~nextIndex ? start + replaceClose(end, close, replace, nextIndex) : start + end;
169
+ };
170
+
171
+ function getEnv(): Record<string, string | undefined> {
172
+ if (typeof process === 'object') {
173
+ return process.env;
174
+ }
175
+ return {};
176
+ }
177
+
178
+ function isColorSupported() {
179
+ if (typeof window === 'object') {
180
+ return true;
181
+ }
182
+ const env = getEnv();
183
+ if ('NO_COLOR' in env) {
184
+ return false;
185
+ }
186
+ if ('FORCE_COLOR' in env || 'CI' in env) {
187
+ return true;
188
+ }
189
+ return false;
190
+ }
191
+
192
+ export function createConsoleColors(enabled = isColorSupported()) {
193
+ return {
194
+ isColorSupported: enabled,
195
+ reset: enabled ? (s: string) => `\x1b[0m${s}\x1b[0m` : String,
196
+ bold: enabled ? formatter('\x1b[1m', '\x1b[22m', '\x1b[22m\x1b[1m') : String,
197
+ dim: enabled ? formatter('\x1b[2m', '\x1b[22m', '\x1b[22m\x1b[2m') : String,
198
+ italic: enabled ? formatter('\x1b[3m', '\x1b[23m') : String,
199
+ underline: enabled ? formatter('\x1b[4m', '\x1b[24m') : String,
200
+ inverse: enabled ? formatter('\x1b[7m', '\x1b[27m') : String,
201
+ hidden: enabled ? formatter('\x1b[8m', '\x1b[28m') : String,
202
+ strikethrough: enabled ? formatter('\x1b[9m', '\x1b[29m') : String,
203
+ black: enabled ? formatter('\x1b[30m', '\x1b[39m') : String,
204
+ red: enabled ? formatter('\x1b[31m', '\x1b[39m') : String,
205
+ green: enabled ? formatter('\x1b[32m', '\x1b[39m') : String,
206
+ yellow: enabled ? formatter('\x1b[33m', '\x1b[39m') : String,
207
+ blue: enabled ? formatter('\x1b[34m', '\x1b[39m') : String,
208
+ magenta: enabled ? formatter('\x1b[35m', '\x1b[39m') : String,
209
+ cyan: enabled ? formatter('\x1b[36m', '\x1b[39m') : String,
210
+ white: enabled ? formatter('\x1b[37m', '\x1b[39m') : String,
211
+ gray: enabled ? formatter('\x1b[90m', '\x1b[39m') : String,
212
+ bgBlack: enabled ? formatter('\x1b[40m', '\x1b[49m') : String,
213
+ bgRed: enabled ? formatter('\x1b[41m', '\x1b[49m') : String,
214
+ bgGreen: enabled ? formatter('\x1b[42m', '\x1b[49m') : String,
215
+ bgYellow: enabled ? formatter('\x1b[43m', '\x1b[49m') : String,
216
+ bgBlue: enabled ? formatter('\x1b[44m', '\x1b[49m') : String,
217
+ bgMagenta: enabled ? formatter('\x1b[45m', '\x1b[49m') : String,
218
+ bgCyan: enabled ? formatter('\x1b[46m', '\x1b[49m') : String,
219
+ bgWhite: enabled ? formatter('\x1b[47m', '\x1b[49m') : String,
220
+ };
221
+ }
@@ -0,0 +1,19 @@
1
+ import { expect, test } from 'vitest';
2
+ import { clamp } from './clamp';
3
+
4
+ test('clamp', () => {
5
+ for (const [a, b] of [
6
+ [[null, 0, 0], 0],
7
+ [[null, 1, 10], 1],
8
+ [[undefined, 1, 10], 1],
9
+ [[undefined, 1, 10, 5], 5],
10
+ [[2, 1, 10, 5], 2],
11
+ [[11, 1, 10, 5], 10],
12
+ [[11, { min: 1, max: 10 }], 10],
13
+ [[null, { min: 1, max: 10 }], 1],
14
+ [[null, { min: 1, max: 10, default: 5 }], 5],
15
+ [[2n, 1, 10, 5], 2n],
16
+ ]) {
17
+ expect(clamp.apply(null, a as any)).toBe(b);
18
+ }
19
+ });
@@ -1 +1,23 @@
1
- export function clamp() {}
1
+ // export function clamp<T>(value: T | null | undefined, o: { min: T; max: T; default?: T }): T;
2
+
3
+ export function clamp<T>(value: T | null | undefined, min: T, max: T, def?: T): T;
4
+ export function clamp<T>(value: T | null | undefined, ...o: any[]): T {
5
+ let min: T, max: T, def: T;
6
+ if (o.length === 1) {
7
+ ({ min, max, default: def = min! } = o[0]);
8
+ } else {
9
+ [min, max, def = min!] = o;
10
+ }
11
+ if (value === null || value === undefined) {
12
+ return def;
13
+ }
14
+ if (value < min) {
15
+ return min;
16
+ }
17
+ if (value > max) {
18
+ return max;
19
+ }
20
+ return value;
21
+ }
22
+
23
+ // type Comparable = number | string | Date | BigInt;
@@ -32,19 +32,19 @@ export type ResolveObjectPathType<
32
32
  > = Path extends keyof ObjectType
33
33
  ? ObjectType[Path]
34
34
  : Path extends `${infer LeftSide}.${infer RightSide}`
35
- ? LeftSide extends keyof ObjectType
36
- ? ResolveObjectPathType<ObjectType[LeftSide], RightSide, OrElse>
37
- : Path extends `${infer LeftSide}[${number}].${infer RightSide}`
38
35
  ? LeftSide extends keyof ObjectType
39
- ? ObjectType[LeftSide] extends Array<infer U>
40
- ? ResolveObjectPathType<U, RightSide, OrElse>
36
+ ? ResolveObjectPathType<ObjectType[LeftSide], RightSide, OrElse>
37
+ : Path extends `${infer LeftSide}[${number}].${infer RightSide}`
38
+ ? LeftSide extends keyof ObjectType
39
+ ? ObjectType[LeftSide] extends Array<infer U>
40
+ ? ResolveObjectPathType<U, RightSide, OrElse>
41
+ : OrElse
42
+ : OrElse
41
43
  : OrElse
42
- : OrElse
43
- : OrElse
44
- : Path extends `${infer LeftSide}[${number}]`
45
- ? LeftSide extends keyof ObjectType
46
- ? ObjectType[LeftSide] extends Array<infer U>
47
- ? U
48
- : OrElse
49
- : OrElse
50
- : OrElse;
44
+ : Path extends `${infer LeftSide}[${number}]`
45
+ ? LeftSide extends keyof ObjectType
46
+ ? ObjectType[LeftSide] extends Array<infer U>
47
+ ? U
48
+ : OrElse
49
+ : OrElse
50
+ : OrElse;
@@ -22,11 +22,11 @@ export function set<T extends object, V>(obj: T, key: ObjectKey | ObjectPath, va
22
22
  ? merge(current[k], val)
23
23
  : val
24
24
  : typeof (x = current[k]) === typeof path
25
- ? x
26
- : // @ts-expect-error hacky type check
27
- path[i] * 0 !== 0 || !!~('' + path[i]).indexOf('.') // eslint-disable-line
28
- ? {}
29
- : [];
25
+ ? x
26
+ : // @ts-expect-error hacky type check
27
+ path[i] * 0 !== 0 || !!~('' + path[i]).indexOf('.') // eslint-disable-line
28
+ ? {}
29
+ : [];
30
30
  }
31
31
  }
32
32