@oxog/vld 1.4.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +449 -333
- package/README.md +1171 -1130
- package/dist/chunks/bigint-ZKkWLdmi.js +1628 -0
- package/dist/chunks/bigint-ZKkWLdmi.js.map +1 -0
- package/dist/{coercion/string.js → chunks/date-7Iz2BGsL.js} +271 -5
- package/dist/chunks/date-7Iz2BGsL.js.map +1 -0
- package/dist/chunks/index-BoV-4S1F.js +894 -0
- package/dist/chunks/index-BoV-4S1F.js.map +1 -0
- package/dist/chunks/index-eWXdjyyy.js +426 -0
- package/dist/chunks/index-eWXdjyyy.js.map +1 -0
- package/dist/chunks/json-nIhyRPOU.js +1934 -0
- package/dist/chunks/json-nIhyRPOU.js.map +1 -0
- package/dist/{validators/unknown.js → chunks/unknown-CjSRcELI.js} +6 -3
- package/dist/chunks/unknown-CjSRcELI.js.map +1 -0
- package/dist/cjs/errors.cjs +387 -0
- package/dist/cjs/errors.cjs.map +1 -0
- package/dist/cjs/index.cjs +9815 -0
- package/dist/cjs/index.cjs.map +1 -0
- package/dist/cjs/locales/index.cjs +2877 -0
- package/dist/cjs/locales/index.cjs.map +1 -0
- package/dist/cjs/locales/lazy.cjs +3169 -0
- package/dist/cjs/locales/lazy.cjs.map +1 -0
- package/dist/cjs/mini.cjs +7161 -0
- package/dist/cjs/mini.cjs.map +1 -0
- package/dist/cli/bin.d.ts +8 -0
- package/dist/cli/bin.d.ts.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/validate.d.ts +11 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/index.d.ts +59 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/codecs/index.d.ts.map +1 -1
- package/dist/codecs/index.js +4 -256
- package/dist/codecs/index.js.map +1 -1
- package/dist/coercion/boolean.d.ts.map +1 -1
- package/dist/coercion/index.d.ts +11 -0
- package/dist/coercion/index.d.ts.map +1 -0
- package/dist/coercion/{bigint.js → index.js} +7 -4
- package/dist/coercion/index.js.map +1 -0
- package/dist/compat/emitter.d.ts +73 -0
- package/dist/compat/emitter.d.ts.map +1 -0
- package/dist/compat/emitter.js +181 -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/result.d.ts +128 -0
- package/dist/compat/result.d.ts.map +1 -0
- package/dist/compat/result.js +171 -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 +106 -15
- package/dist/errors.js.map +1 -1
- package/dist/events.d.ts +140 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/index.d.ts +13 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +230 -103
- 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 +405 -0
- package/dist/kernel.js.map +1 -0
- package/dist/locales/af.js +4 -2
- package/dist/locales/af.js.map +1 -1
- package/dist/locales/ar.js +4 -2
- package/dist/locales/ar.js.map +1 -1
- package/dist/locales/bn.js +4 -2
- package/dist/locales/bn.js.map +1 -1
- package/dist/locales/da.js +4 -2
- package/dist/locales/da.js.map +1 -1
- package/dist/locales/de.js +4 -2
- package/dist/locales/de.js.map +1 -1
- package/dist/locales/en.js +4 -2
- package/dist/locales/en.js.map +1 -1
- package/dist/locales/es-MX.js +4 -2
- package/dist/locales/es-MX.js.map +1 -1
- package/dist/locales/es.js +4 -2
- package/dist/locales/es.js.map +1 -1
- package/dist/locales/fi.js +4 -2
- package/dist/locales/fi.js.map +1 -1
- package/dist/locales/fr.js +4 -2
- package/dist/locales/fr.js.map +1 -1
- package/dist/locales/hi.js +4 -2
- package/dist/locales/hi.js.map +1 -1
- package/dist/locales/id.js +4 -2
- package/dist/locales/id.js.map +1 -1
- package/dist/locales/index.js +3 -91
- package/dist/locales/index.js.map +1 -1
- package/dist/locales/it.js +4 -2
- package/dist/locales/it.js.map +1 -1
- package/dist/locales/ja.js +4 -2
- package/dist/locales/ja.js.map +1 -1
- package/dist/locales/ko.js +4 -2
- package/dist/locales/ko.js.map +1 -1
- package/dist/locales/lazy.d.ts +111 -0
- package/dist/locales/lazy.d.ts.map +1 -0
- package/dist/locales/lazy.js +220 -0
- package/dist/locales/lazy.js.map +1 -0
- package/dist/locales/nl.js +4 -2
- package/dist/locales/nl.js.map +1 -1
- package/dist/locales/no.js +4 -2
- package/dist/locales/no.js.map +1 -1
- package/dist/locales/pl.js +4 -2
- package/dist/locales/pl.js.map +1 -1
- package/dist/locales/pt-BR.js +4 -2
- package/dist/locales/pt-BR.js.map +1 -1
- package/dist/locales/pt.js +4 -2
- package/dist/locales/pt.js.map +1 -1
- package/dist/locales/ru.js +4 -2
- package/dist/locales/ru.js.map +1 -1
- package/dist/locales/sv.js +4 -2
- package/dist/locales/sv.js.map +1 -1
- package/dist/locales/sw.js +4 -2
- package/dist/locales/sw.js.map +1 -1
- package/dist/locales/th.js +4 -2
- package/dist/locales/th.js.map +1 -1
- package/dist/locales/tr.js +4 -2
- package/dist/locales/tr.js.map +1 -1
- package/dist/locales/vi.js +4 -2
- package/dist/locales/vi.js.map +1 -1
- package/dist/locales/zh.js +4 -2
- package/dist/locales/zh.js.map +1 -1
- package/dist/logger.d.ts +94 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/mini.d.ts +182 -0
- package/dist/mini.d.ts.map +1 -0
- package/dist/mini.js +132 -0
- package/dist/mini.js.map +1 -0
- package/dist/pigment.d.ts +124 -0
- package/dist/pigment.d.ts.map +1 -0
- package/dist/pigment.js +178 -0
- package/dist/pigment.js.map +1 -0
- package/dist/plugins/index.d.ts +8 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/types.d.ts +186 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/utils/codec-utils.d.ts.map +1 -1
- package/dist/utils/ip-validation.d.ts.map +1 -1
- package/dist/validators/base.d.ts +3 -0
- package/dist/validators/base.d.ts.map +1 -1
- package/dist/validators/index.js +5 -45
- package/dist/validators/index.js.map +1 -1
- package/dist/validators/object.d.ts.map +1 -1
- package/dist/validators/template-literal.d.ts.map +1 -1
- package/package.json +153 -79
- package/dist/coercion/bigint.js.map +0 -1
- package/dist/coercion/boolean.js +0 -67
- package/dist/coercion/boolean.js.map +0 -1
- package/dist/coercion/date.js +0 -52
- package/dist/coercion/date.js.map +0 -1
- package/dist/coercion/number.js +0 -160
- package/dist/coercion/number.js.map +0 -1
- package/dist/coercion/string.js.map +0 -1
- package/dist/locales/backup-en.js +0 -105
- package/dist/locales/backup-en.js.map +0 -1
- package/dist/locales/types.js +0 -2
- package/dist/locales/types.js.map +0 -1
- package/dist/utils/codec-utils.js +0 -223
- package/dist/utils/codec-utils.js.map +0 -1
- package/dist/utils/deep-merge.js +0 -76
- package/dist/utils/deep-merge.js.map +0 -1
- package/dist/utils/ip-validation.js +0 -78
- package/dist/utils/ip-validation.js.map +0 -1
- package/dist/utils/security.js +0 -61
- package/dist/utils/security.js.map +0 -1
- package/dist/validators/any.js +0 -25
- package/dist/validators/any.js.map +0 -1
- package/dist/validators/array.js +0 -190
- package/dist/validators/array.js.map +0 -1
- package/dist/validators/base.js +0 -491
- package/dist/validators/base.js.map +0 -1
- package/dist/validators/base64.js +0 -65
- package/dist/validators/base64.js.map +0 -1
- package/dist/validators/bigint.js +0 -142
- package/dist/validators/bigint.js.map +0 -1
- package/dist/validators/boolean.js +0 -114
- package/dist/validators/boolean.js.map +0 -1
- package/dist/validators/codec.js +0 -182
- package/dist/validators/codec.js.map +0 -1
- package/dist/validators/custom.js +0 -50
- package/dist/validators/custom.js.map +0 -1
- package/dist/validators/date.js +0 -227
- package/dist/validators/date.js.map +0 -1
- package/dist/validators/discriminated-union.js +0 -98
- package/dist/validators/discriminated-union.js.map +0 -1
- package/dist/validators/enum.js +0 -82
- package/dist/validators/enum.js.map +0 -1
- package/dist/validators/file.js +0 -114
- package/dist/validators/file.js.map +0 -1
- package/dist/validators/function.js +0 -45
- package/dist/validators/function.js.map +0 -1
- package/dist/validators/hex.js +0 -62
- package/dist/validators/hex.js.map +0 -1
- package/dist/validators/intersection.js +0 -64
- package/dist/validators/intersection.js.map +0 -1
- package/dist/validators/json.js +0 -64
- package/dist/validators/json.js.map +0 -1
- package/dist/validators/lazy.js +0 -42
- package/dist/validators/lazy.js.map +0 -1
- package/dist/validators/literal.js +0 -45
- package/dist/validators/literal.js.map +0 -1
- package/dist/validators/map.js +0 -54
- package/dist/validators/map.js.map +0 -1
- package/dist/validators/nan.js +0 -32
- package/dist/validators/nan.js.map +0 -1
- package/dist/validators/never.js +0 -29
- package/dist/validators/never.js.map +0 -1
- package/dist/validators/null.js +0 -31
- package/dist/validators/null.js.map +0 -1
- package/dist/validators/number.js +0 -225
- package/dist/validators/number.js.map +0 -1
- package/dist/validators/object.js +0 -458
- package/dist/validators/object.js.map +0 -1
- package/dist/validators/record.js +0 -128
- package/dist/validators/record.js.map +0 -1
- package/dist/validators/set.js +0 -51
- package/dist/validators/set.js.map +0 -1
- package/dist/validators/string-bool.js +0 -127
- package/dist/validators/string-bool.js.map +0 -1
- package/dist/validators/string-formats.js +0 -120
- package/dist/validators/string-formats.js.map +0 -1
- package/dist/validators/string.js +0 -253
- package/dist/validators/string.js.map +0 -1
- package/dist/validators/symbol.js +0 -42
- package/dist/validators/symbol.js.map +0 -1
- package/dist/validators/template-literal.js +0 -101
- package/dist/validators/template-literal.js.map +0 -1
- package/dist/validators/tuple.js +0 -55
- package/dist/validators/tuple.js.map +0 -1
- package/dist/validators/uint8array.js +0 -98
- package/dist/validators/uint8array.js.map +0 -1
- package/dist/validators/undefined.js +0 -31
- package/dist/validators/undefined.js.map +0 -1
- package/dist/validators/union.js +0 -126
- package/dist/validators/union.js.map +0 -1
- package/dist/validators/unknown.js.map +0 -1
- package/dist/validators/void.js +0 -35
- package/dist/validators/void.js.map +0 -1
- package/dist/validators/xor.js +0 -64
- package/dist/validators/xor.js.map +0 -1
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event Emitter Implementation
|
|
3
|
+
*
|
|
4
|
+
* This module provides a type-safe event emitter,
|
|
5
|
+
* compatible with @oxog/emitter when available.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Create a type-safe event emitter
|
|
9
|
+
*/
|
|
10
|
+
function createEmitter() {
|
|
11
|
+
const listeners = new Map();
|
|
12
|
+
const getListeners = (event) => {
|
|
13
|
+
if (!listeners.has(event)) {
|
|
14
|
+
listeners.set(event, []);
|
|
15
|
+
}
|
|
16
|
+
return listeners.get(event);
|
|
17
|
+
};
|
|
18
|
+
const sortListeners = (event) => {
|
|
19
|
+
const eventListeners = getListeners(event);
|
|
20
|
+
eventListeners.sort((a, b) => b.priority - a.priority);
|
|
21
|
+
};
|
|
22
|
+
const on = (event, handler, options = {}) => {
|
|
23
|
+
const entry = {
|
|
24
|
+
handler,
|
|
25
|
+
once: options.once ?? false,
|
|
26
|
+
priority: options.priority ?? 0
|
|
27
|
+
};
|
|
28
|
+
getListeners(event).push(entry);
|
|
29
|
+
sortListeners(event);
|
|
30
|
+
// Return unsubscribe function
|
|
31
|
+
return () => off(event, handler);
|
|
32
|
+
};
|
|
33
|
+
const once = (event, handler) => {
|
|
34
|
+
return on(event, handler, { once: true });
|
|
35
|
+
};
|
|
36
|
+
const off = (event, handler) => {
|
|
37
|
+
const eventListeners = listeners.get(event);
|
|
38
|
+
if (!eventListeners)
|
|
39
|
+
return;
|
|
40
|
+
const index = eventListeners.findIndex((entry) => entry.handler === handler);
|
|
41
|
+
if (index !== -1) {
|
|
42
|
+
eventListeners.splice(index, 1);
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
const emit = (event, payload) => {
|
|
46
|
+
const eventListeners = listeners.get(event);
|
|
47
|
+
if (!eventListeners || eventListeners.length === 0)
|
|
48
|
+
return;
|
|
49
|
+
// Create a copy to allow modifications during iteration
|
|
50
|
+
const listenersToCall = [...eventListeners];
|
|
51
|
+
for (const entry of listenersToCall) {
|
|
52
|
+
if (entry.once) {
|
|
53
|
+
off(event, entry.handler);
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
entry.handler(payload);
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
// Log error but don't stop other handlers
|
|
60
|
+
console.error(`Error in event handler for "${String(event)}":`, error);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
const emitAsync = async (event, payload) => {
|
|
65
|
+
const eventListeners = listeners.get(event);
|
|
66
|
+
if (!eventListeners || eventListeners.length === 0)
|
|
67
|
+
return;
|
|
68
|
+
// Create a copy to allow modifications during iteration
|
|
69
|
+
const listenersToCall = [...eventListeners];
|
|
70
|
+
for (const entry of listenersToCall) {
|
|
71
|
+
if (entry.once) {
|
|
72
|
+
off(event, entry.handler);
|
|
73
|
+
}
|
|
74
|
+
try {
|
|
75
|
+
await entry.handler(payload);
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
// Log error but don't stop other handlers
|
|
79
|
+
console.error(`Error in async event handler for "${String(event)}":`, error);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
const removeAllListeners = (event) => {
|
|
84
|
+
if (event !== undefined) {
|
|
85
|
+
listeners.delete(event);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
listeners.clear();
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
const listenerCount = (event) => {
|
|
92
|
+
return listeners.get(event)?.length ?? 0;
|
|
93
|
+
};
|
|
94
|
+
const eventNames = () => {
|
|
95
|
+
return Array.from(listeners.keys()).filter((key) => {
|
|
96
|
+
const eventListeners = listeners.get(key);
|
|
97
|
+
return eventListeners !== undefined && eventListeners.length > 0;
|
|
98
|
+
});
|
|
99
|
+
};
|
|
100
|
+
return {
|
|
101
|
+
on,
|
|
102
|
+
once,
|
|
103
|
+
off,
|
|
104
|
+
emit,
|
|
105
|
+
emitAsync,
|
|
106
|
+
removeAllListeners,
|
|
107
|
+
listenerCount,
|
|
108
|
+
eventNames
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Mixin to add event emitter capabilities to a class
|
|
113
|
+
*/
|
|
114
|
+
function withEmitter() {
|
|
115
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
116
|
+
return function (Base) {
|
|
117
|
+
return class extends Base {
|
|
118
|
+
constructor() {
|
|
119
|
+
super(...arguments);
|
|
120
|
+
/** @internal */
|
|
121
|
+
this._emitter = createEmitter();
|
|
122
|
+
}
|
|
123
|
+
on(event, handler, options) {
|
|
124
|
+
return this._emitter.on(event, handler, options);
|
|
125
|
+
}
|
|
126
|
+
once(event, handler) {
|
|
127
|
+
return this._emitter.once(event, handler);
|
|
128
|
+
}
|
|
129
|
+
off(event, handler) {
|
|
130
|
+
this._emitter.off(event, handler);
|
|
131
|
+
}
|
|
132
|
+
emit(event, payload) {
|
|
133
|
+
this._emitter.emit(event, payload);
|
|
134
|
+
}
|
|
135
|
+
async emitAsync(event, payload) {
|
|
136
|
+
await this._emitter.emitAsync(event, payload);
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Create an event bus for global event handling
|
|
143
|
+
*/
|
|
144
|
+
function createEventBus() {
|
|
145
|
+
const emitter = createEmitter();
|
|
146
|
+
const createScope = () => {
|
|
147
|
+
const unsubscribers = [];
|
|
148
|
+
const scopedEmitter = {
|
|
149
|
+
on: (event, handler, options) => {
|
|
150
|
+
const unsubscribe = emitter.on(event, handler, options);
|
|
151
|
+
unsubscribers.push(unsubscribe);
|
|
152
|
+
return unsubscribe;
|
|
153
|
+
},
|
|
154
|
+
once: (event, handler) => {
|
|
155
|
+
const unsubscribe = emitter.once(event, handler);
|
|
156
|
+
unsubscribers.push(unsubscribe);
|
|
157
|
+
return unsubscribe;
|
|
158
|
+
},
|
|
159
|
+
off: emitter.off,
|
|
160
|
+
emit: emitter.emit,
|
|
161
|
+
emitAsync: emitter.emitAsync,
|
|
162
|
+
removeAllListeners: emitter.removeAllListeners,
|
|
163
|
+
listenerCount: emitter.listenerCount,
|
|
164
|
+
eventNames: emitter.eventNames,
|
|
165
|
+
dispose: () => {
|
|
166
|
+
for (const unsubscribe of unsubscribers) {
|
|
167
|
+
unsubscribe();
|
|
168
|
+
}
|
|
169
|
+
unsubscribers.length = 0;
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
return scopedEmitter;
|
|
173
|
+
};
|
|
174
|
+
return {
|
|
175
|
+
...emitter,
|
|
176
|
+
createScope
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
export { createEmitter, createEventBus, withEmitter };
|
|
181
|
+
//# sourceMappingURL=emitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emitter.js","sources":["../../src/compat/emitter.ts"],"sourcesContent":["/**\r\n * Event Emitter Implementation\r\n *\r\n * This module provides a type-safe event emitter,\r\n * compatible with @oxog/emitter when available.\r\n */\r\n\r\n/**\r\n * Event map type - maps event names to their payload types\r\n */\r\nexport type EventMap = Record<string, unknown>;\r\n\r\n/**\r\n * Event handler function type\r\n */\r\nexport type EventHandler<T = unknown> = (payload: T) => void | Promise<void>;\r\n\r\n/**\r\n * Listener options\r\n */\r\nexport interface ListenerOptions {\r\n /** Remove listener after first call */\r\n once?: boolean;\r\n /** Listener priority (higher = called first) */\r\n priority?: number;\r\n}\r\n\r\n/**\r\n * Internal listener entry\r\n */\r\ninterface ListenerEntry<T = unknown> {\r\n handler: EventHandler<T>;\r\n once: boolean;\r\n priority: number;\r\n}\r\n\r\n/**\r\n * Emitter interface\r\n */\r\nexport interface Emitter<TEvents extends EventMap = EventMap> {\r\n /** Subscribe to an event */\r\n on<K extends keyof TEvents>(\r\n event: K,\r\n handler: EventHandler<TEvents[K]>,\r\n options?: ListenerOptions\r\n ): () => void;\r\n\r\n /** Subscribe to an event once */\r\n once<K extends keyof TEvents>(\r\n event: K,\r\n handler: EventHandler<TEvents[K]>\r\n ): () => void;\r\n\r\n /** Unsubscribe from an event */\r\n off<K extends keyof TEvents>(event: K, handler: EventHandler<TEvents[K]>): void;\r\n\r\n /** Emit an event */\r\n emit<K extends keyof TEvents>(event: K, payload: TEvents[K]): void;\r\n\r\n /** Emit an event and wait for all handlers */\r\n emitAsync<K extends keyof TEvents>(event: K, payload: TEvents[K]): Promise<void>;\r\n\r\n /** Remove all listeners for an event or all events */\r\n removeAllListeners<K extends keyof TEvents>(event?: K): void;\r\n\r\n /** Get listener count for an event */\r\n listenerCount<K extends keyof TEvents>(event: K): number;\r\n\r\n /** Get all event names with listeners */\r\n eventNames(): (keyof TEvents)[];\r\n}\r\n\r\n/**\r\n * Create a type-safe event emitter\r\n */\r\nexport function createEmitter<TEvents extends EventMap = EventMap>(): Emitter<TEvents> {\r\n const listeners = new Map<keyof TEvents, ListenerEntry<unknown>[]>();\r\n\r\n const getListeners = <K extends keyof TEvents>(event: K): ListenerEntry<TEvents[K]>[] => {\r\n if (!listeners.has(event)) {\r\n listeners.set(event, []);\r\n }\r\n return listeners.get(event) as ListenerEntry<TEvents[K]>[];\r\n };\r\n\r\n const sortListeners = <K extends keyof TEvents>(event: K): void => {\r\n const eventListeners = getListeners(event);\r\n eventListeners.sort((a, b) => b.priority - a.priority);\r\n };\r\n\r\n const on = <K extends keyof TEvents>(\r\n event: K,\r\n handler: EventHandler<TEvents[K]>,\r\n options: ListenerOptions = {}\r\n ): (() => void) => {\r\n const entry: ListenerEntry<TEvents[K]> = {\r\n handler,\r\n once: options.once ?? false,\r\n priority: options.priority ?? 0\r\n };\r\n\r\n getListeners(event).push(entry);\r\n sortListeners(event);\r\n\r\n // Return unsubscribe function\r\n return () => off(event, handler);\r\n };\r\n\r\n const once = <K extends keyof TEvents>(\r\n event: K,\r\n handler: EventHandler<TEvents[K]>\r\n ): (() => void) => {\r\n return on(event, handler, { once: true });\r\n };\r\n\r\n const off = <K extends keyof TEvents>(\r\n event: K,\r\n handler: EventHandler<TEvents[K]>\r\n ): void => {\r\n const eventListeners = listeners.get(event);\r\n if (!eventListeners) return;\r\n\r\n const index = eventListeners.findIndex((entry) => entry.handler === handler);\r\n if (index !== -1) {\r\n eventListeners.splice(index, 1);\r\n }\r\n };\r\n\r\n const emit = <K extends keyof TEvents>(event: K, payload: TEvents[K]): void => {\r\n const eventListeners = listeners.get(event);\r\n if (!eventListeners || eventListeners.length === 0) return;\r\n\r\n // Create a copy to allow modifications during iteration\r\n const listenersToCall = [...eventListeners];\r\n\r\n for (const entry of listenersToCall) {\r\n if (entry.once) {\r\n off(event, entry.handler as EventHandler<TEvents[K]>);\r\n }\r\n\r\n try {\r\n entry.handler(payload);\r\n } catch (error) {\r\n // Log error but don't stop other handlers\r\n console.error(`Error in event handler for \"${String(event)}\":`, error);\r\n }\r\n }\r\n };\r\n\r\n const emitAsync = async <K extends keyof TEvents>(\r\n event: K,\r\n payload: TEvents[K]\r\n ): Promise<void> => {\r\n const eventListeners = listeners.get(event);\r\n if (!eventListeners || eventListeners.length === 0) return;\r\n\r\n // Create a copy to allow modifications during iteration\r\n const listenersToCall = [...eventListeners];\r\n\r\n for (const entry of listenersToCall) {\r\n if (entry.once) {\r\n off(event, entry.handler as EventHandler<TEvents[K]>);\r\n }\r\n\r\n try {\r\n await entry.handler(payload);\r\n } catch (error) {\r\n // Log error but don't stop other handlers\r\n console.error(`Error in async event handler for \"${String(event)}\":`, error);\r\n }\r\n }\r\n };\r\n\r\n const removeAllListeners = <K extends keyof TEvents>(event?: K): void => {\r\n if (event !== undefined) {\r\n listeners.delete(event);\r\n } else {\r\n listeners.clear();\r\n }\r\n };\r\n\r\n const listenerCount = <K extends keyof TEvents>(event: K): number => {\r\n return listeners.get(event)?.length ?? 0;\r\n };\r\n\r\n const eventNames = (): (keyof TEvents)[] => {\r\n return Array.from(listeners.keys()).filter((key) => {\r\n const eventListeners = listeners.get(key);\r\n return eventListeners !== undefined && eventListeners.length > 0;\r\n });\r\n };\r\n\r\n return {\r\n on,\r\n once,\r\n off,\r\n emit,\r\n emitAsync,\r\n removeAllListeners,\r\n listenerCount,\r\n eventNames\r\n };\r\n}\r\n\r\n/**\r\n * Mixin to add event emitter capabilities to a class\r\n */\r\nexport function withEmitter<TEvents extends EventMap>() {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n return function <TBase extends new (...args: any[]) => object>(Base: TBase) {\r\n return class extends Base {\r\n /** @internal */\r\n _emitter = createEmitter<TEvents>();\r\n\r\n on<K extends keyof TEvents>(\r\n event: K,\r\n handler: EventHandler<TEvents[K]>,\r\n options?: ListenerOptions\r\n ): () => void {\r\n return this._emitter.on(event, handler, options);\r\n }\r\n\r\n once<K extends keyof TEvents>(event: K, handler: EventHandler<TEvents[K]>): () => void {\r\n return this._emitter.once(event, handler);\r\n }\r\n\r\n off<K extends keyof TEvents>(event: K, handler: EventHandler<TEvents[K]>): void {\r\n this._emitter.off(event, handler);\r\n }\r\n\r\n emit<K extends keyof TEvents>(event: K, payload: TEvents[K]): void {\r\n this._emitter.emit(event, payload);\r\n }\r\n\r\n async emitAsync<K extends keyof TEvents>(\r\n event: K,\r\n payload: TEvents[K]\r\n ): Promise<void> {\r\n await this._emitter.emitAsync(event, payload);\r\n }\r\n };\r\n };\r\n}\r\n\r\n/**\r\n * Create an event bus for global event handling\r\n */\r\nexport function createEventBus<TEvents extends EventMap>(): Emitter<TEvents> & {\r\n /** Create a scoped emitter that auto-cleans up */\r\n createScope(): Emitter<TEvents> & { dispose(): void };\r\n} {\r\n const emitter = createEmitter<TEvents>();\r\n\r\n const createScope = (): Emitter<TEvents> & { dispose(): void } => {\r\n const unsubscribers: (() => void)[] = [];\r\n\r\n const scopedEmitter: Emitter<TEvents> & { dispose(): void } = {\r\n on: (event, handler, options) => {\r\n const unsubscribe = emitter.on(event, handler, options);\r\n unsubscribers.push(unsubscribe);\r\n return unsubscribe;\r\n },\r\n once: (event, handler) => {\r\n const unsubscribe = emitter.once(event, handler);\r\n unsubscribers.push(unsubscribe);\r\n return unsubscribe;\r\n },\r\n off: emitter.off,\r\n emit: emitter.emit,\r\n emitAsync: emitter.emitAsync,\r\n removeAllListeners: emitter.removeAllListeners,\r\n listenerCount: emitter.listenerCount,\r\n eventNames: emitter.eventNames,\r\n dispose: () => {\r\n for (const unsubscribe of unsubscribers) {\r\n unsubscribe();\r\n }\r\n unsubscribers.length = 0;\r\n }\r\n };\r\n\r\n return scopedEmitter;\r\n };\r\n\r\n return {\r\n ...emitter,\r\n createScope\r\n };\r\n}\r\n\r\nexport type { EventHandler as VldEventHandler };\r\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VLD Compatibility Layer
|
|
3
|
+
*
|
|
4
|
+
* This module provides internal implementations of @oxog ecosystem features
|
|
5
|
+
* that can be replaced with actual @oxog packages when available.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Result pattern (@oxog/types compatibility)
|
|
9
|
+
* - Event emitter (@oxog/emitter compatibility)
|
|
10
|
+
*/
|
|
11
|
+
export type { Result, VldResult } from './result';
|
|
12
|
+
export { Ok, Err, success, failure, isOk, isErr, isResult, unwrap, unwrapOr, map, mapErr, flatMap, match, tryCatch, tryCatchAsync, all, fromNullable, ResultUtils } from './result';
|
|
13
|
+
export type { EventMap, EventHandler, ListenerOptions, Emitter, VldEventHandler } from './emitter';
|
|
14
|
+
export { createEmitter, createEventBus, withEmitter } from './emitter';
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/compat/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAElD,OAAO,EACL,EAAE,EACF,GAAG,EACH,OAAO,EACP,OAAO,EACP,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,GAAG,EACH,MAAM,EACN,OAAO,EACP,KAAK,EACL,QAAQ,EACR,aAAa,EACb,GAAG,EACH,YAAY,EACZ,WAAW,EACZ,MAAM,UAAU,CAAC;AAGlB,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAGnG,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,128 @@
|
|
|
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
|
+
import type { VldError } from '../errors';
|
|
8
|
+
/**
|
|
9
|
+
* Success result type
|
|
10
|
+
*/
|
|
11
|
+
export interface Ok<T> {
|
|
12
|
+
readonly success: true;
|
|
13
|
+
readonly data: T;
|
|
14
|
+
readonly value: T;
|
|
15
|
+
readonly error?: never;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Error result type
|
|
19
|
+
*/
|
|
20
|
+
export interface Err<E = Error> {
|
|
21
|
+
readonly success: false;
|
|
22
|
+
readonly error: E;
|
|
23
|
+
readonly data?: never;
|
|
24
|
+
readonly value?: never;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Result type - Either success with data or failure with error
|
|
28
|
+
*/
|
|
29
|
+
export type Result<T, E = Error> = Ok<T> | Err<E>;
|
|
30
|
+
/**
|
|
31
|
+
* VLD-specific Result type with VldError
|
|
32
|
+
*/
|
|
33
|
+
export type VldResult<T> = Result<T, VldError>;
|
|
34
|
+
/**
|
|
35
|
+
* Create a success result
|
|
36
|
+
*/
|
|
37
|
+
export declare function Ok<T>(data: T): Ok<T>;
|
|
38
|
+
/**
|
|
39
|
+
* Create an error result
|
|
40
|
+
*/
|
|
41
|
+
export declare function Err<E = Error>(error: E): Err<E>;
|
|
42
|
+
/**
|
|
43
|
+
* Create a success result (alias)
|
|
44
|
+
*/
|
|
45
|
+
export declare const success: typeof Ok;
|
|
46
|
+
/**
|
|
47
|
+
* Create a failure result (alias)
|
|
48
|
+
*/
|
|
49
|
+
export declare const failure: typeof Err;
|
|
50
|
+
/**
|
|
51
|
+
* Check if result is Ok
|
|
52
|
+
*/
|
|
53
|
+
export declare function isOk<T, E>(result: Result<T, E>): result is Ok<T>;
|
|
54
|
+
/**
|
|
55
|
+
* Check if result is Err
|
|
56
|
+
*/
|
|
57
|
+
export declare function isErr<T, E>(result: Result<T, E>): result is Err<E>;
|
|
58
|
+
/**
|
|
59
|
+
* Check if value is a Result
|
|
60
|
+
*/
|
|
61
|
+
export declare function isResult<T, E>(value: unknown): value is Result<T, E>;
|
|
62
|
+
/**
|
|
63
|
+
* Unwrap a result, throwing the error if it's an Err
|
|
64
|
+
*/
|
|
65
|
+
export declare function unwrap<T, E extends Error>(result: Result<T, E>): T;
|
|
66
|
+
/**
|
|
67
|
+
* Unwrap a result with a default value
|
|
68
|
+
*/
|
|
69
|
+
export declare function unwrapOr<T, E>(result: Result<T, E>, defaultValue: T): T;
|
|
70
|
+
/**
|
|
71
|
+
* Map over a successful result
|
|
72
|
+
*/
|
|
73
|
+
export declare function map<T, U, E>(result: Result<T, E>, fn: (value: T) => U): Result<U, E>;
|
|
74
|
+
/**
|
|
75
|
+
* Map over an error result
|
|
76
|
+
*/
|
|
77
|
+
export declare function mapErr<T, E, F>(result: Result<T, E>, fn: (error: E) => F): Result<T, F>;
|
|
78
|
+
/**
|
|
79
|
+
* Chain results (flatMap)
|
|
80
|
+
*/
|
|
81
|
+
export declare function flatMap<T, U, E>(result: Result<T, E>, fn: (value: T) => Result<U, E>): Result<U, E>;
|
|
82
|
+
/**
|
|
83
|
+
* Pattern match on a result
|
|
84
|
+
*/
|
|
85
|
+
export declare function match<T, E, U>(result: Result<T, E>, handlers: {
|
|
86
|
+
ok: (value: T) => U;
|
|
87
|
+
err: (error: E) => U;
|
|
88
|
+
}): U;
|
|
89
|
+
/**
|
|
90
|
+
* Try to execute a function and wrap the result
|
|
91
|
+
*/
|
|
92
|
+
export declare function tryCatch<T>(fn: () => T): Result<T, Error>;
|
|
93
|
+
/**
|
|
94
|
+
* Try to execute an async function and wrap the result
|
|
95
|
+
*/
|
|
96
|
+
export declare function tryCatchAsync<T>(fn: () => Promise<T>): Promise<Result<T, Error>>;
|
|
97
|
+
/**
|
|
98
|
+
* Combine multiple results into a single result
|
|
99
|
+
* Returns Ok with array of values if all succeed, Err with first error otherwise
|
|
100
|
+
*/
|
|
101
|
+
export declare function all<T, E>(results: Result<T, E>[]): Result<T[], E>;
|
|
102
|
+
/**
|
|
103
|
+
* Convert a nullable value to a Result
|
|
104
|
+
*/
|
|
105
|
+
export declare function fromNullable<T>(value: T | null | undefined, error?: Error): Result<T, Error>;
|
|
106
|
+
/**
|
|
107
|
+
* Result utilities namespace
|
|
108
|
+
*/
|
|
109
|
+
export declare const ResultUtils: {
|
|
110
|
+
Ok: typeof Ok;
|
|
111
|
+
Err: typeof Err;
|
|
112
|
+
success: typeof Ok;
|
|
113
|
+
failure: typeof Err;
|
|
114
|
+
isOk: typeof isOk;
|
|
115
|
+
isErr: typeof isErr;
|
|
116
|
+
isResult: typeof isResult;
|
|
117
|
+
unwrap: typeof unwrap;
|
|
118
|
+
unwrapOr: typeof unwrapOr;
|
|
119
|
+
map: typeof map;
|
|
120
|
+
mapErr: typeof mapErr;
|
|
121
|
+
flatMap: typeof flatMap;
|
|
122
|
+
match: typeof match;
|
|
123
|
+
tryCatch: typeof tryCatch;
|
|
124
|
+
tryCatchAsync: typeof tryCatchAsync;
|
|
125
|
+
all: typeof all;
|
|
126
|
+
fromNullable: typeof fromNullable;
|
|
127
|
+
};
|
|
128
|
+
//# sourceMappingURL=result.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../../src/compat/result.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE1C;;GAEG;AACH,MAAM,WAAW,EAAE,CAAC,CAAC;IACnB,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjB,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,KAAK;IAC5B,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,MAAM,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;AAElD;;GAEG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAE/C;;GAEG;AACH,wBAAgB,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAEpC;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,CAAC,GAAG,KAAK,EAAE,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAE/C;AAED;;GAEG;AACH,eAAO,MAAM,OAAO,WAAK,CAAC;AAE1B;;GAEG;AACH,eAAO,MAAM,OAAO,YAAM,CAAC;AAE3B;;GAEG;AACH,wBAAgB,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,CAEhE;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAElE;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAOpE;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,CAAC,SAAS,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAKlE;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,GAAG,CAAC,CAKvE;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAKpF;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAKvF;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAC7B,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EACpB,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAC7B,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAKd;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAC3B,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EACpB,QAAQ,EAAE;IACR,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC;IACpB,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC;CACtB,GACA,CAAC,CAKH;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAMzD;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAMtF;AAED;;;GAGG;AACH,wBAAgB,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAWjE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAC5B,KAAK,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,EAC3B,KAAK,GAAE,KAA+C,GACrD,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAKlB;AAED;;GAEG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;CAkBvB,CAAC"}
|
|
@@ -0,0 +1,171 @@
|
|
|
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
|
+
function Ok(data) {
|
|
11
|
+
return { success: true, data, value: data };
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Create an error result
|
|
15
|
+
*/
|
|
16
|
+
function Err(error) {
|
|
17
|
+
return { success: false, error };
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Create a success result (alias)
|
|
21
|
+
*/
|
|
22
|
+
const success = Ok;
|
|
23
|
+
/**
|
|
24
|
+
* Create a failure result (alias)
|
|
25
|
+
*/
|
|
26
|
+
const failure = Err;
|
|
27
|
+
/**
|
|
28
|
+
* Check if result is Ok
|
|
29
|
+
*/
|
|
30
|
+
function isOk(result) {
|
|
31
|
+
return result.success === true;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Check if result is Err
|
|
35
|
+
*/
|
|
36
|
+
function isErr(result) {
|
|
37
|
+
return result.success === false;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Check if value is a Result
|
|
41
|
+
*/
|
|
42
|
+
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
|
+
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
|
+
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
|
+
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
|
+
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
|
+
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
|
+
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
|
+
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
|
+
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
|
+
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
|
+
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
|
+
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
|
+
|
|
170
|
+
export { Err, Ok, ResultUtils, all, failure, flatMap, fromNullable, isErr, isOk, isResult, map, mapErr, match, success, tryCatch, tryCatchAsync, unwrap, unwrapOr };
|
|
171
|
+
//# sourceMappingURL=result.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result.js","sources":["../../src/compat/result.ts"],"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"],"names":[],"mappings":"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"}
|
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":"AAEA,OAAO,EAAE,KAAK,KAAK,EAAY,MAAM,WAAW,CAAC;AAEjD,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;IAc9B,IAAI,UAAU,IAAI,QAAQ,GAAG,SAAS,CAErC;IAED,IAAI,eAAe,IAAI,MAAM,EAAE,CAE9B;IAED;;;OAGG;IACH,MAAM,IAAI,YAAY;IAoBtB;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,QAAQ;IAgB7C;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ;CAGrD;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,KAAK,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,CAAC,CAAC;CACJ;AAGD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC1C,KAAK,CAAC,EAAE,CAAC,YAAY,GAAG,SAAS,CAAC,EAAE,CAAC;CACtC;AAGD,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACvC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,QAAQ,GAAG,YAAY,CAwD1D;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,4BAA4B;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,mCAAmC;IACnC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,uCAAuC;IACvC,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,GAAE,eAAoB,GAAG,MAAM,CAwDpF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,GAAE,IAAI,CAAC,eAAe,EAAE,SAAS,CAAM,GAAG,MAAM,CAE5G;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,GAAE,IAAI,CAAC,eAAe,EAAE,SAAS,CAAM,GAAG,MAAM,CAE1G;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,QAAQ,GAAG,iBAAiB,CAiB/D;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,EACzB,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,GACxB,QAAQ,CAOV;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAMnD"}
|