inray 0.0.7 → 0.0.9

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 (244) hide show
  1. package/LICENSE.md +32 -29
  2. package/README.md +522 -58
  3. package/dist/db-migrator/src/bin.js +1 -1
  4. package/dist/db-migrator/src/bin.js.map +1 -1
  5. package/dist/db-migrator/src/index.d.ts +1 -1
  6. package/dist/db-migrator/src/index.d.ts.map +1 -1
  7. package/dist/db-migrator/src/index.js +1 -1
  8. package/dist/db-migrator/src/index.js.map +1 -1
  9. package/dist/db-migrator/src/lib/clients/index.d.ts +3 -3
  10. package/dist/db-migrator/src/lib/clients/index.d.ts.map +1 -1
  11. package/dist/db-migrator/src/lib/clients/index.js +5 -4
  12. package/dist/db-migrator/src/lib/clients/index.js.map +1 -1
  13. package/dist/db-migrator/src/lib/clients/postgres.js +1 -1
  14. package/dist/db-migrator/src/lib/clients/postgres.js.map +1 -1
  15. package/dist/db-migrator/src/lib/clients/sqlite.d.ts +3 -0
  16. package/dist/db-migrator/src/lib/clients/sqlite.d.ts.map +1 -0
  17. package/dist/db-migrator/src/lib/clients/sqlite.js +55 -0
  18. package/dist/db-migrator/src/lib/clients/sqlite.js.map +1 -0
  19. package/dist/db-migrator/src/lib/migrator.sql.d.ts +4 -0
  20. package/dist/db-migrator/src/lib/migrator.sql.d.ts.map +1 -1
  21. package/dist/db-migrator/src/lib/migrator.sql.js +12 -0
  22. package/dist/db-migrator/src/lib/migrator.sql.js.map +1 -1
  23. package/dist/db-migrator/src/lib/migrator.types.d.ts +4 -2
  24. package/dist/db-migrator/src/lib/migrator.types.d.ts.map +1 -1
  25. package/dist/db-migrator/src/migrator.d.ts.map +1 -1
  26. package/dist/db-migrator/src/migrator.js +1 -0
  27. package/dist/db-migrator/src/migrator.js.map +1 -1
  28. package/dist/random/_pcg32.d.ts +61 -0
  29. package/dist/random/_pcg32.d.ts.map +1 -0
  30. package/dist/random/_pcg32.js +122 -0
  31. package/dist/random/_pcg32.js.map +1 -0
  32. package/dist/random/_platform.d.ts +12 -0
  33. package/dist/random/_platform.d.ts.map +1 -0
  34. package/dist/random/_platform.js +13 -0
  35. package/dist/random/_platform.js.map +1 -0
  36. package/dist/random/_seed_bytes_from_uint64.d.ts +15 -0
  37. package/dist/random/_seed_bytes_from_uint64.d.ts.map +1 -0
  38. package/dist/random/_seed_bytes_from_uint64.js +23 -0
  39. package/dist/random/_seed_bytes_from_uint64.js.map +1 -0
  40. package/dist/random/_test_utils.d.ts +15 -0
  41. package/dist/random/_test_utils.d.ts.map +1 -0
  42. package/dist/random/_test_utils.js +92 -0
  43. package/dist/random/_test_utils.js.map +1 -0
  44. package/dist/random/_types.d.ts +50 -0
  45. package/dist/random/_types.d.ts.map +1 -0
  46. package/dist/random/_types.js +10 -0
  47. package/dist/random/_types.js.map +1 -0
  48. package/dist/random/between.d.ts +33 -0
  49. package/dist/random/between.d.ts.map +1 -0
  50. package/dist/random/between.js +44 -0
  51. package/dist/random/between.js.map +1 -0
  52. package/dist/random/get_random_values_seeded.d.ts +31 -0
  53. package/dist/random/get_random_values_seeded.d.ts.map +1 -0
  54. package/dist/random/get_random_values_seeded.js +34 -0
  55. package/dist/random/get_random_values_seeded.js.map +1 -0
  56. package/dist/random/integer_between.d.ts +33 -0
  57. package/dist/random/integer_between.d.ts.map +1 -0
  58. package/dist/random/integer_between.js +34 -0
  59. package/dist/random/integer_between.js.map +1 -0
  60. package/dist/random/internal/_testing.d.ts +15 -0
  61. package/dist/random/internal/_testing.d.ts.map +1 -0
  62. package/dist/random/internal/_testing.js +27 -0
  63. package/dist/random/internal/_testing.js.map +1 -0
  64. package/dist/random/mod.d.ts +45 -0
  65. package/dist/random/mod.d.ts.map +1 -0
  66. package/dist/random/mod.js +46 -0
  67. package/dist/random/mod.js.map +1 -0
  68. package/dist/random/next_float_64.d.ts +38 -0
  69. package/dist/random/next_float_64.d.ts.map +1 -0
  70. package/dist/random/next_float_64.js +47 -0
  71. package/dist/random/next_float_64.js.map +1 -0
  72. package/dist/random/sample.d.ts +58 -0
  73. package/dist/random/sample.d.ts.map +1 -0
  74. package/dist/random/sample.js +69 -0
  75. package/dist/random/sample.js.map +1 -0
  76. package/dist/random/seeded.d.ts +34 -0
  77. package/dist/random/seeded.d.ts.map +1 -0
  78. package/dist/random/seeded.js +37 -0
  79. package/dist/random/seeded.js.map +1 -0
  80. package/dist/random/shuffle.d.ts +35 -0
  81. package/dist/random/shuffle.d.ts.map +1 -0
  82. package/dist/random/shuffle.js +48 -0
  83. package/dist/random/shuffle.js.map +1 -0
  84. package/dist/semver/_constants.d.ts +20 -0
  85. package/dist/semver/_constants.d.ts.map +1 -0
  86. package/dist/semver/_constants.js +28 -0
  87. package/dist/semver/_constants.js.map +1 -0
  88. package/dist/semver/_shared.d.ts +52 -0
  89. package/dist/semver/_shared.d.ts.map +1 -0
  90. package/dist/semver/_shared.js +168 -0
  91. package/dist/semver/_shared.js.map +1 -0
  92. package/dist/semver/_test_comparator_set.d.ts +11 -0
  93. package/dist/semver/_test_comparator_set.d.ts.map +1 -0
  94. package/dist/semver/_test_comparator_set.js +62 -0
  95. package/dist/semver/_test_comparator_set.js.map +1 -0
  96. package/dist/semver/can_parse.d.ts +24 -0
  97. package/dist/semver/can_parse.d.ts.map +1 -0
  98. package/dist/semver/can_parse.js +34 -0
  99. package/dist/semver/can_parse.js.map +1 -0
  100. package/dist/semver/compare.d.ts +35 -0
  101. package/dist/semver/compare.d.ts.map +1 -0
  102. package/dist/semver/compare.js +43 -0
  103. package/dist/semver/compare.js.map +1 -0
  104. package/dist/semver/difference.d.ts +34 -0
  105. package/dist/semver/difference.d.ts.map +1 -0
  106. package/dist/semver/difference.js +48 -0
  107. package/dist/semver/difference.js.map +1 -0
  108. package/dist/semver/equals.d.ts +31 -0
  109. package/dist/semver/equals.d.ts.map +1 -0
  110. package/dist/semver/equals.js +34 -0
  111. package/dist/semver/equals.js.map +1 -0
  112. package/dist/semver/format.d.ts +29 -0
  113. package/dist/semver/format.d.ts.map +1 -0
  114. package/dist/semver/format.js +40 -0
  115. package/dist/semver/format.js.map +1 -0
  116. package/dist/semver/format_range.d.ts +25 -0
  117. package/dist/semver/format_range.d.ts.map +1 -0
  118. package/dist/semver/format_range.js +33 -0
  119. package/dist/semver/format_range.js.map +1 -0
  120. package/dist/semver/greater_or_equal.d.ts +32 -0
  121. package/dist/semver/greater_or_equal.d.ts.map +1 -0
  122. package/dist/semver/greater_or_equal.js +34 -0
  123. package/dist/semver/greater_or_equal.js.map +1 -0
  124. package/dist/semver/greater_than.d.ts +32 -0
  125. package/dist/semver/greater_than.d.ts.map +1 -0
  126. package/dist/semver/greater_than.js +34 -0
  127. package/dist/semver/greater_than.js.map +1 -0
  128. package/dist/semver/greater_than_range.d.ts +30 -0
  129. package/dist/semver/greater_than_range.d.ts.map +1 -0
  130. package/dist/semver/greater_than_range.js +64 -0
  131. package/dist/semver/greater_than_range.js.map +1 -0
  132. package/dist/semver/increment.d.ts +61 -0
  133. package/dist/semver/increment.d.ts.map +1 -0
  134. package/dist/semver/increment.js +186 -0
  135. package/dist/semver/increment.js.map +1 -0
  136. package/dist/semver/is_range.d.ts +30 -0
  137. package/dist/semver/is_range.d.ts.map +1 -0
  138. package/dist/semver/is_range.js +42 -0
  139. package/dist/semver/is_range.js.map +1 -0
  140. package/dist/semver/is_semver.d.ts +41 -0
  141. package/dist/semver/is_semver.d.ts.map +1 -0
  142. package/dist/semver/is_semver.js +60 -0
  143. package/dist/semver/is_semver.js.map +1 -0
  144. package/dist/semver/less_or_equal.d.ts +32 -0
  145. package/dist/semver/less_or_equal.d.ts.map +1 -0
  146. package/dist/semver/less_or_equal.js +34 -0
  147. package/dist/semver/less_or_equal.js.map +1 -0
  148. package/dist/semver/less_than.d.ts +32 -0
  149. package/dist/semver/less_than.d.ts.map +1 -0
  150. package/dist/semver/less_than.js +34 -0
  151. package/dist/semver/less_than.js.map +1 -0
  152. package/dist/semver/less_than_range.d.ts +30 -0
  153. package/dist/semver/less_than_range.d.ts.map +1 -0
  154. package/dist/semver/less_than_range.js +64 -0
  155. package/dist/semver/less_than_range.js.map +1 -0
  156. package/dist/semver/max_satisfying.d.ts +29 -0
  157. package/dist/semver/max_satisfying.d.ts.map +1 -0
  158. package/dist/semver/max_satisfying.js +38 -0
  159. package/dist/semver/max_satisfying.js.map +1 -0
  160. package/dist/semver/min_satisfying.d.ts +29 -0
  161. package/dist/semver/min_satisfying.d.ts.map +1 -0
  162. package/dist/semver/min_satisfying.js +38 -0
  163. package/dist/semver/min_satisfying.js.map +1 -0
  164. package/dist/semver/mod.d.ts +305 -0
  165. package/dist/semver/mod.d.ts.map +1 -0
  166. package/dist/semver/mod.js +306 -0
  167. package/dist/semver/mod.js.map +1 -0
  168. package/dist/semver/not_equals.d.ts +31 -0
  169. package/dist/semver/not_equals.d.ts.map +1 -0
  170. package/dist/semver/not_equals.js +33 -0
  171. package/dist/semver/not_equals.js.map +1 -0
  172. package/dist/semver/parse.d.ts +32 -0
  173. package/dist/semver/parse.d.ts.map +1 -0
  174. package/dist/semver/parse.js +50 -0
  175. package/dist/semver/parse.js.map +1 -0
  176. package/dist/semver/parse_range.d.ts +34 -0
  177. package/dist/semver/parse_range.d.ts.map +1 -0
  178. package/dist/semver/parse_range.js +352 -0
  179. package/dist/semver/parse_range.js.map +1 -0
  180. package/dist/semver/range_intersects.d.ts +32 -0
  181. package/dist/semver/range_intersects.d.ts.map +1 -0
  182. package/dist/semver/range_intersects.js +89 -0
  183. package/dist/semver/range_intersects.js.map +1 -0
  184. package/dist/semver/satisfies.d.ts +31 -0
  185. package/dist/semver/satisfies.d.ts.map +1 -0
  186. package/dist/semver/satisfies.js +33 -0
  187. package/dist/semver/satisfies.js.map +1 -0
  188. package/dist/semver/try_parse.d.ts +28 -0
  189. package/dist/semver/try_parse.d.ts.map +1 -0
  190. package/dist/semver/try_parse.js +35 -0
  191. package/dist/semver/try_parse.js.map +1 -0
  192. package/dist/semver/try_parse_range.d.ts +31 -0
  193. package/dist/semver/try_parse_range.d.ts.map +1 -0
  194. package/dist/semver/try_parse_range.js +40 -0
  195. package/dist/semver/try_parse_range.js.map +1 -0
  196. package/dist/semver/types.d.ts +66 -0
  197. package/dist/semver/types.d.ts.map +1 -0
  198. package/dist/semver/types.js +10 -0
  199. package/dist/semver/types.js.map +1 -0
  200. package/dist/text/_util.d.ts +11 -0
  201. package/dist/text/_util.d.ts.map +1 -0
  202. package/dist/text/_util.js +21 -0
  203. package/dist/text/_util.js.map +1 -0
  204. package/dist/text/closest_string.d.ts +49 -0
  205. package/dist/text/closest_string.d.ts.map +1 -0
  206. package/dist/text/closest_string.js +51 -0
  207. package/dist/text/closest_string.js.map +1 -0
  208. package/dist/text/compare_similarity.d.ts +54 -0
  209. package/dist/text/compare_similarity.d.ts.map +1 -0
  210. package/dist/text/compare_similarity.js +45 -0
  211. package/dist/text/compare_similarity.js.map +1 -0
  212. package/dist/text/levenshtein_distance.d.ts +30 -0
  213. package/dist/text/levenshtein_distance.d.ts.map +1 -0
  214. package/dist/text/levenshtein_distance.js +134 -0
  215. package/dist/text/levenshtein_distance.js.map +1 -0
  216. package/dist/text/mod.d.ts +34 -0
  217. package/dist/text/mod.d.ts.map +1 -0
  218. package/dist/text/mod.js +35 -0
  219. package/dist/text/mod.js.map +1 -0
  220. package/dist/text/to_camel_case.d.ts +23 -0
  221. package/dist/text/to_camel_case.d.ts.map +1 -0
  222. package/dist/text/to_camel_case.js +29 -0
  223. package/dist/text/to_camel_case.js.map +1 -0
  224. package/dist/text/to_kebab_case.d.ts +23 -0
  225. package/dist/text/to_kebab_case.d.ts.map +1 -0
  226. package/dist/text/to_kebab_case.js +28 -0
  227. package/dist/text/to_kebab_case.js.map +1 -0
  228. package/dist/text/to_pascal_case.d.ts +23 -0
  229. package/dist/text/to_pascal_case.d.ts.map +1 -0
  230. package/dist/text/to_pascal_case.js +28 -0
  231. package/dist/text/to_pascal_case.js.map +1 -0
  232. package/dist/text/to_snake_case.d.ts +23 -0
  233. package/dist/text/to_snake_case.d.ts.map +1 -0
  234. package/dist/text/to_snake_case.js +28 -0
  235. package/dist/text/to_snake_case.js.map +1 -0
  236. package/dist/text/truncate.d.ts +81 -0
  237. package/dist/text/truncate.d.ts.map +1 -0
  238. package/dist/text/truncate.js +116 -0
  239. package/dist/text/truncate.js.map +1 -0
  240. package/dist/text/word_similarity_sort.d.ts +46 -0
  241. package/dist/text/word_similarity_sort.d.ts.map +1 -0
  242. package/dist/text/word_similarity_sort.js +47 -0
  243. package/dist/text/word_similarity_sort.js.map +1 -0
  244. package/package.json +27 -2
package/README.md CHANGED
@@ -9,7 +9,7 @@ Inray - all-in-one инструментарий для разработки **No
9
9
  - [Текущий состав SDK](#текущий-состав-sdk)
10
10
  - [Обновления и версионирование](#обновления-и-версионирование)
11
11
  - [Документация](#документация-и-примеры-использования)
12
- - [Совместимость c Runtime](#совместимость-c-runtime)
12
+ - [Совместимость](#совместимость)
13
13
  - [Лицензирование](#лицензирование)
14
14
  - [Благодарность](#благодарность)
15
15
 
@@ -91,6 +91,9 @@ Inray - all-in-one инструментарий для разработки **No
91
91
  | Различные инструменты и вспомогательные функции общего назначения | /utils | <span style="color:blue">III</span> | - | |
92
92
  | Кеширование | /caching | <span style="color:blue">III</span> | [cache-manager (и его части)](https://cacheable.org/) | |
93
93
  | Обработка аргументов командной строки (CLI) | /cli | <span style="color:green">II</span> | [commander.js](https://github.com/tj/commander.js) | |
94
+ | Функции рандомизации | /random | <span style="color:green">II</span> | [@std/random](https://jsr.io/@std/random/doc) | |
95
+ | Функции для работы с SemVer | /semver | <span style="color:green">II</span> | [@std/semver](https://jsr.io/@std/semver/doc) | |
96
+ | Дополнительные функции для работы с текстом | /text | <span style="color:green">II</span> | [@std/text](https://jsr.io/@std/text/doc) | |
94
97
 
95
98
  \* _уровень может отображать как итог, так и процесс_
96
99
 
@@ -121,103 +124,560 @@ In progress 🛠️...
121
124
 
122
125
  ## Документация и примеры использования
123
126
 
124
- In progress 🛠️...
127
+ Краткий обзор публичного API. Импорт - через namespace `inray/...`.
125
128
 
126
129
  ### inray/async - асинхронные функции
127
130
 
128
- In progress 🛠️...
131
+ Вспомогательные функции для промисов и async-итераторов:
132
+
133
+ - `delay` - пауза
134
+ - `deadline` - таймаут для Promise
135
+ - `abortable` (отменяемый через `AbortSignal`)
136
+ - `retry` (повторы с [backoff](https://en.wikipedia.org/wiki/Exponential_backoff))
137
+ - `debounce`
138
+ - `poll` - ожидание условия
139
+ - `pooledMap` - пул параллельных задач
140
+ - `tee` - разветвление async-итератора (gen -> branch1, branch2...
141
+ - `MuxAsyncIterator` - мультиплекс нескольких итераторов
142
+ - `Channel` - канал send/receive (ну или producer/consumer)
143
+ - `allKeyed` / `allSettledKeyed` resolve словаря промисов по ключам (аналог `Promise.all` для record)
144
+ - `Lazy` - ленивая однократная инициализация значения
145
+
146
+ ```ts
147
+ import { delay, retry, allKeyed } from 'inray/async';
148
+
149
+ await delay(100);
150
+
151
+ const user = await retry(() => fetch('/api/user').then((r) => r.json()), { maxAttempts: 3 });
152
+
153
+ const { posts, comments } = await allKeyed({
154
+ posts: fetch('/api/posts').then((r) => r.json()),
155
+ comments: fetch('/api/comments').then((r) => r.json())
156
+ });
157
+ ```
129
158
 
130
159
  ### inray/bytes - работа с байтами
131
160
 
132
- In progress 🛠️...
161
+ Операции над `Uint8Array`:
162
+
163
+ - `concat` склеивает байты
164
+ - `copy` копирует в destination со смещением
165
+ - `repeat` повторяет байты
166
+ - `equals` сравнивает байты
167
+ - плюс функции поиска и префиксы/суффиксы (как у строк) - `indexOfNeedle`, `lastIndexOfNeedle`, `includesNeedle`, `startsWith`, `endsWith`
168
+
169
+ ```ts
170
+ import { concat, indexOfNeedle, endsWith } from 'inray/bytes';
171
+
172
+ const a = new Uint8Array([0, 1, 2]);
173
+ const b = new Uint8Array([3, 4, 5]);
174
+ const c = concat([a, b]); // Uint8Array([0, 1, 2, 3, 4, 5])
175
+
176
+ indexOfNeedle(c, new Uint8Array([2, 3])); // 2
177
+ endsWith(c, b); // true
178
+ ```
133
179
 
134
180
  ### inray/caching - кеширование
135
181
 
136
- In progress 🛠️...
182
+ _Оригинальная библиотека - cache-manager_
183
+
184
+ `createCache` создаёт многослойный кеш _Cache_ (по умолчанию в памяти, как и в оригинальной библиотеке - инстанс `Keyv`)
185
+
186
+ `Cache` предоставляет основные методы для управления данными - `get` / `mget`, `set` / `mset`, `del` / `mdel`, `ttl`, `clear`, `wrap`, `on` / `off` (события), `disconnect`, `cacheId`, `stores`
187
+
188
+ Так-же предоставляется возможность использование внешнего хранилища, через реализацию `KeyvAdapter`
189
+
190
+ Как и в оригинальной библиотеке _cache-manaher_ низкоуровневый key-value (`Keyv`) доступен отдельно из `inray/caching/keyv`
191
+
192
+ ```ts
193
+ import { createCache } from 'inray/caching';
194
+
195
+ const cache = createCache({ ttl: 60_000 });
196
+
197
+ await cache.set('user:1', { name: 'Bob' });
198
+ const bob = await cache.get<{ name: string }>('user:1');
199
+ ```
137
200
 
138
201
  ### inray/cli - CLI приложения
139
202
 
140
- In progress 🛠️...
203
+ Это порт на TypeScript известной библиотеки [commander.js](https://github.com/tj/commander.js) версии _15.0_
204
+
205
+ Добавление новой документации - In progress 🛠️...
141
206
 
142
207
  ### inray/collections - коллекции и вспомогательные функции для работы с итерируемыми объектами
143
208
 
144
- In progress 🛠️...
209
+ Чистые функции для массивов и объектов (в духе Kotlin Collections / Lodash).
210
+
211
+ Группировка и индексирование - `aggregateGroups`, `associateBy`, `associateWith`, `reduceGroups`
212
+
213
+ Выбор и фильтрация - `distinct`, `distinctBy`, `dropWhile`, `dropLastWhile`, `takeWhile`, `takeLastWhile`, `filterEntries`, `filterKeys`, `filterValues`, `findSingle`, `firstNotNullishOf`, `includesValue`, `omit`, `pick`, `withoutAll`
214
+
215
+ Преобразования - `chunk`, `mapEntries`, `mapKeys`, `mapValues`, `mapNotNullish`, `invert`, `invertBy`, `partition`, `partitionEntries`, `unzip`, `zip`, `interleave`, `slidingWindows`, `permutations`, `joinToString`, `runningReduce`, `deepMerge`, `sortBy`, `sample`
216
+
217
+ Множества и агрегация - `intersect`, `union`, `maxBy`, `maxOf`, `maxWith`, `minBy`, `minOf`, `minWith`, `sumOf`
218
+
219
+ ```ts
220
+ import { intersect, pick, chunk } from 'inray/collections';
221
+
222
+ intersect(['Cooking', 'Music', 'Hiking'], ['Music', 'Tennis', 'Cooking']);
223
+ // ["Cooking", "Music"]
224
+
225
+ pick({ name: 'Lulu', age: 3, breed: 'Ragdoll' }, ['name', 'breed']);
226
+ // { name: "Lulu", breed: "Ragdoll" }
227
+
228
+ chunk([1, 2, 3, 4, 5], 2); // [[1, 2], [3, 4], [5]]
229
+ ```
145
230
 
146
231
  ### inray/csv - работа с CSV-файлами
147
232
 
148
- In progress 🛠️...
233
+ Парсинг и сериализация CSV:
234
+
235
+ - `parse` читает строку в массив массивов или объектов (`skipFirstRow`, `columns`, `separator`, `comment`)
236
+ - `stringify` пишет данные обратно в CSV
237
+ - для больших файлов - возможно использование потоков - `CsvParseStream` и `CsvStringifyStream`
238
+
239
+ ```ts
240
+ import { parse, stringify } from 'inray/csv';
241
+
242
+ parse('a,b,c\nd,e,f', { skipFirstRow: true });
243
+ // [{ a: "d", b: "e", c: "f" }]
244
+
245
+ stringify(
246
+ [
247
+ { name: 'john', age: '30' },
248
+ { name: 'mary', age: '25' }
249
+ ],
250
+ { columns: ['name', 'age'] }
251
+ );
252
+ // "name,age\r\njohn,30\r\nmary,25\r\n"
253
+ ```
254
+
255
+ ```ts
256
+ import { ReadableStream } from 'node:stream/web';
257
+ import { CsvParseStream } from 'inray/csv';
258
+
259
+ const source = ReadableStream.from(['name,age\n', 'john,30\n', 'mary,25\n']);
260
+ const records = await Array.fromAsync(source.pipeThrough(new CsvParseStream({ skipFirstRow: true })));
261
+ ```
149
262
 
150
263
  ### inray/data-structures - обобщенные структуры данных
151
264
 
152
- In progress 🛠️...
265
+ Некоторые структуры для алгоритмов:
266
+
267
+ - `BinarySearchTree` (поиск/вставка/удаление, `min`/`max`)
268
+ - сбалансированное `RedBlackTree`
269
+ - приоритетная очередь `BinaryHeap` (`push`/`pop`/`peek`)
270
+ - двусторонняя очередь `Deque`
271
+
272
+ Для задания порядка используются специальные компараторы - `ascend` и `descend`
273
+
274
+ ```ts
275
+ import { BinarySearchTree, BinaryHeap, ascend } from 'inray/data-structures';
276
+
277
+ const tree = new BinarySearchTree<number>();
278
+ [3, 10, 4, 1, 7].forEach((v) => tree.insert(v));
279
+ tree.min(); // 1
280
+ tree.find(7); // 7
281
+ [...tree]; // [1, 3, 4, 7, 10]
282
+
283
+ const heap = new BinaryHeap<number>(ascend);
284
+ heap.push(4, 1, 3);
285
+ heap.peek(); // 1
286
+ ```
153
287
 
154
288
  ### inray/date-fns - работа с датой и временем
155
289
 
156
- In progress 🛠️...
290
+ Поставка легендарной библиотеки для работы с датой и временем - [_date-fns_](https://date-fns.org/) (версии 4.4.0)
291
+
292
+ Добавление новой документации - In progress 🛠️...
157
293
 
158
294
  ### inray/db, inray/db/postgres, inray/db-migrator - работа с БД
159
295
 
160
- In progress 🛠️...
296
+ `inray/db/postgres` - драйвер [postgres.js](https://github.com/porsager/postgres). Исходный код драйвера (JS, ESM) поставляется как есть (единственный такой в inray)
297
+
298
+ `inray/db-migrator` - мигратор применяет SQL/TS-миграции. CLI доступен через `inray-migrator`
299
+
300
+ Добавление новой документации - In progress 🛠️...
301
+
302
+ ```ts
303
+ import postgres from 'inray/db/postgres';
304
+
305
+ const sql = postgres({ host: 'localhost', database: 'app', user: 'app' });
306
+ const [user] = await sql<{ id: number; name: string }[]>`
307
+ select * from users where id = ${1}
308
+ `;
309
+ await sql.end();
310
+ ```
161
311
 
162
312
  ### inray/encoding - кодирование и декодирование данных
163
313
 
164
- In progress 🛠️...
314
+ Кодирование и декодирование некоторых популярных форматов:
315
+
316
+ - `encodeHex` / `decodeHex`
317
+ - `encodeBase32` / `decodeBase32`
318
+ - `encodeBase58` / `decodeBase58`
319
+ - `encodeBase64` / `decodeBase64` и URL-safe версия `encodeBase64Url` / `decodeBase64Url`
320
+ - `encodeAscii85` / `decodeAscii85`
321
+ - Protobuf-подобные varint: `encodeVarint`, `decodeVarint`, `decodeVarint32`
322
+ - лимиты - `MaxUint64`, `MaxVarintLen32`, `MaxVarintLen64`
323
+
324
+ ```ts
325
+ import { encodeHex, decodeHex, encodeBase64Url, encodeVarint } from 'inray/encoding';
326
+
327
+ encodeHex('Hello world!'); // "48656c6c6f20776f726c6421"
328
+ new TextDecoder().decode(decodeHex('48656c6c6f20776f726c6421')); // "Hello world!"
329
+
330
+ encodeBase64Url('ice creams'); // "aWNlIGNyZWFtcw" - URL-safe
331
+ encodeVarint(9601n); // [Uint8Array([129, 75]), 2]
332
+ ```
165
333
 
166
334
  ### inray/fmt/bytes, inray/fmt/colors, inray/fmt/duration - функции строкового представления различных данных
167
335
 
168
- In progress 🛠️...
336
+ - `inray/fmt/bytes`, `format` превращает число байт в человекочитаемую строку (`1.34 kB`), с различными опцииями
337
+ - `inray/fmt/duration`, `format` переводит миллисекунды в длительность (`"1m 39s 674ms"`)
338
+ - `inray/fmt/colors`, ANSI-цвета и стили
339
+
340
+ ```ts
341
+ import { format as formatBytes } from 'inray/fmt/bytes';
342
+ import { format as formatDuration } from 'inray/fmt/duration';
343
+ import { bold, red, bgBlue } from 'inray/fmt/colors';
344
+
345
+ formatBytes(1337); // "1.34 kB"
346
+ formatDuration(99674, { ignoreZero: true }); // "1m 39s 674ms"
347
+ console.log(bgBlue(bold(red('Hello, World!'))));
348
+ ```
169
349
 
170
350
  ### inray/hono - веб-фреймворк Hono и его части
171
351
 
172
- In progress 🛠️...
352
+ [Hono](https://hono.dev/docs/) - фреймворк построенный на веб-стандартах для реализации. Версия 4.13.5
173
353
 
174
- ### inray/jose - набор криптографический функций в рамках библиотеки jose
354
+ Добавление новой документации - In progress 🛠️...
175
355
 
176
- In progress 🛠️...
356
+ ### inray/jose - криптография
357
+
358
+ Библиотека криптографических функций [jose](https://github.com/panva/jose). Поставляется как есть, версия 6.2.8
359
+
360
+ Добавление новой документации - In progress 🛠️...
177
361
 
178
362
  ### inray/json - дополнительные хелперы для работы с JSON
179
363
 
180
- In progress 🛠️...
364
+ Доп. функции для работы с JSON/NDJSON:
365
+
366
+ - `JsonParseStream` преобразует поток в объекты,
367
+ - `JsonStringifyStream` сериализует объекты в поток (NDJSON)
368
+ - `ConcatenatedJsonParseStream` читает склеенные JSON-значения без разделителей
369
+
370
+ ```ts
371
+ import { ReadableStream } from 'node:stream/web';
372
+ import { JsonStringifyStream, canonicalize } from 'inray/json';
373
+
374
+ const encoded = ReadableStream.from([{ foo: 'bar' }, { baz: 100 }]).pipeThrough(new JsonStringifyStream());
375
+ await Array.fromAsync(encoded); // ['{"foo":"bar"}\n', '{"baz":100}\n']
376
+
377
+ canonicalize({ a: 1, A: 2, '1': 3 }); // '{"1":3,"A":2,"a":1}'
378
+ ```
181
379
 
182
380
  ### inray/jsonc - парсинг JSONC файлов
183
381
 
184
- In progress 🛠️...
382
+ Единственная функция - `parse` позволяет читает JSON with Comments (включающие комментарии `//` и `/* */`, висячие запятые)
383
+
384
+ Сериализация JSONC не поддерживается
385
+
386
+ ```ts
387
+ import { parse } from 'inray/jsonc';
388
+
389
+ parse('{"foo": "bar", } // comment'); // { foo: "bar" }
390
+ parse('{"foo": "bar", } /* block */'); // { foo: "bar" }
391
+ ```
185
392
 
186
393
  ### inray/logtape - логгер logtape и его части
187
394
 
188
- In progress 🛠️...
395
+ Продвинутый логгер [logTape](https://logtape.org/). Предоставляемая версия - 2.3.2
396
+
397
+ Включает пакеты для конфигурации и направления потока логов:
398
+
399
+ - logtape/config - конфигурация
400
+ - logtape/file - направление в файлы
401
+ - logtape/pretty - управление внешним видом
402
+ - logtape/redaction - скрытие данных внутри лога
403
+ - logtape/syslog - для системных логов (RFC 5424)
404
+
405
+ Добавление новой документации - In progress 🛠️...
189
406
 
190
407
  ### inray/media-types - работа с "content-type" и MIME
191
408
 
192
- In progress 🛠️...
409
+ MIME-утилиты:
410
+
411
+ - `contentType` - полный `Content-Type` по расширению или типу
412
+ - `parseMediaType` и `formatMediaType` - разбор и сборка заголовка
413
+
414
+ ```ts
415
+ import { contentType, allExtensions, getCharset, parseMediaType } from 'inray/media-types';
416
+
417
+ allExtensions('application/json'); // ["json", "map"]
418
+ contentType('.json'); // "application/json; charset=UTF-8"
419
+ getCharset('text/plain'); // "UTF-8"
420
+ parseMediaType('text/html; charset=UTF-8'); // ["text/html", { charset: "UTF-8" }]
421
+ ```
193
422
 
194
423
  ### inray/node-cron - задачи по расписанию в рамках библиотеки node-cron
195
424
 
196
- In progress 🛠️...
425
+ Форк библиотеки [node-cron](https://www.nodecron.com/), версии _4.6.0_. Планировщик cron-задач, API сохранён, однако
426
+ в будущем библиотека претерпит изменения
427
+
428
+ ```ts
429
+ import cron, { validate } from 'inray/node-cron';
430
+
431
+ validate('*/5 * * * * *'); // true
432
+
433
+ const task = cron.schedule('*/5 * * * * *', () => {
434
+ console.log('every 5 seconds');
435
+ });
436
+
437
+ await cron.shutdown();
438
+ ```
197
439
 
198
440
  ### inray/phonenumbers - парсинг и валидация телефонных номеров
199
441
 
200
- In progress 🛠️...
442
+ Форк библиотеки [libphonenumber.js](https://gitlab.com/catamphetamine/libphonenumber-js) переписанный на TypeScript (с существенным рефакторингом, в будущем - ещё бОльшим)
443
+ Парсинг E.164 / национальных номеров (libphonenumber):
444
+
445
+ - `parsePhoneNumber` (без throw)
446
+ - `parsePhoneNumberWithError`
447
+ - проверки `isValidPhoneNumber`, `isPossiblePhoneNumber`, `validatePhoneNumberLength`
448
+ - поиск в тексте - `findPhoneNumbersInText`, `searchPhoneNumbersInText`, `PhoneNumberMatcher`
449
+ - метаданные стран: `getCountries`, `isSupportedCountry`, `getCountryCallingCode`, `getExtPrefix`, `getExampleNumber`
450
+ - неполный ввод: `parseIncompletePhoneNumber`, `parsePhoneNumberCharacter`, `parseDigits`
451
+ - работа с RFC 3966 - `parseRFC3966` / `formatRFC3966`
452
+ - объект `PhoneNumber` содержит методы `isValid`, `isPossible`, `getType`, `format`, `formatNational`, `formatInternational`
453
+
454
+ ```ts
455
+ import { parsePhoneNumber, isValidPhoneNumber, findPhoneNumbersInText } from 'inray/phonenumbers';
456
+
457
+ isValidPhoneNumber('+12133734253'); // true
458
+
459
+ const phone = parsePhoneNumber('8 (800) 555-35-35', { defaultCountry: 'RU' });
460
+ phone?.formatInternational(); // "+7 800 555 35 35"
461
+ phone?.country; // "RU"
462
+
463
+ findPhoneNumbersInText('Call +1-213-373-4253 tomorrow');
464
+ ```
465
+
466
+ ### inray/random - функции рандомизации
467
+
468
+ Генерация случайных значений с опциональным [PRNG](https://en.wikipedia.org/wiki/Pseudorandom_number_generator):
469
+
470
+ - `randomBetween`
471
+ - `randomIntegerBetween`
472
+ - `sample` - случайный элемент массива
473
+ - `shuffle` - перетасовать массив
474
+
475
+ ```ts
476
+ import { randomIntegerBetween, randomSeeded, shuffle } from 'inray/random';
477
+
478
+ const prng = randomSeeded(1n);
479
+ randomIntegerBetween(1, 10, { prng }); // 3 - стабильно для того же seed
480
+
481
+ shuffle(['a', 'b', 'c'], { prng });
482
+ ```
483
+
484
+ ### inray/semver - работа с SemVer
485
+
486
+ Функции для работы SemVer 2.0 (обозначениями версионирования):
487
+
488
+ - `parse` / `tryParse` / `canParse`, `format` - конкретная версия
489
+ - `parseRange` / `tryParseRange` / `formatRange` / `isRange` - диапазоны версий
490
+ - `compare`, `equals`, `notEquals`, `greaterThan`, `greaterOrEqual`, `lessThan`, `lessOrEqual`, `difference` - сравнение версий
491
+ - `satisfies`, `maxSatisfying`, `minSatisfying`, `rangeIntersects`, `greaterThanRange`, `lessThanRange` - проверки диапазона
492
+ - `increment` - повышение версии (bump)
493
+ - `isSemVer` - проверка объекта (является-ли оно SemVer)
494
+
495
+ ```ts
496
+ import { parse, parseRange, greaterThan, satisfies, increment, format } from 'inray/semver';
497
+
498
+ const v = parse('1.2.3');
499
+ format(v); // "1.2.3"
500
+ greaterThan(parse('1.2.3'), parse('9.8.7')); // false
501
+
502
+ const range = parseRange('^1.2.3');
503
+ satisfies(parse('1.4.0'), range); // true
504
+ format(increment(v, 'minor')); // "1.3.0"
505
+ ```
201
506
 
202
507
  ### inray/streams - работа с потоками (Stream)
203
508
 
204
- In progress 🛠️...
509
+ Использовать с осторожностью ⚠️, нестабильная реализация (оригинальная библиотека [@std/streams](https://jsr.io/@std/streams))
510
+
511
+ Утилиты Web-совместимых [потоков](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream) (Streams, `node:stream/web`)
512
+
513
+ - `concatReadableStreams`, `mergeReadableStreams`, `zipReadableStreams`, `earlyZipReadableStreams`
514
+ - `TextLineStream`, `TextDelimiterStream`, `DelimiterStream`, `ByteSliceStream`, `LimitedTransformStream`, `LimitedBytesTransformStream`, `toTransformStream`
515
+ - `toText`, `toJson`, `toBytes`, `toArrayBuffer`, `toBlob`
516
+ - Буфер произвольного доступа - `Buffer`
517
+
518
+ ```ts
519
+ import { ReadableStream } from 'node:stream/web';
520
+ import { toText, TextLineStream } from 'inray/streams';
521
+
522
+ const text = await toText(ReadableStream.from(['Hello, ', 'world!']));
523
+ // "Hello, world!"
524
+
525
+ const lines = ReadableStream.from(['a\nb\n', 'c\n']).pipeThrough(new TextLineStream());
526
+ await Array.fromAsync(lines); // ["a", "b", "c"]
527
+ ```
528
+
529
+ ### inray/text - работа с текстом
530
+
531
+ Различные функции для работы с текстом:
532
+
533
+ - `toCamelCase`, `toPascalCase`, `toKebabCase`, `toSnakeCase` - преобразование к соответствующему регистру
534
+ - `levenshteinDistance`, `closestString`, `compareSimilarity`, `wordSimilaritySort` - проверка схожести строк
535
+ - `truncate` (`position`: `end` / `middle` / `start`) - отсечение
536
+
537
+ ```ts
538
+ import { toCamelCase, compareSimilarity, truncate } from 'inray/text';
539
+
540
+ toCamelCase('snake_case'); // "snakeCase"
541
+
542
+ ['hi', 'help', 'hello'].sort(compareSimilarity('hep'));
543
+ // ["help", "hi", "hello"]
544
+
545
+ truncate('very long text', 10); // "very lon…"
546
+ ```
205
547
 
206
548
  ### inray/unidecode - транслитерация строк
207
549
 
208
- In progress 🛠️...
550
+ Функция транслитерации `unidecode` - переводит Unicode в ближайший ASCII
551
+
552
+ ```ts
553
+ import { unidecode } from 'inray/unidecode';
554
+
555
+ unidecode('étude'); // "etude"
556
+ unidecode('北京'); // "Bei Jing "
557
+ unidecode('Æneid'); // "AEneid"
558
+ ```
209
559
 
210
560
  ### inray/utils - вспомогательные функции, классы, типы и валидаторы общего назначения
211
561
 
212
- In progress 🛠️...
562
+ Общие хелперы:
213
563
 
214
- ### inray/yaml - работа с YAML-файлами в рамках библиотеки yaml
564
+ - `createCid` - (детерминированный id из SHA-256)
565
+ - `generateDigitCode` - простая генерация числового кода
566
+ - `addOptionalFields` - перенос опциональных (?) полей из одного объекта в другой (с возможностью переименования)
567
+ - `objectToQueryParams` - преобразование объекта в Query-совместимую строку
568
+ - `getUrlDomain` - получение домена URL
569
+ - `getFilenameFromExternalUrl` - получения названия файла из ссылки
570
+ - `splitForPagination` - разбитие массива на пагинацию
571
+ - `HTTP_METHODS`, `HttpStatusText` - HTTP хелперы
572
+ - `mkdirs` / `mkdirsSync` - последовательное создание директорий
573
+ - `totalist` / `totalistSync` - последовательный обход дерева
215
574
 
216
- In progress 🛠️...
575
+ Классы:
217
576
 
218
- ## Совместимость c Runtime
577
+ - `TaskQueue` - последовательное выполнение промисов
578
+ - `SequentialCompensation` + `CompensatedOperation` (мини-saga с возможностью отката)
219
579
 
220
- In progress 🛠️...
580
+ Простые но часто используемые типы - `Serial`, `SortDirection` / `SortDirections`
581
+
582
+ Валидаторы (`inray/utils/validation`):
583
+
584
+ - предикаты: `isEmail`, `isUuid`, `isUuidArraySafe`, `isPositiveInteger`, `isNotEmptyString`, `isEmptyObject`, `isValidFileName`, `isValidUrlLike` / `urlPattern`, `inRangeOfMaxInt32`.
585
+ - Valibot-схемы: `vEnvBoolean`, `vEnvBooleanOrUndefined`, `vEnvLogLevel`, `vOmniBoolean`, `vQueryBoolean`, `vQueryEmailArray`, `vQueryPositiveNumberArray`, `vQueryStringifiedEnumArray`, `vQueryUuidArray`, `vISO8601DateTime` / `vISO8601DateTimeOptional` / `vISO8601DateTimeNullableOptional`, `vLatinInput`.
586
+
587
+ ```ts
588
+ import { createCid, objectToQueryParams, TaskQueue } from 'inray/utils';
589
+ import { isEmail, isUuid } from 'inray/utils/validation';
590
+
591
+ createCid({ base: 'user:42', prefix: 'usr' }); // "usr_<16 hex из SHA-256>"
592
+ objectToQueryParams({ q: 'test', page: '1' }); // "?q=test&page=1"
593
+
594
+ isEmail('jane@example.com'); // "jane@example.com"
595
+ isUuid('not-a-uuid'); // false
596
+
597
+ const queue = new TaskQueue('jobs');
598
+ await queue.run(() => Promise.resolve(1));
599
+ ```
600
+
601
+ ### inray/valibot - валидация
602
+
603
+ Библиотека валидации - [valibot](https://valibot.dev/), версия 1.4.2
604
+
605
+ Поставляется практически без изменений включая части [to-Json-Schema](https://valibot.dev/guides/json-schema/) и [i18n](https://valibot.dev/guides/internationalization/)
606
+
607
+ ### inray/yaml - работа с YAML-файлами
608
+
609
+ Оригинальная библиотека [yaml](https://eemeli.org/yaml/#yaml), версия 3.0.0-rc, YAML 1.1/1.2
610
+
611
+ ```ts
612
+ import { parse, stringify } from 'inray/yaml';
613
+
614
+ parse('[ true, false, maybe, null ]');
615
+ // [true, false, "maybe", null]
616
+
617
+ stringify({ number: 3, plain: 'string', block: 'two\nlines\n' });
618
+ // number: 3
619
+ // plain: string
620
+ // block: >
621
+ // two
622
+ //
623
+ // lines
624
+ ```
625
+
626
+ ## Совместимость
627
+
628
+ Целевой платформой Inray является [Node.js](https://nodejs.org/en)
629
+
630
+ Минимальная рекомендуемая версия - 22.18
631
+
632
+ Код SDK написан в режиме type-erasure и компилируется в практически аналогичный ECMAScript 2022 (то есть отдельные модули могут быть совместимы с Node.js 18 и 20)
633
+
634
+ Каждый* модуль Inray содержит тестовый набор, для тестирования используется [vitest](https://vitest.dev/). В сумме SDK содержит 17 200 тестов
635
+
636
+ Совместимость с версией Node.js определяется следующим образом:
637
+
638
+ - с помощью _nvm_ устанавливается соотв. версия Node.js
639
+ - запускаются все тесты - _npm run test_
640
+ - запускается отдельный скрипт проверки импортов уже скомпилированного JavaScript - _npm run test:smoke-exports_
641
+
642
+ | Версия Node.js | Совместимость с inray | Комментарий |
643
+ | :--------------- | :-------------------: | :-------------------------------------------------------- |
644
+ | 22.18.0 (22 LTS) | ✅ | 1 из 17200 тестов несовместим по коду самого теста |
645
+ | 23.11.1 | ✅ | |
646
+ | 24.21.0 (24 LTS) | ✅ | |
647
+ | 25.9.0 | ✅ | |
648
+ | 26.11.1 | ✅ | в 5 из 3181 тестах Hono замечена разница в выбросе ошибок |
649
+
650
+ \** - кроме _db/postgres_, _db/migrator_ и _utils_ - разработка тестов в процессе 🛠️...
651
+
652
+ ### Совместимость с браузерами
653
+
654
+ Некоторые модули Inray могут использоваться в клиентских приложениях. Это особенно важно при разработке внутри монорепозиториев, где зависимости проекта "шерятся" между backend и frontend - приложениями
655
+
656
+ Совместимость модуля inray браузерами определяется следующим образом:
657
+
658
+ - сам модуль _логически_ считается совместимым если в нём - нет импортов Node-API, не используются Node.js специфичные вещи, и сам модуль по своей сути "изоморфный" (либо функционально чистый)
659
+ - для подтверждения этой гипотезы тестовые наборы модуля дополнительно запускаются в двух конфигурациях vitest - [jsdom](https://github.com/jsdom/jsdom) и [happy-dom](https://github.com/capricorn86/happy-dom)
660
+ - в будущем в обязательно порядке будут добавлены тесты [_playwright_](https://playwright.dev/) (либо аналога) - для настоящего инстанциирования chromium, firefox и т.д., т.к. jsdom и happy-dom лишь эмулируют части браузера поверх Node.js
661
+ - при интерпретации результатов учитываются ограничения эмуляторов _jsdom_, _happy-dom_ - то есть наличие ошибки при прохождении теста, не означает несовместимость с браузером
662
+
663
+ | Модуль Inray | jsdom | happy-dom | Комментарий |
664
+ | :----------------- | :---: | :-------: | :----------------------------------------------------------------------------------------------------------- |
665
+ | inray/async | ⚠️ | ✅ | jsdom: разница в классах DOMException на проверках instanceof |
666
+ | inray/bytes | ✅ | ✅ | |
667
+ | inray/collections | ✅ | ✅ | |
668
+ | inray/data | ✅ | ✅ | |
669
+ | inray/date | ✅ | ✅ | |
670
+ | inray/encoding | ⚠️ | ✅ | jsdom: разница в классах Uint8Array на проверках instanceof. <br> У jsdom нет ArrayBuffer.prototype.transfer |
671
+ | inray/jsonc | ✅ | ✅ | |
672
+ | inray/media_types | ✅ | ✅ | |
673
+ | inray/phonenumbers | ✅ | ✅ | |
674
+ | inray/random | ✅ | ✅ | |
675
+ | inray/semver | ✅ | ✅ | |
676
+ | inray/text | ✅ | ✅ | |
677
+ | inray/unidecode | ✅ | ✅ | |
678
+ | inray/valibot | ✅ | ✅ | |
679
+
680
+ _playwright_ и версии бразуеров - in progress 🛠️...
221
681
 
222
682
  ## Лицензирование
223
683
 
@@ -247,35 +707,38 @@ PERFORMANCE OF THIS SOFTWARE.
247
707
 
248
708
  Integrated and modified external libraries:
249
709
 
250
- | Library name | Author | License | Version\* | Modification level\*\* | Internal name\*\*\* |
251
- | :---------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------- | :---------: | :--------------- | ---------------------- | ------------------- |
252
- | [valibot](https://valibot.dev/) | [Fabian Hiller](https://github.com/fabian-hiller) | MIT | **1.4.2** | Zero or low | same |
253
- | [@valibot/i18n](https://github.com/open-circle/valibot/tree/main/packages/i18n) | [Fabian Hiller](https://github.com/fabian-hiller) | MIT | **1.2.0** | Zero or low | same |
254
- | [@valibot/to-json-schema](https://github.com/open-circle/valibot/tree/main/packages/to-json-schema) | [Fabian Hiller](https://github.com/fabian-hiller) | MIT | **1.7.1** | Zero | same |
255
- | [node-cron](https://www.nodecron.com/) | [Lucas Merencia](https://github.com/merencia) | ISC | **4.6.0** | Zero or low | same |
256
- | [yaml](https://eemeli.org/yaml/#yaml) | [Eemeli Aro](https://github.com/eemeli) | ISC | **3.0.0-1 (RC)** | Zero or low | same |
257
- | [@std/async](https://jsr.io/@std/async) | [Deno authors](https://github.com/denoland) | MIT | **1.5.0** | Zero or low | same as domain |
258
- | [@std/bytes](https://jsr.io/@std/bytes) | [Deno authors](https://github.com/denoland) | MIT | **1.0.6** | Zero or low | same as domain |
259
- | [@std/collections](https://jsr.io/@std/collections) | [Deno authors](https://github.com/denoland) | MIT | **1.3.0** | Zero or low | same as domain |
260
- | [@std/csv](https://jsr.io/@std/csv) | [Deno authors](https://github.com/denoland) | MIT | **1.0.6** | Low | same as domain |
261
- | [@std/data-structures](https://jsr.io/@std/data-structures) | [Deno authors](https://github.com/denoland) | MIT | **1.1.1** | Zero or low | same as domain |
262
- | [@std/encoding](https://jsr.io/@std/encoding) | [Deno authors](https://github.com/denoland) | MIT | **1.0.11** | Low | same as domain |
263
- | [@std/fmt](https://jsr.io/@std/fmt) | [Deno authors](https://github.com/denoland) | MIT | **1.0.10** | Low | same as domain |
264
- | [@std/json](https://jsr.io/@std/json) | [Deno authors](https://github.com/denoland) | MIT | **1.1.0** | Low | same as domain |
265
- | [@std/jsonc](https://jsr.io/@std/jsonc) | [Deno authors](https://github.com/denoland) | MIT | **1.0.2** | Zero or low | same as domain |
266
- | [@std/media-types](https://jsr.io/@std/media-types) | [Deno authors](https://github.com/denoland) | MIT | **1.1.0** | Zero or low | same as domain |
267
- | [@std/streams](https://jsr.io/@std/streams) | [Deno authors](https://github.com/denoland) | MIT | **1.1.1** | Low | same as domain |
268
- | [jose](https://github.com/panva/jose) | [Filip Skokan](https://github.com/panva) | MIT | **6.2.8** | Zero or low | same |
269
- | [date-fns](https://date-fns.org/) | [Sasha Koss](https://github.com/kossnocorp) | MIT | **4.4.0** | Zero or low | same |
270
- | [unidecode](https://github.com/FGRibreau/node-unidecode) | [Francois-Guillaume Ribreau](https://fgribreau.com) | BSD | **1.1.0** | Average | same |
271
- | [libphonenumber-js](https://gitlab.com/catamphetamine/libphonenumber-js) | [Nikolay Kuchumov](https://gitlab.com/catamphetamine) | MIT, Apache | **1.13.11** | High | phonenumbers |
272
- | [logtape](https://logtape.org/) and parts: <br> @logtape/config, @logtape/file, <br> @logtape/pretty, @logtape/redaction, @logtape/syslog | [Hong Minhee (洪 民憙)](https://github.com/dahlia) | MIT | **2.3.2** | Zero or low | same |
273
- | [postgres.js](https://github.com/porsager/postgres/tree/master) | [Rasmus Porsager](https://github.com/porsager) | UNLICENSE | **3.4.9** | Zero | same |
274
- | [hono](https://hono.dev/) | [Yusuke Wada](https://github.com/yusukebe) | MIT | **4.13.5** | Low | same |
275
- | [@hono/node-server](https://github.com/honojs/node-server) | [Yusuke Wada](https://github.com/yusukebe) | MIT | **2.1.1** | Zero or low | same |
276
- | [cache-manager](https://cacheable.org/docs/cache-manager/) and parts: keyv, @keyv/serialize, @cacheable/utils, hashery, hookified | [Jared Wray](https://github.com/jaredwray) | MIT | **7.2.9** | Average | caching |
277
- | [commander.js](https://github.com/tj/commander.js) | [TJ Holowaychuk](https://github.com/tj)<br> [John Gee](https://github.com/shadowspawn) | MIT | **15.0.0** | Average | cli |
278
- | [ley](https://github.com/lukeed/ley) and parts: <br> mk-dirs, totalist | [Luke Edwards](https://github.com/lukeed) | MIT | **0.8.1** | High | db-migrator |
710
+ | Library name | Author | License | Version\* | Modification level\*\* | Internal name\*\*\* |
711
+ | :---------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------- | :---------: | :--------------- | ---------------------- | ------------------- |
712
+ | [valibot](https://valibot.dev/) | [Fabian Hiller](https://github.com/fabian-hiller) | MIT | **1.4.2** | Zero or low | same |
713
+ | [@valibot/i18n](https://github.com/open-circle/valibot/tree/main/packages/i18n) | [Fabian Hiller](https://github.com/fabian-hiller) | MIT | **1.2.0** | Zero or low | same |
714
+ | [@valibot/to-json-schema](https://github.com/open-circle/valibot/tree/main/packages/to-json-schema) | [Fabian Hiller](https://github.com/fabian-hiller) | MIT | **1.7.1** | Zero | same |
715
+ | [node-cron](https://www.nodecron.com/) | [Lucas Merencia](https://github.com/merencia) | ISC | **4.6.0** | Zero or low | same |
716
+ | [yaml](https://eemeli.org/yaml/#yaml) | [Eemeli Aro](https://github.com/eemeli) | ISC | **3.0.0-1 (RC)** | Zero or low | same |
717
+ | [@std/async](https://jsr.io/@std/async) | [Deno authors](https://github.com/denoland) | MIT | **1.5.0** | Zero or low | same as domain |
718
+ | [@std/bytes](https://jsr.io/@std/bytes) | [Deno authors](https://github.com/denoland) | MIT | **1.0.6** | Zero or low | same as domain |
719
+ | [@std/collections](https://jsr.io/@std/collections) | [Deno authors](https://github.com/denoland) | MIT | **1.3.0** | Zero or low | same as domain |
720
+ | [@std/csv](https://jsr.io/@std/csv) | [Deno authors](https://github.com/denoland) | MIT | **1.0.6** | Low | same as domain |
721
+ | [@std/data-structures](https://jsr.io/@std/data-structures) | [Deno authors](https://github.com/denoland) | MIT | **1.1.1** | Zero or low | same as domain |
722
+ | [@std/encoding](https://jsr.io/@std/encoding) | [Deno authors](https://github.com/denoland) | MIT | **1.0.11** | Low | same as domain |
723
+ | [@std/fmt](https://jsr.io/@std/fmt) | [Deno authors](https://github.com/denoland) | MIT | **1.0.10** | Low | same as domain |
724
+ | [@std/json](https://jsr.io/@std/json) | [Deno authors](https://github.com/denoland) | MIT | **1.1.0** | Low | same as domain |
725
+ | [@std/jsonc](https://jsr.io/@std/jsonc) | [Deno authors](https://github.com/denoland) | MIT | **1.0.2** | Zero or low | same as domain |
726
+ | [@std/media-types](https://jsr.io/@std/media-types) | [Deno authors](https://github.com/denoland) | MIT | **1.1.0** | Zero or low | same as domain |
727
+ | [@std/streams](https://jsr.io/@std/streams) | [Deno authors](https://github.com/denoland) | MIT | **1.1.1** | Low | same as domain |
728
+ | [jose](https://github.com/panva/jose) | [Filip Skokan](https://github.com/panva) | MIT | **6.2.8** | Zero or low | same |
729
+ | [date-fns](https://date-fns.org/) | [Sasha Koss](https://github.com/kossnocorp) | MIT | **4.4.0** | Zero or low | same |
730
+ | [unidecode](https://github.com/FGRibreau/node-unidecode) | [Francois-Guillaume Ribreau](https://fgribreau.com) | BSD | **1.1.0** | Average | same |
731
+ | [libphonenumber-js](https://gitlab.com/catamphetamine/libphonenumber-js) | [Nikolay Kuchumov](https://gitlab.com/catamphetamine) | MIT, Apache | **1.13.11** | High | phonenumbers |
732
+ | [logtape](https://logtape.org/) and parts: <br> @logtape/config, @logtape/file, <br> @logtape/pretty, @logtape/redaction, @logtape/syslog | [Hong Minhee (洪 民憙)](https://github.com/dahlia) | MIT | **2.3.2** | Zero or low | same |
733
+ | [postgres.js](https://github.com/porsager/postgres/tree/master) | [Rasmus Porsager](https://github.com/porsager) | UNLICENSE | **3.4.9** | Zero | same |
734
+ | [hono](https://hono.dev/) | [Yusuke Wada](https://github.com/yusukebe) | MIT | **4.13.5** | Low | same |
735
+ | [@hono/node-server](https://github.com/honojs/node-server) | [Yusuke Wada](https://github.com/yusukebe) | MIT | **2.1.1** | Zero or low | same |
736
+ | [cache-manager](https://cacheable.org/docs/cache-manager/) and parts: keyv, @keyv/serialize, @cacheable/utils, hashery, hookified | [Jared Wray](https://github.com/jaredwray) | MIT | **7.2.9** | Average | caching |
737
+ | [commander.js](https://github.com/tj/commander.js) | [TJ Holowaychuk](https://github.com/tj)<br> [John Gee](https://github.com/shadowspawn) | MIT | **15.0.0** | Average | cli |
738
+ | [ley](https://github.com/lukeed/ley) and parts: <br> mk-dirs, totalist | [Luke Edwards](https://github.com/lukeed) | MIT | **0.8.1** | High | db-migrator |
739
+ | [@std/random](https://jsr.io/@std/random) | [Deno authors](https://github.com/denoland) | MIT | **0.1.5** | Zero or low | same as domain |
740
+ | [@std/semver](https://jsr.io/@std/semver) | [Deno authors](https://github.com/denoland)<br> [Isaac Z. Schlueter](https://github.com/isaacs) | MIT, ISC | **1.0.8** | Zero or low | same as domain |
741
+ | [@std/text](https://jsr.io/@std/text) | [Deno authors](https://github.com/denoland) | MIT | **1.0.19** | Zero or low | same as domain |
279
742
 
280
743
  \* - integrated version of library
281
744
 
@@ -329,3 +792,4 @@ However, sometimes integrated libraries change their original name for one or mo
329
792
  - [TJ Holowaychuk](https://github.com/tj)
330
793
  - [John Gee](https://github.com/shadowspawn)
331
794
  - [Luke Edwards](https://github.com/lukeed)
795
+ - [Isaac Z. Schlueter](https://github.com/isaacs)