@gzl10/ts-helpers 4.2.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/CHANGELOG.md +320 -0
- package/README.md +233 -0
- package/USAGE-GUIDE.md +800 -0
- package/dist/browser/async.js +15 -0
- package/dist/browser/async.js.map +1 -0
- package/dist/browser/chunk-4O7ZPIJN.js +383 -0
- package/dist/browser/chunk-4O7ZPIJN.js.map +1 -0
- package/dist/browser/chunk-75XNTC34.js +60 -0
- package/dist/browser/chunk-75XNTC34.js.map +1 -0
- package/dist/browser/chunk-C3D7YZVE.js +299 -0
- package/dist/browser/chunk-C3D7YZVE.js.map +1 -0
- package/dist/browser/chunk-CZL6C2EI.js +452 -0
- package/dist/browser/chunk-CZL6C2EI.js.map +1 -0
- package/dist/browser/chunk-D4FZFIVA.js +240 -0
- package/dist/browser/chunk-D4FZFIVA.js.map +1 -0
- package/dist/browser/chunk-IL7NG7IC.js +72 -0
- package/dist/browser/chunk-IL7NG7IC.js.map +1 -0
- package/dist/browser/chunk-NSBPE2FW.js +17 -0
- package/dist/browser/chunk-NSBPE2FW.js.map +1 -0
- package/dist/browser/chunk-SLQVNPTH.js +27 -0
- package/dist/browser/chunk-SLQVNPTH.js.map +1 -0
- package/dist/browser/chunk-WG7ILCUB.js +195 -0
- package/dist/browser/chunk-WG7ILCUB.js.map +1 -0
- package/dist/browser/chunk-WJA4JDMZ.js +278 -0
- package/dist/browser/chunk-WJA4JDMZ.js.map +1 -0
- package/dist/browser/chunk-ZFVYLUTT.js +65 -0
- package/dist/browser/chunk-ZFVYLUTT.js.map +1 -0
- package/dist/browser/chunk-ZYTSVMTI.js +263 -0
- package/dist/browser/chunk-ZYTSVMTI.js.map +1 -0
- package/dist/browser/dates.js +78 -0
- package/dist/browser/dates.js.map +1 -0
- package/dist/browser/environment-detection.js +21 -0
- package/dist/browser/environment-detection.js.map +1 -0
- package/dist/browser/environment.js +34 -0
- package/dist/browser/environment.js.map +1 -0
- package/dist/browser/errors.js +18 -0
- package/dist/browser/errors.js.map +1 -0
- package/dist/browser/index.js +412 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/math.js +51 -0
- package/dist/browser/math.js.map +1 -0
- package/dist/browser/number.js +10 -0
- package/dist/browser/number.js.map +1 -0
- package/dist/browser/objects.js +31 -0
- package/dist/browser/objects.js.map +1 -0
- package/dist/browser/strings.js +80 -0
- package/dist/browser/strings.js.map +1 -0
- package/dist/browser/validation-core.js +54 -0
- package/dist/browser/validation-core.js.map +1 -0
- package/dist/browser/validation-crypto.js +28 -0
- package/dist/browser/validation-crypto.js.map +1 -0
- package/dist/browser/validators.js +98 -0
- package/dist/browser/validators.js.map +1 -0
- package/dist/cjs/async.js +86 -0
- package/dist/cjs/async.js.map +1 -0
- package/dist/cjs/dates.js +285 -0
- package/dist/cjs/dates.js.map +1 -0
- package/dist/cjs/environment-detection.js +84 -0
- package/dist/cjs/environment-detection.js.map +1 -0
- package/dist/cjs/environment.js +261 -0
- package/dist/cjs/environment.js.map +1 -0
- package/dist/cjs/errors.js +80 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/index.js +2035 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/math.js +388 -0
- package/dist/cjs/math.js.map +1 -0
- package/dist/cjs/number.js +37 -0
- package/dist/cjs/number.js.map +1 -0
- package/dist/cjs/objects.js +249 -0
- package/dist/cjs/objects.js.map +1 -0
- package/dist/cjs/strings.js +253 -0
- package/dist/cjs/strings.js.map +1 -0
- package/dist/cjs/validation.js +450 -0
- package/dist/cjs/validation.js.map +1 -0
- package/dist/esm/async.js +15 -0
- package/dist/esm/async.js.map +1 -0
- package/dist/esm/chunk-4O7ZPIJN.js +383 -0
- package/dist/esm/chunk-4O7ZPIJN.js.map +1 -0
- package/dist/esm/chunk-75XNTC34.js +60 -0
- package/dist/esm/chunk-75XNTC34.js.map +1 -0
- package/dist/esm/chunk-BDOBKBKA.js +72 -0
- package/dist/esm/chunk-BDOBKBKA.js.map +1 -0
- package/dist/esm/chunk-C3D7YZVE.js +299 -0
- package/dist/esm/chunk-C3D7YZVE.js.map +1 -0
- package/dist/esm/chunk-CZL6C2EI.js +452 -0
- package/dist/esm/chunk-CZL6C2EI.js.map +1 -0
- package/dist/esm/chunk-EBLSTOEC.js +263 -0
- package/dist/esm/chunk-EBLSTOEC.js.map +1 -0
- package/dist/esm/chunk-NSBPE2FW.js +17 -0
- package/dist/esm/chunk-NSBPE2FW.js.map +1 -0
- package/dist/esm/chunk-SLQVNPTH.js +27 -0
- package/dist/esm/chunk-SLQVNPTH.js.map +1 -0
- package/dist/esm/chunk-WG7ILCUB.js +195 -0
- package/dist/esm/chunk-WG7ILCUB.js.map +1 -0
- package/dist/esm/chunk-WJA4JDMZ.js +278 -0
- package/dist/esm/chunk-WJA4JDMZ.js.map +1 -0
- package/dist/esm/chunk-ZFVYLUTT.js +65 -0
- package/dist/esm/chunk-ZFVYLUTT.js.map +1 -0
- package/dist/esm/dates.js +78 -0
- package/dist/esm/dates.js.map +1 -0
- package/dist/esm/environment-detection.js +21 -0
- package/dist/esm/environment-detection.js.map +1 -0
- package/dist/esm/environment.js +34 -0
- package/dist/esm/environment.js.map +1 -0
- package/dist/esm/errors.js +18 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/index.js +380 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/math.js +51 -0
- package/dist/esm/math.js.map +1 -0
- package/dist/esm/number.js +10 -0
- package/dist/esm/number.js.map +1 -0
- package/dist/esm/objects.js +31 -0
- package/dist/esm/objects.js.map +1 -0
- package/dist/esm/strings.js +80 -0
- package/dist/esm/strings.js.map +1 -0
- package/dist/esm/validation.js +54 -0
- package/dist/esm/validation.js.map +1 -0
- package/dist/node/async.js +93 -0
- package/dist/node/async.js.map +1 -0
- package/dist/node/csv.js +102 -0
- package/dist/node/csv.js.map +1 -0
- package/dist/node/data.js +880 -0
- package/dist/node/data.js.map +1 -0
- package/dist/node/dates.js +324 -0
- package/dist/node/dates.js.map +1 -0
- package/dist/node/environment.js +278 -0
- package/dist/node/environment.js.map +1 -0
- package/dist/node/errors.js +89 -0
- package/dist/node/errors.js.map +1 -0
- package/dist/node/index.js +3151 -0
- package/dist/node/index.js.map +1 -0
- package/dist/node/json.js +107 -0
- package/dist/node/json.js.map +1 -0
- package/dist/node/math.js +413 -0
- package/dist/node/math.js.map +1 -0
- package/dist/node/number.js +42 -0
- package/dist/node/number.js.map +1 -0
- package/dist/node/objects.js +264 -0
- package/dist/node/objects.js.map +1 -0
- package/dist/node/strings.js +293 -0
- package/dist/node/strings.js.map +1 -0
- package/dist/node/tree.js +89 -0
- package/dist/node/tree.js.map +1 -0
- package/dist/node/validation-core.js +477 -0
- package/dist/node/validation-core.js.map +1 -0
- package/dist/node/validation-crypto.js +179 -0
- package/dist/node/validation-crypto.js.map +1 -0
- package/dist/node/validation.js +677 -0
- package/dist/node/validation.js.map +1 -0
- package/dist/node/validators.js +123 -0
- package/dist/node/validators.js.map +1 -0
- package/dist/node-esm/async.js +15 -0
- package/dist/node-esm/async.js.map +1 -0
- package/dist/node-esm/chunk-3YOF7NPT.js +299 -0
- package/dist/node-esm/chunk-3YOF7NPT.js.map +1 -0
- package/dist/node-esm/chunk-64TBXJQS.js +263 -0
- package/dist/node-esm/chunk-64TBXJQS.js.map +1 -0
- package/dist/node-esm/chunk-75XNTC34.js +60 -0
- package/dist/node-esm/chunk-75XNTC34.js.map +1 -0
- package/dist/node-esm/chunk-C4PKXIPB.js +278 -0
- package/dist/node-esm/chunk-C4PKXIPB.js.map +1 -0
- package/dist/node-esm/chunk-CMDFZME3.js +452 -0
- package/dist/node-esm/chunk-CMDFZME3.js.map +1 -0
- package/dist/node-esm/chunk-DZZPUYMP.js +74 -0
- package/dist/node-esm/chunk-DZZPUYMP.js.map +1 -0
- package/dist/node-esm/chunk-HTSEHRHI.js +195 -0
- package/dist/node-esm/chunk-HTSEHRHI.js.map +1 -0
- package/dist/node-esm/chunk-JCAUVOPH.js +27 -0
- package/dist/node-esm/chunk-JCAUVOPH.js.map +1 -0
- package/dist/node-esm/chunk-KBHE3K2F.js +505 -0
- package/dist/node-esm/chunk-KBHE3K2F.js.map +1 -0
- package/dist/node-esm/chunk-LYTET5NX.js +65 -0
- package/dist/node-esm/chunk-LYTET5NX.js.map +1 -0
- package/dist/node-esm/chunk-PZ5AY32C.js +10 -0
- package/dist/node-esm/chunk-PZ5AY32C.js.map +1 -0
- package/dist/node-esm/chunk-UKGXL2QO.js +383 -0
- package/dist/node-esm/chunk-UKGXL2QO.js.map +1 -0
- package/dist/node-esm/chunk-XAEYT23H.js +164 -0
- package/dist/node-esm/chunk-XAEYT23H.js.map +1 -0
- package/dist/node-esm/csv.js +63 -0
- package/dist/node-esm/csv.js.map +1 -0
- package/dist/node-esm/data.js +32 -0
- package/dist/node-esm/data.js.map +1 -0
- package/dist/node-esm/dates.js +78 -0
- package/dist/node-esm/dates.js.map +1 -0
- package/dist/node-esm/environment.js +34 -0
- package/dist/node-esm/environment.js.map +1 -0
- package/dist/node-esm/errors.js +18 -0
- package/dist/node-esm/errors.js.map +1 -0
- package/dist/node-esm/index.js +426 -0
- package/dist/node-esm/index.js.map +1 -0
- package/dist/node-esm/json.js +68 -0
- package/dist/node-esm/json.js.map +1 -0
- package/dist/node-esm/math.js +51 -0
- package/dist/node-esm/math.js.map +1 -0
- package/dist/node-esm/number.js +10 -0
- package/dist/node-esm/number.js.map +1 -0
- package/dist/node-esm/objects.js +31 -0
- package/dist/node-esm/objects.js.map +1 -0
- package/dist/node-esm/strings.js +80 -0
- package/dist/node-esm/strings.js.map +1 -0
- package/dist/node-esm/tree.js +8 -0
- package/dist/node-esm/tree.js.map +1 -0
- package/dist/node-esm/validation-core.js +54 -0
- package/dist/node-esm/validation-core.js.map +1 -0
- package/dist/node-esm/validation-crypto.js +26 -0
- package/dist/node-esm/validation-crypto.js.map +1 -0
- package/dist/node-esm/validation.js +606 -0
- package/dist/node-esm/validation.js.map +1 -0
- package/dist/node-esm/validators.js +98 -0
- package/dist/node-esm/validators.js.map +1 -0
- package/dist/types/async-C8gvbSG-.d.ts +453 -0
- package/dist/types/async.d.ts +1 -0
- package/dist/types/csv.d.ts +226 -0
- package/dist/types/data.d.ts +1561 -0
- package/dist/types/dates-hTiE0Z11.d.ts +298 -0
- package/dist/types/dates.d.ts +1 -0
- package/dist/types/environment-B8eLS7KT.d.ts +420 -0
- package/dist/types/environment-detection.d.ts +102 -0
- package/dist/types/environment.d.ts +1 -0
- package/dist/types/errors.d.ts +147 -0
- package/dist/types/index.d.ts +211 -0
- package/dist/types/json.d.ts +284 -0
- package/dist/types/math-BQ9Lwdp7.d.ts +2060 -0
- package/dist/types/math.d.ts +1 -0
- package/dist/types/number-CYnQfLWj.d.ts +44 -0
- package/dist/types/number.d.ts +1 -0
- package/dist/types/objects-BohS8GCS.d.ts +1185 -0
- package/dist/types/objects.d.ts +1 -0
- package/dist/types/strings-CiqRPYLL.d.ts +1349 -0
- package/dist/types/strings.d.ts +1 -0
- package/dist/types/tree.d.ts +284 -0
- package/dist/types/validation-core-DfHF8rCG.d.ts +238 -0
- package/dist/types/validation-crypto-browser.d.ts +56 -0
- package/dist/types/validation-crypto-node.d.ts +31 -0
- package/dist/types/validation.d.ts +1 -0
- package/dist/types/validators.d.ts +216 -0
- package/package.json +253 -0
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import {
|
|
2
|
+
__export,
|
|
3
|
+
__require
|
|
4
|
+
} from "./chunk-NSBPE2FW.js";
|
|
5
|
+
|
|
6
|
+
// src/browser/validation-crypto.ts
|
|
7
|
+
var validation_crypto_exports = {};
|
|
8
|
+
__export(validation_crypto_exports, {
|
|
9
|
+
escapeShellCommand: () => escapeShellCommand,
|
|
10
|
+
generateNonce: () => generateNonce,
|
|
11
|
+
generateSecureToken: () => generateSecureToken,
|
|
12
|
+
hashString: () => hashString,
|
|
13
|
+
hashStringSync: () => hashStringSync,
|
|
14
|
+
isSecureUrl: () => isSecureUrl,
|
|
15
|
+
isValidBase64: () => isValidBase64,
|
|
16
|
+
isValidJWTFormat: () => isValidJWTFormat,
|
|
17
|
+
removeDangerousChars: () => removeDangerousChars,
|
|
18
|
+
sanitizeHtml: () => sanitizeHtml,
|
|
19
|
+
validatePassword: () => validatePassword
|
|
20
|
+
});
|
|
21
|
+
var validatePassword = (password, criteria = {}) => {
|
|
22
|
+
const {
|
|
23
|
+
minLength = 8,
|
|
24
|
+
requireUppercase = true,
|
|
25
|
+
requireLowercase = true,
|
|
26
|
+
requireNumbers = true,
|
|
27
|
+
requireSpecialChars = true,
|
|
28
|
+
maxLength = 128,
|
|
29
|
+
forbiddenPatterns = []
|
|
30
|
+
} = criteria;
|
|
31
|
+
const errors = [];
|
|
32
|
+
let score = 0;
|
|
33
|
+
if (password.length < minLength) {
|
|
34
|
+
errors.push(`La contrase\xF1a debe tener al menos ${minLength} caracteres`);
|
|
35
|
+
} else {
|
|
36
|
+
score += 20;
|
|
37
|
+
}
|
|
38
|
+
if (password.length > maxLength) {
|
|
39
|
+
errors.push(`La contrase\xF1a no puede tener m\xE1s de ${maxLength} caracteres`);
|
|
40
|
+
}
|
|
41
|
+
if (requireUppercase && !/[A-Z]/.test(password)) {
|
|
42
|
+
errors.push("La contrase\xF1a debe contener al menos una letra may\xFAscula");
|
|
43
|
+
} else if (/[A-Z]/.test(password)) {
|
|
44
|
+
score += 15;
|
|
45
|
+
}
|
|
46
|
+
if (requireLowercase && !/[a-z]/.test(password)) {
|
|
47
|
+
errors.push("La contrase\xF1a debe contener al menos una letra min\xFAscula");
|
|
48
|
+
} else if (/[a-z]/.test(password)) {
|
|
49
|
+
score += 15;
|
|
50
|
+
}
|
|
51
|
+
if (requireNumbers && !/\d/.test(password)) {
|
|
52
|
+
errors.push("La contrase\xF1a debe contener al menos un n\xFAmero");
|
|
53
|
+
} else if (/\d/.test(password)) {
|
|
54
|
+
score += 15;
|
|
55
|
+
}
|
|
56
|
+
if (requireSpecialChars && !/[!@#$%^&*()_+\-=[\]{};':"\\|,.<>/?]/.test(password)) {
|
|
57
|
+
errors.push("La contrase\xF1a debe contener al menos un caracter especial");
|
|
58
|
+
} else if (/[!@#$%^&*()_+\-=[\]{};':"\\|,.<>/?]/.test(password)) {
|
|
59
|
+
score += 15;
|
|
60
|
+
}
|
|
61
|
+
for (const pattern of forbiddenPatterns) {
|
|
62
|
+
if (password.toLowerCase().includes(pattern.toLowerCase())) {
|
|
63
|
+
errors.push(`La contrase\xF1a no puede contener: ${pattern}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (password.length >= 12) score += 10;
|
|
67
|
+
if (password.length >= 16) score += 10;
|
|
68
|
+
if (/(.)\\1{2,}/.test(password)) score -= 10;
|
|
69
|
+
if (/123|abc|qwe/i.test(password)) score -= 15;
|
|
70
|
+
score = Math.max(0, Math.min(100, score));
|
|
71
|
+
let strength;
|
|
72
|
+
if (score < 30) strength = "weak";
|
|
73
|
+
else if (score < 60) strength = "fair";
|
|
74
|
+
else if (score < 80) strength = "good";
|
|
75
|
+
else strength = "strong";
|
|
76
|
+
return {
|
|
77
|
+
isValid: errors.length === 0,
|
|
78
|
+
errors,
|
|
79
|
+
strength,
|
|
80
|
+
score
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
var sanitizeHtml = (html) => {
|
|
84
|
+
if (!html) return "";
|
|
85
|
+
let sanitized = html.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, "").replace(/<style\b[^<]*(?:(?!<\/style>)<[^<]*)*<\/style>/gi, "");
|
|
86
|
+
sanitized = sanitized.replace(/ on\w+="[^"]*"/gi, "");
|
|
87
|
+
sanitized = sanitized.replace(/ on\w+='[^']*'/gi, "");
|
|
88
|
+
sanitized = sanitized.replace(/javascript:/gi, "");
|
|
89
|
+
sanitized = sanitized.replace(/<iframe\b[^<]*(?:(?!<\/iframe>)<[^<]*)*<\/iframe>/gi, "");
|
|
90
|
+
sanitized = sanitized.replace(/<object\b[^<]*(?:(?!<\/object>)<[^<]*)*<\/object>/gi, "");
|
|
91
|
+
sanitized = sanitized.replace(/<embed\b[^>]*>/gi, "");
|
|
92
|
+
return sanitized.trim();
|
|
93
|
+
};
|
|
94
|
+
var isValidJWTFormat = (token) => {
|
|
95
|
+
if (!token || typeof token !== "string") return false;
|
|
96
|
+
const parts = token.split(".");
|
|
97
|
+
if (parts.length !== 3) return false;
|
|
98
|
+
try {
|
|
99
|
+
for (const part of parts) {
|
|
100
|
+
if (!part || !/^[A-Za-z0-9_-]+$/.test(part)) return false;
|
|
101
|
+
atob(part.replace(/-/g, "+").replace(/_/g, "/"));
|
|
102
|
+
}
|
|
103
|
+
return true;
|
|
104
|
+
} catch {
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
var hashString = async (input, salt = "") => {
|
|
109
|
+
const combined = input + salt;
|
|
110
|
+
if (typeof crypto !== "undefined" && crypto.subtle && crypto.subtle.digest) {
|
|
111
|
+
try {
|
|
112
|
+
const msgBuffer = new TextEncoder().encode(combined);
|
|
113
|
+
const hashBuffer = await crypto.subtle.digest("SHA-256", msgBuffer);
|
|
114
|
+
const hashArray = Array.from(new Uint8Array(hashBuffer));
|
|
115
|
+
return hashArray.map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
116
|
+
} catch (error) {
|
|
117
|
+
console.warn("Web Crypto API failed, falling back to simple hash:", error);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
let hash = 0;
|
|
121
|
+
for (let i = 0; i < combined.length; i++) {
|
|
122
|
+
const char = combined.charCodeAt(i);
|
|
123
|
+
hash = (hash << 5) - hash + char;
|
|
124
|
+
hash = hash & hash;
|
|
125
|
+
}
|
|
126
|
+
return Math.abs(hash).toString(16);
|
|
127
|
+
};
|
|
128
|
+
var hashStringSync = (input, salt = "") => {
|
|
129
|
+
let hash = 0;
|
|
130
|
+
const combined = input + salt;
|
|
131
|
+
for (let i = 0; i < combined.length; i++) {
|
|
132
|
+
const char = combined.charCodeAt(i);
|
|
133
|
+
hash = (hash << 5) - hash + char;
|
|
134
|
+
hash = hash & hash;
|
|
135
|
+
}
|
|
136
|
+
return Math.abs(hash).toString(16);
|
|
137
|
+
};
|
|
138
|
+
var generateSecureToken = (length = 32) => {
|
|
139
|
+
if (typeof crypto !== "undefined" && crypto.getRandomValues) {
|
|
140
|
+
try {
|
|
141
|
+
const array = new Uint8Array(length);
|
|
142
|
+
crypto.getRandomValues(array);
|
|
143
|
+
return Array.from(array, (byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
144
|
+
} catch (error) {
|
|
145
|
+
console.warn("crypto.getRandomValues failed, falling back to Math.random:", error);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (typeof process !== "undefined" && process.versions && process.versions.node) {
|
|
149
|
+
try {
|
|
150
|
+
const crypto2 = __require("crypto");
|
|
151
|
+
return crypto2.randomBytes(length).toString("hex");
|
|
152
|
+
} catch (error) {
|
|
153
|
+
console.warn("Node.js crypto failed, falling back to Math.random:", error);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
console.warn("Using Math.random fallback - not cryptographically secure");
|
|
157
|
+
const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
|
158
|
+
let result = "";
|
|
159
|
+
for (let i = 0; i < length * 2; i++) {
|
|
160
|
+
result += chars.charAt(Math.floor(Math.random() * chars.length));
|
|
161
|
+
}
|
|
162
|
+
return result;
|
|
163
|
+
};
|
|
164
|
+
var isValidBase64 = (input) => {
|
|
165
|
+
if (!input || typeof input !== "string") return false;
|
|
166
|
+
if (!/^[A-Za-z0-9+/]*={0,2}$/.test(input)) return false;
|
|
167
|
+
try {
|
|
168
|
+
const decoded = atob(input);
|
|
169
|
+
const reencoded = btoa(decoded);
|
|
170
|
+
return reencoded === input;
|
|
171
|
+
} catch {
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
var escapeShellCommand = (input) => {
|
|
176
|
+
if (!input) return "";
|
|
177
|
+
return input.replace(/\\/g, "\\\\").replace(/'/g, "\\'").replace(/"/g, '\\"').replace(/;/g, "\\;").replace(/&/g, "\\&").replace(/\|/g, "\\|").replace(/`/g, "\\`").replace(/\$/g, "\\$").replace(/\(/g, "\\(").replace(/\)/g, "\\)").replace(/</g, "\\\\<").replace(/>/g, "\\\\>");
|
|
178
|
+
};
|
|
179
|
+
var isSecureUrl = (url) => {
|
|
180
|
+
if (!url || typeof url !== "string") return false;
|
|
181
|
+
try {
|
|
182
|
+
const parsed = new URL(url);
|
|
183
|
+
return parsed.protocol === "https:" || parsed.protocol === "http:" && (parsed.hostname === "localhost" || parsed.hostname === "127.0.0.1");
|
|
184
|
+
} catch {
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
var removeDangerousChars = (input, replacement = "") => {
|
|
189
|
+
if (!input) return "";
|
|
190
|
+
return input.replace(/[<>]/g, replacement).replace(/['"]/g, replacement).replace(/[&]/g, replacement).replace(/[\\x00-\\x1f\\x7f]/g, replacement);
|
|
191
|
+
};
|
|
192
|
+
var generateNonce = (length = 32) => {
|
|
193
|
+
const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
|
194
|
+
let result = "";
|
|
195
|
+
if (typeof crypto !== "undefined" && crypto.getRandomValues) {
|
|
196
|
+
try {
|
|
197
|
+
const array = new Uint8Array(length);
|
|
198
|
+
crypto.getRandomValues(array);
|
|
199
|
+
for (let i = 0; i < length; i++) {
|
|
200
|
+
result += chars[array[i] % chars.length];
|
|
201
|
+
}
|
|
202
|
+
return result;
|
|
203
|
+
} catch (error) {
|
|
204
|
+
console.warn("crypto.getRandomValues failed for nonce, falling back to Math.random:", error);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
if (typeof process !== "undefined" && process.versions && process.versions.node) {
|
|
208
|
+
try {
|
|
209
|
+
const crypto2 = __require("crypto");
|
|
210
|
+
const bytes = crypto2.randomBytes(length);
|
|
211
|
+
for (let i = 0; i < length; i++) {
|
|
212
|
+
result += chars[bytes[i] % chars.length];
|
|
213
|
+
}
|
|
214
|
+
return result;
|
|
215
|
+
} catch (error) {
|
|
216
|
+
console.warn("Node.js crypto failed for nonce, falling back to Math.random:", error);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
console.warn("Using Math.random fallback for nonce - not cryptographically secure");
|
|
220
|
+
for (let i = 0; i < length; i++) {
|
|
221
|
+
result += chars[Math.floor(Math.random() * chars.length)];
|
|
222
|
+
}
|
|
223
|
+
return result;
|
|
224
|
+
};
|
|
225
|
+
|
|
226
|
+
export {
|
|
227
|
+
validatePassword,
|
|
228
|
+
sanitizeHtml,
|
|
229
|
+
isValidJWTFormat,
|
|
230
|
+
hashString,
|
|
231
|
+
hashStringSync,
|
|
232
|
+
generateSecureToken,
|
|
233
|
+
isValidBase64,
|
|
234
|
+
escapeShellCommand,
|
|
235
|
+
isSecureUrl,
|
|
236
|
+
removeDangerousChars,
|
|
237
|
+
generateNonce,
|
|
238
|
+
validation_crypto_exports
|
|
239
|
+
};
|
|
240
|
+
//# sourceMappingURL=chunk-D4FZFIVA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/browser/validation-crypto.ts"],"sourcesContent":["/**\n * Browser-specific validation utilities with Web Crypto API support\n * Safe for browser environments - uses crypto.getRandomValues() and SubtleCrypto\n */\n\n/* eslint-disable no-console, complexity */\n\n// =============================================================================\n// PASSWORD VALIDATION (Browser-safe)\n// =============================================================================\n\nexport interface PasswordCriteria {\n minLength?: number\n requireUppercase?: boolean\n requireLowercase?: boolean\n requireNumbers?: boolean\n requireSpecialChars?: boolean\n maxLength?: number\n forbiddenPatterns?: string[]\n}\n\nexport interface PasswordValidationResult {\n isValid: boolean\n errors: string[]\n strength: 'weak' | 'fair' | 'good' | 'strong'\n score: number // 0-100\n}\n\nexport const validatePassword = (\n password: string,\n criteria: PasswordCriteria = {}\n): PasswordValidationResult => {\n const {\n minLength = 8,\n requireUppercase = true,\n requireLowercase = true,\n requireNumbers = true,\n requireSpecialChars = true,\n maxLength = 128,\n forbiddenPatterns = [],\n } = criteria\n\n const errors: string[] = []\n let score = 0\n\n if (password.length < minLength) {\n errors.push(`La contraseña debe tener al menos ${minLength} caracteres`)\n } else {\n score += 20\n }\n\n if (password.length > maxLength) {\n errors.push(`La contraseña no puede tener más de ${maxLength} caracteres`)\n }\n\n if (requireUppercase && !/[A-Z]/.test(password)) {\n errors.push('La contraseña debe contener al menos una letra mayúscula')\n } else if (/[A-Z]/.test(password)) {\n score += 15\n }\n\n if (requireLowercase && !/[a-z]/.test(password)) {\n errors.push('La contraseña debe contener al menos una letra minúscula')\n } else if (/[a-z]/.test(password)) {\n score += 15\n }\n\n if (requireNumbers && !/\\d/.test(password)) {\n errors.push('La contraseña debe contener al menos un número')\n } else if (/\\d/.test(password)) {\n score += 15\n }\n\n if (requireSpecialChars && !/[!@#$%^&*()_+\\-=[\\]{};':\"\\\\|,.<>/?]/.test(password)) {\n errors.push('La contraseña debe contener al menos un caracter especial')\n } else if (/[!@#$%^&*()_+\\-=[\\]{};':\"\\\\|,.<>/?]/.test(password)) {\n score += 15\n }\n\n for (const pattern of forbiddenPatterns) {\n if (password.toLowerCase().includes(pattern.toLowerCase())) {\n errors.push(`La contraseña no puede contener: ${pattern}`)\n }\n }\n\n if (password.length >= 12) score += 10\n if (password.length >= 16) score += 10\n\n if (/(.)\\\\1{2,}/.test(password)) score -= 10\n if (/123|abc|qwe/i.test(password)) score -= 15\n\n score = Math.max(0, Math.min(100, score))\n\n let strength: 'weak' | 'fair' | 'good' | 'strong'\n if (score < 30) strength = 'weak'\n else if (score < 60) strength = 'fair'\n else if (score < 80) strength = 'good'\n else strength = 'strong'\n\n return {\n isValid: errors.length === 0,\n errors,\n strength,\n score,\n }\n}\n\n// =============================================================================\n// SECURITY FUNCTIONS (Browser-safe)\n// =============================================================================\n\nexport const sanitizeHtml = (html: string): string => {\n if (!html) return ''\n\n let sanitized = html\n .replace(/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi, '')\n .replace(/<style\\b[^<]*(?:(?!<\\/style>)<[^<]*)*<\\/style>/gi, '')\n\n sanitized = sanitized.replace(/ on\\w+=\"[^\"]*\"/gi, '')\n sanitized = sanitized.replace(/ on\\w+='[^']*'/gi, '')\n sanitized = sanitized.replace(/javascript:/gi, '')\n sanitized = sanitized.replace(/<iframe\\b[^<]*(?:(?!<\\/iframe>)<[^<]*)*<\\/iframe>/gi, '')\n sanitized = sanitized.replace(/<object\\b[^<]*(?:(?!<\\/object>)<[^<]*)*<\\/object>/gi, '')\n sanitized = sanitized.replace(/<embed\\b[^>]*>/gi, '')\n\n return sanitized.trim()\n}\n\nexport const isValidJWTFormat = (token: string): boolean => {\n if (!token || typeof token !== 'string') return false\n\n const parts = token.split('.')\n if (parts.length !== 3) return false\n\n try {\n for (const part of parts) {\n if (!part || !/^[A-Za-z0-9_-]+$/.test(part)) return false\n atob(part.replace(/-/g, '+').replace(/_/g, '/'))\n }\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Browser-safe hash function with environment detection\n * Attempts Web Crypto API first, falls back to simple hash\n */\nexport const hashString = async (input: string, salt = ''): Promise<string> => {\n const combined = input + salt\n\n // Try Web Crypto API (modern browsers)\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.digest) {\n try {\n const msgBuffer = new TextEncoder().encode(combined)\n const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer)\n const hashArray = Array.from(new Uint8Array(hashBuffer))\n return hashArray.map(b => b.toString(16).padStart(2, '0')).join('')\n } catch (error) {\n console.warn('Web Crypto API failed, falling back to simple hash:', error)\n }\n }\n\n // Fallback: Simple hash for compatibility\n let hash = 0\n for (let i = 0; i < combined.length; i++) {\n const char = combined.charCodeAt(i)\n hash = (hash << 5) - hash + char\n hash = hash & hash // Convert to 32-bit integer\n }\n return Math.abs(hash).toString(16)\n}\n\n/**\n * Synchronous version of hashString for backward compatibility\n */\nexport const hashStringSync = (input: string, salt = ''): string => {\n // Simple hash for browser compatibility\n let hash = 0\n const combined = input + salt\n for (let i = 0; i < combined.length; i++) {\n const char = combined.charCodeAt(i)\n hash = (hash << 5) - hash + char\n hash = hash & hash // Convert to 32-bit integer\n }\n return Math.abs(hash).toString(16)\n}\n\n/**\n * Browser-safe secure token generation with comprehensive environment checks\n * Uses Web Crypto API when available, falls back to Node.js crypto, then Math.random\n * @param length - Length of the token in characters (default: 32)\n * @returns A secure hexadecimal token string\n * @example\n * ```ts\n * const token = generateSecureToken(16)\n * console.log(token) // \"a1b2c3d4e5f67890\"\n *\n * const shortToken = generateSecureToken(8)\n * console.log(shortToken) // \"a1b2c3d4\"\n * ```\n */\nexport const generateSecureToken = (length = 32): string => {\n // Check for Web Crypto API (modern browsers)\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n try {\n const array = new Uint8Array(length)\n crypto.getRandomValues(array)\n return Array.from(array, byte => byte.toString(16).padStart(2, '0')).join('')\n } catch (error) {\n console.warn('crypto.getRandomValues failed, falling back to Math.random:', error)\n }\n }\n\n // Check for Node.js crypto (if somehow running in Node context)\n if (typeof process !== 'undefined' && process.versions && process.versions.node) {\n try {\n // Dynamic import to avoid bundling issues\n const crypto = require('crypto')\n return crypto.randomBytes(length).toString('hex')\n } catch (error) {\n console.warn('Node.js crypto failed, falling back to Math.random:', error)\n }\n }\n\n // Final fallback: Math.random (less secure but universal)\n console.warn('Using Math.random fallback - not cryptographically secure')\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n let result = ''\n for (let i = 0; i < length * 2; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length))\n }\n return result\n}\n\nexport const isValidBase64 = (input: string): boolean => {\n if (!input || typeof input !== 'string') return false\n\n if (!/^[A-Za-z0-9+/]*={0,2}$/.test(input)) return false\n\n try {\n const decoded = atob(input)\n const reencoded = btoa(decoded)\n return reencoded === input\n } catch {\n return false\n }\n}\n\nexport const escapeShellCommand = (input: string): string => {\n if (!input) return ''\n\n return input\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/'/g, \"\\\\'\")\n .replace(/\"/g, '\\\\\"')\n .replace(/;/g, '\\\\;')\n .replace(/&/g, '\\\\&')\n .replace(/\\|/g, '\\\\|')\n .replace(/`/g, '\\\\`')\n .replace(/\\$/g, '\\\\$')\n .replace(/\\(/g, '\\\\(')\n .replace(/\\)/g, '\\\\)')\n .replace(/</g, '\\\\\\\\<')\n .replace(/>/g, '\\\\\\\\>')\n}\n\nexport const isSecureUrl = (url: string): boolean => {\n if (!url || typeof url !== 'string') return false\n\n try {\n const parsed = new URL(url)\n return (\n parsed.protocol === 'https:' ||\n (parsed.protocol === 'http:' &&\n (parsed.hostname === 'localhost' || parsed.hostname === '127.0.0.1'))\n )\n } catch {\n return false\n }\n}\n\nexport const removeDangerousChars = (input: string, replacement = ''): string => {\n if (!input) return ''\n\n return input\n .replace(/[<>]/g, replacement)\n .replace(/['\"]/g, replacement)\n .replace(/[&]/g, replacement)\n .replace(/[\\\\x00-\\\\x1f\\\\x7f]/g, replacement)\n}\n\n/**\n * Browser-safe nonce generation with comprehensive environment detection\n */\nexport const generateNonce = (length = 32): string => {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n let result = ''\n\n // Try Web Crypto API first (modern browsers)\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n try {\n const array = new Uint8Array(length)\n crypto.getRandomValues(array)\n for (let i = 0; i < length; i++) {\n result += chars[array[i] % chars.length]\n }\n return result\n } catch (error) {\n console.warn('crypto.getRandomValues failed for nonce, falling back to Math.random:', error)\n }\n }\n\n // Check for Node.js environment (edge case)\n if (typeof process !== 'undefined' && process.versions && process.versions.node) {\n try {\n const crypto = require('crypto')\n const bytes = crypto.randomBytes(length)\n for (let i = 0; i < length; i++) {\n result += chars[bytes[i] % chars.length]\n }\n return result\n } catch (error) {\n console.warn('Node.js crypto failed for nonce, falling back to Math.random:', error)\n }\n }\n\n // Final fallback: Math.random (less secure but universal)\n console.warn('Using Math.random fallback for nonce - not cryptographically secure')\n for (let i = 0; i < length; i++) {\n result += chars[Math.floor(Math.random() * chars.length)]\n }\n return result\n}\n"],"mappings":"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","names":["crypto"]}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import {
|
|
2
|
+
isBrowserEnvironment,
|
|
3
|
+
isNodeEnvironment
|
|
4
|
+
} from "./chunk-ZYTSVMTI.js";
|
|
5
|
+
import {
|
|
6
|
+
__export,
|
|
7
|
+
__require
|
|
8
|
+
} from "./chunk-NSBPE2FW.js";
|
|
9
|
+
|
|
10
|
+
// src/universal/environment-detection.ts
|
|
11
|
+
var environment_detection_exports = {};
|
|
12
|
+
__export(environment_detection_exports, {
|
|
13
|
+
getCryptoCapabilities: () => getCryptoCapabilities,
|
|
14
|
+
getEnvironmentType: () => getEnvironmentType,
|
|
15
|
+
isBrowserEnv: () => isBrowserEnv,
|
|
16
|
+
isNodeCryptoAvailable: () => isNodeCryptoAvailable,
|
|
17
|
+
isNodeEnv: () => isNodeEnv,
|
|
18
|
+
isWebCryptoAvailable: () => isWebCryptoAvailable,
|
|
19
|
+
isWorkerEnvironment: () => isWorkerEnvironment
|
|
20
|
+
});
|
|
21
|
+
var isBrowserEnv = isBrowserEnvironment;
|
|
22
|
+
var isNodeEnv = isNodeEnvironment;
|
|
23
|
+
var isWorkerEnvironment = () => {
|
|
24
|
+
try {
|
|
25
|
+
return typeof importScripts === "function" && typeof self !== "undefined" && // Check for Worker global scope without importing types
|
|
26
|
+
"importScripts" in self;
|
|
27
|
+
} catch {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
var isWebCryptoAvailable = () => {
|
|
32
|
+
try {
|
|
33
|
+
return typeof crypto !== "undefined" && typeof crypto.getRandomValues === "function" && typeof crypto.subtle === "object";
|
|
34
|
+
} catch {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
var isNodeCryptoAvailable = () => {
|
|
39
|
+
try {
|
|
40
|
+
if (!isNodeEnv()) return false;
|
|
41
|
+
const crypto2 = __require("crypto");
|
|
42
|
+
return typeof crypto2.createHash === "function" && typeof crypto2.randomBytes === "function";
|
|
43
|
+
} catch {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
var getEnvironmentType = () => {
|
|
48
|
+
if (isNodeEnv()) return "node";
|
|
49
|
+
if (isWorkerEnvironment()) return "worker";
|
|
50
|
+
if (isBrowserEnv()) return "browser";
|
|
51
|
+
return "unknown";
|
|
52
|
+
};
|
|
53
|
+
var getCryptoCapabilities = () => {
|
|
54
|
+
return {
|
|
55
|
+
webCrypto: isWebCryptoAvailable(),
|
|
56
|
+
nodeCrypto: isNodeCryptoAvailable(),
|
|
57
|
+
fallbackOnly: !isWebCryptoAvailable() && !isNodeCryptoAvailable(),
|
|
58
|
+
environment: getEnvironmentType()
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
export {
|
|
63
|
+
isBrowserEnv,
|
|
64
|
+
isNodeEnv,
|
|
65
|
+
isWorkerEnvironment,
|
|
66
|
+
isWebCryptoAvailable,
|
|
67
|
+
isNodeCryptoAvailable,
|
|
68
|
+
getEnvironmentType,
|
|
69
|
+
getCryptoCapabilities,
|
|
70
|
+
environment_detection_exports
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=chunk-IL7NG7IC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/universal/environment-detection.ts"],"sourcesContent":["/**\n * Universal crypto capabilities detection utilities\n * Safe for all environments with comprehensive fallbacks\n */\n\nimport { isBrowserEnvironment, isNodeEnvironment } from '../environment'\n\n// Global type declarations for Worker environment (avoid importing lib.webworker)\ndeclare const importScripts: any\ndeclare const self: any\n\n/**\n * Enhanced browser environment detection with additional checks\n * @returns true if running in a browser environment\n * @example\n * ```ts\n * if (isBrowserEnv()) {\n * console.log('Running in browser')\n * }\n * ```\n */\nexport const isBrowserEnv = isBrowserEnvironment\n\n/**\n * Enhanced Node.js environment detection with additional checks\n * @returns true if running in Node.js environment\n * @example\n * ```ts\n * if (isNodeEnv()) {\n * console.log('Running in Node.js')\n * }\n * ```\n */\nexport const isNodeEnv = isNodeEnvironment\n\n/**\n * Detects if running in Worker environment (Web Workers, Service Workers)\n * @returns true if running in a Worker context\n * @example\n * ```ts\n * if (isWorkerEnvironment()) {\n * console.log('Running in Web Worker')\n * }\n * ```\n */\nexport const isWorkerEnvironment = (): boolean => {\n try {\n return (\n typeof importScripts === 'function' &&\n typeof self !== 'undefined' &&\n // Check for Worker global scope without importing types\n 'importScripts' in self\n )\n } catch {\n return false\n }\n}\n\n/**\n * Detects if Web Crypto API is available in the current environment\n * @returns true if crypto.getRandomValues and crypto.subtle are available\n * @example\n * ```ts\n * if (isWebCryptoAvailable()) {\n * const array = new Uint8Array(16)\n * crypto.getRandomValues(array)\n * }\n * ```\n */\nexport const isWebCryptoAvailable = (): boolean => {\n try {\n return (\n typeof crypto !== 'undefined' &&\n typeof crypto.getRandomValues === 'function' &&\n typeof crypto.subtle === 'object'\n )\n } catch {\n return false\n }\n}\n\n/**\n * Detects if Node.js crypto module is available\n * @returns true if Node.js crypto module with hash and random functions is available\n * @example\n * ```ts\n * if (isNodeCryptoAvailable()) {\n * const crypto = require('crypto')\n * const hash = crypto.createHash('sha256')\n * }\n * ```\n */\nexport const isNodeCryptoAvailable = (): boolean => {\n try {\n if (!isNodeEnv()) return false\n const crypto = require('crypto')\n return typeof crypto.createHash === 'function' && typeof crypto.randomBytes === 'function'\n } catch {\n return false\n }\n}\n\n/**\n * Gets the current environment type with automatic detection\n * @returns The detected environment type\n * @example\n * ```ts\n * const env = getEnvironmentType()\n * switch (env) {\n * case 'node': console.log('Server-side'); break\n * case 'browser': console.log('Client-side'); break\n * case 'worker': console.log('Worker thread'); break\n * case 'unknown': console.log('Unknown environment'); break\n * }\n * ```\n */\nexport const getEnvironmentType = (): 'node' | 'browser' | 'worker' | 'unknown' => {\n if (isNodeEnv()) return 'node'\n if (isWorkerEnvironment()) return 'worker'\n if (isBrowserEnv()) return 'browser'\n return 'unknown'\n}\n\n/**\n * Gets available crypto capabilities for the current environment\n * @returns Object containing crypto capability information\n * @example\n * ```ts\n * const caps = getCryptoCapabilities()\n * console.log(caps)\n * // {\n * // webCrypto: true,\n * // nodeCrypto: false,\n * // fallbackOnly: false,\n * // environment: 'browser'\n * // }\n * ```\n */\nexport const getCryptoCapabilities = () => {\n return {\n webCrypto: isWebCryptoAvailable(),\n nodeCrypto: isNodeCryptoAvailable(),\n fallbackOnly: !isWebCryptoAvailable() && !isNodeCryptoAvailable(),\n environment: getEnvironmentType(),\n }\n}\n"],"mappings":";;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBO,IAAM,eAAe;AAYrB,IAAM,YAAY;AAYlB,IAAM,sBAAsB,MAAe;AAChD,MAAI;AACF,WACE,OAAO,kBAAkB,cACzB,OAAO,SAAS;AAAA,IAEhB,mBAAmB;AAAA,EAEvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAaO,IAAM,uBAAuB,MAAe;AACjD,MAAI;AACF,WACE,OAAO,WAAW,eAClB,OAAO,OAAO,oBAAoB,cAClC,OAAO,OAAO,WAAW;AAAA,EAE7B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAaO,IAAM,wBAAwB,MAAe;AAClD,MAAI;AACF,QAAI,CAAC,UAAU,EAAG,QAAO;AACzB,UAAMA,UAAS,UAAQ,QAAQ;AAC/B,WAAO,OAAOA,QAAO,eAAe,cAAc,OAAOA,QAAO,gBAAgB;AAAA,EAClF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAgBO,IAAM,qBAAqB,MAAiD;AACjF,MAAI,UAAU,EAAG,QAAO;AACxB,MAAI,oBAAoB,EAAG,QAAO;AAClC,MAAI,aAAa,EAAG,QAAO;AAC3B,SAAO;AACT;AAiBO,IAAM,wBAAwB,MAAM;AACzC,SAAO;AAAA,IACL,WAAW,qBAAqB;AAAA,IAChC,YAAY,sBAAsB;AAAA,IAClC,cAAc,CAAC,qBAAqB,KAAK,CAAC,sBAAsB;AAAA,IAChE,aAAa,mBAAmB;AAAA,EAClC;AACF;","names":["crypto"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
3
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
4
|
+
}) : x)(function(x) {
|
|
5
|
+
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
6
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
7
|
+
});
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export {
|
|
14
|
+
__require,
|
|
15
|
+
__export
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=chunk-NSBPE2FW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import {
|
|
2
|
+
__export
|
|
3
|
+
} from "./chunk-NSBPE2FW.js";
|
|
4
|
+
|
|
5
|
+
// src/number.ts
|
|
6
|
+
var number_exports = {};
|
|
7
|
+
__export(number_exports, {
|
|
8
|
+
isNumericValue: () => isNumericValue,
|
|
9
|
+
roundToDecimals: () => roundToDecimals
|
|
10
|
+
});
|
|
11
|
+
function isNumericValue(value) {
|
|
12
|
+
if (value === null || value === void 0) return false;
|
|
13
|
+
if (typeof value === "number") return !isNaN(value) && isFinite(value);
|
|
14
|
+
if (typeof value === "string") return value.trim() !== "" && !isNaN(Number(value));
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
function roundToDecimals(num, decimals = 2) {
|
|
18
|
+
const factor = Math.pow(10, decimals);
|
|
19
|
+
return num >= 0 ? Math.round(num * factor) / factor : -Math.round(Math.abs(num) * factor) / factor;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export {
|
|
23
|
+
isNumericValue,
|
|
24
|
+
roundToDecimals,
|
|
25
|
+
number_exports
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=chunk-SLQVNPTH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/number.ts"],"sourcesContent":["/**\n * Number utilities\n */\n\n/**\n * Verifica si un valor es numéricamente válido o convertible a número.\n * Acepta números y cadenas que representan números válidos.\n * @param value - El valor a verificar.\n * @returns true si el valor es numéricamente válido, false en caso contrario.\n * @example\n * ```ts\n * isNumericValue(5) // true\n * isNumericValue(\"5\") // true\n * isNumericValue(\"12.34\") // true\n * isNumericValue(\"-42\") // true\n * isNumericValue(\"abc\") // false\n * isNumericValue(\"\") // false\n * isNumericValue(\" \") // false\n * isNumericValue(null) // false\n * isNumericValue(undefined) // false\n * isNumericValue(NaN) // false\n * isNumericValue(Infinity) // false\n * ```\n */\nexport function isNumericValue(value: any): boolean {\n if (value === null || value === undefined) return false\n if (typeof value === 'number') return !isNaN(value) && isFinite(value)\n if (typeof value === 'string') return value.trim() !== '' && !isNaN(Number(value))\n return false\n}\n\n/**\n * Rounds a number to a specified number of decimal places\n * @param num - The number to round\n * @param decimals - Number of decimal places (default: 2)\n * @returns The rounded number\n * @example\n * ```ts\n * roundToDecimals(3.14159, 2) // 3.14\n * roundToDecimals(-2.7182, 3) // -2.718\n * ```\n */\nexport function roundToDecimals(num: number, decimals: number = 2): number {\n const factor = Math.pow(10, decimals)\n // Use sign-aware rounding to handle negative numbers correctly\n return num >= 0 ? Math.round(num * factor) / factor : -Math.round(Math.abs(num) * factor) / factor\n}\n"],"mappings":";;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBO,SAAS,eAAe,OAAqB;AAClD,MAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;AAClD,MAAI,OAAO,UAAU,SAAU,QAAO,CAAC,MAAM,KAAK,KAAK,SAAS,KAAK;AACrE,MAAI,OAAO,UAAU,SAAU,QAAO,MAAM,KAAK,MAAM,MAAM,CAAC,MAAM,OAAO,KAAK,CAAC;AACjF,SAAO;AACT;AAaO,SAAS,gBAAgB,KAAa,WAAmB,GAAW;AACzE,QAAM,SAAS,KAAK,IAAI,IAAI,QAAQ;AAEpC,SAAO,OAAO,IAAI,KAAK,MAAM,MAAM,MAAM,IAAI,SAAS,CAAC,KAAK,MAAM,KAAK,IAAI,GAAG,IAAI,MAAM,IAAI;AAC9F;","names":[]}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import {
|
|
2
|
+
areDatesEqualWithTolerance,
|
|
3
|
+
isDateTime,
|
|
4
|
+
toDate
|
|
5
|
+
} from "./chunk-C3D7YZVE.js";
|
|
6
|
+
import {
|
|
7
|
+
__export
|
|
8
|
+
} from "./chunk-NSBPE2FW.js";
|
|
9
|
+
|
|
10
|
+
// src/objects.ts
|
|
11
|
+
var objects_exports = {};
|
|
12
|
+
__export(objects_exports, {
|
|
13
|
+
calculateDifferences: () => calculateDifferences,
|
|
14
|
+
comparator: () => comparator,
|
|
15
|
+
deepEqual: () => deepEqual,
|
|
16
|
+
deleteArrayElementsBy: () => deleteArrayElementsBy,
|
|
17
|
+
formatToReadableString: () => formatToReadableString,
|
|
18
|
+
generateCrcHash: () => generateCrcHash,
|
|
19
|
+
getDeepValue: () => getDeepValue,
|
|
20
|
+
getShallowProperties: () => getShallowProperties,
|
|
21
|
+
hasSameType: () => hasSameType,
|
|
22
|
+
setDeepValue: () => setDeepValue,
|
|
23
|
+
updateArrayElementById: () => updateArrayElementById,
|
|
24
|
+
updateArrayElementsBy: () => updateArrayElementsBy
|
|
25
|
+
});
|
|
26
|
+
import crc32 from "crc/crc32";
|
|
27
|
+
import * as lodash from "lodash";
|
|
28
|
+
import fastEqual from "fast-deep-equal";
|
|
29
|
+
var {
|
|
30
|
+
isArray,
|
|
31
|
+
isArrayBuffer,
|
|
32
|
+
isBoolean,
|
|
33
|
+
isBuffer,
|
|
34
|
+
isEqual,
|
|
35
|
+
isNil,
|
|
36
|
+
isNumber,
|
|
37
|
+
isObject,
|
|
38
|
+
isPlainObject,
|
|
39
|
+
isString,
|
|
40
|
+
isTypedArray,
|
|
41
|
+
transform
|
|
42
|
+
} = lodash;
|
|
43
|
+
var nativeFilter = (array, predicate) => {
|
|
44
|
+
return array.filter((item) => {
|
|
45
|
+
return Object.keys(predicate).every((key) => item[key] === predicate[key]);
|
|
46
|
+
});
|
|
47
|
+
};
|
|
48
|
+
var nativeAssign = (target, source) => {
|
|
49
|
+
return Object.assign(target, source);
|
|
50
|
+
};
|
|
51
|
+
var nativePick = (object, keys) => {
|
|
52
|
+
const result = {};
|
|
53
|
+
keys.forEach((key) => {
|
|
54
|
+
if (key in object) {
|
|
55
|
+
result[key] = object[key];
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
return result;
|
|
59
|
+
};
|
|
60
|
+
var nativeRemove = (array, predicate) => {
|
|
61
|
+
const removed = [];
|
|
62
|
+
for (let i = array.length - 1; i >= 0; i--) {
|
|
63
|
+
if (predicate(array[i])) {
|
|
64
|
+
removed.unshift(array.splice(i, 1)[0]);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return removed;
|
|
68
|
+
};
|
|
69
|
+
var comparator = (data1, data2) => isEqual(data1, data2);
|
|
70
|
+
var deepEqual = (data1, data2) => fastEqual(data1, data2);
|
|
71
|
+
var formatToReadableString = (data) => JSON.stringify(data).replace(/[{}"]/g, "").replace(/,/g, ", ");
|
|
72
|
+
var getShallowProperties = (obj) => {
|
|
73
|
+
if (!obj) return {};
|
|
74
|
+
const topLevelProps = {};
|
|
75
|
+
for (const prop in obj) {
|
|
76
|
+
if (Object.hasOwnProperty.call(obj, prop)) {
|
|
77
|
+
const value = obj[prop];
|
|
78
|
+
const type = typeof value;
|
|
79
|
+
if (type !== "object" && type !== "function" || value === null) {
|
|
80
|
+
topLevelProps[prop] = value;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return topLevelProps;
|
|
85
|
+
};
|
|
86
|
+
var calculateDifferences = (oldObj, newObj) => {
|
|
87
|
+
return transform(
|
|
88
|
+
newObj,
|
|
89
|
+
(result, value, key) => {
|
|
90
|
+
const oldValue = oldObj[key];
|
|
91
|
+
if (isDateTime(value) && isDateTime(oldValue)) {
|
|
92
|
+
if (!areDatesEqualWithTolerance(toDate(value), toDate(oldValue))) {
|
|
93
|
+
result[key] = value;
|
|
94
|
+
}
|
|
95
|
+
} else if (!isEqual(value, oldValue)) {
|
|
96
|
+
result[key] = value;
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
{}
|
|
100
|
+
);
|
|
101
|
+
};
|
|
102
|
+
var generateCrcHash = (str) => {
|
|
103
|
+
if (isNil(str)) return crc32("-").toString(16);
|
|
104
|
+
if (isString(str)) return crc32(str).toString(16);
|
|
105
|
+
if (isBuffer(str)) return crc32(str).toString(16);
|
|
106
|
+
if (isArrayBuffer(str)) return crc32(str).toString(16);
|
|
107
|
+
if (isBoolean(str)) return crc32(str ? "true" : "false").toString(16);
|
|
108
|
+
if (isNumber(str)) return crc32(str.toString()).toString(16);
|
|
109
|
+
if (isArray(str) || isObject(str)) return generateCrcHash(JSON.stringify(str));
|
|
110
|
+
return crc32(str || "").toString(16);
|
|
111
|
+
};
|
|
112
|
+
var hasSameType = (sourceTarget, destinationTarget) => {
|
|
113
|
+
if (isArray(sourceTarget) && isArray(destinationTarget)) return true;
|
|
114
|
+
if (isArray(sourceTarget) !== isArray(destinationTarget)) return false;
|
|
115
|
+
if (isTypedArray(sourceTarget) && isTypedArray(destinationTarget)) {
|
|
116
|
+
if (Object.prototype.toString.call(sourceTarget) === Object.prototype.toString.call(destinationTarget))
|
|
117
|
+
return true;
|
|
118
|
+
else return false;
|
|
119
|
+
}
|
|
120
|
+
if (isTypedArray(sourceTarget) !== isTypedArray(destinationTarget)) return false;
|
|
121
|
+
if (isPlainObject(sourceTarget) && isPlainObject(destinationTarget)) return true;
|
|
122
|
+
if (isPlainObject(sourceTarget) !== isPlainObject(destinationTarget)) return false;
|
|
123
|
+
return typeof sourceTarget === typeof destinationTarget;
|
|
124
|
+
};
|
|
125
|
+
var updateArrayElementsBy = (data, objUpd, objSearch) => {
|
|
126
|
+
nativeFilter(data, objSearch).forEach((element) => nativeAssign(element, objUpd));
|
|
127
|
+
return data;
|
|
128
|
+
};
|
|
129
|
+
var updateArrayElementById = (data, objUpd, idField) => {
|
|
130
|
+
const index = data.findIndex((x) => x[idField] === objUpd[idField]);
|
|
131
|
+
if (index !== -1) data.splice(index, 1, objUpd);
|
|
132
|
+
};
|
|
133
|
+
var deleteArrayElementsBy = (data, objSearch) => {
|
|
134
|
+
nativeRemove(data, (x) => deepEqual(nativePick(x, Object.keys(objSearch)), objSearch));
|
|
135
|
+
return data;
|
|
136
|
+
};
|
|
137
|
+
function setDeepValue(obj, path, value) {
|
|
138
|
+
if (!obj || typeof obj !== "object") {
|
|
139
|
+
throw new TypeError("setDeepValue: target must be an object");
|
|
140
|
+
}
|
|
141
|
+
if (!path || typeof path !== "string") {
|
|
142
|
+
throw new TypeError("setDeepValue: path must be a non-empty string");
|
|
143
|
+
}
|
|
144
|
+
const keys = path.split(".");
|
|
145
|
+
let current = obj;
|
|
146
|
+
for (let i = 0; i < keys.length - 1; i++) {
|
|
147
|
+
const key = keys[i];
|
|
148
|
+
const nextKey = keys[i + 1];
|
|
149
|
+
const isNextArray = /^\d+$/.test(nextKey);
|
|
150
|
+
if (!(key in current) || typeof current[key] !== "object") {
|
|
151
|
+
current[key] = isNextArray ? [] : {};
|
|
152
|
+
}
|
|
153
|
+
current = current[key];
|
|
154
|
+
}
|
|
155
|
+
const lastKey = keys[keys.length - 1];
|
|
156
|
+
current[lastKey] = value;
|
|
157
|
+
return obj;
|
|
158
|
+
}
|
|
159
|
+
function getDeepValue(obj, path, defaultValue) {
|
|
160
|
+
if (!obj || typeof obj !== "object") {
|
|
161
|
+
return defaultValue;
|
|
162
|
+
}
|
|
163
|
+
if (!path || typeof path !== "string") {
|
|
164
|
+
return defaultValue;
|
|
165
|
+
}
|
|
166
|
+
const keys = path.split(".");
|
|
167
|
+
let current = obj;
|
|
168
|
+
for (const key of keys) {
|
|
169
|
+
if (current === null || current === void 0 || typeof current !== "object") {
|
|
170
|
+
return defaultValue;
|
|
171
|
+
}
|
|
172
|
+
if (!(key in current)) {
|
|
173
|
+
return defaultValue;
|
|
174
|
+
}
|
|
175
|
+
current = current[key];
|
|
176
|
+
}
|
|
177
|
+
return current !== void 0 ? current : defaultValue;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
export {
|
|
181
|
+
comparator,
|
|
182
|
+
deepEqual,
|
|
183
|
+
formatToReadableString,
|
|
184
|
+
getShallowProperties,
|
|
185
|
+
calculateDifferences,
|
|
186
|
+
generateCrcHash,
|
|
187
|
+
hasSameType,
|
|
188
|
+
updateArrayElementsBy,
|
|
189
|
+
updateArrayElementById,
|
|
190
|
+
deleteArrayElementsBy,
|
|
191
|
+
setDeepValue,
|
|
192
|
+
getDeepValue,
|
|
193
|
+
objects_exports
|
|
194
|
+
};
|
|
195
|
+
//# sourceMappingURL=chunk-WG7ILCUB.js.map
|