@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,606 @@
|
|
|
1
|
+
import {
|
|
2
|
+
isNodeEnvironment
|
|
3
|
+
} from "./chunk-64TBXJQS.js";
|
|
4
|
+
import "./chunk-PZ5AY32C.js";
|
|
5
|
+
|
|
6
|
+
// src/validation.ts
|
|
7
|
+
import { createHash, randomBytes } from "crypto";
|
|
8
|
+
import validator from "validator";
|
|
9
|
+
var randomInteger = (min, max) => {
|
|
10
|
+
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
11
|
+
};
|
|
12
|
+
var randomString = (length, pool) => {
|
|
13
|
+
const chars = pool || "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
|
14
|
+
let result = "";
|
|
15
|
+
for (let i = 0; i < length; i++) {
|
|
16
|
+
result += chars.charAt(Math.floor(Math.random() * chars.length));
|
|
17
|
+
}
|
|
18
|
+
return result;
|
|
19
|
+
};
|
|
20
|
+
var randomAlphaString = (length, casing) => {
|
|
21
|
+
const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
|
|
22
|
+
let result = randomString(length, chars);
|
|
23
|
+
if (casing === "upper") result = result.toUpperCase();
|
|
24
|
+
if (casing === "lower") result = result.toLowerCase();
|
|
25
|
+
return result;
|
|
26
|
+
};
|
|
27
|
+
var randomAlphaNumericString = (length, casing) => {
|
|
28
|
+
const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
|
29
|
+
let result = randomString(length, chars);
|
|
30
|
+
if (casing === "upper") result = result.toUpperCase();
|
|
31
|
+
if (casing === "lower") result = result.toLowerCase();
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
var pickone = (array) => {
|
|
35
|
+
return array[Math.floor(Math.random() * array.length)];
|
|
36
|
+
};
|
|
37
|
+
var randomBool = (likelihood = 50) => {
|
|
38
|
+
return Math.random() * 100 < likelihood;
|
|
39
|
+
};
|
|
40
|
+
var generateRandomInteger = (min = 0, max = 100) => {
|
|
41
|
+
return randomInteger(min, max);
|
|
42
|
+
};
|
|
43
|
+
var generateAlphaString = (options = {}) => {
|
|
44
|
+
const { length = 10, casing = void 0 } = options;
|
|
45
|
+
return randomAlphaString(length, casing);
|
|
46
|
+
};
|
|
47
|
+
var generateAlphaNumericString = (options = {}) => {
|
|
48
|
+
const { length = 10, casing = void 0 } = options;
|
|
49
|
+
return randomAlphaNumericString(length, casing);
|
|
50
|
+
};
|
|
51
|
+
var generateComplexString = (options = {}) => {
|
|
52
|
+
const { length = 10, casing: _casing = void 0 } = options;
|
|
53
|
+
return randomString(length);
|
|
54
|
+
};
|
|
55
|
+
var generateUsernameFromEmail = (email, randomDigits = 1) => {
|
|
56
|
+
if (!email || !email.includes("@"))
|
|
57
|
+
return `user${Math.floor(Math.random() * Math.pow(10, randomDigits))}`;
|
|
58
|
+
const localPart = email.split("@")[0];
|
|
59
|
+
const username = localPart.toLowerCase().replace(/[^a-z0-9]/g, "").substring(0, 12);
|
|
60
|
+
const randomSuffix = Math.floor(Math.random() * Math.pow(10, randomDigits));
|
|
61
|
+
return username + randomSuffix;
|
|
62
|
+
};
|
|
63
|
+
var generateUsername = (separator = "", randomDigits = 1, length = 8) => {
|
|
64
|
+
const adjectives = [
|
|
65
|
+
"cool",
|
|
66
|
+
"happy",
|
|
67
|
+
"smart",
|
|
68
|
+
"fast",
|
|
69
|
+
"nice",
|
|
70
|
+
"wild",
|
|
71
|
+
"free",
|
|
72
|
+
"bold",
|
|
73
|
+
"calm",
|
|
74
|
+
"brave"
|
|
75
|
+
];
|
|
76
|
+
const nouns = ["cat", "dog", "bird", "fish", "lion", "bear", "wolf", "tiger", "eagle", "shark"];
|
|
77
|
+
const adjective = adjectives[Math.floor(Math.random() * adjectives.length)];
|
|
78
|
+
const noun = nouns[Math.floor(Math.random() * nouns.length)];
|
|
79
|
+
const randomSuffix = Math.floor(Math.random() * Math.pow(10, randomDigits));
|
|
80
|
+
const username = adjective + separator + noun + randomSuffix;
|
|
81
|
+
return username.length > length ? username.substring(0, length) : username;
|
|
82
|
+
};
|
|
83
|
+
var generateSpanishNIF = () => {
|
|
84
|
+
const number = randomInteger(1e7, 99999999);
|
|
85
|
+
const letters = "TRWAGMYFPDXBNJZSQVHLCKE";
|
|
86
|
+
const letter = letters[number % 23];
|
|
87
|
+
return `${number}${letter}`;
|
|
88
|
+
};
|
|
89
|
+
var generateSpanishNIE = () => {
|
|
90
|
+
const prefixes = ["X", "Y", "Z"];
|
|
91
|
+
const selectedPrefix = pickone(prefixes);
|
|
92
|
+
const prefixValue = selectedPrefix === "X" ? 0 : selectedPrefix === "Y" ? 1 : 2;
|
|
93
|
+
const number = randomInteger(1e6, 9999999);
|
|
94
|
+
const letters = "TRWAGMYFPDXBNJZSQVHLCKE";
|
|
95
|
+
const calculationNumber = prefixValue * 1e7 + number;
|
|
96
|
+
const letter = letters[calculationNumber % 23];
|
|
97
|
+
return `${selectedPrefix}${number}${letter}`;
|
|
98
|
+
};
|
|
99
|
+
var generateSpanishCIF = () => {
|
|
100
|
+
const organizationTypes = [
|
|
101
|
+
"A",
|
|
102
|
+
"B",
|
|
103
|
+
"C",
|
|
104
|
+
"D",
|
|
105
|
+
"E",
|
|
106
|
+
"F",
|
|
107
|
+
"G",
|
|
108
|
+
"H",
|
|
109
|
+
"J",
|
|
110
|
+
"N",
|
|
111
|
+
"P",
|
|
112
|
+
"Q",
|
|
113
|
+
"R",
|
|
114
|
+
"S",
|
|
115
|
+
"U",
|
|
116
|
+
"V",
|
|
117
|
+
"W"
|
|
118
|
+
];
|
|
119
|
+
const organizationType = pickone(organizationTypes);
|
|
120
|
+
const number = randomInteger(1e6, 9999999).toString().padStart(7, "0");
|
|
121
|
+
let sum = 0;
|
|
122
|
+
for (let i = 0; i < 7; i++) {
|
|
123
|
+
let digit = parseInt(number[i]);
|
|
124
|
+
if (i % 2 === 0) {
|
|
125
|
+
digit *= 2;
|
|
126
|
+
if (digit > 9) digit = Math.floor(digit / 10) + digit % 10;
|
|
127
|
+
}
|
|
128
|
+
sum += digit;
|
|
129
|
+
}
|
|
130
|
+
const controlDigit = (10 - sum % 10) % 10;
|
|
131
|
+
const controlLetter = "JABCDEFGHI"[controlDigit];
|
|
132
|
+
const control = ["N", "P", "Q", "R", "S", "W"].includes(organizationType) ? controlLetter : randomBool() ? controlDigit.toString() : controlLetter;
|
|
133
|
+
return `${organizationType}${number}${control}`;
|
|
134
|
+
};
|
|
135
|
+
var generateSpanishPostalCode = () => {
|
|
136
|
+
const validPrefixes = [
|
|
137
|
+
"01",
|
|
138
|
+
"02",
|
|
139
|
+
"03",
|
|
140
|
+
"04",
|
|
141
|
+
"05",
|
|
142
|
+
"06",
|
|
143
|
+
"07",
|
|
144
|
+
"08",
|
|
145
|
+
"09",
|
|
146
|
+
"10",
|
|
147
|
+
"11",
|
|
148
|
+
"12",
|
|
149
|
+
"13",
|
|
150
|
+
"14",
|
|
151
|
+
"15",
|
|
152
|
+
"16",
|
|
153
|
+
"17",
|
|
154
|
+
"18",
|
|
155
|
+
"19",
|
|
156
|
+
"20",
|
|
157
|
+
"21",
|
|
158
|
+
"22",
|
|
159
|
+
"23",
|
|
160
|
+
"24",
|
|
161
|
+
"25",
|
|
162
|
+
"26",
|
|
163
|
+
"27",
|
|
164
|
+
"28",
|
|
165
|
+
"29",
|
|
166
|
+
"30",
|
|
167
|
+
"31",
|
|
168
|
+
"32",
|
|
169
|
+
"33",
|
|
170
|
+
"34",
|
|
171
|
+
"35",
|
|
172
|
+
"36",
|
|
173
|
+
"37",
|
|
174
|
+
"38",
|
|
175
|
+
"39",
|
|
176
|
+
"40",
|
|
177
|
+
"41",
|
|
178
|
+
"42",
|
|
179
|
+
"43",
|
|
180
|
+
"44",
|
|
181
|
+
"45",
|
|
182
|
+
"46",
|
|
183
|
+
"47",
|
|
184
|
+
"48",
|
|
185
|
+
"49",
|
|
186
|
+
"50",
|
|
187
|
+
"51",
|
|
188
|
+
"52"
|
|
189
|
+
];
|
|
190
|
+
const firstDigit = pickone(validPrefixes);
|
|
191
|
+
const remainingDigits = randomString(3, "0123456789");
|
|
192
|
+
return `${firstDigit}${remainingDigits}`;
|
|
193
|
+
};
|
|
194
|
+
var generateSpanishIBAN = () => {
|
|
195
|
+
const bankCode = randomString(4, "0123456789");
|
|
196
|
+
const branchCode = randomString(4, "0123456789");
|
|
197
|
+
const controlDigits = randomString(2, "0123456789");
|
|
198
|
+
const accountNumber = randomString(10, "0123456789");
|
|
199
|
+
const accountPart = `${bankCode}${branchCode}${controlDigits}${accountNumber}`;
|
|
200
|
+
const rearranged = `${accountPart}142800`;
|
|
201
|
+
const checkDigits = String(98n - BigInt(rearranged) % 97n).padStart(2, "0");
|
|
202
|
+
return `ES${checkDigits}${bankCode}${branchCode}${controlDigits}${accountNumber}`;
|
|
203
|
+
};
|
|
204
|
+
var generateEmail = (domain) => {
|
|
205
|
+
const firstNames = [
|
|
206
|
+
"Ana",
|
|
207
|
+
"Carlos",
|
|
208
|
+
"Mar\xEDa",
|
|
209
|
+
"Jos\xE9",
|
|
210
|
+
"Laura",
|
|
211
|
+
"David",
|
|
212
|
+
"Carmen",
|
|
213
|
+
"Antonio",
|
|
214
|
+
"Isabel",
|
|
215
|
+
"Manuel"
|
|
216
|
+
];
|
|
217
|
+
const lastNames = [
|
|
218
|
+
"Garc\xEDa",
|
|
219
|
+
"Gonz\xE1lez",
|
|
220
|
+
"L\xF3pez",
|
|
221
|
+
"Mart\xEDnez",
|
|
222
|
+
"S\xE1nchez",
|
|
223
|
+
"P\xE9rez",
|
|
224
|
+
"G\xF3mez",
|
|
225
|
+
"Mart\xEDn",
|
|
226
|
+
"Jim\xE9nez",
|
|
227
|
+
"Ruiz"
|
|
228
|
+
];
|
|
229
|
+
const domains = ["gmail.com", "hotmail.com", "yahoo.es", "outlook.com", "test.com"];
|
|
230
|
+
const firstName = pickone(firstNames);
|
|
231
|
+
const lastName = pickone(lastNames);
|
|
232
|
+
const emailDomain = domain || pickone(domains);
|
|
233
|
+
const formats = [
|
|
234
|
+
`${firstName.toLowerCase()}.${lastName.toLowerCase()}@${emailDomain}`,
|
|
235
|
+
`${firstName.toLowerCase()}${randomInteger(1, 99)}@${emailDomain}`,
|
|
236
|
+
`${firstName.toLowerCase()}.${lastName.toLowerCase()}${randomInteger(1, 9)}@${emailDomain}`,
|
|
237
|
+
`${firstName.toLowerCase()}${lastName.toLowerCase()}@${emailDomain}`
|
|
238
|
+
];
|
|
239
|
+
const username = pickone(formats);
|
|
240
|
+
return username.toLowerCase();
|
|
241
|
+
};
|
|
242
|
+
var generatePassword = (options = {}) => {
|
|
243
|
+
const {
|
|
244
|
+
length = 12,
|
|
245
|
+
includeUppercase = true,
|
|
246
|
+
includeLowercase = true,
|
|
247
|
+
includeNumbers = true,
|
|
248
|
+
includeSymbols = true
|
|
249
|
+
} = options;
|
|
250
|
+
const minLength = 4;
|
|
251
|
+
const maxLength = 30;
|
|
252
|
+
const targetLength = length || randomInteger(minLength, maxLength);
|
|
253
|
+
const upperChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
|
254
|
+
const lowerChars = "abcdefghijklmnopqrstuvwxyz";
|
|
255
|
+
const numberChars = "0123456789";
|
|
256
|
+
const symbolChars = "!@#$%^&*()_+-=[]{}|;:,.<>?";
|
|
257
|
+
let charset = "";
|
|
258
|
+
let requiredChars = "";
|
|
259
|
+
if (includeUppercase) {
|
|
260
|
+
charset += upperChars;
|
|
261
|
+
requiredChars += upperChars.charAt(Math.floor(Math.random() * upperChars.length));
|
|
262
|
+
}
|
|
263
|
+
if (includeLowercase) {
|
|
264
|
+
charset += lowerChars;
|
|
265
|
+
requiredChars += lowerChars.charAt(Math.floor(Math.random() * lowerChars.length));
|
|
266
|
+
}
|
|
267
|
+
if (includeNumbers) {
|
|
268
|
+
charset += numberChars;
|
|
269
|
+
requiredChars += numberChars.charAt(Math.floor(Math.random() * numberChars.length));
|
|
270
|
+
}
|
|
271
|
+
if (includeSymbols) {
|
|
272
|
+
charset += symbolChars;
|
|
273
|
+
requiredChars += symbolChars.charAt(Math.floor(Math.random() * symbolChars.length));
|
|
274
|
+
}
|
|
275
|
+
if (!charset) charset = "abcdefghijklmnopqrstuvwxyz";
|
|
276
|
+
let password = requiredChars;
|
|
277
|
+
const remainingLength = targetLength - requiredChars.length;
|
|
278
|
+
for (let i = 0; i < remainingLength; i++) {
|
|
279
|
+
password += charset.charAt(Math.floor(Math.random() * charset.length));
|
|
280
|
+
}
|
|
281
|
+
return password.split("").sort(() => Math.random() - 0.5).join("");
|
|
282
|
+
};
|
|
283
|
+
var generateHexColor = (shortFormat) => {
|
|
284
|
+
const hexChars = "0123456789ABCDEF";
|
|
285
|
+
const useShortFormat = shortFormat !== void 0 ? shortFormat : randomBool();
|
|
286
|
+
if (useShortFormat) {
|
|
287
|
+
const r = pickone(hexChars.split(""));
|
|
288
|
+
const g = pickone(hexChars.split(""));
|
|
289
|
+
const b = pickone(hexChars.split(""));
|
|
290
|
+
return `#${r}${g}${b}`;
|
|
291
|
+
} else {
|
|
292
|
+
const color = randomString(6, hexChars);
|
|
293
|
+
return `#${color}`;
|
|
294
|
+
}
|
|
295
|
+
};
|
|
296
|
+
var isValidNIF = (nif) => {
|
|
297
|
+
if (!nif || typeof nif !== "string") return false;
|
|
298
|
+
const cleanNif = nif.trim().toUpperCase();
|
|
299
|
+
const nifRegex = /^[0-9]{8}[TRWAGMYFPDXBNJZSQVHLCKE]$/;
|
|
300
|
+
if (!nifRegex.test(cleanNif)) return false;
|
|
301
|
+
const number = parseInt(cleanNif.substring(0, 8));
|
|
302
|
+
const letter = cleanNif.charAt(8);
|
|
303
|
+
const letters = "TRWAGMYFPDXBNJZSQVHLCKE";
|
|
304
|
+
const expectedLetter = letters[number % 23];
|
|
305
|
+
return letter === expectedLetter;
|
|
306
|
+
};
|
|
307
|
+
var validateNIF = isValidNIF;
|
|
308
|
+
var isValidNIE = (nie) => {
|
|
309
|
+
if (!nie || typeof nie !== "string") return false;
|
|
310
|
+
const cleanNie = nie.trim().toUpperCase();
|
|
311
|
+
const nieRegex = /^[XYZ][0-9]{7}[TRWAGMYFPDXBNJZSQVHLCKE]$/;
|
|
312
|
+
if (!nieRegex.test(cleanNie)) return false;
|
|
313
|
+
const prefix = cleanNie.charAt(0);
|
|
314
|
+
const number = parseInt(cleanNie.substring(1, 8));
|
|
315
|
+
const letter = cleanNie.charAt(8);
|
|
316
|
+
const prefixValue = prefix === "X" ? 0 : prefix === "Y" ? 1 : 2;
|
|
317
|
+
const calculationNumber = prefixValue * 1e7 + number;
|
|
318
|
+
const letters = "TRWAGMYFPDXBNJZSQVHLCKE";
|
|
319
|
+
const expectedLetter = letters[calculationNumber % 23];
|
|
320
|
+
return letter === expectedLetter;
|
|
321
|
+
};
|
|
322
|
+
var isValidCIF = (cif) => {
|
|
323
|
+
if (!cif || typeof cif !== "string") return false;
|
|
324
|
+
const cleanCif = cif.trim().toUpperCase();
|
|
325
|
+
const cifRegex = /^[ABCDEFGHJNPQRSUVW][0-9]{7}[0-9A-J]$/;
|
|
326
|
+
if (!cifRegex.test(cleanCif)) return false;
|
|
327
|
+
const organizationType = cleanCif.charAt(0);
|
|
328
|
+
const number = cleanCif.substring(1, 8);
|
|
329
|
+
const control = cleanCif.charAt(8);
|
|
330
|
+
let sum = 0;
|
|
331
|
+
for (let i = 0; i < 7; i++) {
|
|
332
|
+
let digit = parseInt(number[i]);
|
|
333
|
+
if (i % 2 === 0) {
|
|
334
|
+
digit *= 2;
|
|
335
|
+
if (digit > 9) digit = Math.floor(digit / 10) + digit % 10;
|
|
336
|
+
}
|
|
337
|
+
sum += digit;
|
|
338
|
+
}
|
|
339
|
+
const controlDigit = (10 - sum % 10) % 10;
|
|
340
|
+
const controlLetter = "JABCDEFGHI"[controlDigit];
|
|
341
|
+
if (["N", "P", "Q", "R", "S", "W"].includes(organizationType)) {
|
|
342
|
+
return control === controlLetter;
|
|
343
|
+
} else {
|
|
344
|
+
return control === controlDigit.toString() || control === controlLetter;
|
|
345
|
+
}
|
|
346
|
+
};
|
|
347
|
+
var isValidSpanishPostalCode = (postalCode) => {
|
|
348
|
+
if (!postalCode || typeof postalCode !== "string") return false;
|
|
349
|
+
const cleanCode = postalCode.trim();
|
|
350
|
+
const postalCodeRegex = /^(0[1-9]|[1-4][0-9]|5[0-2])[0-9]{3}$/;
|
|
351
|
+
return postalCodeRegex.test(cleanCode);
|
|
352
|
+
};
|
|
353
|
+
var isValidSpanishPhone = (phone) => {
|
|
354
|
+
if (!phone || typeof phone !== "string") return false;
|
|
355
|
+
const cleanPhone = phone.replace(/[\s\-()]/g, "");
|
|
356
|
+
const phoneRegex = /^(?:\+34|0034|34)?([679][0-9]{8})$/;
|
|
357
|
+
return phoneRegex.test(cleanPhone);
|
|
358
|
+
};
|
|
359
|
+
var isValidEmail = (email) => {
|
|
360
|
+
if (!email || typeof email !== "string") return false;
|
|
361
|
+
return validator.isEmail(email);
|
|
362
|
+
};
|
|
363
|
+
var isValidURL = (url) => {
|
|
364
|
+
if (!url || typeof url !== "string") return false;
|
|
365
|
+
if (validator.isURL(url, { require_protocol: true })) {
|
|
366
|
+
return true;
|
|
367
|
+
}
|
|
368
|
+
try {
|
|
369
|
+
const urlObj = new URL(url);
|
|
370
|
+
return urlObj.hostname === "localhost" || urlObj.hostname === "127.0.0.1";
|
|
371
|
+
} catch {
|
|
372
|
+
return false;
|
|
373
|
+
}
|
|
374
|
+
};
|
|
375
|
+
var isValidJSON = (str) => {
|
|
376
|
+
if (!str || typeof str !== "string") return false;
|
|
377
|
+
try {
|
|
378
|
+
JSON.parse(str);
|
|
379
|
+
return true;
|
|
380
|
+
} catch {
|
|
381
|
+
return false;
|
|
382
|
+
}
|
|
383
|
+
};
|
|
384
|
+
var isValidSpanishIBAN = (iban) => {
|
|
385
|
+
if (!iban || typeof iban !== "string") return false;
|
|
386
|
+
const cleanIban = iban.replace(/\s/g, "").toUpperCase();
|
|
387
|
+
const ibanRegex = /^ES[0-9]{22}$/;
|
|
388
|
+
if (!ibanRegex.test(cleanIban)) return false;
|
|
389
|
+
const rearranged = cleanIban.substring(4) + cleanIban.substring(0, 4);
|
|
390
|
+
const numericString = rearranged.replace(/[A-Z]/g, (letter) => {
|
|
391
|
+
return (letter.charCodeAt(0) - 55).toString();
|
|
392
|
+
});
|
|
393
|
+
let remainder = 0;
|
|
394
|
+
for (let i = 0; i < numericString.length; i++) {
|
|
395
|
+
remainder = (remainder * 10 + parseInt(numericString[i])) % 97;
|
|
396
|
+
}
|
|
397
|
+
return remainder === 1;
|
|
398
|
+
};
|
|
399
|
+
var validatePassword = (password, criteria = {}) => {
|
|
400
|
+
const {
|
|
401
|
+
minLength = 8,
|
|
402
|
+
requireUppercase = true,
|
|
403
|
+
requireLowercase = true,
|
|
404
|
+
requireNumbers = true,
|
|
405
|
+
requireSpecialChars = true,
|
|
406
|
+
maxLength = 128,
|
|
407
|
+
forbiddenPatterns = []
|
|
408
|
+
} = criteria;
|
|
409
|
+
const errors = [];
|
|
410
|
+
let score = 0;
|
|
411
|
+
if (password.length < minLength) {
|
|
412
|
+
errors.push(`La contrase\xF1a debe tener al menos ${minLength} caracteres`);
|
|
413
|
+
} else {
|
|
414
|
+
score += 20;
|
|
415
|
+
}
|
|
416
|
+
if (password.length > maxLength) {
|
|
417
|
+
errors.push(`La contrase\xF1a no puede tener m\xE1s de ${maxLength} caracteres`);
|
|
418
|
+
}
|
|
419
|
+
if (requireUppercase && !/[A-Z]/.test(password)) {
|
|
420
|
+
errors.push("La contrase\xF1a debe contener al menos una letra may\xFAscula");
|
|
421
|
+
} else if (/[A-Z]/.test(password)) {
|
|
422
|
+
score += 15;
|
|
423
|
+
}
|
|
424
|
+
if (requireLowercase && !/[a-z]/.test(password)) {
|
|
425
|
+
errors.push("La contrase\xF1a debe contener al menos una letra min\xFAscula");
|
|
426
|
+
} else if (/[a-z]/.test(password)) {
|
|
427
|
+
score += 15;
|
|
428
|
+
}
|
|
429
|
+
if (requireNumbers && !/\d/.test(password)) {
|
|
430
|
+
errors.push("La contrase\xF1a debe contener al menos un n\xFAmero");
|
|
431
|
+
} else if (/\d/.test(password)) {
|
|
432
|
+
score += 15;
|
|
433
|
+
}
|
|
434
|
+
if (requireSpecialChars && !/[!@#$%^&*()_+\-=[\]{};':"\\|,.<>/?]/.test(password)) {
|
|
435
|
+
errors.push("La contrase\xF1a debe contener al menos un caracter especial");
|
|
436
|
+
} else if (/[!@#$%^&*()_+\-=[\]{};':"\\|,.<>/?]/.test(password)) {
|
|
437
|
+
score += 15;
|
|
438
|
+
}
|
|
439
|
+
for (const pattern of forbiddenPatterns) {
|
|
440
|
+
if (password.toLowerCase().includes(pattern.toLowerCase())) {
|
|
441
|
+
errors.push(`La contrase\xF1a no puede contener: ${pattern}`);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
if (password.length >= 12) score += 10;
|
|
445
|
+
if (password.length >= 16) score += 10;
|
|
446
|
+
if (/(.)\\1{2,}/.test(password)) score -= 10;
|
|
447
|
+
if (/123|abc|qwe/i.test(password)) score -= 15;
|
|
448
|
+
score = Math.max(0, Math.min(100, score));
|
|
449
|
+
let strength;
|
|
450
|
+
if (score < 30) strength = "weak";
|
|
451
|
+
else if (score < 60) strength = "fair";
|
|
452
|
+
else if (score < 80) strength = "good";
|
|
453
|
+
else strength = "strong";
|
|
454
|
+
return {
|
|
455
|
+
isValid: errors.length === 0,
|
|
456
|
+
errors,
|
|
457
|
+
strength,
|
|
458
|
+
score
|
|
459
|
+
};
|
|
460
|
+
};
|
|
461
|
+
var sanitizeHtml = (html) => {
|
|
462
|
+
if (!html) return "";
|
|
463
|
+
let sanitized = html.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, "").replace(/<style\b[^<]*(?:(?!<\/style>)<[^<]*)*<\/style>/gi, "");
|
|
464
|
+
sanitized = sanitized.replace(/ on\w+="[^"]*"/gi, "");
|
|
465
|
+
sanitized = sanitized.replace(/ on\w+='[^']*'/gi, "");
|
|
466
|
+
sanitized = sanitized.replace(/javascript:/gi, "");
|
|
467
|
+
sanitized = sanitized.replace(/<iframe\b[^<]*(?:(?!<\/iframe>)<[^<]*)*<\/iframe>/gi, "");
|
|
468
|
+
sanitized = sanitized.replace(/<object\b[^<]*(?:(?!<\/object>)<[^<]*)*<\/object>/gi, "");
|
|
469
|
+
sanitized = sanitized.replace(/<embed\b[^>]*>/gi, "");
|
|
470
|
+
return sanitized.trim();
|
|
471
|
+
};
|
|
472
|
+
var isValidJWTFormat = (token) => {
|
|
473
|
+
if (!token || typeof token !== "string") return false;
|
|
474
|
+
const parts = token.split(".");
|
|
475
|
+
if (parts.length !== 3) return false;
|
|
476
|
+
try {
|
|
477
|
+
for (const part of parts) {
|
|
478
|
+
if (!part || !/^[A-Za-z0-9_-]+$/.test(part)) return false;
|
|
479
|
+
atob(part.replace(/-/g, "+").replace(/_/g, "/"));
|
|
480
|
+
}
|
|
481
|
+
return true;
|
|
482
|
+
} catch {
|
|
483
|
+
return false;
|
|
484
|
+
}
|
|
485
|
+
};
|
|
486
|
+
var hashString = (input, salt = "") => {
|
|
487
|
+
if (!isNodeEnvironment()) {
|
|
488
|
+
let hash = 0;
|
|
489
|
+
const combined = input + salt;
|
|
490
|
+
for (let i = 0; i < combined.length; i++) {
|
|
491
|
+
const char = combined.charCodeAt(i);
|
|
492
|
+
hash = (hash << 5) - hash + char;
|
|
493
|
+
hash = hash & hash;
|
|
494
|
+
}
|
|
495
|
+
return Math.abs(hash).toString(16);
|
|
496
|
+
}
|
|
497
|
+
return createHash("sha256").update(input + salt).digest("hex");
|
|
498
|
+
};
|
|
499
|
+
var generateSecureToken = (length = 32) => {
|
|
500
|
+
if (!isNodeEnvironment()) {
|
|
501
|
+
const array = new Uint8Array(length);
|
|
502
|
+
crypto.getRandomValues(array);
|
|
503
|
+
return Array.from(array, (byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
504
|
+
}
|
|
505
|
+
return randomBytes(length).toString("hex");
|
|
506
|
+
};
|
|
507
|
+
var isValidBase64 = (input) => {
|
|
508
|
+
if (!input || typeof input !== "string") return false;
|
|
509
|
+
if (!/^[A-Za-z0-9+/]*={0,2}$/.test(input)) return false;
|
|
510
|
+
try {
|
|
511
|
+
const decoded = atob(input);
|
|
512
|
+
const reencoded = btoa(decoded);
|
|
513
|
+
return reencoded === input;
|
|
514
|
+
} catch {
|
|
515
|
+
return false;
|
|
516
|
+
}
|
|
517
|
+
};
|
|
518
|
+
var escapeShellCommand = (input) => {
|
|
519
|
+
if (!input) return "";
|
|
520
|
+
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, "\\\\>");
|
|
521
|
+
};
|
|
522
|
+
var isSecureUrl = (url) => {
|
|
523
|
+
if (!url || typeof url !== "string") return false;
|
|
524
|
+
try {
|
|
525
|
+
const parsed = new URL(url);
|
|
526
|
+
return parsed.protocol === "https:" || parsed.protocol === "http:" && (parsed.hostname === "localhost" || parsed.hostname === "127.0.0.1");
|
|
527
|
+
} catch {
|
|
528
|
+
return false;
|
|
529
|
+
}
|
|
530
|
+
};
|
|
531
|
+
var removeDangerousChars = (input, replacement = "") => {
|
|
532
|
+
if (!input) return "";
|
|
533
|
+
return input.replace(/[<>]/g, replacement).replace(/['"]/g, replacement).replace(/[&]/g, replacement).replace(/[\\x00-\\x1f\\x7f]/g, replacement);
|
|
534
|
+
};
|
|
535
|
+
var generateNonce = (length = 32) => {
|
|
536
|
+
const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
|
537
|
+
let result = "";
|
|
538
|
+
if (!isNodeEnvironment()) {
|
|
539
|
+
const array = new Uint8Array(length);
|
|
540
|
+
crypto.getRandomValues(array);
|
|
541
|
+
for (let i = 0; i < length; i++) {
|
|
542
|
+
result += chars[array[i] % chars.length];
|
|
543
|
+
}
|
|
544
|
+
} else {
|
|
545
|
+
const bytes = randomBytes(length);
|
|
546
|
+
for (let i = 0; i < length; i++) {
|
|
547
|
+
result += chars[bytes[i] % chars.length];
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
return result;
|
|
551
|
+
};
|
|
552
|
+
function isValidDotNotationPath(path) {
|
|
553
|
+
if (!path || typeof path !== "string") {
|
|
554
|
+
return false;
|
|
555
|
+
}
|
|
556
|
+
const trimmed = path.trim();
|
|
557
|
+
if (trimmed.length === 0) {
|
|
558
|
+
return false;
|
|
559
|
+
}
|
|
560
|
+
if (trimmed.startsWith(".") || trimmed.endsWith(".")) {
|
|
561
|
+
return false;
|
|
562
|
+
}
|
|
563
|
+
if (trimmed.includes("..")) {
|
|
564
|
+
return false;
|
|
565
|
+
}
|
|
566
|
+
const validPattern = /^[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)*$/;
|
|
567
|
+
return validPattern.test(trimmed);
|
|
568
|
+
}
|
|
569
|
+
export {
|
|
570
|
+
escapeShellCommand,
|
|
571
|
+
generateAlphaNumericString,
|
|
572
|
+
generateAlphaString,
|
|
573
|
+
generateComplexString,
|
|
574
|
+
generateEmail,
|
|
575
|
+
generateHexColor,
|
|
576
|
+
generateNonce,
|
|
577
|
+
generatePassword,
|
|
578
|
+
generateRandomInteger,
|
|
579
|
+
generateSecureToken,
|
|
580
|
+
generateSpanishCIF,
|
|
581
|
+
generateSpanishIBAN,
|
|
582
|
+
generateSpanishNIE,
|
|
583
|
+
generateSpanishNIF,
|
|
584
|
+
generateSpanishPostalCode,
|
|
585
|
+
generateUsername,
|
|
586
|
+
generateUsernameFromEmail,
|
|
587
|
+
hashString,
|
|
588
|
+
isSecureUrl,
|
|
589
|
+
isValidBase64,
|
|
590
|
+
isValidCIF,
|
|
591
|
+
isValidDotNotationPath,
|
|
592
|
+
isValidEmail,
|
|
593
|
+
isValidJSON,
|
|
594
|
+
isValidJWTFormat,
|
|
595
|
+
isValidNIE,
|
|
596
|
+
isValidNIF,
|
|
597
|
+
isValidSpanishIBAN,
|
|
598
|
+
isValidSpanishPhone,
|
|
599
|
+
isValidSpanishPostalCode,
|
|
600
|
+
isValidURL,
|
|
601
|
+
removeDangerousChars,
|
|
602
|
+
sanitizeHtml,
|
|
603
|
+
validateNIF,
|
|
604
|
+
validatePassword
|
|
605
|
+
};
|
|
606
|
+
//# sourceMappingURL=validation.js.map
|