utilitify-core 1.0.0

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 (147) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +338 -0
  3. package/dist/async.cjs +25 -0
  4. package/dist/async.cjs.map +1 -0
  5. package/dist/async.d.cts +104 -0
  6. package/dist/async.d.ts +104 -0
  7. package/dist/async.js +4 -0
  8. package/dist/async.js.map +1 -0
  9. package/dist/chunk-2ICNRTSN.cjs +346 -0
  10. package/dist/chunk-2ICNRTSN.cjs.map +1 -0
  11. package/dist/chunk-3DPF72DY.js +170 -0
  12. package/dist/chunk-3DPF72DY.js.map +1 -0
  13. package/dist/chunk-4CV4JOE5.js +24 -0
  14. package/dist/chunk-4CV4JOE5.js.map +1 -0
  15. package/dist/chunk-4SLYNSLH.cjs +783 -0
  16. package/dist/chunk-4SLYNSLH.cjs.map +1 -0
  17. package/dist/chunk-5WP7DWCG.js +1285 -0
  18. package/dist/chunk-5WP7DWCG.js.map +1 -0
  19. package/dist/chunk-BMQ6YPKV.js +876 -0
  20. package/dist/chunk-BMQ6YPKV.js.map +1 -0
  21. package/dist/chunk-BZCMWUKS.cjs +479 -0
  22. package/dist/chunk-BZCMWUKS.cjs.map +1 -0
  23. package/dist/chunk-C5R744DY.cjs +173 -0
  24. package/dist/chunk-C5R744DY.cjs.map +1 -0
  25. package/dist/chunk-C75J62CV.cjs +913 -0
  26. package/dist/chunk-C75J62CV.cjs.map +1 -0
  27. package/dist/chunk-CZLDE2OZ.cjs +28 -0
  28. package/dist/chunk-CZLDE2OZ.cjs.map +1 -0
  29. package/dist/chunk-DSMB6AF6.cjs +193 -0
  30. package/dist/chunk-DSMB6AF6.cjs.map +1 -0
  31. package/dist/chunk-ETWGPOPY.js +426 -0
  32. package/dist/chunk-ETWGPOPY.js.map +1 -0
  33. package/dist/chunk-FQBPVN63.cjs +403 -0
  34. package/dist/chunk-FQBPVN63.cjs.map +1 -0
  35. package/dist/chunk-G4GYQGTW.cjs +178 -0
  36. package/dist/chunk-G4GYQGTW.cjs.map +1 -0
  37. package/dist/chunk-GFDMZDMI.js +486 -0
  38. package/dist/chunk-GFDMZDMI.js.map +1 -0
  39. package/dist/chunk-HOTOYIPB.js +171 -0
  40. package/dist/chunk-HOTOYIPB.js.map +1 -0
  41. package/dist/chunk-HYADH4ZX.js +176 -0
  42. package/dist/chunk-HYADH4ZX.js.map +1 -0
  43. package/dist/chunk-JBN7C5WE.js +255 -0
  44. package/dist/chunk-JBN7C5WE.js.map +1 -0
  45. package/dist/chunk-JNCTPFTD.cjs +25 -0
  46. package/dist/chunk-JNCTPFTD.cjs.map +1 -0
  47. package/dist/chunk-N3BH3BV7.js +21 -0
  48. package/dist/chunk-N3BH3BV7.js.map +1 -0
  49. package/dist/chunk-NFPGAVRQ.js +749 -0
  50. package/dist/chunk-NFPGAVRQ.js.map +1 -0
  51. package/dist/chunk-OFFRGRBN.cjs +1332 -0
  52. package/dist/chunk-OFFRGRBN.cjs.map +1 -0
  53. package/dist/chunk-OZLKYIZL.cjs +490 -0
  54. package/dist/chunk-OZLKYIZL.cjs.map +1 -0
  55. package/dist/chunk-P3NUK46X.js +145 -0
  56. package/dist/chunk-P3NUK46X.js.map +1 -0
  57. package/dist/chunk-P7P2B7ZI.cjs +429 -0
  58. package/dist/chunk-P7P2B7ZI.cjs.map +1 -0
  59. package/dist/chunk-PB6SKSJN.cjs +150 -0
  60. package/dist/chunk-PB6SKSJN.cjs.map +1 -0
  61. package/dist/chunk-R3IXCJR7.js +378 -0
  62. package/dist/chunk-R3IXCJR7.js.map +1 -0
  63. package/dist/chunk-SD6P3WEJ.js +324 -0
  64. package/dist/chunk-SD6P3WEJ.js.map +1 -0
  65. package/dist/chunk-YSCHP26P.js +451 -0
  66. package/dist/chunk-YSCHP26P.js.map +1 -0
  67. package/dist/chunk-ZLMPRPCY.cjs +274 -0
  68. package/dist/chunk-ZLMPRPCY.cjs.map +1 -0
  69. package/dist/common-CBDYNJeh.d.cts +48 -0
  70. package/dist/common-CBDYNJeh.d.ts +48 -0
  71. package/dist/constants.cjs +42 -0
  72. package/dist/constants.cjs.map +1 -0
  73. package/dist/constants.d.cts +60 -0
  74. package/dist/constants.d.ts +60 -0
  75. package/dist/constants.js +5 -0
  76. package/dist/constants.js.map +1 -0
  77. package/dist/country/index.cjs +154 -0
  78. package/dist/country/index.cjs.map +1 -0
  79. package/dist/country/index.d.cts +1 -0
  80. package/dist/country/index.d.ts +1 -0
  81. package/dist/country/index.js +5 -0
  82. package/dist/country/index.js.map +1 -0
  83. package/dist/date/index.cjs +117 -0
  84. package/dist/date/index.cjs.map +1 -0
  85. package/dist/date/index.d.cts +283 -0
  86. package/dist/date/index.d.ts +283 -0
  87. package/dist/date/index.js +4 -0
  88. package/dist/date/index.js.map +1 -0
  89. package/dist/environment/index.cjs +73 -0
  90. package/dist/environment/index.cjs.map +1 -0
  91. package/dist/environment/index.d.cts +127 -0
  92. package/dist/environment/index.d.ts +127 -0
  93. package/dist/environment/index.js +4 -0
  94. package/dist/environment/index.js.map +1 -0
  95. package/dist/form/index.cjs +81 -0
  96. package/dist/form/index.cjs.map +1 -0
  97. package/dist/form/index.d.cts +227 -0
  98. package/dist/form/index.d.ts +227 -0
  99. package/dist/form/index.js +4 -0
  100. package/dist/form/index.js.map +1 -0
  101. package/dist/i18n.cjs +37 -0
  102. package/dist/i18n.cjs.map +1 -0
  103. package/dist/i18n.d.cts +102 -0
  104. package/dist/i18n.d.ts +102 -0
  105. package/dist/i18n.js +4 -0
  106. package/dist/i18n.js.map +1 -0
  107. package/dist/index-BXBmBHyL.d.ts +718 -0
  108. package/dist/index-BYsUCP3u.d.cts +718 -0
  109. package/dist/index-Cl26FrAZ.d.cts +362 -0
  110. package/dist/index-Cl26FrAZ.d.ts +362 -0
  111. package/dist/index.cjs +1265 -0
  112. package/dist/index.cjs.map +1 -0
  113. package/dist/index.d.cts +205 -0
  114. package/dist/index.d.ts +205 -0
  115. package/dist/index.js +277 -0
  116. package/dist/index.js.map +1 -0
  117. package/dist/schema.cjs +13 -0
  118. package/dist/schema.cjs.map +1 -0
  119. package/dist/schema.d.cts +84 -0
  120. package/dist/schema.d.ts +84 -0
  121. package/dist/schema.js +4 -0
  122. package/dist/schema.js.map +1 -0
  123. package/dist/security/index.cjs +94 -0
  124. package/dist/security/index.cjs.map +1 -0
  125. package/dist/security/index.d.cts +216 -0
  126. package/dist/security/index.d.ts +216 -0
  127. package/dist/security/index.js +5 -0
  128. package/dist/security/index.js.map +1 -0
  129. package/dist/string/index.cjs +153 -0
  130. package/dist/string/index.cjs.map +1 -0
  131. package/dist/string/index.d.cts +471 -0
  132. package/dist/string/index.d.ts +471 -0
  133. package/dist/string/index.js +4 -0
  134. package/dist/string/index.js.map +1 -0
  135. package/dist/transform/index.cjs +105 -0
  136. package/dist/transform/index.cjs.map +1 -0
  137. package/dist/transform/index.d.cts +271 -0
  138. package/dist/transform/index.d.ts +271 -0
  139. package/dist/transform/index.js +4 -0
  140. package/dist/transform/index.js.map +1 -0
  141. package/dist/validators/index.cjs +195 -0
  142. package/dist/validators/index.cjs.map +1 -0
  143. package/dist/validators/index.d.cts +2 -0
  144. package/dist/validators/index.d.ts +2 -0
  145. package/dist/validators/index.js +6 -0
  146. package/dist/validators/index.js.map +1 -0
  147. package/package.json +229 -0
package/dist/index.js ADDED
@@ -0,0 +1,277 @@
1
+ export { detectClient, getEnv, getEnvBoolean, getEnvNumber, getRequiredEnv, getScreenSize, isBrowser, isDevelopment, isMobile, isNode, isProduction, isTest, isTouchDevice, prefersDarkMode, prefersReducedMotion, validateEnv } from './chunk-HYADH4ZX.js';
2
+ export { composeValidators, createDebouncedValidator, validateAllAsync, validateAsync } from './chunk-P3NUK46X.js';
3
+ export { addLocale, getAvailableLocales, getLocale, getMessage, setCustomMessages, setLocale, withLocalization } from './chunk-3DPF72DY.js';
4
+ export { addDisposableDomains, addFreeEmailDomains, addReservedUsernames } from './chunk-N3BH3BV7.js';
5
+ export { z } from './chunk-HOTOYIPB.js';
6
+ import { validateName, validateEmail, validatePhone, validateUsername } from './chunk-5WP7DWCG.js';
7
+ export { detectCardType, detectScript, formatCardNumber, formatName, formatPhone, getCardTypeFromPrefix, getEmailDomain, getIpVersion, getUrlDomain, isDangerousUrl, isDataUrl, isDisposableEmail, isHttpsUrl, isLoopbackIp, isPrivateIp, isReservedUsername, isValidCVV, isValidCidr, isValidCreditCard, isValidEmail, isValidExpiry, isValidIP, isValidIPv4, isValidIPv6, isValidName, isValidPhone, isValidUrl, isValidUsername, luhnCheck, maskCardNumber, normalizeEmail, normalizeUrl, parsePhone, sanitizeName, sanitizeUsername, splitName, suggestUsernames, validateCreditCard, validateEmail, validateIBAN, validateIp, validateName, validatePhone, validateUrl, validateUsername, validateVAT } from './chunk-5WP7DWCG.js';
8
+ export { COUNTRIES, CURRENCIES, convertCountryCode, convertCurrency, convertTimeBetweenCountries, formatCurrency, formatTimeForCountry, formatWithDialingCode, getAllCountries, getAllCurrencies, getAllFlags, getCountriesByContinent, getCountriesByDialingCode, getCountriesByLanguage, getCountry, getCountryByAlpha2, getCountryByAlpha3, getCountryByNumeric, getCountryFromEmoji, getCurrency, getCurrencyByCountry, getCurrencySymbol, getCurrentTimeInCountry, getDefaultTimezone, getDialingCode, getFlagEmoji, getTimezoneOffset, getTimezonesByCountry, hasValidDialingCode, isFlagEmoji, isValidCountryCode, parseCurrency, searchCountries } from './chunk-NFPGAVRQ.js';
9
+ export { PHONE_FORMATS, getPhoneFormat, getSupportedPhoneCountries } from './chunk-GFDMZDMI.js';
10
+ export { capitalize, ellipsis, generateBase64String, generateHexString, generateOTP, generatePassphrase, generatePassword, generateRandomString, generateUrlSafeString, isValidSlug, maskCreditCard, maskEmail, maskIP, maskName, maskPhone, maskString, needsTruncation, slugify, swapCase, toCamelCase, toConstantCase, toDotCase, toKebabCase, toPascalCase, toSentenceCase, toSlug, toSnakeCase, toTitleCase, transliterate, truncate, truncateFilename, truncateHtml, truncateSentences, truncateWords, uncapitalize, uniqueSlug } from './chunk-BMQ6YPKV.js';
11
+ import { calculateAge } from './chunk-YSCHP26P.js';
12
+ export { addTime, calculateAge, diffIn, endOf, formatDate, formatDateByLocale, formatRelativeTime, getAgeBracket, getAgeInYears, getDaysInMonth, getMinAgeDOB, getTimeDiff, isAdult, isAgeInRange, isBetween, isInFuture, isInPast, isLeapYear, isMinor, isToday, isValidDate, isWeekday, isWeekend, parseDate, startOf, subtractTime, toISODate } from './chunk-YSCHP26P.js';
13
+ import { checkPasswordStrength } from './chunk-SD6P3WEJ.js';
14
+ export { checkPasswordStrength, generateBase64Token, generateNanoId, generateSecureToken, generateShortId, generateToken, generateUUID, generateUUIDv7, generateUrlSafeToken, getPasswordFeedback, getUUIDv7Timestamp, hashBcrypt, hashMD5, hashSHA256, hashSHA512, hmacSHA256, isStrongPassword, isValidUUID, meetsRequirements, timingSafeCompare, verifyBcrypt } from './chunk-SD6P3WEJ.js';
15
+ export { COMMON_PASSWORD_PATTERNS, CORPORATE_EMAIL_DOMAINS, DISPOSABLE_EMAIL_DOMAINS, FREE_EMAIL_DOMAINS, RESERVED_USERNAMES } from './chunk-ETWGPOPY.js';
16
+ export { cloneDeep, compact, compactDeep, deepMerge, deepMergeWith, escapeHtml, flattenObject, get, getAllKeys, invert, mapKeys, mapValues, omit, omitBy, pick, pickBy, removeControlChars, sanitizeObject, sanitizeString, sanitizeUrl, set, stripHtml, unescapeHtml, unflattenObject } from './chunk-R3IXCJR7.js';
17
+ export { createErrorMessages, errors, formatMessage, formatValidationResult, inRange, isEmpty, isPresent, matchesPattern, maxLength, minLength, mustMatch, oneOf, requireAllOrNone, requireOneOf, required, requiredIf, requiredUnless, validateConditional } from './chunk-JBN7C5WE.js';
18
+ import './chunk-4CV4JOE5.js';
19
+
20
+ // src/unified/validateUser.ts
21
+ var DEFAULT_OPTIONS = {
22
+ required: []
23
+ };
24
+ function validateUser(userData, options = {}) {
25
+ const opts = { ...DEFAULT_OPTIONS, ...options };
26
+ const errors2 = [];
27
+ const data = {};
28
+ const sanitized = {};
29
+ for (const field of opts.required || []) {
30
+ const value = userData[field];
31
+ if (value === void 0 || value === null || value === "") {
32
+ errors2.push({
33
+ field,
34
+ code: "REQUIRED",
35
+ message: `${field} is required`
36
+ });
37
+ }
38
+ }
39
+ if (userData.name !== void 0) {
40
+ const nameResult = validateName(userData.name, opts.name);
41
+ data.name = nameResult;
42
+ sanitized.name = nameResult.sanitized;
43
+ if (!nameResult.isValid) {
44
+ errors2.push(...nameResult.errors);
45
+ }
46
+ }
47
+ if (userData.email !== void 0) {
48
+ const emailResult = validateEmail(userData.email, opts.email);
49
+ data.email = emailResult;
50
+ sanitized.email = emailResult.normalized;
51
+ if (!emailResult.isValid) {
52
+ errors2.push(...emailResult.errors);
53
+ }
54
+ }
55
+ if (userData.phone !== void 0) {
56
+ const phoneOptions = {
57
+ ...opts.phone,
58
+ countryCode: opts.phone?.countryCode || userData.country
59
+ };
60
+ const phoneResult = validatePhone(userData.phone, phoneOptions);
61
+ data.phone = phoneResult;
62
+ sanitized.phone = phoneResult.formatted.e164 || userData.phone;
63
+ if (!phoneResult.isValid) {
64
+ errors2.push(...phoneResult.errors);
65
+ }
66
+ }
67
+ if (userData.username !== void 0) {
68
+ const usernameResult = validateUsername(userData.username, opts.username);
69
+ data.username = usernameResult;
70
+ sanitized.username = usernameResult.sanitized;
71
+ if (!usernameResult.isValid) {
72
+ errors2.push(...usernameResult.errors);
73
+ }
74
+ }
75
+ if (userData.password !== void 0) {
76
+ const passwordResult = checkPasswordStrength(userData.password);
77
+ if (passwordResult.score < 2) {
78
+ errors2.push({
79
+ field: "password",
80
+ code: "WEAK_PASSWORD",
81
+ message: "Password is too weak. " + (passwordResult.suggestions[0] || "")
82
+ });
83
+ }
84
+ }
85
+ if (userData.dateOfBirth !== void 0) {
86
+ const ageResult = calculateAge(userData.dateOfBirth);
87
+ if (ageResult.years === 0 && typeof userData.dateOfBirth === "string") {
88
+ errors2.push({
89
+ field: "dateOfBirth",
90
+ code: "INVALID_DATE",
91
+ message: "Invalid date of birth"
92
+ });
93
+ }
94
+ }
95
+ if (userData.country !== void 0) {
96
+ sanitized.country = userData.country.toUpperCase();
97
+ }
98
+ return {
99
+ isValid: errors2.length === 0,
100
+ errors: errors2,
101
+ data,
102
+ sanitized
103
+ };
104
+ }
105
+ function isValidUser(userData, options = {}) {
106
+ return validateUser(userData, options).isValid;
107
+ }
108
+ function getUserErrors(userData, options = {}) {
109
+ const result = validateUser(userData, options);
110
+ const errorsByField = {};
111
+ for (const error of result.errors) {
112
+ if (!errorsByField[error.field]) {
113
+ errorsByField[error.field] = [];
114
+ }
115
+ errorsByField[error.field].push(error.message);
116
+ }
117
+ return errorsByField;
118
+ }
119
+
120
+ // src/cache/index.ts
121
+ var Cache = class {
122
+ items;
123
+ maxSize;
124
+ ttl;
125
+ /**
126
+ * Create a new Cache instance
127
+ * @param options - Cache options
128
+ */
129
+ constructor(options = {}) {
130
+ this.items = /* @__PURE__ */ new Map();
131
+ this.maxSize = options.maxSize || 100;
132
+ this.ttl = options.ttl || Infinity;
133
+ }
134
+ /**
135
+ * Get an item from the cache
136
+ * @param key - Cache key
137
+ * @returns Cached value or undefined
138
+ */
139
+ get(key) {
140
+ const item = this.items.get(key);
141
+ if (!item) return void 0;
142
+ if (Date.now() > item.expiry) {
143
+ this.items.delete(key);
144
+ return void 0;
145
+ }
146
+ this.items.delete(key);
147
+ this.items.set(key, item);
148
+ return item.value;
149
+ }
150
+ /**
151
+ * Set an item in the cache
152
+ * @param key - Cache key
153
+ * @param value - Value to cache
154
+ */
155
+ set(key, value) {
156
+ if (this.items.size >= this.maxSize) {
157
+ const firstKey = this.items.keys().next().value;
158
+ if (firstKey) this.items.delete(firstKey);
159
+ }
160
+ const expiry = this.ttl === Infinity ? Infinity : Date.now() + this.ttl;
161
+ this.items.set(key, { value, expiry });
162
+ }
163
+ /**
164
+ * Check if item exists and is valid
165
+ * @param key - Cache key
166
+ */
167
+ has(key) {
168
+ const item = this.items.get(key);
169
+ if (!item) return false;
170
+ if (Date.now() > item.expiry) {
171
+ this.items.delete(key);
172
+ return false;
173
+ }
174
+ return true;
175
+ }
176
+ /**
177
+ * Clear the cache
178
+ */
179
+ clear() {
180
+ this.items.clear();
181
+ }
182
+ /**
183
+ * Get current size
184
+ */
185
+ get size() {
186
+ return this.items.size;
187
+ }
188
+ };
189
+ var defaultCache = new Cache({ maxSize: 1e3, ttl: 60 * 60 * 1e3 });
190
+
191
+ // src/middleware/index.ts
192
+ var Pipeline = class {
193
+ middlewares = [];
194
+ /**
195
+ * Add a middleware to the pipeline
196
+ * @param middleware - Middleware function
197
+ * @returns The pipeline instance for chaining
198
+ */
199
+ use(middleware) {
200
+ this.middlewares.push(middleware);
201
+ return this;
202
+ }
203
+ /**
204
+ * Execute the pipeline with the given context
205
+ * @param context - Initial context data
206
+ * @returns The processed context
207
+ */
208
+ async execute(context) {
209
+ let index = -1;
210
+ const dispatch = async (i) => {
211
+ if (i <= index) throw new Error("next() called multiple times");
212
+ index = i;
213
+ const fn = this.middlewares[i];
214
+ if (i === this.middlewares.length) return;
215
+ if (!fn) return;
216
+ await fn(context, () => dispatch(i + 1));
217
+ };
218
+ await dispatch(0);
219
+ return context;
220
+ }
221
+ };
222
+ function compose(...fns) {
223
+ return (arg) => fns.reduce((acc, fn) => fn(acc), arg);
224
+ }
225
+ function composeAsync(...fns) {
226
+ return async (arg) => {
227
+ let result = arg;
228
+ for (const fn of fns) {
229
+ result = await fn(result);
230
+ }
231
+ return result;
232
+ };
233
+ }
234
+
235
+ // src/errors/index.ts
236
+ var UtilitifyError = class extends Error {
237
+ code;
238
+ details;
239
+ constructor(message, code = "UNKNOWN_ERROR", details) {
240
+ super(message);
241
+ this.name = "UtilitifyError";
242
+ this.code = code;
243
+ this.details = details;
244
+ Object.setPrototypeOf(this, new.target.prototype);
245
+ }
246
+ };
247
+ var ValidationError = class extends UtilitifyError {
248
+ constructor(message, details) {
249
+ super(message, "VALIDATION_ERROR", details);
250
+ this.name = "ValidationError";
251
+ }
252
+ };
253
+ var SecurityError = class extends UtilitifyError {
254
+ constructor(message, details) {
255
+ super(message, "SECURITY_ERROR", details);
256
+ this.name = "SecurityError";
257
+ }
258
+ };
259
+ var ConfigurationError = class extends UtilitifyError {
260
+ constructor(message, details) {
261
+ super(message, "CONFIGURATION_ERROR", details);
262
+ this.name = "ConfigurationError";
263
+ }
264
+ };
265
+ var TimeoutError = class extends UtilitifyError {
266
+ constructor(message = "Operation timed out", details) {
267
+ super(message, "TIMEOUT_ERROR", details);
268
+ this.name = "TimeoutError";
269
+ }
270
+ };
271
+ function isUtilitifyError(error) {
272
+ return error instanceof UtilitifyError;
273
+ }
274
+
275
+ export { Cache, ConfigurationError, Pipeline, SecurityError, TimeoutError, UtilitifyError, ValidationError, compose, composeAsync, defaultCache, getUserErrors, isUtilitifyError, isValidUser, validateUser };
276
+ //# sourceMappingURL=index.js.map
277
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/unified/validateUser.ts","../src/cache/index.ts","../src/middleware/index.ts","../src/errors/index.ts"],"names":["errors"],"mappings":"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","file":"index.js","sourcesContent":["import type {\r\n UserData,\r\n UserValidationOptions,\r\n UserValidationResult,\r\n IValidationError,\r\n} from '../types';\r\nimport { validateEmail } from '../validators/email';\r\nimport { validateName } from '../validators/name';\r\nimport { validatePhone } from '../validators/phone';\r\nimport { validateUsername } from '../validators/username';\r\nimport { checkPasswordStrength } from '../security/password';\r\nimport { calculateAge } from '../date/age';\r\n\r\n/**\r\n * Default validation options\r\n */\r\nconst DEFAULT_OPTIONS: UserValidationOptions = {\r\n required: [],\r\n};\r\n\r\n/**\r\n * Validate user data with automatic field detection\r\n *\r\n * This is the unified validation function that validates all provided\r\n * user fields and returns standardized errors.\r\n *\r\n * @param userData - User data to validate\r\n * @param options - Validation options\r\n * @returns Validation result with all errors\r\n *\r\n * @example\r\n * ```typescript\r\n * import { validateUser } from 'utilitify';\r\n *\r\n * const result = validateUser({\r\n * name: 'John Doe',\r\n * email: 'john@example.com',\r\n * phone: '+1 555-123-4567',\r\n * country: 'US',\r\n * password: 'MyP@ssw0rd!'\r\n * });\r\n *\r\n * if (!result.isValid) {\r\n * console.log(result.errors);\r\n * }\r\n * ```\r\n */\r\nexport function validateUser(\r\n userData: UserData,\r\n options: UserValidationOptions = {}\r\n): UserValidationResult {\r\n const opts = { ...DEFAULT_OPTIONS, ...options };\r\n const errors: IValidationError[] = [];\r\n const data: UserValidationResult['data'] = {};\r\n const sanitized: Partial<UserData> = {};\r\n\r\n // Check required fields\r\n for (const field of opts.required || []) {\r\n const value = userData[field];\r\n if (value === undefined || value === null || value === '') {\r\n errors.push({\r\n field,\r\n code: 'REQUIRED',\r\n message: `${field} is required`,\r\n });\r\n }\r\n }\r\n\r\n // Validate name\r\n if (userData.name !== undefined) {\r\n const nameResult = validateName(userData.name, opts.name);\r\n data.name = nameResult;\r\n sanitized.name = nameResult.sanitized;\r\n\r\n if (!nameResult.isValid) {\r\n errors.push(...nameResult.errors);\r\n }\r\n }\r\n\r\n // Validate email\r\n if (userData.email !== undefined) {\r\n const emailResult = validateEmail(userData.email, opts.email);\r\n data.email = emailResult;\r\n sanitized.email = emailResult.normalized;\r\n\r\n if (!emailResult.isValid) {\r\n errors.push(...emailResult.errors);\r\n }\r\n }\r\n\r\n // Validate phone (use country if provided)\r\n if (userData.phone !== undefined) {\r\n const phoneOptions = {\r\n ...opts.phone,\r\n countryCode: opts.phone?.countryCode || userData.country,\r\n };\r\n const phoneResult = validatePhone(userData.phone, phoneOptions);\r\n data.phone = phoneResult;\r\n sanitized.phone = phoneResult.formatted.e164 || userData.phone;\r\n\r\n if (!phoneResult.isValid) {\r\n errors.push(...phoneResult.errors);\r\n }\r\n }\r\n\r\n // Validate username\r\n if (userData.username !== undefined) {\r\n const usernameResult = validateUsername(userData.username, opts.username);\r\n data.username = usernameResult;\r\n sanitized.username = usernameResult.sanitized;\r\n\r\n if (!usernameResult.isValid) {\r\n errors.push(...usernameResult.errors);\r\n }\r\n }\r\n\r\n // Check password strength (doesn't add to errors, just provides info)\r\n if (userData.password !== undefined) {\r\n const passwordResult = checkPasswordStrength(userData.password);\r\n\r\n // Only add error if password is very weak\r\n if (passwordResult.score < 2) {\r\n errors.push({\r\n field: 'password',\r\n code: 'WEAK_PASSWORD',\r\n message: 'Password is too weak. ' + (passwordResult.suggestions[0] || ''),\r\n });\r\n }\r\n }\r\n\r\n // Validate date of birth / calculate age\r\n if (userData.dateOfBirth !== undefined) {\r\n const ageResult = calculateAge(userData.dateOfBirth);\r\n\r\n if (ageResult.years === 0 && typeof userData.dateOfBirth === 'string') {\r\n errors.push({\r\n field: 'dateOfBirth',\r\n code: 'INVALID_DATE',\r\n message: 'Invalid date of birth',\r\n });\r\n }\r\n }\r\n\r\n // Copy unvalidated fields\r\n if (userData.country !== undefined) {\r\n sanitized.country = userData.country.toUpperCase();\r\n }\r\n\r\n return {\r\n isValid: errors.length === 0,\r\n errors,\r\n data,\r\n sanitized,\r\n };\r\n}\r\n\r\n/**\r\n * Quick validate - returns boolean only\r\n *\r\n * @param userData - User data to validate\r\n * @param options - Validation options\r\n * @returns true if all validations pass\r\n */\r\nexport function isValidUser(\r\n userData: UserData,\r\n options: UserValidationOptions = {}\r\n): boolean {\r\n return validateUser(userData, options).isValid;\r\n}\r\n\r\n/**\r\n * Get validation errors as simple object\r\n *\r\n * @param userData - User data to validate\r\n * @param options - Validation options\r\n * @returns Object with field names as keys and array of error messages as values\r\n */\r\nexport function getUserErrors(\r\n userData: UserData,\r\n options: UserValidationOptions = {}\r\n): Record<string, string[]> {\r\n const result = validateUser(userData, options);\r\n const errorsByField: Record<string, string[]> = {};\r\n\r\n for (const error of result.errors) {\r\n if (!errorsByField[error.field]) {\r\n errorsByField[error.field] = [];\r\n }\r\n errorsByField[error.field].push(error.message);\r\n }\r\n\r\n return errorsByField;\r\n}\r\n","/**\r\n * Simple LRU (Least Recently Used) Cache implementation\r\n * Used for caching expensive validation results or country data lookups.\r\n *\r\n * @packageDocumentation\r\n * @since 1.2.0\r\n */\r\n\r\nexport interface CacheOptions {\r\n /** Maximum number of items to store (default: 100) */\r\n maxSize?: number;\r\n /** Time to live in milliseconds (default: Infinity) */\r\n ttl?: number;\r\n}\r\n\r\ninterface CacheEntry<T> {\r\n value: T;\r\n expiry: number;\r\n}\r\n\r\n/**\r\n * LRU Cache class\r\n */\r\nexport class Cache<T = any> {\r\n private items: Map<string, CacheEntry<T>>;\r\n private maxSize: number;\r\n private ttl: number;\r\n\r\n /**\r\n * Create a new Cache instance\r\n * @param options - Cache options\r\n */\r\n constructor(options: CacheOptions = {}) {\r\n this.items = new Map();\r\n this.maxSize = options.maxSize || 100;\r\n this.ttl = options.ttl || Infinity;\r\n }\r\n\r\n /**\r\n * Get an item from the cache\r\n * @param key - Cache key\r\n * @returns Cached value or undefined\r\n */\r\n get(key: string): T | undefined {\r\n const item = this.items.get(key);\r\n\r\n if (!item) return undefined;\r\n\r\n // Check expiry\r\n if (Date.now() > item.expiry) {\r\n this.items.delete(key);\r\n return undefined;\r\n }\r\n\r\n // Refresh position (LRU) - delete and re-insert makes it the \"newest\"\r\n this.items.delete(key);\r\n this.items.set(key, item);\r\n\r\n return item.value;\r\n }\r\n\r\n /**\r\n * Set an item in the cache\r\n * @param key - Cache key\r\n * @param value - Value to cache\r\n */\r\n set(key: string, value: T): void {\r\n // Evict oldest if full\r\n if (this.items.size >= this.maxSize) {\r\n const firstKey = this.items.keys().next().value;\r\n if (firstKey) this.items.delete(firstKey);\r\n }\r\n\r\n const expiry = this.ttl === Infinity ? Infinity : Date.now() + this.ttl;\r\n this.items.set(key, { value, expiry });\r\n }\r\n\r\n /**\r\n * Check if item exists and is valid\r\n * @param key - Cache key\r\n */\r\n has(key: string): boolean {\r\n const item = this.items.get(key);\r\n if (!item) return false;\r\n if (Date.now() > item.expiry) {\r\n this.items.delete(key);\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Clear the cache\r\n */\r\n clear(): void {\r\n this.items.clear();\r\n }\r\n\r\n /**\r\n * Get current size\r\n */\r\n get size(): number {\r\n return this.items.size;\r\n }\r\n}\r\n\r\n/**\r\n * Global default cache instance\r\n */\r\nexport const defaultCache = new Cache({ maxSize: 1000, ttl: 60 * 60 * 1000 });\r\n","/**\r\n * Middleware Pattern for data processing and validation pipelines\r\n * Allows composition of multiple functions into a single executable pipeline.\r\n *\r\n * @packageDocumentation\r\n * @since 1.2.0\r\n */\r\n\r\n/**\r\n * Middleware function type\r\n * @param context - The context/data being processed\r\n * @param next - Function to call the next middleware\r\n */\r\nexport type Middleware<T = any> = (context: T, next: () => Promise<void> | void) => Promise<void> | void;\r\n\r\n/**\r\n * Pipeline class for managing middleware execution\r\n */\r\nexport class Pipeline<T = any> {\r\n private middlewares: Middleware<T>[] = [];\r\n\r\n /**\r\n * Add a middleware to the pipeline\r\n * @param middleware - Middleware function\r\n * @returns The pipeline instance for chaining\r\n */\r\n use(middleware: Middleware<T>): this {\r\n this.middlewares.push(middleware);\r\n return this;\r\n }\r\n\r\n /**\r\n * Execute the pipeline with the given context\r\n * @param context - Initial context data\r\n * @returns The processed context\r\n */\r\n async execute(context: T): Promise<T> {\r\n let index = -1;\r\n\r\n const dispatch = async (i: number): Promise<void> => {\r\n if (i <= index) throw new Error('next() called multiple times');\r\n index = i;\r\n\r\n const fn = this.middlewares[i];\r\n if (i === this.middlewares.length) return;\r\n\r\n if (!fn) return;\r\n\r\n await fn(context, () => dispatch(i + 1));\r\n };\r\n\r\n await dispatch(0);\r\n return context;\r\n }\r\n}\r\n\r\n/**\r\n * Compose multiple functions into a single function (L-to-R)\r\n * @param fns - Functions to compose\r\n * @returns Composed function\r\n */\r\nexport function compose<T>(...fns: Array<(arg: T) => T>): (arg: T) => T {\r\n return (arg: T) => fns.reduce((acc, fn) => fn(acc), arg);\r\n}\r\n\r\n/**\r\n * Async compose for Promise-returning functions\r\n * @param fns - Async functions to compose\r\n * @returns Composed async function\r\n */\r\nexport function composeAsync<T>(...fns: Array<(arg: T) => Promise<T> | T>): (arg: T) => Promise<T> {\r\n return async (arg: T) => {\r\n let result = arg;\r\n for (const fn of fns) {\r\n result = await fn(result);\r\n }\r\n return result;\r\n };\r\n}\r\n","/**\r\n * Standardized Error Handling Module\r\n * Provides a hierarchy of error classes for consistent error reporting.\r\n *\r\n * @packageDocumentation\r\n * @since 1.2.0\r\n */\r\n\r\n/**\r\n * Base error class for all utility errors\r\n */\r\nexport class UtilitifyError extends Error {\r\n public code: string;\r\n public details?: any;\r\n\r\n constructor(message: string, code: string = 'UNKNOWN_ERROR', details?: any) {\r\n super(message);\r\n this.name = 'UtilitifyError';\r\n this.code = code;\r\n this.details = details;\r\n Object.setPrototypeOf(this, new.target.prototype);\r\n }\r\n}\r\n\r\n/**\r\n * Error thrown when validation fails\r\n */\r\nexport class ValidationError extends UtilitifyError {\r\n constructor(message: string, details?: any) {\r\n super(message, 'VALIDATION_ERROR', details);\r\n this.name = 'ValidationError';\r\n }\r\n}\r\n\r\n/**\r\n * Error thrown when a security check fails\r\n */\r\nexport class SecurityError extends UtilitifyError {\r\n constructor(message: string, details?: any) {\r\n super(message, 'SECURITY_ERROR', details);\r\n this.name = 'SecurityError';\r\n }\r\n}\r\n\r\n/**\r\n * Error thrown when configuration is invalid\r\n */\r\nexport class ConfigurationError extends UtilitifyError {\r\n constructor(message: string, details?: any) {\r\n super(message, 'CONFIGURATION_ERROR', details);\r\n this.name = 'ConfigurationError';\r\n }\r\n}\r\n\r\n/**\r\n * Error thrown when an operation times out\r\n */\r\nexport class TimeoutError extends UtilitifyError {\r\n constructor(message: string = 'Operation timed out', details?: any) {\r\n super(message, 'TIMEOUT_ERROR', details);\r\n this.name = 'TimeoutError';\r\n }\r\n}\r\n\r\n/**\r\n * Helper to check if an error is a specific Utilitify error\r\n */\r\nexport function isUtilitifyError(error: unknown): error is UtilitifyError {\r\n return error instanceof UtilitifyError;\r\n}\r\n"]}
@@ -0,0 +1,13 @@
1
+ 'use strict';
2
+
3
+ var chunkC5R744DY_cjs = require('./chunk-C5R744DY.cjs');
4
+ require('./chunk-CZLDE2OZ.cjs');
5
+
6
+
7
+
8
+ Object.defineProperty(exports, "z", {
9
+ enumerable: true,
10
+ get: function () { return chunkC5R744DY_cjs.z; }
11
+ });
12
+ //# sourceMappingURL=schema.cjs.map
13
+ //# sourceMappingURL=schema.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"schema.cjs"}
@@ -0,0 +1,84 @@
1
+ import { I as IValidationError } from './common-CBDYNJeh.cjs';
2
+
3
+ /**
4
+ * Schema Builder API
5
+ * A lightweight, Zod-inspired schema validation system
6
+ *
7
+ * @packageDocumentation
8
+ * @since 1.1.0
9
+ */
10
+
11
+ type ParseResult<T> = {
12
+ success: true;
13
+ data: T;
14
+ } | {
15
+ success: false;
16
+ errors: IValidationError[];
17
+ };
18
+ /**
19
+ * Base Schema class
20
+ */
21
+ declare abstract class Schema<T> {
22
+ abstract parse(value: unknown): T;
23
+ safeParse(value: unknown): ParseResult<T>;
24
+ optional(): Schema<T | undefined>;
25
+ nullable(): Schema<T | null>;
26
+ }
27
+ /**
28
+ * String Schema
29
+ */
30
+ declare class StringSchema extends Schema<string> {
31
+ private checks;
32
+ parse(value: unknown): string;
33
+ min(length: number, message?: string): this;
34
+ max(length: number, message?: string): this;
35
+ email(message?: string): this;
36
+ }
37
+ /**
38
+ * Number Schema
39
+ */
40
+ declare class NumberSchema extends Schema<number> {
41
+ private checks;
42
+ parse(value: unknown): number;
43
+ min(min: number, message?: string): this;
44
+ max(max: number, message?: string): this;
45
+ int(message?: string): this;
46
+ }
47
+ /**
48
+ * Boolean Schema
49
+ */
50
+ declare class BooleanSchema extends Schema<boolean> {
51
+ parse(value: unknown): boolean;
52
+ }
53
+ /**
54
+ * Object Schema
55
+ */
56
+ declare class ObjectSchema<T extends Record<string, Schema<any>>> extends Schema<{
57
+ [K in keyof T]: T[K] extends Schema<infer U> ? U : never;
58
+ }> {
59
+ private shape;
60
+ constructor(shape: T);
61
+ parse(value: unknown): {
62
+ [K in keyof T]: T[K] extends Schema<infer U> ? U : never;
63
+ };
64
+ }
65
+ /**
66
+ * Array Schema
67
+ */
68
+ declare class ArraySchema<T> extends Schema<T[]> {
69
+ private itemSchema;
70
+ constructor(itemSchema: Schema<T>);
71
+ parse(value: unknown): T[];
72
+ }
73
+ /**
74
+ * Entry point for Schema Builder
75
+ */
76
+ declare const z: {
77
+ string: () => StringSchema;
78
+ number: () => NumberSchema;
79
+ boolean: () => BooleanSchema;
80
+ object: <T extends Record<string, Schema<any>>>(shape: T) => ObjectSchema<T>;
81
+ array: <T>(schema: Schema<T>) => ArraySchema<T>;
82
+ };
83
+
84
+ export { type ParseResult, z };
@@ -0,0 +1,84 @@
1
+ import { I as IValidationError } from './common-CBDYNJeh.js';
2
+
3
+ /**
4
+ * Schema Builder API
5
+ * A lightweight, Zod-inspired schema validation system
6
+ *
7
+ * @packageDocumentation
8
+ * @since 1.1.0
9
+ */
10
+
11
+ type ParseResult<T> = {
12
+ success: true;
13
+ data: T;
14
+ } | {
15
+ success: false;
16
+ errors: IValidationError[];
17
+ };
18
+ /**
19
+ * Base Schema class
20
+ */
21
+ declare abstract class Schema<T> {
22
+ abstract parse(value: unknown): T;
23
+ safeParse(value: unknown): ParseResult<T>;
24
+ optional(): Schema<T | undefined>;
25
+ nullable(): Schema<T | null>;
26
+ }
27
+ /**
28
+ * String Schema
29
+ */
30
+ declare class StringSchema extends Schema<string> {
31
+ private checks;
32
+ parse(value: unknown): string;
33
+ min(length: number, message?: string): this;
34
+ max(length: number, message?: string): this;
35
+ email(message?: string): this;
36
+ }
37
+ /**
38
+ * Number Schema
39
+ */
40
+ declare class NumberSchema extends Schema<number> {
41
+ private checks;
42
+ parse(value: unknown): number;
43
+ min(min: number, message?: string): this;
44
+ max(max: number, message?: string): this;
45
+ int(message?: string): this;
46
+ }
47
+ /**
48
+ * Boolean Schema
49
+ */
50
+ declare class BooleanSchema extends Schema<boolean> {
51
+ parse(value: unknown): boolean;
52
+ }
53
+ /**
54
+ * Object Schema
55
+ */
56
+ declare class ObjectSchema<T extends Record<string, Schema<any>>> extends Schema<{
57
+ [K in keyof T]: T[K] extends Schema<infer U> ? U : never;
58
+ }> {
59
+ private shape;
60
+ constructor(shape: T);
61
+ parse(value: unknown): {
62
+ [K in keyof T]: T[K] extends Schema<infer U> ? U : never;
63
+ };
64
+ }
65
+ /**
66
+ * Array Schema
67
+ */
68
+ declare class ArraySchema<T> extends Schema<T[]> {
69
+ private itemSchema;
70
+ constructor(itemSchema: Schema<T>);
71
+ parse(value: unknown): T[];
72
+ }
73
+ /**
74
+ * Entry point for Schema Builder
75
+ */
76
+ declare const z: {
77
+ string: () => StringSchema;
78
+ number: () => NumberSchema;
79
+ boolean: () => BooleanSchema;
80
+ object: <T extends Record<string, Schema<any>>>(shape: T) => ObjectSchema<T>;
81
+ array: <T>(schema: Schema<T>) => ArraySchema<T>;
82
+ };
83
+
84
+ export { type ParseResult, z };
package/dist/schema.js ADDED
@@ -0,0 +1,4 @@
1
+ export { z } from './chunk-HOTOYIPB.js';
2
+ import './chunk-4CV4JOE5.js';
3
+ //# sourceMappingURL=schema.js.map
4
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"schema.js"}
@@ -0,0 +1,94 @@
1
+ 'use strict';
2
+
3
+ var chunk2ICNRTSN_cjs = require('../chunk-2ICNRTSN.cjs');
4
+ require('../chunk-P7P2B7ZI.cjs');
5
+ require('../chunk-CZLDE2OZ.cjs');
6
+
7
+
8
+
9
+ Object.defineProperty(exports, "checkPasswordStrength", {
10
+ enumerable: true,
11
+ get: function () { return chunk2ICNRTSN_cjs.checkPasswordStrength; }
12
+ });
13
+ Object.defineProperty(exports, "generateBase64Token", {
14
+ enumerable: true,
15
+ get: function () { return chunk2ICNRTSN_cjs.generateBase64Token; }
16
+ });
17
+ Object.defineProperty(exports, "generateNanoId", {
18
+ enumerable: true,
19
+ get: function () { return chunk2ICNRTSN_cjs.generateNanoId; }
20
+ });
21
+ Object.defineProperty(exports, "generateSecureToken", {
22
+ enumerable: true,
23
+ get: function () { return chunk2ICNRTSN_cjs.generateSecureToken; }
24
+ });
25
+ Object.defineProperty(exports, "generateShortId", {
26
+ enumerable: true,
27
+ get: function () { return chunk2ICNRTSN_cjs.generateShortId; }
28
+ });
29
+ Object.defineProperty(exports, "generateToken", {
30
+ enumerable: true,
31
+ get: function () { return chunk2ICNRTSN_cjs.generateToken; }
32
+ });
33
+ Object.defineProperty(exports, "generateUUID", {
34
+ enumerable: true,
35
+ get: function () { return chunk2ICNRTSN_cjs.generateUUID; }
36
+ });
37
+ Object.defineProperty(exports, "generateUUIDv7", {
38
+ enumerable: true,
39
+ get: function () { return chunk2ICNRTSN_cjs.generateUUIDv7; }
40
+ });
41
+ Object.defineProperty(exports, "generateUrlSafeToken", {
42
+ enumerable: true,
43
+ get: function () { return chunk2ICNRTSN_cjs.generateUrlSafeToken; }
44
+ });
45
+ Object.defineProperty(exports, "getPasswordFeedback", {
46
+ enumerable: true,
47
+ get: function () { return chunk2ICNRTSN_cjs.getPasswordFeedback; }
48
+ });
49
+ Object.defineProperty(exports, "getUUIDv7Timestamp", {
50
+ enumerable: true,
51
+ get: function () { return chunk2ICNRTSN_cjs.getUUIDv7Timestamp; }
52
+ });
53
+ Object.defineProperty(exports, "hashBcrypt", {
54
+ enumerable: true,
55
+ get: function () { return chunk2ICNRTSN_cjs.hashBcrypt; }
56
+ });
57
+ Object.defineProperty(exports, "hashMD5", {
58
+ enumerable: true,
59
+ get: function () { return chunk2ICNRTSN_cjs.hashMD5; }
60
+ });
61
+ Object.defineProperty(exports, "hashSHA256", {
62
+ enumerable: true,
63
+ get: function () { return chunk2ICNRTSN_cjs.hashSHA256; }
64
+ });
65
+ Object.defineProperty(exports, "hashSHA512", {
66
+ enumerable: true,
67
+ get: function () { return chunk2ICNRTSN_cjs.hashSHA512; }
68
+ });
69
+ Object.defineProperty(exports, "hmacSHA256", {
70
+ enumerable: true,
71
+ get: function () { return chunk2ICNRTSN_cjs.hmacSHA256; }
72
+ });
73
+ Object.defineProperty(exports, "isStrongPassword", {
74
+ enumerable: true,
75
+ get: function () { return chunk2ICNRTSN_cjs.isStrongPassword; }
76
+ });
77
+ Object.defineProperty(exports, "isValidUUID", {
78
+ enumerable: true,
79
+ get: function () { return chunk2ICNRTSN_cjs.isValidUUID; }
80
+ });
81
+ Object.defineProperty(exports, "meetsRequirements", {
82
+ enumerable: true,
83
+ get: function () { return chunk2ICNRTSN_cjs.meetsRequirements; }
84
+ });
85
+ Object.defineProperty(exports, "timingSafeCompare", {
86
+ enumerable: true,
87
+ get: function () { return chunk2ICNRTSN_cjs.timingSafeCompare; }
88
+ });
89
+ Object.defineProperty(exports, "verifyBcrypt", {
90
+ enumerable: true,
91
+ get: function () { return chunk2ICNRTSN_cjs.verifyBcrypt; }
92
+ });
93
+ //# sourceMappingURL=index.cjs.map
94
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.cjs"}