inray 0.0.7 → 0.0.8
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.
- package/LICENSE.md +32 -29
- package/README.md +467 -55
- package/dist/random/_pcg32.d.ts +61 -0
- package/dist/random/_pcg32.d.ts.map +1 -0
- package/dist/random/_pcg32.js +122 -0
- package/dist/random/_pcg32.js.map +1 -0
- package/dist/random/_platform.d.ts +12 -0
- package/dist/random/_platform.d.ts.map +1 -0
- package/dist/random/_platform.js +13 -0
- package/dist/random/_platform.js.map +1 -0
- package/dist/random/_seed_bytes_from_uint64.d.ts +15 -0
- package/dist/random/_seed_bytes_from_uint64.d.ts.map +1 -0
- package/dist/random/_seed_bytes_from_uint64.js +23 -0
- package/dist/random/_seed_bytes_from_uint64.js.map +1 -0
- package/dist/random/_test_utils.d.ts +15 -0
- package/dist/random/_test_utils.d.ts.map +1 -0
- package/dist/random/_test_utils.js +92 -0
- package/dist/random/_test_utils.js.map +1 -0
- package/dist/random/_types.d.ts +50 -0
- package/dist/random/_types.d.ts.map +1 -0
- package/dist/random/_types.js +10 -0
- package/dist/random/_types.js.map +1 -0
- package/dist/random/between.d.ts +33 -0
- package/dist/random/between.d.ts.map +1 -0
- package/dist/random/between.js +44 -0
- package/dist/random/between.js.map +1 -0
- package/dist/random/get_random_values_seeded.d.ts +31 -0
- package/dist/random/get_random_values_seeded.d.ts.map +1 -0
- package/dist/random/get_random_values_seeded.js +34 -0
- package/dist/random/get_random_values_seeded.js.map +1 -0
- package/dist/random/integer_between.d.ts +33 -0
- package/dist/random/integer_between.d.ts.map +1 -0
- package/dist/random/integer_between.js +34 -0
- package/dist/random/integer_between.js.map +1 -0
- package/dist/random/internal/_testing.d.ts +15 -0
- package/dist/random/internal/_testing.d.ts.map +1 -0
- package/dist/random/internal/_testing.js +27 -0
- package/dist/random/internal/_testing.js.map +1 -0
- package/dist/random/mod.d.ts +45 -0
- package/dist/random/mod.d.ts.map +1 -0
- package/dist/random/mod.js +46 -0
- package/dist/random/mod.js.map +1 -0
- package/dist/random/next_float_64.d.ts +38 -0
- package/dist/random/next_float_64.d.ts.map +1 -0
- package/dist/random/next_float_64.js +47 -0
- package/dist/random/next_float_64.js.map +1 -0
- package/dist/random/sample.d.ts +58 -0
- package/dist/random/sample.d.ts.map +1 -0
- package/dist/random/sample.js +69 -0
- package/dist/random/sample.js.map +1 -0
- package/dist/random/seeded.d.ts +34 -0
- package/dist/random/seeded.d.ts.map +1 -0
- package/dist/random/seeded.js +37 -0
- package/dist/random/seeded.js.map +1 -0
- package/dist/random/shuffle.d.ts +35 -0
- package/dist/random/shuffle.d.ts.map +1 -0
- package/dist/random/shuffle.js +48 -0
- package/dist/random/shuffle.js.map +1 -0
- package/dist/semver/_constants.d.ts +20 -0
- package/dist/semver/_constants.d.ts.map +1 -0
- package/dist/semver/_constants.js +28 -0
- package/dist/semver/_constants.js.map +1 -0
- package/dist/semver/_shared.d.ts +52 -0
- package/dist/semver/_shared.d.ts.map +1 -0
- package/dist/semver/_shared.js +168 -0
- package/dist/semver/_shared.js.map +1 -0
- package/dist/semver/_test_comparator_set.d.ts +11 -0
- package/dist/semver/_test_comparator_set.d.ts.map +1 -0
- package/dist/semver/_test_comparator_set.js +62 -0
- package/dist/semver/_test_comparator_set.js.map +1 -0
- package/dist/semver/can_parse.d.ts +24 -0
- package/dist/semver/can_parse.d.ts.map +1 -0
- package/dist/semver/can_parse.js +34 -0
- package/dist/semver/can_parse.js.map +1 -0
- package/dist/semver/compare.d.ts +35 -0
- package/dist/semver/compare.d.ts.map +1 -0
- package/dist/semver/compare.js +43 -0
- package/dist/semver/compare.js.map +1 -0
- package/dist/semver/difference.d.ts +34 -0
- package/dist/semver/difference.d.ts.map +1 -0
- package/dist/semver/difference.js +48 -0
- package/dist/semver/difference.js.map +1 -0
- package/dist/semver/equals.d.ts +31 -0
- package/dist/semver/equals.d.ts.map +1 -0
- package/dist/semver/equals.js +34 -0
- package/dist/semver/equals.js.map +1 -0
- package/dist/semver/format.d.ts +29 -0
- package/dist/semver/format.d.ts.map +1 -0
- package/dist/semver/format.js +40 -0
- package/dist/semver/format.js.map +1 -0
- package/dist/semver/format_range.d.ts +25 -0
- package/dist/semver/format_range.d.ts.map +1 -0
- package/dist/semver/format_range.js +33 -0
- package/dist/semver/format_range.js.map +1 -0
- package/dist/semver/greater_or_equal.d.ts +32 -0
- package/dist/semver/greater_or_equal.d.ts.map +1 -0
- package/dist/semver/greater_or_equal.js +34 -0
- package/dist/semver/greater_or_equal.js.map +1 -0
- package/dist/semver/greater_than.d.ts +32 -0
- package/dist/semver/greater_than.d.ts.map +1 -0
- package/dist/semver/greater_than.js +34 -0
- package/dist/semver/greater_than.js.map +1 -0
- package/dist/semver/greater_than_range.d.ts +30 -0
- package/dist/semver/greater_than_range.d.ts.map +1 -0
- package/dist/semver/greater_than_range.js +64 -0
- package/dist/semver/greater_than_range.js.map +1 -0
- package/dist/semver/increment.d.ts +61 -0
- package/dist/semver/increment.d.ts.map +1 -0
- package/dist/semver/increment.js +186 -0
- package/dist/semver/increment.js.map +1 -0
- package/dist/semver/is_range.d.ts +30 -0
- package/dist/semver/is_range.d.ts.map +1 -0
- package/dist/semver/is_range.js +42 -0
- package/dist/semver/is_range.js.map +1 -0
- package/dist/semver/is_semver.d.ts +41 -0
- package/dist/semver/is_semver.d.ts.map +1 -0
- package/dist/semver/is_semver.js +60 -0
- package/dist/semver/is_semver.js.map +1 -0
- package/dist/semver/less_or_equal.d.ts +32 -0
- package/dist/semver/less_or_equal.d.ts.map +1 -0
- package/dist/semver/less_or_equal.js +34 -0
- package/dist/semver/less_or_equal.js.map +1 -0
- package/dist/semver/less_than.d.ts +32 -0
- package/dist/semver/less_than.d.ts.map +1 -0
- package/dist/semver/less_than.js +34 -0
- package/dist/semver/less_than.js.map +1 -0
- package/dist/semver/less_than_range.d.ts +30 -0
- package/dist/semver/less_than_range.d.ts.map +1 -0
- package/dist/semver/less_than_range.js +64 -0
- package/dist/semver/less_than_range.js.map +1 -0
- package/dist/semver/max_satisfying.d.ts +29 -0
- package/dist/semver/max_satisfying.d.ts.map +1 -0
- package/dist/semver/max_satisfying.js +38 -0
- package/dist/semver/max_satisfying.js.map +1 -0
- package/dist/semver/min_satisfying.d.ts +29 -0
- package/dist/semver/min_satisfying.d.ts.map +1 -0
- package/dist/semver/min_satisfying.js +38 -0
- package/dist/semver/min_satisfying.js.map +1 -0
- package/dist/semver/mod.d.ts +305 -0
- package/dist/semver/mod.d.ts.map +1 -0
- package/dist/semver/mod.js +306 -0
- package/dist/semver/mod.js.map +1 -0
- package/dist/semver/not_equals.d.ts +31 -0
- package/dist/semver/not_equals.d.ts.map +1 -0
- package/dist/semver/not_equals.js +33 -0
- package/dist/semver/not_equals.js.map +1 -0
- package/dist/semver/parse.d.ts +32 -0
- package/dist/semver/parse.d.ts.map +1 -0
- package/dist/semver/parse.js +50 -0
- package/dist/semver/parse.js.map +1 -0
- package/dist/semver/parse_range.d.ts +34 -0
- package/dist/semver/parse_range.d.ts.map +1 -0
- package/dist/semver/parse_range.js +352 -0
- package/dist/semver/parse_range.js.map +1 -0
- package/dist/semver/range_intersects.d.ts +32 -0
- package/dist/semver/range_intersects.d.ts.map +1 -0
- package/dist/semver/range_intersects.js +89 -0
- package/dist/semver/range_intersects.js.map +1 -0
- package/dist/semver/satisfies.d.ts +31 -0
- package/dist/semver/satisfies.d.ts.map +1 -0
- package/dist/semver/satisfies.js +33 -0
- package/dist/semver/satisfies.js.map +1 -0
- package/dist/semver/try_parse.d.ts +28 -0
- package/dist/semver/try_parse.d.ts.map +1 -0
- package/dist/semver/try_parse.js +35 -0
- package/dist/semver/try_parse.js.map +1 -0
- package/dist/semver/try_parse_range.d.ts +31 -0
- package/dist/semver/try_parse_range.d.ts.map +1 -0
- package/dist/semver/try_parse_range.js +40 -0
- package/dist/semver/try_parse_range.js.map +1 -0
- package/dist/semver/types.d.ts +66 -0
- package/dist/semver/types.d.ts.map +1 -0
- package/dist/semver/types.js +10 -0
- package/dist/semver/types.js.map +1 -0
- package/dist/text/_util.d.ts +11 -0
- package/dist/text/_util.d.ts.map +1 -0
- package/dist/text/_util.js +21 -0
- package/dist/text/_util.js.map +1 -0
- package/dist/text/closest_string.d.ts +49 -0
- package/dist/text/closest_string.d.ts.map +1 -0
- package/dist/text/closest_string.js +51 -0
- package/dist/text/closest_string.js.map +1 -0
- package/dist/text/compare_similarity.d.ts +54 -0
- package/dist/text/compare_similarity.d.ts.map +1 -0
- package/dist/text/compare_similarity.js +45 -0
- package/dist/text/compare_similarity.js.map +1 -0
- package/dist/text/levenshtein_distance.d.ts +30 -0
- package/dist/text/levenshtein_distance.d.ts.map +1 -0
- package/dist/text/levenshtein_distance.js +134 -0
- package/dist/text/levenshtein_distance.js.map +1 -0
- package/dist/text/mod.d.ts +34 -0
- package/dist/text/mod.d.ts.map +1 -0
- package/dist/text/mod.js +35 -0
- package/dist/text/mod.js.map +1 -0
- package/dist/text/to_camel_case.d.ts +23 -0
- package/dist/text/to_camel_case.d.ts.map +1 -0
- package/dist/text/to_camel_case.js +29 -0
- package/dist/text/to_camel_case.js.map +1 -0
- package/dist/text/to_kebab_case.d.ts +23 -0
- package/dist/text/to_kebab_case.d.ts.map +1 -0
- package/dist/text/to_kebab_case.js +28 -0
- package/dist/text/to_kebab_case.js.map +1 -0
- package/dist/text/to_pascal_case.d.ts +23 -0
- package/dist/text/to_pascal_case.d.ts.map +1 -0
- package/dist/text/to_pascal_case.js +28 -0
- package/dist/text/to_pascal_case.js.map +1 -0
- package/dist/text/to_snake_case.d.ts +23 -0
- package/dist/text/to_snake_case.d.ts.map +1 -0
- package/dist/text/to_snake_case.js +28 -0
- package/dist/text/to_snake_case.js.map +1 -0
- package/dist/text/truncate.d.ts +81 -0
- package/dist/text/truncate.d.ts.map +1 -0
- package/dist/text/truncate.js +116 -0
- package/dist/text/truncate.js.map +1 -0
- package/dist/text/word_similarity_sort.d.ts +46 -0
- package/dist/text/word_similarity_sort.d.ts.map +1 -0
- package/dist/text/word_similarity_sort.js +47 -0
- package/dist/text/word_similarity_sort.js.map +1 -0
- package/package.json +16 -1
package/README.md
CHANGED
|
@@ -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,99 +124,504 @@ In progress 🛠️...
|
|
|
121
124
|
|
|
122
125
|
## Документация и примеры использования
|
|
123
126
|
|
|
124
|
-
|
|
127
|
+
Краткий обзор публичного API. Импорт - через namespace `inray/...`.
|
|
125
128
|
|
|
126
129
|
### inray/async - асинхронные функции
|
|
127
130
|
|
|
128
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
352
|
+
[Hono](https://hono.dev/docs/) - фреймворк построенный на веб-стандартах для реализации. Версия 4.13.5
|
|
173
353
|
|
|
174
|
-
|
|
354
|
+
Добавление новой документации - In progress 🛠️...
|
|
175
355
|
|
|
176
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
562
|
+
Общие хелперы:
|
|
213
563
|
|
|
214
|
-
|
|
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
|
-
|
|
575
|
+
Классы:
|
|
576
|
+
|
|
577
|
+
- `TaskQueue` - последовательное выполнение промисов
|
|
578
|
+
- `SequentialCompensation` + `CompensatedOperation` (мини-saga с возможностью отката)
|
|
579
|
+
|
|
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
|
+
```
|
|
217
625
|
|
|
218
626
|
## Совместимость c Runtime
|
|
219
627
|
|
|
@@ -247,35 +655,38 @@ PERFORMANCE OF THIS SOFTWARE.
|
|
|
247
655
|
|
|
248
656
|
Integrated and modified external libraries:
|
|
249
657
|
|
|
250
|
-
| Library name | Author
|
|
251
|
-
| :---------------------------------------------------------------------------------------------------------------------------------------- |
|
|
252
|
-
| [valibot](https://valibot.dev/) | [Fabian Hiller](https://github.com/fabian-hiller)
|
|
253
|
-
| [@valibot/i18n](https://github.com/open-circle/valibot/tree/main/packages/i18n) | [Fabian Hiller](https://github.com/fabian-hiller)
|
|
254
|
-
| [@valibot/to-json-schema](https://github.com/open-circle/valibot/tree/main/packages/to-json-schema) | [Fabian Hiller](https://github.com/fabian-hiller)
|
|
255
|
-
| [node-cron](https://www.nodecron.com/) | [Lucas Merencia](https://github.com/merencia)
|
|
256
|
-
| [yaml](https://eemeli.org/yaml/#yaml) | [Eemeli Aro](https://github.com/eemeli)
|
|
257
|
-
| [@std/async](https://jsr.io/@std/async) | [Deno authors](https://github.com/denoland)
|
|
258
|
-
| [@std/bytes](https://jsr.io/@std/bytes) | [Deno authors](https://github.com/denoland)
|
|
259
|
-
| [@std/collections](https://jsr.io/@std/collections) | [Deno authors](https://github.com/denoland)
|
|
260
|
-
| [@std/csv](https://jsr.io/@std/csv) | [Deno authors](https://github.com/denoland)
|
|
261
|
-
| [@std/data-structures](https://jsr.io/@std/data-structures) | [Deno authors](https://github.com/denoland)
|
|
262
|
-
| [@std/encoding](https://jsr.io/@std/encoding) | [Deno authors](https://github.com/denoland)
|
|
263
|
-
| [@std/fmt](https://jsr.io/@std/fmt) | [Deno authors](https://github.com/denoland)
|
|
264
|
-
| [@std/json](https://jsr.io/@std/json) | [Deno authors](https://github.com/denoland)
|
|
265
|
-
| [@std/jsonc](https://jsr.io/@std/jsonc) | [Deno authors](https://github.com/denoland)
|
|
266
|
-
| [@std/media-types](https://jsr.io/@std/media-types) | [Deno authors](https://github.com/denoland)
|
|
267
|
-
| [@std/streams](https://jsr.io/@std/streams) | [Deno authors](https://github.com/denoland)
|
|
268
|
-
| [jose](https://github.com/panva/jose) | [Filip Skokan](https://github.com/panva)
|
|
269
|
-
| [date-fns](https://date-fns.org/) | [Sasha Koss](https://github.com/kossnocorp)
|
|
270
|
-
| [unidecode](https://github.com/FGRibreau/node-unidecode) | [Francois-Guillaume Ribreau](https://fgribreau.com)
|
|
271
|
-
| [libphonenumber-js](https://gitlab.com/catamphetamine/libphonenumber-js) | [Nikolay Kuchumov](https://gitlab.com/catamphetamine)
|
|
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)
|
|
273
|
-
| [postgres.js](https://github.com/porsager/postgres/tree/master) | [Rasmus Porsager](https://github.com/porsager)
|
|
274
|
-
| [hono](https://hono.dev/) | [Yusuke Wada](https://github.com/yusukebe)
|
|
275
|
-
| [@hono/node-server](https://github.com/honojs/node-server) | [Yusuke Wada](https://github.com/yusukebe)
|
|
276
|
-
| [cache-manager](https://cacheable.org/docs/cache-manager/) and parts: keyv, @keyv/serialize, @cacheable/utils, hashery, hookified | [Jared Wray](https://github.com/jaredwray)
|
|
277
|
-
| [commander.js](https://github.com/tj/commander.js) | [TJ Holowaychuk](https://github.com/tj)<br> [John Gee](https://github.com/shadowspawn)
|
|
278
|
-
| [ley](https://github.com/lukeed/ley) and parts: <br> mk-dirs, totalist | [Luke Edwards](https://github.com/lukeed)
|
|
658
|
+
| Library name | Author | License | Version\* | Modification level\*\* | Internal name\*\*\* |
|
|
659
|
+
| :---------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------- | :---------: | :--------------- | ---------------------- | ------------------- |
|
|
660
|
+
| [valibot](https://valibot.dev/) | [Fabian Hiller](https://github.com/fabian-hiller) | MIT | **1.4.2** | Zero or low | same |
|
|
661
|
+
| [@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 |
|
|
662
|
+
| [@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 |
|
|
663
|
+
| [node-cron](https://www.nodecron.com/) | [Lucas Merencia](https://github.com/merencia) | ISC | **4.6.0** | Zero or low | same |
|
|
664
|
+
| [yaml](https://eemeli.org/yaml/#yaml) | [Eemeli Aro](https://github.com/eemeli) | ISC | **3.0.0-1 (RC)** | Zero or low | same |
|
|
665
|
+
| [@std/async](https://jsr.io/@std/async) | [Deno authors](https://github.com/denoland) | MIT | **1.5.0** | Zero or low | same as domain |
|
|
666
|
+
| [@std/bytes](https://jsr.io/@std/bytes) | [Deno authors](https://github.com/denoland) | MIT | **1.0.6** | Zero or low | same as domain |
|
|
667
|
+
| [@std/collections](https://jsr.io/@std/collections) | [Deno authors](https://github.com/denoland) | MIT | **1.3.0** | Zero or low | same as domain |
|
|
668
|
+
| [@std/csv](https://jsr.io/@std/csv) | [Deno authors](https://github.com/denoland) | MIT | **1.0.6** | Low | same as domain |
|
|
669
|
+
| [@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 |
|
|
670
|
+
| [@std/encoding](https://jsr.io/@std/encoding) | [Deno authors](https://github.com/denoland) | MIT | **1.0.11** | Low | same as domain |
|
|
671
|
+
| [@std/fmt](https://jsr.io/@std/fmt) | [Deno authors](https://github.com/denoland) | MIT | **1.0.10** | Low | same as domain |
|
|
672
|
+
| [@std/json](https://jsr.io/@std/json) | [Deno authors](https://github.com/denoland) | MIT | **1.1.0** | Low | same as domain |
|
|
673
|
+
| [@std/jsonc](https://jsr.io/@std/jsonc) | [Deno authors](https://github.com/denoland) | MIT | **1.0.2** | Zero or low | same as domain |
|
|
674
|
+
| [@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 |
|
|
675
|
+
| [@std/streams](https://jsr.io/@std/streams) | [Deno authors](https://github.com/denoland) | MIT | **1.1.1** | Low | same as domain |
|
|
676
|
+
| [jose](https://github.com/panva/jose) | [Filip Skokan](https://github.com/panva) | MIT | **6.2.8** | Zero or low | same |
|
|
677
|
+
| [date-fns](https://date-fns.org/) | [Sasha Koss](https://github.com/kossnocorp) | MIT | **4.4.0** | Zero or low | same |
|
|
678
|
+
| [unidecode](https://github.com/FGRibreau/node-unidecode) | [Francois-Guillaume Ribreau](https://fgribreau.com) | BSD | **1.1.0** | Average | same |
|
|
679
|
+
| [libphonenumber-js](https://gitlab.com/catamphetamine/libphonenumber-js) | [Nikolay Kuchumov](https://gitlab.com/catamphetamine) | MIT, Apache | **1.13.11** | High | phonenumbers |
|
|
680
|
+
| [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 |
|
|
681
|
+
| [postgres.js](https://github.com/porsager/postgres/tree/master) | [Rasmus Porsager](https://github.com/porsager) | UNLICENSE | **3.4.9** | Zero | same |
|
|
682
|
+
| [hono](https://hono.dev/) | [Yusuke Wada](https://github.com/yusukebe) | MIT | **4.13.5** | Low | same |
|
|
683
|
+
| [@hono/node-server](https://github.com/honojs/node-server) | [Yusuke Wada](https://github.com/yusukebe) | MIT | **2.1.1** | Zero or low | same |
|
|
684
|
+
| [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 |
|
|
685
|
+
| [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 |
|
|
686
|
+
| [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 |
|
|
687
|
+
| [@std/random](https://jsr.io/@std/random) | [Deno authors](https://github.com/denoland) | MIT | **0.1.5** | Zero or low | same as domain |
|
|
688
|
+
| [@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 |
|
|
689
|
+
| [@std/text](https://jsr.io/@std/text) | [Deno authors](https://github.com/denoland) | MIT | **1.0.19** | Zero or low | same as domain |
|
|
279
690
|
|
|
280
691
|
\* - integrated version of library
|
|
281
692
|
|
|
@@ -329,3 +740,4 @@ However, sometimes integrated libraries change their original name for one or mo
|
|
|
329
740
|
- [TJ Holowaychuk](https://github.com/tj)
|
|
330
741
|
- [John Gee](https://github.com/shadowspawn)
|
|
331
742
|
- [Luke Edwards](https://github.com/lukeed)
|
|
743
|
+
- [Isaac Z. Schlueter](https://github.com/isaacs)
|