desktopr 1.3.1 → 2.0.1
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-sdk/_companion_context.js +10 -5
- package/dist-sdk/_helpers.js +1 -1
- package/dist-sdk/desktopr/_helpers.js +1 -1
- package/dist-sdk/desktopr/_types.d.ts +2 -2
- package/dist-sdk/modules/rs/app/_types.d.ts +1 -1
- package/dist-sdk/modules/rs/badge/_types.d.ts +1 -1
- package/dist-sdk/modules/rs/contextMenu/_helpers.js +1 -1
- package/dist-sdk/modules/rs/diagnostics/_helpers.js +1 -1
- package/dist-sdk/modules/rs/diagnostics/_types.d.ts +1 -1
- package/dist-sdk/modules/rs/files/_types.d.ts +1 -1
- package/dist-sdk/modules/rs/fs/_main.js +44 -1
- package/dist-sdk/modules/rs/fs/_types.d.ts +7 -1
- package/dist-sdk/modules/rs/menu/_helpers.js +1 -1
- package/dist-sdk/modules/rs/network/_types.d.ts +1 -1
- package/dist-sdk/modules/rs/plugins/_helpers.d.ts +1 -0
- package/dist-sdk/modules/rs/plugins/_helpers.js +9 -0
- package/dist-sdk/modules/rs/plugins/_main.d.ts +5 -0
- package/dist-sdk/modules/rs/plugins/_main.js +15 -0
- package/dist-sdk/modules/rs/plugins/_types.d.ts +38 -0
- package/dist-sdk/modules/rs/plugins/_types.js +2 -0
- package/dist-sdk/modules/rs/window/_helpers.js +1 -1
- package/dist-sdk/modules/rs/window/_main.js +0 -5
- package/dist-sdk/modules/rs/window/_types.d.ts +0 -5
- package/dist-sdk/modules/rs/worker/_main.d.ts +1 -1
- package/dist-sdk/modules/rs/worker/_types.d.ts +1 -1
- package/dist-sdk/utils/crypto/_crypto.d.ts +31 -0
- package/dist-sdk/utils/crypto/_crypto.js +116 -0
- package/dist-sdk/utils/crypto/index.d.ts +1 -0
- package/dist-sdk/utils/crypto/index.js +17 -0
- package/dist-sdk/utils/index.d.ts +2 -0
- package/dist-sdk/utils/index.js +18 -0
- package/dist-sdk/utils/shared/_types.d.ts +64 -0
- package/dist-sdk/utils/shared/_types.js +2 -0
- package/dist-sdk/utils/utils/_browserStorage.d.ts +22 -0
- package/dist-sdk/utils/utils/_browserStorage.js +149 -0
- package/dist-sdk/utils/utils/_integerUtils.d.ts +50 -0
- package/dist-sdk/utils/utils/_integerUtils.js +74 -0
- package/dist-sdk/utils/utils/_jitter.d.ts +4 -0
- package/dist-sdk/utils/utils/_jitter.js +25 -0
- package/dist-sdk/utils/utils/_json.d.ts +63 -0
- package/dist-sdk/utils/utils/_json.js +510 -0
- package/dist-sdk/utils/utils/_logger.d.ts +16 -0
- package/dist-sdk/utils/utils/_logger.js +43 -0
- package/dist-sdk/utils/utils/_pageStore.d.ts +37 -0
- package/dist-sdk/utils/utils/_pageStore.js +61 -0
- package/dist-sdk/utils/utils/_regexPatterns.d.ts +113 -0
- package/dist-sdk/utils/utils/_regexPatterns.js +150 -0
- package/dist-sdk/utils/utils/_typesValidation.d.ts +50 -0
- package/dist-sdk/utils/utils/_typesValidation.js +125 -0
- package/dist-sdk/utils/utils/_utils.d.ts +201 -0
- package/dist-sdk/utils/utils/_utils.js +1200 -0
- package/dist-sdk/utils/utils/index.d.ts +9 -0
- package/dist-sdk/utils/utils/index.js +25 -0
- package/package.json +1 -1
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
export declare const RE_WS: RegExp;
|
|
2
|
+
export declare const RE_QUERY_SENSITIVE: RegExp;
|
|
3
|
+
export declare const RE_AUTH: RegExp;
|
|
4
|
+
export declare const RE_AWS_ACCESS_KEY: RegExp;
|
|
5
|
+
export declare const RE_SECRET40: RegExp;
|
|
6
|
+
export declare const RE_LONG_DIGITS: RegExp;
|
|
7
|
+
export declare const RE_IPV4_NOLB: RegExp;
|
|
8
|
+
export declare const RE_PATH_SECRET: RegExp;
|
|
9
|
+
export declare const RE_PEM_BLOCK: RegExp;
|
|
10
|
+
export declare const RE_WHITESPACE: RegExp;
|
|
11
|
+
export declare const RE_NON_WORD: RegExp;
|
|
12
|
+
export declare const RE_SLUG: RegExp;
|
|
13
|
+
export declare const RE_USERNAME_SIMPLE: RegExp;
|
|
14
|
+
export declare const RE_HASHTAG: RegExp;
|
|
15
|
+
export declare const RE_MENTION: RegExp;
|
|
16
|
+
export declare const RE_INT: RegExp;
|
|
17
|
+
export declare const RE_FLOAT: RegExp;
|
|
18
|
+
export declare const RE_NUMBER_THOUSANDS: RegExp;
|
|
19
|
+
export declare const RE_HEX_PREFIXED: RegExp;
|
|
20
|
+
export declare const RE_HEX_COLOR: RegExp;
|
|
21
|
+
export declare const RE_RGB: RegExp;
|
|
22
|
+
export declare const RE_RGBA: RegExp;
|
|
23
|
+
export declare const RE_HSL: RegExp;
|
|
24
|
+
export declare const RE_HSLA: RegExp;
|
|
25
|
+
export declare const RE_EMAIL: RegExp;
|
|
26
|
+
export declare const RE_DOMAIN: RegExp;
|
|
27
|
+
export declare const RE_URL_HTTP: RegExp;
|
|
28
|
+
export declare const RE_URL_SIMPLE: RegExp;
|
|
29
|
+
export declare const RE_IPV4: RegExp;
|
|
30
|
+
export declare const RE_IPV6_SIMPLE: RegExp;
|
|
31
|
+
export declare const RE_MAC: RegExp;
|
|
32
|
+
export declare const RE_HOSTPORT: RegExp;
|
|
33
|
+
export declare const RE_E164_PHONE: RegExp;
|
|
34
|
+
export declare const RE_DATE_ISO: RegExp;
|
|
35
|
+
export declare const RE_TIME_24H: RegExp;
|
|
36
|
+
export declare const RE_TIME_12H: RegExp;
|
|
37
|
+
export declare const RE_DATETIME_ISO: RegExp;
|
|
38
|
+
export declare const RE_DATE_DDMMYYYY: RegExp;
|
|
39
|
+
export declare const RE_DATE_MMDDYYYY: RegExp;
|
|
40
|
+
export declare const RE_TZ_OFFSET: RegExp;
|
|
41
|
+
export declare const RE_UUID_ANY: RegExp;
|
|
42
|
+
export declare const RE_UUID_V4: RegExp;
|
|
43
|
+
export declare const RE_ULID: RegExp;
|
|
44
|
+
export declare const RE_BASE64: RegExp;
|
|
45
|
+
export declare const RE_JWT: RegExp;
|
|
46
|
+
export declare const RE_SHA1: RegExp;
|
|
47
|
+
export declare const RE_SHA256: RegExp;
|
|
48
|
+
export declare const RE_GIT_COMMIT: RegExp;
|
|
49
|
+
export declare const RE_IBAN_GENERIC: RegExp;
|
|
50
|
+
export declare const RE_CREDITCARD_GENERIC: RegExp;
|
|
51
|
+
export declare const RE_VISA: RegExp;
|
|
52
|
+
export declare const RE_MASTERCARD: RegExp;
|
|
53
|
+
export declare const RE_CURRENCY_GENERIC: RegExp;
|
|
54
|
+
export declare const RE_PERCENT: RegExp;
|
|
55
|
+
export declare const RE_ZIP_US: RegExp;
|
|
56
|
+
export declare const RE_CAP_IT: RegExp;
|
|
57
|
+
export declare const RE_POSTCODE_UK_APPROX: RegExp;
|
|
58
|
+
export declare const RE_FILENAME_SAFE: RegExp;
|
|
59
|
+
export declare const RE_UNIX_PATH: RegExp;
|
|
60
|
+
export declare const RE_WINDOWS_PATH: RegExp;
|
|
61
|
+
export declare const RE_EXTENSION: RegExp;
|
|
62
|
+
export declare const RE_MIME_TYPE: RegExp;
|
|
63
|
+
export declare const RE_LAT: RegExp;
|
|
64
|
+
export declare const RE_LON: RegExp;
|
|
65
|
+
export declare const RE_LATLON_PAIR: RegExp;
|
|
66
|
+
export declare const RE_CAMEL_CASE: RegExp;
|
|
67
|
+
export declare const RE_PASCAL_CASE: RegExp;
|
|
68
|
+
export declare const RE_SNAKE_CASE: RegExp;
|
|
69
|
+
export declare const RE_KEBAB_CASE: RegExp;
|
|
70
|
+
export declare const RE_HTML_TAG: RegExp;
|
|
71
|
+
export declare const RE_CSV_LINE: RegExp;
|
|
72
|
+
export declare const RE_PASSWORD_STRONG: RegExp;
|
|
73
|
+
export declare const RE_IPV6: RegExp;
|
|
74
|
+
export declare const RE_CF_IT_STRICT: RegExp;
|
|
75
|
+
export declare const RE_CF_IT_OMOCODIA: RegExp;
|
|
76
|
+
export declare const RE_PIVA_IT: RegExp;
|
|
77
|
+
export declare const RE_PEC_IT_STRICT: RegExp;
|
|
78
|
+
export declare const RE_PEC_GENERIC: RegExp;
|
|
79
|
+
export declare const RE_VAT_AT: RegExp;
|
|
80
|
+
export declare const RE_VAT_BE: RegExp;
|
|
81
|
+
export declare const RE_VAT_BG: RegExp;
|
|
82
|
+
export declare const RE_VAT_HR: RegExp;
|
|
83
|
+
export declare const RE_VAT_CY: RegExp;
|
|
84
|
+
export declare const RE_VAT_CZ: RegExp;
|
|
85
|
+
export declare const RE_VAT_DK: RegExp;
|
|
86
|
+
export declare const RE_VAT_EE: RegExp;
|
|
87
|
+
export declare const RE_VAT_FI: RegExp;
|
|
88
|
+
export declare const RE_VAT_FR: RegExp;
|
|
89
|
+
export declare const RE_VAT_DE: RegExp;
|
|
90
|
+
export declare const RE_VAT_EL: RegExp;
|
|
91
|
+
export declare const RE_VAT_HU: RegExp;
|
|
92
|
+
export declare const RE_VAT_IE: RegExp;
|
|
93
|
+
export declare const RE_VAT_IT: RegExp;
|
|
94
|
+
export declare const RE_VAT_LV: RegExp;
|
|
95
|
+
export declare const RE_VAT_LT: RegExp;
|
|
96
|
+
export declare const RE_VAT_LU: RegExp;
|
|
97
|
+
export declare const RE_VAT_MT: RegExp;
|
|
98
|
+
export declare const RE_VAT_NL: RegExp;
|
|
99
|
+
export declare const RE_VAT_PL: RegExp;
|
|
100
|
+
export declare const RE_VAT_PT: RegExp;
|
|
101
|
+
export declare const RE_VAT_RO: RegExp;
|
|
102
|
+
export declare const RE_VAT_SK: RegExp;
|
|
103
|
+
export declare const RE_VAT_SI: RegExp;
|
|
104
|
+
export declare const RE_VAT_ES: RegExp;
|
|
105
|
+
export declare const RE_VAT_SE: RegExp;
|
|
106
|
+
export declare const RE_S3_URI: RegExp;
|
|
107
|
+
export declare const RE_S3_VHOST_URL: RegExp;
|
|
108
|
+
export declare const RE_S3_PATH_URL: RegExp;
|
|
109
|
+
export declare const RE_R2_PUBLIC_URL: RegExp;
|
|
110
|
+
export declare const RE_R2_S3_COMPAT_URL: RegExp;
|
|
111
|
+
export declare const RE_SEMVER: RegExp;
|
|
112
|
+
export declare const RE_SEMVER_RANGE_SIMPLE: RegExp;
|
|
113
|
+
export declare const RE_SEMVER_RANGE_COMPARATORS: RegExp;
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RE_CREDITCARD_GENERIC = exports.RE_IBAN_GENERIC = exports.RE_GIT_COMMIT = exports.RE_SHA256 = exports.RE_SHA1 = exports.RE_JWT = exports.RE_BASE64 = exports.RE_ULID = exports.RE_UUID_V4 = exports.RE_UUID_ANY = exports.RE_TZ_OFFSET = exports.RE_DATE_MMDDYYYY = exports.RE_DATE_DDMMYYYY = exports.RE_DATETIME_ISO = exports.RE_TIME_12H = exports.RE_TIME_24H = exports.RE_DATE_ISO = exports.RE_E164_PHONE = exports.RE_HOSTPORT = exports.RE_MAC = exports.RE_IPV6_SIMPLE = exports.RE_IPV4 = exports.RE_URL_SIMPLE = exports.RE_URL_HTTP = exports.RE_DOMAIN = exports.RE_EMAIL = exports.RE_HSLA = exports.RE_HSL = exports.RE_RGBA = exports.RE_RGB = exports.RE_HEX_COLOR = exports.RE_HEX_PREFIXED = exports.RE_NUMBER_THOUSANDS = exports.RE_FLOAT = exports.RE_INT = exports.RE_MENTION = exports.RE_HASHTAG = exports.RE_USERNAME_SIMPLE = exports.RE_SLUG = exports.RE_NON_WORD = exports.RE_WHITESPACE = exports.RE_PEM_BLOCK = exports.RE_PATH_SECRET = exports.RE_IPV4_NOLB = exports.RE_LONG_DIGITS = exports.RE_SECRET40 = exports.RE_AWS_ACCESS_KEY = exports.RE_AUTH = exports.RE_QUERY_SENSITIVE = exports.RE_WS = void 0;
|
|
4
|
+
exports.RE_VAT_PT = exports.RE_VAT_PL = exports.RE_VAT_NL = exports.RE_VAT_MT = exports.RE_VAT_LU = exports.RE_VAT_LT = exports.RE_VAT_LV = exports.RE_VAT_IT = exports.RE_VAT_IE = exports.RE_VAT_HU = exports.RE_VAT_EL = exports.RE_VAT_DE = exports.RE_VAT_FR = exports.RE_VAT_FI = exports.RE_VAT_EE = exports.RE_VAT_DK = exports.RE_VAT_CZ = exports.RE_VAT_CY = exports.RE_VAT_HR = exports.RE_VAT_BG = exports.RE_VAT_BE = exports.RE_VAT_AT = exports.RE_PEC_GENERIC = exports.RE_PEC_IT_STRICT = exports.RE_PIVA_IT = exports.RE_CF_IT_OMOCODIA = exports.RE_CF_IT_STRICT = exports.RE_IPV6 = exports.RE_PASSWORD_STRONG = exports.RE_CSV_LINE = exports.RE_HTML_TAG = exports.RE_KEBAB_CASE = exports.RE_SNAKE_CASE = exports.RE_PASCAL_CASE = exports.RE_CAMEL_CASE = exports.RE_LATLON_PAIR = exports.RE_LON = exports.RE_LAT = exports.RE_MIME_TYPE = exports.RE_EXTENSION = exports.RE_WINDOWS_PATH = exports.RE_UNIX_PATH = exports.RE_FILENAME_SAFE = exports.RE_POSTCODE_UK_APPROX = exports.RE_CAP_IT = exports.RE_ZIP_US = exports.RE_PERCENT = exports.RE_CURRENCY_GENERIC = exports.RE_MASTERCARD = exports.RE_VISA = void 0;
|
|
5
|
+
exports.RE_SEMVER_RANGE_COMPARATORS = exports.RE_SEMVER_RANGE_SIMPLE = exports.RE_SEMVER = exports.RE_R2_S3_COMPAT_URL = exports.RE_R2_PUBLIC_URL = exports.RE_S3_PATH_URL = exports.RE_S3_VHOST_URL = exports.RE_S3_URI = exports.RE_VAT_SE = exports.RE_VAT_ES = exports.RE_VAT_SI = exports.RE_VAT_SK = exports.RE_VAT_RO = void 0;
|
|
6
|
+
// ===== Generice sensitive data =====
|
|
7
|
+
exports.RE_WS = /\s+/g;
|
|
8
|
+
exports.RE_QUERY_SENSITIVE = /([?&])(token|api[_-]?key|key|signature|password|pass|pwd|code|secret|client[_-]?secret|access[_-]?token)=([^&#\s]+)/gi;
|
|
9
|
+
exports.RE_AUTH = /\b(authorization|bearer|basic)\b[: ]+\S+/gi;
|
|
10
|
+
exports.RE_AWS_ACCESS_KEY = /\bAKIA[0-9A-Z]{16}\b/g;
|
|
11
|
+
exports.RE_SECRET40 = /\b[A-Za-z0-9/+]{40}\b/g; // may overmatch harmless 40-char base64
|
|
12
|
+
exports.RE_LONG_DIGITS = /\b(?:\d[ -]?){13,19}\b/g; // potential cards/accounts
|
|
13
|
+
exports.RE_IPV4_NOLB = /(^|[^0-9])((?:\d{1,3}\.){3}\d{1,3})(?!\d)/g; // no lookbehind
|
|
14
|
+
exports.RE_PATH_SECRET = /\/(token|key|secret|signature|passwd|password|code)\/[^\/?#\s]+/gi;
|
|
15
|
+
exports.RE_PEM_BLOCK = /-----BEGIN [A-Z ]+-----[\s\S]*?-----END [A-Z ]+-----/g;
|
|
16
|
+
// ===== Text / tokens =====
|
|
17
|
+
exports.RE_WHITESPACE = /\s+/g;
|
|
18
|
+
exports.RE_NON_WORD = /\W+/g;
|
|
19
|
+
exports.RE_SLUG = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
20
|
+
exports.RE_USERNAME_SIMPLE = /^[A-Z0-9_]{3,20}$/i;
|
|
21
|
+
exports.RE_HASHTAG = /(^|\s)#([A-Z0-9_]{1,30})/gi;
|
|
22
|
+
exports.RE_MENTION = /(^|[^@\w])@([A-Z0-9_]{1,30})/gi;
|
|
23
|
+
// ===== Numbers / formats =====
|
|
24
|
+
exports.RE_INT = /^[+-]?\d+$/;
|
|
25
|
+
exports.RE_FLOAT = /^[+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?$/;
|
|
26
|
+
exports.RE_NUMBER_THOUSANDS = /^-?\d{1,3}(?:[.,]\d{3})*(?:[.,]\d+)?$/;
|
|
27
|
+
exports.RE_HEX_PREFIXED = /^0x[0-9A-F]+$/i;
|
|
28
|
+
// ===== Colors (CSS) =====
|
|
29
|
+
exports.RE_HEX_COLOR = /^#(?:[0-9A-F]{3}|[0-9A-F]{6}|[0-9A-F]{8})$/i;
|
|
30
|
+
exports.RE_RGB = /^rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)$/i;
|
|
31
|
+
exports.RE_RGBA = /^rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(0|1|0?\.\d+)\s*\)$/i;
|
|
32
|
+
exports.RE_HSL = /^hsl\(\s*(\d{1,3})\s*,\s*(\d{1,3})%\s*,\s*(\d{1,3})%\s*\)$/i;
|
|
33
|
+
exports.RE_HSLA = /^hsla\(\s*(\d{1,3})\s*,\s*(\d{1,3})%\s*,\s*(\d{1,3})%\s*,\s*(0|1|0?\.\d+)\s*\)$/i;
|
|
34
|
+
// ===== Web / networking =====
|
|
35
|
+
exports.RE_EMAIL = /\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b/gi;
|
|
36
|
+
exports.RE_DOMAIN = /^(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+[A-Z]{2,}$/i;
|
|
37
|
+
exports.RE_URL_HTTP = /^(https?:\/\/)[^\s/$.?#].[^\s]*$/i;
|
|
38
|
+
exports.RE_URL_SIMPLE = /^(https?:\/\/)?(?:[A-Z0-9-]+\.)+[A-Z]{2,}(?:\/[^\s]*)?$/i;
|
|
39
|
+
exports.RE_IPV4 = /^(?:25[0-5]|2[0-4]\d|1?\d?\d)(?:\.(?:25[0-5]|2[0-4]\d|1?\d?\d)){3}$/;
|
|
40
|
+
exports.RE_IPV6_SIMPLE = /^([A-F0-9]{1,4}:){7}[A-F0-9]{1,4}$/i; // no '::' compression
|
|
41
|
+
exports.RE_MAC = /^([0-9A-F]{2}[:-]){5}[0-9A-F]{2}$/i;
|
|
42
|
+
exports.RE_HOSTPORT = /^(?:\[(?:[A-F0-9:]+)\]|(?:\d{1,3}\.){3}\d{1,3}|(?:[A-Z0-9-]+\.)+[A-Z]{2,})(?::\d{1,5})?$/i;
|
|
43
|
+
exports.RE_E164_PHONE = /^\+?[1-9]\d{1,14}$/;
|
|
44
|
+
// ===== Dates / times =====
|
|
45
|
+
exports.RE_DATE_ISO = /^\d{4}-\d{2}-\d{2}$/;
|
|
46
|
+
exports.RE_TIME_24H = /^(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d)?$/;
|
|
47
|
+
exports.RE_TIME_12H = /^(?:0?[1-9]|1[0-2]):[0-5]\d(?::[0-5]\d)?\s?(?:AM|PM)$/i;
|
|
48
|
+
exports.RE_DATETIME_ISO = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$/;
|
|
49
|
+
exports.RE_DATE_DDMMYYYY = /^(0?[1-9]|[12]\d|3[01])[\/.-](0?[1-9]|1[0-2])[\/.-]\d{4}$/;
|
|
50
|
+
exports.RE_DATE_MMDDYYYY = /^(0?[1-9]|1[0-2])[\/.-](0?[1-9]|[12]\d|3[01])[\/.-]\d{4}$/;
|
|
51
|
+
exports.RE_TZ_OFFSET = /^[+-](?:0\d|1[0-4]):[0-5]\d$/; // ±HH:MM (up to 14)
|
|
52
|
+
// ===== Identifiers / encodings =====
|
|
53
|
+
exports.RE_UUID_ANY = /^[0-9A-F]{8}-[0-9A-F]{4}-[1-5][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i;
|
|
54
|
+
exports.RE_UUID_V4 = /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i;
|
|
55
|
+
exports.RE_ULID = /^[0-9A-HJKMNP-TV-Z]{26}$/i;
|
|
56
|
+
exports.RE_BASE64 = /^(?:[A-Z0-9+\/]{4})*(?:[A-Z0-9+\/]{2}==|[A-Z0-9+\/]{3}=)?$/i;
|
|
57
|
+
exports.RE_JWT = /\b([A-Za-z0-9-_]{10,})\.([A-Za-z0-9-_]{10,})(?:\.([A-Za-z0-9-_]{5,}))?\b/g;
|
|
58
|
+
exports.RE_SHA1 = /^[A-F0-9]{40}$/i;
|
|
59
|
+
exports.RE_SHA256 = /^[A-F0-9]{64}$/i;
|
|
60
|
+
exports.RE_GIT_COMMIT = /^[0-9A-F]{7,40}$/i;
|
|
61
|
+
exports.RE_IBAN_GENERIC = /^[A-Z]{2}\d{2}[A-Z0-9]{1,30}$/;
|
|
62
|
+
// ===== Payment-like (approximate) =====
|
|
63
|
+
exports.RE_CREDITCARD_GENERIC = /^(?:4\d{12}(?:\d{3})?|5[1-5]\d{14}|3[47]\d{13}|3(?:0[0-5]|[68]\d)\d{11}|6(?:011|5\d{2})\d{12})$/;
|
|
64
|
+
exports.RE_VISA = /^4\d{12}(\d{3})?$/;
|
|
65
|
+
exports.RE_MASTERCARD = /^(5[1-5]\d{14}|2(?:2[2-9]\d|[3-6]\d{2}|7(?:[01]\d|20))\d{12})$/;
|
|
66
|
+
// ===== Currency / amounts =====
|
|
67
|
+
exports.RE_CURRENCY_GENERIC = /^(?:[A-Z]{3}|[$€£])\s?\d{1,3}(?:[.,]\d{3})*(?:[.,]\d{2})?$/;
|
|
68
|
+
exports.RE_PERCENT = /^(?:100(?:\.0+)?|(?:\d{1,2})(?:\.\d+)?)%$/;
|
|
69
|
+
// ===== Postal codes (examples) =====
|
|
70
|
+
exports.RE_ZIP_US = /^\d{5}(?:-\d{4})?$/;
|
|
71
|
+
exports.RE_CAP_IT = /^\d{5}$/;
|
|
72
|
+
exports.RE_POSTCODE_UK_APPROX = /^[A-Z]{1,2}\d[A-Z\d]?\s?\d[A-Z]{2}$/i;
|
|
73
|
+
// ===== File paths / names =====
|
|
74
|
+
exports.RE_FILENAME_SAFE = /^[A-Z0-9._-]+$/i;
|
|
75
|
+
exports.RE_UNIX_PATH = /^(\/[^/\0]+)+\/?$/;
|
|
76
|
+
exports.RE_WINDOWS_PATH = /^(?:[A-Z]:\\|\\\\)[^\s<>:"|?*]+$/i;
|
|
77
|
+
exports.RE_EXTENSION = /^[^.]+\.[A-Z0-9]+$/i;
|
|
78
|
+
exports.RE_MIME_TYPE = /^[a-z]+\/[a-z0-9+.-]+$/i;
|
|
79
|
+
// ===== Coordinates =====
|
|
80
|
+
exports.RE_LAT = /^-?(?:[1-8]?\d(?:\.\d+)?|90(?:\.0+)?)$/;
|
|
81
|
+
exports.RE_LON = /^-?(?:1[0-7]\d(?:\.\d+)?|[1-9]?\d(?:\.\d+)?|180(?:\.0+)?)$/;
|
|
82
|
+
exports.RE_LATLON_PAIR = /^\s*-?\d+(?:\.\d+)?\s*,\s*-?\d+(?:\.\d+)?\s*$/;
|
|
83
|
+
// ===== Case styles =====
|
|
84
|
+
exports.RE_CAMEL_CASE = /^(?:[a-z]+(?:[A-Z][a-z0-9]+)*)$/;
|
|
85
|
+
exports.RE_PASCAL_CASE = /^(?:[A-Z][a-z0-9]+)+$/;
|
|
86
|
+
exports.RE_SNAKE_CASE = /^[a-z0-9]+(?:_[a-z0-9]+)+$/;
|
|
87
|
+
exports.RE_KEBAB_CASE = /^[a-z0-9]+(?:-[a-z0-9]+)+$/;
|
|
88
|
+
// ===== HTML / CSV =====
|
|
89
|
+
exports.RE_HTML_TAG = /<[^>]+>/;
|
|
90
|
+
exports.RE_CSV_LINE = /^(?:"[^"]*"|[^",]*)(?:,(?:"[^"]*"|[^",]*))*$/;
|
|
91
|
+
// ===== Password policy (example) =====
|
|
92
|
+
exports.RE_PASSWORD_STRONG = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^A-Za-z0-9]).{8,}$/;
|
|
93
|
+
// ===== IP addresses =====
|
|
94
|
+
exports.RE_IPV6 = /^((?:[A-F0-9]{1,4}:){7}[A-F0-9]{1,4}|(?:[A-F0-9]{1,4}:){1,7}:|(?:[A-F0-9]{1,4}:){1,6}:[A-F0-9]{1,4}|(?:[A-F0-9]{1,4}:){1,5}(?::[A-F0-9]{1,4}){1,2}|(?:[A-F0-9]{1,4}:){1,4}(?::[A-F0-9]{1,4}){1,3}|(?:[A-F0-9]{1,4}:){1,3}(?::[A-F0-9]{1,4}){1,4}|(?:[A-F0-9]{1,4}:){1,2}(?::[A-F0-9]{1,4}){1,5}|[A-F0-9]{1,4}:(?::[A-F0-9]{1,4}){1,6}|:(?::[A-F0-9]{1,4}){1,7})(?:%\w+)?$/i; // compressed + zone id
|
|
95
|
+
// ===== Italy: Codice Fiscale & Partita IVA =====
|
|
96
|
+
// Strict (no "omocodia" substitutions)
|
|
97
|
+
exports.RE_CF_IT_STRICT = /^[A-Z]{6}\d{2}[A-EHLMPRST]\d{2}[A-Z]\d{3}[A-Z]$/;
|
|
98
|
+
// Omocodia allowed (L,M,N,P,Q,R,S,T,U,V standing in for digits)
|
|
99
|
+
exports.RE_CF_IT_OMOCODIA = /^[A-Z]{6}[0-9LMNPQRSTUV]{2}[A-EHLMPRST][0-9LMNPQRSTUV]{2}[A-Z][0-9LMNPQRSTUV]{3}[A-Z]$/;
|
|
100
|
+
// Partita IVA (11 digits), with optional "IT" prefix
|
|
101
|
+
exports.RE_PIVA_IT = /^(?:IT\s*)?\d{11}$/i;
|
|
102
|
+
// ===== PEC (Posta Elettronica Certificata) =====
|
|
103
|
+
exports.RE_PEC_IT_STRICT = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.PEC\.IT$/i; // ends with .pec.it
|
|
104
|
+
exports.RE_PEC_GENERIC = /^[A-Z0-9._%+-]+@[A-Z0-9.-]*\.PEC\.[A-Z]{2,}$/i; // any TLD with ".pec."
|
|
105
|
+
// ===== EU VAT (per country; pragmatic patterns) =====
|
|
106
|
+
exports.RE_VAT_AT = /^ATU\d{8}$/; // Austria
|
|
107
|
+
exports.RE_VAT_BE = /^BE0?\d{9}$/; // Belgium
|
|
108
|
+
exports.RE_VAT_BG = /^BG\d{9,10}$/; // Bulgaria
|
|
109
|
+
exports.RE_VAT_HR = /^HR\d{11}$/; // Croatia
|
|
110
|
+
exports.RE_VAT_CY = /^CY\d{8}[A-Z]$/i; // Cyprus
|
|
111
|
+
exports.RE_VAT_CZ = /^CZ\d{8,10}$/; // Czechia
|
|
112
|
+
exports.RE_VAT_DK = /^DK\d{8}$/; // Denmark
|
|
113
|
+
exports.RE_VAT_EE = /^EE\d{9}$/; // Estonia
|
|
114
|
+
exports.RE_VAT_FI = /^FI\d{8}$/; // Finland
|
|
115
|
+
exports.RE_VAT_FR = /^FR[0-9A-Z]{2}\d{9}$/i; // France (2-char key + 9 digits)
|
|
116
|
+
exports.RE_VAT_DE = /^DE\d{9}$/; // Germany
|
|
117
|
+
exports.RE_VAT_EL = /^EL\d{9}$/; // Greece (EL)
|
|
118
|
+
exports.RE_VAT_HU = /^HU\d{8}$/; // Hungary
|
|
119
|
+
exports.RE_VAT_IE = /^IE\d{7}[A-W][A-I]?$/i; // Ireland (approx)
|
|
120
|
+
exports.RE_VAT_IT = /^IT\d{11}$/; // Italy
|
|
121
|
+
exports.RE_VAT_LV = /^LV\d{11}$/; // Latvia
|
|
122
|
+
exports.RE_VAT_LT = /^LT(\d{9}|\d{12})$/; // Lithuania
|
|
123
|
+
exports.RE_VAT_LU = /^LU\d{8}$/; // Luxembourg
|
|
124
|
+
exports.RE_VAT_MT = /^MT\d{8}$/; // Malta
|
|
125
|
+
exports.RE_VAT_NL = /^NL\d{9}B\d{2}$/; // Netherlands
|
|
126
|
+
exports.RE_VAT_PL = /^PL\d{10}$/; // Poland
|
|
127
|
+
exports.RE_VAT_PT = /^PT\d{9}$/; // Portugal
|
|
128
|
+
exports.RE_VAT_RO = /^RO\d{2,10}$/; // Romania
|
|
129
|
+
exports.RE_VAT_SK = /^SK\d{10}$/; // Slovakia
|
|
130
|
+
exports.RE_VAT_SI = /^SI\d{8}$/; // Slovenia
|
|
131
|
+
exports.RE_VAT_ES = /^ES[A-Z0-9]\d{7}[A-Z0-9]$/i; // Spain
|
|
132
|
+
exports.RE_VAT_SE = /^SE\d{12}$/; // Sweden
|
|
133
|
+
// ===== S3 / R2 object URLs & URIs =====
|
|
134
|
+
// S3 URI like: s3://bucket/key
|
|
135
|
+
exports.RE_S3_URI = /^s3:\/\/[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]\/.+$/;
|
|
136
|
+
// S3 virtual-hosted–style: https://bucket.s3.amazonaws.com/key (any region suffix acceptable)
|
|
137
|
+
exports.RE_S3_VHOST_URL = /^https?:\/\/[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]\.s3[.-][a-z0-9-]+\.amazonaws\.com\/.+$/i;
|
|
138
|
+
// S3 path-style: https://s3.region.amazonaws.com/bucket/key
|
|
139
|
+
exports.RE_S3_PATH_URL = /^https?:\/\/s3[.-][a-z0-9-]+\.amazonaws\.com\/[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]\/.+$/i;
|
|
140
|
+
// R2 public (account endpoint): https://<accountid>.r2.cloudflarestorage.com/bucket/key
|
|
141
|
+
exports.RE_R2_PUBLIC_URL = /^https?:\/\/[a-z0-9]{32}\.r2\.cloudflarestorage\.com\/[A-Za-z0-9._-]{3,63}\/.+$/;
|
|
142
|
+
// R2 S3-compatible (custom endpoint host): https?:\/\/<host>/bucket/key — keep broad
|
|
143
|
+
exports.RE_R2_S3_COMPAT_URL = /^https?:\/\/[A-Z0-9.-]+\/[A-Za-z0-9._-]{3,63}\/.+$/i;
|
|
144
|
+
// ===== SemVer (versions & ranges) =====
|
|
145
|
+
// Exact SemVer (same as before, strict)
|
|
146
|
+
exports.RE_SEMVER = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[0-9A-Z-]+(?:\.[0-9A-Z-]+)*)?(?:\+[0-9A-Z-]+(?:\.[0-9A-Z-]+)*)?$/i;
|
|
147
|
+
// Simple ranges with ^ or ~ and OR (pragmatic)
|
|
148
|
+
exports.RE_SEMVER_RANGE_SIMPLE = /^(?:[~^]?\d+\.\d+\.\d+(?:-[0-9A-Z-]+(?:\.[0-9A-Z-]+)*)?(?:\+[0-9A-Z-]+(?:\.[0-9A-Z-]+)*)?)(?:\s*\|\|\s*[~^]?\d+\.\d+\.\d+(?:-[0-9A-Z-]+(?:\.[0-9A-Z-]+)*)?(?:\+[0-9A-Z-]+(?:\.[0-9A-Z-]+)*)?)*$/i;
|
|
149
|
+
// Comparators like >=1.2.3 <2.0.0 (basic)
|
|
150
|
+
exports.RE_SEMVER_RANGE_COMPARATORS = /^(?:[<>]=?\s*\d+\.\d+\.\d+(?:-[0-9A-Z-]+(?:\.[0-9A-Z-]+)*)?(?:\+[0-9A-Z-]+(?:\.[0-9A-Z-]+)*)?\s*)+(?:\|\|\s*(?:[<>]=?\s*\d+\.\d+\.\d+(?:-[0-9A-Z-]+(?:\.[0-9A-Z-]+)*)?(?:\+[0-9A-Z-]+(?:\.[0-9A-Z-]+)*)?\s*)+)*$/i;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
type AnyFunc = (...args: any[]) => any;
|
|
2
|
+
type AsyncFunc = (...args: any[]) => Promise<any>;
|
|
3
|
+
type GenFunc = (...args: any[]) => Generator<any, any, any>;
|
|
4
|
+
interface Validate {
|
|
5
|
+
string(v: unknown): v is string;
|
|
6
|
+
url(v: unknown): v is string;
|
|
7
|
+
nonEmptyString(v: unknown): v is string;
|
|
8
|
+
number(v: unknown): v is number;
|
|
9
|
+
integer(v: unknown): v is number;
|
|
10
|
+
boolean(v: unknown): v is boolean;
|
|
11
|
+
bigint(v: unknown): v is bigint;
|
|
12
|
+
symbol(v: unknown): v is symbol;
|
|
13
|
+
numeric(v: unknown): boolean;
|
|
14
|
+
finiteNumber(v: unknown): v is number;
|
|
15
|
+
dateString(v: unknown): v is string;
|
|
16
|
+
date(v: unknown): v is Date;
|
|
17
|
+
isoDateString(v: unknown): v is string;
|
|
18
|
+
isoDateTimeString(v: unknown): v is string;
|
|
19
|
+
null(v: unknown): v is null;
|
|
20
|
+
undefined(v: unknown): v is undefined;
|
|
21
|
+
defined<T>(v: T | null | undefined): v is T;
|
|
22
|
+
nan(v: unknown): v is number;
|
|
23
|
+
object(v: unknown): v is Record<string, unknown>;
|
|
24
|
+
plainObject(v: unknown): v is Record<string, unknown>;
|
|
25
|
+
emptyObject(v: unknown): v is Record<string, never>;
|
|
26
|
+
array<T = unknown>(v: unknown): v is T[];
|
|
27
|
+
nonEmptyArray<T = unknown>(v: unknown): v is T[];
|
|
28
|
+
set<T = unknown>(v: unknown): v is Set<T>;
|
|
29
|
+
map<K = unknown, V = unknown>(v: unknown): v is Map<K, V>;
|
|
30
|
+
weakSet<T extends object = object>(v: unknown): v is WeakSet<T>;
|
|
31
|
+
weakMap<K extends object = object, V = unknown>(v: unknown): v is WeakMap<K, V>;
|
|
32
|
+
arrayBuffer(v: unknown): v is ArrayBuffer;
|
|
33
|
+
dataView(v: unknown): v is DataView;
|
|
34
|
+
typedArray(v: unknown): v is Exclude<ArrayBufferView, DataView>;
|
|
35
|
+
regexp(v: unknown): v is RegExp;
|
|
36
|
+
promise<T = unknown>(v: unknown): v is Promise<T>;
|
|
37
|
+
function(v: unknown): v is AnyFunc;
|
|
38
|
+
asyncFunction(v: unknown): v is AsyncFunc;
|
|
39
|
+
generatorFunction(v: unknown): v is GenFunc;
|
|
40
|
+
email(v: unknown): v is string;
|
|
41
|
+
uuid(v: unknown): v is string;
|
|
42
|
+
hexColor(v: unknown): v is string;
|
|
43
|
+
ipv4(v: unknown): v is string;
|
|
44
|
+
ipv6(v: unknown): v is string;
|
|
45
|
+
jsonString(v: unknown): v is string;
|
|
46
|
+
truthy(v: unknown): boolean;
|
|
47
|
+
falsy(v: unknown): boolean;
|
|
48
|
+
}
|
|
49
|
+
export declare const validate: Validate;
|
|
50
|
+
export {};
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validate = void 0;
|
|
4
|
+
// ------------------ helpers ------------------
|
|
5
|
+
function validateUrl(input) {
|
|
6
|
+
if (typeof input !== "string")
|
|
7
|
+
return false;
|
|
8
|
+
const s = input.trim();
|
|
9
|
+
if (s.length === 0)
|
|
10
|
+
return false;
|
|
11
|
+
try {
|
|
12
|
+
new URL(s); // richiede schema (es. https://)
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function isValidDateString(value) {
|
|
20
|
+
if (typeof value !== "string")
|
|
21
|
+
return false;
|
|
22
|
+
const d = new Date(value);
|
|
23
|
+
return !Number.isNaN(d.getTime());
|
|
24
|
+
}
|
|
25
|
+
function isValidDateObject(value) {
|
|
26
|
+
return value instanceof Date && !Number.isNaN(value.getTime());
|
|
27
|
+
}
|
|
28
|
+
const ISO_DATE_RE = /^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$/;
|
|
29
|
+
// YYYY-MM-DDThh:mm(:ss(.sss)?)?(Z|±HH:MM)
|
|
30
|
+
const ISO_DATETIME_RE = /^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])T([01]\d|2[0-3]):([0-5]\d)(?::([0-5]\d)(\.\d{1,3})?)?(Z|[+\-](?:[01]\d|2[0-3]):?[0-5]\d)$/;
|
|
31
|
+
function isIsoDateString(value) {
|
|
32
|
+
if (typeof value !== "string" || !ISO_DATE_RE.test(value))
|
|
33
|
+
return false;
|
|
34
|
+
// validazione calendario: costruisci la data e verifica corrispondenza
|
|
35
|
+
const [y, m, d] = value.split("-").map(Number);
|
|
36
|
+
const dt = new Date(Date.UTC(y, m - 1, d));
|
|
37
|
+
return (dt.getUTCFullYear() === y &&
|
|
38
|
+
dt.getUTCMonth() === m - 1 &&
|
|
39
|
+
dt.getUTCDate() === d);
|
|
40
|
+
}
|
|
41
|
+
function isIsoDateTimeString(value) {
|
|
42
|
+
if (typeof value !== "string" || !ISO_DATETIME_RE.test(value))
|
|
43
|
+
return false;
|
|
44
|
+
const dt = new Date(value);
|
|
45
|
+
return !Number.isNaN(dt.getTime());
|
|
46
|
+
}
|
|
47
|
+
// RFC 5322-lite (pragmatico)
|
|
48
|
+
const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
49
|
+
// UUID v1–v5
|
|
50
|
+
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
51
|
+
// #RGB o #RRGGBB
|
|
52
|
+
const HEX_COLOR_RE = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/;
|
|
53
|
+
// IPv4
|
|
54
|
+
const IPV4_RE = /^(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)){3}$/;
|
|
55
|
+
// IPv6 (compressa o piena) — accetta forme valide comuni
|
|
56
|
+
const IPV6_RE = /^(([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}|:)))(%[0-9A-Za-z]{1,})?$/;
|
|
57
|
+
// ------------------ implementation ------------------
|
|
58
|
+
exports.validate = {
|
|
59
|
+
// base
|
|
60
|
+
string: (v) => typeof v === "string",
|
|
61
|
+
url: (v) => typeof v === "string" && validateUrl(v),
|
|
62
|
+
nonEmptyString: (v) => typeof v === "string" && v.trim().length > 0,
|
|
63
|
+
number: (v) => typeof v === "number" && !Number.isNaN(v),
|
|
64
|
+
integer: (v) => typeof v === "number" && Number.isInteger(v),
|
|
65
|
+
boolean: (v) => typeof v === "boolean",
|
|
66
|
+
bigint: (v) => typeof v === "bigint",
|
|
67
|
+
symbol: (v) => typeof v === "symbol",
|
|
68
|
+
numeric: (v) => (typeof v === "number" ? !Number.isNaN(v) : !Number.isNaN(Number(v))),
|
|
69
|
+
finiteNumber: (v) => typeof v === "number" && Number.isFinite(v),
|
|
70
|
+
// date
|
|
71
|
+
dateString: (v) => typeof v === "string" && isValidDateString(v),
|
|
72
|
+
date: (v) => isValidDateObject(v),
|
|
73
|
+
isoDateString: (v) => typeof v === "string" && isIsoDateString(v),
|
|
74
|
+
isoDateTimeString: (v) => typeof v === "string" && isIsoDateTimeString(v),
|
|
75
|
+
// null/undefined
|
|
76
|
+
null: (v) => v === null,
|
|
77
|
+
undefined: (v) => typeof v === "undefined",
|
|
78
|
+
defined: (v) => v !== null && v !== undefined,
|
|
79
|
+
nan: (v) => typeof v === "number" && Number.isNaN(v),
|
|
80
|
+
// oggetti/collezioni
|
|
81
|
+
object: (v) => v !== null && typeof v === "object",
|
|
82
|
+
plainObject: (v) => {
|
|
83
|
+
if (v === null || typeof v !== "object" || Array.isArray(v))
|
|
84
|
+
return false;
|
|
85
|
+
const proto = Object.getPrototypeOf(v);
|
|
86
|
+
return proto === Object.prototype || proto === null;
|
|
87
|
+
},
|
|
88
|
+
emptyObject: (v) => v !== null && typeof v === "object" && !Array.isArray(v) && Object.keys(v).length === 0,
|
|
89
|
+
array: (v) => Array.isArray(v),
|
|
90
|
+
nonEmptyArray: (v) => Array.isArray(v) && v.length > 0,
|
|
91
|
+
set: (v) => v instanceof Set,
|
|
92
|
+
map: (v) => v instanceof Map,
|
|
93
|
+
weakSet: (v) => v instanceof WeakSet,
|
|
94
|
+
weakMap: (v) => v instanceof WeakMap,
|
|
95
|
+
// binari / typed arrays
|
|
96
|
+
arrayBuffer: (v) => v instanceof ArrayBuffer,
|
|
97
|
+
dataView: (v) => v instanceof DataView,
|
|
98
|
+
typedArray: (v) => ArrayBuffer.isView(v) && !(v instanceof DataView),
|
|
99
|
+
// regex / promise / function
|
|
100
|
+
regexp: (v) => v instanceof RegExp,
|
|
101
|
+
promise: (v) => !!v && typeof v.then === "function",
|
|
102
|
+
function: (v) => typeof v === "function",
|
|
103
|
+
asyncFunction: (v) => typeof v === "function" && v.constructor?.name === "AsyncFunction",
|
|
104
|
+
generatorFunction: (v) => typeof v === "function" && v.constructor?.name === "GeneratorFunction",
|
|
105
|
+
// stringhe con pattern
|
|
106
|
+
email: (v) => typeof v === "string" && EMAIL_RE.test(v),
|
|
107
|
+
uuid: (v) => typeof v === "string" && UUID_RE.test(v),
|
|
108
|
+
hexColor: (v) => typeof v === "string" && HEX_COLOR_RE.test(v),
|
|
109
|
+
ipv4: (v) => typeof v === "string" && IPV4_RE.test(v),
|
|
110
|
+
ipv6: (v) => typeof v === "string" && IPV6_RE.test(v),
|
|
111
|
+
jsonString: (v) => {
|
|
112
|
+
if (typeof v !== "string")
|
|
113
|
+
return false;
|
|
114
|
+
try {
|
|
115
|
+
JSON.parse(v);
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
// truthiness
|
|
123
|
+
truthy: (v) => !!v,
|
|
124
|
+
falsy: (v) => !v,
|
|
125
|
+
};
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import type { AnyObject, DropdownOption, HexColor, PasswordStrength } from "../shared/_types";
|
|
2
|
+
export declare const isBrowser: () => boolean;
|
|
3
|
+
export declare const isWindowAvailable: () => boolean;
|
|
4
|
+
export declare const isDev: () => boolean;
|
|
5
|
+
export declare function stringStartsWith(input: string, prefix: string, caseSensitive?: boolean): boolean;
|
|
6
|
+
type FileValidationResult = {
|
|
7
|
+
valid: boolean;
|
|
8
|
+
error?: string;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Validates a file by checking its MIME type and maximum size.
|
|
12
|
+
* @param file - The file to validate (can be null or undefined).
|
|
13
|
+
* @param maxSizeMB - Maximum allowed size in MB (default: 2).
|
|
14
|
+
* @param allowedTypes - Allowed MIME types (default: empty = all types allowed).
|
|
15
|
+
* @returns Validation result object.
|
|
16
|
+
*/
|
|
17
|
+
export declare function validateFile(file: File | Blob | null | undefined, maxSizeMB?: number, allowedTypes?: string[]): FileValidationResult;
|
|
18
|
+
export declare function imageExistsAtURL(url: string, bustCache?: boolean): Promise<boolean>;
|
|
19
|
+
export declare function clearUrl(input: string, domainOnly?: boolean): string | null;
|
|
20
|
+
/**
|
|
21
|
+
* Estrae il sottodominio da un URL o dal dominio corrente (es. builder.bubbledesk.app → "builder").
|
|
22
|
+
*
|
|
23
|
+
* ⚠️ Restituisce `null` se non è presente alcun sottodominio (es. bubbledesk.app o localhost).
|
|
24
|
+
*
|
|
25
|
+
* @param url - (opzionale) Una stringa URL da cui estrarre il sottodominio. Se non fornita, usa `window.location.hostname`.
|
|
26
|
+
* @returns Il sottodominio come stringa, oppure `null` se non rilevabile.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* getSubdomain("https://auth.bubbledesk.app"); // "auth"
|
|
30
|
+
* getSubdomain(); // se eseguito su builder.bubbledesk.app → "builder"
|
|
31
|
+
* getSubdomain("https://bubbledesk.app"); // null
|
|
32
|
+
* getSubdomain("http://localhost:5173"); // null
|
|
33
|
+
*/
|
|
34
|
+
export declare const getSubdomain: (url?: string) => string | null;
|
|
35
|
+
/**
|
|
36
|
+
*
|
|
37
|
+
* @param options.reload If true, redirect url and related logic will be ignored
|
|
38
|
+
*/
|
|
39
|
+
export declare const redirectOrReload: (options?: {
|
|
40
|
+
redirectUrl?: string;
|
|
41
|
+
reload?: boolean;
|
|
42
|
+
redirectReplace?: boolean;
|
|
43
|
+
}) => void;
|
|
44
|
+
export declare function checkPasswordStrength(password: string): PasswordStrength;
|
|
45
|
+
export declare function capitalize(str: string): string;
|
|
46
|
+
export declare function formSubmit(callback: () => void | Promise<void>): (event: SubmitEvent) => Promise<void>;
|
|
47
|
+
export declare function capitalizeEachWord(input: string): string;
|
|
48
|
+
export declare function parseCookie(header: string): Record<string, string>;
|
|
49
|
+
export declare function isLocalhost(): boolean;
|
|
50
|
+
export declare function getUrlParam(param: string): string | null;
|
|
51
|
+
export declare function sleep(seconds: number): Promise<void>;
|
|
52
|
+
export declare const removeWWW: (host: string | null) => string | null;
|
|
53
|
+
export declare function mapToObject(value: any): any;
|
|
54
|
+
export declare function getRandomNumber(min?: number, max?: number, integer?: boolean): number;
|
|
55
|
+
export declare function getRandomString(options?: {
|
|
56
|
+
length?: number;
|
|
57
|
+
includeUppercase?: boolean;
|
|
58
|
+
prefix?: string;
|
|
59
|
+
}): string;
|
|
60
|
+
export declare function arrrayGetLast<T>(arr: T[]): T | undefined;
|
|
61
|
+
export declare function getPathList(path?: string): string[] | null | undefined;
|
|
62
|
+
export declare function getCurrentPath(path?: string): string | null | undefined;
|
|
63
|
+
export declare function buildPath(parts: string[], endIndex?: number): string;
|
|
64
|
+
export declare function detectAnalysisFileType(filename: string): string;
|
|
65
|
+
export declare function scrollToElement(target: string | HTMLElement, offset?: number, scrollBehavior?: ScrollBehavior): void;
|
|
66
|
+
export declare function clickOutside(node: HTMLElement, callback: () => void): {
|
|
67
|
+
destroy(): void;
|
|
68
|
+
};
|
|
69
|
+
export declare const setHiddenStatus: (element: string | HTMLElement, hidden: boolean) => void;
|
|
70
|
+
export declare const toggleHiddenStatus: (element: string | HTMLElement) => void;
|
|
71
|
+
export declare function toHtmlId(str: string): string;
|
|
72
|
+
export declare function toggleArrayItem<T>(array: T[], item: T): T[];
|
|
73
|
+
export declare function updateUniqueArray<T>(array: T[], item: T, action: "add" | "remove"): T[];
|
|
74
|
+
export declare function updateArrayByKey<T, K extends keyof T>(array: T[], item: T, action: "add" | "remove", key?: K): T[];
|
|
75
|
+
export declare function toCamelCase(input: string): string;
|
|
76
|
+
export declare function toSnakeCase(input: string): string;
|
|
77
|
+
export declare function portal(node: HTMLElement, target?: HTMLElement): {
|
|
78
|
+
destroy(): void;
|
|
79
|
+
};
|
|
80
|
+
export declare function isValidTimeStr(timeStr: string): boolean;
|
|
81
|
+
export declare function isValidDate(date: Date): boolean;
|
|
82
|
+
export declare function formatDateForInput(date: Date): string | undefined;
|
|
83
|
+
export declare function addMinutesToTime(timeStr: string, minutesToAdd: number): string | undefined;
|
|
84
|
+
export declare function setTimeForDate(date: Date, timeStr: string): Date;
|
|
85
|
+
export declare function addMinutesToDate(date: Date, minutesToAdd: number, dateTimeStr?: string): Date | undefined;
|
|
86
|
+
export declare function parseDate(dateStr: string, fallbackToToday?: boolean): Date | null;
|
|
87
|
+
export declare function dateToTime24h(date: Date): string | null;
|
|
88
|
+
export declare function dateToTime12h(date: Date): string | null;
|
|
89
|
+
export declare function URLGetParam(paramName: string, url?: string): string | null;
|
|
90
|
+
export declare function isSameMonth(date1: Date, date2: Date): boolean;
|
|
91
|
+
export declare function isSameYear(date1: unknown, date2: unknown): boolean;
|
|
92
|
+
export declare function getMidpointDate(date1: Date, date2: Date): Date;
|
|
93
|
+
export declare function getYearBounds(date?: Date): {
|
|
94
|
+
start: Date;
|
|
95
|
+
end: Date;
|
|
96
|
+
};
|
|
97
|
+
export declare function callerName(level?: number): string;
|
|
98
|
+
export declare function arrayGetByKey<T, K extends keyof T>(array: T[], value: T[K], key?: K): T[];
|
|
99
|
+
export declare function checkFileSize(files: FileList | File[], maxSizeMB: number): {
|
|
100
|
+
valid: boolean;
|
|
101
|
+
message?: string;
|
|
102
|
+
};
|
|
103
|
+
export declare function getMatchScore(text: string, term: string): number;
|
|
104
|
+
export declare const componentCallbackDispatcher: (callback: Function, data?: any) => void;
|
|
105
|
+
export declare function objectsDiffer<T extends Record<string, any>>(a: Partial<T>, b: Partial<T>, strict?: boolean): boolean;
|
|
106
|
+
export declare function removeNullish<T extends object>(obj: T): Partial<T>;
|
|
107
|
+
type FlattenOptions = {
|
|
108
|
+
useDotNotation?: boolean;
|
|
109
|
+
};
|
|
110
|
+
export declare function flattenObject(obj: Record<string, any>, options?: FlattenOptions): Record<string, any>;
|
|
111
|
+
/**
|
|
112
|
+
* @param normalizeMonthly If true and units is months or years, it will normalize the start and end date to the first and last day of the first and last month.
|
|
113
|
+
*/
|
|
114
|
+
export declare function getTimeBounds(midpoint: Date | string, before: number, after: number, unit: "minutes" | "days" | "months" | "years", normalizeMonthly?: boolean): {
|
|
115
|
+
start: Date;
|
|
116
|
+
end: Date;
|
|
117
|
+
};
|
|
118
|
+
export declare function listMonthsInRange(start: Date | string, end: Date | string, format?: "YYYY-MM" | "YYYY-MMM" | "YYYY-MMMM", options?: {
|
|
119
|
+
locale?: string;
|
|
120
|
+
excludeStart?: boolean;
|
|
121
|
+
excludeEnd?: boolean;
|
|
122
|
+
descending?: boolean;
|
|
123
|
+
}): string[];
|
|
124
|
+
/**
|
|
125
|
+
* @param monthKey (deve essere in formato YYYY-MM)
|
|
126
|
+
* @returns Restituisce un oggetto contente start e end
|
|
127
|
+
*/
|
|
128
|
+
export declare function getMonthBoundsByYearMonthString(monthKey: string): {
|
|
129
|
+
start: Date;
|
|
130
|
+
end: Date;
|
|
131
|
+
};
|
|
132
|
+
/**
|
|
133
|
+
* @returns The month of the passed date as string in the format YYYY-MM (eg. 2025-05), in UTC
|
|
134
|
+
*/
|
|
135
|
+
export declare function getYearMonthStringFromDate(date: Date): string;
|
|
136
|
+
/**
|
|
137
|
+
* @returns Restituisce un oggetto contente start e end
|
|
138
|
+
*/
|
|
139
|
+
export declare function getMonthBounds(date: Date): {
|
|
140
|
+
start: Date;
|
|
141
|
+
end: Date;
|
|
142
|
+
};
|
|
143
|
+
/**
|
|
144
|
+
* Unisce l'array originale con nuovi oggetti, sovrascrivendo quelli con la stessa chiave.
|
|
145
|
+
* @param original Array originale
|
|
146
|
+
* @param updates Nuovi oggetti da aggiungere o aggiornare
|
|
147
|
+
* @param key Chiave identificativa (default: "id")
|
|
148
|
+
* @returns Nuovo array aggiornato
|
|
149
|
+
*/
|
|
150
|
+
export declare function mergeByKey<T extends AnyObject>(original: T[], updates: T[], key?: keyof T): T[];
|
|
151
|
+
/**
|
|
152
|
+
* Rimuove un elemento da un array di oggetti confrontando un campo chiave.
|
|
153
|
+
*
|
|
154
|
+
* @param array - L'array di oggetti da cui rimuovere l'elemento
|
|
155
|
+
* @param value - Il valore da confrontare per la rimozione
|
|
156
|
+
* @param key - Il campo su cui fare il confronto (default: "id")
|
|
157
|
+
* @returns Un nuovo array senza l'elemento corrispondente
|
|
158
|
+
*/
|
|
159
|
+
export declare function removeFromArrayByKey<T extends Record<string, any>>(array: T[], value: any, key?: string): T[];
|
|
160
|
+
export declare function hexToRgb(hexString?: HexColor): string | "";
|
|
161
|
+
export declare function copyToClipboard(text: string, callback?: Function): Promise<void>;
|
|
162
|
+
/**
|
|
163
|
+
* Reloads the page with the given query parameters if they are not already present or different.
|
|
164
|
+
* Prevents infinite loops by comparing current parameters with target ones.
|
|
165
|
+
* Optionally appends a hash anchor (e.g., #section) for native browser scrolling.
|
|
166
|
+
*
|
|
167
|
+
* @param newParams An object containing key-value pairs to be added to the URL.
|
|
168
|
+
* @param anchor Optional ID of the element to scroll to after reload (e.g. 'comments')
|
|
169
|
+
*/
|
|
170
|
+
export declare function URLReload(newParams?: Record<string, string>, anchor?: string): void;
|
|
171
|
+
export declare function flagEmojiToCountryCode(flag: string): string;
|
|
172
|
+
export declare const wait: (timeout?: number, callback?: VoidFunction) => Promise<void>;
|
|
173
|
+
export declare const dropdownOptionsFromStrings: (strings: string[]) => DropdownOption[];
|
|
174
|
+
/** Redact likely-sensitive data and normalize message */
|
|
175
|
+
export declare function sanitizeMessageSensitiveData(msg: string, maxLen?: number): string;
|
|
176
|
+
type ErrorInfo = {
|
|
177
|
+
message: string;
|
|
178
|
+
code?: string | number;
|
|
179
|
+
};
|
|
180
|
+
/**
|
|
181
|
+
*
|
|
182
|
+
* @param err The error to extract message and code from
|
|
183
|
+
* @param sanitize Wether to sanitize the error message, removing potential sensitive data
|
|
184
|
+
* @returns Error info in the format of { message, code}
|
|
185
|
+
*/
|
|
186
|
+
export declare function getErrorInfo(err: unknown, sanitize?: boolean): ErrorInfo;
|
|
187
|
+
/**
|
|
188
|
+
* Serializes an arbitrary values into a deterministic, hash-friendly string.
|
|
189
|
+
*
|
|
190
|
+
* - Objects are serialized with sorted keys to ensure stable ordering.
|
|
191
|
+
* - Arrays are serialized by preserving element order.
|
|
192
|
+
* - Dates are converted to ISO strings.
|
|
193
|
+
* - Files are represented by stable metadata (name, size, lastModified).
|
|
194
|
+
*
|
|
195
|
+
* @param value - The value or values to serialize.
|
|
196
|
+
* @returns A deterministic string representation.
|
|
197
|
+
*/
|
|
198
|
+
export declare function serializeToString(value: unknown): string;
|
|
199
|
+
export declare function createHashInput(values: unknown[], separator?: string): string;
|
|
200
|
+
export declare function arrayIncludesString(arr: string[], needle: string, caseSensitive?: boolean): boolean;
|
|
201
|
+
export {};
|