@nemigo/helpers 0.3.1 → 0.3.3

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/string.js CHANGED
@@ -84,34 +84,43 @@ export const cyrillicToLatinMap = new Map([
84
84
  * Функция для создания *slug* (фрагмента URL) сущности
85
85
  */
86
86
  export const toSlug = (text, separator = "-") => {
87
- let acc = "";
87
+ const buf = [];
88
88
  let wasSpace = false;
89
- for (const _char of text.split("")) {
89
+ for (const _char of text) {
90
90
  const char = _char.toLowerCase();
91
91
  const code = char.charCodeAt(0);
92
92
  // Кириллица (а-я, ё)
93
93
  if ((code >= 1072 && code <= 1103) || code === 1105) {
94
- acc += cyrillicToLatinMap.get(char) || char;
95
- wasSpace = false;
96
- }
97
- // Латиница (a-z)
98
- else if (code >= 97 && code <= 122) {
99
- acc += char;
94
+ buf.push(cyrillicToLatinMap.get(char) ?? char);
100
95
  wasSpace = false;
101
96
  }
102
97
  // Цифры (0-9)
103
98
  else if (code >= 48 && code <= 57) {
104
- acc += char;
99
+ buf.push(char);
105
100
  wasSpace = false;
106
101
  }
107
- // Пробел или другие символы, которые нужно заменить на separator
102
+ // Латиница (a-z)
103
+ else if (code >= 97 && code <= 122) {
104
+ buf.push(char);
105
+ wasSpace = false;
106
+ }
107
+ // Пробуем нормализовать символы с диакритиками в латиницу (é -> e)
108
108
  else {
109
- if (!wasSpace && acc.length > 0) {
110
- acc += separator;
111
- wasSpace = true;
109
+ const normalized = char.normalize("NFD").replace(/[\u0300-\u036f]/g, "");
110
+ const nCode = normalized.charCodeAt(0);
111
+ if (normalized.length === 1 && nCode >= 97 && nCode <= 122) {
112
+ buf.push(normalized);
113
+ wasSpace = false;
114
+ }
115
+ else {
116
+ if (!wasSpace && buf.length > 0) {
117
+ buf.push(separator);
118
+ wasSpace = true;
119
+ }
112
120
  }
113
121
  }
114
122
  }
115
- // Убираем завершающий separator, если он есть
116
- return acc.endsWith(separator) ? acc.slice(0, -1) : acc;
123
+ // Убираем завершающий separator учётом многосимвольного separator)
124
+ const acc = buf.join("");
125
+ return separator && acc.endsWith(separator) ? acc.slice(0, -separator.length) : acc;
117
126
  };
package/dist/xod.js CHANGED
@@ -43,12 +43,15 @@ export const numberSchema = z.unknown().transform((value, ctx) => caseNumber(val
43
43
  : result));
44
44
  export const numberSchemaOptional = z.union([nullSchema, numberSchema]);
45
45
  //...
46
- export const stringSchema = z.unknown().transform((value, ctx) => caseString(value, (result) => result === null || result === ""
47
- ? invalid(value, ctx, {
48
- message: "It isn't a string or empty string",
49
- expected: "string (or number)",
50
- })
51
- : result));
46
+ export const stringSchema = z.unknown().transform((value, ctx) => caseString(value, (result) => {
47
+ const trimmed = result === null ? "" : result.trim();
48
+ return trimmed === ""
49
+ ? invalid(value, ctx, {
50
+ message: "It isn't a string or empty string",
51
+ expected: "string (or number)",
52
+ })
53
+ : trimmed;
54
+ }));
52
55
  export const stringSchemaOptional = z.union([nullSchema, stringSchema]);
53
56
  //...
54
57
  export default {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nemigo/helpers",
3
- "version": "0.3.1",
3
+ "version": "0.3.3",
4
4
  "private": false,
5
5
  "author": {
6
6
  "name": "Vlad Logvin",