@catbee/utils 0.0.2 → 0.0.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/build/esm/config.d.ts +1 -1
- package/build/esm/config.js +7 -7
- package/build/esm/config.js.map +1 -1
- package/build/esm/index.d.ts +20 -19
- package/build/esm/index.js +20 -19
- package/build/esm/index.js.map +1 -1
- package/build/esm/types/api-response.d.ts +2 -2
- package/build/esm/types/api-response.js.map +1 -1
- package/build/esm/utils/array.utils.d.ts +1 -1
- package/build/esm/utils/array.utils.js +17 -27
- package/build/esm/utils/array.utils.js.map +1 -1
- package/build/esm/utils/async.utils.d.ts +1 -5
- package/build/esm/utils/async.utils.js +17 -20
- package/build/esm/utils/async.utils.js.map +1 -1
- package/build/esm/utils/cache.utils.js +2 -2
- package/build/esm/utils/cache.utils.js.map +1 -1
- package/build/esm/utils/context-store.utils.d.ts +1 -1
- package/build/esm/utils/context-store.utils.js +8 -8
- package/build/esm/utils/context-store.utils.js.map +1 -1
- package/build/esm/utils/crypto.utils.d.ts +2 -2
- package/build/esm/utils/crypto.utils.js +37 -45
- package/build/esm/utils/crypto.utils.js.map +1 -1
- package/build/esm/utils/decorators.utils.d.ts +7 -7
- package/build/esm/utils/decorators.utils.js +31 -31
- package/build/esm/utils/decorators.utils.js.map +1 -1
- package/build/esm/utils/dir.utils.d.ts +4 -4
- package/build/esm/utils/dir.utils.js +18 -20
- package/build/esm/utils/dir.utils.js.map +1 -1
- package/build/esm/utils/env.utils.js +22 -26
- package/build/esm/utils/env.utils.js.map +1 -1
- package/build/esm/utils/exception.utils.d.ts +1 -1
- package/build/esm/utils/exception.utils.js +26 -29
- package/build/esm/utils/exception.utils.js.map +1 -1
- package/build/esm/utils/fs.utils.d.ts +3 -3
- package/build/esm/utils/fs.utils.js +19 -23
- package/build/esm/utils/fs.utils.js.map +1 -1
- package/build/esm/utils/http-status-codes.js.map +1 -1
- package/build/esm/utils/id.utils.js +8 -8
- package/build/esm/utils/id.utils.js.map +1 -1
- package/build/esm/utils/logger.utils.d.ts +13 -4
- package/build/esm/utils/logger.utils.js +15 -15
- package/build/esm/utils/logger.utils.js.map +1 -1
- package/build/esm/utils/middleware.utils.d.ts +5 -4
- package/build/esm/utils/middleware.utils.js +19 -19
- package/build/esm/utils/middleware.utils.js.map +1 -1
- package/build/esm/utils/obj.utils.js +16 -27
- package/build/esm/utils/obj.utils.js.map +1 -1
- package/build/esm/utils/response.utils.d.ts +2 -2
- package/build/esm/utils/response.utils.js +11 -11
- package/build/esm/utils/response.utils.js.map +1 -1
- package/build/esm/utils/string.utils.js +17 -17
- package/build/esm/utils/string.utils.js.map +1 -1
- package/build/esm/utils/url.utils.js +20 -22
- package/build/esm/utils/url.utils.js.map +1 -1
- package/build/esm/utils/validate.utils.js +11 -15
- package/build/esm/utils/validate.utils.js.map +1 -1
- package/build/esnext/config.d.ts +1 -1
- package/build/esnext/config.js +7 -7
- package/build/esnext/config.js.map +1 -1
- package/build/esnext/index.d.ts +20 -19
- package/build/esnext/index.js +20 -19
- package/build/esnext/index.js.map +1 -1
- package/build/esnext/types/api-response.d.ts +2 -2
- package/build/esnext/types/api-response.js.map +1 -1
- package/build/esnext/utils/array.utils.d.ts +1 -1
- package/build/esnext/utils/array.utils.js +23 -31
- package/build/esnext/utils/array.utils.js.map +1 -1
- package/build/esnext/utils/async.utils.d.ts +1 -5
- package/build/esnext/utils/async.utils.js +22 -22
- package/build/esnext/utils/async.utils.js.map +1 -1
- package/build/esnext/utils/cache.utils.js +3 -3
- package/build/esnext/utils/cache.utils.js.map +1 -1
- package/build/esnext/utils/context-store.utils.d.ts +1 -1
- package/build/esnext/utils/context-store.utils.js +10 -10
- package/build/esnext/utils/context-store.utils.js.map +1 -1
- package/build/esnext/utils/crypto.utils.d.ts +2 -2
- package/build/esnext/utils/crypto.utils.js +37 -47
- package/build/esnext/utils/crypto.utils.js.map +1 -1
- package/build/esnext/utils/decorators.utils.d.ts +7 -7
- package/build/esnext/utils/decorators.utils.js +33 -33
- package/build/esnext/utils/decorators.utils.js.map +1 -1
- package/build/esnext/utils/dir.utils.d.ts +4 -4
- package/build/esnext/utils/dir.utils.js +22 -24
- package/build/esnext/utils/dir.utils.js.map +1 -1
- package/build/esnext/utils/env.utils.js +24 -26
- package/build/esnext/utils/env.utils.js.map +1 -1
- package/build/esnext/utils/exception.utils.d.ts +1 -1
- package/build/esnext/utils/exception.utils.js +26 -29
- package/build/esnext/utils/exception.utils.js.map +1 -1
- package/build/esnext/utils/fs.utils.d.ts +3 -3
- package/build/esnext/utils/fs.utils.js +21 -25
- package/build/esnext/utils/fs.utils.js.map +1 -1
- package/build/esnext/utils/http-status-codes.js.map +1 -1
- package/build/esnext/utils/id.utils.js +8 -8
- package/build/esnext/utils/id.utils.js.map +1 -1
- package/build/esnext/utils/logger.utils.d.ts +13 -4
- package/build/esnext/utils/logger.utils.js +15 -15
- package/build/esnext/utils/logger.utils.js.map +1 -1
- package/build/esnext/utils/middleware.utils.d.ts +5 -4
- package/build/esnext/utils/middleware.utils.js +19 -19
- package/build/esnext/utils/middleware.utils.js.map +1 -1
- package/build/esnext/utils/obj.utils.js +17 -26
- package/build/esnext/utils/obj.utils.js.map +1 -1
- package/build/esnext/utils/response.utils.d.ts +2 -2
- package/build/esnext/utils/response.utils.js +11 -11
- package/build/esnext/utils/response.utils.js.map +1 -1
- package/build/esnext/utils/string.utils.js +17 -17
- package/build/esnext/utils/string.utils.js.map +1 -1
- package/build/esnext/utils/url.utils.js +21 -23
- package/build/esnext/utils/url.utils.js.map +1 -1
- package/build/esnext/utils/validate.utils.js +14 -16
- package/build/esnext/utils/validate.utils.js.map +1 -1
- package/build/src/config.d.ts +1 -1
- package/build/src/config.js +6 -6
- package/build/src/config.js.map +1 -1
- package/build/src/index.d.ts +20 -19
- package/build/src/index.js +1 -0
- package/build/src/index.js.map +1 -1
- package/build/src/types/api-response.d.ts +2 -2
- package/build/src/types/api-response.js.map +1 -1
- package/build/src/utils/array.utils.d.ts +1 -1
- package/build/src/utils/array.utils.js +22 -30
- package/build/src/utils/array.utils.js.map +1 -1
- package/build/src/utils/async.utils.d.ts +1 -5
- package/build/src/utils/async.utils.js +22 -22
- package/build/src/utils/async.utils.js.map +1 -1
- package/build/src/utils/cache.utils.js +2 -2
- package/build/src/utils/cache.utils.js.map +1 -1
- package/build/src/utils/context-store.utils.d.ts +1 -1
- package/build/src/utils/context-store.utils.js +9 -9
- package/build/src/utils/context-store.utils.js.map +1 -1
- package/build/src/utils/crypto.utils.d.ts +2 -2
- package/build/src/utils/crypto.utils.js +35 -45
- package/build/src/utils/crypto.utils.js.map +1 -1
- package/build/src/utils/decorators.utils.d.ts +7 -7
- package/build/src/utils/decorators.utils.js +32 -32
- package/build/src/utils/decorators.utils.js.map +1 -1
- package/build/src/utils/dir.utils.d.ts +4 -4
- package/build/src/utils/dir.utils.js +16 -18
- package/build/src/utils/dir.utils.js.map +1 -1
- package/build/src/utils/env.utils.js +22 -24
- package/build/src/utils/env.utils.js.map +1 -1
- package/build/src/utils/exception.utils.d.ts +1 -1
- package/build/src/utils/exception.utils.js +23 -26
- package/build/src/utils/exception.utils.js.map +1 -1
- package/build/src/utils/fs.utils.d.ts +3 -3
- package/build/src/utils/fs.utils.js +15 -19
- package/build/src/utils/fs.utils.js.map +1 -1
- package/build/src/utils/http-status-codes.js.map +1 -1
- package/build/src/utils/id.utils.js +7 -7
- package/build/src/utils/id.utils.js.map +1 -1
- package/build/src/utils/logger.utils.d.ts +13 -4
- package/build/src/utils/logger.utils.js +12 -12
- package/build/src/utils/logger.utils.js.map +1 -1
- package/build/src/utils/middleware.utils.d.ts +5 -4
- package/build/src/utils/middleware.utils.js +12 -12
- package/build/src/utils/middleware.utils.js.map +1 -1
- package/build/src/utils/obj.utils.js +17 -26
- package/build/src/utils/obj.utils.js.map +1 -1
- package/build/src/utils/response.utils.d.ts +2 -2
- package/build/src/utils/response.utils.js +9 -9
- package/build/src/utils/response.utils.js.map +1 -1
- package/build/src/utils/string.utils.js +17 -17
- package/build/src/utils/string.utils.js.map +1 -1
- package/build/src/utils/url.utils.js +20 -22
- package/build/src/utils/url.utils.js.map +1 -1
- package/build/src/utils/validate.utils.js +14 -16
- package/build/src/utils/validate.utils.js.map +1 -1
- package/package.json +1 -1
|
@@ -35,11 +35,11 @@ function isEmail(str) {
|
|
|
35
35
|
if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(str))
|
|
36
36
|
return false;
|
|
37
37
|
// Additional checks
|
|
38
|
-
const [local, domain] = str.split(
|
|
38
|
+
const [local, domain] = str.split('@');
|
|
39
39
|
if (!local || !domain)
|
|
40
40
|
return false;
|
|
41
41
|
// Disallow consecutive dots in local or domain part
|
|
42
|
-
if (local.includes(
|
|
42
|
+
if (local.includes('..') || domain.includes('..'))
|
|
43
43
|
return false;
|
|
44
44
|
return true;
|
|
45
45
|
}
|
|
@@ -74,10 +74,10 @@ function isURL(str) {
|
|
|
74
74
|
* @returns {boolean} True if looks like a phone number.
|
|
75
75
|
*/
|
|
76
76
|
function isPhone(str) {
|
|
77
|
-
if (typeof str !==
|
|
77
|
+
if (typeof str !== 'string')
|
|
78
78
|
return false;
|
|
79
79
|
// Strip non-digit characters to count total digits
|
|
80
|
-
const digitsOnly = str.replace(/\D/g,
|
|
80
|
+
const digitsOnly = str.replace(/\D/g, '');
|
|
81
81
|
if (digitsOnly.length < 6 || digitsOnly.length > 15)
|
|
82
82
|
return false;
|
|
83
83
|
// Accept typical phone characters: +, digits, space, -, (, )
|
|
@@ -99,10 +99,10 @@ function isAlphanumeric(str) {
|
|
|
99
99
|
* @returns {boolean} True if the value is numeric.
|
|
100
100
|
*/
|
|
101
101
|
function isNumeric(value) {
|
|
102
|
-
if (typeof value ===
|
|
102
|
+
if (typeof value === 'string' && value.trim() === '')
|
|
103
103
|
return false;
|
|
104
|
-
const num = typeof value ===
|
|
105
|
-
return typeof num ===
|
|
104
|
+
const num = typeof value === 'number' ? value : Number(value);
|
|
105
|
+
return typeof num === 'number' && isFinite(num);
|
|
106
106
|
}
|
|
107
107
|
/**
|
|
108
108
|
* Checks if a string is a valid hex color code (e.g. #FFF or #FFFFFF).
|
|
@@ -124,7 +124,7 @@ function isISODate(str) {
|
|
|
124
124
|
if (!isoRegex.test(str))
|
|
125
125
|
return false;
|
|
126
126
|
const date = new Date(str);
|
|
127
|
-
return
|
|
127
|
+
return !isNaN(date.getTime()) && date.toISOString().startsWith(str.slice(0, 10));
|
|
128
128
|
}
|
|
129
129
|
/**
|
|
130
130
|
* Checks if a string matches a specified length range.
|
|
@@ -180,10 +180,10 @@ function isStrongPassword(str) {
|
|
|
180
180
|
* @returns {boolean} True if valid IPv4 address.
|
|
181
181
|
*/
|
|
182
182
|
function isIPv4(str) {
|
|
183
|
-
const parts = str.split(
|
|
183
|
+
const parts = str.split('.');
|
|
184
184
|
if (parts.length !== 4)
|
|
185
185
|
return false;
|
|
186
|
-
return parts.every(
|
|
186
|
+
return parts.every(part => {
|
|
187
187
|
const num = parseInt(part, 10);
|
|
188
188
|
return part === num.toString() && num >= 0 && num <= 255;
|
|
189
189
|
});
|
|
@@ -206,7 +206,7 @@ function isIPv6(str) {
|
|
|
206
206
|
*/
|
|
207
207
|
function isCreditCard(str) {
|
|
208
208
|
// Remove non-digit characters
|
|
209
|
-
const cardNumber = str.replace(/\D/g,
|
|
209
|
+
const cardNumber = str.replace(/\D/g, '');
|
|
210
210
|
if (cardNumber.length < 13 || cardNumber.length > 19)
|
|
211
211
|
return false;
|
|
212
212
|
// Luhn algorithm implementation
|
|
@@ -250,7 +250,7 @@ function isValidJSON(str) {
|
|
|
250
250
|
function isArray(value, itemGuard) {
|
|
251
251
|
if (!Array.isArray(value))
|
|
252
252
|
return false;
|
|
253
|
-
return !itemGuard || value.every(
|
|
253
|
+
return !itemGuard || value.every(item => itemGuard(item));
|
|
254
254
|
}
|
|
255
255
|
/**
|
|
256
256
|
* Checks if a string is a valid base64 encoded string.
|
|
@@ -269,9 +269,7 @@ function isBase64(str) {
|
|
|
269
269
|
* @returns {boolean} True if all required properties exist.
|
|
270
270
|
*/
|
|
271
271
|
function hasRequiredProps(obj, requiredProps) {
|
|
272
|
-
return requiredProps.every(
|
|
273
|
-
obj[prop] !== undefined &&
|
|
274
|
-
obj[prop] !== null);
|
|
272
|
+
return requiredProps.every(prop => Object.prototype.hasOwnProperty.call(obj, prop) && obj[prop] !== undefined && obj[prop] !== null);
|
|
275
273
|
}
|
|
276
274
|
/**
|
|
277
275
|
* Validates a date is within a specified range.
|
|
@@ -308,6 +306,6 @@ function matchesPattern(str, pattern) {
|
|
|
308
306
|
* @returns {boolean} True if value passes all validations.
|
|
309
307
|
*/
|
|
310
308
|
function validateAll(value, validators) {
|
|
311
|
-
return validators.every(
|
|
309
|
+
return validators.every(validator => validator(value));
|
|
312
310
|
}
|
|
313
311
|
//# sourceMappingURL=validate.utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.utils.js","sourceRoot":"","sources":["../../../src/utils/validate.utils.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAQH,0BAWC;AAQD,wBAIC;AAQD,sBAOC;AAQD,0BASC;AAQD,wCAEC;AAQD,8BAIC;AAQD,gCAEC;AAQD,8BAUC;AAUD,0CAMC;AAUD,0CAMC;AAQD,0BAEC;AASD,4CAOC;AAQD,wBAQC;AAQD,wBAKC;AAQD,oCAsBC;AAQD,kCAOC;AAUD,0BAMC;AAQD,4BAIC;AASD,4CAUC;AAUD,sCAWC;AASD,wCAEC;AASD,kCAKC;AAhVD;;;;;GAKG;AACH,SAAgB,OAAO,CAAC,GAAW;IACjC,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAE1D,oBAAoB;IACpB,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAEpC,oDAAoD;IACpD,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAEhE,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,SAAgB,MAAM,CAAC,GAAW;IAChC,OAAO,4EAA4E,CAAC,IAAI,CACtF,GAAG,CACJ,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAgB,KAAK,CAAC,GAAW;IAC/B,IAAI,CAAC;QACH,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAgB,OAAO,CAAC,GAAW;IACjC,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAE1C,mDAAmD;IACnD,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC1C,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,CAAC,MAAM,GAAG,EAAE;QAAE,OAAO,KAAK,CAAC;IAElE,6DAA6D;IAC7D,OAAO,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACvC,CAAC;AAED;;;;;GAKG;AACH,SAAgB,cAAc,CAAC,GAAW;IACxC,OAAO,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClC,CAAC;AAED;;;;;GAKG;AACH,SAAgB,SAAS,CAAC,KAAsB;IAC9C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,KAAK,CAAC;IACnE,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9D,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC;AAClD,CAAC;AAED;;;;;GAKG;AACH,SAAgB,UAAU,CAAC,GAAW;IACpC,OAAO,+BAA+B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnD,CAAC;AAED;;;;;GAKG;AACH,SAAgB,SAAS,CAAC,GAAW;IACnC,MAAM,QAAQ,GACZ,sEAAsE,CAAC;IAEzE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAEtC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3B,OAAO,CACL,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAC1E,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,eAAe,CAC7B,GAAW,EACX,GAAW,EACX,GAAW;IAEX,OAAO,GAAG,CAAC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC;AAChD,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,eAAe,CAC7B,KAAa,EACb,GAAW,EACX,GAAW;IAEX,OAAO,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,GAAG,CAAC;AACtC,CAAC;AAED;;;;;GAKG;AACH,SAAgB,OAAO,CAAC,GAAW;IACjC,OAAO,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjC,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,gBAAgB,CAAC,GAAW;IAC1C,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACjC,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,cAAc,GAAG,oCAAoC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtE,OAAO,YAAY,IAAI,YAAY,IAAI,UAAU,IAAI,cAAc,CAAC;AACtE,CAAC;AAED;;;;;GAKG;AACH,SAAgB,MAAM,CAAC,GAAW;IAChC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAErC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE;QAC1B,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC/B,OAAO,IAAI,KAAK,GAAG,CAAC,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,SAAgB,MAAM,CAAC,GAAW;IAChC,qDAAqD;IACrD,OAAO,smBAAsmB,CAAC,IAAI,CAChnB,GAAG,CACJ,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAgB,YAAY,CAAC,GAAW;IACtC,8BAA8B;IAC9B,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC1C,IAAI,UAAU,CAAC,MAAM,GAAG,EAAE,IAAI,UAAU,CAAC,MAAM,GAAG,EAAE;QAAE,OAAO,KAAK,CAAC;IAEnE,gCAAgC;IAChC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,YAAY,GAAG,KAAK,CAAC;IAEzB,KAAK,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAChD,IAAI,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAE/C,IAAI,YAAY,EAAE,CAAC;YACjB,KAAK,IAAI,CAAC,CAAC;YACX,IAAI,KAAK,GAAG,CAAC;gBAAE,KAAK,IAAI,CAAC,CAAC;QAC5B,CAAC;QAED,GAAG,IAAI,KAAK,CAAC;QACb,YAAY,GAAG,CAAC,YAAY,CAAC;IAC/B,CAAC;IAED,OAAO,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC;AACxB,CAAC;AAED;;;;;GAKG;AACH,SAAgB,WAAW,CAAC,GAAW;IACrC,IAAI,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,OAAO,CACrB,KAAc,EACd,SAAwC;IAExC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED;;;;;GAKG;AACH,SAAgB,QAAQ,CAAC,GAAW;IAClC,OAAO,kEAAkE,CAAC,IAAI,CAC5E,GAAG,CACJ,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,gBAAgB,CAC9B,GAA4B,EAC5B,aAAuB;IAEvB,OAAO,aAAa,CAAC,KAAK,CACxB,CAAC,IAAI,EAAE,EAAE,CACP,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC;QAC/C,GAAG,CAAC,IAAI,CAAC,KAAK,SAAS;QACvB,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,CACrB,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,aAAa,CAC3B,IAAU,EACV,OAAc,EACd,OAAc;IAEd,IAAI,CAAC,CAAC,IAAI,YAAY,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAAE,OAAO,KAAK,CAAC;IAEnE,IAAI,OAAO,IAAI,IAAI,GAAG,OAAO;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,OAAO,IAAI,IAAI,GAAG,OAAO;QAAE,OAAO,KAAK,CAAC;IAE5C,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,cAAc,CAAC,GAAW,EAAE,OAAe;IACzD,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,WAAW,CACzB,KAAc,EACd,UAA8C;IAE9C,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3D,CAAC","sourcesContent":["/**\n * Collection of common validation helpers for strings, numbers, email, UUID, etc.\n */\n\n/**\n * Checks if a string is a valid email address.\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if valid email, else false.\n */\nexport function isEmail(str: string): boolean {\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(str)) return false;\n\n // Additional checks\n const [local, domain] = str.split(\"@\");\n if (!local || !domain) return false;\n\n // Disallow consecutive dots in local or domain part\n if (local.includes(\"..\") || domain.includes(\"..\")) return false;\n\n return true;\n}\n\n/**\n * Checks if a string is a valid UUID (versions 1-5).\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if valid UUID, else false.\n */\nexport function isUUID(str: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n str,\n );\n}\n\n/**\n * Checks if a string is a valid URL.\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if valid URL, else false.\n */\nexport function isURL(str: string): boolean {\n try {\n new URL(str);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Checks if a string is a valid international phone number (E.164 or common patterns).\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if looks like a phone number.\n */\nexport function isPhone(str: string): boolean {\n if (typeof str !== \"string\") return false;\n\n // Strip non-digit characters to count total digits\n const digitsOnly = str.replace(/\\D/g, \"\");\n if (digitsOnly.length < 6 || digitsOnly.length > 15) return false;\n\n // Accept typical phone characters: +, digits, space, -, (, )\n return /^[+]?[\\d\\s().-]+$/.test(str);\n}\n\n/**\n * Checks if a string is strictly alphanumeric (letters/numbers only).\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if alphanumeric.\n */\nexport function isAlphanumeric(str: string): boolean {\n return /^[a-z0-9]+$/i.test(str);\n}\n\n/**\n * Checks if a string or number can be safely parsed to a number.\n *\n * @param {string | number} value - The value to check.\n * @returns {boolean} True if the value is numeric.\n */\nexport function isNumeric(value: string | number): boolean {\n if (typeof value === \"string\" && value.trim() === \"\") return false;\n const num = typeof value === \"number\" ? value : Number(value);\n return typeof num === \"number\" && isFinite(num);\n}\n\n/**\n * Checks if a string is a valid hex color code (e.g. #FFF or #FFFFFF).\n *\n * @param {string} str - Input string.\n * @returns {boolean}\n */\nexport function isHexColor(str: string): boolean {\n return /^#([a-f0-9]{6}|[a-f0-9]{3})$/i.test(str);\n}\n\n/**\n * Checks if a string is a valid date string.\n *\n * @param {string} str - Input string.\n * @returns {boolean}\n */\nexport function isISODate(str: string): boolean {\n const isoRegex =\n /^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(Z|[+-]\\d{2}:\\d{2})?)?$/;\n\n if (!isoRegex.test(str)) return false;\n\n const date = new Date(str);\n return (\n !isNaN(date.getTime()) && date.toISOString().startsWith(str.slice(0, 10))\n );\n}\n\n/**\n * Checks if a string matches a specified length range.\n *\n * @param {string} str - The input string.\n * @param {number} min - Minimum length (inclusive).\n * @param {number} max - Maximum length (inclusive).\n * @returns {boolean} True if string length is within range.\n */\nexport function isLengthBetween(\n str: string,\n min: number,\n max: number,\n): boolean {\n return str.length >= min && str.length <= max;\n}\n\n/**\n * Validates that a number is between specified min and max values (inclusive).\n *\n * @param {number} value - The number to validate.\n * @param {number} min - Minimum value.\n * @param {number} max - Maximum value.\n * @returns {boolean} True if number is within range.\n */\nexport function isNumberBetween(\n value: number,\n min: number,\n max: number,\n): boolean {\n return value >= min && value <= max;\n}\n\n/**\n * Checks if a string contains only alphabetic characters.\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if alphabetic only.\n */\nexport function isAlpha(str: string): boolean {\n return /^[a-zA-Z]+$/.test(str);\n}\n\n/**\n * Validates that a string contains at least one uppercase letter,\n * one lowercase letter, one number, and one special character.\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if string meets password complexity requirements.\n */\nexport function isStrongPassword(str: string): boolean {\n if (str.length < 8) return false;\n const hasUpperCase = /[A-Z]/.test(str);\n const hasLowerCase = /[a-z]/.test(str);\n const hasNumbers = /[0-9]/.test(str);\n const hasSpecialChar = /[!@#$%^&*()_+\\-=[\\]{};':\"\\\\|,.<>?]/.test(str);\n return hasUpperCase && hasLowerCase && hasNumbers && hasSpecialChar;\n}\n\n/**\n * Checks if a string is a valid IPv4 address.\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if valid IPv4 address.\n */\nexport function isIPv4(str: string): boolean {\n const parts = str.split(\".\");\n if (parts.length !== 4) return false;\n\n return parts.every((part) => {\n const num = parseInt(part, 10);\n return part === num.toString() && num >= 0 && num <= 255;\n });\n}\n\n/**\n * Checks if a string is a valid IPv6 address.\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if valid IPv6 address.\n */\nexport function isIPv6(str: string): boolean {\n // Simple but effective check for common IPv6 formats\n return /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?[0-9])?[0-9])\\.){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?[0-9])?[0-9])\\.){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9]))$/.test(\n str,\n );\n}\n\n/**\n * Validates a credit card number using the Luhn algorithm.\n *\n * @param {string} str - The credit card number string.\n * @returns {boolean} True if valid credit card number.\n */\nexport function isCreditCard(str: string): boolean {\n // Remove non-digit characters\n const cardNumber = str.replace(/\\D/g, \"\");\n if (cardNumber.length < 13 || cardNumber.length > 19) return false;\n\n // Luhn algorithm implementation\n let sum = 0;\n let shouldDouble = false;\n\n for (let i = cardNumber.length - 1; i >= 0; i--) {\n let digit = parseInt(cardNumber.charAt(i), 10);\n\n if (shouldDouble) {\n digit *= 2;\n if (digit > 9) digit -= 9;\n }\n\n sum += digit;\n shouldDouble = !shouldDouble;\n }\n\n return sum % 10 === 0;\n}\n\n/**\n * Checks if a string is a valid JSON.\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if valid JSON.\n */\nexport function isValidJSON(str: string): boolean {\n try {\n JSON.parse(str);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Type guard that checks if a value is an array.\n *\n * @template T Optional expected element type\n * @param {unknown} value - The value to check.\n * @param {(item: unknown) => boolean} [itemGuard] - Optional function to validate each item.\n * @returns {boolean} True if value is an array (with optional item validation).\n */\nexport function isArray<T = unknown>(\n value: unknown,\n itemGuard?: (item: unknown) => item is T,\n): value is T[] {\n if (!Array.isArray(value)) return false;\n return !itemGuard || value.every((item) => itemGuard(item));\n}\n\n/**\n * Checks if a string is a valid base64 encoded string.\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if valid base64.\n */\nexport function isBase64(str: string): boolean {\n return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(\n str,\n );\n}\n\n/**\n * Validates that an object has all required properties.\n *\n * @param {object} obj - The object to validate.\n * @param {string[]} requiredProps - Array of required property names.\n * @returns {boolean} True if all required properties exist.\n */\nexport function hasRequiredProps(\n obj: Record<string, unknown>,\n requiredProps: string[],\n): boolean {\n return requiredProps.every(\n (prop) =>\n Object.prototype.hasOwnProperty.call(obj, prop) &&\n obj[prop] !== undefined &&\n obj[prop] !== null,\n );\n}\n\n/**\n * Validates a date is within a specified range.\n *\n * @param {Date} date - The date to validate.\n * @param {Date} [minDate] - Optional minimum date (inclusive).\n * @param {Date} [maxDate] - Optional maximum date (inclusive).\n * @returns {boolean} True if date is within range.\n */\nexport function isDateInRange(\n date: Date,\n minDate?: Date,\n maxDate?: Date,\n): boolean {\n if (!(date instanceof Date) || isNaN(date.getTime())) return false;\n\n if (minDate && date < minDate) return false;\n if (maxDate && date > maxDate) return false;\n\n return true;\n}\n\n/**\n * Validates a string matches a specific regular expression pattern.\n *\n * @param {string} str - The input string.\n * @param {RegExp} pattern - Regular expression to test against.\n * @returns {boolean} True if string matches pattern.\n */\nexport function matchesPattern(str: string, pattern: RegExp): boolean {\n return pattern.test(str);\n}\n\n/**\n * Validates data against multiple constraints.\n *\n * @param {unknown} value - The value to validate.\n * @param {Array<(value: unknown) => boolean>} validators - Array of validation functions.\n * @returns {boolean} True if value passes all validations.\n */\nexport function validateAll(\n value: unknown,\n validators: Array<(value: unknown) => boolean>,\n): boolean {\n return validators.every((validator) => validator(value));\n}\n"]}
|
|
1
|
+
{"version":3,"file":"validate.utils.js","sourceRoot":"","sources":["../../../src/utils/validate.utils.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Collection of common validation helpers for strings, numbers, email, UUID, etc.\n */\n\n/**\n * Checks if a string is a valid email address.\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if valid email, else false.\n */\nexport function isEmail(str: string): boolean {\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(str)) return false;\n\n // Additional checks\n const [local, domain] = str.split('@');\n if (!local || !domain) return false;\n\n // Disallow consecutive dots in local or domain part\n if (local.includes('..') || domain.includes('..')) return false;\n\n return true;\n}\n\n/**\n * Checks if a string is a valid UUID (versions 1-5).\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if valid UUID, else false.\n */\nexport function isUUID(str: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(str);\n}\n\n/**\n * Checks if a string is a valid URL.\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if valid URL, else false.\n */\nexport function isURL(str: string): boolean {\n try {\n new URL(str);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Checks if a string is a valid international phone number (E.164 or common patterns).\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if looks like a phone number.\n */\nexport function isPhone(str: string): boolean {\n if (typeof str !== 'string') return false;\n\n // Strip non-digit characters to count total digits\n const digitsOnly = str.replace(/\\D/g, '');\n if (digitsOnly.length < 6 || digitsOnly.length > 15) return false;\n\n // Accept typical phone characters: +, digits, space, -, (, )\n return /^[+]?[\\d\\s().-]+$/.test(str);\n}\n\n/**\n * Checks if a string is strictly alphanumeric (letters/numbers only).\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if alphanumeric.\n */\nexport function isAlphanumeric(str: string): boolean {\n return /^[a-z0-9]+$/i.test(str);\n}\n\n/**\n * Checks if a string or number can be safely parsed to a number.\n *\n * @param {string | number} value - The value to check.\n * @returns {boolean} True if the value is numeric.\n */\nexport function isNumeric(value: string | number): boolean {\n if (typeof value === 'string' && value.trim() === '') return false;\n const num = typeof value === 'number' ? value : Number(value);\n return typeof num === 'number' && isFinite(num);\n}\n\n/**\n * Checks if a string is a valid hex color code (e.g. #FFF or #FFFFFF).\n *\n * @param {string} str - Input string.\n * @returns {boolean}\n */\nexport function isHexColor(str: string): boolean {\n return /^#([a-f0-9]{6}|[a-f0-9]{3})$/i.test(str);\n}\n\n/**\n * Checks if a string is a valid date string.\n *\n * @param {string} str - Input string.\n * @returns {boolean}\n */\nexport function isISODate(str: string): boolean {\n const isoRegex = /^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(Z|[+-]\\d{2}:\\d{2})?)?$/;\n\n if (!isoRegex.test(str)) return false;\n\n const date = new Date(str);\n return !isNaN(date.getTime()) && date.toISOString().startsWith(str.slice(0, 10));\n}\n\n/**\n * Checks if a string matches a specified length range.\n *\n * @param {string} str - The input string.\n * @param {number} min - Minimum length (inclusive).\n * @param {number} max - Maximum length (inclusive).\n * @returns {boolean} True if string length is within range.\n */\nexport function isLengthBetween(str: string, min: number, max: number): boolean {\n return str.length >= min && str.length <= max;\n}\n\n/**\n * Validates that a number is between specified min and max values (inclusive).\n *\n * @param {number} value - The number to validate.\n * @param {number} min - Minimum value.\n * @param {number} max - Maximum value.\n * @returns {boolean} True if number is within range.\n */\nexport function isNumberBetween(value: number, min: number, max: number): boolean {\n return value >= min && value <= max;\n}\n\n/**\n * Checks if a string contains only alphabetic characters.\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if alphabetic only.\n */\nexport function isAlpha(str: string): boolean {\n return /^[a-zA-Z]+$/.test(str);\n}\n\n/**\n * Validates that a string contains at least one uppercase letter,\n * one lowercase letter, one number, and one special character.\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if string meets password complexity requirements.\n */\nexport function isStrongPassword(str: string): boolean {\n if (str.length < 8) return false;\n const hasUpperCase = /[A-Z]/.test(str);\n const hasLowerCase = /[a-z]/.test(str);\n const hasNumbers = /[0-9]/.test(str);\n const hasSpecialChar = /[!@#$%^&*()_+\\-=[\\]{};':\"\\\\|,.<>?]/.test(str);\n return hasUpperCase && hasLowerCase && hasNumbers && hasSpecialChar;\n}\n\n/**\n * Checks if a string is a valid IPv4 address.\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if valid IPv4 address.\n */\nexport function isIPv4(str: string): boolean {\n const parts = str.split('.');\n if (parts.length !== 4) return false;\n\n return parts.every(part => {\n const num = parseInt(part, 10);\n return part === num.toString() && num >= 0 && num <= 255;\n });\n}\n\n/**\n * Checks if a string is a valid IPv6 address.\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if valid IPv6 address.\n */\nexport function isIPv6(str: string): boolean {\n // Simple but effective check for common IPv6 formats\n return /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?[0-9])?[0-9])\\.){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?[0-9])?[0-9])\\.){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9]))$/.test(\n str\n );\n}\n\n/**\n * Validates a credit card number using the Luhn algorithm.\n *\n * @param {string} str - The credit card number string.\n * @returns {boolean} True if valid credit card number.\n */\nexport function isCreditCard(str: string): boolean {\n // Remove non-digit characters\n const cardNumber = str.replace(/\\D/g, '');\n if (cardNumber.length < 13 || cardNumber.length > 19) return false;\n\n // Luhn algorithm implementation\n let sum = 0;\n let shouldDouble = false;\n\n for (let i = cardNumber.length - 1; i >= 0; i--) {\n let digit = parseInt(cardNumber.charAt(i), 10);\n\n if (shouldDouble) {\n digit *= 2;\n if (digit > 9) digit -= 9;\n }\n\n sum += digit;\n shouldDouble = !shouldDouble;\n }\n\n return sum % 10 === 0;\n}\n\n/**\n * Checks if a string is a valid JSON.\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if valid JSON.\n */\nexport function isValidJSON(str: string): boolean {\n try {\n JSON.parse(str);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Type guard that checks if a value is an array.\n *\n * @template T Optional expected element type\n * @param {unknown} value - The value to check.\n * @param {(item: unknown) => boolean} [itemGuard] - Optional function to validate each item.\n * @returns {boolean} True if value is an array (with optional item validation).\n */\nexport function isArray<T = unknown>(value: unknown, itemGuard?: (item: unknown) => item is T): value is T[] {\n if (!Array.isArray(value)) return false;\n return !itemGuard || value.every(item => itemGuard(item));\n}\n\n/**\n * Checks if a string is a valid base64 encoded string.\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if valid base64.\n */\nexport function isBase64(str: string): boolean {\n return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(str);\n}\n\n/**\n * Validates that an object has all required properties.\n *\n * @param {object} obj - The object to validate.\n * @param {string[]} requiredProps - Array of required property names.\n * @returns {boolean} True if all required properties exist.\n */\nexport function hasRequiredProps(obj: Record<string, unknown>, requiredProps: string[]): boolean {\n return requiredProps.every(\n prop => Object.prototype.hasOwnProperty.call(obj, prop) && obj[prop] !== undefined && obj[prop] !== null\n );\n}\n\n/**\n * Validates a date is within a specified range.\n *\n * @param {Date} date - The date to validate.\n * @param {Date} [minDate] - Optional minimum date (inclusive).\n * @param {Date} [maxDate] - Optional maximum date (inclusive).\n * @returns {boolean} True if date is within range.\n */\nexport function isDateInRange(date: Date, minDate?: Date, maxDate?: Date): boolean {\n if (!(date instanceof Date) || isNaN(date.getTime())) return false;\n\n if (minDate && date < minDate) return false;\n if (maxDate && date > maxDate) return false;\n\n return true;\n}\n\n/**\n * Validates a string matches a specific regular expression pattern.\n *\n * @param {string} str - The input string.\n * @param {RegExp} pattern - Regular expression to test against.\n * @returns {boolean} True if string matches pattern.\n */\nexport function matchesPattern(str: string, pattern: RegExp): boolean {\n return pattern.test(str);\n}\n\n/**\n * Validates data against multiple constraints.\n *\n * @param {unknown} value - The value to validate.\n * @param {Array<(value: unknown) => boolean>} validators - Array of validation functions.\n * @returns {boolean} True if value passes all validations.\n */\nexport function validateAll(value: unknown, validators: Array<(value: unknown) => boolean>): boolean {\n return validators.every(validator => validator(value));\n}\n"]}
|