xypriss 9.12.45 → 9.12.47
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/cjs/src/middleware/built-in/security/MaliciousUrlScanner.js +68 -21
- package/dist/cjs/src/middleware/built-in/security/MaliciousUrlScanner.js.map +1 -1
- package/dist/cjs/src/xhsc/UtilsApi.js +9 -0
- package/dist/cjs/src/xhsc/UtilsApi.js.map +1 -1
- package/dist/cjs/src/xhsc/utils/StringUtils.js +43 -35
- package/dist/cjs/src/xhsc/utils/StringUtils.js.map +1 -1
- package/dist/cjs/src/xhsc/utils/StringWrapper.js +302 -0
- package/dist/cjs/src/xhsc/utils/StringWrapper.js.map +1 -0
- package/dist/esm/src/middleware/built-in/security/MaliciousUrlScanner.js +68 -21
- package/dist/esm/src/middleware/built-in/security/MaliciousUrlScanner.js.map +1 -1
- package/dist/esm/src/xhsc/UtilsApi.js +9 -0
- package/dist/esm/src/xhsc/UtilsApi.js.map +1 -1
- package/dist/esm/src/xhsc/utils/StringUtils.js +43 -35
- package/dist/esm/src/xhsc/utils/StringUtils.js.map +1 -1
- package/dist/esm/src/xhsc/utils/StringWrapper.js +300 -0
- package/dist/esm/src/xhsc/utils/StringWrapper.js.map +1 -0
- package/dist/index.d.ts +275 -34
- package/package.json +1 -1
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
var strulink = require('strulink');
|
|
4
4
|
|
|
5
|
+
const UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
6
|
+
const HASH_REGEX = /^[0-9a-f]{16,64}$/i;
|
|
7
|
+
const SAFE_PARAM_REGEX = /^[a-zA-Z0-9_\-.~%]+$/;
|
|
5
8
|
class MaliciousUrlScanner {
|
|
6
9
|
/**
|
|
7
10
|
* Middleware for scanning incoming URLs for malicious payloads (XSS, Path Traversal, etc.)
|
|
@@ -25,37 +28,83 @@ class MaliciousUrlScanner {
|
|
|
25
28
|
return (req, res, next) => next?.();
|
|
26
29
|
}
|
|
27
30
|
const mode = scannerConfig.mode || "block";
|
|
28
|
-
const options =
|
|
29
|
-
minScore:
|
|
31
|
+
const options = {
|
|
32
|
+
minScore: 70,
|
|
30
33
|
sensitivity: 1.0,
|
|
34
|
+
enableEntropyAnalysis: false, // Disabled by default to prevent false positives on UUIDs and hash IDs
|
|
35
|
+
...scannerConfig.options,
|
|
31
36
|
advanced: {
|
|
32
37
|
maxEncodingLayers: 3,
|
|
33
|
-
entropyThreshold:
|
|
34
|
-
|
|
38
|
+
entropyThreshold: 5.5,
|
|
39
|
+
...scannerConfig.options?.advanced,
|
|
40
|
+
},
|
|
35
41
|
};
|
|
36
42
|
return async (req, res, next) => {
|
|
37
43
|
try {
|
|
44
|
+
const reqPath = req.path || (req.url ? req.url.split("?")[0] : "");
|
|
45
|
+
// Check excluded paths
|
|
46
|
+
if (scannerConfig.excludePaths && scannerConfig.excludePaths.length > 0) {
|
|
47
|
+
for (const pattern of scannerConfig.excludePaths) {
|
|
48
|
+
if (typeof pattern === "string") {
|
|
49
|
+
if (pattern.endsWith("/**")) {
|
|
50
|
+
const prefix = pattern.slice(0, -3);
|
|
51
|
+
if (reqPath === prefix || reqPath.startsWith(prefix + "/")) {
|
|
52
|
+
return next?.();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else if (pattern.endsWith("/*")) {
|
|
56
|
+
const prefix = pattern.slice(0, -2);
|
|
57
|
+
if (reqPath === prefix || reqPath.startsWith(prefix + "/")) {
|
|
58
|
+
return next?.();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
else if (reqPath === pattern || reqPath.startsWith(pattern)) {
|
|
62
|
+
return next?.();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
else if (pattern instanceof RegExp && pattern.test(reqPath)) {
|
|
66
|
+
return next?.();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
38
70
|
// Reconstruct full URL to scan everything including path and query
|
|
39
71
|
const protocol = req.headers["x-forwarded-proto"] || "http";
|
|
40
72
|
const host = req.headers.host || "localhost";
|
|
41
73
|
const fullUrl = `${protocol}://${host}${req.originalUrl || req.url}`;
|
|
42
74
|
const result = await strulink.__strl__.scanUrl(fullUrl, options);
|
|
43
75
|
if (result.isMalicious) {
|
|
44
|
-
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
76
|
+
// Filter heuristic false positives on standard UUIDs, hashes, and benign params
|
|
77
|
+
const genuinePatterns = (result.detectedPatterns || []).filter((p) => {
|
|
78
|
+
if (scannerConfig.ignorePatterns?.includes(p.type)) {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
if (p.type === "encoded_payload" || p.pattern === "high_entropy") {
|
|
82
|
+
const val = p.matchedValue || "";
|
|
83
|
+
if (UUID_REGEX.test(val) || HASH_REGEX.test(val) || SAFE_PARAM_REGEX.test(val)) {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return true;
|
|
88
|
+
});
|
|
89
|
+
if (genuinePatterns.length > 0) {
|
|
90
|
+
const reasons = genuinePatterns.map((p) => p.type).join(", ");
|
|
91
|
+
const logMessage = `[MaliciousUrlScanner] Detected malicious URL (Score: ${result.score}). Reasons: ${reasons}. URL: ${req.url}`;
|
|
92
|
+
if (logger) {
|
|
93
|
+
logger.warn("security", logMessage);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
console.warn(logMessage);
|
|
97
|
+
}
|
|
98
|
+
if (mode === "block") {
|
|
99
|
+
if (!res.headersSent && !res.writableEnded) {
|
|
100
|
+
res.status(403).json({
|
|
101
|
+
error: "Forbidden",
|
|
102
|
+
code: "EMALICIOUSURL",
|
|
103
|
+
message: "The request was blocked due to suspected malicious payload."
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
59
108
|
}
|
|
60
109
|
}
|
|
61
110
|
next?.();
|
|
@@ -64,8 +113,6 @@ class MaliciousUrlScanner {
|
|
|
64
113
|
if (logger) {
|
|
65
114
|
logger.error("security", "Failed to scan URL for malicious payloads", err);
|
|
66
115
|
}
|
|
67
|
-
// Fail open or fail closed? Usually fail closed for security, but fail open to avoid breaking app if strulink crashes.
|
|
68
|
-
// We'll call next() to fail open.
|
|
69
116
|
next?.();
|
|
70
117
|
}
|
|
71
118
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MaliciousUrlScanner.js","sources":["../../../../../../src/middleware/built-in/security/MaliciousUrlScanner.ts"],"sourcesContent":[null],"names":["__strl__"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"MaliciousUrlScanner.js","sources":["../../../../../../src/middleware/built-in/security/MaliciousUrlScanner.ts"],"sourcesContent":[null],"names":["__strl__"],"mappings":"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"}
|
|
@@ -84,6 +84,9 @@ class UtilsApi {
|
|
|
84
84
|
* All methods are pure functions with no side effects and no external
|
|
85
85
|
* dependencies — instantiate once and reuse across your application.
|
|
86
86
|
*
|
|
87
|
+
* For chaining operations on the same string without repeating it as an
|
|
88
|
+
* argument, use {@link __sys__.utils.str.of} to get a fluent {@link StringWrapper} instance.
|
|
89
|
+
*
|
|
87
90
|
* @remarks
|
|
88
91
|
* The public API surface of this class is conventionally exposed as `str.**`
|
|
89
92
|
* (e.g. `str.slugify(...)`, `str.toCamelCase(...)`) in XyPriss.
|
|
@@ -98,6 +101,12 @@ class UtilsApi {
|
|
|
98
101
|
* str.toCamelCase("hello-world"); // "helloWorld"
|
|
99
102
|
* str.truncate("A very long text", 10); // "A very ..."
|
|
100
103
|
* str.mask("4111111111111111", { visibleStart: 4, visibleEnd: 4 }); // "4111********1111"
|
|
104
|
+
*
|
|
105
|
+
* // Fluent chaining:
|
|
106
|
+
* str.of(" Hello World! ")
|
|
107
|
+
* .normalizeWhitespace()
|
|
108
|
+
* .toKebabCase()
|
|
109
|
+
* .value(); // "hello-world"
|
|
101
110
|
* ```
|
|
102
111
|
* @see https://xypriss.nehonix.com/docs/system/utils/strings
|
|
103
112
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UtilsApi.js","sources":["../../../../src/xhsc/UtilsApi.ts"],"sourcesContent":[null],"names":["StringUtils","NumberUtils","DateUtils","ObjectUtils","ArrayUtils","AsyncUtils","ValidationUtils","IdUtils","FunctionUtils","LoggerUtils"],"mappings":";;;;;;;;;;;;;AAAA;;;;;;;;;;;;;;;;;;;;;;AAsBiF;AACjF;AAaA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCG;MACU,QAAQ,CAAA;AAArB,IAAA,WAAA,GAAA;AACI
|
|
1
|
+
{"version":3,"file":"UtilsApi.js","sources":["../../../../src/xhsc/UtilsApi.ts"],"sourcesContent":[null],"names":["StringUtils","NumberUtils","DateUtils","ObjectUtils","ArrayUtils","AsyncUtils","ValidationUtils","IdUtils","FunctionUtils","LoggerUtils"],"mappings":";;;;;;;;;;;;;AAAA;;;;;;;;;;;;;;;;;;;;;;AAsBiF;AACjF;AAaA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCG;MACU,QAAQ,CAAA;AAArB,IAAA,WAAA,GAAA;AACI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCG;AACa,QAAA,IAAA,CAAA,GAAG,GAAG,IAAIA,uBAAW,EAAE;AAEvC;;AAEG;AACa,QAAA,IAAA,CAAA,GAAG,GAAG,IAAIC,uBAAW,EAAE;AAEvC;;;;;;;;;;;;;;;;;;;;;;AAsBG;AACa,QAAA,IAAA,CAAA,IAAI,GAAG,IAAIC,mBAAS,EAAE;AAEtC;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BG;AACa,QAAA,IAAA,CAAA,GAAG,GAAG,IAAIC,uBAAW,EAAE;AAEvC;;AAEG;AACa,QAAA,IAAA,CAAA,GAAG,GAAG,IAAIC,qBAAU,EAAE;AAEtC;;AAEG;AACa,QAAA,IAAA,CAAA,KAAK,GAAG,IAAIC,qBAAU,EAAE;AAExC;;AAEG;AACa,QAAA,IAAA,CAAA,EAAE,GAAG,IAAIC,+BAAe,EAAE;AAE1C;;AAEG;AACa,QAAA,IAAA,CAAA,EAAE,GAAG,IAAIC,eAAO,EAAE;AAElC;;AAEG;AACa,QAAA,IAAA,CAAA,EAAE,GAAG,IAAIC,2BAAa,EAAE;AAExC;;;;;;;;;;;;;AAaG;AACa,QAAA,IAAA,CAAA,GAAG,GAAG,IAAIC,uBAAW,EAAE;IAuB3C;AArBI;;;;;;;;;;;;;;;AAeG;IACI,YAAY,CACf,OAAqD,EAAE,EAAA;AAEvD,QAAA,OAAO,IAAIA,uBAAW,CAAC,IAAI,CAAC;IAChC;AACH;;;;"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var nehoid = require('nehoid');
|
|
4
|
+
var StringWrapper = require('./StringWrapper.js');
|
|
4
5
|
|
|
5
6
|
/***************************************************************************
|
|
6
7
|
* XyPrissJS - Fast And Secure
|
|
@@ -25,37 +26,36 @@ var nehoid = require('nehoid');
|
|
|
25
26
|
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
|
26
27
|
*
|
|
27
28
|
***************************************************************************** */
|
|
28
|
-
/**
|
|
29
|
-
* **StringUtils — XyPriss String Utilities**
|
|
30
|
-
*
|
|
31
|
-
* A collection of dependency-free helpers for everyday string manipulation:
|
|
32
|
-
* case conversion (`camelCase`, `kebab-case`, `snake_case`, `Title Case`),
|
|
33
|
-
* sanitization (HTML escaping/stripping, accent stripping, whitespace
|
|
34
|
-
* normalization), validation (emails, URLs, palindromes), extraction
|
|
35
|
-
* (emails, URLs, substrings between markers), masking of sensitive data,
|
|
36
|
-
* fuzzy comparison (Levenshtein distance, similarity score), text layout
|
|
37
|
-
* (word wrap, chunking), and generation (random strings, UUIDs).
|
|
38
|
-
*
|
|
39
|
-
* All methods are pure functions with no side effects and no external
|
|
40
|
-
* dependencies — instantiate once and reuse across your application.
|
|
41
|
-
*
|
|
42
|
-
* @remarks
|
|
43
|
-
* The public API surface of this class is conventionally exposed as `str.**`
|
|
44
|
-
* (e.g. `str.slugify(...)`, `str.toCamelCase(...)`) in XyPriss.
|
|
45
|
-
*
|
|
46
|
-
* @example
|
|
47
|
-
* ```ts
|
|
48
|
-
* import { StringUtils } from "xypriss";
|
|
49
|
-
*
|
|
50
|
-
* const str = new StringUtils();
|
|
51
|
-
*
|
|
52
|
-
* str.slugify("Hello World!"); // "hello-world"
|
|
53
|
-
* str.toCamelCase("hello-world"); // "helloWorld"
|
|
54
|
-
* str.truncate("A very long text", 10); // "A very ..."
|
|
55
|
-
* str.mask("4111111111111111", { visibleStart: 4, visibleEnd: 4 }); // "4111********1111"
|
|
56
|
-
* ```
|
|
57
|
-
*/
|
|
58
29
|
class StringUtils {
|
|
30
|
+
/**
|
|
31
|
+
* **of**
|
|
32
|
+
*
|
|
33
|
+
* Wraps `str` in a chainable {@link StringWrapper}, allowing multiple
|
|
34
|
+
* string operations to be chained fluidly.
|
|
35
|
+
*
|
|
36
|
+
* @param str - The string or number to wrap.
|
|
37
|
+
* @returns A {@link StringWrapper} bound to `str`.
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```ts
|
|
41
|
+
* const slug = __sys__.utils.str.of("Hello World").slugify().value(); // "hello-world"
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
static of(str) {
|
|
45
|
+
return new StringWrapper.StringWrapper(str);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* **of** (instance method)
|
|
49
|
+
*
|
|
50
|
+
* Instance-bound convenience wrapper around the static {@link StringUtils.of}.
|
|
51
|
+
* Allows `__sys__.utils.str.of(...)` to work when `str` is an instance.
|
|
52
|
+
*
|
|
53
|
+
* @param str - The string or number to wrap.
|
|
54
|
+
* @returns A {@link StringWrapper} bound to `str`.
|
|
55
|
+
*/
|
|
56
|
+
of(str) {
|
|
57
|
+
return StringUtils.of(str);
|
|
58
|
+
}
|
|
59
59
|
/**
|
|
60
60
|
* **Generate a Random String**
|
|
61
61
|
*
|
|
@@ -147,21 +147,29 @@ class StringUtils {
|
|
|
147
147
|
.replace(/^[A-Z]/, (first) => first.toLowerCase());
|
|
148
148
|
}
|
|
149
149
|
/**
|
|
150
|
-
* **Pad a String**
|
|
150
|
+
* **Pad a String or Number**
|
|
151
151
|
*
|
|
152
|
-
* Adds padding characters to the start or end of a string until it
|
|
152
|
+
* Adds padding characters to the start or end of a string (or number) until it
|
|
153
153
|
* reaches the target length.
|
|
154
154
|
*
|
|
155
|
-
* @param text - The source string.
|
|
155
|
+
* @param text - The source string or number.
|
|
156
156
|
* @param length - Target length.
|
|
157
157
|
* @param char - Padding character (default: `" "`).
|
|
158
158
|
* @param position - Whether to pad at `"start"` or `"end"`.
|
|
159
159
|
* @returns The padded string.
|
|
160
|
+
*
|
|
161
|
+
* @example
|
|
162
|
+
* ```ts
|
|
163
|
+
* utils.pad(42, 5, "0"); // "00042"
|
|
164
|
+
* utils.pad("42", 5, "0"); // "00042"
|
|
165
|
+
* utils.pad("hello", 10, "-", "end"); // "hello-----"
|
|
166
|
+
* ```
|
|
160
167
|
*/
|
|
161
168
|
pad(text, length, char = " ", position = "start") {
|
|
169
|
+
const str = text.toString();
|
|
162
170
|
return position === "start"
|
|
163
|
-
?
|
|
164
|
-
:
|
|
171
|
+
? str.padStart(length, char)
|
|
172
|
+
: str.padEnd(length, char);
|
|
165
173
|
}
|
|
166
174
|
/**
|
|
167
175
|
* **Count Word/Substring Occurrences**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StringUtils.js","sources":["../../../../../src/xhsc/utils/StringUtils.ts"],"sourcesContent":[null],"names":["ID"],"mappings":"
|
|
1
|
+
{"version":3,"file":"StringUtils.js","sources":["../../../../../src/xhsc/utils/StringUtils.ts"],"sourcesContent":[null],"names":["StringWrapper","ID"],"mappings":"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"}
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
class StringWrapper {
|
|
4
|
+
constructor(str) {
|
|
5
|
+
this.current = String(str);
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* **value**
|
|
9
|
+
*
|
|
10
|
+
* Unwraps and returns the underlying string value held by this wrapper.
|
|
11
|
+
* Call this at the end of a chain to get back the final string.
|
|
12
|
+
*
|
|
13
|
+
* @returns The wrapped string.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* __sys__.utils.str.of("hello world").toTitleCase().value(); // "Hello World"
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
value() {
|
|
21
|
+
return this.current;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* **raw**
|
|
25
|
+
*
|
|
26
|
+
* Alias for {@link value}.
|
|
27
|
+
*
|
|
28
|
+
* @returns The wrapped string.
|
|
29
|
+
*/
|
|
30
|
+
raw() {
|
|
31
|
+
return this.current;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* **toString**
|
|
35
|
+
*
|
|
36
|
+
* Returns the string representation of the wrapped value.
|
|
37
|
+
*/
|
|
38
|
+
toString() {
|
|
39
|
+
return this.current;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* **slugify**
|
|
43
|
+
*
|
|
44
|
+
* Converts the wrapped string into a URL-friendly slug.
|
|
45
|
+
*/
|
|
46
|
+
slugify() {
|
|
47
|
+
this.current = __sys__.utils.str.slugify(this.current);
|
|
48
|
+
return this;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* **truncate**
|
|
52
|
+
*
|
|
53
|
+
* Shortens the wrapped string to a specified length and appends a suffix.
|
|
54
|
+
*/
|
|
55
|
+
truncate(maxLength, suffix = "...") {
|
|
56
|
+
this.current = __sys__.utils.str.truncate(this.current, maxLength, suffix);
|
|
57
|
+
return this;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* **capitalize**
|
|
61
|
+
*
|
|
62
|
+
* Uppercases the first character of the wrapped string.
|
|
63
|
+
*/
|
|
64
|
+
capitalize() {
|
|
65
|
+
this.current = __sys__.utils.str.capitalize(this.current);
|
|
66
|
+
return this;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* **toCamelCase**
|
|
70
|
+
*
|
|
71
|
+
* Converts the wrapped string to camelCase.
|
|
72
|
+
*/
|
|
73
|
+
toCamelCase() {
|
|
74
|
+
this.current = __sys__.utils.str.toCamelCase(this.current);
|
|
75
|
+
return this;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* **toKebabCase**
|
|
79
|
+
*
|
|
80
|
+
* Converts the wrapped string to kebab-case.
|
|
81
|
+
*/
|
|
82
|
+
toKebabCase() {
|
|
83
|
+
this.current = __sys__.utils.str.toKebabCase(this.current);
|
|
84
|
+
return this;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* **toSnakeCase**
|
|
88
|
+
*
|
|
89
|
+
* Converts the wrapped string to snake_case.
|
|
90
|
+
*/
|
|
91
|
+
toSnakeCase() {
|
|
92
|
+
this.current = __sys__.utils.str.toSnakeCase(this.current);
|
|
93
|
+
return this;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* **toPascalCase**
|
|
97
|
+
*
|
|
98
|
+
* Converts the wrapped string to PascalCase.
|
|
99
|
+
*/
|
|
100
|
+
toPascalCase() {
|
|
101
|
+
this.current = __sys__.utils.str.toPascalCase(this.current);
|
|
102
|
+
return this;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* **toTitleCase**
|
|
106
|
+
*
|
|
107
|
+
* Converts the wrapped string to Title Case.
|
|
108
|
+
*/
|
|
109
|
+
toTitleCase() {
|
|
110
|
+
this.current = __sys__.utils.str.toTitleCase(this.current);
|
|
111
|
+
return this;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* **pad**
|
|
115
|
+
*
|
|
116
|
+
* Pads the wrapped string to the specified length.
|
|
117
|
+
*/
|
|
118
|
+
pad(length, char = " ", position = "start") {
|
|
119
|
+
this.current = __sys__.utils.str.pad(this.current, length, char, position);
|
|
120
|
+
return this;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* **reverse**
|
|
124
|
+
*
|
|
125
|
+
* Reverses the characters in the wrapped string.
|
|
126
|
+
*/
|
|
127
|
+
reverse() {
|
|
128
|
+
this.current = __sys__.utils.str.reverse(this.current);
|
|
129
|
+
return this;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* **stripHtml**
|
|
133
|
+
*
|
|
134
|
+
* Strips HTML tags from the wrapped string.
|
|
135
|
+
*/
|
|
136
|
+
stripHtml() {
|
|
137
|
+
this.current = __sys__.utils.str.stripHtml(this.current);
|
|
138
|
+
return this;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* **escapeHtml**
|
|
142
|
+
*
|
|
143
|
+
* Escapes HTML entities in the wrapped string.
|
|
144
|
+
*/
|
|
145
|
+
escapeHtml() {
|
|
146
|
+
this.current = __sys__.utils.str.escapeHtml(this.current);
|
|
147
|
+
return this;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* **unescapeHtml**
|
|
151
|
+
*
|
|
152
|
+
* Unescapes HTML entities in the wrapped string.
|
|
153
|
+
*/
|
|
154
|
+
unescapeHtml() {
|
|
155
|
+
this.current = __sys__.utils.str.unescapeHtml(this.current);
|
|
156
|
+
return this;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* **mask**
|
|
160
|
+
*
|
|
161
|
+
* Masks the wrapped string.
|
|
162
|
+
*/
|
|
163
|
+
mask(options = {}) {
|
|
164
|
+
this.current = __sys__.utils.str.mask(this.current, options);
|
|
165
|
+
return this;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* **wordWrap**
|
|
169
|
+
*
|
|
170
|
+
* Wraps the wrapped text at the given width.
|
|
171
|
+
*/
|
|
172
|
+
wordWrap(width, lineBreak = "\n") {
|
|
173
|
+
this.current = __sys__.utils.str.wordWrap(this.current, width, lineBreak);
|
|
174
|
+
return this;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* **stripAccents**
|
|
178
|
+
*
|
|
179
|
+
* Removes accents/diacritics from the wrapped string.
|
|
180
|
+
*/
|
|
181
|
+
stripAccents() {
|
|
182
|
+
this.current = __sys__.utils.str.stripAccents(this.current);
|
|
183
|
+
return this;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* **normalizeWhitespace**
|
|
187
|
+
*
|
|
188
|
+
* Normalizes whitespace runs in the wrapped string.
|
|
189
|
+
*/
|
|
190
|
+
normalizeWhitespace() {
|
|
191
|
+
this.current = __sys__.utils.str.normalizeWhitespace(this.current);
|
|
192
|
+
return this;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* **escapeRegExp**
|
|
196
|
+
*
|
|
197
|
+
* Escapes special regex characters in the wrapped string.
|
|
198
|
+
*/
|
|
199
|
+
escapeRegExp() {
|
|
200
|
+
this.current = __sys__.utils.str.escapeRegExp(this.current);
|
|
201
|
+
return this;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* **countOccurrences**
|
|
205
|
+
*
|
|
206
|
+
* Counts occurrences of `word` in the wrapped string.
|
|
207
|
+
*/
|
|
208
|
+
countOccurrences(word, caseSensitive = false) {
|
|
209
|
+
return __sys__.utils.str.countOccurrences(this.current, word, caseSensitive);
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* **isPalindrome**
|
|
213
|
+
*
|
|
214
|
+
* Checks if the wrapped string is a palindrome.
|
|
215
|
+
*/
|
|
216
|
+
isPalindrome(options = {}) {
|
|
217
|
+
return __sys__.utils.str.isPalindrome(this.current, options);
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* **wordCount**
|
|
221
|
+
*
|
|
222
|
+
* Counts words in the wrapped string.
|
|
223
|
+
*/
|
|
224
|
+
wordCount() {
|
|
225
|
+
return __sys__.utils.str.wordCount(this.current);
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* **chunk**
|
|
229
|
+
*
|
|
230
|
+
* Splits the wrapped string into chunks of `size`.
|
|
231
|
+
*/
|
|
232
|
+
chunk(size) {
|
|
233
|
+
return __sys__.utils.str.chunk(this.current, size);
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* **extractEmails**
|
|
237
|
+
*
|
|
238
|
+
* Extracts email addresses found in the wrapped string.
|
|
239
|
+
*/
|
|
240
|
+
extractEmails() {
|
|
241
|
+
return __sys__.utils.str.extractEmails(this.current);
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* **extractUrls**
|
|
245
|
+
*
|
|
246
|
+
* Extracts URLs found in the wrapped string.
|
|
247
|
+
*/
|
|
248
|
+
extractUrls() {
|
|
249
|
+
return __sys__.utils.str.extractUrls(this.current);
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* **isEmail**
|
|
253
|
+
*
|
|
254
|
+
* Validates whether the wrapped string is an email address.
|
|
255
|
+
*/
|
|
256
|
+
isEmail() {
|
|
257
|
+
return __sys__.utils.str.isEmail(this.current);
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* **isUrl**
|
|
261
|
+
*
|
|
262
|
+
* Validates whether the wrapped string is a URL.
|
|
263
|
+
*/
|
|
264
|
+
isUrl() {
|
|
265
|
+
return __sys__.utils.str.isUrl(this.current);
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* **between**
|
|
269
|
+
*
|
|
270
|
+
* Returns the substring between markers.
|
|
271
|
+
*/
|
|
272
|
+
between(start, end) {
|
|
273
|
+
return __sys__.utils.str.between(this.current, start, end);
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* **isBlank**
|
|
277
|
+
*
|
|
278
|
+
* Checks if the wrapped string is blank.
|
|
279
|
+
*/
|
|
280
|
+
isBlank() {
|
|
281
|
+
return __sys__.utils.str.isBlank(this.current);
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* **levenshteinDistance**
|
|
285
|
+
*
|
|
286
|
+
* Computes Levenshtein distance between wrapped string and `other`.
|
|
287
|
+
*/
|
|
288
|
+
levenshteinDistance(other) {
|
|
289
|
+
return __sys__.utils.str.levenshteinDistance(this.current, other);
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* **similarity**
|
|
293
|
+
*
|
|
294
|
+
* Computes similarity score between wrapped string and `other`.
|
|
295
|
+
*/
|
|
296
|
+
similarity(other) {
|
|
297
|
+
return __sys__.utils.str.similarity(this.current, other);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
exports.StringWrapper = StringWrapper;
|
|
302
|
+
//# sourceMappingURL=StringWrapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StringWrapper.js","sources":["../../../../../src/xhsc/utils/StringWrapper.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|