string-tuner 1.0.3 → 1.0.4

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/index.d.mts CHANGED
@@ -1,14 +1,52 @@
1
1
  declare const st: {
2
- capitalize: (str: string, fullSentence?: boolean) => string | undefined;
3
- trim: (str: string, maxLength?: number, trimChar?: string) => string;
2
+ bracket: (type?: "round" | "square" | "curly" | "angle") => {
3
+ add: (str: string) => string;
4
+ remove: (str: string) => string;
5
+ };
6
+ camelCase: (str: string) => string;
7
+ capitalize: (str: string, fullSentence?: boolean) => string;
8
+ escapeHtml: (str: string) => string;
9
+ highlight: (str: string, search: string, wrapper?: string | {
10
+ start: string;
11
+ end: string;
12
+ }, caseSensitive?: boolean) => string;
13
+ initials: (str: string, maxInitials?: number) => string;
14
+ isEmail: (str: string, customRegex?: RegExp) => boolean;
15
+ isPhone: (str: string, customRegex?: RegExp) => boolean;
16
+ isUrl: (str: string, customRegex?: RegExp) => boolean;
17
+ kebabCase: (str: string) => string;
18
+ mask: (str: string, visibleChars?: number, maskChar?: string) => string;
19
+ normalizeWhitespace: (str: string) => string;
20
+ pad: (str: string, length: number, char?: string, position?: "start" | "end" | "both") => string;
21
+ pascalCase: (str: string) => string;
4
22
  prefix: (pf: string) => {
5
23
  add: (str: string | undefined) => string;
6
24
  remove: (str: string | undefined) => string;
7
25
  };
26
+ quote: (type?: "single" | "double" | "backtick") => {
27
+ add: (str: string) => string;
28
+ remove: (str: string) => string;
29
+ };
30
+ removeWhitespace: (str: string) => string;
31
+ repeat: (str: string, count: number) => string;
32
+ reverse: (str: string) => string;
33
+ slugify: (str: string) => string;
34
+ snakeCase: (str: string) => string;
35
+ stripHtml: (str: string) => string;
8
36
  suffix: (sf: string) => {
9
37
  add: (str: string | undefined) => string;
10
38
  remove: (str: string | undefined) => string;
11
39
  };
40
+ trim: (str: string, maxLength?: number, trimChar?: string) => string;
41
+ unescapeHtml: (str: string) => string;
42
+ unwrap: (str: string, wrapper: string | {
43
+ start: string;
44
+ end: string;
45
+ }) => string;
46
+ wrap: (str: string, wrapper: string | {
47
+ start: string;
48
+ end: string;
49
+ }) => string;
12
50
  };
13
51
 
14
52
  export { st as default };
package/dist/index.d.ts CHANGED
@@ -1,14 +1,52 @@
1
1
  declare const st: {
2
- capitalize: (str: string, fullSentence?: boolean) => string | undefined;
3
- trim: (str: string, maxLength?: number, trimChar?: string) => string;
2
+ bracket: (type?: "round" | "square" | "curly" | "angle") => {
3
+ add: (str: string) => string;
4
+ remove: (str: string) => string;
5
+ };
6
+ camelCase: (str: string) => string;
7
+ capitalize: (str: string, fullSentence?: boolean) => string;
8
+ escapeHtml: (str: string) => string;
9
+ highlight: (str: string, search: string, wrapper?: string | {
10
+ start: string;
11
+ end: string;
12
+ }, caseSensitive?: boolean) => string;
13
+ initials: (str: string, maxInitials?: number) => string;
14
+ isEmail: (str: string, customRegex?: RegExp) => boolean;
15
+ isPhone: (str: string, customRegex?: RegExp) => boolean;
16
+ isUrl: (str: string, customRegex?: RegExp) => boolean;
17
+ kebabCase: (str: string) => string;
18
+ mask: (str: string, visibleChars?: number, maskChar?: string) => string;
19
+ normalizeWhitespace: (str: string) => string;
20
+ pad: (str: string, length: number, char?: string, position?: "start" | "end" | "both") => string;
21
+ pascalCase: (str: string) => string;
4
22
  prefix: (pf: string) => {
5
23
  add: (str: string | undefined) => string;
6
24
  remove: (str: string | undefined) => string;
7
25
  };
26
+ quote: (type?: "single" | "double" | "backtick") => {
27
+ add: (str: string) => string;
28
+ remove: (str: string) => string;
29
+ };
30
+ removeWhitespace: (str: string) => string;
31
+ repeat: (str: string, count: number) => string;
32
+ reverse: (str: string) => string;
33
+ slugify: (str: string) => string;
34
+ snakeCase: (str: string) => string;
35
+ stripHtml: (str: string) => string;
8
36
  suffix: (sf: string) => {
9
37
  add: (str: string | undefined) => string;
10
38
  remove: (str: string | undefined) => string;
11
39
  };
40
+ trim: (str: string, maxLength?: number, trimChar?: string) => string;
41
+ unescapeHtml: (str: string) => string;
42
+ unwrap: (str: string, wrapper: string | {
43
+ start: string;
44
+ end: string;
45
+ }) => string;
46
+ wrap: (str: string, wrapper: string | {
47
+ start: string;
48
+ end: string;
49
+ }) => string;
12
50
  };
13
51
 
14
52
  export { st as default };
package/dist/index.js CHANGED
@@ -24,33 +24,274 @@ __export(index_exports, {
24
24
  });
25
25
  module.exports = __toCommonJS(index_exports);
26
26
 
27
+ // src/regex.ts
28
+ var REGEX_CAMEL_CASE_SEPARATOR = /[^a-zA-Z0-9]+(.)/g;
29
+ var REGEX_CAMEL_CASE_FIRST_CHAR = /^[A-Z]/;
30
+ var REGEX_SNAKE_CASE_CAPITAL = /([A-Z])/g;
31
+ var REGEX_SNAKE_CASE_NON_ALPHANUMERIC = /[^a-zA-Z0-9]+/g;
32
+ var REGEX_SNAKE_CASE_LEADING_UNDERSCORE = /^_/;
33
+ var REGEX_KEBAB_CASE_CAPITAL = /([A-Z])/g;
34
+ var REGEX_KEBAB_CASE_NON_ALPHANUMERIC = /[^a-zA-Z0-9]+/g;
35
+ var REGEX_KEBAB_CASE_LEADING_DASH = /^-/;
36
+ var REGEX_PASCAL_CASE_SEPARATOR = /[^a-zA-Z0-9]+(.)/g;
37
+ var REGEX_PASCAL_CASE_FIRST_CHAR = /^[a-z]/;
38
+ var REGEX_SLUGIFY_NON_WORD = /[^\w\s-]/g;
39
+ var REGEX_SLUGIFY_WHITESPACE = /[\s_-]+/g;
40
+ var REGEX_SLUGIFY_TRIM_DASHES = /^-+|-+$/g;
41
+ var REGEX_EMAIL_DEFAULT = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
42
+ var REGEX_URL_DEFAULT = /^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/;
43
+ var REGEX_PHONE_DEFAULT = /^[\+]?[(]?[0-9]{1,4}[)]?[-\s\.]?[(]?[0-9]{1,4}[)]?[-\s\.]?[0-9]{1,9}$/;
44
+ var REGEX_INITIALS_WHITESPACE = /\s+/;
45
+ var REGEX_INITIALS_ALPHA = /[A-Z]/;
46
+ var REGEX_WHITESPACE_ALL = /\s+/g;
47
+ var REGEX_HTML_TAGS = /<[^>]*>/g;
48
+ var REGEX_HTML_ESCAPE_CHARS = /[&<>"']/g;
49
+ var REGEX_HTML_UNESCAPE_ENTITIES = /&(?:amp|lt|gt|quot|#39);/g;
50
+ var REGEX_HIGHLIGHT_ESCAPE = /[.*+?^${}()|[\]\\]/g;
51
+
27
52
  // src/functions.ts
28
53
  var capitalize = (str, fullSentence = true) => {
29
54
  if (!str) return "";
30
55
  if (fullSentence) {
31
- str.toLowerCase().split(" ").map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ") || str;
56
+ return str.toLowerCase().split(" ").map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ") || str;
32
57
  } else {
33
58
  return str.charAt(0).toUpperCase() + str.slice(1);
34
59
  }
35
60
  };
61
+ var camelCase = (str) => {
62
+ if (!str) return "";
63
+ return str.replace(REGEX_CAMEL_CASE_SEPARATOR, (_, chr) => chr.toUpperCase()).replace(REGEX_CAMEL_CASE_FIRST_CHAR, (chr) => chr.toLowerCase());
64
+ };
65
+ var snakeCase = (str) => {
66
+ if (!str) return "";
67
+ return str.replace(REGEX_SNAKE_CASE_CAPITAL, "_$1").replace(REGEX_SNAKE_CASE_NON_ALPHANUMERIC, "_").replace(REGEX_SNAKE_CASE_LEADING_UNDERSCORE, "").toLowerCase();
68
+ };
69
+ var kebabCase = (str) => {
70
+ if (!str) return "";
71
+ return str.replace(REGEX_KEBAB_CASE_CAPITAL, "-$1").replace(REGEX_KEBAB_CASE_NON_ALPHANUMERIC, "-").replace(REGEX_KEBAB_CASE_LEADING_DASH, "").toLowerCase();
72
+ };
73
+ var pascalCase = (str) => {
74
+ if (!str) return "";
75
+ return str.replace(REGEX_PASCAL_CASE_SEPARATOR, (_, chr) => chr.toUpperCase()).replace(REGEX_PASCAL_CASE_FIRST_CHAR, (chr) => chr.toUpperCase());
76
+ };
77
+ var reverse = (str) => {
78
+ if (!str) return "";
79
+ return str.split("").reverse().join("");
80
+ };
81
+ var slugify = (str) => {
82
+ if (!str) return "";
83
+ return str.toLowerCase().trim().replace(REGEX_SLUGIFY_NON_WORD, "").replace(REGEX_SLUGIFY_WHITESPACE, "-").replace(REGEX_SLUGIFY_TRIM_DASHES, "");
84
+ };
85
+ var isEmail = (str, customRegex) => {
86
+ if (!str) return false;
87
+ const regex = customRegex || REGEX_EMAIL_DEFAULT;
88
+ return regex.test(str);
89
+ };
90
+ var isUrl = (str, customRegex) => {
91
+ if (!str) return false;
92
+ const regex = customRegex || REGEX_URL_DEFAULT;
93
+ return regex.test(str);
94
+ };
95
+ var isPhone = (str, customRegex) => {
96
+ if (!str) return false;
97
+ const regex = customRegex || REGEX_PHONE_DEFAULT;
98
+ return regex.test(str);
99
+ };
36
100
  var trim = (str, maxLength, trimChar = "...") => {
37
101
  if (!maxLength) return str;
38
102
  return str?.length > maxLength ? `${str?.slice(0, maxLength)}${trimChar}` : str;
39
103
  };
104
+ var repeat = (str, count) => {
105
+ if (!str || count < 1) return "";
106
+ return str.repeat(count);
107
+ };
108
+ var pad = (str, length, char = " ", position = "both") => {
109
+ if (!str || str.length >= length) return str;
110
+ const padLength = length - str.length;
111
+ if (position === "start") {
112
+ return char.repeat(padLength) + str;
113
+ } else if (position === "end") {
114
+ return str + char.repeat(padLength);
115
+ } else {
116
+ const leftPad = Math.floor(padLength / 2);
117
+ const rightPad = padLength - leftPad;
118
+ return char.repeat(leftPad) + str + char.repeat(rightPad);
119
+ }
120
+ };
121
+ var wrap = (str, wrapper) => {
122
+ if (!str) return "";
123
+ if (typeof wrapper === "string") {
124
+ return `${wrapper}${str}${wrapper}`;
125
+ }
126
+ return `${wrapper.start}${str}${wrapper.end}`;
127
+ };
128
+ var unwrap = (str, wrapper) => {
129
+ if (!str) return "";
130
+ if (typeof wrapper === "string") {
131
+ if (str.startsWith(wrapper) && str.endsWith(wrapper)) {
132
+ return str.slice(wrapper.length, -wrapper.length);
133
+ }
134
+ return str;
135
+ }
136
+ if (str.startsWith(wrapper.start) && str.endsWith(wrapper.end)) {
137
+ return str.slice(wrapper.start.length, -wrapper.end.length);
138
+ }
139
+ return str;
140
+ };
40
141
  var prefix = (pf) => ({
142
+ /**
143
+ * Adds the prefix to a string if it doesn't already start with it
144
+ * @param str - The string to add prefix to
145
+ * @returns The string with prefix, or empty string if input is falsy
146
+ */
41
147
  add: (str) => !str ? "" : str?.startsWith(pf) ? str : `${pf}${str}`,
42
- remove: (str) => !str ? "" : str?.startsWith(pf) ? str?.slice(1) : str
148
+ /**
149
+ * Removes the prefix from a string if it starts with it
150
+ * @param str - The string to remove prefix from
151
+ * @returns The string without prefix, or empty string if input is falsy
152
+ */
153
+ remove: (str) => !str ? "" : str?.startsWith(pf) ? str?.slice(pf.length) : str
43
154
  });
44
155
  var suffix = (sf) => ({
156
+ /**
157
+ * Adds the suffix to a string if it doesn't already end with it
158
+ * @param str - The string to add suffix to
159
+ * @returns The string with suffix, or empty string if input is falsy
160
+ */
45
161
  add: (str) => !str ? "" : str?.endsWith(sf) ? str : `${str}${sf}`,
46
- remove: (str) => !str ? "" : str?.endsWith(sf) ? str?.slice(0, -1) : str
162
+ /**
163
+ * Removes the suffix from a string if it ends with it
164
+ * @param str - The string to remove suffix from
165
+ * @returns The string without suffix, or empty string if input is falsy
166
+ */
167
+ remove: (str) => !str ? "" : str?.endsWith(sf) ? str?.slice(0, -sf.length) : str
47
168
  });
169
+ var initials = (str, maxInitials) => {
170
+ if (!str) return "";
171
+ const words = str.trim().split(REGEX_INITIALS_WHITESPACE);
172
+ const initialsArray = words.map((word) => word.charAt(0).toUpperCase()).filter((char) => REGEX_INITIALS_ALPHA.test(char));
173
+ if (maxInitials) {
174
+ return initialsArray.slice(0, maxInitials).join("");
175
+ }
176
+ return initialsArray.join("");
177
+ };
178
+ var removeWhitespace = (str) => {
179
+ if (!str) return "";
180
+ return str.replace(REGEX_WHITESPACE_ALL, "");
181
+ };
182
+ var normalizeWhitespace = (str) => {
183
+ if (!str) return "";
184
+ return str.replace(REGEX_WHITESPACE_ALL, " ").trim();
185
+ };
186
+ var stripHtml = (str) => {
187
+ if (!str) return "";
188
+ return str.replace(REGEX_HTML_TAGS, "");
189
+ };
190
+ var escapeHtml = (str) => {
191
+ if (!str) return "";
192
+ const htmlEscapes = {
193
+ "&": "&amp;",
194
+ "<": "&lt;",
195
+ ">": "&gt;",
196
+ '"': "&quot;",
197
+ "'": "&#39;"
198
+ };
199
+ return str.replace(REGEX_HTML_ESCAPE_CHARS, (char) => htmlEscapes[char]);
200
+ };
201
+ var unescapeHtml = (str) => {
202
+ if (!str) return "";
203
+ const htmlUnescapes = {
204
+ "&amp;": "&",
205
+ "&lt;": "<",
206
+ "&gt;": ">",
207
+ "&quot;": '"',
208
+ "&#39;": "'"
209
+ };
210
+ return str.replace(REGEX_HTML_UNESCAPE_ENTITIES, (entity) => htmlUnescapes[entity]);
211
+ };
212
+ var mask = (str, visibleChars = 4, maskChar = "*") => {
213
+ if (!str) return "";
214
+ if (str.length <= visibleChars) return str;
215
+ const maskLength = str.length - visibleChars;
216
+ return maskChar.repeat(maskLength) + str.slice(-visibleChars);
217
+ };
218
+ var highlight = (str, search, wrapper = { start: "<mark>", end: "</mark>" }, caseSensitive = false) => {
219
+ if (!str || !search) return str;
220
+ const wrapStart = typeof wrapper === "string" ? wrapper : wrapper.start;
221
+ const wrapEnd = typeof wrapper === "string" ? wrapper : wrapper.end;
222
+ const flags = caseSensitive ? "g" : "gi";
223
+ const regex = new RegExp(search.replace(REGEX_HIGHLIGHT_ESCAPE, "\\$&"), flags);
224
+ return str.replace(regex, (match) => `${wrapStart}${match}${wrapEnd}`);
225
+ };
226
+ var quote = (type = "double") => {
227
+ const quoteChar = type === "single" ? "'" : type === "backtick" ? "`" : '"';
228
+ return {
229
+ /**
230
+ * Adds quotes to a string
231
+ * @param str - The string to quote
232
+ * @returns The quoted string
233
+ */
234
+ add: (str) => wrap(str, quoteChar),
235
+ /**
236
+ * Removes quotes from a string
237
+ * @param str - The string to unquote
238
+ * @returns The unquoted string
239
+ */
240
+ remove: (str) => unwrap(str, quoteChar)
241
+ };
242
+ };
243
+ var bracket = (type = "round") => {
244
+ const brackets = {
245
+ round: { start: "(", end: ")" },
246
+ square: { start: "[", end: "]" },
247
+ curly: { start: "{", end: "}" },
248
+ angle: { start: "<", end: ">" }
249
+ };
250
+ const bracketPair = brackets[type];
251
+ return {
252
+ /**
253
+ * Adds brackets to a string
254
+ * @param str - The string to wrap
255
+ * @returns The bracketed string
256
+ */
257
+ add: (str) => wrap(str, bracketPair),
258
+ /**
259
+ * Removes brackets from a string
260
+ * @param str - The string to unwrap
261
+ * @returns The unbracketted string
262
+ */
263
+ remove: (str) => unwrap(str, bracketPair)
264
+ };
265
+ };
48
266
 
49
267
  // src/index.ts
50
268
  var st = {
269
+ bracket,
270
+ camelCase,
51
271
  capitalize,
52
- trim,
272
+ escapeHtml,
273
+ highlight,
274
+ initials,
275
+ isEmail,
276
+ isPhone,
277
+ isUrl,
278
+ kebabCase,
279
+ mask,
280
+ normalizeWhitespace,
281
+ pad,
282
+ pascalCase,
53
283
  prefix,
54
- suffix
284
+ quote,
285
+ removeWhitespace,
286
+ repeat,
287
+ reverse,
288
+ slugify,
289
+ snakeCase,
290
+ stripHtml,
291
+ suffix,
292
+ trim,
293
+ unescapeHtml,
294
+ unwrap,
295
+ wrap
55
296
  };
56
297
  var index_default = st;
package/dist/index.mjs CHANGED
@@ -1,31 +1,272 @@
1
+ // src/regex.ts
2
+ var REGEX_CAMEL_CASE_SEPARATOR = /[^a-zA-Z0-9]+(.)/g;
3
+ var REGEX_CAMEL_CASE_FIRST_CHAR = /^[A-Z]/;
4
+ var REGEX_SNAKE_CASE_CAPITAL = /([A-Z])/g;
5
+ var REGEX_SNAKE_CASE_NON_ALPHANUMERIC = /[^a-zA-Z0-9]+/g;
6
+ var REGEX_SNAKE_CASE_LEADING_UNDERSCORE = /^_/;
7
+ var REGEX_KEBAB_CASE_CAPITAL = /([A-Z])/g;
8
+ var REGEX_KEBAB_CASE_NON_ALPHANUMERIC = /[^a-zA-Z0-9]+/g;
9
+ var REGEX_KEBAB_CASE_LEADING_DASH = /^-/;
10
+ var REGEX_PASCAL_CASE_SEPARATOR = /[^a-zA-Z0-9]+(.)/g;
11
+ var REGEX_PASCAL_CASE_FIRST_CHAR = /^[a-z]/;
12
+ var REGEX_SLUGIFY_NON_WORD = /[^\w\s-]/g;
13
+ var REGEX_SLUGIFY_WHITESPACE = /[\s_-]+/g;
14
+ var REGEX_SLUGIFY_TRIM_DASHES = /^-+|-+$/g;
15
+ var REGEX_EMAIL_DEFAULT = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
16
+ var REGEX_URL_DEFAULT = /^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/;
17
+ var REGEX_PHONE_DEFAULT = /^[\+]?[(]?[0-9]{1,4}[)]?[-\s\.]?[(]?[0-9]{1,4}[)]?[-\s\.]?[0-9]{1,9}$/;
18
+ var REGEX_INITIALS_WHITESPACE = /\s+/;
19
+ var REGEX_INITIALS_ALPHA = /[A-Z]/;
20
+ var REGEX_WHITESPACE_ALL = /\s+/g;
21
+ var REGEX_HTML_TAGS = /<[^>]*>/g;
22
+ var REGEX_HTML_ESCAPE_CHARS = /[&<>"']/g;
23
+ var REGEX_HTML_UNESCAPE_ENTITIES = /&(?:amp|lt|gt|quot|#39);/g;
24
+ var REGEX_HIGHLIGHT_ESCAPE = /[.*+?^${}()|[\]\\]/g;
25
+
1
26
  // src/functions.ts
2
27
  var capitalize = (str, fullSentence = true) => {
3
28
  if (!str) return "";
4
29
  if (fullSentence) {
5
- str.toLowerCase().split(" ").map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ") || str;
30
+ return str.toLowerCase().split(" ").map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ") || str;
6
31
  } else {
7
32
  return str.charAt(0).toUpperCase() + str.slice(1);
8
33
  }
9
34
  };
35
+ var camelCase = (str) => {
36
+ if (!str) return "";
37
+ return str.replace(REGEX_CAMEL_CASE_SEPARATOR, (_, chr) => chr.toUpperCase()).replace(REGEX_CAMEL_CASE_FIRST_CHAR, (chr) => chr.toLowerCase());
38
+ };
39
+ var snakeCase = (str) => {
40
+ if (!str) return "";
41
+ return str.replace(REGEX_SNAKE_CASE_CAPITAL, "_$1").replace(REGEX_SNAKE_CASE_NON_ALPHANUMERIC, "_").replace(REGEX_SNAKE_CASE_LEADING_UNDERSCORE, "").toLowerCase();
42
+ };
43
+ var kebabCase = (str) => {
44
+ if (!str) return "";
45
+ return str.replace(REGEX_KEBAB_CASE_CAPITAL, "-$1").replace(REGEX_KEBAB_CASE_NON_ALPHANUMERIC, "-").replace(REGEX_KEBAB_CASE_LEADING_DASH, "").toLowerCase();
46
+ };
47
+ var pascalCase = (str) => {
48
+ if (!str) return "";
49
+ return str.replace(REGEX_PASCAL_CASE_SEPARATOR, (_, chr) => chr.toUpperCase()).replace(REGEX_PASCAL_CASE_FIRST_CHAR, (chr) => chr.toUpperCase());
50
+ };
51
+ var reverse = (str) => {
52
+ if (!str) return "";
53
+ return str.split("").reverse().join("");
54
+ };
55
+ var slugify = (str) => {
56
+ if (!str) return "";
57
+ return str.toLowerCase().trim().replace(REGEX_SLUGIFY_NON_WORD, "").replace(REGEX_SLUGIFY_WHITESPACE, "-").replace(REGEX_SLUGIFY_TRIM_DASHES, "");
58
+ };
59
+ var isEmail = (str, customRegex) => {
60
+ if (!str) return false;
61
+ const regex = customRegex || REGEX_EMAIL_DEFAULT;
62
+ return regex.test(str);
63
+ };
64
+ var isUrl = (str, customRegex) => {
65
+ if (!str) return false;
66
+ const regex = customRegex || REGEX_URL_DEFAULT;
67
+ return regex.test(str);
68
+ };
69
+ var isPhone = (str, customRegex) => {
70
+ if (!str) return false;
71
+ const regex = customRegex || REGEX_PHONE_DEFAULT;
72
+ return regex.test(str);
73
+ };
10
74
  var trim = (str, maxLength, trimChar = "...") => {
11
75
  if (!maxLength) return str;
12
76
  return str?.length > maxLength ? `${str?.slice(0, maxLength)}${trimChar}` : str;
13
77
  };
78
+ var repeat = (str, count) => {
79
+ if (!str || count < 1) return "";
80
+ return str.repeat(count);
81
+ };
82
+ var pad = (str, length, char = " ", position = "both") => {
83
+ if (!str || str.length >= length) return str;
84
+ const padLength = length - str.length;
85
+ if (position === "start") {
86
+ return char.repeat(padLength) + str;
87
+ } else if (position === "end") {
88
+ return str + char.repeat(padLength);
89
+ } else {
90
+ const leftPad = Math.floor(padLength / 2);
91
+ const rightPad = padLength - leftPad;
92
+ return char.repeat(leftPad) + str + char.repeat(rightPad);
93
+ }
94
+ };
95
+ var wrap = (str, wrapper) => {
96
+ if (!str) return "";
97
+ if (typeof wrapper === "string") {
98
+ return `${wrapper}${str}${wrapper}`;
99
+ }
100
+ return `${wrapper.start}${str}${wrapper.end}`;
101
+ };
102
+ var unwrap = (str, wrapper) => {
103
+ if (!str) return "";
104
+ if (typeof wrapper === "string") {
105
+ if (str.startsWith(wrapper) && str.endsWith(wrapper)) {
106
+ return str.slice(wrapper.length, -wrapper.length);
107
+ }
108
+ return str;
109
+ }
110
+ if (str.startsWith(wrapper.start) && str.endsWith(wrapper.end)) {
111
+ return str.slice(wrapper.start.length, -wrapper.end.length);
112
+ }
113
+ return str;
114
+ };
14
115
  var prefix = (pf) => ({
116
+ /**
117
+ * Adds the prefix to a string if it doesn't already start with it
118
+ * @param str - The string to add prefix to
119
+ * @returns The string with prefix, or empty string if input is falsy
120
+ */
15
121
  add: (str) => !str ? "" : str?.startsWith(pf) ? str : `${pf}${str}`,
16
- remove: (str) => !str ? "" : str?.startsWith(pf) ? str?.slice(1) : str
122
+ /**
123
+ * Removes the prefix from a string if it starts with it
124
+ * @param str - The string to remove prefix from
125
+ * @returns The string without prefix, or empty string if input is falsy
126
+ */
127
+ remove: (str) => !str ? "" : str?.startsWith(pf) ? str?.slice(pf.length) : str
17
128
  });
18
129
  var suffix = (sf) => ({
130
+ /**
131
+ * Adds the suffix to a string if it doesn't already end with it
132
+ * @param str - The string to add suffix to
133
+ * @returns The string with suffix, or empty string if input is falsy
134
+ */
19
135
  add: (str) => !str ? "" : str?.endsWith(sf) ? str : `${str}${sf}`,
20
- remove: (str) => !str ? "" : str?.endsWith(sf) ? str?.slice(0, -1) : str
136
+ /**
137
+ * Removes the suffix from a string if it ends with it
138
+ * @param str - The string to remove suffix from
139
+ * @returns The string without suffix, or empty string if input is falsy
140
+ */
141
+ remove: (str) => !str ? "" : str?.endsWith(sf) ? str?.slice(0, -sf.length) : str
21
142
  });
143
+ var initials = (str, maxInitials) => {
144
+ if (!str) return "";
145
+ const words = str.trim().split(REGEX_INITIALS_WHITESPACE);
146
+ const initialsArray = words.map((word) => word.charAt(0).toUpperCase()).filter((char) => REGEX_INITIALS_ALPHA.test(char));
147
+ if (maxInitials) {
148
+ return initialsArray.slice(0, maxInitials).join("");
149
+ }
150
+ return initialsArray.join("");
151
+ };
152
+ var removeWhitespace = (str) => {
153
+ if (!str) return "";
154
+ return str.replace(REGEX_WHITESPACE_ALL, "");
155
+ };
156
+ var normalizeWhitespace = (str) => {
157
+ if (!str) return "";
158
+ return str.replace(REGEX_WHITESPACE_ALL, " ").trim();
159
+ };
160
+ var stripHtml = (str) => {
161
+ if (!str) return "";
162
+ return str.replace(REGEX_HTML_TAGS, "");
163
+ };
164
+ var escapeHtml = (str) => {
165
+ if (!str) return "";
166
+ const htmlEscapes = {
167
+ "&": "&amp;",
168
+ "<": "&lt;",
169
+ ">": "&gt;",
170
+ '"': "&quot;",
171
+ "'": "&#39;"
172
+ };
173
+ return str.replace(REGEX_HTML_ESCAPE_CHARS, (char) => htmlEscapes[char]);
174
+ };
175
+ var unescapeHtml = (str) => {
176
+ if (!str) return "";
177
+ const htmlUnescapes = {
178
+ "&amp;": "&",
179
+ "&lt;": "<",
180
+ "&gt;": ">",
181
+ "&quot;": '"',
182
+ "&#39;": "'"
183
+ };
184
+ return str.replace(REGEX_HTML_UNESCAPE_ENTITIES, (entity) => htmlUnescapes[entity]);
185
+ };
186
+ var mask = (str, visibleChars = 4, maskChar = "*") => {
187
+ if (!str) return "";
188
+ if (str.length <= visibleChars) return str;
189
+ const maskLength = str.length - visibleChars;
190
+ return maskChar.repeat(maskLength) + str.slice(-visibleChars);
191
+ };
192
+ var highlight = (str, search, wrapper = { start: "<mark>", end: "</mark>" }, caseSensitive = false) => {
193
+ if (!str || !search) return str;
194
+ const wrapStart = typeof wrapper === "string" ? wrapper : wrapper.start;
195
+ const wrapEnd = typeof wrapper === "string" ? wrapper : wrapper.end;
196
+ const flags = caseSensitive ? "g" : "gi";
197
+ const regex = new RegExp(search.replace(REGEX_HIGHLIGHT_ESCAPE, "\\$&"), flags);
198
+ return str.replace(regex, (match) => `${wrapStart}${match}${wrapEnd}`);
199
+ };
200
+ var quote = (type = "double") => {
201
+ const quoteChar = type === "single" ? "'" : type === "backtick" ? "`" : '"';
202
+ return {
203
+ /**
204
+ * Adds quotes to a string
205
+ * @param str - The string to quote
206
+ * @returns The quoted string
207
+ */
208
+ add: (str) => wrap(str, quoteChar),
209
+ /**
210
+ * Removes quotes from a string
211
+ * @param str - The string to unquote
212
+ * @returns The unquoted string
213
+ */
214
+ remove: (str) => unwrap(str, quoteChar)
215
+ };
216
+ };
217
+ var bracket = (type = "round") => {
218
+ const brackets = {
219
+ round: { start: "(", end: ")" },
220
+ square: { start: "[", end: "]" },
221
+ curly: { start: "{", end: "}" },
222
+ angle: { start: "<", end: ">" }
223
+ };
224
+ const bracketPair = brackets[type];
225
+ return {
226
+ /**
227
+ * Adds brackets to a string
228
+ * @param str - The string to wrap
229
+ * @returns The bracketed string
230
+ */
231
+ add: (str) => wrap(str, bracketPair),
232
+ /**
233
+ * Removes brackets from a string
234
+ * @param str - The string to unwrap
235
+ * @returns The unbracketted string
236
+ */
237
+ remove: (str) => unwrap(str, bracketPair)
238
+ };
239
+ };
22
240
 
23
241
  // src/index.ts
24
242
  var st = {
243
+ bracket,
244
+ camelCase,
25
245
  capitalize,
26
- trim,
246
+ escapeHtml,
247
+ highlight,
248
+ initials,
249
+ isEmail,
250
+ isPhone,
251
+ isUrl,
252
+ kebabCase,
253
+ mask,
254
+ normalizeWhitespace,
255
+ pad,
256
+ pascalCase,
27
257
  prefix,
28
- suffix
258
+ quote,
259
+ removeWhitespace,
260
+ repeat,
261
+ reverse,
262
+ slugify,
263
+ snakeCase,
264
+ stripHtml,
265
+ suffix,
266
+ trim,
267
+ unescapeHtml,
268
+ unwrap,
269
+ wrap
29
270
  };
30
271
  var index_default = st;
31
272
  export {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "string-tuner",
3
- "version": "1.0.3",
3
+ "version": "1.0.4",
4
4
  "description": "Multitool for string manipulation and analysis.",
5
5
  "main": "/dist/index.js",
6
6
  "module": "./dist/index.mjs",