@exyconn/common 1.0.0 → 2.1.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.
- package/README.md +121 -36
- package/dist/client/index.d.mts +3 -2
- package/dist/client/index.d.ts +3 -2
- package/dist/client/index.js +5059 -231
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +4951 -232
- package/dist/client/index.mjs.map +1 -1
- package/dist/client/utils/index.d.mts +123 -1
- package/dist/client/utils/index.d.ts +123 -1
- package/dist/client/utils/index.js +207 -0
- package/dist/client/utils/index.js.map +1 -1
- package/dist/client/utils/index.mjs +204 -1
- package/dist/client/utils/index.mjs.map +1 -1
- package/dist/index-BcxL4_V4.d.ts +2946 -0
- package/dist/{index-iTKxFa78.d.ts → index-DEzgM15j.d.ts} +10 -2
- package/dist/{index-ClWtDfwk.d.ts → index-DNFVgQx8.d.ts} +544 -2
- package/dist/{index-CcrANHAQ.d.mts → index-DbV04Dx8.d.mts} +10 -2
- package/dist/{index-DSW6JfD-.d.mts → index-DfqEP6Oe.d.mts} +544 -2
- package/dist/index-bvvCev9Q.d.mts +2946 -0
- package/dist/index.d.mts +433 -7
- package/dist/index.d.ts +433 -7
- package/dist/index.js +6101 -220
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +6083 -221
- package/dist/index.mjs.map +1 -1
- package/dist/server/index.d.mts +1 -1
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.js +197 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +194 -2
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/utils/index.d.mts +73 -1
- package/dist/server/utils/index.d.ts +73 -1
- package/dist/server/utils/index.js +199 -0
- package/dist/server/utils/index.js.map +1 -1
- package/dist/server/utils/index.mjs +195 -1
- package/dist/server/utils/index.mjs.map +1 -1
- package/dist/shared/index.d.mts +1 -1
- package/dist/shared/index.d.ts +1 -1
- package/dist/shared/index.js +296 -0
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/index.mjs +274 -1
- package/dist/shared/index.mjs.map +1 -1
- package/package.json +41 -4
- package/dist/index-BNdT-2X4.d.ts +0 -229
- package/dist/index-Du0LLt9f.d.mts +0 -229
package/dist/shared/index.mjs
CHANGED
|
@@ -134,6 +134,279 @@ var TOKEN_TYPES = {
|
|
|
134
134
|
RESET_PASSWORD: "reset_password",
|
|
135
135
|
EMAIL_VERIFICATION: "email_verification"
|
|
136
136
|
};
|
|
137
|
+
|
|
138
|
+
// src/shared/constants/enums.ts
|
|
139
|
+
var STATUS2 = {
|
|
140
|
+
ACTIVE: "active",
|
|
141
|
+
INACTIVE: "inactive",
|
|
142
|
+
PENDING: "pending",
|
|
143
|
+
APPROVED: "approved",
|
|
144
|
+
REJECTED: "rejected",
|
|
145
|
+
ARCHIVED: "archived",
|
|
146
|
+
DELETED: "deleted",
|
|
147
|
+
DRAFT: "draft",
|
|
148
|
+
PUBLISHED: "published",
|
|
149
|
+
SUSPENDED: "suspended",
|
|
150
|
+
EXPIRED: "expired",
|
|
151
|
+
CANCELLED: "cancelled"
|
|
152
|
+
};
|
|
153
|
+
var USER_STATUS2 = {
|
|
154
|
+
ACTIVE: "active",
|
|
155
|
+
INACTIVE: "inactive",
|
|
156
|
+
PENDING: "pending",
|
|
157
|
+
SUSPENDED: "suspended",
|
|
158
|
+
BANNED: "banned",
|
|
159
|
+
DELETED: "deleted",
|
|
160
|
+
UNVERIFIED: "unverified",
|
|
161
|
+
VERIFIED: "verified"
|
|
162
|
+
};
|
|
163
|
+
var ORDER_STATUS = {
|
|
164
|
+
PENDING: "pending",
|
|
165
|
+
CONFIRMED: "confirmed",
|
|
166
|
+
PROCESSING: "processing",
|
|
167
|
+
SHIPPED: "shipped",
|
|
168
|
+
DELIVERED: "delivered",
|
|
169
|
+
CANCELLED: "cancelled",
|
|
170
|
+
REFUNDED: "refunded",
|
|
171
|
+
FAILED: "failed",
|
|
172
|
+
ON_HOLD: "on_hold"
|
|
173
|
+
};
|
|
174
|
+
var PAYMENT_STATUS = {
|
|
175
|
+
PENDING: "pending",
|
|
176
|
+
PROCESSING: "processing",
|
|
177
|
+
COMPLETED: "completed",
|
|
178
|
+
FAILED: "failed",
|
|
179
|
+
CANCELLED: "cancelled",
|
|
180
|
+
REFUNDED: "refunded",
|
|
181
|
+
PARTIALLY_REFUNDED: "partially_refunded",
|
|
182
|
+
DISPUTED: "disputed"
|
|
183
|
+
};
|
|
184
|
+
var TASK_STATUS = {
|
|
185
|
+
TODO: "todo",
|
|
186
|
+
IN_PROGRESS: "in_progress",
|
|
187
|
+
IN_REVIEW: "in_review",
|
|
188
|
+
DONE: "done",
|
|
189
|
+
BLOCKED: "blocked",
|
|
190
|
+
CANCELLED: "cancelled",
|
|
191
|
+
ON_HOLD: "on_hold"
|
|
192
|
+
};
|
|
193
|
+
var SUBSCRIPTION_STATUS = {
|
|
194
|
+
ACTIVE: "active",
|
|
195
|
+
TRIAL: "trial",
|
|
196
|
+
PAST_DUE: "past_due",
|
|
197
|
+
CANCELLED: "cancelled",
|
|
198
|
+
EXPIRED: "expired",
|
|
199
|
+
PAUSED: "paused",
|
|
200
|
+
PENDING: "pending"
|
|
201
|
+
};
|
|
202
|
+
var SORT_DIRECTION = {
|
|
203
|
+
ASC: "asc",
|
|
204
|
+
DESC: "desc"
|
|
205
|
+
};
|
|
206
|
+
var SORT = {
|
|
207
|
+
// Date sorting
|
|
208
|
+
NEWEST: "newest",
|
|
209
|
+
OLDEST: "oldest",
|
|
210
|
+
CREATED_AT_ASC: "created_at_asc",
|
|
211
|
+
CREATED_AT_DESC: "created_at_desc",
|
|
212
|
+
UPDATED_AT_ASC: "updated_at_asc",
|
|
213
|
+
UPDATED_AT_DESC: "updated_at_desc",
|
|
214
|
+
// Alphabetical
|
|
215
|
+
NAME_ASC: "name_asc",
|
|
216
|
+
NAME_DESC: "name_desc",
|
|
217
|
+
TITLE_ASC: "title_asc",
|
|
218
|
+
TITLE_DESC: "title_desc",
|
|
219
|
+
ALPHABETICAL: "alphabetical",
|
|
220
|
+
REVERSE_ALPHABETICAL: "reverse_alphabetical",
|
|
221
|
+
// Numeric
|
|
222
|
+
PRICE_ASC: "price_asc",
|
|
223
|
+
PRICE_DESC: "price_desc",
|
|
224
|
+
AMOUNT_ASC: "amount_asc",
|
|
225
|
+
AMOUNT_DESC: "amount_desc",
|
|
226
|
+
// Popularity/Engagement
|
|
227
|
+
POPULAR: "popular",
|
|
228
|
+
TRENDING: "trending",
|
|
229
|
+
MOST_VIEWED: "most_viewed",
|
|
230
|
+
MOST_LIKED: "most_liked",
|
|
231
|
+
MOST_COMMENTED: "most_commented",
|
|
232
|
+
TOP_RATED: "top_rated",
|
|
233
|
+
// Relevance
|
|
234
|
+
RELEVANCE: "relevance",
|
|
235
|
+
BEST_MATCH: "best_match",
|
|
236
|
+
// Custom
|
|
237
|
+
CUSTOM: "custom",
|
|
238
|
+
MANUAL: "manual",
|
|
239
|
+
RANDOM: "random"
|
|
240
|
+
};
|
|
241
|
+
var ROLE = {
|
|
242
|
+
// System roles
|
|
243
|
+
SUPER_ADMIN: "super_admin",
|
|
244
|
+
ADMIN: "admin",
|
|
245
|
+
MODERATOR: "moderator",
|
|
246
|
+
SUPPORT: "support",
|
|
247
|
+
// User roles
|
|
248
|
+
USER: "user",
|
|
249
|
+
MEMBER: "member",
|
|
250
|
+
GUEST: "guest",
|
|
251
|
+
// Business roles
|
|
252
|
+
OWNER: "owner",
|
|
253
|
+
MANAGER: "manager",
|
|
254
|
+
EDITOR: "editor",
|
|
255
|
+
VIEWER: "viewer",
|
|
256
|
+
CONTRIBUTOR: "contributor",
|
|
257
|
+
// Team roles
|
|
258
|
+
TEAM_LEAD: "team_lead",
|
|
259
|
+
TEAM_MEMBER: "team_member",
|
|
260
|
+
// API roles
|
|
261
|
+
API_USER: "api_user",
|
|
262
|
+
SERVICE: "service",
|
|
263
|
+
BOT: "bot"
|
|
264
|
+
};
|
|
265
|
+
var PERMISSION_LEVEL = {
|
|
266
|
+
NONE: 0,
|
|
267
|
+
READ: 1,
|
|
268
|
+
WRITE: 2,
|
|
269
|
+
DELETE: 3,
|
|
270
|
+
ADMIN: 4,
|
|
271
|
+
SUPER_ADMIN: 5
|
|
272
|
+
};
|
|
273
|
+
var PRIORITY = {
|
|
274
|
+
LOWEST: "lowest",
|
|
275
|
+
LOW: "low",
|
|
276
|
+
MEDIUM: "medium",
|
|
277
|
+
HIGH: "high",
|
|
278
|
+
HIGHEST: "highest",
|
|
279
|
+
URGENT: "urgent",
|
|
280
|
+
CRITICAL: "critical"
|
|
281
|
+
};
|
|
282
|
+
var VISIBILITY = {
|
|
283
|
+
PUBLIC: "public",
|
|
284
|
+
PRIVATE: "private",
|
|
285
|
+
INTERNAL: "internal",
|
|
286
|
+
RESTRICTED: "restricted",
|
|
287
|
+
HIDDEN: "hidden",
|
|
288
|
+
UNLISTED: "unlisted"
|
|
289
|
+
};
|
|
290
|
+
var BREAKPOINTS = {
|
|
291
|
+
xs: 0,
|
|
292
|
+
sm: 640,
|
|
293
|
+
md: 768,
|
|
294
|
+
lg: 1024,
|
|
295
|
+
xl: 1280,
|
|
296
|
+
"2xl": 1536
|
|
297
|
+
};
|
|
298
|
+
var MEDIA_QUERIES = {
|
|
299
|
+
xs: "(min-width: 0px)",
|
|
300
|
+
sm: "(min-width: 640px)",
|
|
301
|
+
md: "(min-width: 768px)",
|
|
302
|
+
lg: "(min-width: 1024px)",
|
|
303
|
+
xl: "(min-width: 1280px)",
|
|
304
|
+
"2xl": "(min-width: 1536px)"
|
|
305
|
+
};
|
|
306
|
+
var MEDIA_QUERIES_MAX = {
|
|
307
|
+
xs: "(max-width: 639px)",
|
|
308
|
+
sm: "(max-width: 767px)",
|
|
309
|
+
md: "(max-width: 1023px)",
|
|
310
|
+
lg: "(max-width: 1279px)",
|
|
311
|
+
xl: "(max-width: 1535px)",
|
|
312
|
+
"2xl": "(max-width: 9999px)"
|
|
313
|
+
};
|
|
314
|
+
var CONTAINER_WIDTHS = {
|
|
315
|
+
sm: 640,
|
|
316
|
+
md: 768,
|
|
317
|
+
lg: 1024,
|
|
318
|
+
xl: 1280,
|
|
319
|
+
"2xl": 1536
|
|
320
|
+
};
|
|
321
|
+
var FILE_TYPE = {
|
|
322
|
+
IMAGE: "image",
|
|
323
|
+
VIDEO: "video",
|
|
324
|
+
AUDIO: "audio",
|
|
325
|
+
DOCUMENT: "document",
|
|
326
|
+
SPREADSHEET: "spreadsheet",
|
|
327
|
+
PRESENTATION: "presentation",
|
|
328
|
+
ARCHIVE: "archive",
|
|
329
|
+
CODE: "code",
|
|
330
|
+
OTHER: "other"
|
|
331
|
+
};
|
|
332
|
+
var NOTIFICATION_TYPE = {
|
|
333
|
+
INFO: "info",
|
|
334
|
+
SUCCESS: "success",
|
|
335
|
+
WARNING: "warning",
|
|
336
|
+
ERROR: "error",
|
|
337
|
+
ALERT: "alert"
|
|
338
|
+
};
|
|
339
|
+
var THEME = {
|
|
340
|
+
LIGHT: "light",
|
|
341
|
+
DARK: "dark",
|
|
342
|
+
SYSTEM: "system"
|
|
343
|
+
};
|
|
344
|
+
var LOCALE = {
|
|
345
|
+
EN_US: "en-US",
|
|
346
|
+
EN_GB: "en-GB",
|
|
347
|
+
ES_ES: "es-ES",
|
|
348
|
+
FR_FR: "fr-FR",
|
|
349
|
+
DE_DE: "de-DE",
|
|
350
|
+
IT_IT: "it-IT",
|
|
351
|
+
PT_BR: "pt-BR",
|
|
352
|
+
JA_JP: "ja-JP",
|
|
353
|
+
ZH_CN: "zh-CN",
|
|
354
|
+
ZH_TW: "zh-TW",
|
|
355
|
+
KO_KR: "ko-KR",
|
|
356
|
+
HI_IN: "hi-IN",
|
|
357
|
+
AR_SA: "ar-SA",
|
|
358
|
+
RU_RU: "ru-RU"
|
|
359
|
+
};
|
|
360
|
+
var DATE_FORMAT = {
|
|
361
|
+
ISO: "yyyy-MM-dd",
|
|
362
|
+
US: "MM/dd/yyyy",
|
|
363
|
+
EU: "dd/MM/yyyy",
|
|
364
|
+
LONG: "MMMM d, yyyy",
|
|
365
|
+
SHORT: "MMM d, yyyy",
|
|
366
|
+
WITH_TIME: "yyyy-MM-dd HH:mm:ss",
|
|
367
|
+
RELATIVE: "relative"
|
|
368
|
+
};
|
|
369
|
+
var INTERVAL = {
|
|
370
|
+
DAILY: "daily",
|
|
371
|
+
WEEKLY: "weekly",
|
|
372
|
+
BIWEEKLY: "biweekly",
|
|
373
|
+
MONTHLY: "monthly",
|
|
374
|
+
QUARTERLY: "quarterly",
|
|
375
|
+
YEARLY: "yearly",
|
|
376
|
+
ONCE: "once"
|
|
377
|
+
};
|
|
378
|
+
var GENDER = {
|
|
379
|
+
MALE: "male",
|
|
380
|
+
FEMALE: "female",
|
|
381
|
+
OTHER: "other",
|
|
382
|
+
PREFER_NOT_TO_SAY: "prefer_not_to_say"
|
|
383
|
+
};
|
|
384
|
+
var ENUMS = {
|
|
385
|
+
STATUS: STATUS2,
|
|
386
|
+
USER_STATUS: USER_STATUS2,
|
|
387
|
+
ORDER_STATUS,
|
|
388
|
+
PAYMENT_STATUS,
|
|
389
|
+
TASK_STATUS,
|
|
390
|
+
SUBSCRIPTION_STATUS,
|
|
391
|
+
SORT_DIRECTION,
|
|
392
|
+
SORT,
|
|
393
|
+
ROLE,
|
|
394
|
+
PERMISSION_LEVEL,
|
|
395
|
+
PRIORITY,
|
|
396
|
+
VISIBILITY,
|
|
397
|
+
BREAKPOINTS,
|
|
398
|
+
MEDIA_QUERIES,
|
|
399
|
+
MEDIA_QUERIES_MAX,
|
|
400
|
+
CONTAINER_WIDTHS,
|
|
401
|
+
FILE_TYPE,
|
|
402
|
+
NOTIFICATION_TYPE,
|
|
403
|
+
THEME,
|
|
404
|
+
LOCALE,
|
|
405
|
+
DATE_FORMAT,
|
|
406
|
+
INTERVAL,
|
|
407
|
+
GENDER
|
|
408
|
+
};
|
|
409
|
+
var enums_default = ENUMS;
|
|
137
410
|
var parseDate = (date) => {
|
|
138
411
|
if (date instanceof Date) return date;
|
|
139
412
|
if (typeof date === "string") return parseISO(date);
|
|
@@ -607,6 +880,6 @@ var VALIDATION_RULES = {
|
|
|
607
880
|
}
|
|
608
881
|
};
|
|
609
882
|
|
|
610
|
-
export { DATE_FORMATS, HTTP_STATUS, HTTP_STATUS_MESSAGES, PAGINATION, ROLES, STATUS, TOKEN_TYPES, USER_STATUS, VALIDATION_MESSAGES, VALIDATION_PATTERNS, VALIDATION_RULES, addTime, combineDateAndTime, date_time_default as dateTime, daysSince, daysUntil, doDateRangesOverlap, formatDate, formatDateInTimezone, formatDateRange, formatDateTime, formatRelativeTime, formatSmartDate, fromTimezone, getAge, getDateDifference, getDayBoundaries, getDaysInRange, getEnv, getEnvOptional, getMonthBoundaries, getMonthsInRange, getTimezoneDifference, getWeekBoundaries, getWeeksInRange, getYearBoundaries, isDateBetween, isDev, isProd, isTest, isValidDate, isValidEmail, isValidPassword, isValidPhone, isValidSlug, isValidUrl, isValidUsername, isWeekday, isWeekend, nowInTimezone, parseDate, setTime, subtractTime, toDateInputValue, toDateTimeInputValue, toTimeInputValue, toTimezone, validateEnv };
|
|
883
|
+
export { BREAKPOINTS, CONTAINER_WIDTHS, DATE_FORMAT, DATE_FORMATS, ENUMS, enums_default as ENUMS_DEFAULT, FILE_TYPE, GENDER, HTTP_STATUS, HTTP_STATUS_MESSAGES, INTERVAL, LOCALE, MEDIA_QUERIES, MEDIA_QUERIES_MAX, NOTIFICATION_TYPE, ORDER_STATUS, PAGINATION, PAYMENT_STATUS, PERMISSION_LEVEL, PRIORITY, ROLE, ROLES, SORT, SORT_DIRECTION, STATUS, SUBSCRIPTION_STATUS, TASK_STATUS, THEME, TOKEN_TYPES, USER_STATUS, VALIDATION_MESSAGES, VALIDATION_PATTERNS, VALIDATION_RULES, VISIBILITY, addTime, combineDateAndTime, date_time_default as dateTime, daysSince, daysUntil, doDateRangesOverlap, formatDate, formatDateInTimezone, formatDateRange, formatDateTime, formatRelativeTime, formatSmartDate, fromTimezone, getAge, getDateDifference, getDayBoundaries, getDaysInRange, getEnv, getEnvOptional, getMonthBoundaries, getMonthsInRange, getTimezoneDifference, getWeekBoundaries, getWeeksInRange, getYearBoundaries, isDateBetween, isDev, isProd, isTest, isValidDate, isValidEmail, isValidPassword, isValidPhone, isValidSlug, isValidUrl, isValidUsername, isWeekday, isWeekend, nowInTimezone, parseDate, setTime, subtractTime, toDateInputValue, toDateTimeInputValue, toTimeInputValue, toTimezone, validateEnv };
|
|
611
884
|
//# sourceMappingURL=index.mjs.map
|
|
612
885
|
//# sourceMappingURL=index.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/shared/config/env.ts","../../src/shared/constants/status-codes.ts","../../src/shared/utils/date-time.ts","../../src/shared/validation/index.ts"],"names":["format"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\r\n * Environment Configuration\r\n * Shared config helpers for both client and server\r\n */\r\n\r\nexport interface EnvConfig {\r\n NODE_ENV: 'development' | 'production' | 'test';\r\n PORT?: number;\r\n API_URL?: string;\r\n DATABASE_URL?: string;\r\n JWT_SECRET?: string;\r\n JWT_EXPIRES_IN?: string;\r\n LOG_LEVEL?: string;\r\n [key: string]: string | number | boolean | undefined;\r\n}\r\n\r\n/**\r\n * Get environment variable with type safety\r\n */\r\nexport const getEnv = <T extends string | number | boolean>(\r\n key: string,\r\n defaultValue?: T\r\n): T => {\r\n const value = process.env[key];\r\n \r\n if (value === undefined) {\r\n if (defaultValue !== undefined) {\r\n return defaultValue;\r\n }\r\n throw new Error(`Environment variable ${key} is required but not defined`);\r\n }\r\n\r\n // Type inference based on default value\r\n if (typeof defaultValue === 'number') {\r\n return Number(value) as T;\r\n }\r\n if (typeof defaultValue === 'boolean') {\r\n return (value === 'true' || value === '1') as unknown as T;\r\n }\r\n \r\n return value as T;\r\n};\r\n\r\n/**\r\n * Get optional environment variable\r\n */\r\nexport const getEnvOptional = <T extends string | number | boolean>(\r\n key: string,\r\n defaultValue?: T\r\n): T | undefined => {\r\n const value = process.env[key];\r\n \r\n if (value === undefined) {\r\n return defaultValue;\r\n }\r\n\r\n if (typeof defaultValue === 'number') {\r\n return Number(value) as T;\r\n }\r\n if (typeof defaultValue === 'boolean') {\r\n return (value === 'true' || value === '1') as unknown as T;\r\n }\r\n \r\n return value as T;\r\n};\r\n\r\n/**\r\n * Check if environment is production\r\n */\r\nexport const isProd = (): boolean => {\r\n return process.env.NODE_ENV === 'production';\r\n};\r\n\r\n/**\r\n * Check if environment is development\r\n */\r\nexport const isDev = (): boolean => {\r\n return process.env.NODE_ENV === 'development';\r\n};\r\n\r\n/**\r\n * Check if environment is test\r\n */\r\nexport const isTest = (): boolean => {\r\n return process.env.NODE_ENV === 'test';\r\n};\r\n\r\n/**\r\n * Validate required environment variables\r\n */\r\nexport const validateEnv = (requiredVars: string[]): void => {\r\n const missing = requiredVars.filter((key) => !process.env[key]);\r\n \r\n if (missing.length > 0) {\r\n throw new Error(\r\n `Missing required environment variables: ${missing.join(', ')}`\r\n );\r\n }\r\n};\r\n\r\nexport default {\r\n getEnv,\r\n getEnvOptional,\r\n isProd,\r\n isDev,\r\n isTest,\r\n validateEnv,\r\n};\r\n","/**\r\n * HTTP Status Codes\r\n */\r\nexport const HTTP_STATUS = {\r\n // Success\r\n OK: 200,\r\n CREATED: 201,\r\n ACCEPTED: 202,\r\n NO_CONTENT: 204,\r\n\r\n // Redirection\r\n MOVED_PERMANENTLY: 301,\r\n FOUND: 302,\r\n NOT_MODIFIED: 304,\r\n TEMPORARY_REDIRECT: 307,\r\n PERMANENT_REDIRECT: 308,\r\n\r\n // Client Errors\r\n BAD_REQUEST: 400,\r\n UNAUTHORIZED: 401,\r\n FORBIDDEN: 403,\r\n NOT_FOUND: 404,\r\n METHOD_NOT_ALLOWED: 405,\r\n CONFLICT: 409,\r\n GONE: 410,\r\n UNPROCESSABLE_ENTITY: 422,\r\n TOO_MANY_REQUESTS: 429,\r\n\r\n // Server Errors\r\n INTERNAL_SERVER_ERROR: 500,\r\n NOT_IMPLEMENTED: 501,\r\n BAD_GATEWAY: 502,\r\n SERVICE_UNAVAILABLE: 503,\r\n GATEWAY_TIMEOUT: 504,\r\n} as const;\r\n\r\nexport type HttpStatusCode = (typeof HTTP_STATUS)[keyof typeof HTTP_STATUS];\r\n\r\n/**\r\n * HTTP Status Messages\r\n */\r\nexport const HTTP_STATUS_MESSAGES: Record<number, string> = {\r\n [HTTP_STATUS.OK]: 'OK',\r\n [HTTP_STATUS.CREATED]: 'Created',\r\n [HTTP_STATUS.ACCEPTED]: 'Accepted',\r\n [HTTP_STATUS.NO_CONTENT]: 'No Content',\r\n [HTTP_STATUS.BAD_REQUEST]: 'Bad Request',\r\n [HTTP_STATUS.UNAUTHORIZED]: 'Unauthorized',\r\n [HTTP_STATUS.FORBIDDEN]: 'Forbidden',\r\n [HTTP_STATUS.NOT_FOUND]: 'Not Found',\r\n [HTTP_STATUS.METHOD_NOT_ALLOWED]: 'Method Not Allowed',\r\n [HTTP_STATUS.CONFLICT]: 'Conflict',\r\n [HTTP_STATUS.UNPROCESSABLE_ENTITY]: 'Unprocessable Entity',\r\n [HTTP_STATUS.TOO_MANY_REQUESTS]: 'Too Many Requests',\r\n [HTTP_STATUS.INTERNAL_SERVER_ERROR]: 'Internal Server Error',\r\n [HTTP_STATUS.SERVICE_UNAVAILABLE]: 'Service Unavailable',\r\n};\r\n\r\n/**\r\n * Common Status Values\r\n */\r\nexport const STATUS = {\r\n ACTIVE: 'active',\r\n INACTIVE: 'inactive',\r\n PENDING: 'pending',\r\n APPROVED: 'approved',\r\n REJECTED: 'rejected',\r\n DELETED: 'deleted',\r\n ARCHIVED: 'archived',\r\n DRAFT: 'draft',\r\n PUBLISHED: 'published',\r\n SUSPENDED: 'suspended',\r\n} as const;\r\n\r\nexport type StatusValue = (typeof STATUS)[keyof typeof STATUS];\r\n\r\n/**\r\n * User Status Values\r\n */\r\nexport const USER_STATUS = {\r\n ACTIVE: 'active',\r\n INACTIVE: 'inactive',\r\n PENDING: 'pending',\r\n SUSPENDED: 'suspended',\r\n BANNED: 'banned',\r\n} as const;\r\n\r\nexport type UserStatusValue = (typeof USER_STATUS)[keyof typeof USER_STATUS];\r\n\r\n/**\r\n * Common Roles\r\n */\r\nexport const ROLES = {\r\n ADMIN: 'admin',\r\n USER: 'user',\r\n MODERATOR: 'moderator',\r\n GUEST: 'guest',\r\n SUPER_ADMIN: 'super_admin',\r\n} as const;\r\n\r\nexport type RoleValue = (typeof ROLES)[keyof typeof ROLES];\r\n\r\n/**\r\n * Pagination Defaults\r\n */\r\nexport const PAGINATION = {\r\n DEFAULT_PAGE: 1,\r\n DEFAULT_LIMIT: 10,\r\n MAX_LIMIT: 100,\r\n} as const;\r\n\r\n/**\r\n * Token Types\r\n */\r\nexport const TOKEN_TYPES = {\r\n ACCESS: 'access',\r\n REFRESH: 'refresh',\r\n RESET_PASSWORD: 'reset_password',\r\n EMAIL_VERIFICATION: 'email_verification',\r\n} as const;\r\n\r\nexport type TokenType = (typeof TOKEN_TYPES)[keyof typeof TOKEN_TYPES];\r\n\r\nexport default {\r\n HTTP_STATUS,\r\n HTTP_STATUS_MESSAGES,\r\n STATUS,\r\n USER_STATUS,\r\n ROLES,\r\n PAGINATION,\r\n TOKEN_TYPES,\r\n};\r\n","/**\r\n * Enhanced Date/Time utilities using date-fns with timezone support\r\n * Deep level date handling for all common operations\r\n */\r\nimport {\r\n format,\r\n formatDistance,\r\n formatDistanceToNow,\r\n formatRelative,\r\n isToday,\r\n isYesterday,\r\n isTomorrow,\r\n isThisWeek,\r\n isThisMonth,\r\n isThisYear,\r\n isPast,\r\n isFuture,\r\n isValid,\r\n parseISO,\r\n addDays,\r\n addWeeks,\r\n addMonths,\r\n addYears,\r\n addHours,\r\n addMinutes,\r\n subDays,\r\n subWeeks,\r\n subMonths,\r\n subYears,\r\n subHours,\r\n subMinutes,\r\n startOfDay,\r\n endOfDay,\r\n startOfWeek,\r\n endOfWeek,\r\n startOfMonth,\r\n endOfMonth,\r\n startOfYear,\r\n endOfYear,\r\n differenceInDays,\r\n differenceInWeeks,\r\n differenceInMonths,\r\n differenceInYears,\r\n differenceInHours,\r\n differenceInMinutes,\r\n differenceInSeconds,\r\n isBefore,\r\n isAfter,\r\n isEqual,\r\n isSameDay,\r\n isSameWeek,\r\n isSameMonth,\r\n isSameYear,\r\n getDay,\r\n getDate,\r\n getMonth,\r\n getYear,\r\n getHours,\r\n getMinutes,\r\n getSeconds,\r\n setHours,\r\n setMinutes,\r\n setSeconds,\r\n eachDayOfInterval,\r\n eachWeekOfInterval,\r\n eachMonthOfInterval,\r\n intervalToDuration,\r\n formatDuration,\r\n} from 'date-fns';\r\n\r\nimport { formatInTimeZone, toZonedTime, fromZonedTime } from 'date-fns-tz';\r\n\r\n// Re-export all date-fns functions for convenience\r\nexport {\r\n format,\r\n formatDistance,\r\n formatDistanceToNow,\r\n formatRelative,\r\n isToday,\r\n isYesterday,\r\n isTomorrow,\r\n isThisWeek,\r\n isThisMonth,\r\n isThisYear,\r\n isPast,\r\n isFuture,\r\n isValid,\r\n parseISO,\r\n addDays,\r\n addWeeks,\r\n addMonths,\r\n addYears,\r\n addHours,\r\n addMinutes,\r\n subDays,\r\n subWeeks,\r\n subMonths,\r\n subYears,\r\n subHours,\r\n subMinutes,\r\n startOfDay,\r\n endOfDay,\r\n startOfWeek,\r\n endOfWeek,\r\n startOfMonth,\r\n endOfMonth,\r\n startOfYear,\r\n endOfYear,\r\n differenceInDays,\r\n differenceInWeeks,\r\n differenceInMonths,\r\n differenceInYears,\r\n differenceInHours,\r\n differenceInMinutes,\r\n differenceInSeconds,\r\n isBefore,\r\n isAfter,\r\n isEqual,\r\n isSameDay,\r\n isSameWeek,\r\n isSameMonth,\r\n isSameYear,\r\n getDay,\r\n getDate,\r\n getMonth,\r\n getYear,\r\n getHours,\r\n getMinutes,\r\n getSeconds,\r\n setHours,\r\n setMinutes,\r\n setSeconds,\r\n eachDayOfInterval,\r\n eachWeekOfInterval,\r\n eachMonthOfInterval,\r\n intervalToDuration,\r\n formatDuration,\r\n formatInTimeZone,\r\n toZonedTime,\r\n fromZonedTime,\r\n};\r\n\r\n/**\r\n * Date input type - accepts Date, string (ISO), or timestamp\r\n */\r\nexport type DateInput = Date | string | number;\r\n\r\n/**\r\n * Parse any date input to Date object\r\n */\r\nexport const parseDate = (date: DateInput): Date => {\r\n if (date instanceof Date) return date;\r\n if (typeof date === 'string') return parseISO(date);\r\n return new Date(date);\r\n};\r\n\r\n/**\r\n * Check if date input is valid\r\n */\r\nexport const isValidDate = (date: DateInput): boolean => {\r\n const parsed = parseDate(date);\r\n return isValid(parsed);\r\n};\r\n\r\n// ==========================================\r\n// FORMAT FUNCTIONS\r\n// ==========================================\r\n\r\n/**\r\n * Format presets for common date formats\r\n */\r\nexport const DATE_FORMATS = {\r\n // Date only\r\n DATE_SHORT: 'MM/dd/yyyy', // 01/15/2026\r\n DATE_MEDIUM: 'MMM d, yyyy', // Jan 15, 2026\r\n DATE_LONG: 'MMMM d, yyyy', // January 15, 2026\r\n DATE_FULL: 'EEEE, MMMM d, yyyy', // Friday, January 15, 2026\r\n DATE_ISO: 'yyyy-MM-dd', // 2026-01-15\r\n\r\n // Time only\r\n TIME_SHORT: 'h:mm a', // 3:30 PM\r\n TIME_MEDIUM: 'h:mm:ss a', // 3:30:45 PM\r\n TIME_24H: 'HH:mm', // 15:30\r\n TIME_24H_FULL: 'HH:mm:ss', // 15:30:45\r\n\r\n // Date and time\r\n DATETIME_SHORT: 'MM/dd/yyyy h:mm a', // 01/15/2026 3:30 PM\r\n DATETIME_MEDIUM: 'MMM d, yyyy h:mm a', // Jan 15, 2026 3:30 PM\r\n DATETIME_LONG: 'MMMM d, yyyy h:mm a', // January 15, 2026 3:30 PM\r\n DATETIME_FULL: 'EEEE, MMMM d, yyyy h:mm a', // Friday, January 15, 2026 3:30 PM\r\n DATETIME_ISO: \"yyyy-MM-dd'T'HH:mm:ss\", // 2026-01-15T15:30:45\r\n\r\n // Special formats\r\n MONTH_YEAR: 'MMMM yyyy', // January 2026\r\n MONTH_DAY: 'MMM d', // Jan 15\r\n DAY_MONTH: 'd MMM', // 15 Jan\r\n WEEKDAY: 'EEEE', // Friday\r\n WEEKDAY_SHORT: 'EEE', // Fri\r\n} as const;\r\n\r\n/**\r\n * Format date with preset or custom format\r\n */\r\nexport const formatDate = (date: DateInput, formatStr: string = DATE_FORMATS.DATE_MEDIUM): string => {\r\n return format(parseDate(date), formatStr);\r\n};\r\n\r\n/**\r\n * Format date with time\r\n */\r\nexport const formatDateTime = (date: DateInput, formatStr: string = DATE_FORMATS.DATETIME_MEDIUM): string => {\r\n return format(parseDate(date), formatStr);\r\n};\r\n\r\n/**\r\n * Format date in a specific timezone\r\n */\r\nexport const formatDateInTimezone = (\r\n date: DateInput,\r\n timezone: string,\r\n formatStr: string = DATE_FORMATS.DATETIME_MEDIUM\r\n): string => {\r\n return formatInTimeZone(parseDate(date), timezone, formatStr);\r\n};\r\n\r\n/**\r\n * Format date as relative time (e.g., \"2 hours ago\", \"in 3 days\")\r\n */\r\nexport const formatRelativeTime = (date: DateInput, baseDate?: DateInput): string => {\r\n const parsed = parseDate(date);\r\n if (baseDate) {\r\n return formatDistance(parsed, parseDate(baseDate), { addSuffix: true });\r\n }\r\n return formatDistanceToNow(parsed, { addSuffix: true });\r\n};\r\n\r\n/**\r\n * Format date as smart relative (Today at 3:30 PM, Yesterday, etc.)\r\n */\r\nexport const formatSmartDate = (date: DateInput): string => {\r\n const parsed = parseDate(date);\r\n\r\n if (isToday(parsed)) {\r\n return `Today at ${format(parsed, DATE_FORMATS.TIME_SHORT)}`;\r\n }\r\n if (isYesterday(parsed)) {\r\n return `Yesterday at ${format(parsed, DATE_FORMATS.TIME_SHORT)}`;\r\n }\r\n if (isTomorrow(parsed)) {\r\n return `Tomorrow at ${format(parsed, DATE_FORMATS.TIME_SHORT)}`;\r\n }\r\n if (isThisWeek(parsed)) {\r\n return format(parsed, 'EEEE \\'at\\' h:mm a'); // Friday at 3:30 PM\r\n }\r\n if (isThisYear(parsed)) {\r\n return format(parsed, 'MMM d \\'at\\' h:mm a'); // Jan 15 at 3:30 PM\r\n }\r\n return format(parsed, DATE_FORMATS.DATETIME_MEDIUM);\r\n};\r\n\r\n/**\r\n * Format duration between two dates in human readable form\r\n */\r\nexport const formatDateRange = (start: DateInput, end: DateInput): string => {\r\n const duration = intervalToDuration({\r\n start: parseDate(start),\r\n end: parseDate(end),\r\n });\r\n\r\n return formatDuration(duration, {\r\n format: ['years', 'months', 'days', 'hours', 'minutes'],\r\n });\r\n};\r\n\r\n// ==========================================\r\n// TIMEZONE FUNCTIONS\r\n// ==========================================\r\n\r\n/**\r\n * Convert date to a specific timezone\r\n */\r\nexport const toTimezone = (date: DateInput, timezone: string): Date => {\r\n return toZonedTime(parseDate(date), timezone);\r\n};\r\n\r\n/**\r\n * Convert date from a specific timezone to UTC\r\n */\r\nexport const fromTimezone = (date: DateInput, timezone: string): Date => {\r\n return fromZonedTime(parseDate(date), timezone);\r\n};\r\n\r\n/**\r\n * Get current time in a specific timezone\r\n */\r\nexport const nowInTimezone = (timezone: string): Date => {\r\n return toZonedTime(new Date(), timezone);\r\n};\r\n\r\n/**\r\n * Format time difference between timezones\r\n */\r\nexport const getTimezoneDifference = (timezone1: string, timezone2: string): string => {\r\n const now = new Date();\r\n const time1 = toZonedTime(now, timezone1);\r\n const time2 = toZonedTime(now, timezone2);\r\n const diffMinutes = differenceInMinutes(time1, time2);\r\n const hours = Math.floor(Math.abs(diffMinutes) / 60);\r\n const minutes = Math.abs(diffMinutes) % 60;\r\n const sign = diffMinutes >= 0 ? '+' : '-';\r\n\r\n if (minutes === 0) {\r\n return `${sign}${hours}h`;\r\n }\r\n return `${sign}${hours}h ${minutes}m`;\r\n};\r\n\r\n// ==========================================\r\n// DATE ARITHMETIC\r\n// ==========================================\r\n\r\n/**\r\n * Add time to a date\r\n */\r\nexport const addTime = (\r\n date: DateInput,\r\n amount: number,\r\n unit: 'minutes' | 'hours' | 'days' | 'weeks' | 'months' | 'years'\r\n): Date => {\r\n const parsed = parseDate(date);\r\n switch (unit) {\r\n case 'minutes':\r\n return addMinutes(parsed, amount);\r\n case 'hours':\r\n return addHours(parsed, amount);\r\n case 'days':\r\n return addDays(parsed, amount);\r\n case 'weeks':\r\n return addWeeks(parsed, amount);\r\n case 'months':\r\n return addMonths(parsed, amount);\r\n case 'years':\r\n return addYears(parsed, amount);\r\n }\r\n};\r\n\r\n/**\r\n * Subtract time from a date\r\n */\r\nexport const subtractTime = (\r\n date: DateInput,\r\n amount: number,\r\n unit: 'minutes' | 'hours' | 'days' | 'weeks' | 'months' | 'years'\r\n): Date => {\r\n const parsed = parseDate(date);\r\n switch (unit) {\r\n case 'minutes':\r\n return subMinutes(parsed, amount);\r\n case 'hours':\r\n return subHours(parsed, amount);\r\n case 'days':\r\n return subDays(parsed, amount);\r\n case 'weeks':\r\n return subWeeks(parsed, amount);\r\n case 'months':\r\n return subMonths(parsed, amount);\r\n case 'years':\r\n return subYears(parsed, amount);\r\n }\r\n};\r\n\r\n/**\r\n * Get difference between two dates\r\n */\r\nexport const getDateDifference = (\r\n date1: DateInput,\r\n date2: DateInput,\r\n unit: 'seconds' | 'minutes' | 'hours' | 'days' | 'weeks' | 'months' | 'years'\r\n): number => {\r\n const d1 = parseDate(date1);\r\n const d2 = parseDate(date2);\r\n switch (unit) {\r\n case 'seconds':\r\n return differenceInSeconds(d1, d2);\r\n case 'minutes':\r\n return differenceInMinutes(d1, d2);\r\n case 'hours':\r\n return differenceInHours(d1, d2);\r\n case 'days':\r\n return differenceInDays(d1, d2);\r\n case 'weeks':\r\n return differenceInWeeks(d1, d2);\r\n case 'months':\r\n return differenceInMonths(d1, d2);\r\n case 'years':\r\n return differenceInYears(d1, d2);\r\n }\r\n};\r\n\r\n// ==========================================\r\n// DATE RANGE FUNCTIONS\r\n// ==========================================\r\n\r\n/**\r\n * Get all days in a range\r\n */\r\nexport const getDaysInRange = (start: DateInput, end: DateInput): Date[] => {\r\n return eachDayOfInterval({\r\n start: parseDate(start),\r\n end: parseDate(end),\r\n });\r\n};\r\n\r\n/**\r\n * Get all weeks in a range\r\n */\r\nexport const getWeeksInRange = (start: DateInput, end: DateInput): Date[] => {\r\n return eachWeekOfInterval({\r\n start: parseDate(start),\r\n end: parseDate(end),\r\n });\r\n};\r\n\r\n/**\r\n * Get all months in a range\r\n */\r\nexport const getMonthsInRange = (start: DateInput, end: DateInput): Date[] => {\r\n return eachMonthOfInterval({\r\n start: parseDate(start),\r\n end: parseDate(end),\r\n });\r\n};\r\n\r\n// ==========================================\r\n// DATE BOUNDARIES\r\n// ==========================================\r\n\r\n/**\r\n * Get start and end of day\r\n */\r\nexport const getDayBoundaries = (date: DateInput): { start: Date; end: Date } => {\r\n const parsed = parseDate(date);\r\n return {\r\n start: startOfDay(parsed),\r\n end: endOfDay(parsed),\r\n };\r\n};\r\n\r\n/**\r\n * Get start and end of week\r\n */\r\nexport const getWeekBoundaries = (date: DateInput, weekStartsOn: 0 | 1 = 0): { start: Date; end: Date } => {\r\n const parsed = parseDate(date);\r\n return {\r\n start: startOfWeek(parsed, { weekStartsOn }),\r\n end: endOfWeek(parsed, { weekStartsOn }),\r\n };\r\n};\r\n\r\n/**\r\n * Get start and end of month\r\n */\r\nexport const getMonthBoundaries = (date: DateInput): { start: Date; end: Date } => {\r\n const parsed = parseDate(date);\r\n return {\r\n start: startOfMonth(parsed),\r\n end: endOfMonth(parsed),\r\n };\r\n};\r\n\r\n/**\r\n * Get start and end of year\r\n */\r\nexport const getYearBoundaries = (date: DateInput): { start: Date; end: Date } => {\r\n const parsed = parseDate(date);\r\n return {\r\n start: startOfYear(parsed),\r\n end: endOfYear(parsed),\r\n };\r\n};\r\n\r\n// ==========================================\r\n// DATE COMPARISON\r\n// ==========================================\r\n\r\n/**\r\n * Check if date is between two dates (inclusive)\r\n */\r\nexport const isDateBetween = (date: DateInput, start: DateInput, end: DateInput): boolean => {\r\n const d = parseDate(date);\r\n const s = parseDate(start);\r\n const e = parseDate(end);\r\n return (isAfter(d, s) || isEqual(d, s)) && (isBefore(d, e) || isEqual(d, e));\r\n};\r\n\r\n/**\r\n * Check if two date ranges overlap\r\n */\r\nexport const doDateRangesOverlap = (\r\n range1Start: DateInput,\r\n range1End: DateInput,\r\n range2Start: DateInput,\r\n range2End: DateInput\r\n): boolean => {\r\n const r1s = parseDate(range1Start);\r\n const r1e = parseDate(range1End);\r\n const r2s = parseDate(range2Start);\r\n const r2e = parseDate(range2End);\r\n\r\n return isBefore(r1s, r2e) && isAfter(r1e, r2s);\r\n};\r\n\r\n// ==========================================\r\n// UTILITY FUNCTIONS\r\n// ==========================================\r\n\r\n/**\r\n * Get age from birthdate\r\n */\r\nexport const getAge = (birthDate: DateInput): number => {\r\n return differenceInYears(new Date(), parseDate(birthDate));\r\n};\r\n\r\n/**\r\n * Check if date is a weekend\r\n */\r\nexport const isWeekend = (date: DateInput): boolean => {\r\n const day = getDay(parseDate(date));\r\n return day === 0 || day === 6;\r\n};\r\n\r\n/**\r\n * Check if date is a weekday\r\n */\r\nexport const isWeekday = (date: DateInput): boolean => {\r\n return !isWeekend(date);\r\n};\r\n\r\n/**\r\n * Get days until a date\r\n */\r\nexport const daysUntil = (date: DateInput): number => {\r\n return differenceInDays(parseDate(date), new Date());\r\n};\r\n\r\n/**\r\n * Get days since a date\r\n */\r\nexport const daysSince = (date: DateInput): number => {\r\n return differenceInDays(new Date(), parseDate(date));\r\n};\r\n\r\n/**\r\n * Format for HTML date input (yyyy-MM-dd)\r\n */\r\nexport const toDateInputValue = (date: DateInput): string => {\r\n return format(parseDate(date), DATE_FORMATS.DATE_ISO);\r\n};\r\n\r\n/**\r\n * Format for HTML datetime-local input\r\n */\r\nexport const toDateTimeInputValue = (date: DateInput): string => {\r\n return format(parseDate(date), \"yyyy-MM-dd'T'HH:mm\");\r\n};\r\n\r\n/**\r\n * Format for HTML time input (HH:mm)\r\n */\r\nexport const toTimeInputValue = (date: DateInput): string => {\r\n return format(parseDate(date), DATE_FORMATS.TIME_24H);\r\n};\r\n\r\n/**\r\n * Set time on a date\r\n */\r\nexport const setTime = (date: DateInput, hours: number, minutes: number, seconds: number = 0): Date => {\r\n let result = parseDate(date);\r\n result = setHours(result, hours);\r\n result = setMinutes(result, minutes);\r\n result = setSeconds(result, seconds);\r\n return result;\r\n};\r\n\r\n/**\r\n * Combine date from one input and time from another\r\n */\r\nexport const combineDateAndTime = (dateInput: DateInput, timeInput: DateInput): Date => {\r\n const date = parseDate(dateInput);\r\n const time = parseDate(timeInput);\r\n return setTime(date, getHours(time), getMinutes(time), getSeconds(time));\r\n};\r\n\r\nexport default {\r\n // Core\r\n parseDate,\r\n isValidDate,\r\n DATE_FORMATS,\r\n\r\n // Format\r\n formatDate,\r\n formatDateTime,\r\n formatDateInTimezone,\r\n formatRelativeTime,\r\n formatSmartDate,\r\n formatDateRange,\r\n\r\n // Timezone\r\n toTimezone,\r\n fromTimezone,\r\n nowInTimezone,\r\n getTimezoneDifference,\r\n\r\n // Arithmetic\r\n addTime,\r\n subtractTime,\r\n getDateDifference,\r\n\r\n // Ranges\r\n getDaysInRange,\r\n getWeeksInRange,\r\n getMonthsInRange,\r\n\r\n // Boundaries\r\n getDayBoundaries,\r\n getWeekBoundaries,\r\n getMonthBoundaries,\r\n getYearBoundaries,\r\n\r\n // Comparison\r\n isDateBetween,\r\n doDateRangesOverlap,\r\n\r\n // Utilities\r\n getAge,\r\n isWeekend,\r\n isWeekday,\r\n daysUntil,\r\n daysSince,\r\n toDateInputValue,\r\n toDateTimeInputValue,\r\n toTimeInputValue,\r\n setTime,\r\n combineDateAndTime,\r\n};\r\n","/**\r\n * Common Validation Rules & Patterns\r\n * Use with Yup, Zod, or custom validators\r\n */\r\n\r\n// ==========================================\r\n// REGEX PATTERNS\r\n// ==========================================\r\n\r\nexport const VALIDATION_PATTERNS = {\r\n /** Email pattern (RFC 5322 simplified) */\r\n EMAIL: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/,\r\n\r\n /** Strong password: min 8 chars, uppercase, lowercase, number, special char */\r\n PASSWORD_STRONG:\r\n /^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]{8,}$/,\r\n\r\n /** Medium password: min 8 chars, uppercase, lowercase, number */\r\n PASSWORD_MEDIUM: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)[A-Za-z\\d@$!%*?&]{8,}$/,\r\n\r\n /** Basic password: min 8 chars */\r\n PASSWORD_BASIC: /^.{8,}$/,\r\n\r\n /** Phone number (international) */\r\n PHONE_INTERNATIONAL: /^\\+?[\\d\\s\\-().]{10,}$/,\r\n\r\n /** Phone number (US) */\r\n PHONE_US: /^\\(?([0-9]{3})\\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$/,\r\n\r\n /** Phone number (India) */\r\n PHONE_INDIA: /^[6-9]\\d{9}$/,\r\n\r\n /** URL pattern */\r\n URL: /^(https?:\\/\\/)?([\\da-z.-]+)\\.([a-z.]{2,6})([/\\w .-]*)*\\/?$/,\r\n\r\n /** URL with required protocol */\r\n URL_STRICT: /^https?:\\/\\/([\\da-z.-]+)\\.([a-z.]{2,6})([/\\w .-]*)*\\/?$/,\r\n\r\n /** Alphanumeric only */\r\n ALPHANUMERIC: /^[a-zA-Z0-9]+$/,\r\n\r\n /** Letters only */\r\n LETTERS_ONLY: /^[a-zA-Z]+$/,\r\n\r\n /** Numbers only */\r\n NUMBERS_ONLY: /^\\d+$/,\r\n\r\n /** Slug pattern (kebab-case) */\r\n SLUG: /^[a-z0-9]+(?:-[a-z0-9]+)*$/,\r\n\r\n /** Username pattern (alphanumeric, underscore, hyphen) */\r\n USERNAME: /^[a-zA-Z0-9_-]{3,30}$/,\r\n\r\n /** Credit card (basic validation) */\r\n CREDIT_CARD: /^\\d{13,19}$/,\r\n\r\n /** CVV (3 or 4 digits) */\r\n CVV: /^\\d{3,4}$/,\r\n\r\n /** ZIP code (US) */\r\n ZIP_US: /^\\d{5}(-\\d{4})?$/,\r\n\r\n /** Postal code (India) */\r\n POSTAL_INDIA: /^\\d{6}$/,\r\n\r\n /** IP Address (IPv4) */\r\n IPV4: /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/,\r\n\r\n /** Hex color */\r\n HEX_COLOR: /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/,\r\n\r\n /** Date (YYYY-MM-DD) */\r\n DATE_ISO: /^\\d{4}-\\d{2}-\\d{2}$/,\r\n\r\n /** Time (HH:MM or HH:MM:SS) */\r\n TIME: /^([01]\\d|2[0-3]):([0-5]\\d)(:[0-5]\\d)?$/,\r\n} as const;\r\n\r\n// ==========================================\r\n// VALIDATION FUNCTIONS\r\n// ==========================================\r\n\r\n/**\r\n * Validate email format\r\n */\r\nexport const isValidEmail = (email: string): boolean => {\r\n return VALIDATION_PATTERNS.EMAIL.test(email.trim());\r\n};\r\n\r\n/**\r\n * Validate password strength\r\n */\r\nexport const isValidPassword = (\r\n password: string,\r\n strength: 'basic' | 'medium' | 'strong' = 'medium'\r\n): boolean => {\r\n switch (strength) {\r\n case 'strong':\r\n return VALIDATION_PATTERNS.PASSWORD_STRONG.test(password);\r\n case 'medium':\r\n return VALIDATION_PATTERNS.PASSWORD_MEDIUM.test(password);\r\n case 'basic':\r\n default:\r\n return VALIDATION_PATTERNS.PASSWORD_BASIC.test(password);\r\n }\r\n};\r\n\r\n/**\r\n * Validate phone number\r\n */\r\nexport const isValidPhone = (\r\n phone: string,\r\n format: 'international' | 'us' | 'india' = 'international'\r\n): boolean => {\r\n const cleaned = phone.replace(/\\s/g, '');\r\n switch (format) {\r\n case 'us':\r\n return VALIDATION_PATTERNS.PHONE_US.test(cleaned);\r\n case 'india':\r\n return VALIDATION_PATTERNS.PHONE_INDIA.test(cleaned);\r\n case 'international':\r\n default:\r\n return VALIDATION_PATTERNS.PHONE_INTERNATIONAL.test(cleaned);\r\n }\r\n};\r\n\r\n/**\r\n * Validate URL format\r\n */\r\nexport const isValidUrl = (url: string, requireProtocol: boolean = false): boolean => {\r\n if (requireProtocol) {\r\n return VALIDATION_PATTERNS.URL_STRICT.test(url);\r\n }\r\n return VALIDATION_PATTERNS.URL.test(url);\r\n};\r\n\r\n/**\r\n * Validate username format\r\n */\r\nexport const isValidUsername = (username: string): boolean => {\r\n return VALIDATION_PATTERNS.USERNAME.test(username);\r\n};\r\n\r\n/**\r\n * Validate slug format\r\n */\r\nexport const isValidSlug = (slug: string): boolean => {\r\n return VALIDATION_PATTERNS.SLUG.test(slug);\r\n};\r\n\r\n// ==========================================\r\n// VALIDATION MESSAGES\r\n// ==========================================\r\n\r\nexport const VALIDATION_MESSAGES = {\r\n // Required fields\r\n REQUIRED: 'This field is required',\r\n REQUIRED_FIELD: (field: string) => `${field} is required`,\r\n\r\n // Email\r\n EMAIL_INVALID: 'Please enter a valid email address',\r\n EMAIL_REQUIRED: 'Email is required',\r\n\r\n // Password\r\n PASSWORD_REQUIRED: 'Password is required',\r\n PASSWORD_MIN_LENGTH: (length: number) => `Password must be at least ${length} characters`,\r\n PASSWORD_WEAK: 'Password is too weak',\r\n PASSWORD_MEDIUM: 'Password must contain uppercase, lowercase, and number',\r\n PASSWORD_STRONG: 'Password must contain uppercase, lowercase, number, and special character',\r\n PASSWORD_MISMATCH: 'Passwords do not match',\r\n\r\n // Name\r\n NAME_REQUIRED: 'Name is required',\r\n FIRST_NAME_REQUIRED: 'First name is required',\r\n LAST_NAME_REQUIRED: 'Last name is required',\r\n NAME_MIN_LENGTH: (length: number) => `Name must be at least ${length} characters`,\r\n NAME_MAX_LENGTH: (length: number) => `Name must be at most ${length} characters`,\r\n\r\n // Phone\r\n PHONE_INVALID: 'Please enter a valid phone number',\r\n PHONE_REQUIRED: 'Phone number is required',\r\n\r\n // URL\r\n URL_INVALID: 'Please enter a valid URL',\r\n\r\n // Username\r\n USERNAME_INVALID: 'Username can only contain letters, numbers, underscores, and hyphens',\r\n USERNAME_MIN_LENGTH: 'Username must be at least 3 characters',\r\n USERNAME_MAX_LENGTH: 'Username must be at most 30 characters',\r\n USERNAME_TAKEN: 'This username is already taken',\r\n\r\n // General\r\n MIN_LENGTH: (field: string, length: number) => `${field} must be at least ${length} characters`,\r\n MAX_LENGTH: (field: string, length: number) => `${field} must be at most ${length} characters`,\r\n MIN_VALUE: (field: string, value: number) => `${field} must be at least ${value}`,\r\n MAX_VALUE: (field: string, value: number) => `${field} must be at most ${value}`,\r\n INVALID_FORMAT: 'Invalid format',\r\n TERMS_REQUIRED: 'You must accept the terms and conditions',\r\n} as const;\r\n\r\n// ==========================================\r\n// COMMON VALIDATION RULES (for schema builders)\r\n// ==========================================\r\n\r\nexport const VALIDATION_RULES = {\r\n email: {\r\n pattern: VALIDATION_PATTERNS.EMAIL,\r\n message: VALIDATION_MESSAGES.EMAIL_INVALID,\r\n },\r\n password: {\r\n minLength: 8,\r\n pattern: VALIDATION_PATTERNS.PASSWORD_MEDIUM,\r\n message: VALIDATION_MESSAGES.PASSWORD_MEDIUM,\r\n },\r\n passwordStrong: {\r\n minLength: 8,\r\n pattern: VALIDATION_PATTERNS.PASSWORD_STRONG,\r\n message: VALIDATION_MESSAGES.PASSWORD_STRONG,\r\n },\r\n name: {\r\n minLength: 2,\r\n maxLength: 50,\r\n },\r\n username: {\r\n minLength: 3,\r\n maxLength: 30,\r\n pattern: VALIDATION_PATTERNS.USERNAME,\r\n message: VALIDATION_MESSAGES.USERNAME_INVALID,\r\n },\r\n phone: {\r\n pattern: VALIDATION_PATTERNS.PHONE_INTERNATIONAL,\r\n message: VALIDATION_MESSAGES.PHONE_INVALID,\r\n },\r\n url: {\r\n pattern: VALIDATION_PATTERNS.URL,\r\n message: VALIDATION_MESSAGES.URL_INVALID,\r\n },\r\n} as const;\r\n\r\nexport default {\r\n VALIDATION_PATTERNS,\r\n VALIDATION_MESSAGES,\r\n VALIDATION_RULES,\r\n isValidEmail,\r\n isValidPassword,\r\n isValidPhone,\r\n isValidUrl,\r\n isValidUsername,\r\n isValidSlug,\r\n};\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/shared/config/env.ts","../../src/shared/constants/status-codes.ts","../../src/shared/constants/enums.ts","../../src/shared/utils/date-time.ts","../../src/shared/validation/index.ts"],"names":["STATUS","USER_STATUS","format"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\r\n * Environment Configuration\r\n * Shared config helpers for both client and server\r\n */\r\n\r\nexport interface EnvConfig {\r\n NODE_ENV: 'development' | 'production' | 'test';\r\n PORT?: number;\r\n API_URL?: string;\r\n DATABASE_URL?: string;\r\n JWT_SECRET?: string;\r\n JWT_EXPIRES_IN?: string;\r\n LOG_LEVEL?: string;\r\n [key: string]: string | number | boolean | undefined;\r\n}\r\n\r\n/**\r\n * Get environment variable with type safety\r\n */\r\nexport const getEnv = <T extends string | number | boolean>(\r\n key: string,\r\n defaultValue?: T\r\n): T => {\r\n const value = process.env[key];\r\n \r\n if (value === undefined) {\r\n if (defaultValue !== undefined) {\r\n return defaultValue;\r\n }\r\n throw new Error(`Environment variable ${key} is required but not defined`);\r\n }\r\n\r\n // Type inference based on default value\r\n if (typeof defaultValue === 'number') {\r\n return Number(value) as T;\r\n }\r\n if (typeof defaultValue === 'boolean') {\r\n return (value === 'true' || value === '1') as unknown as T;\r\n }\r\n \r\n return value as T;\r\n};\r\n\r\n/**\r\n * Get optional environment variable\r\n */\r\nexport const getEnvOptional = <T extends string | number | boolean>(\r\n key: string,\r\n defaultValue?: T\r\n): T | undefined => {\r\n const value = process.env[key];\r\n \r\n if (value === undefined) {\r\n return defaultValue;\r\n }\r\n\r\n if (typeof defaultValue === 'number') {\r\n return Number(value) as T;\r\n }\r\n if (typeof defaultValue === 'boolean') {\r\n return (value === 'true' || value === '1') as unknown as T;\r\n }\r\n \r\n return value as T;\r\n};\r\n\r\n/**\r\n * Check if environment is production\r\n */\r\nexport const isProd = (): boolean => {\r\n return process.env.NODE_ENV === 'production';\r\n};\r\n\r\n/**\r\n * Check if environment is development\r\n */\r\nexport const isDev = (): boolean => {\r\n return process.env.NODE_ENV === 'development';\r\n};\r\n\r\n/**\r\n * Check if environment is test\r\n */\r\nexport const isTest = (): boolean => {\r\n return process.env.NODE_ENV === 'test';\r\n};\r\n\r\n/**\r\n * Validate required environment variables\r\n */\r\nexport const validateEnv = (requiredVars: string[]): void => {\r\n const missing = requiredVars.filter((key) => !process.env[key]);\r\n \r\n if (missing.length > 0) {\r\n throw new Error(\r\n `Missing required environment variables: ${missing.join(', ')}`\r\n );\r\n }\r\n};\r\n\r\nexport default {\r\n getEnv,\r\n getEnvOptional,\r\n isProd,\r\n isDev,\r\n isTest,\r\n validateEnv,\r\n};\r\n","/**\r\n * HTTP Status Codes\r\n */\r\nexport const HTTP_STATUS = {\r\n // Success\r\n OK: 200,\r\n CREATED: 201,\r\n ACCEPTED: 202,\r\n NO_CONTENT: 204,\r\n\r\n // Redirection\r\n MOVED_PERMANENTLY: 301,\r\n FOUND: 302,\r\n NOT_MODIFIED: 304,\r\n TEMPORARY_REDIRECT: 307,\r\n PERMANENT_REDIRECT: 308,\r\n\r\n // Client Errors\r\n BAD_REQUEST: 400,\r\n UNAUTHORIZED: 401,\r\n FORBIDDEN: 403,\r\n NOT_FOUND: 404,\r\n METHOD_NOT_ALLOWED: 405,\r\n CONFLICT: 409,\r\n GONE: 410,\r\n UNPROCESSABLE_ENTITY: 422,\r\n TOO_MANY_REQUESTS: 429,\r\n\r\n // Server Errors\r\n INTERNAL_SERVER_ERROR: 500,\r\n NOT_IMPLEMENTED: 501,\r\n BAD_GATEWAY: 502,\r\n SERVICE_UNAVAILABLE: 503,\r\n GATEWAY_TIMEOUT: 504,\r\n} as const;\r\n\r\nexport type HttpStatusCode = (typeof HTTP_STATUS)[keyof typeof HTTP_STATUS];\r\n\r\n/**\r\n * HTTP Status Messages\r\n */\r\nexport const HTTP_STATUS_MESSAGES: Record<number, string> = {\r\n [HTTP_STATUS.OK]: 'OK',\r\n [HTTP_STATUS.CREATED]: 'Created',\r\n [HTTP_STATUS.ACCEPTED]: 'Accepted',\r\n [HTTP_STATUS.NO_CONTENT]: 'No Content',\r\n [HTTP_STATUS.BAD_REQUEST]: 'Bad Request',\r\n [HTTP_STATUS.UNAUTHORIZED]: 'Unauthorized',\r\n [HTTP_STATUS.FORBIDDEN]: 'Forbidden',\r\n [HTTP_STATUS.NOT_FOUND]: 'Not Found',\r\n [HTTP_STATUS.METHOD_NOT_ALLOWED]: 'Method Not Allowed',\r\n [HTTP_STATUS.CONFLICT]: 'Conflict',\r\n [HTTP_STATUS.UNPROCESSABLE_ENTITY]: 'Unprocessable Entity',\r\n [HTTP_STATUS.TOO_MANY_REQUESTS]: 'Too Many Requests',\r\n [HTTP_STATUS.INTERNAL_SERVER_ERROR]: 'Internal Server Error',\r\n [HTTP_STATUS.SERVICE_UNAVAILABLE]: 'Service Unavailable',\r\n};\r\n\r\n/**\r\n * Common Status Values\r\n */\r\nexport const STATUS = {\r\n ACTIVE: 'active',\r\n INACTIVE: 'inactive',\r\n PENDING: 'pending',\r\n APPROVED: 'approved',\r\n REJECTED: 'rejected',\r\n DELETED: 'deleted',\r\n ARCHIVED: 'archived',\r\n DRAFT: 'draft',\r\n PUBLISHED: 'published',\r\n SUSPENDED: 'suspended',\r\n} as const;\r\n\r\nexport type StatusValue = (typeof STATUS)[keyof typeof STATUS];\r\n\r\n/**\r\n * User Status Values\r\n */\r\nexport const USER_STATUS = {\r\n ACTIVE: 'active',\r\n INACTIVE: 'inactive',\r\n PENDING: 'pending',\r\n SUSPENDED: 'suspended',\r\n BANNED: 'banned',\r\n} as const;\r\n\r\nexport type UserStatusValue = (typeof USER_STATUS)[keyof typeof USER_STATUS];\r\n\r\n/**\r\n * Common Roles\r\n */\r\nexport const ROLES = {\r\n ADMIN: 'admin',\r\n USER: 'user',\r\n MODERATOR: 'moderator',\r\n GUEST: 'guest',\r\n SUPER_ADMIN: 'super_admin',\r\n} as const;\r\n\r\nexport type RoleValue = (typeof ROLES)[keyof typeof ROLES];\r\n\r\n/**\r\n * Pagination Defaults\r\n */\r\nexport const PAGINATION = {\r\n DEFAULT_PAGE: 1,\r\n DEFAULT_LIMIT: 10,\r\n MAX_LIMIT: 100,\r\n} as const;\r\n\r\n/**\r\n * Token Types\r\n */\r\nexport const TOKEN_TYPES = {\r\n ACCESS: 'access',\r\n REFRESH: 'refresh',\r\n RESET_PASSWORD: 'reset_password',\r\n EMAIL_VERIFICATION: 'email_verification',\r\n} as const;\r\n\r\nexport type TokenType = (typeof TOKEN_TYPES)[keyof typeof TOKEN_TYPES];\r\n\r\nexport default {\r\n HTTP_STATUS,\r\n HTTP_STATUS_MESSAGES,\r\n STATUS,\r\n USER_STATUS,\r\n ROLES,\r\n PAGINATION,\r\n TOKEN_TYPES,\r\n};\r\n","/**\r\n * Common Enums and Constants\r\n * Reusable enums for consistent data handling across all projects\r\n */\r\n\r\n// ==========================================\r\n// STATUS ENUMS\r\n// ==========================================\r\n\r\n/**\r\n * Generic status enum for records/items\r\n */\r\nexport const STATUS = {\r\n ACTIVE: 'active',\r\n INACTIVE: 'inactive',\r\n PENDING: 'pending',\r\n APPROVED: 'approved',\r\n REJECTED: 'rejected',\r\n ARCHIVED: 'archived',\r\n DELETED: 'deleted',\r\n DRAFT: 'draft',\r\n PUBLISHED: 'published',\r\n SUSPENDED: 'suspended',\r\n EXPIRED: 'expired',\r\n CANCELLED: 'cancelled',\r\n} as const;\r\n\r\nexport type Status = (typeof STATUS)[keyof typeof STATUS];\r\n\r\n/**\r\n * User account status\r\n */\r\nexport const USER_STATUS = {\r\n ACTIVE: 'active',\r\n INACTIVE: 'inactive',\r\n PENDING: 'pending',\r\n SUSPENDED: 'suspended',\r\n BANNED: 'banned',\r\n DELETED: 'deleted',\r\n UNVERIFIED: 'unverified',\r\n VERIFIED: 'verified',\r\n} as const;\r\n\r\nexport type UserStatus = (typeof USER_STATUS)[keyof typeof USER_STATUS];\r\n\r\n/**\r\n * Order/Transaction status\r\n */\r\nexport const ORDER_STATUS = {\r\n PENDING: 'pending',\r\n CONFIRMED: 'confirmed',\r\n PROCESSING: 'processing',\r\n SHIPPED: 'shipped',\r\n DELIVERED: 'delivered',\r\n CANCELLED: 'cancelled',\r\n REFUNDED: 'refunded',\r\n FAILED: 'failed',\r\n ON_HOLD: 'on_hold',\r\n} as const;\r\n\r\nexport type OrderStatus = (typeof ORDER_STATUS)[keyof typeof ORDER_STATUS];\r\n\r\n/**\r\n * Payment status\r\n */\r\nexport const PAYMENT_STATUS = {\r\n PENDING: 'pending',\r\n PROCESSING: 'processing',\r\n COMPLETED: 'completed',\r\n FAILED: 'failed',\r\n CANCELLED: 'cancelled',\r\n REFUNDED: 'refunded',\r\n PARTIALLY_REFUNDED: 'partially_refunded',\r\n DISPUTED: 'disputed',\r\n} as const;\r\n\r\nexport type PaymentStatus = (typeof PAYMENT_STATUS)[keyof typeof PAYMENT_STATUS];\r\n\r\n/**\r\n * Task/Ticket status\r\n */\r\nexport const TASK_STATUS = {\r\n TODO: 'todo',\r\n IN_PROGRESS: 'in_progress',\r\n IN_REVIEW: 'in_review',\r\n DONE: 'done',\r\n BLOCKED: 'blocked',\r\n CANCELLED: 'cancelled',\r\n ON_HOLD: 'on_hold',\r\n} as const;\r\n\r\nexport type TaskStatus = (typeof TASK_STATUS)[keyof typeof TASK_STATUS];\r\n\r\n/**\r\n * Subscription status\r\n */\r\nexport const SUBSCRIPTION_STATUS = {\r\n ACTIVE: 'active',\r\n TRIAL: 'trial',\r\n PAST_DUE: 'past_due',\r\n CANCELLED: 'cancelled',\r\n EXPIRED: 'expired',\r\n PAUSED: 'paused',\r\n PENDING: 'pending',\r\n} as const;\r\n\r\nexport type SubscriptionStatus = (typeof SUBSCRIPTION_STATUS)[keyof typeof SUBSCRIPTION_STATUS];\r\n\r\n// ==========================================\r\n// SORT ENUMS\r\n// ==========================================\r\n\r\n/**\r\n * Sort direction\r\n */\r\nexport const SORT_DIRECTION = {\r\n ASC: 'asc',\r\n DESC: 'desc',\r\n} as const;\r\n\r\nexport type SortDirection = (typeof SORT_DIRECTION)[keyof typeof SORT_DIRECTION];\r\n\r\n/**\r\n * Common sort options\r\n */\r\nexport const SORT = {\r\n // Date sorting\r\n NEWEST: 'newest',\r\n OLDEST: 'oldest',\r\n CREATED_AT_ASC: 'created_at_asc',\r\n CREATED_AT_DESC: 'created_at_desc',\r\n UPDATED_AT_ASC: 'updated_at_asc',\r\n UPDATED_AT_DESC: 'updated_at_desc',\r\n\r\n // Alphabetical\r\n NAME_ASC: 'name_asc',\r\n NAME_DESC: 'name_desc',\r\n TITLE_ASC: 'title_asc',\r\n TITLE_DESC: 'title_desc',\r\n ALPHABETICAL: 'alphabetical',\r\n REVERSE_ALPHABETICAL: 'reverse_alphabetical',\r\n\r\n // Numeric\r\n PRICE_ASC: 'price_asc',\r\n PRICE_DESC: 'price_desc',\r\n AMOUNT_ASC: 'amount_asc',\r\n AMOUNT_DESC: 'amount_desc',\r\n\r\n // Popularity/Engagement\r\n POPULAR: 'popular',\r\n TRENDING: 'trending',\r\n MOST_VIEWED: 'most_viewed',\r\n MOST_LIKED: 'most_liked',\r\n MOST_COMMENTED: 'most_commented',\r\n TOP_RATED: 'top_rated',\r\n\r\n // Relevance\r\n RELEVANCE: 'relevance',\r\n BEST_MATCH: 'best_match',\r\n\r\n // Custom\r\n CUSTOM: 'custom',\r\n MANUAL: 'manual',\r\n RANDOM: 'random',\r\n} as const;\r\n\r\nexport type Sort = (typeof SORT)[keyof typeof SORT];\r\n\r\n// ==========================================\r\n// ROLE ENUMS\r\n// ==========================================\r\n\r\n/**\r\n * User roles\r\n */\r\nexport const ROLE = {\r\n // System roles\r\n SUPER_ADMIN: 'super_admin',\r\n ADMIN: 'admin',\r\n MODERATOR: 'moderator',\r\n SUPPORT: 'support',\r\n\r\n // User roles\r\n USER: 'user',\r\n MEMBER: 'member',\r\n GUEST: 'guest',\r\n\r\n // Business roles\r\n OWNER: 'owner',\r\n MANAGER: 'manager',\r\n EDITOR: 'editor',\r\n VIEWER: 'viewer',\r\n CONTRIBUTOR: 'contributor',\r\n\r\n // Team roles\r\n TEAM_LEAD: 'team_lead',\r\n TEAM_MEMBER: 'team_member',\r\n\r\n // API roles\r\n API_USER: 'api_user',\r\n SERVICE: 'service',\r\n BOT: 'bot',\r\n} as const;\r\n\r\nexport type Role = (typeof ROLE)[keyof typeof ROLE];\r\n\r\n/**\r\n * Permission levels (hierarchical)\r\n */\r\nexport const PERMISSION_LEVEL = {\r\n NONE: 0,\r\n READ: 1,\r\n WRITE: 2,\r\n DELETE: 3,\r\n ADMIN: 4,\r\n SUPER_ADMIN: 5,\r\n} as const;\r\n\r\nexport type PermissionLevel = (typeof PERMISSION_LEVEL)[keyof typeof PERMISSION_LEVEL];\r\n\r\n// ==========================================\r\n// PRIORITY ENUMS\r\n// ==========================================\r\n\r\nexport const PRIORITY = {\r\n LOWEST: 'lowest',\r\n LOW: 'low',\r\n MEDIUM: 'medium',\r\n HIGH: 'high',\r\n HIGHEST: 'highest',\r\n URGENT: 'urgent',\r\n CRITICAL: 'critical',\r\n} as const;\r\n\r\nexport type Priority = (typeof PRIORITY)[keyof typeof PRIORITY];\r\n\r\n// ==========================================\r\n// VISIBILITY ENUMS\r\n// ==========================================\r\n\r\nexport const VISIBILITY = {\r\n PUBLIC: 'public',\r\n PRIVATE: 'private',\r\n INTERNAL: 'internal',\r\n RESTRICTED: 'restricted',\r\n HIDDEN: 'hidden',\r\n UNLISTED: 'unlisted',\r\n} as const;\r\n\r\nexport type Visibility = (typeof VISIBILITY)[keyof typeof VISIBILITY];\r\n\r\n// ==========================================\r\n// BREAKPOINTS\r\n// ==========================================\r\n\r\n/**\r\n * Responsive breakpoints (pixels)\r\n * Following Tailwind CSS conventions\r\n */\r\nexport const BREAKPOINTS = {\r\n xs: 0,\r\n sm: 640,\r\n md: 768,\r\n lg: 1024,\r\n xl: 1280,\r\n '2xl': 1536,\r\n} as const;\r\n\r\nexport type Breakpoint = keyof typeof BREAKPOINTS;\r\n\r\n/**\r\n * Media query strings for breakpoints\r\n */\r\nexport const MEDIA_QUERIES = {\r\n xs: '(min-width: 0px)',\r\n sm: '(min-width: 640px)',\r\n md: '(min-width: 768px)',\r\n lg: '(min-width: 1024px)',\r\n xl: '(min-width: 1280px)',\r\n '2xl': '(min-width: 1536px)',\r\n} as const;\r\n\r\n/**\r\n * Max-width media queries\r\n */\r\nexport const MEDIA_QUERIES_MAX = {\r\n xs: '(max-width: 639px)',\r\n sm: '(max-width: 767px)',\r\n md: '(max-width: 1023px)',\r\n lg: '(max-width: 1279px)',\r\n xl: '(max-width: 1535px)',\r\n '2xl': '(max-width: 9999px)',\r\n} as const;\r\n\r\n/**\r\n * Container max widths for each breakpoint\r\n */\r\nexport const CONTAINER_WIDTHS = {\r\n sm: 640,\r\n md: 768,\r\n lg: 1024,\r\n xl: 1280,\r\n '2xl': 1536,\r\n} as const;\r\n\r\n// ==========================================\r\n// FILE TYPES\r\n// ==========================================\r\n\r\nexport const FILE_TYPE = {\r\n IMAGE: 'image',\r\n VIDEO: 'video',\r\n AUDIO: 'audio',\r\n DOCUMENT: 'document',\r\n SPREADSHEET: 'spreadsheet',\r\n PRESENTATION: 'presentation',\r\n ARCHIVE: 'archive',\r\n CODE: 'code',\r\n OTHER: 'other',\r\n} as const;\r\n\r\nexport type FileType = (typeof FILE_TYPE)[keyof typeof FILE_TYPE];\r\n\r\n// ==========================================\r\n// NOTIFICATION TYPES\r\n// ==========================================\r\n\r\nexport const NOTIFICATION_TYPE = {\r\n INFO: 'info',\r\n SUCCESS: 'success',\r\n WARNING: 'warning',\r\n ERROR: 'error',\r\n ALERT: 'alert',\r\n} as const;\r\n\r\nexport type NotificationType = (typeof NOTIFICATION_TYPE)[keyof typeof NOTIFICATION_TYPE];\r\n\r\n// ==========================================\r\n// THEME\r\n// ==========================================\r\n\r\nexport const THEME = {\r\n LIGHT: 'light',\r\n DARK: 'dark',\r\n SYSTEM: 'system',\r\n} as const;\r\n\r\nexport type Theme = (typeof THEME)[keyof typeof THEME];\r\n\r\n// ==========================================\r\n// LOCALE\r\n// ==========================================\r\n\r\nexport const LOCALE = {\r\n EN_US: 'en-US',\r\n EN_GB: 'en-GB',\r\n ES_ES: 'es-ES',\r\n FR_FR: 'fr-FR',\r\n DE_DE: 'de-DE',\r\n IT_IT: 'it-IT',\r\n PT_BR: 'pt-BR',\r\n JA_JP: 'ja-JP',\r\n ZH_CN: 'zh-CN',\r\n ZH_TW: 'zh-TW',\r\n KO_KR: 'ko-KR',\r\n HI_IN: 'hi-IN',\r\n AR_SA: 'ar-SA',\r\n RU_RU: 'ru-RU',\r\n} as const;\r\n\r\nexport type Locale = (typeof LOCALE)[keyof typeof LOCALE];\r\n\r\n// ==========================================\r\n// DATE FORMATS\r\n// ==========================================\r\n\r\nexport const DATE_FORMAT = {\r\n ISO: 'yyyy-MM-dd',\r\n US: 'MM/dd/yyyy',\r\n EU: 'dd/MM/yyyy',\r\n LONG: 'MMMM d, yyyy',\r\n SHORT: 'MMM d, yyyy',\r\n WITH_TIME: 'yyyy-MM-dd HH:mm:ss',\r\n RELATIVE: 'relative',\r\n} as const;\r\n\r\nexport type DateFormat = (typeof DATE_FORMAT)[keyof typeof DATE_FORMAT];\r\n\r\n// ==========================================\r\n// INTERVAL\r\n// ==========================================\r\n\r\nexport const INTERVAL = {\r\n DAILY: 'daily',\r\n WEEKLY: 'weekly',\r\n BIWEEKLY: 'biweekly',\r\n MONTHLY: 'monthly',\r\n QUARTERLY: 'quarterly',\r\n YEARLY: 'yearly',\r\n ONCE: 'once',\r\n} as const;\r\n\r\nexport type Interval = (typeof INTERVAL)[keyof typeof INTERVAL];\r\n\r\n// ==========================================\r\n// GENDER\r\n// ==========================================\r\n\r\nexport const GENDER = {\r\n MALE: 'male',\r\n FEMALE: 'female',\r\n OTHER: 'other',\r\n PREFER_NOT_TO_SAY: 'prefer_not_to_say',\r\n} as const;\r\n\r\nexport type Gender = (typeof GENDER)[keyof typeof GENDER];\r\n\r\n// ==========================================\r\n// EXPORT ALL\r\n// ==========================================\r\n\r\nexport const ENUMS = {\r\n STATUS,\r\n USER_STATUS,\r\n ORDER_STATUS,\r\n PAYMENT_STATUS,\r\n TASK_STATUS,\r\n SUBSCRIPTION_STATUS,\r\n SORT_DIRECTION,\r\n SORT,\r\n ROLE,\r\n PERMISSION_LEVEL,\r\n PRIORITY,\r\n VISIBILITY,\r\n BREAKPOINTS,\r\n MEDIA_QUERIES,\r\n MEDIA_QUERIES_MAX,\r\n CONTAINER_WIDTHS,\r\n FILE_TYPE,\r\n NOTIFICATION_TYPE,\r\n THEME,\r\n LOCALE,\r\n DATE_FORMAT,\r\n INTERVAL,\r\n GENDER,\r\n} as const;\r\n\r\nexport default ENUMS;\r\n","/**\r\n * Enhanced Date/Time utilities using date-fns with timezone support\r\n * Deep level date handling for all common operations\r\n */\r\nimport {\r\n format,\r\n formatDistance,\r\n formatDistanceToNow,\r\n formatRelative,\r\n isToday,\r\n isYesterday,\r\n isTomorrow,\r\n isThisWeek,\r\n isThisMonth,\r\n isThisYear,\r\n isPast,\r\n isFuture,\r\n isValid,\r\n parseISO,\r\n addDays,\r\n addWeeks,\r\n addMonths,\r\n addYears,\r\n addHours,\r\n addMinutes,\r\n subDays,\r\n subWeeks,\r\n subMonths,\r\n subYears,\r\n subHours,\r\n subMinutes,\r\n startOfDay,\r\n endOfDay,\r\n startOfWeek,\r\n endOfWeek,\r\n startOfMonth,\r\n endOfMonth,\r\n startOfYear,\r\n endOfYear,\r\n differenceInDays,\r\n differenceInWeeks,\r\n differenceInMonths,\r\n differenceInYears,\r\n differenceInHours,\r\n differenceInMinutes,\r\n differenceInSeconds,\r\n isBefore,\r\n isAfter,\r\n isEqual,\r\n isSameDay,\r\n isSameWeek,\r\n isSameMonth,\r\n isSameYear,\r\n getDay,\r\n getDate,\r\n getMonth,\r\n getYear,\r\n getHours,\r\n getMinutes,\r\n getSeconds,\r\n setHours,\r\n setMinutes,\r\n setSeconds,\r\n eachDayOfInterval,\r\n eachWeekOfInterval,\r\n eachMonthOfInterval,\r\n intervalToDuration,\r\n formatDuration,\r\n} from 'date-fns';\r\n\r\nimport { formatInTimeZone, toZonedTime, fromZonedTime } from 'date-fns-tz';\r\n\r\n// Re-export all date-fns functions for convenience\r\nexport {\r\n format,\r\n formatDistance,\r\n formatDistanceToNow,\r\n formatRelative,\r\n isToday,\r\n isYesterday,\r\n isTomorrow,\r\n isThisWeek,\r\n isThisMonth,\r\n isThisYear,\r\n isPast,\r\n isFuture,\r\n isValid,\r\n parseISO,\r\n addDays,\r\n addWeeks,\r\n addMonths,\r\n addYears,\r\n addHours,\r\n addMinutes,\r\n subDays,\r\n subWeeks,\r\n subMonths,\r\n subYears,\r\n subHours,\r\n subMinutes,\r\n startOfDay,\r\n endOfDay,\r\n startOfWeek,\r\n endOfWeek,\r\n startOfMonth,\r\n endOfMonth,\r\n startOfYear,\r\n endOfYear,\r\n differenceInDays,\r\n differenceInWeeks,\r\n differenceInMonths,\r\n differenceInYears,\r\n differenceInHours,\r\n differenceInMinutes,\r\n differenceInSeconds,\r\n isBefore,\r\n isAfter,\r\n isEqual,\r\n isSameDay,\r\n isSameWeek,\r\n isSameMonth,\r\n isSameYear,\r\n getDay,\r\n getDate,\r\n getMonth,\r\n getYear,\r\n getHours,\r\n getMinutes,\r\n getSeconds,\r\n setHours,\r\n setMinutes,\r\n setSeconds,\r\n eachDayOfInterval,\r\n eachWeekOfInterval,\r\n eachMonthOfInterval,\r\n intervalToDuration,\r\n formatDuration,\r\n formatInTimeZone,\r\n toZonedTime,\r\n fromZonedTime,\r\n};\r\n\r\n/**\r\n * Date input type - accepts Date, string (ISO), or timestamp\r\n */\r\nexport type DateInput = Date | string | number;\r\n\r\n/**\r\n * Parse any date input to Date object\r\n */\r\nexport const parseDate = (date: DateInput): Date => {\r\n if (date instanceof Date) return date;\r\n if (typeof date === 'string') return parseISO(date);\r\n return new Date(date);\r\n};\r\n\r\n/**\r\n * Check if date input is valid\r\n */\r\nexport const isValidDate = (date: DateInput): boolean => {\r\n const parsed = parseDate(date);\r\n return isValid(parsed);\r\n};\r\n\r\n// ==========================================\r\n// FORMAT FUNCTIONS\r\n// ==========================================\r\n\r\n/**\r\n * Format presets for common date formats\r\n */\r\nexport const DATE_FORMATS = {\r\n // Date only\r\n DATE_SHORT: 'MM/dd/yyyy', // 01/15/2026\r\n DATE_MEDIUM: 'MMM d, yyyy', // Jan 15, 2026\r\n DATE_LONG: 'MMMM d, yyyy', // January 15, 2026\r\n DATE_FULL: 'EEEE, MMMM d, yyyy', // Friday, January 15, 2026\r\n DATE_ISO: 'yyyy-MM-dd', // 2026-01-15\r\n\r\n // Time only\r\n TIME_SHORT: 'h:mm a', // 3:30 PM\r\n TIME_MEDIUM: 'h:mm:ss a', // 3:30:45 PM\r\n TIME_24H: 'HH:mm', // 15:30\r\n TIME_24H_FULL: 'HH:mm:ss', // 15:30:45\r\n\r\n // Date and time\r\n DATETIME_SHORT: 'MM/dd/yyyy h:mm a', // 01/15/2026 3:30 PM\r\n DATETIME_MEDIUM: 'MMM d, yyyy h:mm a', // Jan 15, 2026 3:30 PM\r\n DATETIME_LONG: 'MMMM d, yyyy h:mm a', // January 15, 2026 3:30 PM\r\n DATETIME_FULL: 'EEEE, MMMM d, yyyy h:mm a', // Friday, January 15, 2026 3:30 PM\r\n DATETIME_ISO: \"yyyy-MM-dd'T'HH:mm:ss\", // 2026-01-15T15:30:45\r\n\r\n // Special formats\r\n MONTH_YEAR: 'MMMM yyyy', // January 2026\r\n MONTH_DAY: 'MMM d', // Jan 15\r\n DAY_MONTH: 'd MMM', // 15 Jan\r\n WEEKDAY: 'EEEE', // Friday\r\n WEEKDAY_SHORT: 'EEE', // Fri\r\n} as const;\r\n\r\n/**\r\n * Format date with preset or custom format\r\n */\r\nexport const formatDate = (date: DateInput, formatStr: string = DATE_FORMATS.DATE_MEDIUM): string => {\r\n return format(parseDate(date), formatStr);\r\n};\r\n\r\n/**\r\n * Format date with time\r\n */\r\nexport const formatDateTime = (date: DateInput, formatStr: string = DATE_FORMATS.DATETIME_MEDIUM): string => {\r\n return format(parseDate(date), formatStr);\r\n};\r\n\r\n/**\r\n * Format date in a specific timezone\r\n */\r\nexport const formatDateInTimezone = (\r\n date: DateInput,\r\n timezone: string,\r\n formatStr: string = DATE_FORMATS.DATETIME_MEDIUM\r\n): string => {\r\n return formatInTimeZone(parseDate(date), timezone, formatStr);\r\n};\r\n\r\n/**\r\n * Format date as relative time (e.g., \"2 hours ago\", \"in 3 days\")\r\n */\r\nexport const formatRelativeTime = (date: DateInput, baseDate?: DateInput): string => {\r\n const parsed = parseDate(date);\r\n if (baseDate) {\r\n return formatDistance(parsed, parseDate(baseDate), { addSuffix: true });\r\n }\r\n return formatDistanceToNow(parsed, { addSuffix: true });\r\n};\r\n\r\n/**\r\n * Format date as smart relative (Today at 3:30 PM, Yesterday, etc.)\r\n */\r\nexport const formatSmartDate = (date: DateInput): string => {\r\n const parsed = parseDate(date);\r\n\r\n if (isToday(parsed)) {\r\n return `Today at ${format(parsed, DATE_FORMATS.TIME_SHORT)}`;\r\n }\r\n if (isYesterday(parsed)) {\r\n return `Yesterday at ${format(parsed, DATE_FORMATS.TIME_SHORT)}`;\r\n }\r\n if (isTomorrow(parsed)) {\r\n return `Tomorrow at ${format(parsed, DATE_FORMATS.TIME_SHORT)}`;\r\n }\r\n if (isThisWeek(parsed)) {\r\n return format(parsed, 'EEEE \\'at\\' h:mm a'); // Friday at 3:30 PM\r\n }\r\n if (isThisYear(parsed)) {\r\n return format(parsed, 'MMM d \\'at\\' h:mm a'); // Jan 15 at 3:30 PM\r\n }\r\n return format(parsed, DATE_FORMATS.DATETIME_MEDIUM);\r\n};\r\n\r\n/**\r\n * Format duration between two dates in human readable form\r\n */\r\nexport const formatDateRange = (start: DateInput, end: DateInput): string => {\r\n const duration = intervalToDuration({\r\n start: parseDate(start),\r\n end: parseDate(end),\r\n });\r\n\r\n return formatDuration(duration, {\r\n format: ['years', 'months', 'days', 'hours', 'minutes'],\r\n });\r\n};\r\n\r\n// ==========================================\r\n// TIMEZONE FUNCTIONS\r\n// ==========================================\r\n\r\n/**\r\n * Convert date to a specific timezone\r\n */\r\nexport const toTimezone = (date: DateInput, timezone: string): Date => {\r\n return toZonedTime(parseDate(date), timezone);\r\n};\r\n\r\n/**\r\n * Convert date from a specific timezone to UTC\r\n */\r\nexport const fromTimezone = (date: DateInput, timezone: string): Date => {\r\n return fromZonedTime(parseDate(date), timezone);\r\n};\r\n\r\n/**\r\n * Get current time in a specific timezone\r\n */\r\nexport const nowInTimezone = (timezone: string): Date => {\r\n return toZonedTime(new Date(), timezone);\r\n};\r\n\r\n/**\r\n * Format time difference between timezones\r\n */\r\nexport const getTimezoneDifference = (timezone1: string, timezone2: string): string => {\r\n const now = new Date();\r\n const time1 = toZonedTime(now, timezone1);\r\n const time2 = toZonedTime(now, timezone2);\r\n const diffMinutes = differenceInMinutes(time1, time2);\r\n const hours = Math.floor(Math.abs(diffMinutes) / 60);\r\n const minutes = Math.abs(diffMinutes) % 60;\r\n const sign = diffMinutes >= 0 ? '+' : '-';\r\n\r\n if (minutes === 0) {\r\n return `${sign}${hours}h`;\r\n }\r\n return `${sign}${hours}h ${minutes}m`;\r\n};\r\n\r\n// ==========================================\r\n// DATE ARITHMETIC\r\n// ==========================================\r\n\r\n/**\r\n * Add time to a date\r\n */\r\nexport const addTime = (\r\n date: DateInput,\r\n amount: number,\r\n unit: 'minutes' | 'hours' | 'days' | 'weeks' | 'months' | 'years'\r\n): Date => {\r\n const parsed = parseDate(date);\r\n switch (unit) {\r\n case 'minutes':\r\n return addMinutes(parsed, amount);\r\n case 'hours':\r\n return addHours(parsed, amount);\r\n case 'days':\r\n return addDays(parsed, amount);\r\n case 'weeks':\r\n return addWeeks(parsed, amount);\r\n case 'months':\r\n return addMonths(parsed, amount);\r\n case 'years':\r\n return addYears(parsed, amount);\r\n }\r\n};\r\n\r\n/**\r\n * Subtract time from a date\r\n */\r\nexport const subtractTime = (\r\n date: DateInput,\r\n amount: number,\r\n unit: 'minutes' | 'hours' | 'days' | 'weeks' | 'months' | 'years'\r\n): Date => {\r\n const parsed = parseDate(date);\r\n switch (unit) {\r\n case 'minutes':\r\n return subMinutes(parsed, amount);\r\n case 'hours':\r\n return subHours(parsed, amount);\r\n case 'days':\r\n return subDays(parsed, amount);\r\n case 'weeks':\r\n return subWeeks(parsed, amount);\r\n case 'months':\r\n return subMonths(parsed, amount);\r\n case 'years':\r\n return subYears(parsed, amount);\r\n }\r\n};\r\n\r\n/**\r\n * Get difference between two dates\r\n */\r\nexport const getDateDifference = (\r\n date1: DateInput,\r\n date2: DateInput,\r\n unit: 'seconds' | 'minutes' | 'hours' | 'days' | 'weeks' | 'months' | 'years'\r\n): number => {\r\n const d1 = parseDate(date1);\r\n const d2 = parseDate(date2);\r\n switch (unit) {\r\n case 'seconds':\r\n return differenceInSeconds(d1, d2);\r\n case 'minutes':\r\n return differenceInMinutes(d1, d2);\r\n case 'hours':\r\n return differenceInHours(d1, d2);\r\n case 'days':\r\n return differenceInDays(d1, d2);\r\n case 'weeks':\r\n return differenceInWeeks(d1, d2);\r\n case 'months':\r\n return differenceInMonths(d1, d2);\r\n case 'years':\r\n return differenceInYears(d1, d2);\r\n }\r\n};\r\n\r\n// ==========================================\r\n// DATE RANGE FUNCTIONS\r\n// ==========================================\r\n\r\n/**\r\n * Get all days in a range\r\n */\r\nexport const getDaysInRange = (start: DateInput, end: DateInput): Date[] => {\r\n return eachDayOfInterval({\r\n start: parseDate(start),\r\n end: parseDate(end),\r\n });\r\n};\r\n\r\n/**\r\n * Get all weeks in a range\r\n */\r\nexport const getWeeksInRange = (start: DateInput, end: DateInput): Date[] => {\r\n return eachWeekOfInterval({\r\n start: parseDate(start),\r\n end: parseDate(end),\r\n });\r\n};\r\n\r\n/**\r\n * Get all months in a range\r\n */\r\nexport const getMonthsInRange = (start: DateInput, end: DateInput): Date[] => {\r\n return eachMonthOfInterval({\r\n start: parseDate(start),\r\n end: parseDate(end),\r\n });\r\n};\r\n\r\n// ==========================================\r\n// DATE BOUNDARIES\r\n// ==========================================\r\n\r\n/**\r\n * Get start and end of day\r\n */\r\nexport const getDayBoundaries = (date: DateInput): { start: Date; end: Date } => {\r\n const parsed = parseDate(date);\r\n return {\r\n start: startOfDay(parsed),\r\n end: endOfDay(parsed),\r\n };\r\n};\r\n\r\n/**\r\n * Get start and end of week\r\n */\r\nexport const getWeekBoundaries = (date: DateInput, weekStartsOn: 0 | 1 = 0): { start: Date; end: Date } => {\r\n const parsed = parseDate(date);\r\n return {\r\n start: startOfWeek(parsed, { weekStartsOn }),\r\n end: endOfWeek(parsed, { weekStartsOn }),\r\n };\r\n};\r\n\r\n/**\r\n * Get start and end of month\r\n */\r\nexport const getMonthBoundaries = (date: DateInput): { start: Date; end: Date } => {\r\n const parsed = parseDate(date);\r\n return {\r\n start: startOfMonth(parsed),\r\n end: endOfMonth(parsed),\r\n };\r\n};\r\n\r\n/**\r\n * Get start and end of year\r\n */\r\nexport const getYearBoundaries = (date: DateInput): { start: Date; end: Date } => {\r\n const parsed = parseDate(date);\r\n return {\r\n start: startOfYear(parsed),\r\n end: endOfYear(parsed),\r\n };\r\n};\r\n\r\n// ==========================================\r\n// DATE COMPARISON\r\n// ==========================================\r\n\r\n/**\r\n * Check if date is between two dates (inclusive)\r\n */\r\nexport const isDateBetween = (date: DateInput, start: DateInput, end: DateInput): boolean => {\r\n const d = parseDate(date);\r\n const s = parseDate(start);\r\n const e = parseDate(end);\r\n return (isAfter(d, s) || isEqual(d, s)) && (isBefore(d, e) || isEqual(d, e));\r\n};\r\n\r\n/**\r\n * Check if two date ranges overlap\r\n */\r\nexport const doDateRangesOverlap = (\r\n range1Start: DateInput,\r\n range1End: DateInput,\r\n range2Start: DateInput,\r\n range2End: DateInput\r\n): boolean => {\r\n const r1s = parseDate(range1Start);\r\n const r1e = parseDate(range1End);\r\n const r2s = parseDate(range2Start);\r\n const r2e = parseDate(range2End);\r\n\r\n return isBefore(r1s, r2e) && isAfter(r1e, r2s);\r\n};\r\n\r\n// ==========================================\r\n// UTILITY FUNCTIONS\r\n// ==========================================\r\n\r\n/**\r\n * Get age from birthdate\r\n */\r\nexport const getAge = (birthDate: DateInput): number => {\r\n return differenceInYears(new Date(), parseDate(birthDate));\r\n};\r\n\r\n/**\r\n * Check if date is a weekend\r\n */\r\nexport const isWeekend = (date: DateInput): boolean => {\r\n const day = getDay(parseDate(date));\r\n return day === 0 || day === 6;\r\n};\r\n\r\n/**\r\n * Check if date is a weekday\r\n */\r\nexport const isWeekday = (date: DateInput): boolean => {\r\n return !isWeekend(date);\r\n};\r\n\r\n/**\r\n * Get days until a date\r\n */\r\nexport const daysUntil = (date: DateInput): number => {\r\n return differenceInDays(parseDate(date), new Date());\r\n};\r\n\r\n/**\r\n * Get days since a date\r\n */\r\nexport const daysSince = (date: DateInput): number => {\r\n return differenceInDays(new Date(), parseDate(date));\r\n};\r\n\r\n/**\r\n * Format for HTML date input (yyyy-MM-dd)\r\n */\r\nexport const toDateInputValue = (date: DateInput): string => {\r\n return format(parseDate(date), DATE_FORMATS.DATE_ISO);\r\n};\r\n\r\n/**\r\n * Format for HTML datetime-local input\r\n */\r\nexport const toDateTimeInputValue = (date: DateInput): string => {\r\n return format(parseDate(date), \"yyyy-MM-dd'T'HH:mm\");\r\n};\r\n\r\n/**\r\n * Format for HTML time input (HH:mm)\r\n */\r\nexport const toTimeInputValue = (date: DateInput): string => {\r\n return format(parseDate(date), DATE_FORMATS.TIME_24H);\r\n};\r\n\r\n/**\r\n * Set time on a date\r\n */\r\nexport const setTime = (date: DateInput, hours: number, minutes: number, seconds: number = 0): Date => {\r\n let result = parseDate(date);\r\n result = setHours(result, hours);\r\n result = setMinutes(result, minutes);\r\n result = setSeconds(result, seconds);\r\n return result;\r\n};\r\n\r\n/**\r\n * Combine date from one input and time from another\r\n */\r\nexport const combineDateAndTime = (dateInput: DateInput, timeInput: DateInput): Date => {\r\n const date = parseDate(dateInput);\r\n const time = parseDate(timeInput);\r\n return setTime(date, getHours(time), getMinutes(time), getSeconds(time));\r\n};\r\n\r\nexport default {\r\n // Core\r\n parseDate,\r\n isValidDate,\r\n DATE_FORMATS,\r\n\r\n // Format\r\n formatDate,\r\n formatDateTime,\r\n formatDateInTimezone,\r\n formatRelativeTime,\r\n formatSmartDate,\r\n formatDateRange,\r\n\r\n // Timezone\r\n toTimezone,\r\n fromTimezone,\r\n nowInTimezone,\r\n getTimezoneDifference,\r\n\r\n // Arithmetic\r\n addTime,\r\n subtractTime,\r\n getDateDifference,\r\n\r\n // Ranges\r\n getDaysInRange,\r\n getWeeksInRange,\r\n getMonthsInRange,\r\n\r\n // Boundaries\r\n getDayBoundaries,\r\n getWeekBoundaries,\r\n getMonthBoundaries,\r\n getYearBoundaries,\r\n\r\n // Comparison\r\n isDateBetween,\r\n doDateRangesOverlap,\r\n\r\n // Utilities\r\n getAge,\r\n isWeekend,\r\n isWeekday,\r\n daysUntil,\r\n daysSince,\r\n toDateInputValue,\r\n toDateTimeInputValue,\r\n toTimeInputValue,\r\n setTime,\r\n combineDateAndTime,\r\n};\r\n","/**\r\n * Common Validation Rules & Patterns\r\n * Use with Yup, Zod, or custom validators\r\n */\r\n\r\n// ==========================================\r\n// REGEX PATTERNS\r\n// ==========================================\r\n\r\nexport const VALIDATION_PATTERNS = {\r\n /** Email pattern (RFC 5322 simplified) */\r\n EMAIL: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/,\r\n\r\n /** Strong password: min 8 chars, uppercase, lowercase, number, special char */\r\n PASSWORD_STRONG:\r\n /^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]{8,}$/,\r\n\r\n /** Medium password: min 8 chars, uppercase, lowercase, number */\r\n PASSWORD_MEDIUM: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)[A-Za-z\\d@$!%*?&]{8,}$/,\r\n\r\n /** Basic password: min 8 chars */\r\n PASSWORD_BASIC: /^.{8,}$/,\r\n\r\n /** Phone number (international) */\r\n PHONE_INTERNATIONAL: /^\\+?[\\d\\s\\-().]{10,}$/,\r\n\r\n /** Phone number (US) */\r\n PHONE_US: /^\\(?([0-9]{3})\\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$/,\r\n\r\n /** Phone number (India) */\r\n PHONE_INDIA: /^[6-9]\\d{9}$/,\r\n\r\n /** URL pattern */\r\n URL: /^(https?:\\/\\/)?([\\da-z.-]+)\\.([a-z.]{2,6})([/\\w .-]*)*\\/?$/,\r\n\r\n /** URL with required protocol */\r\n URL_STRICT: /^https?:\\/\\/([\\da-z.-]+)\\.([a-z.]{2,6})([/\\w .-]*)*\\/?$/,\r\n\r\n /** Alphanumeric only */\r\n ALPHANUMERIC: /^[a-zA-Z0-9]+$/,\r\n\r\n /** Letters only */\r\n LETTERS_ONLY: /^[a-zA-Z]+$/,\r\n\r\n /** Numbers only */\r\n NUMBERS_ONLY: /^\\d+$/,\r\n\r\n /** Slug pattern (kebab-case) */\r\n SLUG: /^[a-z0-9]+(?:-[a-z0-9]+)*$/,\r\n\r\n /** Username pattern (alphanumeric, underscore, hyphen) */\r\n USERNAME: /^[a-zA-Z0-9_-]{3,30}$/,\r\n\r\n /** Credit card (basic validation) */\r\n CREDIT_CARD: /^\\d{13,19}$/,\r\n\r\n /** CVV (3 or 4 digits) */\r\n CVV: /^\\d{3,4}$/,\r\n\r\n /** ZIP code (US) */\r\n ZIP_US: /^\\d{5}(-\\d{4})?$/,\r\n\r\n /** Postal code (India) */\r\n POSTAL_INDIA: /^\\d{6}$/,\r\n\r\n /** IP Address (IPv4) */\r\n IPV4: /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/,\r\n\r\n /** Hex color */\r\n HEX_COLOR: /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/,\r\n\r\n /** Date (YYYY-MM-DD) */\r\n DATE_ISO: /^\\d{4}-\\d{2}-\\d{2}$/,\r\n\r\n /** Time (HH:MM or HH:MM:SS) */\r\n TIME: /^([01]\\d|2[0-3]):([0-5]\\d)(:[0-5]\\d)?$/,\r\n} as const;\r\n\r\n// ==========================================\r\n// VALIDATION FUNCTIONS\r\n// ==========================================\r\n\r\n/**\r\n * Validate email format\r\n */\r\nexport const isValidEmail = (email: string): boolean => {\r\n return VALIDATION_PATTERNS.EMAIL.test(email.trim());\r\n};\r\n\r\n/**\r\n * Validate password strength\r\n */\r\nexport const isValidPassword = (\r\n password: string,\r\n strength: 'basic' | 'medium' | 'strong' = 'medium'\r\n): boolean => {\r\n switch (strength) {\r\n case 'strong':\r\n return VALIDATION_PATTERNS.PASSWORD_STRONG.test(password);\r\n case 'medium':\r\n return VALIDATION_PATTERNS.PASSWORD_MEDIUM.test(password);\r\n case 'basic':\r\n default:\r\n return VALIDATION_PATTERNS.PASSWORD_BASIC.test(password);\r\n }\r\n};\r\n\r\n/**\r\n * Validate phone number\r\n */\r\nexport const isValidPhone = (\r\n phone: string,\r\n format: 'international' | 'us' | 'india' = 'international'\r\n): boolean => {\r\n const cleaned = phone.replace(/\\s/g, '');\r\n switch (format) {\r\n case 'us':\r\n return VALIDATION_PATTERNS.PHONE_US.test(cleaned);\r\n case 'india':\r\n return VALIDATION_PATTERNS.PHONE_INDIA.test(cleaned);\r\n case 'international':\r\n default:\r\n return VALIDATION_PATTERNS.PHONE_INTERNATIONAL.test(cleaned);\r\n }\r\n};\r\n\r\n/**\r\n * Validate URL format\r\n */\r\nexport const isValidUrl = (url: string, requireProtocol: boolean = false): boolean => {\r\n if (requireProtocol) {\r\n return VALIDATION_PATTERNS.URL_STRICT.test(url);\r\n }\r\n return VALIDATION_PATTERNS.URL.test(url);\r\n};\r\n\r\n/**\r\n * Validate username format\r\n */\r\nexport const isValidUsername = (username: string): boolean => {\r\n return VALIDATION_PATTERNS.USERNAME.test(username);\r\n};\r\n\r\n/**\r\n * Validate slug format\r\n */\r\nexport const isValidSlug = (slug: string): boolean => {\r\n return VALIDATION_PATTERNS.SLUG.test(slug);\r\n};\r\n\r\n// ==========================================\r\n// VALIDATION MESSAGES\r\n// ==========================================\r\n\r\nexport const VALIDATION_MESSAGES = {\r\n // Required fields\r\n REQUIRED: 'This field is required',\r\n REQUIRED_FIELD: (field: string) => `${field} is required`,\r\n\r\n // Email\r\n EMAIL_INVALID: 'Please enter a valid email address',\r\n EMAIL_REQUIRED: 'Email is required',\r\n\r\n // Password\r\n PASSWORD_REQUIRED: 'Password is required',\r\n PASSWORD_MIN_LENGTH: (length: number) => `Password must be at least ${length} characters`,\r\n PASSWORD_WEAK: 'Password is too weak',\r\n PASSWORD_MEDIUM: 'Password must contain uppercase, lowercase, and number',\r\n PASSWORD_STRONG: 'Password must contain uppercase, lowercase, number, and special character',\r\n PASSWORD_MISMATCH: 'Passwords do not match',\r\n\r\n // Name\r\n NAME_REQUIRED: 'Name is required',\r\n FIRST_NAME_REQUIRED: 'First name is required',\r\n LAST_NAME_REQUIRED: 'Last name is required',\r\n NAME_MIN_LENGTH: (length: number) => `Name must be at least ${length} characters`,\r\n NAME_MAX_LENGTH: (length: number) => `Name must be at most ${length} characters`,\r\n\r\n // Phone\r\n PHONE_INVALID: 'Please enter a valid phone number',\r\n PHONE_REQUIRED: 'Phone number is required',\r\n\r\n // URL\r\n URL_INVALID: 'Please enter a valid URL',\r\n\r\n // Username\r\n USERNAME_INVALID: 'Username can only contain letters, numbers, underscores, and hyphens',\r\n USERNAME_MIN_LENGTH: 'Username must be at least 3 characters',\r\n USERNAME_MAX_LENGTH: 'Username must be at most 30 characters',\r\n USERNAME_TAKEN: 'This username is already taken',\r\n\r\n // General\r\n MIN_LENGTH: (field: string, length: number) => `${field} must be at least ${length} characters`,\r\n MAX_LENGTH: (field: string, length: number) => `${field} must be at most ${length} characters`,\r\n MIN_VALUE: (field: string, value: number) => `${field} must be at least ${value}`,\r\n MAX_VALUE: (field: string, value: number) => `${field} must be at most ${value}`,\r\n INVALID_FORMAT: 'Invalid format',\r\n TERMS_REQUIRED: 'You must accept the terms and conditions',\r\n} as const;\r\n\r\n// ==========================================\r\n// COMMON VALIDATION RULES (for schema builders)\r\n// ==========================================\r\n\r\nexport const VALIDATION_RULES = {\r\n email: {\r\n pattern: VALIDATION_PATTERNS.EMAIL,\r\n message: VALIDATION_MESSAGES.EMAIL_INVALID,\r\n },\r\n password: {\r\n minLength: 8,\r\n pattern: VALIDATION_PATTERNS.PASSWORD_MEDIUM,\r\n message: VALIDATION_MESSAGES.PASSWORD_MEDIUM,\r\n },\r\n passwordStrong: {\r\n minLength: 8,\r\n pattern: VALIDATION_PATTERNS.PASSWORD_STRONG,\r\n message: VALIDATION_MESSAGES.PASSWORD_STRONG,\r\n },\r\n name: {\r\n minLength: 2,\r\n maxLength: 50,\r\n },\r\n username: {\r\n minLength: 3,\r\n maxLength: 30,\r\n pattern: VALIDATION_PATTERNS.USERNAME,\r\n message: VALIDATION_MESSAGES.USERNAME_INVALID,\r\n },\r\n phone: {\r\n pattern: VALIDATION_PATTERNS.PHONE_INTERNATIONAL,\r\n message: VALIDATION_MESSAGES.PHONE_INVALID,\r\n },\r\n url: {\r\n pattern: VALIDATION_PATTERNS.URL,\r\n message: VALIDATION_MESSAGES.URL_INVALID,\r\n },\r\n} as const;\r\n\r\nexport default {\r\n VALIDATION_PATTERNS,\r\n VALIDATION_MESSAGES,\r\n VALIDATION_RULES,\r\n isValidEmail,\r\n isValidPassword,\r\n isValidPhone,\r\n isValidUrl,\r\n isValidUsername,\r\n isValidSlug,\r\n};\r\n"]}
|