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