@nemigo/helpers 0.13.3 → 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.
Files changed (111) hide show
  1. package/dist/aggregator.d.ts +33 -0
  2. package/dist/aggregator.js +44 -0
  3. package/dist/array.d.ts +33 -0
  4. package/dist/array.js +24 -0
  5. package/dist/async/context.d.ts +73 -0
  6. package/dist/async/context.js +90 -0
  7. package/dist/async/future.d.ts +54 -0
  8. package/dist/async/future.js +71 -0
  9. package/dist/async/index.d.ts +56 -27
  10. package/dist/async/index.js +63 -58
  11. package/dist/async/loader.d.ts +67 -0
  12. package/dist/async/loader.js +101 -0
  13. package/dist/async/queue.d.ts +51 -0
  14. package/dist/async/queue.js +84 -0
  15. package/dist/cases.d.ts +31 -21
  16. package/dist/cases.js +41 -37
  17. package/dist/clean.d.ts +44 -26
  18. package/dist/clean.js +67 -42
  19. package/dist/color/types.d.ts +31 -0
  20. package/dist/color/types.js +1 -0
  21. package/dist/datetime/delta.d.ts +28 -0
  22. package/dist/datetime/delta.js +65 -0
  23. package/dist/datetime/format.d.ts +53 -0
  24. package/dist/datetime/format.js +119 -0
  25. package/dist/datetime/index.d.ts +6 -0
  26. package/dist/datetime/index.js +22 -0
  27. package/dist/datetime/plural.d.ts +77 -0
  28. package/dist/datetime/plural.js +78 -0
  29. package/dist/emitter.d.ts +29 -17
  30. package/dist/emitter.js +35 -21
  31. package/dist/explorer.d.ts +22 -29
  32. package/dist/explorer.js +18 -16
  33. package/dist/files.d.ts +31 -2
  34. package/dist/files.js +33 -8
  35. package/dist/fish.d.ts +29 -0
  36. package/dist/fish.js +70 -0
  37. package/dist/html/cookie.d.ts +48 -0
  38. package/dist/html/cookie.js +37 -0
  39. package/dist/html/events.d.ts +133 -0
  40. package/dist/html/events.js +139 -0
  41. package/dist/html/index.d.ts +31 -0
  42. package/dist/html/index.js +61 -0
  43. package/dist/index.d.ts +38 -40
  44. package/dist/index.js +43 -56
  45. package/dist/jiff/apply.d.ts +93 -0
  46. package/dist/jiff/apply.js +64 -0
  47. package/dist/jiff/extract.d.ts +7 -0
  48. package/dist/jiff/extract.js +82 -0
  49. package/dist/jiff/types.d.ts +57 -0
  50. package/dist/jiff/types.js +1 -0
  51. package/dist/lens.d.ts +20 -31
  52. package/dist/lens.js +22 -37
  53. package/dist/msgpack.d.ts +11 -26
  54. package/dist/msgpack.js +9 -21
  55. package/dist/mutate.d.ts +70 -0
  56. package/dist/mutate.js +130 -0
  57. package/dist/omitter.d.ts +54 -34
  58. package/dist/omitter.js +33 -25
  59. package/dist/path.d.ts +20 -1
  60. package/dist/path.js +21 -2
  61. package/dist/phymath/format.d.ts +60 -0
  62. package/dist/phymath/format.js +34 -0
  63. package/dist/phymath/index.d.ts +30 -30
  64. package/dist/phymath/index.js +41 -33
  65. package/dist/promoter.d.ts +20 -12
  66. package/dist/promoter.js +24 -17
  67. package/dist/random.d.ts +20 -21
  68. package/dist/random.js +22 -23
  69. package/dist/rubles.d.ts +24 -0
  70. package/dist/rubles.js +24 -0
  71. package/dist/script.d.ts +60 -13
  72. package/dist/script.js +46 -10
  73. package/dist/string.d.ts +46 -92
  74. package/dist/string.js +46 -171
  75. package/dist/types.d.ts +144 -25
  76. package/dist/url/index.d.ts +12 -0
  77. package/dist/url/index.js +17 -0
  78. package/dist/url/params.d.ts +141 -0
  79. package/dist/{url.js → url/params.js} +90 -18
  80. package/dist/url/slug.d.ts +28 -0
  81. package/dist/url/slug.js +102 -0
  82. package/dist/veil.d.ts +14 -0
  83. package/dist/veil.js +26 -0
  84. package/dist/xod.d.ts +237 -16
  85. package/dist/xod.js +192 -18
  86. package/dist/zipper.d.ts +22 -4
  87. package/dist/zipper.js +22 -5
  88. package/package.json +82 -34
  89. package/dist/async/space.d.ts +0 -8
  90. package/dist/async/space.js +0 -31
  91. package/dist/cleanup.d.ts +0 -9
  92. package/dist/cleanup.js +0 -18
  93. package/dist/colors.d.ts +0 -539
  94. package/dist/colors.js +0 -888
  95. package/dist/cookie.d.ts +0 -60
  96. package/dist/cookie.js +0 -48
  97. package/dist/datetime.d.ts +0 -82
  98. package/dist/datetime.js +0 -161
  99. package/dist/format.d.ts +0 -36
  100. package/dist/format.js +0 -26
  101. package/dist/future.d.ts +0 -51
  102. package/dist/future.js +0 -71
  103. package/dist/html.d.ts +0 -145
  104. package/dist/html.js +0 -205
  105. package/dist/humanly.d.ts +0 -9
  106. package/dist/humanly.js +0 -93
  107. package/dist/lru.d.ts +0 -77
  108. package/dist/lru.js +0 -128
  109. package/dist/queue.d.ts +0 -40
  110. package/dist/queue.js +0 -56
  111. package/dist/url.d.ts +0 -61
package/dist/string.d.ts CHANGED
@@ -1,95 +1,95 @@
1
+ /**
2
+ * Удаляет все вхождения плейсхолдеров из строки через {@link String.replaceAll}
3
+ *
4
+ * @param [str=""] - Входная строка
5
+ * @param [placeholder="_"] - Строка или регулярное выражение для удаления
6
+ *
7
+ * @remarks Если используется `RegExp`, он **должен содержать флаг `g`**
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * clearPH("user___name"); // "username"
12
+ * ```
13
+ */
14
+ export declare const clearPH: (str?: string, placeholder?: string | RegExp) => string;
1
15
  /**
2
16
  * Регулярное выражение для захвата всех нецифровых символов из строки.
3
- * Используется для удаления всех символов, кроме цифр 0-9.
17
+ * Используется для удаления всех символов, кроме цифр 0-9
4
18
  */
5
19
  export declare const oDigitRegExp: RegExp;
6
20
  /**
7
- * Удаляет все символы из строки, кроме цифр 0-9.
21
+ * Удаляет все символы из строки, кроме цифр 0-9
8
22
  *
9
- * @param v - Входная строка для очистки
10
- * @returns Строка, содержащая только цифры
23
+ * @param [str=""] - Входная строка для очистки
11
24
  *
12
25
  * @example
13
26
  * ```typescript
14
27
  * oDigitClean("abc123def456"); // "123456"
15
28
  * oDigitClean("+7 (999) 123-45-67"); // "79991234567"
16
- * oDigitClean(""); // ""
17
29
  * ```
18
30
  */
19
- export declare const oDigitClean: (v?: string) => string;
31
+ export declare const oDigitClean: (str?: string) => string;
20
32
  /**
21
- * Регулярное выражение для захвата одного или более пробельных символов подряд.
22
- * Включает пробелы, табуляции, переносы строк и другие пробельные символы.
33
+ * Регулярное выражение для захвата одного или более пробельных символов подряд
23
34
  */
24
- export declare const spaceRegExp: RegExp;
35
+ export declare const oSpaceRegExp: RegExp;
25
36
  /**
26
- * Нормализует пробелы в строке: заменяет множественные пробелы на один и удаляет пробелы в начале и конце.
37
+ * Нормализует пробелы в строке: заменяет множественные пробелы на один и удаляет пробелы в начале и конце
27
38
  *
28
- * @param v - Входная строка для нормализации
29
- * @returns Строка с нормализованными пробелами
39
+ * @param [str=""] - Входная строка для нормализации
30
40
  *
31
41
  * @example
32
42
  * ```typescript
33
- * spaceClean(" hello world "); // "hello world"
34
- * spaceClean("multiple\n\n\nspaces"); // "multiple spaces"
35
- * spaceClean("tab\t\tseparated"); // "tab separated"
43
+ * oSpaceClean(" hello world "); // "hello world"
44
+ * oSpaceClean("multiple\n\n\nspaces"); // "multiple spaces"
45
+ * oSpaceClean("tab\t\tseparated"); // "tab separated"
36
46
  * ```
37
47
  */
38
- export declare const spaceClean: (v?: string) => string;
48
+ export declare const oSpaceClean: (str?: string) => string;
39
49
  /**
40
- * Удаляет все вхождения плейсхолдера из строки.
50
+ * Приводит строку к нижнему регистру и нормализует пробелы.
51
+ * Комбинация методов {@link String.toLowerCase} и {@link oSpaceClean}
41
52
  *
42
- * @param str - Входная строка
43
- * @param placeholder - Строка или регулярное выражение для удаления (по умолчанию "_")
44
- * @returns Строка без плейсхолдеров
53
+ * @param [str=""] - Строка для нормализации
45
54
  *
46
55
  * @example
47
56
  * ```typescript
48
- * clearPH("hello_world_test", "_"); // "helloworldtest"
49
- * clearPH("user___name", "_"); // "username"
50
- * clearPH("test***end", "*"); // "testend"
51
- * clearPH("email@domain.com", /@/); // "emaildomain.com"
57
+ * toFlat(" Hello World "); // "hello world"
58
+ * toFlat("CamelCase String"); // "camelcase string"
59
+ * toFlat(""); // ""
52
60
  * ```
53
61
  */
54
- export declare const clearPH: (str?: string, placeholder?: string | RegExp) => string;
62
+ export declare const toFlat: (str?: string) => string;
55
63
  /**
56
- * Приводит первый символ строки к верхнему регистру, остальные оставляет без изменений.
64
+ * Приводит первый символ строки к верхнему регистру, остальные оставляет без изменений
57
65
  *
58
- * @param word - Строка для капитализации
59
- * @returns Строка с заглавной первой буквой
66
+ * @param [word=""] - Слово для капитализации
60
67
  *
61
68
  * @example
62
69
  * ```typescript
63
- * toCapital("hello"); // "Hello"
64
- * toCapital("world"); // "World"
65
- * toCapital(""); // ""
66
- * toCapital("a"); // "A"
70
+ * toCapitalCase("hello"); // "Hello"
67
71
  * ```
68
72
  */
69
- export declare const toCapital: (word?: string) => string;
73
+ export declare const toCapitalCase: (word?: string) => string;
70
74
  /**
71
- * Приводит первый символ каждого слова к верхнему регистру (Title Case).
72
- * Разделяет строку по пробелам и применяет капитализацию к каждому слову.
75
+ * Разделяет строку по пробелам и приводит первый символ каждого слова к верхнему регистру ({@link toCapitalCase})
73
76
  *
74
- * @param str - Строка для преобразования в Title Case
75
- * @returns Строка с заглавными первыми буквами каждого слова
77
+ * @param [str=""] - Строка для преобразования в Title Case
76
78
  *
77
79
  * @example
78
80
  * ```typescript
79
- * toCapitalMap("hello world"); // "Hello World"
80
- * toCapitalMap("javascript programming"); // "Javascript Programming"
81
- * toCapitalMap(""); // ""
82
- * toCapitalMap("single"); // "Single"
81
+ * toCapitalCaseMap("hello world"); // "Hello World"
82
+ * toCapitalCaseMap(""); // ""
83
+ * toCapitalCaseMap("single"); // "Single"
83
84
  * ```
84
85
  */
85
- export declare const toCapitalMap: (str?: string) => string;
86
+ export declare const toCapitalCaseMap: (str?: string) => string;
86
87
  /**
87
- * Повторяет строку указанное количество раз с разделителем между повторениями.
88
+ * Повторяет строку указанное количество раз с разделителем между повторениями
88
89
  *
89
90
  * @param str - Исходная строка для повторения
90
- * @param length - Количество повторений (должно быть неотрицательным)
91
- * @param separator - Разделитель между повторениями (по умолчанию пустая строка)
92
- * @returns Результирующая строка из повторений
91
+ * @param length - Количество повторений (**должно быть ≥ 0**)
92
+ * @param [separator=""] - Разделитель между повторениями
93
93
  *
94
94
  * @example
95
95
  * ```typescript
@@ -101,49 +101,3 @@ export declare const toCapitalMap: (str?: string) => string;
101
101
  * ```
102
102
  */
103
103
  export declare const repeat: (str: string, length: number, separator?: string) => string;
104
- /**
105
- * Приводит строку к нижнему регистру и нормализует пробелы.
106
- * Комбинация методов toLowerCase() и spaceClean().
107
- *
108
- * @param str - Строка для нормализации
109
- * @returns Строка в нижнем регистре с нормализованными пробелами
110
- *
111
- * @example
112
- * ```typescript
113
- * toFlat(" Hello World "); // "hello world"
114
- * toFlat("CamelCase String"); // "camelcase string"
115
- * toFlat(""); // ""
116
- * ```
117
- */
118
- export declare const toFlat: (str?: string) => string;
119
- /**
120
- * Карта для транслитерации кириллических символов в латинские.
121
- * Содержит соответствия для всех букв русского алфавита в нижнем регистре.
122
- * Используется в функции {@link toSlug} для создания URL-friendly строк.
123
- *
124
- * @example
125
- * ```typescript
126
- * cyrillicToLatinMap.get('а'); // "a"
127
- * cyrillicToLatinMap.get('ё'); // "yo"
128
- * cyrillicToLatinMap.get('ъ'); // ""
129
- * ```
130
- */
131
- export declare const cyrillicToLatinMap: Map<string, string>;
132
- /**
133
- * Создает URL-friendly slug из текста.
134
- * Конвертирует кириллицу в латиницу, удаляет специальные символы,
135
- * нормализует пробелы и заменяет их на разделитель.
136
- *
137
- * @param text - Исходный текст для преобразования в slug
138
- * @param separator - Разделитель для замены пробелов (по умолчанию "-")
139
- * @returns URL-friendly строка
140
- *
141
- * @example
142
- * ```typescript
143
- * toSlug("Привет, мир!"); // "privet-mir"
144
- * toSlug("JavaScript Programming"); // "javascript-programming"
145
- * toSlug("Café & Restaurant", "_"); // "cafe_restaurant"
146
- * toSlug("Специальные символы!!!", "."); // "specialnye-simvoly"
147
- * ```
148
- */
149
- export declare const toSlug: (text: string, separator?: string) => string;
package/dist/string.js CHANGED
@@ -1,98 +1,95 @@
1
+ /**
2
+ * Удаляет все вхождения плейсхолдеров из строки через {@link String.replaceAll}
3
+ *
4
+ * @param [str=""] - Входная строка
5
+ * @param [placeholder="_"] - Строка или регулярное выражение для удаления
6
+ *
7
+ * @remarks Если используется `RegExp`, он **должен содержать флаг `g`**
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * clearPH("user___name"); // "username"
12
+ * ```
13
+ */
14
+ export const clearPH = (str = "", placeholder = "_") => str.replaceAll(placeholder, "");
1
15
  /**
2
16
  * Регулярное выражение для захвата всех нецифровых символов из строки.
3
- * Используется для удаления всех символов, кроме цифр 0-9.
17
+ * Используется для удаления всех символов, кроме цифр 0-9
4
18
  */
5
19
  export const oDigitRegExp = /\D/g;
6
20
  /**
7
- * Удаляет все символы из строки, кроме цифр 0-9.
21
+ * Удаляет все символы из строки, кроме цифр 0-9
8
22
  *
9
- * @param v - Входная строка для очистки
10
- * @returns Строка, содержащая только цифры
23
+ * @param [str=""] - Входная строка для очистки
11
24
  *
12
25
  * @example
13
26
  * ```typescript
14
27
  * oDigitClean("abc123def456"); // "123456"
15
28
  * oDigitClean("+7 (999) 123-45-67"); // "79991234567"
16
- * oDigitClean(""); // ""
17
29
  * ```
18
30
  */
19
- export const oDigitClean = (v = "") => v.replace(oDigitRegExp, "");
20
- //...
31
+ export const oDigitClean = (str = "") => str.replace(oDigitRegExp, "");
21
32
  /**
22
- * Регулярное выражение для захвата одного или более пробельных символов подряд.
23
- * Включает пробелы, табуляции, переносы строк и другие пробельные символы.
33
+ * Регулярное выражение для захвата одного или более пробельных символов подряд
24
34
  */
25
- export const spaceRegExp = /\s+/g;
35
+ export const oSpaceRegExp = /\s+/g;
26
36
  /**
27
- * Нормализует пробелы в строке: заменяет множественные пробелы на один и удаляет пробелы в начале и конце.
37
+ * Нормализует пробелы в строке: заменяет множественные пробелы на один и удаляет пробелы в начале и конце
28
38
  *
29
- * @param v - Входная строка для нормализации
30
- * @returns Строка с нормализованными пробелами
39
+ * @param [str=""] - Входная строка для нормализации
31
40
  *
32
41
  * @example
33
42
  * ```typescript
34
- * spaceClean(" hello world "); // "hello world"
35
- * spaceClean("multiple\n\n\nspaces"); // "multiple spaces"
36
- * spaceClean("tab\t\tseparated"); // "tab separated"
43
+ * oSpaceClean(" hello world "); // "hello world"
44
+ * oSpaceClean("multiple\n\n\nspaces"); // "multiple spaces"
45
+ * oSpaceClean("tab\t\tseparated"); // "tab separated"
37
46
  * ```
38
47
  */
39
- export const spaceClean = (v = "") => v.replace(spaceRegExp, " ").trim();
48
+ export const oSpaceClean = (str = "") => str.replace(oSpaceRegExp, " ").trim();
40
49
  /**
41
- * Удаляет все вхождения плейсхолдера из строки.
50
+ * Приводит строку к нижнему регистру и нормализует пробелы.
51
+ * Комбинация методов {@link String.toLowerCase} и {@link oSpaceClean}
42
52
  *
43
- * @param str - Входная строка
44
- * @param placeholder - Строка или регулярное выражение для удаления (по умолчанию "_")
45
- * @returns Строка без плейсхолдеров
53
+ * @param [str=""] - Строка для нормализации
46
54
  *
47
55
  * @example
48
56
  * ```typescript
49
- * clearPH("hello_world_test", "_"); // "helloworldtest"
50
- * clearPH("user___name", "_"); // "username"
51
- * clearPH("test***end", "*"); // "testend"
52
- * clearPH("email@domain.com", /@/); // "emaildomain.com"
57
+ * toFlat(" Hello World "); // "hello world"
58
+ * toFlat("CamelCase String"); // "camelcase string"
59
+ * toFlat(""); // ""
53
60
  * ```
54
61
  */
55
- export const clearPH = (str = "", placeholder = "_") => str.replaceAll(placeholder, "");
56
- //...
62
+ export const toFlat = (str = "") => oSpaceClean(str.toLowerCase());
57
63
  /**
58
- * Приводит первый символ строки к верхнему регистру, остальные оставляет без изменений.
64
+ * Приводит первый символ строки к верхнему регистру, остальные оставляет без изменений
59
65
  *
60
- * @param word - Строка для капитализации
61
- * @returns Строка с заглавной первой буквой
66
+ * @param [word=""] - Слово для капитализации
62
67
  *
63
68
  * @example
64
69
  * ```typescript
65
- * toCapital("hello"); // "Hello"
66
- * toCapital("world"); // "World"
67
- * toCapital(""); // ""
68
- * toCapital("a"); // "A"
70
+ * toCapitalCase("hello"); // "Hello"
69
71
  * ```
70
72
  */
71
- export const toCapital = (word = "") => word.charAt(0).toUpperCase() + word.slice(1);
73
+ export const toCapitalCase = (word = "") => word.charAt(0).toUpperCase() + word.slice(1);
72
74
  /**
73
- * Приводит первый символ каждого слова к верхнему регистру (Title Case).
74
- * Разделяет строку по пробелам и применяет капитализацию к каждому слову.
75
+ * Разделяет строку по пробелам и приводит первый символ каждого слова к верхнему регистру ({@link toCapitalCase})
75
76
  *
76
- * @param str - Строка для преобразования в Title Case
77
- * @returns Строка с заглавными первыми буквами каждого слова
77
+ * @param [str=""] - Строка для преобразования в Title Case
78
78
  *
79
79
  * @example
80
80
  * ```typescript
81
- * toCapitalMap("hello world"); // "Hello World"
82
- * toCapitalMap("javascript programming"); // "Javascript Programming"
83
- * toCapitalMap(""); // ""
84
- * toCapitalMap("single"); // "Single"
81
+ * toCapitalCaseMap("hello world"); // "Hello World"
82
+ * toCapitalCaseMap(""); // ""
83
+ * toCapitalCaseMap("single"); // "Single"
85
84
  * ```
86
85
  */
87
- export const toCapitalMap = (str = "") => str.split(" ").map(toCapital).join(" ");
88
- //...
86
+ export const toCapitalCaseMap = (str = "") => str.split(" ").map(toCapitalCase).join(" ");
89
87
  /**
90
- * Повторяет строку указанное количество раз с разделителем между повторениями.
88
+ * Повторяет строку указанное количество раз с разделителем между повторениями
91
89
  *
92
90
  * @param str - Исходная строка для повторения
93
- * @param length - Количество повторений (должно быть неотрицательным)
94
- * @param separator - Разделитель между повторениями (по умолчанию пустая строка)
95
- * @returns Результирующая строка из повторений
91
+ * @param length - Количество повторений (**должно быть ≥ 0**)
92
+ * @param [separator=""] - Разделитель между повторениями
96
93
  *
97
94
  * @example
98
95
  * ```typescript
@@ -104,125 +101,3 @@ export const toCapitalMap = (str = "") => str.split(" ").map(toCapital).join(" "
104
101
  * ```
105
102
  */
106
103
  export const repeat = (str, length, separator = "") => Array.from({ length }).fill(str).join(separator);
107
- //...
108
- /**
109
- * Приводит строку к нижнему регистру и нормализует пробелы.
110
- * Комбинация методов toLowerCase() и spaceClean().
111
- *
112
- * @param str - Строка для нормализации
113
- * @returns Строка в нижнем регистре с нормализованными пробелами
114
- *
115
- * @example
116
- * ```typescript
117
- * toFlat(" Hello World "); // "hello world"
118
- * toFlat("CamelCase String"); // "camelcase string"
119
- * toFlat(""); // ""
120
- * ```
121
- */
122
- export const toFlat = (str = "") => spaceClean(str.toLowerCase());
123
- //...
124
- /**
125
- * Карта для транслитерации кириллических символов в латинские.
126
- * Содержит соответствия для всех букв русского алфавита в нижнем регистре.
127
- * Используется в функции {@link toSlug} для создания URL-friendly строк.
128
- *
129
- * @example
130
- * ```typescript
131
- * cyrillicToLatinMap.get('а'); // "a"
132
- * cyrillicToLatinMap.get('ё'); // "yo"
133
- * cyrillicToLatinMap.get('ъ'); // ""
134
- * ```
135
- */
136
- export const cyrillicToLatinMap = new Map([
137
- ["а", "a"],
138
- ["б", "b"],
139
- ["в", "v"],
140
- ["г", "g"],
141
- ["д", "d"],
142
- ["е", "e"],
143
- ["ё", "yo"],
144
- ["ж", "zh"],
145
- ["з", "z"],
146
- ["и", "i"],
147
- ["й", "y"],
148
- ["к", "k"],
149
- ["л", "l"],
150
- ["м", "m"],
151
- ["н", "n"],
152
- ["о", "o"],
153
- ["п", "p"],
154
- ["р", "r"],
155
- ["с", "s"],
156
- ["т", "t"],
157
- ["у", "u"],
158
- ["ф", "f"],
159
- ["х", "h"],
160
- ["ц", "ts"],
161
- ["ч", "ch"],
162
- ["ш", "sh"],
163
- ["щ", "sch"],
164
- ["ъ", ""],
165
- ["ы", "y"],
166
- ["ь", ""],
167
- ["э", "e"],
168
- ["ю", "yu"],
169
- ["я", "ya"],
170
- ]);
171
- /**
172
- * Создает URL-friendly slug из текста.
173
- * Конвертирует кириллицу в латиницу, удаляет специальные символы,
174
- * нормализует пробелы и заменяет их на разделитель.
175
- *
176
- * @param text - Исходный текст для преобразования в slug
177
- * @param separator - Разделитель для замены пробелов (по умолчанию "-")
178
- * @returns URL-friendly строка
179
- *
180
- * @example
181
- * ```typescript
182
- * toSlug("Привет, мир!"); // "privet-mir"
183
- * toSlug("JavaScript Programming"); // "javascript-programming"
184
- * toSlug("Café & Restaurant", "_"); // "cafe_restaurant"
185
- * toSlug("Специальные символы!!!", "."); // "specialnye-simvoly"
186
- * ```
187
- */
188
- export const toSlug = (text, separator = "-") => {
189
- const buf = [];
190
- let wasSpace = false;
191
- for (const _char of text) {
192
- const char = _char.toLowerCase();
193
- const code = char.charCodeAt(0);
194
- // Кириллица (а-я, ё)
195
- if ((code >= 1072 && code <= 1103) || code === 1105) {
196
- buf.push(cyrillicToLatinMap.get(char) ?? char);
197
- wasSpace = false;
198
- }
199
- // Цифры (0-9)
200
- else if (code >= 48 && code <= 57) {
201
- buf.push(char);
202
- wasSpace = false;
203
- }
204
- // Латиница (a-z)
205
- else if (code >= 97 && code <= 122) {
206
- buf.push(char);
207
- wasSpace = false;
208
- }
209
- // Пробуем нормализовать символы с диакритиками в латиницу (é -> e)
210
- else {
211
- const normalized = char.normalize("NFD").replace(/[\u0300-\u036f]/g, "");
212
- const nCode = normalized.charCodeAt(0);
213
- if (normalized.length === 1 && nCode >= 97 && nCode <= 122) {
214
- buf.push(normalized);
215
- wasSpace = false;
216
- }
217
- else {
218
- if (!wasSpace && buf.length > 0) {
219
- buf.push(separator);
220
- wasSpace = true;
221
- }
222
- }
223
- }
224
- }
225
- // Убираем завершающий separator (с учётом многосимвольного separator)
226
- const acc = buf.join("");
227
- return separator && acc.endsWith(separator) ? acc.slice(0, -separator.length) : acc;
228
- };