@mirta/basics 0.3.5 → 0.4.1
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/array/index.d.mts +61 -0
- package/dist/array/index.mjs +67 -0
- package/dist/fuzzy/index.d.mts +170 -0
- package/dist/fuzzy/index.mjs +557 -0
- package/dist/guards.mjs +133 -0
- package/dist/index.d.mts +236 -0
- package/dist/index.mjs +4 -9
- package/dist/object/index.d.mts +161 -0
- package/dist/object/index.mjs +56 -0
- package/package.json +28 -5
- package/dist/index.d.ts +0 -119
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Преобразует входное значение в массив.
|
|
3
|
+
*
|
|
4
|
+
* Если входное значение уже является массивом, возвращает его копию.
|
|
5
|
+
* В противном случае оборачивает значение в массив и возвращает результат.
|
|
6
|
+
*
|
|
7
|
+
* @template TItem - Тип элемента или массива элементов.
|
|
8
|
+
* @param input - Входное значение, которое может быть одиночным элементом или массивом элементов.
|
|
9
|
+
* @returns Массив, содержащий один элемент (если входной — не массив) или копию входного массива.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* ensureArray('hello') // → ['hello']
|
|
14
|
+
* ```
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* ensureArray([1, 2, 3]) // → [1, 2, 3]
|
|
18
|
+
* ```
|
|
19
|
+
* @example
|
|
20
|
+
* ```ts
|
|
21
|
+
* ensureArray(null) // → [null]
|
|
22
|
+
* ```
|
|
23
|
+
* @since 0.4.0
|
|
24
|
+
*
|
|
25
|
+
**/
|
|
26
|
+
declare function ensureArray<TItem>(input: TItem | TItem[]): TItem[];
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Преобразует входные данные в массив, исключая все "ложные" значения.
|
|
30
|
+
*
|
|
31
|
+
* К ложным значениям относятся: `0`, `''`, `false`, `null`, `undefined`, `NaN`.
|
|
32
|
+
*
|
|
33
|
+
* @template TItem - Тип допустимых значений.
|
|
34
|
+
* @param input - Вход: значение или массив с возможными `false`, `null`, `undefined`.
|
|
35
|
+
* @returns Массив истинных значений типа `TItem[]`. Если вход пустой — возвращает `[]`.
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
*
|
|
39
|
+
* ```ts
|
|
40
|
+
* ensureCompactArray([1, null, 2, '']) // → [1, 2]
|
|
41
|
+
*
|
|
42
|
+
* ```
|
|
43
|
+
* @example
|
|
44
|
+
*
|
|
45
|
+
* ```ts
|
|
46
|
+
* ensureCompactArray('hello') // → ['hello']
|
|
47
|
+
*
|
|
48
|
+
* ```
|
|
49
|
+
* @example
|
|
50
|
+
*
|
|
51
|
+
* ```ts
|
|
52
|
+
* ensureCompactArray(undefined) // → []
|
|
53
|
+
*
|
|
54
|
+
* ```
|
|
55
|
+
*
|
|
56
|
+
* @since 0.4.0
|
|
57
|
+
*
|
|
58
|
+
**/
|
|
59
|
+
declare function ensureCompactArray<TItem>(input: TItem | false | null | undefined | (TItem | false | null | undefined)[]): TItem[];
|
|
60
|
+
|
|
61
|
+
export { ensureArray, ensureCompactArray };
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Преобразует входное значение в массив.
|
|
3
|
+
*
|
|
4
|
+
* Если входное значение уже является массивом, возвращает его копию.
|
|
5
|
+
* В противном случае оборачивает значение в массив и возвращает результат.
|
|
6
|
+
*
|
|
7
|
+
* @template TItem - Тип элемента или массива элементов.
|
|
8
|
+
* @param input - Входное значение, которое может быть одиночным элементом или массивом элементов.
|
|
9
|
+
* @returns Массив, содержащий один элемент (если входной — не массив) или копию входного массива.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* ensureArray('hello') // → ['hello']
|
|
14
|
+
* ```
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* ensureArray([1, 2, 3]) // → [1, 2, 3]
|
|
18
|
+
* ```
|
|
19
|
+
* @example
|
|
20
|
+
* ```ts
|
|
21
|
+
* ensureArray(null) // → [null]
|
|
22
|
+
* ```
|
|
23
|
+
* @since 0.4.0
|
|
24
|
+
*
|
|
25
|
+
**/
|
|
26
|
+
function ensureArray(input) {
|
|
27
|
+
return Array.isArray(input) ? [...input] : [input];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Преобразует входные данные в массив, исключая все "ложные" значения.
|
|
32
|
+
*
|
|
33
|
+
* К ложным значениям относятся: `0`, `''`, `false`, `null`, `undefined`, `NaN`.
|
|
34
|
+
*
|
|
35
|
+
* @template TItem - Тип допустимых значений.
|
|
36
|
+
* @param input - Вход: значение или массив с возможными `false`, `null`, `undefined`.
|
|
37
|
+
* @returns Массив истинных значений типа `TItem[]`. Если вход пустой — возвращает `[]`.
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
*
|
|
41
|
+
* ```ts
|
|
42
|
+
* ensureCompactArray([1, null, 2, '']) // → [1, 2]
|
|
43
|
+
*
|
|
44
|
+
* ```
|
|
45
|
+
* @example
|
|
46
|
+
*
|
|
47
|
+
* ```ts
|
|
48
|
+
* ensureCompactArray('hello') // → ['hello']
|
|
49
|
+
*
|
|
50
|
+
* ```
|
|
51
|
+
* @example
|
|
52
|
+
*
|
|
53
|
+
* ```ts
|
|
54
|
+
* ensureCompactArray(undefined) // → []
|
|
55
|
+
*
|
|
56
|
+
* ```
|
|
57
|
+
*
|
|
58
|
+
* @since 0.4.0
|
|
59
|
+
*
|
|
60
|
+
**/
|
|
61
|
+
function ensureCompactArray(input) {
|
|
62
|
+
if (Array.isArray(input))
|
|
63
|
+
return input.filter(Boolean);
|
|
64
|
+
return input ? [input] : [];
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export { ensureArray, ensureCompactArray };
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Универсальный результат вычисления расстояния редактирования между двумя строками.
|
|
3
|
+
*
|
|
4
|
+
* Интерфейс предназначен для стандартизации выходных данных различных алгоритмов
|
|
5
|
+
* нечёткого сравнения строк, таких как Левенштейн и Дамерау-Левенштейн.
|
|
6
|
+
*
|
|
7
|
+
* Позволяет единообразно работать с метриками схожести в системах подсказок,
|
|
8
|
+
* нечёткого поиска и обработки опечаток.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* const result: DistanceResult = damerauLevenshtein("команда", "команда");
|
|
13
|
+
* log(result.steps); // 0
|
|
14
|
+
* log(result.relative); // 0
|
|
15
|
+
* log(result.similarity); // 1
|
|
16
|
+
* ```
|
|
17
|
+
* @since 0.4.0
|
|
18
|
+
*
|
|
19
|
+
**/
|
|
20
|
+
interface DistanceResult {
|
|
21
|
+
/**
|
|
22
|
+
* Количество операций редактирования, необходимых для преобразования
|
|
23
|
+
* одной строки в другую. Конкретный набор операций зависит от реализации алгоритма:
|
|
24
|
+
*
|
|
25
|
+
* - Алгоритм Левенштейна: вставка, удаление, замена
|
|
26
|
+
* - Алгоритм Дамерау-Левенштейна: + транспозиция соседних символов
|
|
27
|
+
* - Другие алгоритмы: могут использовать свои метрики (например, блоковые перестановки)
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* Для алгоритма Дамерау-Левенштейна:
|
|
31
|
+
* ```txt
|
|
32
|
+
* "релиз" → "релзи" = 1 (транспозиция 'и' и 'з')
|
|
33
|
+
* ```
|
|
34
|
+
* Для алгоритма Левенштейна:
|
|
35
|
+
* ```txt
|
|
36
|
+
* "релиз" → "релзи" = 2 (удаление + вставка)
|
|
37
|
+
* ```
|
|
38
|
+
**/
|
|
39
|
+
readonly steps: number;
|
|
40
|
+
/**
|
|
41
|
+
* Относительное расстояние — нормализованная метрика, рассчитываемая как отношение
|
|
42
|
+
* количества операций к максимальной длине сравниваемых строк.
|
|
43
|
+
*
|
|
44
|
+
* Позволяет сравнивать строки разной длины на одной шкале.
|
|
45
|
+
*
|
|
46
|
+
* Указывается в диапазоне от 0 (полное совпадение) до 1 (максимальное различие).
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* Для строк "текст" (5) и "тест" (4) при steps = 1:
|
|
50
|
+
* ```txt
|
|
51
|
+
* relative = 1 / max(5, 4) = 1 / 5 = 0.2
|
|
52
|
+
* ```
|
|
53
|
+
**/
|
|
54
|
+
readonly relative: number;
|
|
55
|
+
/**
|
|
56
|
+
* Степень схожести строк — величина, обратная относительному расстоянию.
|
|
57
|
+
*
|
|
58
|
+
* Используется для ранжирования результатов в системах нечёткого поиска и подсказок.
|
|
59
|
+
* Чем выше значение, тем больше вероятность, что строки семантически близки.
|
|
60
|
+
*
|
|
61
|
+
* Указывается в диапазоне от 0 (максимальное различие) до 1 (полное совпадение)
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* ```txt
|
|
65
|
+
* similarity = 1 - relative
|
|
66
|
+
* relative = 0.2 → similarity = 0.8
|
|
67
|
+
* ```
|
|
68
|
+
**/
|
|
69
|
+
readonly similarity: number;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Вычисляет расстояние Дамерау-Левенштейна между двумя строками.
|
|
74
|
+
*
|
|
75
|
+
* Сложность: `O(n × m)` 💥 Экспоненциальный рост.
|
|
76
|
+
*
|
|
77
|
+
* @param from Первая строка
|
|
78
|
+
* @param to Вторая строка
|
|
79
|
+
* @param maxDistance Максимальное расстояние для расчёта.
|
|
80
|
+
* Если превышено, расстояние возвращается как `Infinity`.
|
|
81
|
+
*
|
|
82
|
+
* @since 0.4.0
|
|
83
|
+
*
|
|
84
|
+
**/
|
|
85
|
+
declare function damerauLevenshtein(from: string, to: string, maxDistance?: number): DistanceResult;
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Тип для фонетического кода — строка, гарантированно содержащая 6 цифр.
|
|
89
|
+
*
|
|
90
|
+
* Используется для маркировки результата функции `daitchMokotoffLite`,
|
|
91
|
+
* чтобы отличать обычные строки от валидных фонетических кодов.
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* ```ts
|
|
95
|
+
* '550000' as PhoneticCode
|
|
96
|
+
* ```
|
|
97
|
+
*
|
|
98
|
+
* @since 0.4.0
|
|
99
|
+
*
|
|
100
|
+
**/
|
|
101
|
+
type PhoneticCode = Branded<string, 'PhoneticCode'>;
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Упрощённая реализация алгоритма Daitch-Mokotoff для фонетического кодирования.
|
|
105
|
+
*
|
|
106
|
+
* Сложность: `O(n)` — один проход по строке.
|
|
107
|
+
*
|
|
108
|
+
* Преобразует строки в 6-значные коды, устойчивые к опечаткам, транслитерации и диалектным различиям.
|
|
109
|
+
* Поддерживает кириллицу через транслитерацию.
|
|
110
|
+
*
|
|
111
|
+
* @param input - Входная строка (может быть `null` / `undefined`)
|
|
112
|
+
* @returns 6-значный фонетический код
|
|
113
|
+
*
|
|
114
|
+
* @since 0.4.0
|
|
115
|
+
*
|
|
116
|
+
**/
|
|
117
|
+
declare function daitchMokotoffLite(input: string | null | undefined): PhoneticCode;
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Параметры для работы с функцией {@link suggestClosest} — нечёткого поиска
|
|
121
|
+
* наиболее подходящего значения на основе ввода пользователя.
|
|
122
|
+
*
|
|
123
|
+
* Используется для настройки чувствительности и поведения при сравнении строк.
|
|
124
|
+
*
|
|
125
|
+
* @since 0.4.0
|
|
126
|
+
*
|
|
127
|
+
**/
|
|
128
|
+
interface SuggestOptions {
|
|
129
|
+
/**
|
|
130
|
+
* Максимальное расстояние Дамерау-Левенштейна, при котором значение
|
|
131
|
+
* считается допустимым кандидатом для подсказки. По умолчанию — `2`.
|
|
132
|
+
*
|
|
133
|
+
* Чем меньше значение, тем строже сравнение.
|
|
134
|
+
*
|
|
135
|
+
**/
|
|
136
|
+
maxDistance?: number;
|
|
137
|
+
/**
|
|
138
|
+
* Веса для комбинированного ранжира.
|
|
139
|
+
* Сумма не обязана быть 1 — нормализуется внутри.
|
|
140
|
+
*/
|
|
141
|
+
weights?: {
|
|
142
|
+
phonetic?: number;
|
|
143
|
+
trigram?: number;
|
|
144
|
+
levenshtein?: number;
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Предлагает наиболее близкое значение из списка допустимых,
|
|
149
|
+
* используя алгоритм Дамерау-Левенштейна для учёта опечаток.
|
|
150
|
+
*
|
|
151
|
+
* Функция предназначена для реализации подсказок вроде:
|
|
152
|
+
* "Вы имели в виду 'release'?", когда пользователь ввёл 'releas'.
|
|
153
|
+
*
|
|
154
|
+
* @param input Введённая пользователем строка, возможно, с опечаткой
|
|
155
|
+
* @param targetValues Список корректных, допустимых значений (например, команды, флаги)
|
|
156
|
+
* @param options Настройки нечёткого поиска
|
|
157
|
+
* @returns Наиболее близкое значение из `knownValues` или `undefined`, если совпадений нет
|
|
158
|
+
*
|
|
159
|
+
* @example
|
|
160
|
+
* ```ts
|
|
161
|
+
* suggestClosest('releas', ['release', 'publish']) // → 'release'
|
|
162
|
+
* suggestClosest('релиз', ['release', 'publish']) // → 'release'
|
|
163
|
+
* ```
|
|
164
|
+
* @since 0.4.0
|
|
165
|
+
*
|
|
166
|
+
**/
|
|
167
|
+
declare function suggestClosest(input: string, targetValues: readonly string[], options?: SuggestOptions): string | undefined;
|
|
168
|
+
|
|
169
|
+
export { daitchMokotoffLite, damerauLevenshtein, suggestClosest };
|
|
170
|
+
export type { DistanceResult, PhoneticCode, SuggestOptions };
|