@oxog/vld 1.4.0 → 1.5.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/CHANGELOG.md +333 -333
- package/README.md +1130 -1130
- package/dist/cli/benchmark.d.ts +15 -0
- package/dist/cli/benchmark.d.ts.map +1 -0
- package/dist/cli/benchmark.js +248 -0
- package/dist/cli/benchmark.js.map +1 -0
- package/dist/cli/bin.d.ts +8 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/bin.js +35 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/commands/benchmark.d.ts +11 -0
- package/dist/cli/commands/benchmark.d.ts.map +1 -0
- package/dist/cli/commands/benchmark.js +204 -0
- package/dist/cli/commands/benchmark.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +11 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +157 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/generate.d.ts +14 -0
- package/dist/cli/generate.d.ts.map +1 -0
- package/dist/cli/generate.js +233 -0
- package/dist/cli/generate.js.map +1 -0
- package/dist/cli/index.d.ts +59 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +182 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/validate.d.ts +15 -0
- package/dist/cli/validate.d.ts.map +1 -0
- package/dist/cli/validate.js +162 -0
- package/dist/cli/validate.js.map +1 -0
- package/dist/codecs/index.d.ts.map +1 -1
- package/dist/codecs/index.js +29 -10
- package/dist/codecs/index.js.map +1 -1
- package/dist/coercion/boolean.d.ts.map +1 -1
- package/dist/coercion/boolean.js +23 -31
- package/dist/coercion/boolean.js.map +1 -1
- package/dist/coercion/date.js +1 -1
- package/dist/coercion/date.js.map +1 -1
- package/dist/compat/emitter.d.ts +73 -0
- package/dist/compat/emitter.d.ts.map +1 -0
- package/dist/compat/emitter.js +179 -0
- package/dist/compat/emitter.js.map +1 -0
- package/dist/compat/index.d.ts +15 -0
- package/dist/compat/index.d.ts.map +1 -0
- package/dist/compat/index.js +14 -0
- package/dist/compat/index.js.map +1 -0
- package/dist/compat/result.d.ts +128 -0
- package/dist/compat/result.d.ts.map +1 -0
- package/dist/compat/result.js +169 -0
- package/dist/compat/result.js.map +1 -0
- package/dist/errors.d.ts +58 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +97 -9
- package/dist/errors.js.map +1 -1
- package/dist/events.d.ts +140 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +8 -0
- package/dist/events.js.map +1 -0
- package/dist/guards.d.ts +143 -0
- package/dist/guards.d.ts.map +1 -0
- package/dist/guards.js +238 -0
- package/dist/guards.js.map +1 -0
- package/dist/index-new.d.ts.map +1 -0
- package/dist/index.d.ts +13 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +29 -1
- package/dist/index.js.map +1 -1
- package/dist/kernel.d.ts +29 -0
- package/dist/kernel.d.ts.map +1 -0
- package/dist/kernel.js +402 -0
- package/dist/kernel.js.map +1 -0
- package/dist/locales/af.js.map +1 -1
- package/dist/locales/ar.js.map +1 -1
- package/dist/locales/backup-en.js.map +1 -1
- package/dist/locales/bn.js.map +1 -1
- package/dist/locales/da.js.map +1 -1
- package/dist/locales/de.js.map +1 -1
- package/dist/locales/en.js.map +1 -1
- package/dist/locales/es-MX.js.map +1 -1
- package/dist/locales/es.js.map +1 -1
- package/dist/locales/fi.js.map +1 -1
- package/dist/locales/fr.js.map +1 -1
- package/dist/locales/hi.js.map +1 -1
- package/dist/locales/id.js.map +1 -1
- package/dist/locales/it.js.map +1 -1
- package/dist/locales/ja.js.map +1 -1
- package/dist/locales/ko.js.map +1 -1
- package/dist/locales/nl.js.map +1 -1
- package/dist/locales/no.js.map +1 -1
- package/dist/locales/pl.js.map +1 -1
- package/dist/locales/pt-BR.js.map +1 -1
- package/dist/locales/pt.js.map +1 -1
- package/dist/locales/ru.js.map +1 -1
- package/dist/locales/sv.js.map +1 -1
- package/dist/locales/sw.js.map +1 -1
- package/dist/locales/th.js.map +1 -1
- package/dist/locales/tr.js.map +1 -1
- package/dist/locales/types.js.map +1 -1
- package/dist/locales/vi.js.map +1 -1
- package/dist/locales/zh.js.map +1 -1
- package/dist/locales.d.ts +54 -0
- package/dist/locales.d.ts.map +1 -0
- package/dist/locales.js +732 -0
- package/dist/locales.js.map +1 -0
- package/dist/logger.d.ts +94 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +184 -0
- package/dist/logger.js.map +1 -0
- package/dist/pigment.d.ts +124 -0
- package/dist/pigment.d.ts.map +1 -0
- package/dist/pigment.js +177 -0
- package/dist/pigment.js.map +1 -0
- package/dist/plugins/codecs.d.ts +17 -0
- package/dist/plugins/codecs.d.ts.map +1 -0
- package/dist/plugins/codecs.js +29 -0
- package/dist/plugins/codecs.js.map +1 -0
- package/dist/plugins/coercion.d.ts +13 -0
- package/dist/plugins/coercion.d.ts.map +1 -0
- package/dist/plugins/coercion.js +34 -0
- package/dist/plugins/coercion.js.map +1 -0
- package/dist/plugins/core-validators.d.ts +13 -0
- package/dist/plugins/core-validators.d.ts.map +1 -0
- package/dist/plugins/core-validators.js +96 -0
- package/dist/plugins/core-validators.js.map +1 -0
- package/dist/plugins/index.d.ts +8 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +8 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/kernel.d.ts +29 -0
- package/dist/plugins/kernel.d.ts.map +1 -0
- package/dist/plugins/kernel.js +486 -0
- package/dist/plugins/kernel.js.map +1 -0
- package/dist/plugins/types.d.ts +186 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +8 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/style.d.ts +123 -0
- package/dist/style.d.ts.map +1 -0
- package/dist/style.js +369 -0
- package/dist/style.js.map +1 -0
- package/dist/utils/codec-utils.d.ts.map +1 -1
- package/dist/utils/codec-utils.js +6 -0
- package/dist/utils/codec-utils.js.map +1 -1
- package/dist/utils/ip-validation.d.ts.map +1 -1
- package/dist/utils/ip-validation.js +34 -14
- package/dist/utils/ip-validation.js.map +1 -1
- package/dist/validators/base.d.ts +3 -0
- package/dist/validators/base.d.ts.map +1 -1
- package/dist/validators/base.js +8 -0
- package/dist/validators/base.js.map +1 -1
- package/dist/validators/bigint.js.map +1 -1
- package/dist/validators/custom.js.map +1 -1
- package/dist/validators/discriminated-union.js.map +1 -1
- package/dist/validators/file.js.map +1 -1
- package/dist/validators/function.js.map +1 -1
- package/dist/validators/index.js.map +1 -1
- package/dist/validators/json.js.map +1 -1
- package/dist/validators/lazy.js.map +1 -1
- package/dist/validators/nan.js.map +1 -1
- package/dist/validators/null.js.map +1 -1
- package/dist/validators/object-optimized.d.ts +23 -0
- package/dist/validators/object-optimized.d.ts.map +1 -0
- package/dist/validators/object-optimized.js +179 -0
- package/dist/validators/object-optimized.js.map +1 -0
- package/dist/validators/object-ultra.d.ts +34 -0
- package/dist/validators/object-ultra.d.ts.map +1 -0
- package/dist/validators/object-ultra.js +175 -0
- package/dist/validators/object-ultra.js.map +1 -0
- package/dist/validators/object.d.ts.map +1 -1
- package/dist/validators/object.js +1 -1
- package/dist/validators/object.js.map +1 -1
- package/dist/validators/string-bool.js.map +1 -1
- package/dist/validators/string-formats.js.map +1 -1
- package/dist/validators/string-ultra.d.ts +49 -0
- package/dist/validators/string-ultra.d.ts.map +1 -0
- package/dist/validators/string-ultra.js +217 -0
- package/dist/validators/string-ultra.js.map +1 -0
- package/dist/validators/template-literal.d.ts.map +1 -1
- package/dist/validators/template-literal.js +13 -12
- package/dist/validators/template-literal.js.map +1 -1
- package/dist/validators/undefined.js.map +1 -1
- package/dist/validators/union-optimized.d.ts +15 -0
- package/dist/validators/union-optimized.d.ts.map +1 -0
- package/dist/validators/union-optimized.js +92 -0
- package/dist/validators/union-optimized.js.map +1 -0
- package/dist/validators/xor.js.map +1 -1
- package/package.json +95 -79
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Result Pattern Implementation
|
|
3
|
+
*
|
|
4
|
+
* This module provides a Result type for functional error handling,
|
|
5
|
+
* compatible with @oxog/types when available.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Create a success result
|
|
9
|
+
*/
|
|
10
|
+
export function Ok(data) {
|
|
11
|
+
return { success: true, data, value: data };
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Create an error result
|
|
15
|
+
*/
|
|
16
|
+
export function Err(error) {
|
|
17
|
+
return { success: false, error };
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Create a success result (alias)
|
|
21
|
+
*/
|
|
22
|
+
export const success = Ok;
|
|
23
|
+
/**
|
|
24
|
+
* Create a failure result (alias)
|
|
25
|
+
*/
|
|
26
|
+
export const failure = Err;
|
|
27
|
+
/**
|
|
28
|
+
* Check if result is Ok
|
|
29
|
+
*/
|
|
30
|
+
export function isOk(result) {
|
|
31
|
+
return result.success === true;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Check if result is Err
|
|
35
|
+
*/
|
|
36
|
+
export function isErr(result) {
|
|
37
|
+
return result.success === false;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Check if value is a Result
|
|
41
|
+
*/
|
|
42
|
+
export function isResult(value) {
|
|
43
|
+
return (typeof value === 'object' &&
|
|
44
|
+
value !== null &&
|
|
45
|
+
'success' in value &&
|
|
46
|
+
typeof value.success === 'boolean');
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Unwrap a result, throwing the error if it's an Err
|
|
50
|
+
*/
|
|
51
|
+
export function unwrap(result) {
|
|
52
|
+
if (isOk(result)) {
|
|
53
|
+
return result.data;
|
|
54
|
+
}
|
|
55
|
+
throw result.error;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Unwrap a result with a default value
|
|
59
|
+
*/
|
|
60
|
+
export function unwrapOr(result, defaultValue) {
|
|
61
|
+
if (isOk(result)) {
|
|
62
|
+
return result.data;
|
|
63
|
+
}
|
|
64
|
+
return defaultValue;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Map over a successful result
|
|
68
|
+
*/
|
|
69
|
+
export function map(result, fn) {
|
|
70
|
+
if (isOk(result)) {
|
|
71
|
+
return Ok(fn(result.data));
|
|
72
|
+
}
|
|
73
|
+
return result;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Map over an error result
|
|
77
|
+
*/
|
|
78
|
+
export function mapErr(result, fn) {
|
|
79
|
+
if (isErr(result)) {
|
|
80
|
+
return Err(fn(result.error));
|
|
81
|
+
}
|
|
82
|
+
return result;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Chain results (flatMap)
|
|
86
|
+
*/
|
|
87
|
+
export function flatMap(result, fn) {
|
|
88
|
+
if (isOk(result)) {
|
|
89
|
+
return fn(result.data);
|
|
90
|
+
}
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Pattern match on a result
|
|
95
|
+
*/
|
|
96
|
+
export function match(result, handlers) {
|
|
97
|
+
if (isOk(result)) {
|
|
98
|
+
return handlers.ok(result.data);
|
|
99
|
+
}
|
|
100
|
+
return handlers.err(result.error);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Try to execute a function and wrap the result
|
|
104
|
+
*/
|
|
105
|
+
export function tryCatch(fn) {
|
|
106
|
+
try {
|
|
107
|
+
return Ok(fn());
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
return Err(error instanceof Error ? error : new Error(String(error)));
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Try to execute an async function and wrap the result
|
|
115
|
+
*/
|
|
116
|
+
export async function tryCatchAsync(fn) {
|
|
117
|
+
try {
|
|
118
|
+
return Ok(await fn());
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
return Err(error instanceof Error ? error : new Error(String(error)));
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Combine multiple results into a single result
|
|
126
|
+
* Returns Ok with array of values if all succeed, Err with first error otherwise
|
|
127
|
+
*/
|
|
128
|
+
export function all(results) {
|
|
129
|
+
const values = [];
|
|
130
|
+
for (const result of results) {
|
|
131
|
+
if (isErr(result)) {
|
|
132
|
+
return result;
|
|
133
|
+
}
|
|
134
|
+
values.push(result.data);
|
|
135
|
+
}
|
|
136
|
+
return Ok(values);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Convert a nullable value to a Result
|
|
140
|
+
*/
|
|
141
|
+
export function fromNullable(value, error = new Error('Value is null or undefined')) {
|
|
142
|
+
if (value === null || value === undefined) {
|
|
143
|
+
return Err(error);
|
|
144
|
+
}
|
|
145
|
+
return Ok(value);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Result utilities namespace
|
|
149
|
+
*/
|
|
150
|
+
export const ResultUtils = {
|
|
151
|
+
Ok,
|
|
152
|
+
Err,
|
|
153
|
+
success,
|
|
154
|
+
failure,
|
|
155
|
+
isOk,
|
|
156
|
+
isErr,
|
|
157
|
+
isResult,
|
|
158
|
+
unwrap,
|
|
159
|
+
unwrapOr,
|
|
160
|
+
map,
|
|
161
|
+
mapErr,
|
|
162
|
+
flatMap,
|
|
163
|
+
match,
|
|
164
|
+
tryCatch,
|
|
165
|
+
tryCatchAsync,
|
|
166
|
+
all,
|
|
167
|
+
fromNullable
|
|
168
|
+
};
|
|
169
|
+
//# sourceMappingURL=result.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result.js","sourceRoot":"","sources":["../../src/compat/result.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * Result Pattern Implementation\r\n *\r\n * This module provides a Result type for functional error handling,\r\n * compatible with @oxog/types when available.\r\n */\r\n\r\nimport type { VldError } from '../errors';\r\n\r\n/**\r\n * Success result type\r\n */\r\nexport interface Ok<T> {\r\n readonly success: true;\r\n readonly data: T;\r\n readonly value: T; // Alias for @oxog/types compatibility\r\n readonly error?: never;\r\n}\r\n\r\n/**\r\n * Error result type\r\n */\r\nexport interface Err<E = Error> {\r\n readonly success: false;\r\n readonly error: E;\r\n readonly data?: never;\r\n readonly value?: never;\r\n}\r\n\r\n/**\r\n * Result type - Either success with data or failure with error\r\n */\r\nexport type Result<T, E = Error> = Ok<T> | Err<E>;\r\n\r\n/**\r\n * VLD-specific Result type with VldError\r\n */\r\nexport type VldResult<T> = Result<T, VldError>;\r\n\r\n/**\r\n * Create a success result\r\n */\r\nexport function Ok<T>(data: T): Ok<T> {\r\n return { success: true, data, value: data };\r\n}\r\n\r\n/**\r\n * Create an error result\r\n */\r\nexport function Err<E = Error>(error: E): Err<E> {\r\n return { success: false, error };\r\n}\r\n\r\n/**\r\n * Create a success result (alias)\r\n */\r\nexport const success = Ok;\r\n\r\n/**\r\n * Create a failure result (alias)\r\n */\r\nexport const failure = Err;\r\n\r\n/**\r\n * Check if result is Ok\r\n */\r\nexport function isOk<T, E>(result: Result<T, E>): result is Ok<T> {\r\n return result.success === true;\r\n}\r\n\r\n/**\r\n * Check if result is Err\r\n */\r\nexport function isErr<T, E>(result: Result<T, E>): result is Err<E> {\r\n return result.success === false;\r\n}\r\n\r\n/**\r\n * Check if value is a Result\r\n */\r\nexport function isResult<T, E>(value: unknown): value is Result<T, E> {\r\n return (\r\n typeof value === 'object' &&\r\n value !== null &&\r\n 'success' in value &&\r\n typeof (value as Result<T, E>).success === 'boolean'\r\n );\r\n}\r\n\r\n/**\r\n * Unwrap a result, throwing the error if it's an Err\r\n */\r\nexport function unwrap<T, E extends Error>(result: Result<T, E>): T {\r\n if (isOk(result)) {\r\n return result.data;\r\n }\r\n throw result.error;\r\n}\r\n\r\n/**\r\n * Unwrap a result with a default value\r\n */\r\nexport function unwrapOr<T, E>(result: Result<T, E>, defaultValue: T): T {\r\n if (isOk(result)) {\r\n return result.data;\r\n }\r\n return defaultValue;\r\n}\r\n\r\n/**\r\n * Map over a successful result\r\n */\r\nexport function map<T, U, E>(result: Result<T, E>, fn: (value: T) => U): Result<U, E> {\r\n if (isOk(result)) {\r\n return Ok(fn(result.data));\r\n }\r\n return result as Err<E>;\r\n}\r\n\r\n/**\r\n * Map over an error result\r\n */\r\nexport function mapErr<T, E, F>(result: Result<T, E>, fn: (error: E) => F): Result<T, F> {\r\n if (isErr(result)) {\r\n return Err(fn(result.error));\r\n }\r\n return result as Ok<T>;\r\n}\r\n\r\n/**\r\n * Chain results (flatMap)\r\n */\r\nexport function flatMap<T, U, E>(\r\n result: Result<T, E>,\r\n fn: (value: T) => Result<U, E>\r\n): Result<U, E> {\r\n if (isOk(result)) {\r\n return fn(result.data);\r\n }\r\n return result as Err<E>;\r\n}\r\n\r\n/**\r\n * Pattern match on a result\r\n */\r\nexport function match<T, E, U>(\r\n result: Result<T, E>,\r\n handlers: {\r\n ok: (value: T) => U;\r\n err: (error: E) => U;\r\n }\r\n): U {\r\n if (isOk(result)) {\r\n return handlers.ok(result.data);\r\n }\r\n return handlers.err(result.error);\r\n}\r\n\r\n/**\r\n * Try to execute a function and wrap the result\r\n */\r\nexport function tryCatch<T>(fn: () => T): Result<T, Error> {\r\n try {\r\n return Ok(fn());\r\n } catch (error) {\r\n return Err(error instanceof Error ? error : new Error(String(error)));\r\n }\r\n}\r\n\r\n/**\r\n * Try to execute an async function and wrap the result\r\n */\r\nexport async function tryCatchAsync<T>(fn: () => Promise<T>): Promise<Result<T, Error>> {\r\n try {\r\n return Ok(await fn());\r\n } catch (error) {\r\n return Err(error instanceof Error ? error : new Error(String(error)));\r\n }\r\n}\r\n\r\n/**\r\n * Combine multiple results into a single result\r\n * Returns Ok with array of values if all succeed, Err with first error otherwise\r\n */\r\nexport function all<T, E>(results: Result<T, E>[]): Result<T[], E> {\r\n const values: T[] = [];\r\n\r\n for (const result of results) {\r\n if (isErr(result)) {\r\n return result;\r\n }\r\n values.push(result.data);\r\n }\r\n\r\n return Ok(values);\r\n}\r\n\r\n/**\r\n * Convert a nullable value to a Result\r\n */\r\nexport function fromNullable<T>(\r\n value: T | null | undefined,\r\n error: Error = new Error('Value is null or undefined')\r\n): Result<T, Error> {\r\n if (value === null || value === undefined) {\r\n return Err(error);\r\n }\r\n return Ok(value);\r\n}\r\n\r\n/**\r\n * Result utilities namespace\r\n */\r\nexport const ResultUtils = {\r\n Ok,\r\n Err,\r\n success,\r\n failure,\r\n isOk,\r\n isErr,\r\n isResult,\r\n unwrap,\r\n unwrapOr,\r\n map,\r\n mapErr,\r\n flatMap,\r\n match,\r\n tryCatch,\r\n tryCatchAsync,\r\n all,\r\n fromNullable\r\n};\r\n"]}
|
package/dist/errors.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type Theme } from './pigment';
|
|
1
2
|
export type VldErrorCode = 'invalid_type' | 'invalid_string' | 'string_too_small' | 'string_too_big' | 'invalid_email' | 'invalid_url' | 'invalid_uuid' | 'invalid_regex' | 'invalid_number' | 'too_small' | 'too_big' | 'not_integer' | 'not_finite' | 'not_safe' | 'invalid_boolean' | 'invalid_date' | 'invalid_array' | 'invalid_object' | 'unrecognized_keys' | 'invalid_union' | 'invalid_literal' | 'invalid_enum' | 'custom';
|
|
2
3
|
export interface VldIssue {
|
|
3
4
|
code: VldErrorCode;
|
|
@@ -16,6 +17,39 @@ export declare class VldError extends Error {
|
|
|
16
17
|
constructor(issues: VldIssue[]);
|
|
17
18
|
get firstError(): VldIssue | undefined;
|
|
18
19
|
get formattedErrors(): string[];
|
|
20
|
+
/**
|
|
21
|
+
* Convert error to JSON representation
|
|
22
|
+
* Compatible with @oxog/types OxogError
|
|
23
|
+
*/
|
|
24
|
+
toJSON(): VldErrorJSON;
|
|
25
|
+
/**
|
|
26
|
+
* Create VldError from JSON representation
|
|
27
|
+
*/
|
|
28
|
+
static fromJSON(json: VldErrorJSON): VldError;
|
|
29
|
+
/**
|
|
30
|
+
* Check if a value is a VldError
|
|
31
|
+
*/
|
|
32
|
+
static isVldError(value: unknown): value is VldError;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* JSON representation of VldError
|
|
36
|
+
*/
|
|
37
|
+
export interface VldErrorJSON {
|
|
38
|
+
name: string;
|
|
39
|
+
message: string;
|
|
40
|
+
code: string;
|
|
41
|
+
issues: Array<{
|
|
42
|
+
code: string;
|
|
43
|
+
path: (string | number)[];
|
|
44
|
+
message: string;
|
|
45
|
+
expected?: string;
|
|
46
|
+
received?: string;
|
|
47
|
+
keys?: string[];
|
|
48
|
+
minimum?: number;
|
|
49
|
+
maximum?: number;
|
|
50
|
+
exact?: number;
|
|
51
|
+
inclusive?: boolean;
|
|
52
|
+
}>;
|
|
19
53
|
}
|
|
20
54
|
export interface VldErrorTree {
|
|
21
55
|
errors: string[];
|
|
@@ -30,10 +64,33 @@ export interface VldFlattenedError {
|
|
|
30
64
|
* Convert VldError to a nested tree structure
|
|
31
65
|
*/
|
|
32
66
|
export declare function treeifyError(error: VldError): VldErrorTree;
|
|
67
|
+
/**
|
|
68
|
+
* Prettify error options
|
|
69
|
+
*/
|
|
70
|
+
export interface PrettifyOptions {
|
|
71
|
+
/** Enable colored output */
|
|
72
|
+
colored?: boolean;
|
|
73
|
+
/** Custom theme for colors */
|
|
74
|
+
theme?: Theme;
|
|
75
|
+
/** Include error code in output */
|
|
76
|
+
includeCode?: boolean;
|
|
77
|
+
/** Include expected/received values */
|
|
78
|
+
includeDetails?: boolean;
|
|
79
|
+
}
|
|
33
80
|
/**
|
|
34
81
|
* Convert VldError to human-readable string
|
|
35
82
|
*/
|
|
36
|
-
export declare function prettifyError(error: VldError): string;
|
|
83
|
+
export declare function prettifyError(error: VldError, options?: PrettifyOptions): string;
|
|
84
|
+
/**
|
|
85
|
+
* Convert VldError to human-readable string with full colors
|
|
86
|
+
* Shorthand for prettifyError with colored: true
|
|
87
|
+
*/
|
|
88
|
+
export declare function prettifyErrorColored(error: VldError, options?: Omit<PrettifyOptions, 'colored'>): string;
|
|
89
|
+
/**
|
|
90
|
+
* Convert VldError to plain text string (no colors)
|
|
91
|
+
* Shorthand for prettifyError with colored: false
|
|
92
|
+
*/
|
|
93
|
+
export declare function prettifyErrorPlain(error: VldError, options?: Omit<PrettifyOptions, 'colored'>): string;
|
|
37
94
|
/**
|
|
38
95
|
* Flatten VldError for simple form validation
|
|
39
96
|
*/
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,GACpB,cAAc,GACd,gBAAgB,GAChB,kBAAkB,GAClB,gBAAgB,GAChB,eAAe,GACf,aAAa,GACb,cAAc,GACd,eAAe,GACf,gBAAgB,GAChB,WAAW,GACX,SAAS,GACT,aAAa,GACb,YAAY,GACZ,UAAU,GACV,iBAAiB,GACjB,cAAc,GACd,eAAe,GACf,gBAAgB,GAChB,mBAAmB,GACnB,eAAe,GACf,iBAAiB,GACjB,cAAc,GACd,QAAQ,CAAC;AAEb,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,QAAS,SAAQ,KAAK;IACjC,SAAgB,MAAM,EAAE,QAAQ,EAAE,CAAC;gBAEvB,MAAM,EAAE,QAAQ,EAAE;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.js
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
// VLD Error System - Advanced error formatting and utilities
|
|
2
|
+
import { vldTheme } from './pigment.js';
|
|
2
3
|
export class VldError extends Error {
|
|
3
4
|
constructor(issues) {
|
|
4
|
-
const message = issues.length === 1
|
|
5
|
-
? issues[0].message
|
|
6
|
-
: `${issues.length} validation errors`;
|
|
5
|
+
const message = issues.length === 1 ? issues[0].message : `${issues.length} validation errors`;
|
|
7
6
|
super(message);
|
|
8
7
|
this.name = 'VldError';
|
|
9
8
|
this.issues = issues;
|
|
@@ -16,7 +15,54 @@ export class VldError extends Error {
|
|
|
16
15
|
return this.issues[0];
|
|
17
16
|
}
|
|
18
17
|
get formattedErrors() {
|
|
19
|
-
return this.issues.map(issue => issue.message);
|
|
18
|
+
return this.issues.map((issue) => issue.message);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Convert error to JSON representation
|
|
22
|
+
* Compatible with @oxog/types OxogError
|
|
23
|
+
*/
|
|
24
|
+
toJSON() {
|
|
25
|
+
return {
|
|
26
|
+
name: this.name,
|
|
27
|
+
message: this.message,
|
|
28
|
+
code: 'VLD_VALIDATION_ERROR',
|
|
29
|
+
issues: this.issues.map((issue) => ({
|
|
30
|
+
code: issue.code,
|
|
31
|
+
path: issue.path,
|
|
32
|
+
message: issue.message,
|
|
33
|
+
expected: issue.expected,
|
|
34
|
+
received: issue.received,
|
|
35
|
+
keys: issue.keys,
|
|
36
|
+
minimum: issue.minimum,
|
|
37
|
+
maximum: issue.maximum,
|
|
38
|
+
exact: issue.exact,
|
|
39
|
+
inclusive: issue.inclusive
|
|
40
|
+
}))
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Create VldError from JSON representation
|
|
45
|
+
*/
|
|
46
|
+
static fromJSON(json) {
|
|
47
|
+
const issues = json.issues.map((issue) => ({
|
|
48
|
+
code: issue.code,
|
|
49
|
+
path: issue.path,
|
|
50
|
+
message: issue.message,
|
|
51
|
+
expected: issue.expected,
|
|
52
|
+
received: issue.received,
|
|
53
|
+
keys: issue.keys,
|
|
54
|
+
minimum: issue.minimum,
|
|
55
|
+
maximum: issue.maximum,
|
|
56
|
+
exact: issue.exact,
|
|
57
|
+
inclusive: issue.inclusive
|
|
58
|
+
}));
|
|
59
|
+
return new VldError(issues);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Check if a value is a VldError
|
|
63
|
+
*/
|
|
64
|
+
static isVldError(value) {
|
|
65
|
+
return value instanceof VldError;
|
|
20
66
|
}
|
|
21
67
|
}
|
|
22
68
|
/**
|
|
@@ -75,27 +121,69 @@ export function treeifyError(error) {
|
|
|
75
121
|
/**
|
|
76
122
|
* Convert VldError to human-readable string
|
|
77
123
|
*/
|
|
78
|
-
export function prettifyError(error) {
|
|
124
|
+
export function prettifyError(error, options = {}) {
|
|
125
|
+
const { colored = true, theme = vldTheme, includeCode = false, includeDetails = false } = options;
|
|
79
126
|
const lines = [];
|
|
80
127
|
for (const issue of error.issues) {
|
|
81
|
-
|
|
128
|
+
// Symbol and message
|
|
129
|
+
const symbol = colored ? theme.symbol('✖') : '✖';
|
|
130
|
+
const message = colored ? theme.error(issue.message) : issue.message;
|
|
131
|
+
let line = `${symbol} ${message}`;
|
|
132
|
+
// Error code
|
|
133
|
+
if (includeCode) {
|
|
134
|
+
const code = colored ? theme.muted(`[${issue.code}]`) : `[${issue.code}]`;
|
|
135
|
+
line += ` ${code}`;
|
|
136
|
+
}
|
|
137
|
+
// Path
|
|
82
138
|
if (issue.path.length > 0) {
|
|
83
139
|
const pathStr = issue.path
|
|
84
140
|
.map((segment, index) => {
|
|
85
141
|
if (typeof segment === 'string') {
|
|
86
|
-
|
|
142
|
+
const str = index === 0 ? segment : `.${segment}`;
|
|
143
|
+
return colored ? theme.path(str) : str;
|
|
87
144
|
}
|
|
88
145
|
else {
|
|
89
|
-
|
|
146
|
+
const str = `[${segment}]`;
|
|
147
|
+
return colored ? theme.path(str) : str;
|
|
90
148
|
}
|
|
91
149
|
})
|
|
92
150
|
.join('');
|
|
93
|
-
|
|
151
|
+
const arrow = colored ? theme.muted('→ at ') : '→ at ';
|
|
152
|
+
line += `\n ${arrow}${pathStr}`;
|
|
153
|
+
}
|
|
154
|
+
// Details
|
|
155
|
+
if (includeDetails) {
|
|
156
|
+
if (issue.expected) {
|
|
157
|
+
const expected = colored
|
|
158
|
+
? theme.muted('expected: ') + theme.success(issue.expected)
|
|
159
|
+
: `expected: ${issue.expected}`;
|
|
160
|
+
line += `\n ${expected}`;
|
|
161
|
+
}
|
|
162
|
+
if (issue.received) {
|
|
163
|
+
const received = colored
|
|
164
|
+
? theme.muted('received: ') + theme.warning(issue.received)
|
|
165
|
+
: `received: ${issue.received}`;
|
|
166
|
+
line += `\n ${received}`;
|
|
167
|
+
}
|
|
94
168
|
}
|
|
95
169
|
lines.push(line);
|
|
96
170
|
}
|
|
97
171
|
return lines.join('\n');
|
|
98
172
|
}
|
|
173
|
+
/**
|
|
174
|
+
* Convert VldError to human-readable string with full colors
|
|
175
|
+
* Shorthand for prettifyError with colored: true
|
|
176
|
+
*/
|
|
177
|
+
export function prettifyErrorColored(error, options = {}) {
|
|
178
|
+
return prettifyError(error, { ...options, colored: true });
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Convert VldError to plain text string (no colors)
|
|
182
|
+
* Shorthand for prettifyError with colored: false
|
|
183
|
+
*/
|
|
184
|
+
export function prettifyErrorPlain(error, options = {}) {
|
|
185
|
+
return prettifyError(error, { ...options, colored: false });
|
|
186
|
+
}
|
|
99
187
|
/**
|
|
100
188
|
* Flatten VldError for simple form validation
|
|
101
189
|
*/
|
package/dist/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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","sourcesContent":["// VLD Error System - Advanced error formatting and utilities\n\nexport type VldErrorCode = \n | 'invalid_type'\n | 'invalid_string'\n | 'string_too_small'\n | 'string_too_big'\n | 'invalid_email'\n | 'invalid_url'\n | 'invalid_uuid'\n | 'invalid_regex'\n | 'invalid_number'\n | 'too_small'\n | 'too_big'\n | 'not_integer'\n | 'not_finite'\n | 'not_safe'\n | 'invalid_boolean'\n | 'invalid_date'\n | 'invalid_array'\n | 'invalid_object'\n | 'unrecognized_keys'\n | 'invalid_union'\n | 'invalid_literal'\n | 'invalid_enum'\n | 'custom';\n\nexport interface VldIssue {\n code: VldErrorCode;\n path: (string | number)[];\n message: string;\n expected?: string;\n received?: string;\n keys?: string[];\n minimum?: number;\n maximum?: number;\n exact?: number;\n inclusive?: boolean;\n}\n\nexport class VldError extends Error {\n public readonly issues: VldIssue[];\n\n constructor(issues: VldIssue[]) {\n const message = issues.length === 1 \n ? issues[0].message\n : `${issues.length} validation errors`;\n \n super(message);\n this.name = 'VldError';\n this.issues = issues;\n \n // Maintain proper stack trace\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, VldError);\n }\n }\n\n get firstError(): VldIssue | undefined {\n return this.issues[0];\n }\n\n get formattedErrors(): string[] {\n return this.issues.map(issue => issue.message);\n }\n}\n\n// Error tree structure for nested validation\nexport interface VldErrorTree {\n errors: string[];\n properties?: Record<string, VldErrorTree>;\n items?: (VldErrorTree | undefined)[];\n}\n\n// Flattened error structure for simple forms\nexport interface VldFlattenedError {\n formErrors: string[];\n fieldErrors: Record<string, string[]>;\n}\n\n/**\n * Convert VldError to a nested tree structure\n */\nexport function treeifyError(error: VldError): VldErrorTree {\n const tree: VldErrorTree = { errors: [] };\n\n for (const issue of error.issues) {\n let currentNode = tree;\n const path = issue.path;\n\n // Navigate to the correct position in the tree\n for (let i = 0; i < path.length; i++) {\n const segment = path[i];\n const isLast = i === path.length - 1;\n\n if (typeof segment === 'string') {\n // Object property\n if (!currentNode.properties) {\n currentNode.properties = {};\n }\n \n if (!currentNode.properties[segment]) {\n currentNode.properties[segment] = { errors: [] };\n }\n \n if (isLast) {\n currentNode.properties[segment].errors.push(issue.message);\n } else {\n currentNode = currentNode.properties[segment];\n }\n } else if (typeof segment === 'number') {\n // Array index\n if (!currentNode.items) {\n currentNode.items = [];\n }\n \n while (currentNode.items.length <= segment) {\n currentNode.items.push(undefined);\n }\n \n if (!currentNode.items[segment]) {\n currentNode.items[segment] = { errors: [] };\n }\n \n if (isLast) {\n currentNode.items[segment]!.errors.push(issue.message);\n } else {\n currentNode = currentNode.items[segment]!;\n }\n }\n }\n\n // If path is empty, add to root errors\n if (path.length === 0) {\n tree.errors.push(issue.message);\n }\n }\n\n return tree;\n}\n\n/**\n * Convert VldError to human-readable string\n */\nexport function prettifyError(error: VldError): string {\n const lines: string[] = [];\n\n for (const issue of error.issues) {\n let line = `✖ ${issue.message}`;\n \n if (issue.path.length > 0) {\n const pathStr = issue.path\n .map((segment, index) => {\n if (typeof segment === 'string') {\n return index === 0 ? segment : `.${segment}`;\n } else {\n return `[${segment}]`;\n }\n })\n .join('');\n \n line += `\\n → at ${pathStr}`;\n }\n \n lines.push(line);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Flatten VldError for simple form validation\n */\nexport function flattenError(error: VldError): VldFlattenedError {\n const formErrors: string[] = [];\n const fieldErrors: Record<string, string[]> = {};\n\n for (const issue of error.issues) {\n if (issue.path.length === 0) {\n formErrors.push(issue.message);\n } else {\n const fieldName = issue.path[0].toString();\n if (!fieldErrors[fieldName]) {\n fieldErrors[fieldName] = [];\n }\n fieldErrors[fieldName].push(issue.message);\n }\n }\n\n return { formErrors, fieldErrors };\n}\n\n/**\n * Create a validation issue\n */\nexport function createIssue(\n code: VldErrorCode,\n path: (string | number)[],\n message: string,\n extra?: Partial<VldIssue>\n): VldIssue {\n return {\n code,\n path: [...path],\n message,\n ...extra\n };\n}\n\n/**\n * Helper to determine the type of a value for error messages\n */\nexport function getValueType(value: unknown): string {\n if (value === null) return 'null';\n if (value === undefined) return 'undefined';\n if (Array.isArray(value)) return 'array';\n if (value instanceof Date) return 'date';\n return typeof value;\n}"]}
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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","sourcesContent":["// VLD Error System - Advanced error formatting and utilities\r\n\r\nimport { type Theme, vldTheme } from './pigment';\r\n\r\nexport type VldErrorCode =\r\n | 'invalid_type'\r\n | 'invalid_string'\r\n | 'string_too_small'\r\n | 'string_too_big'\r\n | 'invalid_email'\r\n | 'invalid_url'\r\n | 'invalid_uuid'\r\n | 'invalid_regex'\r\n | 'invalid_number'\r\n | 'too_small'\r\n | 'too_big'\r\n | 'not_integer'\r\n | 'not_finite'\r\n | 'not_safe'\r\n | 'invalid_boolean'\r\n | 'invalid_date'\r\n | 'invalid_array'\r\n | 'invalid_object'\r\n | 'unrecognized_keys'\r\n | 'invalid_union'\r\n | 'invalid_literal'\r\n | 'invalid_enum'\r\n | 'custom';\r\n\r\nexport interface VldIssue {\r\n code: VldErrorCode;\r\n path: (string | number)[];\r\n message: string;\r\n expected?: string;\r\n received?: string;\r\n keys?: string[];\r\n minimum?: number;\r\n maximum?: number;\r\n exact?: number;\r\n inclusive?: boolean;\r\n}\r\n\r\nexport class VldError extends Error {\r\n public readonly issues: VldIssue[];\r\n\r\n constructor(issues: VldIssue[]) {\r\n const message =\r\n issues.length === 1 ? issues[0].message : `${issues.length} validation errors`;\r\n\r\n super(message);\r\n this.name = 'VldError';\r\n this.issues = issues;\r\n\r\n // Maintain proper stack trace\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, VldError);\r\n }\r\n }\r\n\r\n get firstError(): VldIssue | undefined {\r\n return this.issues[0];\r\n }\r\n\r\n get formattedErrors(): string[] {\r\n return this.issues.map((issue) => issue.message);\r\n }\r\n\r\n /**\r\n * Convert error to JSON representation\r\n * Compatible with @oxog/types OxogError\r\n */\r\n toJSON(): VldErrorJSON {\r\n return {\r\n name: this.name,\r\n message: this.message,\r\n code: 'VLD_VALIDATION_ERROR',\r\n issues: this.issues.map((issue) => ({\r\n code: issue.code,\r\n path: issue.path,\r\n message: issue.message,\r\n expected: issue.expected,\r\n received: issue.received,\r\n keys: issue.keys,\r\n minimum: issue.minimum,\r\n maximum: issue.maximum,\r\n exact: issue.exact,\r\n inclusive: issue.inclusive\r\n }))\r\n };\r\n }\r\n\r\n /**\r\n * Create VldError from JSON representation\r\n */\r\n static fromJSON(json: VldErrorJSON): VldError {\r\n const issues: VldIssue[] = json.issues.map((issue) => ({\r\n code: issue.code as VldErrorCode,\r\n path: issue.path,\r\n message: issue.message,\r\n expected: issue.expected,\r\n received: issue.received,\r\n keys: issue.keys,\r\n minimum: issue.minimum,\r\n maximum: issue.maximum,\r\n exact: issue.exact,\r\n inclusive: issue.inclusive\r\n }));\r\n return new VldError(issues);\r\n }\r\n\r\n /**\r\n * Check if a value is a VldError\r\n */\r\n static isVldError(value: unknown): value is VldError {\r\n return value instanceof VldError;\r\n }\r\n}\r\n\r\n/**\r\n * JSON representation of VldError\r\n */\r\nexport interface VldErrorJSON {\r\n name: string;\r\n message: string;\r\n code: string;\r\n issues: Array<{\r\n code: string;\r\n path: (string | number)[];\r\n message: string;\r\n expected?: string;\r\n received?: string;\r\n keys?: string[];\r\n minimum?: number;\r\n maximum?: number;\r\n exact?: number;\r\n inclusive?: boolean;\r\n }>;\r\n}\r\n\r\n// Error tree structure for nested validation\r\nexport interface VldErrorTree {\r\n errors: string[];\r\n properties?: Record<string, VldErrorTree>;\r\n items?: (VldErrorTree | undefined)[];\r\n}\r\n\r\n// Flattened error structure for simple forms\r\nexport interface VldFlattenedError {\r\n formErrors: string[];\r\n fieldErrors: Record<string, string[]>;\r\n}\r\n\r\n/**\r\n * Convert VldError to a nested tree structure\r\n */\r\nexport function treeifyError(error: VldError): VldErrorTree {\r\n const tree: VldErrorTree = { errors: [] };\r\n\r\n for (const issue of error.issues) {\r\n let currentNode = tree;\r\n const path = issue.path;\r\n\r\n // Navigate to the correct position in the tree\r\n for (let i = 0; i < path.length; i++) {\r\n const segment = path[i];\r\n const isLast = i === path.length - 1;\r\n\r\n if (typeof segment === 'string') {\r\n // Object property\r\n if (!currentNode.properties) {\r\n currentNode.properties = {};\r\n }\r\n \r\n if (!currentNode.properties[segment]) {\r\n currentNode.properties[segment] = { errors: [] };\r\n }\r\n \r\n if (isLast) {\r\n currentNode.properties[segment].errors.push(issue.message);\r\n } else {\r\n currentNode = currentNode.properties[segment];\r\n }\r\n } else if (typeof segment === 'number') {\r\n // Array index\r\n if (!currentNode.items) {\r\n currentNode.items = [];\r\n }\r\n \r\n while (currentNode.items.length <= segment) {\r\n currentNode.items.push(undefined);\r\n }\r\n \r\n if (!currentNode.items[segment]) {\r\n currentNode.items[segment] = { errors: [] };\r\n }\r\n \r\n if (isLast) {\r\n currentNode.items[segment]!.errors.push(issue.message);\r\n } else {\r\n currentNode = currentNode.items[segment]!;\r\n }\r\n }\r\n }\r\n\r\n // If path is empty, add to root errors\r\n if (path.length === 0) {\r\n tree.errors.push(issue.message);\r\n }\r\n }\r\n\r\n return tree;\r\n}\r\n\r\n/**\r\n * Prettify error options\r\n */\r\nexport interface PrettifyOptions {\r\n /** Enable colored output */\r\n colored?: boolean;\r\n /** Custom theme for colors */\r\n theme?: Theme;\r\n /** Include error code in output */\r\n includeCode?: boolean;\r\n /** Include expected/received values */\r\n includeDetails?: boolean;\r\n}\r\n\r\n/**\r\n * Convert VldError to human-readable string\r\n */\r\nexport function prettifyError(error: VldError, options: PrettifyOptions = {}): string {\r\n const { colored = true, theme = vldTheme, includeCode = false, includeDetails = false } =\r\n options;\r\n\r\n const lines: string[] = [];\r\n\r\n for (const issue of error.issues) {\r\n // Symbol and message\r\n const symbol = colored ? theme.symbol('✖') : '✖';\r\n const message = colored ? theme.error(issue.message) : issue.message;\r\n let line = `${symbol} ${message}`;\r\n\r\n // Error code\r\n if (includeCode) {\r\n const code = colored ? theme.muted(`[${issue.code}]`) : `[${issue.code}]`;\r\n line += ` ${code}`;\r\n }\r\n\r\n // Path\r\n if (issue.path.length > 0) {\r\n const pathStr = issue.path\r\n .map((segment, index) => {\r\n if (typeof segment === 'string') {\r\n const str = index === 0 ? segment : `.${segment}`;\r\n return colored ? theme.path(str) : str;\r\n } else {\r\n const str = `[${segment}]`;\r\n return colored ? theme.path(str) : str;\r\n }\r\n })\r\n .join('');\r\n\r\n const arrow = colored ? theme.muted('→ at ') : '→ at ';\r\n line += `\\n ${arrow}${pathStr}`;\r\n }\r\n\r\n // Details\r\n if (includeDetails) {\r\n if (issue.expected) {\r\n const expected = colored\r\n ? theme.muted('expected: ') + theme.success(issue.expected)\r\n : `expected: ${issue.expected}`;\r\n line += `\\n ${expected}`;\r\n }\r\n if (issue.received) {\r\n const received = colored\r\n ? theme.muted('received: ') + theme.warning(issue.received)\r\n : `received: ${issue.received}`;\r\n line += `\\n ${received}`;\r\n }\r\n }\r\n\r\n lines.push(line);\r\n }\r\n\r\n return lines.join('\\n');\r\n}\r\n\r\n/**\r\n * Convert VldError to human-readable string with full colors\r\n * Shorthand for prettifyError with colored: true\r\n */\r\nexport function prettifyErrorColored(error: VldError, options: Omit<PrettifyOptions, 'colored'> = {}): string {\r\n return prettifyError(error, { ...options, colored: true });\r\n}\r\n\r\n/**\r\n * Convert VldError to plain text string (no colors)\r\n * Shorthand for prettifyError with colored: false\r\n */\r\nexport function prettifyErrorPlain(error: VldError, options: Omit<PrettifyOptions, 'colored'> = {}): string {\r\n return prettifyError(error, { ...options, colored: false });\r\n}\r\n\r\n/**\r\n * Flatten VldError for simple form validation\r\n */\r\nexport function flattenError(error: VldError): VldFlattenedError {\r\n const formErrors: string[] = [];\r\n const fieldErrors: Record<string, string[]> = {};\r\n\r\n for (const issue of error.issues) {\r\n if (issue.path.length === 0) {\r\n formErrors.push(issue.message);\r\n } else {\r\n const fieldName = issue.path[0].toString();\r\n if (!fieldErrors[fieldName]) {\r\n fieldErrors[fieldName] = [];\r\n }\r\n fieldErrors[fieldName].push(issue.message);\r\n }\r\n }\r\n\r\n return { formErrors, fieldErrors };\r\n}\r\n\r\n/**\r\n * Create a validation issue\r\n */\r\nexport function createIssue(\r\n code: VldErrorCode,\r\n path: (string | number)[],\r\n message: string,\r\n extra?: Partial<VldIssue>\r\n): VldIssue {\r\n return {\r\n code,\r\n path: [...path],\r\n message,\r\n ...extra\r\n };\r\n}\r\n\r\n/**\r\n * Helper to determine the type of a value for error messages\r\n */\r\nexport function getValueType(value: unknown): string {\r\n if (value === null) return 'null';\r\n if (value === undefined) return 'undefined';\r\n if (Array.isArray(value)) return 'array';\r\n if (value instanceof Date) return 'date';\r\n return typeof value;\r\n}"]}
|
package/dist/events.d.ts
ADDED
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VLD Event System
|
|
3
|
+
*
|
|
4
|
+
* This module defines all VLD-specific events for validation lifecycle,
|
|
5
|
+
* plugin management, and debugging.
|
|
6
|
+
*/
|
|
7
|
+
import type { EventMap } from './compat/emitter';
|
|
8
|
+
import type { VldError } from './errors';
|
|
9
|
+
import type { VldBase } from './validators/base';
|
|
10
|
+
/**
|
|
11
|
+
* VLD Event definitions
|
|
12
|
+
*/
|
|
13
|
+
export interface VldEvents extends EventMap {
|
|
14
|
+
/** Emitted when parsing starts */
|
|
15
|
+
'vld:parse:start': {
|
|
16
|
+
value: unknown;
|
|
17
|
+
schema: VldBase<unknown, unknown>;
|
|
18
|
+
timestamp: number;
|
|
19
|
+
};
|
|
20
|
+
/** Emitted when parsing succeeds */
|
|
21
|
+
'vld:parse:success': {
|
|
22
|
+
data: unknown;
|
|
23
|
+
schema: VldBase<unknown, unknown>;
|
|
24
|
+
duration: number;
|
|
25
|
+
timestamp: number;
|
|
26
|
+
};
|
|
27
|
+
/** Emitted when parsing fails */
|
|
28
|
+
'vld:parse:error': {
|
|
29
|
+
error: VldError;
|
|
30
|
+
schema: VldBase<unknown, unknown>;
|
|
31
|
+
duration: number;
|
|
32
|
+
timestamp: number;
|
|
33
|
+
};
|
|
34
|
+
/** Emitted for each field validation in objects */
|
|
35
|
+
'vld:validate:field': {
|
|
36
|
+
key: string;
|
|
37
|
+
value: unknown;
|
|
38
|
+
valid: boolean;
|
|
39
|
+
path: (string | number)[];
|
|
40
|
+
timestamp: number;
|
|
41
|
+
};
|
|
42
|
+
/** Emitted when a transform is applied */
|
|
43
|
+
'vld:validate:transform': {
|
|
44
|
+
before: unknown;
|
|
45
|
+
after: unknown;
|
|
46
|
+
schemaName: string;
|
|
47
|
+
timestamp: number;
|
|
48
|
+
};
|
|
49
|
+
/** Emitted when a refinement is checked */
|
|
50
|
+
'vld:validate:refine': {
|
|
51
|
+
value: unknown;
|
|
52
|
+
passed: boolean;
|
|
53
|
+
message?: string;
|
|
54
|
+
timestamp: number;
|
|
55
|
+
};
|
|
56
|
+
/** Emitted when a plugin is registered */
|
|
57
|
+
'vld:plugin:registered': {
|
|
58
|
+
name: string;
|
|
59
|
+
version: string;
|
|
60
|
+
timestamp: number;
|
|
61
|
+
};
|
|
62
|
+
/** Emitted when a plugin encounters an error */
|
|
63
|
+
'vld:plugin:error': {
|
|
64
|
+
name: string;
|
|
65
|
+
error: Error;
|
|
66
|
+
timestamp: number;
|
|
67
|
+
};
|
|
68
|
+
/** Emitted when a custom validator is registered */
|
|
69
|
+
'vld:validator:registered': {
|
|
70
|
+
name: string;
|
|
71
|
+
timestamp: number;
|
|
72
|
+
};
|
|
73
|
+
/** Emitted when a custom codec is registered */
|
|
74
|
+
'vld:codec:registered': {
|
|
75
|
+
name: string;
|
|
76
|
+
timestamp: number;
|
|
77
|
+
};
|
|
78
|
+
/** Emitted when locale is changed */
|
|
79
|
+
'vld:locale:changed': {
|
|
80
|
+
from: string;
|
|
81
|
+
to: string;
|
|
82
|
+
timestamp: number;
|
|
83
|
+
};
|
|
84
|
+
/** Emitted for debug logging */
|
|
85
|
+
'vld:debug': {
|
|
86
|
+
level: 'debug' | 'info' | 'warn' | 'error';
|
|
87
|
+
message: string;
|
|
88
|
+
data?: unknown;
|
|
89
|
+
timestamp: number;
|
|
90
|
+
};
|
|
91
|
+
/** Emitted for performance metrics */
|
|
92
|
+
'vld:metrics': {
|
|
93
|
+
operation: string;
|
|
94
|
+
duration: number;
|
|
95
|
+
success: boolean;
|
|
96
|
+
metadata?: Record<string, unknown>;
|
|
97
|
+
timestamp: number;
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Event payload types for type-safe event handling
|
|
102
|
+
*/
|
|
103
|
+
export type VldEventPayload<K extends keyof VldEvents> = VldEvents[K];
|
|
104
|
+
/**
|
|
105
|
+
* Parse start event payload
|
|
106
|
+
*/
|
|
107
|
+
export type ParseStartEvent = VldEvents['vld:parse:start'];
|
|
108
|
+
/**
|
|
109
|
+
* Parse success event payload
|
|
110
|
+
*/
|
|
111
|
+
export type ParseSuccessEvent = VldEvents['vld:parse:success'];
|
|
112
|
+
/**
|
|
113
|
+
* Parse error event payload
|
|
114
|
+
*/
|
|
115
|
+
export type ParseErrorEvent = VldEvents['vld:parse:error'];
|
|
116
|
+
/**
|
|
117
|
+
* Field validation event payload
|
|
118
|
+
*/
|
|
119
|
+
export type FieldValidationEvent = VldEvents['vld:validate:field'];
|
|
120
|
+
/**
|
|
121
|
+
* Transform event payload
|
|
122
|
+
*/
|
|
123
|
+
export type TransformEvent = VldEvents['vld:validate:transform'];
|
|
124
|
+
/**
|
|
125
|
+
* Plugin registered event payload
|
|
126
|
+
*/
|
|
127
|
+
export type PluginRegisteredEvent = VldEvents['vld:plugin:registered'];
|
|
128
|
+
/**
|
|
129
|
+
* Locale changed event payload
|
|
130
|
+
*/
|
|
131
|
+
export type LocaleChangedEvent = VldEvents['vld:locale:changed'];
|
|
132
|
+
/**
|
|
133
|
+
* Debug event payload
|
|
134
|
+
*/
|
|
135
|
+
export type DebugEvent = VldEvents['vld:debug'];
|
|
136
|
+
/**
|
|
137
|
+
* Metrics event payload
|
|
138
|
+
*/
|
|
139
|
+
export type MetricsEvent = VldEvents['vld:metrics'];
|
|
140
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"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"}
|
package/dist/events.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA;;;;;GAKG","sourcesContent":["/**\r\n * VLD Event System\r\n *\r\n * This module defines all VLD-specific events for validation lifecycle,\r\n * plugin management, and debugging.\r\n */\r\n\r\nimport type { EventMap } from './compat/emitter';\r\nimport type { VldError } from './errors';\r\nimport type { VldBase } from './validators/base';\r\n\r\n/**\r\n * VLD Event definitions\r\n */\r\nexport interface VldEvents extends EventMap {\r\n // ============================================\r\n // Parse Lifecycle Events\r\n // ============================================\r\n\r\n /** Emitted when parsing starts */\r\n 'vld:parse:start': {\r\n value: unknown;\r\n schema: VldBase<unknown, unknown>;\r\n timestamp: number;\r\n };\r\n\r\n /** Emitted when parsing succeeds */\r\n 'vld:parse:success': {\r\n data: unknown;\r\n schema: VldBase<unknown, unknown>;\r\n duration: number;\r\n timestamp: number;\r\n };\r\n\r\n /** Emitted when parsing fails */\r\n 'vld:parse:error': {\r\n error: VldError;\r\n schema: VldBase<unknown, unknown>;\r\n duration: number;\r\n timestamp: number;\r\n };\r\n\r\n // ============================================\r\n // Validation Detail Events\r\n // ============================================\r\n\r\n /** Emitted for each field validation in objects */\r\n 'vld:validate:field': {\r\n key: string;\r\n value: unknown;\r\n valid: boolean;\r\n path: (string | number)[];\r\n timestamp: number;\r\n };\r\n\r\n /** Emitted when a transform is applied */\r\n 'vld:validate:transform': {\r\n before: unknown;\r\n after: unknown;\r\n schemaName: string;\r\n timestamp: number;\r\n };\r\n\r\n /** Emitted when a refinement is checked */\r\n 'vld:validate:refine': {\r\n value: unknown;\r\n passed: boolean;\r\n message?: string;\r\n timestamp: number;\r\n };\r\n\r\n // ============================================\r\n // Plugin Events\r\n // ============================================\r\n\r\n /** Emitted when a plugin is registered */\r\n 'vld:plugin:registered': {\r\n name: string;\r\n version: string;\r\n timestamp: number;\r\n };\r\n\r\n /** Emitted when a plugin encounters an error */\r\n 'vld:plugin:error': {\r\n name: string;\r\n error: Error;\r\n timestamp: number;\r\n };\r\n\r\n /** Emitted when a custom validator is registered */\r\n 'vld:validator:registered': {\r\n name: string;\r\n timestamp: number;\r\n };\r\n\r\n /** Emitted when a custom codec is registered */\r\n 'vld:codec:registered': {\r\n name: string;\r\n timestamp: number;\r\n };\r\n\r\n // ============================================\r\n // Locale Events\r\n // ============================================\r\n\r\n /** Emitted when locale is changed */\r\n 'vld:locale:changed': {\r\n from: string;\r\n to: string;\r\n timestamp: number;\r\n };\r\n\r\n // ============================================\r\n // Debug Events\r\n // ============================================\r\n\r\n /** Emitted for debug logging */\r\n 'vld:debug': {\r\n level: 'debug' | 'info' | 'warn' | 'error';\r\n message: string;\r\n data?: unknown;\r\n timestamp: number;\r\n };\r\n\r\n /** Emitted for performance metrics */\r\n 'vld:metrics': {\r\n operation: string;\r\n duration: number;\r\n success: boolean;\r\n metadata?: Record<string, unknown>;\r\n timestamp: number;\r\n };\r\n}\r\n\r\n/**\r\n * Event payload types for type-safe event handling\r\n */\r\nexport type VldEventPayload<K extends keyof VldEvents> = VldEvents[K];\r\n\r\n/**\r\n * Parse start event payload\r\n */\r\nexport type ParseStartEvent = VldEvents['vld:parse:start'];\r\n\r\n/**\r\n * Parse success event payload\r\n */\r\nexport type ParseSuccessEvent = VldEvents['vld:parse:success'];\r\n\r\n/**\r\n * Parse error event payload\r\n */\r\nexport type ParseErrorEvent = VldEvents['vld:parse:error'];\r\n\r\n/**\r\n * Field validation event payload\r\n */\r\nexport type FieldValidationEvent = VldEvents['vld:validate:field'];\r\n\r\n/**\r\n * Transform event payload\r\n */\r\nexport type TransformEvent = VldEvents['vld:validate:transform'];\r\n\r\n/**\r\n * Plugin registered event payload\r\n */\r\nexport type PluginRegisteredEvent = VldEvents['vld:plugin:registered'];\r\n\r\n/**\r\n * Locale changed event payload\r\n */\r\nexport type LocaleChangedEvent = VldEvents['vld:locale:changed'];\r\n\r\n/**\r\n * Debug event payload\r\n */\r\nexport type DebugEvent = VldEvents['vld:debug'];\r\n\r\n/**\r\n * Metrics event payload\r\n */\r\nexport type MetricsEvent = VldEvents['vld:metrics'];\r\n"]}
|