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
@@ -0,0 +1,171 @@
1
+ // src/schema.ts
2
+ var Schema = class {
3
+ safeParse(value) {
4
+ try {
5
+ const data = this.parse(value);
6
+ return { success: true, data };
7
+ } catch (error) {
8
+ if (error instanceof SchemaError) {
9
+ return { success: false, errors: error.errors };
10
+ }
11
+ return {
12
+ success: false,
13
+ errors: [{ field: "root", code: "UNKNOWN_ERROR", message: String(error) }]
14
+ };
15
+ }
16
+ }
17
+ optional() {
18
+ return new OptionalSchema(this);
19
+ }
20
+ nullable() {
21
+ return new NullableSchema(this);
22
+ }
23
+ };
24
+ var SchemaError = class extends Error {
25
+ constructor(errors) {
26
+ super(errors.map((e) => e.message).join(", "));
27
+ this.errors = errors;
28
+ }
29
+ };
30
+ var StringSchema = class extends Schema {
31
+ checks = [];
32
+ parse(value) {
33
+ if (typeof value !== "string") {
34
+ throw new SchemaError([{ field: "root", code: "INVALID_TYPE", message: "Expected string" }]);
35
+ }
36
+ const errors = [];
37
+ for (const check of this.checks) {
38
+ const error = check(value);
39
+ if (error) errors.push(error);
40
+ }
41
+ if (errors.length > 0) throw new SchemaError(errors);
42
+ return value;
43
+ }
44
+ min(length, message) {
45
+ this.checks.push((val) => val.length < length ? { field: "root", code: "TOO_SHORT", message: message || `Must be at least ${length} characters` } : null);
46
+ return this;
47
+ }
48
+ max(length, message) {
49
+ this.checks.push((val) => val.length > length ? { field: "root", code: "TOO_LONG", message: message || `Must be at most ${length} characters` } : null);
50
+ return this;
51
+ }
52
+ email(message) {
53
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
54
+ this.checks.push((val) => !emailRegex.test(val) ? { field: "root", code: "INVALID_EMAIL", message: message || "Invalid email address" } : null);
55
+ return this;
56
+ }
57
+ };
58
+ var NumberSchema = class extends Schema {
59
+ checks = [];
60
+ parse(value) {
61
+ if (typeof value !== "number" || Number.isNaN(value)) {
62
+ throw new SchemaError([{ field: "root", code: "INVALID_TYPE", message: "Expected number" }]);
63
+ }
64
+ const errors = [];
65
+ for (const check of this.checks) {
66
+ const error = check(value);
67
+ if (error) errors.push(error);
68
+ }
69
+ if (errors.length > 0) throw new SchemaError(errors);
70
+ return value;
71
+ }
72
+ min(min, message) {
73
+ this.checks.push((val) => val < min ? { field: "root", code: "TOO_SMALL", message: message || `Must be at least ${min}` } : null);
74
+ return this;
75
+ }
76
+ max(max, message) {
77
+ this.checks.push((val) => val > max ? { field: "root", code: "TOO_LARGE", message: message || `Must be at most ${max}` } : null);
78
+ return this;
79
+ }
80
+ int(message) {
81
+ this.checks.push((val) => !Number.isInteger(val) ? { field: "root", code: "INVALID_INTEGER", message: message || "Must be an integer" } : null);
82
+ return this;
83
+ }
84
+ };
85
+ var BooleanSchema = class extends Schema {
86
+ parse(value) {
87
+ if (typeof value !== "boolean") {
88
+ throw new SchemaError([{ field: "root", code: "INVALID_TYPE", message: "Expected boolean" }]);
89
+ }
90
+ return value;
91
+ }
92
+ };
93
+ var ObjectSchema = class extends Schema {
94
+ constructor(shape) {
95
+ super();
96
+ this.shape = shape;
97
+ }
98
+ parse(value) {
99
+ if (typeof value !== "object" || value === null) {
100
+ throw new SchemaError([{ field: "root", code: "INVALID_TYPE", message: "Expected object" }]);
101
+ }
102
+ const result = {};
103
+ const errors = [];
104
+ for (const key in this.shape) {
105
+ try {
106
+ result[key] = this.shape[key].parse(value[key]);
107
+ } catch (error) {
108
+ if (error instanceof SchemaError) {
109
+ errors.push(...error.errors.map((e) => ({ ...e, field: `${key}.${e.field}`.replace(".root", "") })));
110
+ }
111
+ }
112
+ }
113
+ if (errors.length > 0) throw new SchemaError(errors);
114
+ return result;
115
+ }
116
+ };
117
+ var ArraySchema = class extends Schema {
118
+ constructor(itemSchema) {
119
+ super();
120
+ this.itemSchema = itemSchema;
121
+ }
122
+ parse(value) {
123
+ if (!Array.isArray(value)) {
124
+ throw new SchemaError([{ field: "root", code: "INVALID_TYPE", message: "Expected array" }]);
125
+ }
126
+ const result = [];
127
+ const errors = [];
128
+ value.forEach((item, index) => {
129
+ try {
130
+ result.push(this.itemSchema.parse(item));
131
+ } catch (error) {
132
+ if (error instanceof SchemaError) {
133
+ errors.push(...error.errors.map((e) => ({ ...e, field: `[${index}].${e.field}`.replace(".root", "") })));
134
+ }
135
+ }
136
+ });
137
+ if (errors.length > 0) throw new SchemaError(errors);
138
+ return result;
139
+ }
140
+ };
141
+ var OptionalSchema = class extends Schema {
142
+ constructor(schema) {
143
+ super();
144
+ this.schema = schema;
145
+ }
146
+ parse(value) {
147
+ if (value === void 0) return void 0;
148
+ return this.schema.parse(value);
149
+ }
150
+ };
151
+ var NullableSchema = class extends Schema {
152
+ constructor(schema) {
153
+ super();
154
+ this.schema = schema;
155
+ }
156
+ parse(value) {
157
+ if (value === null) return null;
158
+ return this.schema.parse(value);
159
+ }
160
+ };
161
+ var z = {
162
+ string: () => new StringSchema(),
163
+ number: () => new NumberSchema(),
164
+ boolean: () => new BooleanSchema(),
165
+ object: (shape) => new ObjectSchema(shape),
166
+ array: (schema) => new ArraySchema(schema)
167
+ };
168
+
169
+ export { z };
170
+ //# sourceMappingURL=chunk-HOTOYIPB.js.map
171
+ //# sourceMappingURL=chunk-HOTOYIPB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/schema.ts"],"names":[],"mappings":"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","file":"chunk-HOTOYIPB.js","sourcesContent":["/**\r\n * Schema Builder API\r\n * A lightweight, Zod-inspired schema validation system\r\n *\r\n * @packageDocumentation\r\n * @since 1.1.0\r\n */\r\n\r\nimport { IValidationError } from './types/index';\r\n\r\nexport type ParseResult<T> =\r\n | { success: true; data: T }\r\n | { success: false; errors: IValidationError[] };\r\n\r\n/**\r\n * Base Schema class\r\n */\r\nabstract class Schema<T> {\r\n abstract parse(value: unknown): T;\r\n\r\n safeParse(value: unknown): ParseResult<T> {\r\n try {\r\n const data = this.parse(value);\r\n return { success: true, data };\r\n } catch (error) {\r\n if (error instanceof SchemaError) {\r\n return { success: false, errors: error.errors };\r\n }\r\n return {\r\n success: false,\r\n errors: [{ field: 'root', code: 'UNKNOWN_ERROR', message: String(error) }],\r\n };\r\n }\r\n }\r\n\r\n optional(): Schema<T | undefined> {\r\n return new OptionalSchema(this);\r\n }\r\n\r\n nullable(): Schema<T | null> {\r\n return new NullableSchema(this);\r\n }\r\n}\r\n\r\nclass SchemaError extends Error {\r\n constructor(public errors: IValidationError[]) {\r\n super(errors.map(e => e.message).join(', '));\r\n }\r\n}\r\n\r\n/**\r\n * String Schema\r\n */\r\nclass StringSchema extends Schema<string> {\r\n private checks: Array<(val: string) => IValidationError | null> = [];\r\n\r\n parse(value: unknown): string {\r\n if (typeof value !== 'string') {\r\n throw new SchemaError([{ field: 'root', code: 'INVALID_TYPE', message: 'Expected string' }]);\r\n }\r\n\r\n const errors: IValidationError[] = [];\r\n for (const check of this.checks) {\r\n const error = check(value);\r\n if (error) errors.push(error);\r\n }\r\n\r\n if (errors.length > 0) throw new SchemaError(errors);\r\n return value;\r\n }\r\n\r\n min(length: number, message?: string): this {\r\n this.checks.push(val => val.length < length ? { field: 'root', code: 'TOO_SHORT', message: message || `Must be at least ${length} characters` } : null);\r\n return this;\r\n }\r\n\r\n max(length: number, message?: string): this {\r\n this.checks.push(val => val.length > length ? { field: 'root', code: 'TOO_LONG', message: message || `Must be at most ${length} characters` } : null);\r\n return this;\r\n }\r\n\r\n email(message?: string): this {\r\n // Simple regex to avoid circular dep with custom email validator for now\r\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n this.checks.push(val => !emailRegex.test(val) ? { field: 'root', code: 'INVALID_EMAIL', message: message || 'Invalid email address' } : null);\r\n return this;\r\n }\r\n}\r\n\r\n/**\r\n * Number Schema\r\n */\r\nclass NumberSchema extends Schema<number> {\r\n private checks: Array<(val: number) => IValidationError | null> = [];\r\n\r\n parse(value: unknown): number {\r\n if (typeof value !== 'number' || Number.isNaN(value)) {\r\n throw new SchemaError([{ field: 'root', code: 'INVALID_TYPE', message: 'Expected number' }]);\r\n }\r\n\r\n const errors: IValidationError[] = [];\r\n for (const check of this.checks) {\r\n const error = check(value);\r\n if (error) errors.push(error);\r\n }\r\n\r\n if (errors.length > 0) throw new SchemaError(errors);\r\n return value;\r\n }\r\n\r\n min(min: number, message?: string): this {\r\n this.checks.push(val => val < min ? { field: 'root', code: 'TOO_SMALL', message: message || `Must be at least ${min}` } : null);\r\n return this;\r\n }\r\n\r\n max(max: number, message?: string): this {\r\n this.checks.push(val => val > max ? { field: 'root', code: 'TOO_LARGE', message: message || `Must be at most ${max}` } : null);\r\n return this;\r\n }\r\n\r\n int(message?: string): this {\r\n this.checks.push(val => !Number.isInteger(val) ? { field: 'root', code: 'INVALID_INTEGER', message: message || 'Must be an integer' } : null);\r\n return this;\r\n }\r\n}\r\n\r\n/**\r\n * Boolean Schema\r\n */\r\nclass BooleanSchema extends Schema<boolean> {\r\n parse(value: unknown): boolean {\r\n if (typeof value !== 'boolean') {\r\n throw new SchemaError([{ field: 'root', code: 'INVALID_TYPE', message: 'Expected boolean' }]);\r\n }\r\n return value;\r\n }\r\n}\r\n\r\n/**\r\n * Object Schema\r\n */\r\nclass ObjectSchema<T extends Record<string, Schema<any>>> extends Schema<{ [K in keyof T]: T[K] extends Schema<infer U> ? U : never }> {\r\n constructor(private shape: T) {\r\n super();\r\n }\r\n\r\n parse(value: unknown): { [K in keyof T]: T[K] extends Schema<infer U> ? U : never } {\r\n if (typeof value !== 'object' || value === null) {\r\n throw new SchemaError([{ field: 'root', code: 'INVALID_TYPE', message: 'Expected object' }]);\r\n }\r\n\r\n const result: any = {};\r\n const errors: IValidationError[] = [];\r\n\r\n for (const key in this.shape) {\r\n try {\r\n result[key] = this.shape[key].parse((value as any)[key]);\r\n } catch (error) {\r\n if (error instanceof SchemaError) {\r\n errors.push(...error.errors.map(e => ({ ...e, field: `${key}.${e.field}`.replace('.root', '') })));\r\n }\r\n }\r\n }\r\n\r\n if (errors.length > 0) throw new SchemaError(errors);\r\n return result;\r\n }\r\n}\r\n\r\n/**\r\n * Array Schema\r\n */\r\nclass ArraySchema<T> extends Schema<T[]> {\r\n constructor(private itemSchema: Schema<T>) {\r\n super();\r\n }\r\n\r\n parse(value: unknown): T[] {\r\n if (!Array.isArray(value)) {\r\n throw new SchemaError([{ field: 'root', code: 'INVALID_TYPE', message: 'Expected array' }]);\r\n }\r\n\r\n const result: T[] = [];\r\n const errors: IValidationError[] = [];\r\n\r\n value.forEach((item, index) => {\r\n try {\r\n result.push(this.itemSchema.parse(item));\r\n } catch (error) {\r\n if (error instanceof SchemaError) {\r\n errors.push(...error.errors.map(e => ({ ...e, field: `[${index}].${e.field}`.replace('.root', '') })));\r\n }\r\n }\r\n });\r\n\r\n if (errors.length > 0) throw new SchemaError(errors);\r\n return result;\r\n }\r\n}\r\n\r\n/**\r\n * Optional Schema\r\n */\r\nclass OptionalSchema<T> extends Schema<T | undefined> {\r\n constructor(private schema: Schema<T>) {\r\n super();\r\n }\r\n\r\n parse(value: unknown): T | undefined {\r\n if (value === undefined) return undefined;\r\n return this.schema.parse(value);\r\n }\r\n}\r\n\r\n/**\r\n * Nullable Schema\r\n */\r\nclass NullableSchema<T> extends Schema<T | null> {\r\n constructor(private schema: Schema<T>) {\r\n super();\r\n }\r\n\r\n parse(value: unknown): T | null {\r\n if (value === null) return null;\r\n return this.schema.parse(value);\r\n }\r\n}\r\n\r\n/**\r\n * Entry point for Schema Builder\r\n */\r\nexport const z = {\r\n string: () => new StringSchema(),\r\n number: () => new NumberSchema(),\r\n boolean: () => new BooleanSchema(),\r\n object: <T extends Record<string, Schema<any>>>(shape: T) => new ObjectSchema(shape),\r\n array: <T>(schema: Schema<T>) => new ArraySchema(schema),\r\n};\r\n"]}
@@ -0,0 +1,176 @@
1
+ // src/environment/browser.ts
2
+ function detectClient(userAgent) {
3
+ const ua = userAgent || (typeof navigator !== "undefined" ? navigator.userAgent : "");
4
+ const browser = detectBrowser(ua);
5
+ const os = detectOS(ua);
6
+ const device = detectDevice(ua);
7
+ return {
8
+ browser,
9
+ os,
10
+ device,
11
+ isMobile: device === "mobile",
12
+ isTablet: device === "tablet",
13
+ isDesktop: device === "desktop"
14
+ };
15
+ }
16
+ function detectBrowser(ua) {
17
+ const browsers = [
18
+ { name: "Edge", regex: /Edg(?:e|A|iOS)?\/(\d+[\d.]*)/i },
19
+ { name: "Chrome", regex: /(?:Chrome|CriOS)\/(\d+[\d.]*)/i },
20
+ { name: "Firefox", regex: /(?:Firefox|FxiOS)\/(\d+[\d.]*)/i },
21
+ { name: "Safari", regex: /Version\/(\d+[\d.]*).*Safari/i },
22
+ { name: "Opera", regex: /(?:Opera|OPR)\/(\d+[\d.]*)/i },
23
+ { name: "IE", regex: /(?:MSIE |Trident.*rv:)(\d+[\d.]*)/i }
24
+ ];
25
+ for (const { name, regex } of browsers) {
26
+ const match = ua.match(regex);
27
+ if (match) {
28
+ return { name, version: match[1] || "unknown" };
29
+ }
30
+ }
31
+ return { name: "unknown", version: "unknown" };
32
+ }
33
+ function detectOS(ua) {
34
+ const systems = [
35
+ { name: "Windows", regex: /Windows NT (\d+[\d.]*)/i },
36
+ { name: "macOS", regex: /Mac OS X (\d+[_\d.]*)/i },
37
+ { name: "iOS", regex: /(?:iPhone|iPad|iPod).* OS (\d+[_\d.]*)/i },
38
+ { name: "Android", regex: /Android (\d+[\d.]*)/i },
39
+ { name: "Linux", regex: /Linux/i },
40
+ { name: "ChromeOS", regex: /CrOS/i }
41
+ ];
42
+ for (const { name, regex } of systems) {
43
+ const match = ua.match(regex);
44
+ if (match) {
45
+ const version = match[1]?.replace(/_/g, ".") || "unknown";
46
+ return { name, version };
47
+ }
48
+ }
49
+ return { name: "unknown", version: "unknown" };
50
+ }
51
+ function detectDevice(ua) {
52
+ const mobileRegex = /iPhone|iPod|Android.*Mobile|webOS|BlackBerry|Windows Phone/i;
53
+ const tabletRegex = /iPad|Android(?!.*Mobile)|Tablet/i;
54
+ if (tabletRegex.test(ua)) return "tablet";
55
+ if (mobileRegex.test(ua)) return "mobile";
56
+ if (/Windows|Macintosh|Linux/.test(ua)) return "desktop";
57
+ return "unknown";
58
+ }
59
+ function isBrowser() {
60
+ return typeof window !== "undefined" && typeof document !== "undefined";
61
+ }
62
+ function isNode() {
63
+ return typeof process !== "undefined" && process.versions?.node !== void 0;
64
+ }
65
+ function isMobile(userAgent) {
66
+ return detectClient(userAgent).isMobile;
67
+ }
68
+ function isTouchDevice() {
69
+ if (!isBrowser()) return false;
70
+ return "ontouchstart" in window || navigator.maxTouchPoints > 0;
71
+ }
72
+ function getScreenSize() {
73
+ if (!isBrowser()) return "unknown";
74
+ const width = window.innerWidth;
75
+ if (width < 576) return "xs";
76
+ if (width < 768) return "sm";
77
+ if (width < 992) return "md";
78
+ if (width < 1200) return "lg";
79
+ return "xl";
80
+ }
81
+ function prefersDarkMode() {
82
+ if (!isBrowser()) return false;
83
+ return window.matchMedia?.("(prefers-color-scheme: dark)").matches ?? false;
84
+ }
85
+ function prefersReducedMotion() {
86
+ if (!isBrowser()) return false;
87
+ return window.matchMedia?.("(prefers-reduced-motion: reduce)").matches ?? false;
88
+ }
89
+
90
+ // src/environment/env.ts
91
+ function getEnv(key, defaultValue) {
92
+ if (typeof process === "undefined") {
93
+ return defaultValue;
94
+ }
95
+ return process.env[key] ?? defaultValue;
96
+ }
97
+ function getRequiredEnv(key) {
98
+ const value = getEnv(key);
99
+ if (value === void 0 || value === "") {
100
+ throw new Error(`Missing required environment variable: ${key}`);
101
+ }
102
+ return value;
103
+ }
104
+ function getEnvNumber(key, defaultValue) {
105
+ const value = getEnv(key);
106
+ if (value === void 0) return defaultValue;
107
+ const parsed = Number(value);
108
+ return isNaN(parsed) ? defaultValue : parsed;
109
+ }
110
+ function getEnvBoolean(key, defaultValue) {
111
+ const value = getEnv(key);
112
+ if (value === void 0) return defaultValue ?? false;
113
+ return ["true", "1", "yes", "on"].includes(value.toLowerCase());
114
+ }
115
+ function validateEnv(schema) {
116
+ const missing = [];
117
+ const invalid = [];
118
+ const values = {};
119
+ for (const [key, config] of Object.entries(schema)) {
120
+ const value = getEnv(key, config.default);
121
+ if (config.required && (value === void 0 || value === "")) {
122
+ missing.push(key);
123
+ continue;
124
+ }
125
+ if (value === void 0) continue;
126
+ if (config.type) {
127
+ switch (config.type) {
128
+ case "number":
129
+ if (isNaN(Number(value))) {
130
+ invalid.push(`${key} must be a number`);
131
+ }
132
+ break;
133
+ case "boolean":
134
+ if (!["true", "false", "1", "0", "yes", "no"].includes(value.toLowerCase())) {
135
+ invalid.push(`${key} must be a boolean`);
136
+ }
137
+ break;
138
+ case "url":
139
+ try {
140
+ new URL(value);
141
+ } catch {
142
+ invalid.push(`${key} must be a valid URL`);
143
+ }
144
+ break;
145
+ case "email":
146
+ if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value)) {
147
+ invalid.push(`${key} must be a valid email`);
148
+ }
149
+ break;
150
+ }
151
+ }
152
+ if (config.pattern && !config.pattern.test(value)) {
153
+ invalid.push(`${key} does not match required pattern`);
154
+ }
155
+ values[key] = value;
156
+ }
157
+ return {
158
+ isValid: missing.length === 0 && invalid.length === 0,
159
+ missing,
160
+ invalid,
161
+ values
162
+ };
163
+ }
164
+ function isDevelopment() {
165
+ return getEnv("NODE_ENV") === "development" || getEnv("NODE_ENV") === void 0;
166
+ }
167
+ function isProduction() {
168
+ return getEnv("NODE_ENV") === "production";
169
+ }
170
+ function isTest() {
171
+ return getEnv("NODE_ENV") === "test";
172
+ }
173
+
174
+ export { detectClient, getEnv, getEnvBoolean, getEnvNumber, getRequiredEnv, getScreenSize, isBrowser, isDevelopment, isMobile, isNode, isProduction, isTest, isTouchDevice, prefersDarkMode, prefersReducedMotion, validateEnv };
175
+ //# sourceMappingURL=chunk-HYADH4ZX.js.map
176
+ //# sourceMappingURL=chunk-HYADH4ZX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/environment/browser.ts","../src/environment/env.ts"],"names":[],"mappings":"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","file":"chunk-HYADH4ZX.js","sourcesContent":["/**\r\n * Browser/OS detection result\r\n */\r\nexport interface ClientInfo {\r\n browser: {\r\n name: string;\r\n version: string;\r\n };\r\n os: {\r\n name: string;\r\n version: string;\r\n };\r\n device: 'desktop' | 'mobile' | 'tablet' | 'unknown';\r\n isMobile: boolean;\r\n isTablet: boolean;\r\n isDesktop: boolean;\r\n}\r\n\r\n/**\r\n * Detect browser and OS from user agent\r\n *\r\n * @param userAgent - User agent string (defaults to navigator.userAgent)\r\n * @returns Client information\r\n */\r\nexport function detectClient(userAgent?: string): ClientInfo {\r\n const ua = userAgent || (typeof navigator !== 'undefined' ? navigator.userAgent : '');\r\n\r\n // Browser detection\r\n const browser = detectBrowser(ua);\r\n\r\n // OS detection\r\n const os = detectOS(ua);\r\n\r\n // Device detection\r\n const device = detectDevice(ua);\r\n\r\n return {\r\n browser,\r\n os,\r\n device,\r\n isMobile: device === 'mobile',\r\n isTablet: device === 'tablet',\r\n isDesktop: device === 'desktop',\r\n };\r\n}\r\n\r\n/**\r\n * Detect browser from user agent\r\n */\r\nfunction detectBrowser(ua: string): { name: string; version: string } {\r\n const browsers = [\r\n { name: 'Edge', regex: /Edg(?:e|A|iOS)?\\/(\\d+[\\d.]*)/i },\r\n { name: 'Chrome', regex: /(?:Chrome|CriOS)\\/(\\d+[\\d.]*)/i },\r\n { name: 'Firefox', regex: /(?:Firefox|FxiOS)\\/(\\d+[\\d.]*)/i },\r\n { name: 'Safari', regex: /Version\\/(\\d+[\\d.]*).*Safari/i },\r\n { name: 'Opera', regex: /(?:Opera|OPR)\\/(\\d+[\\d.]*)/i },\r\n { name: 'IE', regex: /(?:MSIE |Trident.*rv:)(\\d+[\\d.]*)/i },\r\n ];\r\n\r\n for (const { name, regex } of browsers) {\r\n const match = ua.match(regex);\r\n if (match) {\r\n return { name, version: match[1] || 'unknown' };\r\n }\r\n }\r\n\r\n return { name: 'unknown', version: 'unknown' };\r\n}\r\n\r\n/**\r\n * Detect OS from user agent\r\n */\r\nfunction detectOS(ua: string): { name: string; version: string } {\r\n const systems = [\r\n { name: 'Windows', regex: /Windows NT (\\d+[\\d.]*)/i },\r\n { name: 'macOS', regex: /Mac OS X (\\d+[_\\d.]*)/i },\r\n { name: 'iOS', regex: /(?:iPhone|iPad|iPod).* OS (\\d+[_\\d.]*)/i },\r\n { name: 'Android', regex: /Android (\\d+[\\d.]*)/i },\r\n { name: 'Linux', regex: /Linux/i },\r\n { name: 'ChromeOS', regex: /CrOS/i },\r\n ];\r\n\r\n for (const { name, regex } of systems) {\r\n const match = ua.match(regex);\r\n if (match) {\r\n const version = match[1]?.replace(/_/g, '.') || 'unknown';\r\n return { name, version };\r\n }\r\n }\r\n\r\n return { name: 'unknown', version: 'unknown' };\r\n}\r\n\r\n/**\r\n * Detect device type from user agent\r\n */\r\nfunction detectDevice(ua: string): 'desktop' | 'mobile' | 'tablet' | 'unknown' {\r\n const mobileRegex = /iPhone|iPod|Android.*Mobile|webOS|BlackBerry|Windows Phone/i;\r\n const tabletRegex = /iPad|Android(?!.*Mobile)|Tablet/i;\r\n\r\n if (tabletRegex.test(ua)) return 'tablet';\r\n if (mobileRegex.test(ua)) return 'mobile';\r\n if (/Windows|Macintosh|Linux/.test(ua)) return 'desktop';\r\n\r\n return 'unknown';\r\n}\r\n\r\n/**\r\n * Check if running in browser\r\n */\r\nexport function isBrowser(): boolean {\r\n return typeof window !== 'undefined' && typeof document !== 'undefined';\r\n}\r\n\r\n/**\r\n * Check if running in Node.js\r\n */\r\nexport function isNode(): boolean {\r\n return typeof process !== 'undefined' && process.versions?.node !== undefined;\r\n}\r\n\r\n/**\r\n * Check if running on mobile\r\n */\r\nexport function isMobile(userAgent?: string): boolean {\r\n return detectClient(userAgent).isMobile;\r\n}\r\n\r\n/**\r\n * Check if touch device\r\n */\r\nexport function isTouchDevice(): boolean {\r\n if (!isBrowser()) return false;\r\n return 'ontouchstart' in window || navigator.maxTouchPoints > 0;\r\n}\r\n\r\n/**\r\n * Get screen size category\r\n */\r\nexport function getScreenSize(): 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'unknown' {\r\n if (!isBrowser()) return 'unknown';\r\n\r\n const width = window.innerWidth;\r\n\r\n if (width < 576) return 'xs';\r\n if (width < 768) return 'sm';\r\n if (width < 992) return 'md';\r\n if (width < 1200) return 'lg';\r\n return 'xl';\r\n}\r\n\r\n/**\r\n * Check if user prefers dark mode\r\n */\r\nexport function prefersDarkMode(): boolean {\r\n if (!isBrowser()) return false;\r\n return window.matchMedia?.('(prefers-color-scheme: dark)').matches ?? false;\r\n}\r\n\r\n/**\r\n * Check if user prefers reduced motion\r\n */\r\nexport function prefersReducedMotion(): boolean {\r\n if (!isBrowser()) return false;\r\n return window.matchMedia?.('(prefers-reduced-motion: reduce)').matches ?? false;\r\n}\r\n","/**\r\n * Environment variable validation result\r\n */\r\nexport interface EnvValidationResult {\r\n isValid: boolean;\r\n missing: string[];\r\n invalid: string[];\r\n values: Record<string, string>;\r\n}\r\n\r\n/**\r\n * Environment variable schema\r\n */\r\nexport interface EnvSchema {\r\n [key: string]: {\r\n required?: boolean;\r\n type?: 'string' | 'number' | 'boolean' | 'url' | 'email';\r\n pattern?: RegExp;\r\n default?: string;\r\n transform?: (value: string) => unknown;\r\n };\r\n}\r\n\r\n/**\r\n * Get environment variable\r\n *\r\n * @param key - Variable name\r\n * @param defaultValue - Default value if not found\r\n * @returns Variable value\r\n */\r\nexport function getEnv(key: string, defaultValue?: string): string | undefined {\r\n // Browser environment\r\n if (typeof process === 'undefined') {\r\n return defaultValue;\r\n }\r\n\r\n return process.env[key] ?? defaultValue;\r\n}\r\n\r\n/**\r\n * Get required environment variable\r\n *\r\n * @param key - Variable name\r\n * @returns Variable value\r\n * @throws Error if not found\r\n */\r\nexport function getRequiredEnv(key: string): string {\r\n const value = getEnv(key);\r\n\r\n if (value === undefined || value === '') {\r\n throw new Error(`Missing required environment variable: ${key}`);\r\n }\r\n\r\n return value;\r\n}\r\n\r\n/**\r\n * Get environment variable as number\r\n *\r\n * @param key - Variable name\r\n * @param defaultValue - Default value\r\n * @returns Parsed number\r\n */\r\nexport function getEnvNumber(key: string, defaultValue?: number): number | undefined {\r\n const value = getEnv(key);\r\n\r\n if (value === undefined) return defaultValue;\r\n\r\n const parsed = Number(value);\r\n return isNaN(parsed) ? defaultValue : parsed;\r\n}\r\n\r\n/**\r\n * Get environment variable as boolean\r\n *\r\n * @param key - Variable name\r\n * @param defaultValue - Default value\r\n * @returns Parsed boolean\r\n */\r\nexport function getEnvBoolean(key: string, defaultValue?: boolean): boolean {\r\n const value = getEnv(key);\r\n\r\n if (value === undefined) return defaultValue ?? false;\r\n\r\n return ['true', '1', 'yes', 'on'].includes(value.toLowerCase());\r\n}\r\n\r\n/**\r\n * Validate environment variables against schema\r\n *\r\n * @param schema - Validation schema\r\n * @returns Validation result\r\n */\r\nexport function validateEnv(schema: EnvSchema): EnvValidationResult {\r\n const missing: string[] = [];\r\n const invalid: string[] = [];\r\n const values: Record<string, string> = {};\r\n\r\n for (const [key, config] of Object.entries(schema)) {\r\n const value = getEnv(key, config.default);\r\n\r\n // Required check\r\n if (config.required && (value === undefined || value === '')) {\r\n missing.push(key);\r\n continue;\r\n }\r\n\r\n if (value === undefined) continue;\r\n\r\n // Type validation\r\n if (config.type) {\r\n switch (config.type) {\r\n case 'number':\r\n if (isNaN(Number(value))) {\r\n invalid.push(`${key} must be a number`);\r\n }\r\n break;\r\n case 'boolean':\r\n if (!['true', 'false', '1', '0', 'yes', 'no'].includes(value.toLowerCase())) {\r\n invalid.push(`${key} must be a boolean`);\r\n }\r\n break;\r\n case 'url':\r\n try {\r\n new URL(value);\r\n } catch {\r\n invalid.push(`${key} must be a valid URL`);\r\n }\r\n break;\r\n case 'email':\r\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)) {\r\n invalid.push(`${key} must be a valid email`);\r\n }\r\n break;\r\n }\r\n }\r\n\r\n // Pattern validation\r\n if (config.pattern && !config.pattern.test(value)) {\r\n invalid.push(`${key} does not match required pattern`);\r\n }\r\n\r\n values[key] = value;\r\n }\r\n\r\n return {\r\n isValid: missing.length === 0 && invalid.length === 0,\r\n missing,\r\n invalid,\r\n values,\r\n };\r\n}\r\n\r\n/**\r\n * Check if in development mode\r\n */\r\nexport function isDevelopment(): boolean {\r\n return getEnv('NODE_ENV') === 'development' || getEnv('NODE_ENV') === undefined;\r\n}\r\n\r\n/**\r\n * Check if in production mode\r\n */\r\nexport function isProduction(): boolean {\r\n return getEnv('NODE_ENV') === 'production';\r\n}\r\n\r\n/**\r\n * Check if in test mode\r\n */\r\nexport function isTest(): boolean {\r\n return getEnv('NODE_ENV') === 'test';\r\n}\r\n"]}
@@ -0,0 +1,255 @@
1
+ // src/form/required.ts
2
+ function required(value, fieldName) {
3
+ if (value === null || value === void 0 || value === "") {
4
+ return {
5
+ field: fieldName,
6
+ code: "REQUIRED",
7
+ message: `${fieldName} is required`
8
+ };
9
+ }
10
+ if (typeof value === "string" && value.trim() === "") {
11
+ return {
12
+ field: fieldName,
13
+ code: "REQUIRED",
14
+ message: `${fieldName} is required`
15
+ };
16
+ }
17
+ if (Array.isArray(value) && value.length === 0) {
18
+ return {
19
+ field: fieldName,
20
+ code: "REQUIRED",
21
+ message: `${fieldName} is required`
22
+ };
23
+ }
24
+ return null;
25
+ }
26
+ function minLength(value, min, fieldName) {
27
+ if (value === null || value === void 0) return null;
28
+ const length = typeof value === "string" ? value.length : value.length;
29
+ if (length < min) {
30
+ return {
31
+ field: fieldName,
32
+ code: "MIN_LENGTH",
33
+ message: `${fieldName} must be at least ${min} characters`
34
+ };
35
+ }
36
+ return null;
37
+ }
38
+ function maxLength(value, max, fieldName) {
39
+ if (value === null || value === void 0) return null;
40
+ const length = typeof value === "string" ? value.length : value.length;
41
+ if (length > max) {
42
+ return {
43
+ field: fieldName,
44
+ code: "MAX_LENGTH",
45
+ message: `${fieldName} must not exceed ${max} characters`
46
+ };
47
+ }
48
+ return null;
49
+ }
50
+ function inRange(value, min, max, fieldName) {
51
+ if (value === null || value === void 0) return null;
52
+ if (value < min || value > max) {
53
+ return {
54
+ field: fieldName,
55
+ code: "OUT_OF_RANGE",
56
+ message: `${fieldName} must be between ${min} and ${max}`
57
+ };
58
+ }
59
+ return null;
60
+ }
61
+ function matchesPattern(value, pattern, fieldName, message) {
62
+ if (value === null || value === void 0) return null;
63
+ if (!pattern.test(value)) {
64
+ return {
65
+ field: fieldName,
66
+ code: "PATTERN_MISMATCH",
67
+ message: message || `${fieldName} format is invalid`
68
+ };
69
+ }
70
+ return null;
71
+ }
72
+ function oneOf(value, allowedValues, fieldName) {
73
+ if (value === null || value === void 0) return null;
74
+ if (!allowedValues.includes(value)) {
75
+ return {
76
+ field: fieldName,
77
+ code: "INVALID_VALUE",
78
+ message: `${fieldName} must be one of: ${allowedValues.join(", ")}`
79
+ };
80
+ }
81
+ return null;
82
+ }
83
+ function isPresent(value) {
84
+ if (value === null || value === void 0) return false;
85
+ if (typeof value === "string") return value.trim() !== "";
86
+ if (Array.isArray(value)) return value.length > 0;
87
+ if (typeof value === "object") return Object.keys(value).length > 0;
88
+ return true;
89
+ }
90
+ function isEmpty(value) {
91
+ return !isPresent(value);
92
+ }
93
+
94
+ // src/form/conditional.ts
95
+ function validateConditional(data, rule, value) {
96
+ const conditionValue = data[rule.when];
97
+ let conditionMet;
98
+ if (typeof rule.is === "function") {
99
+ conditionMet = rule.is(conditionValue);
100
+ } else {
101
+ conditionMet = conditionValue === rule.is;
102
+ }
103
+ if (conditionMet) {
104
+ return rule.then(value, data);
105
+ } else if (rule.otherwise) {
106
+ return rule.otherwise(value, data);
107
+ }
108
+ return null;
109
+ }
110
+ function requiredIf(data, field, dependsOn) {
111
+ const dependsOnValue = data[dependsOn];
112
+ if (isPresent(dependsOnValue) && !isPresent(data[field])) {
113
+ return {
114
+ field: String(field),
115
+ code: "REQUIRED_IF",
116
+ message: `${String(field)} is required when ${String(dependsOn)} is provided`
117
+ };
118
+ }
119
+ return null;
120
+ }
121
+ function requiredUnless(data, field, unlessField) {
122
+ const unlessValue = data[unlessField];
123
+ if (!isPresent(unlessValue) && !isPresent(data[field])) {
124
+ return {
125
+ field: String(field),
126
+ code: "REQUIRED_UNLESS",
127
+ message: `${String(field)} is required unless ${String(unlessField)} is provided`
128
+ };
129
+ }
130
+ return null;
131
+ }
132
+ function requireOneOf(data, fields) {
133
+ const hasOne = fields.some((field) => isPresent(data[field]));
134
+ if (!hasOne) {
135
+ return {
136
+ field: fields.map(String).join("|"),
137
+ code: "REQUIRE_ONE_OF",
138
+ message: `At least one of ${fields.map(String).join(", ")} is required`
139
+ };
140
+ }
141
+ return null;
142
+ }
143
+ function requireAllOrNone(data, fields) {
144
+ const presentCount = fields.filter((field) => isPresent(data[field])).length;
145
+ if (presentCount > 0 && presentCount < fields.length) {
146
+ return {
147
+ field: fields.map(String).join("|"),
148
+ code: "REQUIRE_ALL_OR_NONE",
149
+ message: `Either all or none of ${fields.map(String).join(", ")} must be provided`
150
+ };
151
+ }
152
+ return null;
153
+ }
154
+ function mustMatch(data, field, matchField) {
155
+ if (data[field] !== data[matchField]) {
156
+ return {
157
+ field: String(field),
158
+ code: "MUST_MATCH",
159
+ message: `${String(field)} must match ${String(matchField)}`
160
+ };
161
+ }
162
+ return null;
163
+ }
164
+
165
+ // src/form/errors.ts
166
+ var DEFAULT_MESSAGES = {
167
+ required: "{field} is required",
168
+ minLength: "{field} must be at least {min} characters",
169
+ maxLength: "{field} must not exceed {max} characters",
170
+ pattern: "{field} format is invalid",
171
+ email: "Please enter a valid email address",
172
+ phone: "Please enter a valid phone number",
173
+ url: "Please enter a valid URL",
174
+ numeric: "{field} must be a number",
175
+ alpha: "{field} must contain only letters",
176
+ alphanumeric: "{field} must contain only letters and numbers"
177
+ };
178
+ function formatMessage(template, params) {
179
+ return template.replace(/{(\w+)}/g, (_, key) => String(params[key] ?? key));
180
+ }
181
+ function createErrorMessages(customMessages = {}) {
182
+ const messages = { ...DEFAULT_MESSAGES, ...customMessages };
183
+ return {
184
+ /**
185
+ * Get error message for code
186
+ */
187
+ getMessage(code, params = {}) {
188
+ const template = messages[code.toLowerCase()] || messages[code] || `Validation failed: ${code}`;
189
+ return formatMessage(template, params);
190
+ },
191
+ /**
192
+ * Create validation error
193
+ */
194
+ createError(field, code, params = {}) {
195
+ return {
196
+ field,
197
+ code: code.toUpperCase(),
198
+ message: this.getMessage(code, { field, ...params })
199
+ };
200
+ },
201
+ /**
202
+ * Format multiple errors as object
203
+ */
204
+ formatErrors(errors2) {
205
+ const result = {};
206
+ for (const error of errors2) {
207
+ if (!result[error.field]) {
208
+ result[error.field] = [];
209
+ }
210
+ result[error.field].push(error.message);
211
+ }
212
+ return result;
213
+ },
214
+ /**
215
+ * Get first error for each field
216
+ */
217
+ getFirstErrors(errors2) {
218
+ const result = {};
219
+ for (const error of errors2) {
220
+ if (!result[error.field]) {
221
+ result[error.field] = error.message;
222
+ }
223
+ }
224
+ return result;
225
+ },
226
+ /**
227
+ * Check if field has errors
228
+ */
229
+ hasError(errors2, field) {
230
+ return errors2.some((e) => e.field === field);
231
+ },
232
+ /**
233
+ * Get errors for specific field
234
+ */
235
+ getFieldErrors(errors2, field) {
236
+ return errors2.filter((e) => e.field === field).map((e) => e.message);
237
+ }
238
+ };
239
+ }
240
+ var errors = createErrorMessages();
241
+ function formatValidationResult(validationErrors, format = "object") {
242
+ switch (format) {
243
+ case "array":
244
+ return validationErrors;
245
+ case "flat":
246
+ return validationErrors.map((e) => e.message);
247
+ case "object":
248
+ default:
249
+ return errors.formatErrors(validationErrors);
250
+ }
251
+ }
252
+
253
+ export { createErrorMessages, errors, formatMessage, formatValidationResult, inRange, isEmpty, isPresent, matchesPattern, maxLength, minLength, mustMatch, oneOf, requireAllOrNone, requireOneOf, required, requiredIf, requiredUnless, validateConditional };
254
+ //# sourceMappingURL=chunk-JBN7C5WE.js.map
255
+ //# sourceMappingURL=chunk-JBN7C5WE.js.map