string-tuner 1.0.2 → 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 +40 -2
- package/dist/index.d.ts +40 -2
- package/dist/index.js +246 -5
- package/dist/index.mjs +246 -5
- package/package.json +2 -3
package/dist/index.d.mts
CHANGED
|
@@ -1,14 +1,52 @@
|
|
|
1
1
|
declare const st: {
|
|
2
|
-
|
|
3
|
-
|
|
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
|
-
|
|
3
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
+
"&": "&",
|
|
194
|
+
"<": "<",
|
|
195
|
+
">": ">",
|
|
196
|
+
'"': """,
|
|
197
|
+
"'": "'"
|
|
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
|
+
"&": "&",
|
|
205
|
+
"<": "<",
|
|
206
|
+
">": ">",
|
|
207
|
+
""": '"',
|
|
208
|
+
"'": "'"
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
+
"&": "&",
|
|
168
|
+
"<": "<",
|
|
169
|
+
">": ">",
|
|
170
|
+
'"': """,
|
|
171
|
+
"'": "'"
|
|
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
|
+
"&": "&",
|
|
179
|
+
"<": "<",
|
|
180
|
+
">": ">",
|
|
181
|
+
""": '"',
|
|
182
|
+
"'": "'"
|
|
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
|
-
|
|
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
|
-
|
|
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,13 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "string-tuner",
|
|
3
|
-
"version": "1.0.
|
|
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",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
8
8
|
"scripts": {
|
|
9
|
-
"build": "tsup"
|
|
10
|
-
"publish": "npm run build && npm publish"
|
|
9
|
+
"build": "tsup"
|
|
11
10
|
},
|
|
12
11
|
"keywords": [
|
|
13
12
|
"strings",
|