@nemigo/helpers 0.13.2 → 1.5.0
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/dist/aggregator.d.ts +33 -0
- package/dist/aggregator.js +44 -0
- package/dist/array.d.ts +33 -0
- package/dist/array.js +24 -0
- package/dist/async/context.d.ts +73 -0
- package/dist/async/context.js +90 -0
- package/dist/async/future.d.ts +54 -0
- package/dist/async/future.js +71 -0
- package/dist/async/index.d.ts +56 -27
- package/dist/async/index.js +63 -58
- package/dist/async/loader.d.ts +67 -0
- package/dist/async/loader.js +101 -0
- package/dist/async/queue.d.ts +51 -0
- package/dist/async/queue.js +84 -0
- package/dist/cases.d.ts +31 -21
- package/dist/cases.js +41 -37
- package/dist/clean.d.ts +44 -26
- package/dist/clean.js +67 -42
- package/dist/color/types.d.ts +31 -0
- package/dist/color/types.js +1 -0
- package/dist/datetime/delta.d.ts +28 -0
- package/dist/datetime/delta.js +65 -0
- package/dist/datetime/format.d.ts +53 -0
- package/dist/datetime/format.js +119 -0
- package/dist/datetime/index.d.ts +6 -0
- package/dist/datetime/index.js +22 -0
- package/dist/datetime/plural.d.ts +77 -0
- package/dist/datetime/plural.js +78 -0
- package/dist/emitter.d.ts +29 -17
- package/dist/emitter.js +35 -21
- package/dist/explorer.d.ts +22 -29
- package/dist/explorer.js +18 -16
- package/dist/files.d.ts +31 -2
- package/dist/files.js +33 -8
- package/dist/fish.d.ts +29 -0
- package/dist/fish.js +70 -0
- package/dist/html/cookie.d.ts +48 -0
- package/dist/html/cookie.js +37 -0
- package/dist/html/events.d.ts +133 -0
- package/dist/html/events.js +139 -0
- package/dist/html/index.d.ts +31 -0
- package/dist/html/index.js +61 -0
- package/dist/index.d.ts +38 -40
- package/dist/index.js +43 -56
- package/dist/jiff/apply.d.ts +93 -0
- package/dist/jiff/apply.js +64 -0
- package/dist/jiff/extract.d.ts +7 -0
- package/dist/jiff/extract.js +82 -0
- package/dist/jiff/types.d.ts +57 -0
- package/dist/jiff/types.js +1 -0
- package/dist/lens.d.ts +20 -31
- package/dist/lens.js +22 -37
- package/dist/msgpack.d.ts +11 -26
- package/dist/msgpack.js +9 -21
- package/dist/mutate.d.ts +70 -0
- package/dist/mutate.js +130 -0
- package/dist/omitter.d.ts +57 -34
- package/dist/omitter.js +38 -30
- package/dist/path.d.ts +20 -1
- package/dist/path.js +21 -2
- package/dist/phymath/format.d.ts +60 -0
- package/dist/phymath/format.js +34 -0
- package/dist/phymath/index.d.ts +30 -30
- package/dist/phymath/index.js +41 -33
- package/dist/promoter.d.ts +23 -12
- package/dist/promoter.js +24 -17
- package/dist/random.d.ts +20 -21
- package/dist/random.js +22 -23
- package/dist/rubles.d.ts +24 -0
- package/dist/rubles.js +24 -0
- package/dist/script.d.ts +60 -13
- package/dist/script.js +46 -10
- package/dist/string.d.ts +46 -92
- package/dist/string.js +46 -171
- package/dist/types.d.ts +144 -25
- package/dist/url/index.d.ts +12 -0
- package/dist/url/index.js +17 -0
- package/dist/url/params.d.ts +141 -0
- package/dist/{url.js → url/params.js} +90 -18
- package/dist/url/slug.d.ts +28 -0
- package/dist/url/slug.js +102 -0
- package/dist/veil.d.ts +14 -0
- package/dist/veil.js +26 -0
- package/dist/xod.d.ts +237 -16
- package/dist/xod.js +192 -18
- package/dist/zipper.d.ts +22 -4
- package/dist/zipper.js +22 -5
- package/package.json +82 -34
- package/dist/async/space.d.ts +0 -7
- package/dist/async/space.js +0 -31
- package/dist/cleanup.d.ts +0 -9
- package/dist/cleanup.js +0 -18
- package/dist/colors.d.ts +0 -539
- package/dist/colors.js +0 -888
- package/dist/cookie.d.ts +0 -60
- package/dist/cookie.js +0 -48
- package/dist/datetime.d.ts +0 -82
- package/dist/datetime.js +0 -161
- package/dist/format.d.ts +0 -36
- package/dist/format.js +0 -26
- package/dist/future.d.ts +0 -50
- package/dist/future.js +0 -59
- package/dist/html.d.ts +0 -145
- package/dist/html.js +0 -205
- package/dist/humanly.d.ts +0 -9
- package/dist/humanly.js +0 -93
- package/dist/lru.d.ts +0 -77
- package/dist/lru.js +0 -128
- package/dist/queue.d.ts +0 -39
- package/dist/queue.js +0 -54
- package/dist/url.d.ts +0 -61
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type { JiffPatch, Patch } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Кастомный патч или `never`. Вспомогательный тип для {@link jiffApply}
|
|
4
|
+
*/
|
|
5
|
+
export type NeverPatch = Patch<string> | never;
|
|
6
|
+
/**
|
|
7
|
+
* Ошибка последовательности патчей из {@link jiffApply}
|
|
8
|
+
*/
|
|
9
|
+
export interface JIFF_PROPERTY_ERROR<CustomPatch extends NeverPatch = never> {
|
|
10
|
+
/**
|
|
11
|
+
* Нарушена последовательность, ключ не найден
|
|
12
|
+
*/
|
|
13
|
+
type: "property";
|
|
14
|
+
/**
|
|
15
|
+
* Патч, который вызвал ошибку
|
|
16
|
+
*/
|
|
17
|
+
patch: CustomPatch | JiffPatch;
|
|
18
|
+
/**
|
|
19
|
+
* Переданный в функцию объект
|
|
20
|
+
*/
|
|
21
|
+
obj: object;
|
|
22
|
+
/**
|
|
23
|
+
* Объект, к которому применяется патч
|
|
24
|
+
*/
|
|
25
|
+
cursor: object;
|
|
26
|
+
/**
|
|
27
|
+
* Ключ, который был не найден
|
|
28
|
+
*/
|
|
29
|
+
property: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Ошибка патча из {@link jiffApply}
|
|
33
|
+
*/
|
|
34
|
+
export interface JIFF_PATCH_ERROR<CustomPatch extends NeverPatch = never> {
|
|
35
|
+
/**
|
|
36
|
+
* - "path" - невалидный путь в патче
|
|
37
|
+
* - "operation" - неизвестная операция в патче
|
|
38
|
+
*/
|
|
39
|
+
type: "path" | "operation";
|
|
40
|
+
/**
|
|
41
|
+
* Патч, который вызвал ошибку
|
|
42
|
+
*/
|
|
43
|
+
patch: CustomPatch | JiffPatch;
|
|
44
|
+
/**
|
|
45
|
+
* Переданный в функцию объект
|
|
46
|
+
*/
|
|
47
|
+
obj: object;
|
|
48
|
+
/**
|
|
49
|
+
* Для совместимости с {@link JIFF_PROPERTY_ERROR}
|
|
50
|
+
*/
|
|
51
|
+
cursor?: never;
|
|
52
|
+
/**
|
|
53
|
+
* Для совместимости с {@link JIFF_PROPERTY_ERROR}
|
|
54
|
+
*/
|
|
55
|
+
property?: never;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Типы ошибок для {@link jiffApply}
|
|
59
|
+
*/
|
|
60
|
+
export type JIFF_ERROR<CustomPatch extends NeverPatch = never> = JIFF_PATCH_ERROR<CustomPatch> | JIFF_PROPERTY_ERROR<CustomPatch>;
|
|
61
|
+
/**
|
|
62
|
+
* Дополнительные возможности {@link jiffApply}
|
|
63
|
+
*/
|
|
64
|
+
export interface JiffApplyProps<CustomPatch extends NeverPatch = never> {
|
|
65
|
+
/**
|
|
66
|
+
* Обработка ошибок
|
|
67
|
+
*/
|
|
68
|
+
onerror?: (err: JIFF_ERROR<CustomPatch>) => void;
|
|
69
|
+
/**
|
|
70
|
+
* Обработка кастомных патчей
|
|
71
|
+
*
|
|
72
|
+
* @template CustomPatch
|
|
73
|
+
* @param patch - Патч
|
|
74
|
+
* @param cursor - Текущий объект-курсор
|
|
75
|
+
* @param target - Целевое свойство
|
|
76
|
+
* @returns `true` если патч успешно обработан, `false` в противном случае
|
|
77
|
+
*/
|
|
78
|
+
custom?: (patch: CustomPatch, cursor: Record<string, unknown>, target: string) => boolean;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Применяет массив JSON-патчей к объекту
|
|
82
|
+
*
|
|
83
|
+
* Если патч неизвестен или нарушена последовательность модификации (`add "/foo/bar"` должен быть применён после `add "/foo"`) объекта,
|
|
84
|
+
* вызывает `props.onerror`, но объект будет изменён согласно патчам независимо от наличия ошибок
|
|
85
|
+
*
|
|
86
|
+
* @template CustomPatch - Типы пользовательских патчей (если используются), обработка через {@link JiffApplyProps.custom}
|
|
87
|
+
* @param obj - Объект, к которому применяется патч
|
|
88
|
+
* @param jiff - Массив патчей для применения
|
|
89
|
+
* @param [props] - Дополнительные возможности обработки патчей
|
|
90
|
+
*
|
|
91
|
+
* @see https://jsonpatch.com/ Документация стандарта
|
|
92
|
+
*/
|
|
93
|
+
export declare function jiffApply<CustomPatch extends NeverPatch = never>(obj: object, jiff: (CustomPatch | JiffPatch)[], props?: JiffApplyProps<CustomPatch>): void;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Применяет массив JSON-патчей к объекту
|
|
3
|
+
*
|
|
4
|
+
* Если патч неизвестен или нарушена последовательность модификации (`add "/foo/bar"` должен быть применён после `add "/foo"`) объекта,
|
|
5
|
+
* вызывает `props.onerror`, но объект будет изменён согласно патчам независимо от наличия ошибок
|
|
6
|
+
*
|
|
7
|
+
* @template CustomPatch - Типы пользовательских патчей (если используются), обработка через {@link JiffApplyProps.custom}
|
|
8
|
+
* @param obj - Объект, к которому применяется патч
|
|
9
|
+
* @param jiff - Массив патчей для применения
|
|
10
|
+
* @param [props] - Дополнительные возможности обработки патчей
|
|
11
|
+
*
|
|
12
|
+
* @see https://jsonpatch.com/ Документация стандарта
|
|
13
|
+
*/
|
|
14
|
+
export function jiffApply(obj, jiff, props) {
|
|
15
|
+
for (const patch of jiff) {
|
|
16
|
+
// Разделение пути патча на массив сегментов ("/foo/bar" -> ["foo", "bar"])
|
|
17
|
+
const path = patch.path.split("/").slice(1);
|
|
18
|
+
// Извлекаем последний сегмент пути как целевой элемент ("bar")
|
|
19
|
+
const target = path.pop();
|
|
20
|
+
if (!target) {
|
|
21
|
+
// Если путь невалидный (например, пустой), вызываем onerror с ошибкой типа "path"
|
|
22
|
+
props?.onerror?.({ type: "path", obj, patch });
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
// Начинаем с основного объекта
|
|
26
|
+
let cursor = obj;
|
|
27
|
+
for (const property of path) {
|
|
28
|
+
if (!(property in cursor)) {
|
|
29
|
+
// Ожидаемый ключ не найден
|
|
30
|
+
cursor[property] = {};
|
|
31
|
+
props?.onerror?.({ type: "property", property, obj, cursor, patch });
|
|
32
|
+
}
|
|
33
|
+
// Вложенный объект
|
|
34
|
+
cursor = cursor[property];
|
|
35
|
+
}
|
|
36
|
+
// Для патчей "remove" и "replace" проверяем существование целевого элемента
|
|
37
|
+
if (patch.op === "remove" || patch.op === "replace") {
|
|
38
|
+
if (!(target in cursor)) {
|
|
39
|
+
// Ожидаемый ключ не найден
|
|
40
|
+
cursor[target] = {};
|
|
41
|
+
props?.onerror?.({ type: "property", property: target, obj, cursor, patch });
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
switch (patch.op) {
|
|
45
|
+
case "remove":
|
|
46
|
+
if (Array.isArray(cursor))
|
|
47
|
+
cursor.splice(Number(target), 1);
|
|
48
|
+
else
|
|
49
|
+
delete cursor[target];
|
|
50
|
+
break;
|
|
51
|
+
case "replace":
|
|
52
|
+
case "add":
|
|
53
|
+
// Для операций "replace" и "add" устанавливаем новое значение
|
|
54
|
+
cursor[target] = patch.value;
|
|
55
|
+
break;
|
|
56
|
+
default:
|
|
57
|
+
// Если патч неизвестный, пытаемся применить кастомный обработчик
|
|
58
|
+
if (props?.custom?.(patch, cursor, target))
|
|
59
|
+
continue;
|
|
60
|
+
// В случае неизвестной операции вызываем onerror
|
|
61
|
+
props?.onerror?.({ type: "operation", obj, patch });
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { JiffPatch } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Генерирует список патчей для преобразования исходного объекта в целевой
|
|
4
|
+
*
|
|
5
|
+
* @see https://jsonpatch.com/ Документация стандарта
|
|
6
|
+
*/
|
|
7
|
+
export declare function jiffExtract(source: object, target: object): JiffPatch[];
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { isObject, isSameType } from "../index.js";
|
|
2
|
+
const handleArrayDifference = (sourceArr, targetArr, currentPath, diffs) => {
|
|
3
|
+
// Удаление лишних элементов
|
|
4
|
+
for (let i = sourceArr.length - 1; i >= targetArr.length; i--) {
|
|
5
|
+
diffs.remove.push({
|
|
6
|
+
op: "remove",
|
|
7
|
+
path: `/${[...currentPath, i].join("/")}`,
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
// Обработка существующих элементов
|
|
11
|
+
for (let i = 0; i < Math.max(sourceArr.length, targetArr.length); i++) {
|
|
12
|
+
const path = [...currentPath, i];
|
|
13
|
+
const sourceItem = sourceArr[i];
|
|
14
|
+
const targetItem = targetArr[i];
|
|
15
|
+
if (i >= targetArr.length) {
|
|
16
|
+
// Элементы за пределами targetArr уже обработаны в удалении
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
if (i >= sourceArr.length) {
|
|
20
|
+
// Добавление новых элементов обрабатываем здесь
|
|
21
|
+
diffs.add.push({
|
|
22
|
+
op: "add",
|
|
23
|
+
path: `/${path.join("/")}`,
|
|
24
|
+
value: targetItem,
|
|
25
|
+
});
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
compareValues(sourceItem, targetItem, path, diffs);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
const handleObjectDifference = (sourceObj, targetObj, currentPath, diffs) => {
|
|
32
|
+
// Удаление отсутствующих свойств
|
|
33
|
+
Object.keys(sourceObj).forEach((key) => {
|
|
34
|
+
if (!(key in targetObj)) {
|
|
35
|
+
diffs.remove.push({
|
|
36
|
+
op: "remove",
|
|
37
|
+
path: `/${[...currentPath, key].join("/")}`,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
// Обработка существующих и новых свойств
|
|
42
|
+
Object.entries(targetObj).forEach(([key, targetValue]) => {
|
|
43
|
+
const path = [...currentPath, key];
|
|
44
|
+
const sourceValue = sourceObj[key];
|
|
45
|
+
if (!(key in sourceObj)) {
|
|
46
|
+
diffs.add.push({ op: "add", path: `/${path.join("/")}`, value: targetValue });
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
compareValues(sourceValue, targetValue, path, diffs);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
};
|
|
53
|
+
const compareValues = (source, target, currentPath, diffs) => {
|
|
54
|
+
if (!isSameType(source, target)) {
|
|
55
|
+
diffs.replace.push({ op: "replace", path: `/${currentPath.join("/")}`, value: target });
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (Array.isArray(target)) {
|
|
59
|
+
handleArrayDifference(source, target, currentPath, diffs);
|
|
60
|
+
}
|
|
61
|
+
else if (isObject(target)) {
|
|
62
|
+
handleObjectDifference(source, target, currentPath, diffs);
|
|
63
|
+
}
|
|
64
|
+
else if (source !== target) {
|
|
65
|
+
diffs.replace.push({ op: "replace", path: `/${currentPath.join("/")}`, value: target });
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
//...
|
|
69
|
+
/**
|
|
70
|
+
* Генерирует список патчей для преобразования исходного объекта в целевой
|
|
71
|
+
*
|
|
72
|
+
* @see https://jsonpatch.com/ Документация стандарта
|
|
73
|
+
*/
|
|
74
|
+
export function jiffExtract(source, target) {
|
|
75
|
+
const diffs = {
|
|
76
|
+
remove: [],
|
|
77
|
+
replace: [],
|
|
78
|
+
add: [],
|
|
79
|
+
};
|
|
80
|
+
compareValues(source, target, [], diffs);
|
|
81
|
+
return [...diffs.remove.reverse(), ...diffs.replace, ...diffs.add];
|
|
82
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Интерфейс базового патча, который описывает операцию изменения объекта
|
|
3
|
+
*
|
|
4
|
+
* @see https://jsonpatch.com Документация стандарта
|
|
5
|
+
*/
|
|
6
|
+
export interface Patch<O extends string> {
|
|
7
|
+
/**
|
|
8
|
+
* Путь к изменяемому элементу в объекте
|
|
9
|
+
*
|
|
10
|
+
* @example "/foo/bar"
|
|
11
|
+
*/
|
|
12
|
+
path: string;
|
|
13
|
+
/**
|
|
14
|
+
* Тип операции патча
|
|
15
|
+
*
|
|
16
|
+
* @example "add" | "remove" | "replace"
|
|
17
|
+
*/
|
|
18
|
+
op: O;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Патч добавления значения ("add")
|
|
22
|
+
*
|
|
23
|
+
* @see https://jsonpatch.com Документация стандарта
|
|
24
|
+
*/
|
|
25
|
+
export interface JiffAddPatch<V = unknown> extends Patch<"add"> {
|
|
26
|
+
/**
|
|
27
|
+
* Значение, которое будет добавлено по указанному пути
|
|
28
|
+
*/
|
|
29
|
+
value: V;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Патч удаления значения ("remove")
|
|
33
|
+
*
|
|
34
|
+
* Поле `value` типа `never`, так как для удаления значения оно не требуется
|
|
35
|
+
*
|
|
36
|
+
* @see https://jsonpatch.com Документация стандарта
|
|
37
|
+
*/
|
|
38
|
+
export interface JiffRemovePatch extends Patch<"remove"> {
|
|
39
|
+
value?: never;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Патч для замены значения ("replace")
|
|
43
|
+
*
|
|
44
|
+
* @see https://jsonpatch.com Документация стандарта
|
|
45
|
+
*/
|
|
46
|
+
export interface JiffReplacePatch<V = unknown> extends Patch<"replace"> {
|
|
47
|
+
/**
|
|
48
|
+
* Новое значение, которое заменит старое
|
|
49
|
+
*/
|
|
50
|
+
value: V;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Поддерживаемые патчи: добавление, удаление и замена значений
|
|
54
|
+
*
|
|
55
|
+
* @see https://jsonpatch.com Документация стандарта
|
|
56
|
+
*/
|
|
57
|
+
export type JiffPatch<V = unknown> = JiffAddPatch<V> | JiffRemovePatch | JiffReplacePatch<V>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/lens.d.ts
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
|
+
import type { KEYS } from "./types.js";
|
|
1
2
|
/**
|
|
2
|
-
* Режим работы
|
|
3
|
+
* Режим работы линзы {@link Lens}:
|
|
3
4
|
* - `"exclude"` (исключение)
|
|
4
5
|
* - `"include"` (включение)
|
|
5
6
|
*/
|
|
6
7
|
export type LensMode = "exclude" | "include";
|
|
8
|
+
/**
|
|
9
|
+
* Схема для {@link Lens}, определяющая, какие ключи включить или исключить
|
|
10
|
+
*/
|
|
7
11
|
export type LensSchema<O> = {
|
|
8
12
|
[K in keyof O]?: boolean;
|
|
9
13
|
};
|
|
@@ -27,38 +31,23 @@ export interface LensConfig<O> {
|
|
|
27
31
|
/**
|
|
28
32
|
* Линза для фильтрации на основе схемы и режима
|
|
29
33
|
*
|
|
30
|
-
* @template O -
|
|
34
|
+
* @template O - Тип-объект для схемы, с которой работает линза
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```typescript
|
|
38
|
+
* // В режиме "exclude" с schema: { id: true }
|
|
39
|
+
* lens.check("id"); // false (исключен)
|
|
40
|
+
* lens.check("name"); // true (не исключен)
|
|
41
|
+
*
|
|
42
|
+
* // В режиме "include" с schema: { email: true }
|
|
43
|
+
* lens.check("email"); // true (включен)
|
|
44
|
+
* lens.check("phone"); // false (не включен)
|
|
45
|
+
* ```
|
|
31
46
|
*/
|
|
32
47
|
export declare class Lens<O> {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
*
|
|
36
|
-
* @default "exclude"
|
|
37
|
-
*/
|
|
38
|
-
_mode: LensMode;
|
|
39
|
-
/**
|
|
40
|
-
* Схема, определяющая, какие ключи включить или исключить
|
|
41
|
-
*
|
|
42
|
-
* @default {}
|
|
43
|
-
*/
|
|
44
|
-
_schema: LensSchema<O>;
|
|
45
|
-
/**
|
|
46
|
-
* Создаёт экземпляр линзы
|
|
47
|
-
*
|
|
48
|
-
* @param config - Конфигурация линзы {@link LensConfig}
|
|
49
|
-
*/
|
|
48
|
+
__mode: LensMode;
|
|
49
|
+
__schema: LensSchema<O>;
|
|
50
50
|
constructor(config: LensConfig<O>);
|
|
51
|
-
/**
|
|
52
|
-
* Пересборка под другую конфигурацию
|
|
53
|
-
*
|
|
54
|
-
* @param config - Конфигурация линзы {@link LensConfig}
|
|
55
|
-
*/
|
|
56
51
|
reconstruct(config: LensConfig<O>): void;
|
|
57
|
-
|
|
58
|
-
* Проверяет, должен ли ключ быть включён в результат
|
|
59
|
-
*
|
|
60
|
-
* @param key - Ключ для проверки
|
|
61
|
-
* @returns `true`, если ключ должен быть включён, иначе `false`
|
|
62
|
-
*/
|
|
63
|
-
get(key: keyof O): boolean;
|
|
52
|
+
check(key: KEYS<O>): boolean;
|
|
64
53
|
}
|
package/dist/lens.js
CHANGED
|
@@ -1,50 +1,35 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Линза для фильтрации на основе схемы и режима
|
|
3
3
|
*
|
|
4
|
-
* @template O -
|
|
4
|
+
* @template O - Тип-объект для схемы, с которой работает линза
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* // В режиме "exclude" с schema: { id: true }
|
|
9
|
+
* lens.check("id"); // false (исключен)
|
|
10
|
+
* lens.check("name"); // true (не исключен)
|
|
11
|
+
*
|
|
12
|
+
* // В режиме "include" с schema: { email: true }
|
|
13
|
+
* lens.check("email"); // true (включен)
|
|
14
|
+
* lens.check("phone"); // false (не включен)
|
|
15
|
+
* ```
|
|
5
16
|
*/
|
|
6
17
|
export class Lens {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
*
|
|
10
|
-
* @default "exclude"
|
|
11
|
-
*/
|
|
12
|
-
_mode;
|
|
13
|
-
/**
|
|
14
|
-
* Схема, определяющая, какие ключи включить или исключить
|
|
15
|
-
*
|
|
16
|
-
* @default {}
|
|
17
|
-
*/
|
|
18
|
-
_schema;
|
|
19
|
-
/**
|
|
20
|
-
* Создаёт экземпляр линзы
|
|
21
|
-
*
|
|
22
|
-
* @param config - Конфигурация линзы {@link LensConfig}
|
|
23
|
-
*/
|
|
18
|
+
__mode;
|
|
19
|
+
__schema;
|
|
24
20
|
constructor(config) {
|
|
25
21
|
this.reconstruct(config);
|
|
26
22
|
}
|
|
27
|
-
/**
|
|
28
|
-
* Пересборка под другую конфигурацию
|
|
29
|
-
*
|
|
30
|
-
* @param config - Конфигурация линзы {@link LensConfig}
|
|
31
|
-
*/
|
|
32
23
|
reconstruct(config) {
|
|
33
|
-
this.
|
|
34
|
-
this.
|
|
24
|
+
this.__mode = config.mode ?? "exclude";
|
|
25
|
+
this.__schema = config.schema ?? {};
|
|
35
26
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
* @returns `true`, если ключ должен быть включён, иначе `false`
|
|
41
|
-
*/
|
|
42
|
-
get(key) {
|
|
43
|
-
if (this._mode === "exclude") {
|
|
44
|
-
// Если в конфиге есть ключ в режиме исключения, то key false. Если нет — то true
|
|
45
|
-
return !this._schema[key];
|
|
27
|
+
check(key) {
|
|
28
|
+
if (this.__mode === "exclude") {
|
|
29
|
+
// Если в конфиге есть ключ в режиме исключения, то key false. Если нет - то true
|
|
30
|
+
return !this.__schema[key];
|
|
46
31
|
}
|
|
47
|
-
// Если в конфиге есть ключ, то key true. Если нет
|
|
48
|
-
return !!this.
|
|
32
|
+
// Если в конфиге есть ключ, то key true. Если нет - то false
|
|
33
|
+
return !!this.__schema[key];
|
|
49
34
|
}
|
|
50
35
|
}
|
package/dist/msgpack.d.ts
CHANGED
|
@@ -1,42 +1,27 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Данные в формате MSGPACK
|
|
2
|
+
* Данные в формате {@link https://msgpack.org MSGPACK}
|
|
3
3
|
*
|
|
4
|
-
* @template Data -
|
|
4
|
+
* @template Data - Исходные данные
|
|
5
5
|
* @template Pack - Флаг, определяющий, упакованы данные или нет
|
|
6
6
|
*
|
|
7
7
|
* @remarks Поля __meta с исходными данными **НЕ** существует. Только для типизации
|
|
8
|
-
*
|
|
9
|
-
* @see https://jsr.io/@std/msgpack Документация используемого пакета
|
|
10
|
-
* @see https://msgpack.org/ Документация стандарта MSGPACK
|
|
11
8
|
*/
|
|
12
|
-
export type MSGPACK<Data, Pack extends boolean = true> = (Pack extends true ?
|
|
9
|
+
export type MSGPACK<Data, Pack extends boolean = true> = (Pack extends true ? Uint8Array<ArrayBuffer> : Data) & {
|
|
13
10
|
__meta: Data;
|
|
14
11
|
};
|
|
15
12
|
/**
|
|
16
|
-
* Декодирует данные из формата
|
|
17
|
-
*
|
|
18
|
-
* Использует функцию {@link _decode} из пакета `@std/msgpack` для декодирования
|
|
19
|
-
*
|
|
20
|
-
* @template Data - Тип исходного объекта
|
|
21
|
-
* @param {MSGPACK<Data>} data - Данные в формате MSGPACK для декодирования
|
|
22
|
-
* @returns {Data} Декодированный объект
|
|
13
|
+
* Декодирует данные из формата {@link https://msgpack.org MSGPACK}
|
|
23
14
|
*
|
|
24
|
-
* @
|
|
25
|
-
* @see https://msgpack.org/ Документация стандарта MSGPACK
|
|
15
|
+
* Использует функцию {@link decode} из {@link https://jsr.io/@std/msgpack @std/msgpack}
|
|
26
16
|
*/
|
|
27
|
-
export declare const
|
|
17
|
+
export declare const depack: <Data>(data: MSGPACK<Data>) => Data;
|
|
28
18
|
/**
|
|
29
|
-
* Кодирует исходный объект в формат MSGPACK
|
|
30
|
-
* Объект **НЕ** должен содержать методы, `null` и `undefined`
|
|
19
|
+
* Кодирует исходный объект в формат {@link https://msgpack.org MSGPACK}
|
|
31
20
|
*
|
|
32
|
-
*
|
|
21
|
+
* @remarks Объект **НЕ** должен содержать методы, `null` и `undefined`
|
|
33
22
|
*
|
|
34
|
-
* @
|
|
35
|
-
* @param {Data} data - Объект для кодирования
|
|
36
|
-
* @returns {MSGPACK<Data>} Объект, закодированный в формат MSGPACK
|
|
37
|
-
* @throws {Error} Выбрасывает ошибку, если есть не поддерживаемые типы данных
|
|
23
|
+
* Использует функцию {@link encode} из {@link https://jsr.io/@std/msgpack @std/msgpack}
|
|
38
24
|
*
|
|
39
|
-
* @
|
|
40
|
-
* @see https://msgpack.org/ Документация стандарта MSGPACK
|
|
25
|
+
* @throws {Error} Выбрасывает ошибку, если есть не поддерживаемые типы данных
|
|
41
26
|
*/
|
|
42
|
-
export declare const
|
|
27
|
+
export declare const enpack: <Data>(data: Data) => MSGPACK<Data>;
|
package/dist/msgpack.js
CHANGED
|
@@ -1,29 +1,17 @@
|
|
|
1
|
-
import { decode
|
|
1
|
+
import { decode, encode } from "@std/msgpack";
|
|
2
2
|
/**
|
|
3
|
-
* Декодирует данные из формата
|
|
3
|
+
* Декодирует данные из формата {@link https://msgpack.org MSGPACK}
|
|
4
4
|
*
|
|
5
|
-
* Использует функцию {@link
|
|
6
|
-
*
|
|
7
|
-
* @template Data - Тип исходного объекта
|
|
8
|
-
* @param {MSGPACK<Data>} data - Данные в формате MSGPACK для декодирования
|
|
9
|
-
* @returns {Data} Декодированный объект
|
|
10
|
-
*
|
|
11
|
-
* @see https://jsr.io/@std/msgpack Документация используемого пакета
|
|
12
|
-
* @see https://msgpack.org/ Документация стандарта MSGPACK
|
|
5
|
+
* Использует функцию {@link decode} из {@link https://jsr.io/@std/msgpack @std/msgpack}
|
|
13
6
|
*/
|
|
14
|
-
export const
|
|
7
|
+
export const depack = (data) => decode(new Uint8Array(data));
|
|
15
8
|
/**
|
|
16
|
-
* Кодирует исходный объект в формат MSGPACK
|
|
17
|
-
* Объект **НЕ** должен содержать методы, `null` и `undefined`
|
|
9
|
+
* Кодирует исходный объект в формат {@link https://msgpack.org MSGPACK}
|
|
18
10
|
*
|
|
19
|
-
*
|
|
11
|
+
* @remarks Объект **НЕ** должен содержать методы, `null` и `undefined`
|
|
20
12
|
*
|
|
21
|
-
* @
|
|
22
|
-
* @param {Data} data - Объект для кодирования
|
|
23
|
-
* @returns {MSGPACK<Data>} Объект, закодированный в формат MSGPACK
|
|
24
|
-
* @throws {Error} Выбрасывает ошибку, если есть не поддерживаемые типы данных
|
|
13
|
+
* Использует функцию {@link encode} из {@link https://jsr.io/@std/msgpack @std/msgpack}
|
|
25
14
|
*
|
|
26
|
-
* @
|
|
27
|
-
* @see https://msgpack.org/ Документация стандарта MSGPACK
|
|
15
|
+
* @throws {Error} Выбрасывает ошибку, если есть не поддерживаемые типы данных
|
|
28
16
|
*/
|
|
29
|
-
export const
|
|
17
|
+
export const enpack = (data) => encode(data);
|
package/dist/mutate.d.ts
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { AnyFunc, Args, Return, ThisFuncCopy } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Рекурсивно модифицирует объект, приводя его структуру к виду целевого объекта.
|
|
4
|
+
* Использует внутри {@link deepMutateArray}
|
|
5
|
+
*
|
|
6
|
+
* Удаляет лишние свойства, обновляет существующие и добавляет новые.
|
|
7
|
+
* Работает **мутативно** — изменяет исходный объект напрямую
|
|
8
|
+
*
|
|
9
|
+
* @remarks **НЕ** предназначен для работы с декларативными методами (могут потерять `this`)
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* const source = { a: 1, b: 2, c: 3 };
|
|
14
|
+
* const target = { a: 10, d: 40 };
|
|
15
|
+
*
|
|
16
|
+
* deepMutateObject(source, target);
|
|
17
|
+
* // source теперь: { a: 10, d: 40 }
|
|
18
|
+
* // свойства b и c удалены, a обновлено, d добавлено
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export declare const deepMutateObject: (source: object, target: object) => void;
|
|
22
|
+
/**
|
|
23
|
+
* Рекурсивно модифицирует массив, приводя его к виду целевого массива.
|
|
24
|
+
* Использует внутри {@link deepMutateObject}
|
|
25
|
+
*
|
|
26
|
+
* Обрезает лишние элементы, обновляет существующие и добавляет новые.
|
|
27
|
+
* Работает **мутативно** — изменяет исходный массив напрямую
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* const complexSource = [
|
|
32
|
+
* { id: 1, name: "John" },
|
|
33
|
+
* { id: 2, name: "Jane" }
|
|
34
|
+
* ];
|
|
35
|
+
* const complexTarget = [
|
|
36
|
+
* { id: 1, name: "Johnny" },
|
|
37
|
+
* { id: 3, name: "Bob" }
|
|
38
|
+
* ];
|
|
39
|
+
*
|
|
40
|
+
* deepMutateArray(complexSource, complexTarget);
|
|
41
|
+
*
|
|
42
|
+
* // complexSource теперь: [
|
|
43
|
+
* // { id: 1, name: "Johnny" },
|
|
44
|
+
* // { id: 3, name: "Bob" }
|
|
45
|
+
* // ]
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export declare const deepMutateArray: (source: unknown[], target: unknown[]) => void;
|
|
49
|
+
/**
|
|
50
|
+
* Контекст для {@link inject}
|
|
51
|
+
*/
|
|
52
|
+
export interface injectContext<O extends Record<K, AnyFunc>, K extends keyof O> {
|
|
53
|
+
self: O;
|
|
54
|
+
method: ThisFuncCopy<O, O[K]>;
|
|
55
|
+
args: Args<O[K]>;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Заменяет метод объекта обёрткой, передающей управление указанной функции
|
|
59
|
+
*
|
|
60
|
+
* Обёртка предоставляет контекст с оригинальным объектом, прокси-методом через {@link Reflect.apply} для вызова
|
|
61
|
+
* исходной реализации и аргументами вызова
|
|
62
|
+
*
|
|
63
|
+
* @param self - Объект, метод которого будет заменён
|
|
64
|
+
* @param key - Ключ метода в объекте
|
|
65
|
+
* @param func - Функция-обработчик, получающая контекст вызова
|
|
66
|
+
* @param [dynamic=false] - Использовать связывание `this` при вызове, что позволяет переносить цепочки на другие объекты
|
|
67
|
+
*
|
|
68
|
+
* @throws {TypeError} Если `self[key]` не является функцией
|
|
69
|
+
*/
|
|
70
|
+
export declare const inject: <O extends Record<K, AnyFunc>, K extends keyof O>(self: O, key: K, func: (ctx: {}) => Return<O[K]>, dynamic?: boolean) => void;
|