@hkdigital/lib-sveltekit 0.2.21 → 0.2.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +149 -135
- package/dist/assets/autospuiten/car-paint-picker.js +41 -41
- package/dist/assets/autospuiten/labels.js +7 -7
- package/dist/classes/cache/IndexedDbCache.js +1407 -1407
- package/dist/classes/cache/MemoryResponseCache.js +138 -138
- package/dist/classes/cache/index.js +5 -5
- package/dist/classes/cache/typedef.js +41 -41
- package/dist/classes/data/IterableTree.js +243 -243
- package/dist/classes/data/Selector.js +190 -190
- package/dist/classes/data/index.js +2 -2
- package/dist/classes/events/EventEmitter.js +275 -275
- package/dist/classes/events/index.js +2 -2
- package/dist/classes/index.js +4 -4
- package/dist/classes/logging/Logger.js +210 -210
- package/dist/classes/logging/constants.js +16 -16
- package/dist/classes/logging/index.js +4 -4
- package/dist/classes/logging/typedef.js +17 -17
- package/dist/classes/promise/HkPromise.js +377 -377
- package/dist/classes/promise/index.js +1 -1
- package/dist/classes/services/ServiceBase.js +463 -463
- package/dist/classes/services/ServiceManager.js +614 -614
- package/dist/classes/services/index.js +5 -5
- package/dist/classes/services/service-states.js +205 -205
- package/dist/classes/services/typedef.js +179 -179
- package/dist/classes/stores/SubscribersCount.js +107 -107
- package/dist/classes/stores/index.js +1 -1
- package/dist/classes/streams/LogTransformStream.js +19 -19
- package/dist/classes/streams/ServerEventsStore.js +110 -110
- package/dist/classes/streams/TimeStampSource.js +26 -26
- package/dist/classes/streams/index.js +3 -3
- package/dist/classes/svelte/audio/AudioLoader.svelte.js +58 -58
- package/dist/classes/svelte/audio/AudioScene.svelte.js +324 -324
- package/dist/classes/svelte/audio/mocks.js +35 -35
- package/dist/classes/svelte/finite-state-machine/FiniteStateMachine.svelte.js +133 -133
- package/dist/classes/svelte/finite-state-machine/index.js +1 -1
- package/dist/classes/svelte/image/ImageLoader.svelte.js +45 -45
- package/dist/classes/svelte/image/ImageScene.svelte.js +249 -249
- package/dist/classes/svelte/image/ImageVariantsLoader.svelte.js +152 -152
- package/dist/classes/svelte/image/index.js +4 -4
- package/dist/classes/svelte/image/mocks.js +35 -35
- package/dist/classes/svelte/image/typedef.js +8 -8
- package/dist/classes/svelte/index.js +14 -14
- package/dist/classes/svelte/loading-state-machine/LoadingStateMachine.svelte.js +109 -109
- package/dist/classes/svelte/loading-state-machine/constants.js +16 -16
- package/dist/classes/svelte/loading-state-machine/index.js +3 -3
- package/dist/classes/svelte/network-loader/NetworkLoader.svelte.js +338 -338
- package/dist/classes/svelte/network-loader/constants.js +3 -3
- package/dist/classes/svelte/network-loader/index.js +3 -3
- package/dist/classes/svelte/network-loader/mocks.js +30 -30
- package/dist/classes/svelte/network-loader/typedef.js +8 -8
- package/dist/components/area/HkArea.svelte +49 -49
- package/dist/components/area/HkGridArea.svelte +77 -77
- package/dist/components/area/index.js +2 -2
- package/dist/components/buttons/button/Button.svelte +82 -82
- package/dist/components/buttons/button-icon-steeze/SteezeIconButton.svelte +30 -30
- package/dist/components/buttons/button-text/TextButton.svelte +21 -21
- package/dist/components/buttons/index.js +3 -3
- package/dist/components/debug/debug-panel-design-scaling/DebugPanelDesignScaling.svelte +146 -146
- package/dist/components/debug/index.js +1 -1
- package/dist/components/drag-drop/DragController.js +44 -44
- package/dist/components/drag-drop/DragDropContext.svelte +111 -111
- package/dist/components/drag-drop/Draggable.svelte +519 -519
- package/dist/components/drag-drop/{Dropzone.svelte → DropZone.svelte} +258 -258
- package/dist/components/drag-drop/DropZoneArea.svelte +119 -119
- package/dist/components/drag-drop/DropZoneList.svelte +125 -125
- package/dist/components/drag-drop/actions.js +26 -26
- package/dist/components/drag-drop/drag-state.svelte.js +322 -322
- package/dist/components/drag-drop/index.js +7 -7
- package/dist/components/drag-drop/util.js +85 -85
- package/dist/components/hkdev/blocks/TextBlock.svelte +46 -46
- package/dist/components/hkdev/buttons/CheckButton.svelte +62 -62
- package/dist/components/icons/HkIcon.svelte +86 -86
- package/dist/components/icons/HkTabIcon.svelte +116 -116
- package/dist/components/icons/SteezeIcon.svelte +97 -97
- package/dist/components/icons/index.js +6 -6
- package/dist/components/icons/typedef.js +16 -16
- package/dist/components/index.js +2 -2
- package/dist/components/inputs/index.js +1 -1
- package/dist/components/inputs/text-input/TestTextInput.svelte__ +102 -102
- package/dist/components/inputs/text-input/TextInput.svelte +223 -223
- package/dist/components/inputs/text-input/TextInput.svelte___ +83 -83
- package/dist/components/inputs/text-input/assets/IconInvalid.svelte +14 -14
- package/dist/components/inputs/text-input/assets/IconValid.svelte +12 -12
- package/dist/components/layout/grid-layers/GridLayers.svelte +63 -63
- package/dist/components/layout/grid-layers/GridLayers.svelte__heightFrom__ +372 -0
- package/dist/components/layout/grid-layers/util.js +74 -74
- package/dist/components/layout/index.js +1 -1
- package/dist/components/panels/index.js +1 -1
- package/dist/components/panels/panel/Panel.svelte +43 -43
- package/dist/components/rows/index.js +3 -3
- package/dist/components/rows/panel-grid-row/PanelGridRow.svelte +104 -104
- package/dist/components/rows/panel-row-2/PanelRow2.svelte +40 -40
- package/dist/components/tab-bar/HkTabBar.state.svelte.js +149 -149
- package/dist/components/tab-bar/HkTabBar.svelte +74 -74
- package/dist/components/tab-bar/HkTabBarSelector.state.svelte.js +93 -93
- package/dist/components/tab-bar/HkTabBarSelector.svelte +49 -49
- package/dist/components/tab-bar/index.js +17 -17
- package/dist/components/tab-bar/typedef.js +11 -11
- package/dist/config/imagetools-config.js +189 -189
- package/dist/config/imagetools.d.ts +72 -72
- package/dist/constants/bases.js +13 -13
- package/dist/constants/errors/api.js +9 -9
- package/dist/constants/errors/generic.js +5 -5
- package/dist/constants/errors/index.js +3 -3
- package/dist/constants/errors/jwt.js +5 -5
- package/dist/constants/http/headers.js +6 -6
- package/dist/constants/http/index.js +2 -2
- package/dist/constants/http/methods.js +14 -14
- package/dist/constants/index.js +3 -3
- package/dist/constants/mime/application.js +5 -5
- package/dist/constants/mime/audio.js +13 -13
- package/dist/constants/mime/image.js +3 -3
- package/dist/constants/mime/index.js +4 -4
- package/dist/constants/mime/text.js +2 -2
- package/dist/constants/regexp/index.js +31 -31
- package/dist/constants/regexp/inspiratie.js__ +95 -95
- package/dist/constants/regexp/text.js +49 -49
- package/dist/constants/regexp/user.js +32 -32
- package/dist/constants/regexp/web.js +3 -3
- package/dist/constants/state-labels/drag-states.js +6 -6
- package/dist/constants/state-labels/drop-states.js +6 -6
- package/dist/constants/state-labels/input-states.js +11 -11
- package/dist/constants/state-labels/submit-states.js +4 -4
- package/dist/constants/time.js +28 -28
- package/dist/css/utilities.css +43 -43
- package/dist/design/design-config.js +73 -73
- package/dist/design/tailwind-theme-extend.js +158 -158
- package/dist/features/button-group/ButtonGroup.svelte +82 -82
- package/dist/features/button-group/typedef.js +10 -10
- package/dist/features/compare-left-right/CompareLeftRight.svelte +179 -179
- package/dist/features/compare-left-right/index.js +1 -1
- package/dist/features/game-box/GameBox.svelte +577 -577
- package/dist/features/game-box/gamebox.util.js +83 -83
- package/dist/features/hk-app-layout/HkAppLayout.state.svelte.js +25 -25
- package/dist/features/hk-app-layout/HkAppLayout.svelte +251 -251
- package/dist/features/image-box/ImageBox.svelte +210 -210
- package/dist/features/image-box/index.js +5 -5
- package/dist/features/image-box/typedef.js +32 -32
- package/dist/features/index.js +23 -23
- package/dist/features/presenter/ImageSlide.svelte +64 -64
- package/dist/features/presenter/Presenter.state.svelte.js +638 -638
- package/dist/features/presenter/Presenter.svelte +142 -142
- package/dist/features/presenter/constants.js +7 -7
- package/dist/features/presenter/index.js +10 -10
- package/dist/features/presenter/typedef.js +106 -106
- package/dist/features/presenter/util.js +210 -210
- package/dist/features/virtual-viewport/VirtualViewport.svelte +196 -196
- package/dist/logging/adapters/console.js +114 -114
- package/dist/logging/adapters/pino.js +60 -60
- package/dist/logging/constants.js +1 -1
- package/dist/logging/factories/client.js +21 -21
- package/dist/logging/factories/server.js +22 -22
- package/dist/logging/factories/universal.js +23 -23
- package/dist/logging/index.js +8 -8
- package/dist/schemas/index.js +1 -1
- package/dist/schemas/validate-url.js +180 -180
- package/dist/server/index.js +1 -1
- package/dist/server/logger.js +94 -94
- package/dist/states/index.js +1 -1
- package/dist/states/navigation.svelte.js +55 -55
- package/dist/stores/index.js +1 -1
- package/dist/stores/theme.js +80 -80
- package/dist/themes/hkdev/components/blocks/text-block.css +34 -34
- package/dist/themes/hkdev/components/boxes/game-box.css +11 -11
- package/dist/themes/hkdev/components/buttons/button-icon-steeze.css +22 -22
- package/dist/themes/hkdev/components/buttons/button-text.css +32 -32
- package/dist/themes/hkdev/components/buttons/button.css +146 -146
- package/dist/themes/hkdev/components/buttons/skip-button.css +5 -5
- package/dist/themes/hkdev/components/drag-drop/draggable.css +73 -73
- package/dist/themes/hkdev/components/drag-drop/drop-zone.css +58 -58
- package/dist/themes/hkdev/components/icons/icon-steeze.css +15 -15
- package/dist/themes/hkdev/components/inputs/text-input.css +102 -102
- package/dist/themes/hkdev/components/panels/panel.css +25 -25
- package/dist/themes/hkdev/components/rows/panel-grid-row.css +4 -4
- package/dist/themes/hkdev/components/rows/panel-row-2.css +5 -5
- package/dist/themes/hkdev/components.css +29 -29
- package/dist/themes/hkdev/debug.css +1 -1
- package/dist/themes/hkdev/global/layout.css +32 -32
- package/dist/themes/hkdev/global/on-colors.css +32 -32
- package/dist/themes/hkdev/globals.css +3 -3
- package/dist/themes/hkdev/responsive.css +12 -12
- package/dist/themes/hkdev/theme-ext.js +12 -12
- package/dist/themes/hkdev/theme.css +218 -218
- package/dist/themes/index.js +1 -1
- package/dist/typedef/context.js +6 -6
- package/dist/typedef/drag.js +25 -25
- package/dist/typedef/drop.js +12 -12
- package/dist/typedef/image.js +38 -38
- package/dist/typedef/index.js +4 -4
- package/dist/util/array/index.js +436 -436
- package/dist/util/bases/base58.js +262 -262
- package/dist/util/bases/index.js +1 -1
- package/dist/util/compare/index.js +247 -247
- package/dist/util/css/css-vars.js +83 -83
- package/dist/util/css/index.js +1 -1
- package/dist/util/design-system/components/states.js +22 -22
- package/dist/util/design-system/css/clamp.js +66 -66
- package/dist/util/design-system/css/root-design-vars.js +102 -102
- package/dist/util/design-system/index.js +5 -5
- package/dist/util/design-system/layout/scaling.js +228 -228
- package/dist/util/design-system/skeleton.js +208 -208
- package/dist/util/design-system/tailwind.js +288 -288
- package/dist/util/env/index.js +9 -9
- package/dist/util/exceptions/index.d.ts +11 -0
- package/dist/util/exceptions/index.js +17 -0
- package/dist/util/expect/arrays.js +47 -47
- package/dist/util/expect/index.js +259 -259
- package/dist/util/expect/primitives.js +55 -55
- package/dist/util/expect/url.js +60 -60
- package/dist/util/function/index.js +218 -218
- package/dist/util/geo/index.js +26 -26
- package/dist/util/http/caching.js +263 -263
- package/dist/util/http/errors.js +97 -97
- package/dist/util/http/headers.js +75 -75
- package/dist/util/http/http-request.js +578 -578
- package/dist/util/http/index.js +22 -22
- package/dist/util/http/json-request.js +224 -224
- package/dist/util/http/mocks.js +65 -65
- package/dist/util/http/response.js +294 -294
- package/dist/util/http/test-data__/content-length-test-hkdigital-small.V4HfZyBQ.avif +0 -0
- package/dist/util/http/typedef.js +93 -93
- package/dist/util/http/url.js +52 -52
- package/dist/util/image/index.js +86 -86
- package/dist/util/index.d.ts +1 -0
- package/dist/util/index.js +3 -2
- package/dist/util/is/index.js +140 -140
- package/dist/util/iterate/index.js +234 -234
- package/dist/util/object/index.js +1361 -1361
- package/dist/util/singleton/index.js +97 -97
- package/dist/util/string/array-path.js +75 -75
- package/dist/util/string/convert.js +54 -54
- package/dist/util/string/fs.js +226 -226
- package/dist/util/string/index.js +5 -5
- package/dist/util/string/interpolate.js +61 -61
- package/dist/util/string/pad.js +10 -10
- package/dist/util/svelte/index.js +4 -4
- package/dist/util/svelte/loading/loading-tracker.svelte.js +108 -108
- package/dist/util/svelte/observe/index.js +49 -49
- package/dist/util/svelte/state-context/index.js +117 -117
- package/dist/util/svelte/wait/index.js +38 -38
- package/dist/util/sveltekit/index.js +1 -1
- package/dist/util/sveltekit/route-folders/index.js +101 -101
- package/dist/util/time/index.js +323 -323
- package/dist/util/unique/index.js +249 -249
- package/dist/valibot/date.js__ +10 -10
- package/dist/valibot/index.js +9 -9
- package/dist/valibot/url.js +95 -95
- package/dist/valibot/user.js +23 -23
- package/dist/zod/all.js +33 -33
- package/dist/zod/generic.js +11 -11
- package/dist/zod/javascript.js +32 -32
- package/dist/zod/user.js +16 -16
- package/dist/zod/web.js +52 -52
- package/package.json +133 -132
@@ -1,275 +1,275 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Simple event emitter implementation to support event-based architecture
|
3
|
-
* in service management and other parts of the application.
|
4
|
-
*
|
5
|
-
* This implementation provides standard event publishing and subscription methods
|
6
|
-
* with support for namespaced events, wildcard listeners, and callback removal.
|
7
|
-
*
|
8
|
-
* @example
|
9
|
-
* // Basic usage
|
10
|
-
* import { EventEmitter } from './EventEmitter.js';
|
11
|
-
*
|
12
|
-
* // Create an emitter
|
13
|
-
* const events = new EventEmitter();
|
14
|
-
*
|
15
|
-
* // Subscribe to events
|
16
|
-
* const unsubscribe = events.on('data-loaded', (data) => {
|
17
|
-
* console.log('Data loaded:', data);
|
18
|
-
* });
|
19
|
-
*
|
20
|
-
* // Subscribe to all events with a specific prefix
|
21
|
-
* events.on('database:*', ({ event, data }) => {
|
22
|
-
* console.log(`Database event ${event}:`, data);
|
23
|
-
* });
|
24
|
-
*
|
25
|
-
* // Emit events
|
26
|
-
* events.emit('data-loaded', { items: [1, 2, 3] });
|
27
|
-
* events.emit('database:connected', { connectionId: 'abc123' });
|
28
|
-
*
|
29
|
-
* // Clean up when done
|
30
|
-
* unsubscribe();
|
31
|
-
*
|
32
|
-
* // Or remove all listeners
|
33
|
-
* events.removeAllListeners();
|
34
|
-
*/
|
35
|
-
|
36
|
-
/**
|
37
|
-
* EventEmitter class for event-based programming
|
38
|
-
*/
|
39
|
-
export default class EventEmitter {
|
40
|
-
/**
|
41
|
-
* Create a new EventEmitter instance
|
42
|
-
*/
|
43
|
-
constructor() {
|
44
|
-
/**
|
45
|
-
* Map to store event handlers
|
46
|
-
* @type {Map<string, Set<Function>>}
|
47
|
-
* @private
|
48
|
-
*/
|
49
|
-
this.eventHandlers = new Map();
|
50
|
-
|
51
|
-
/**
|
52
|
-
* Map to store wildcard event handlers (events ending with *)
|
53
|
-
* @type {Map<string, Set<Function>>}
|
54
|
-
* @private
|
55
|
-
*/
|
56
|
-
this.wildcardHandlers = new Map();
|
57
|
-
}
|
58
|
-
|
59
|
-
/**
|
60
|
-
* Register an event handler
|
61
|
-
*
|
62
|
-
* @param {string} eventName - Event name to listen for. Can use wildcard (*)
|
63
|
-
* at the end to listen to all events with a specific prefix.
|
64
|
-
* @param {Function} handler - Handler function to call when event is emitted
|
65
|
-
* @returns {Function} Function to remove this specific handler
|
66
|
-
*
|
67
|
-
* @example
|
68
|
-
* // Listen for a specific event
|
69
|
-
* emitter.on('userLoggedIn', (user) => {
|
70
|
-
* console.log(`User logged in: ${user.name}`);
|
71
|
-
* });
|
72
|
-
*
|
73
|
-
* // Listen for all events with a prefix
|
74
|
-
* emitter.on('api:*', ({ event, data }) => {
|
75
|
-
* console.log(`API event ${event}:`, data);
|
76
|
-
* });
|
77
|
-
*/
|
78
|
-
on(eventName, handler) {
|
79
|
-
if (typeof handler !== 'function') {
|
80
|
-
throw new TypeError('Event handler must be a function');
|
81
|
-
}
|
82
|
-
|
83
|
-
// Handle wildcard listeners
|
84
|
-
if (eventName.endsWith('*')) {
|
85
|
-
const prefix = eventName.slice(0, -1);
|
86
|
-
|
87
|
-
if (!this.wildcardHandlers.has(prefix)) {
|
88
|
-
this.wildcardHandlers.set(prefix, new Set());
|
89
|
-
}
|
90
|
-
|
91
|
-
this.wildcardHandlers.get(prefix).add(handler);
|
92
|
-
|
93
|
-
return () => this.off(eventName, handler);
|
94
|
-
}
|
95
|
-
|
96
|
-
// Handle normal listeners
|
97
|
-
if (!this.eventHandlers.has(eventName)) {
|
98
|
-
this.eventHandlers.set(eventName, new Set());
|
99
|
-
}
|
100
|
-
|
101
|
-
this.eventHandlers.get(eventName).add(handler);
|
102
|
-
|
103
|
-
return () => this.off(eventName, handler);
|
104
|
-
}
|
105
|
-
|
106
|
-
/**
|
107
|
-
* Register a one-time event handler that will be removed after first execution
|
108
|
-
*
|
109
|
-
* @param {string} eventName - Event name to listen for
|
110
|
-
* @param {Function} handler - Handler function to call when event is emitted
|
111
|
-
* @returns {Function} Function to remove this specific handler
|
112
|
-
*
|
113
|
-
* @example
|
114
|
-
* emitter.once('initialization', () => {
|
115
|
-
* console.log('Initialization happened');
|
116
|
-
* });
|
117
|
-
*/
|
118
|
-
once(eventName, handler) {
|
119
|
-
if (typeof handler !== 'function') {
|
120
|
-
throw new TypeError('Event handler must be a function');
|
121
|
-
}
|
122
|
-
|
123
|
-
const wrapper = (...args) => {
|
124
|
-
this.off(eventName, wrapper);
|
125
|
-
handler(...args);
|
126
|
-
};
|
127
|
-
|
128
|
-
return this.on(eventName, wrapper);
|
129
|
-
}
|
130
|
-
|
131
|
-
/**
|
132
|
-
* Remove an event handler
|
133
|
-
*
|
134
|
-
* @param {string} eventName - Event name the handler was registered for
|
135
|
-
* @param {Function} handler - Handler function to remove
|
136
|
-
* @returns {boolean} True if the handler was removed, false otherwise
|
137
|
-
*
|
138
|
-
* @example
|
139
|
-
* const handler = (data) => console.log(data);
|
140
|
-
* emitter.on('data', handler);
|
141
|
-
* emitter.off('data', handler);
|
142
|
-
*/
|
143
|
-
off(eventName, handler) {
|
144
|
-
// Handle wildcard listeners
|
145
|
-
if (eventName.endsWith('*')) {
|
146
|
-
const prefix = eventName.slice(0, -1);
|
147
|
-
const handlers = this.wildcardHandlers.get(prefix);
|
148
|
-
|
149
|
-
if (handlers) {
|
150
|
-
return handlers.delete(handler);
|
151
|
-
}
|
152
|
-
|
153
|
-
return false;
|
154
|
-
}
|
155
|
-
|
156
|
-
// Handle normal listeners
|
157
|
-
const handlers = this.eventHandlers.get(eventName);
|
158
|
-
|
159
|
-
if (handlers) {
|
160
|
-
return handlers.delete(handler);
|
161
|
-
}
|
162
|
-
|
163
|
-
return false;
|
164
|
-
}
|
165
|
-
|
166
|
-
/**
|
167
|
-
* Remove all event handlers for a specific event
|
168
|
-
*
|
169
|
-
* @param {string} [eventName] - Event name to remove handlers for.
|
170
|
-
* If not provided, removes all handlers for all events.
|
171
|
-
*
|
172
|
-
* @example
|
173
|
-
* // Remove all 'data' event handlers
|
174
|
-
* emitter.removeAllListeners('data');
|
175
|
-
*
|
176
|
-
* // Remove all event handlers
|
177
|
-
* emitter.removeAllListeners();
|
178
|
-
*/
|
179
|
-
removeAllListeners(eventName) {
|
180
|
-
if (eventName) {
|
181
|
-
// Handle wildcard listeners
|
182
|
-
if (eventName.endsWith('*')) {
|
183
|
-
const prefix = eventName.slice(0, -1);
|
184
|
-
this.wildcardHandlers.delete(prefix);
|
185
|
-
} else {
|
186
|
-
this.eventHandlers.delete(eventName);
|
187
|
-
}
|
188
|
-
} else {
|
189
|
-
// Clear all handlers
|
190
|
-
this.eventHandlers.clear();
|
191
|
-
this.wildcardHandlers.clear();
|
192
|
-
}
|
193
|
-
}
|
194
|
-
|
195
|
-
/**
|
196
|
-
* Emit an event
|
197
|
-
*
|
198
|
-
* @param {string} eventName - Name of the event to emit
|
199
|
-
* @param {*} data - Data to pass to event handlers
|
200
|
-
* @returns {boolean} True if there were handlers for this event, false otherwise
|
201
|
-
*
|
202
|
-
* @example
|
203
|
-
* emitter.emit('dataLoaded', { users: [...] });
|
204
|
-
*/
|
205
|
-
emit(eventName, data) {
|
206
|
-
let handled = false;
|
207
|
-
|
208
|
-
// Call specific event handlers
|
209
|
-
const handlers = this.eventHandlers.get(eventName);
|
210
|
-
if (handlers && handlers.size > 0) {
|
211
|
-
handlers.forEach(handler => handler(data));
|
212
|
-
handled = true;
|
213
|
-
}
|
214
|
-
|
215
|
-
// Call matching wildcard handlers
|
216
|
-
this.wildcardHandlers.forEach((handlers, prefix) => {
|
217
|
-
if (eventName.startsWith(prefix)) {
|
218
|
-
handlers.forEach(handler =>
|
219
|
-
handler({ event: eventName, data })
|
220
|
-
);
|
221
|
-
handled = true;
|
222
|
-
}
|
223
|
-
});
|
224
|
-
|
225
|
-
return handled;
|
226
|
-
}
|
227
|
-
|
228
|
-
/**
|
229
|
-
* Get the number of listeners for a specific event
|
230
|
-
*
|
231
|
-
* @param {string} eventName - Event name to count listeners for
|
232
|
-
* @returns {number} Number of listeners for this event
|
233
|
-
*
|
234
|
-
* @example
|
235
|
-
* const count = emitter.listenerCount('data');
|
236
|
-
* console.log(`There are ${count} data event listeners`);
|
237
|
-
*/
|
238
|
-
listenerCount(eventName) {
|
239
|
-
let count = 0;
|
240
|
-
|
241
|
-
// Count specific event handlers
|
242
|
-
const handlers = this.eventHandlers.get(eventName);
|
243
|
-
if (handlers) {
|
244
|
-
count += handlers.size;
|
245
|
-
}
|
246
|
-
|
247
|
-
// Count matching wildcard handlers
|
248
|
-
this.wildcardHandlers.forEach((handlers, prefix) => {
|
249
|
-
if (eventName.startsWith(prefix)) {
|
250
|
-
count += handlers.size;
|
251
|
-
}
|
252
|
-
});
|
253
|
-
|
254
|
-
return count;
|
255
|
-
}
|
256
|
-
|
257
|
-
/**
|
258
|
-
* Get all registered event names
|
259
|
-
*
|
260
|
-
* @returns {string[]} Array of event names that have listeners
|
261
|
-
*
|
262
|
-
* @example
|
263
|
-
* console.log('Events with listeners:', emitter.eventNames());
|
264
|
-
*/
|
265
|
-
eventNames() {
|
266
|
-
const events = [...this.eventHandlers.keys()];
|
267
|
-
|
268
|
-
// Add wildcard events
|
269
|
-
this.wildcardHandlers.forEach((_, prefix) => {
|
270
|
-
events.push(`${prefix}*`);
|
271
|
-
});
|
272
|
-
|
273
|
-
return events;
|
274
|
-
}
|
275
|
-
}
|
1
|
+
/**
|
2
|
+
* @fileoverview Simple event emitter implementation to support event-based architecture
|
3
|
+
* in service management and other parts of the application.
|
4
|
+
*
|
5
|
+
* This implementation provides standard event publishing and subscription methods
|
6
|
+
* with support for namespaced events, wildcard listeners, and callback removal.
|
7
|
+
*
|
8
|
+
* @example
|
9
|
+
* // Basic usage
|
10
|
+
* import { EventEmitter } from './EventEmitter.js';
|
11
|
+
*
|
12
|
+
* // Create an emitter
|
13
|
+
* const events = new EventEmitter();
|
14
|
+
*
|
15
|
+
* // Subscribe to events
|
16
|
+
* const unsubscribe = events.on('data-loaded', (data) => {
|
17
|
+
* console.log('Data loaded:', data);
|
18
|
+
* });
|
19
|
+
*
|
20
|
+
* // Subscribe to all events with a specific prefix
|
21
|
+
* events.on('database:*', ({ event, data }) => {
|
22
|
+
* console.log(`Database event ${event}:`, data);
|
23
|
+
* });
|
24
|
+
*
|
25
|
+
* // Emit events
|
26
|
+
* events.emit('data-loaded', { items: [1, 2, 3] });
|
27
|
+
* events.emit('database:connected', { connectionId: 'abc123' });
|
28
|
+
*
|
29
|
+
* // Clean up when done
|
30
|
+
* unsubscribe();
|
31
|
+
*
|
32
|
+
* // Or remove all listeners
|
33
|
+
* events.removeAllListeners();
|
34
|
+
*/
|
35
|
+
|
36
|
+
/**
|
37
|
+
* EventEmitter class for event-based programming
|
38
|
+
*/
|
39
|
+
export default class EventEmitter {
|
40
|
+
/**
|
41
|
+
* Create a new EventEmitter instance
|
42
|
+
*/
|
43
|
+
constructor() {
|
44
|
+
/**
|
45
|
+
* Map to store event handlers
|
46
|
+
* @type {Map<string, Set<Function>>}
|
47
|
+
* @private
|
48
|
+
*/
|
49
|
+
this.eventHandlers = new Map();
|
50
|
+
|
51
|
+
/**
|
52
|
+
* Map to store wildcard event handlers (events ending with *)
|
53
|
+
* @type {Map<string, Set<Function>>}
|
54
|
+
* @private
|
55
|
+
*/
|
56
|
+
this.wildcardHandlers = new Map();
|
57
|
+
}
|
58
|
+
|
59
|
+
/**
|
60
|
+
* Register an event handler
|
61
|
+
*
|
62
|
+
* @param {string} eventName - Event name to listen for. Can use wildcard (*)
|
63
|
+
* at the end to listen to all events with a specific prefix.
|
64
|
+
* @param {Function} handler - Handler function to call when event is emitted
|
65
|
+
* @returns {Function} Function to remove this specific handler
|
66
|
+
*
|
67
|
+
* @example
|
68
|
+
* // Listen for a specific event
|
69
|
+
* emitter.on('userLoggedIn', (user) => {
|
70
|
+
* console.log(`User logged in: ${user.name}`);
|
71
|
+
* });
|
72
|
+
*
|
73
|
+
* // Listen for all events with a prefix
|
74
|
+
* emitter.on('api:*', ({ event, data }) => {
|
75
|
+
* console.log(`API event ${event}:`, data);
|
76
|
+
* });
|
77
|
+
*/
|
78
|
+
on(eventName, handler) {
|
79
|
+
if (typeof handler !== 'function') {
|
80
|
+
throw new TypeError('Event handler must be a function');
|
81
|
+
}
|
82
|
+
|
83
|
+
// Handle wildcard listeners
|
84
|
+
if (eventName.endsWith('*')) {
|
85
|
+
const prefix = eventName.slice(0, -1);
|
86
|
+
|
87
|
+
if (!this.wildcardHandlers.has(prefix)) {
|
88
|
+
this.wildcardHandlers.set(prefix, new Set());
|
89
|
+
}
|
90
|
+
|
91
|
+
this.wildcardHandlers.get(prefix).add(handler);
|
92
|
+
|
93
|
+
return () => this.off(eventName, handler);
|
94
|
+
}
|
95
|
+
|
96
|
+
// Handle normal listeners
|
97
|
+
if (!this.eventHandlers.has(eventName)) {
|
98
|
+
this.eventHandlers.set(eventName, new Set());
|
99
|
+
}
|
100
|
+
|
101
|
+
this.eventHandlers.get(eventName).add(handler);
|
102
|
+
|
103
|
+
return () => this.off(eventName, handler);
|
104
|
+
}
|
105
|
+
|
106
|
+
/**
|
107
|
+
* Register a one-time event handler that will be removed after first execution
|
108
|
+
*
|
109
|
+
* @param {string} eventName - Event name to listen for
|
110
|
+
* @param {Function} handler - Handler function to call when event is emitted
|
111
|
+
* @returns {Function} Function to remove this specific handler
|
112
|
+
*
|
113
|
+
* @example
|
114
|
+
* emitter.once('initialization', () => {
|
115
|
+
* console.log('Initialization happened');
|
116
|
+
* });
|
117
|
+
*/
|
118
|
+
once(eventName, handler) {
|
119
|
+
if (typeof handler !== 'function') {
|
120
|
+
throw new TypeError('Event handler must be a function');
|
121
|
+
}
|
122
|
+
|
123
|
+
const wrapper = (...args) => {
|
124
|
+
this.off(eventName, wrapper);
|
125
|
+
handler(...args);
|
126
|
+
};
|
127
|
+
|
128
|
+
return this.on(eventName, wrapper);
|
129
|
+
}
|
130
|
+
|
131
|
+
/**
|
132
|
+
* Remove an event handler
|
133
|
+
*
|
134
|
+
* @param {string} eventName - Event name the handler was registered for
|
135
|
+
* @param {Function} handler - Handler function to remove
|
136
|
+
* @returns {boolean} True if the handler was removed, false otherwise
|
137
|
+
*
|
138
|
+
* @example
|
139
|
+
* const handler = (data) => console.log(data);
|
140
|
+
* emitter.on('data', handler);
|
141
|
+
* emitter.off('data', handler);
|
142
|
+
*/
|
143
|
+
off(eventName, handler) {
|
144
|
+
// Handle wildcard listeners
|
145
|
+
if (eventName.endsWith('*')) {
|
146
|
+
const prefix = eventName.slice(0, -1);
|
147
|
+
const handlers = this.wildcardHandlers.get(prefix);
|
148
|
+
|
149
|
+
if (handlers) {
|
150
|
+
return handlers.delete(handler);
|
151
|
+
}
|
152
|
+
|
153
|
+
return false;
|
154
|
+
}
|
155
|
+
|
156
|
+
// Handle normal listeners
|
157
|
+
const handlers = this.eventHandlers.get(eventName);
|
158
|
+
|
159
|
+
if (handlers) {
|
160
|
+
return handlers.delete(handler);
|
161
|
+
}
|
162
|
+
|
163
|
+
return false;
|
164
|
+
}
|
165
|
+
|
166
|
+
/**
|
167
|
+
* Remove all event handlers for a specific event
|
168
|
+
*
|
169
|
+
* @param {string} [eventName] - Event name to remove handlers for.
|
170
|
+
* If not provided, removes all handlers for all events.
|
171
|
+
*
|
172
|
+
* @example
|
173
|
+
* // Remove all 'data' event handlers
|
174
|
+
* emitter.removeAllListeners('data');
|
175
|
+
*
|
176
|
+
* // Remove all event handlers
|
177
|
+
* emitter.removeAllListeners();
|
178
|
+
*/
|
179
|
+
removeAllListeners(eventName) {
|
180
|
+
if (eventName) {
|
181
|
+
// Handle wildcard listeners
|
182
|
+
if (eventName.endsWith('*')) {
|
183
|
+
const prefix = eventName.slice(0, -1);
|
184
|
+
this.wildcardHandlers.delete(prefix);
|
185
|
+
} else {
|
186
|
+
this.eventHandlers.delete(eventName);
|
187
|
+
}
|
188
|
+
} else {
|
189
|
+
// Clear all handlers
|
190
|
+
this.eventHandlers.clear();
|
191
|
+
this.wildcardHandlers.clear();
|
192
|
+
}
|
193
|
+
}
|
194
|
+
|
195
|
+
/**
|
196
|
+
* Emit an event
|
197
|
+
*
|
198
|
+
* @param {string} eventName - Name of the event to emit
|
199
|
+
* @param {*} data - Data to pass to event handlers
|
200
|
+
* @returns {boolean} True if there were handlers for this event, false otherwise
|
201
|
+
*
|
202
|
+
* @example
|
203
|
+
* emitter.emit('dataLoaded', { users: [...] });
|
204
|
+
*/
|
205
|
+
emit(eventName, data) {
|
206
|
+
let handled = false;
|
207
|
+
|
208
|
+
// Call specific event handlers
|
209
|
+
const handlers = this.eventHandlers.get(eventName);
|
210
|
+
if (handlers && handlers.size > 0) {
|
211
|
+
handlers.forEach(handler => handler(data));
|
212
|
+
handled = true;
|
213
|
+
}
|
214
|
+
|
215
|
+
// Call matching wildcard handlers
|
216
|
+
this.wildcardHandlers.forEach((handlers, prefix) => {
|
217
|
+
if (eventName.startsWith(prefix)) {
|
218
|
+
handlers.forEach(handler =>
|
219
|
+
handler({ event: eventName, data })
|
220
|
+
);
|
221
|
+
handled = true;
|
222
|
+
}
|
223
|
+
});
|
224
|
+
|
225
|
+
return handled;
|
226
|
+
}
|
227
|
+
|
228
|
+
/**
|
229
|
+
* Get the number of listeners for a specific event
|
230
|
+
*
|
231
|
+
* @param {string} eventName - Event name to count listeners for
|
232
|
+
* @returns {number} Number of listeners for this event
|
233
|
+
*
|
234
|
+
* @example
|
235
|
+
* const count = emitter.listenerCount('data');
|
236
|
+
* console.log(`There are ${count} data event listeners`);
|
237
|
+
*/
|
238
|
+
listenerCount(eventName) {
|
239
|
+
let count = 0;
|
240
|
+
|
241
|
+
// Count specific event handlers
|
242
|
+
const handlers = this.eventHandlers.get(eventName);
|
243
|
+
if (handlers) {
|
244
|
+
count += handlers.size;
|
245
|
+
}
|
246
|
+
|
247
|
+
// Count matching wildcard handlers
|
248
|
+
this.wildcardHandlers.forEach((handlers, prefix) => {
|
249
|
+
if (eventName.startsWith(prefix)) {
|
250
|
+
count += handlers.size;
|
251
|
+
}
|
252
|
+
});
|
253
|
+
|
254
|
+
return count;
|
255
|
+
}
|
256
|
+
|
257
|
+
/**
|
258
|
+
* Get all registered event names
|
259
|
+
*
|
260
|
+
* @returns {string[]} Array of event names that have listeners
|
261
|
+
*
|
262
|
+
* @example
|
263
|
+
* console.log('Events with listeners:', emitter.eventNames());
|
264
|
+
*/
|
265
|
+
eventNames() {
|
266
|
+
const events = [...this.eventHandlers.keys()];
|
267
|
+
|
268
|
+
// Add wildcard events
|
269
|
+
this.wildcardHandlers.forEach((_, prefix) => {
|
270
|
+
events.push(`${prefix}*`);
|
271
|
+
});
|
272
|
+
|
273
|
+
return events;
|
274
|
+
}
|
275
|
+
}
|
@@ -1,2 +1,2 @@
|
|
1
|
-
|
2
|
-
export { default as EventEmitter } from './EventEmitter.js';
|
1
|
+
|
2
|
+
export { default as EventEmitter } from './EventEmitter.js';
|
package/dist/classes/index.js
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
export * as data from './data/index.js';
|
2
|
-
export * as streams from './streams/index.js';
|
3
|
-
export * as stores from './stores/index.js';
|
4
|
-
export * as svelte from './svelte/index.js';
|
1
|
+
export * as data from './data/index.js';
|
2
|
+
export * as streams from './streams/index.js';
|
3
|
+
export * as stores from './stores/index.js';
|
4
|
+
export * as svelte from './svelte/index.js';
|