@hkdigital/lib-core 0.4.29 → 0.4.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/README.md +10 -4
  2. package/dist/auth/jwt/constants.d.ts +1 -1
  3. package/dist/auth/jwt/errors.d.ts +5 -5
  4. package/dist/auth/jwt/typedef.d.ts +30 -30
  5. package/dist/config/generators/imagetools.d.ts +3 -3
  6. package/dist/config/generators/vite.d.ts +11 -11
  7. package/dist/config/generators/vite.js +1 -1
  8. package/dist/design/generators/index.d.ts +9 -9
  9. package/dist/design/utils/clamp.d.ts +1 -1
  10. package/dist/design/utils/root-vars.d.ts +1 -1
  11. package/dist/design/utils/scaling.d.ts +2 -2
  12. package/dist/generic/data/classes/IterableTree.d.ts +2 -2
  13. package/dist/generic/data/classes/IterableTree.js +1 -0
  14. package/dist/generic/data/classes/Selector.d.ts +5 -5
  15. package/dist/generic/data/classes/Selector.js +53 -60
  16. package/dist/generic/data/classes/typedef.d.ts +5 -5
  17. package/dist/generic/errors/generic.d.ts +3 -1
  18. package/dist/generic/errors/promise.d.ts +2 -2
  19. package/dist/generic/events/classes/EventEmitter.js +1 -0
  20. package/dist/generic/promises/classes/HkPromise.js +9 -15
  21. package/dist/logging/internal/adapters/console.d.ts +5 -5
  22. package/dist/logging/internal/adapters/pino.d.ts +3 -3
  23. package/dist/logging/internal/adapters/typedef.d.ts +7 -7
  24. package/dist/logging/internal/factories/client.d.ts +1 -1
  25. package/dist/logging/internal/factories/server.d.ts +1 -1
  26. package/dist/logging/internal/logger/Logger.d.ts +3 -3
  27. package/dist/logging/internal/transports/pretty-transport.d.ts +3 -3
  28. package/dist/logging/internal/transports/test-transport.d.ts +5 -5
  29. package/dist/logging/typedef.d.ts +1 -1
  30. package/dist/network/cache/IndexedDbCache.d.ts +10 -10
  31. package/dist/network/cache/MemoryResponseCache.d.ts +3 -3
  32. package/dist/network/cache/typedef.d.ts +3 -3
  33. package/dist/network/errors/http.d.ts +2 -2
  34. package/dist/network/http/caching.d.ts +2 -2
  35. package/dist/network/http/http-request.d.ts +1 -1
  36. package/dist/network/http/typedef.d.ts +31 -31
  37. package/dist/network/loaders/audio/AudioScene.svelte.d.ts +2 -2
  38. package/dist/network/loaders/base/SceneBase.svelte.d.ts +4 -4
  39. package/dist/network/loaders/base/SceneBase.svelte.js +1 -1
  40. package/dist/network/loaders/image/ImageLoader.svelte.d.ts +1 -1
  41. package/dist/network/loaders/image/ImageVariantsLoader.svelte.d.ts +5 -5
  42. package/dist/network/loaders/image/utils/index.d.ts +3 -3
  43. package/dist/services/README.md +36 -2
  44. package/dist/services/manager-plugins/ConfigPlugin.d.ts +1 -1
  45. package/dist/services/service-base/ServiceBase.d.ts +13 -3
  46. package/dist/services/service-base/ServiceBase.js +27 -9
  47. package/dist/services/service-base/typedef.d.ts +8 -8
  48. package/dist/services/service-manager/ServiceManager.d.ts +10 -2
  49. package/dist/services/service-manager/ServiceManager.js +64 -50
  50. package/dist/services/service-manager/typedef.d.ts +12 -11
  51. package/dist/services/service-manager/typedef.js +2 -1
  52. package/dist/state/machines/finite-state-machine/FiniteStateMachine.svelte.d.ts +1 -1
  53. package/dist/state/machines/finite-state-machine/constants.js +2 -2
  54. package/dist/state/machines/loading-state-machine/LoadingStateMachine.svelte.d.ts +1 -1
  55. package/dist/state/stores/theme.d.ts +1 -1
  56. package/dist/ui/components/button-group/ButtonGroup.svelte.d.ts +7 -7
  57. package/dist/ui/components/button-group/typedef.d.ts +1 -1
  58. package/dist/ui/components/compare-left-right/CompareLeftRight.svelte.d.ts +5 -5
  59. package/dist/ui/components/drag-drop/DragController.d.ts +1 -1
  60. package/dist/ui/components/drag-drop/DragDropContext.svelte.d.ts +3 -3
  61. package/dist/ui/components/drag-drop/Draggable.svelte.d.ts +20 -20
  62. package/dist/ui/components/drag-drop/DropZone.svelte.d.ts +27 -27
  63. package/dist/ui/components/drag-drop/DropZoneArea.svelte.d.ts +26 -26
  64. package/dist/ui/components/drag-drop/DropZoneList.svelte.d.ts +27 -27
  65. package/dist/ui/components/drag-drop/drag-state.svelte.d.ts +4 -4
  66. package/dist/ui/components/drag-drop/typedef/drag.d.ts +1 -1
  67. package/dist/ui/components/game-box/GameBox.svelte.d.ts +19 -19
  68. package/dist/ui/components/game-box/gamebox.util.d.ts +2 -2
  69. package/dist/ui/components/grid-layers/GridLayers.svelte.d.ts +7 -7
  70. package/dist/ui/components/image-box/ImageBox.svelte.d.ts +14 -14
  71. package/dist/ui/components/presenter/ImageSlide.svelte.d.ts +8 -8
  72. package/dist/ui/components/presenter/Presenter.state.svelte.d.ts +1 -1
  73. package/dist/ui/components/presenter/Presenter.svelte.d.ts +5 -5
  74. package/dist/ui/components/presenter/typedef.d.ts +13 -13
  75. package/dist/ui/components/rows/panel-grid-row/PanelGridRow.svelte.d.ts +7 -7
  76. package/dist/ui/components/rows/panel-row-2/PanelRow2.svelte.d.ts +7 -7
  77. package/dist/ui/components/tab-bar/HkTabBar.svelte.d.ts +10 -10
  78. package/dist/ui/components/tab-bar/HkTabBarSelector.state.svelte.d.ts +1 -1
  79. package/dist/ui/components/tab-bar/HkTabBarSelector.svelte.d.ts +10 -10
  80. package/dist/ui/components/tab-bar/typedef.d.ts +3 -3
  81. package/dist/ui/components/virtual-viewport/VirtualViewport.svelte.d.ts +17 -17
  82. package/dist/ui/dev/blocks/TextBlock.svelte.d.ts +6 -6
  83. package/dist/ui/dev/buttons/CheckButton.svelte.d.ts +11 -11
  84. package/dist/ui/primitives/area/HkArea.svelte.d.ts +6 -6
  85. package/dist/ui/primitives/area/HkGridArea.svelte.d.ts +12 -12
  86. package/dist/ui/primitives/buttons/button/Button.svelte.d.ts +16 -16
  87. package/dist/ui/primitives/buttons/button-icon-steeze/SteezeIconButton.svelte.d.ts +2 -2
  88. package/dist/ui/primitives/buttons/button-submit/SubmitButton.svelte +21 -0
  89. package/dist/ui/primitives/buttons/button-submit/SubmitButton.svelte.d.ts +12 -0
  90. package/dist/ui/primitives/buttons/index.d.ts +2 -1
  91. package/dist/ui/primitives/buttons/index.js +2 -1
  92. package/dist/ui/primitives/icons/HkIcon.svelte.d.ts +4 -4
  93. package/dist/ui/primitives/icons/HkTabIcon.svelte.d.ts +13 -13
  94. package/dist/ui/primitives/icons/SteezeIcon.svelte.d.ts +4 -4
  95. package/dist/ui/primitives/inputs/text-input/TextInput.svelte.d.ts +22 -22
  96. package/dist/ui/primitives/inputs/text-input/assets/IconInvalid.svelte.d.ts +1 -1
  97. package/dist/ui/primitives/inputs/text-input/assets/IconValid.svelte.d.ts +1 -1
  98. package/dist/ui/primitives/panels/panel/Panel.svelte.d.ts +6 -6
  99. package/dist/util/array/index.d.ts +17 -17
  100. package/dist/util/array/index.js +5 -5
  101. package/dist/util/compare/index.d.ts +2 -1
  102. package/dist/util/compare/index.js +1 -0
  103. package/dist/util/exceptions/index.d.ts +3 -2
  104. package/dist/util/exceptions/index.js +13 -9
  105. package/dist/util/expect/arrays.d.ts +1 -0
  106. package/dist/util/expect/arrays.js +1 -0
  107. package/dist/util/expect/primitives.d.ts +18 -0
  108. package/dist/util/expect/primitives.js +18 -0
  109. package/dist/util/function/index.d.ts +14 -1
  110. package/dist/util/geometry/index.d.ts +2 -2
  111. package/dist/util/geometry/index.js +1 -1
  112. package/dist/util/iterate/index.d.ts +7 -7
  113. package/dist/util/object/index.d.ts +13 -13
  114. package/dist/util/singleton/index.d.ts +3 -3
  115. package/dist/util/svelte/loading/loading-tracker.svelte.d.ts +1 -1
  116. package/dist/util/sveltekit/env/all.d.ts +5 -5
  117. package/dist/util/sveltekit/env/all.js +2 -2
  118. package/dist/util/sveltekit/env/parsers.d.ts +12 -12
  119. package/dist/util/sveltekit/env/private.d.ts +5 -5
  120. package/dist/util/sveltekit/env/public.d.ts +5 -5
  121. package/dist/util/sveltekit/route-folders/index.d.ts +2 -2
  122. package/dist/util/sveltekit/route-folders.d.ts +1 -0
  123. package/dist/util/{sveltekit.js → sveltekit/route-folders.js} +1 -1
  124. package/dist/util/time/index.d.ts +4 -4
  125. package/dist/valibot/parsers/url.d.ts +3 -3
  126. package/dist/valibot/parsers/url.js +6 -2
  127. package/package.json +1 -1
  128. package/dist/util/sveltekit.d.ts +0 -1
@@ -34,11 +34,21 @@ export class ServiceBase extends EventEmitter {
34
34
  /**
35
35
  * Configure the service with configuration
36
36
  *
37
- * @param {*} [config={}] - Service-specific configuration
37
+ * @param {Object<string,any>|null} [config={}]
38
38
  *
39
39
  * @returns {Promise<boolean>} True if configuration succeeded
40
40
  */
41
- configure(config?: any): Promise<boolean>;
41
+ configure(config?: {
42
+ [x: string]: any;
43
+ } | null): Promise<boolean>;
44
+ /**
45
+ * Get the last applied config
46
+ *
47
+ * @returns {Object<string,any>} config
48
+ */
49
+ get lastConfig(): {
50
+ [x: string]: any;
51
+ };
42
52
  /**
43
53
  * Start the service
44
54
  *
@@ -152,7 +162,7 @@ export class ServiceBase extends EventEmitter {
152
162
  *
153
163
  * @returns {Promise<Object>} Additional health information
154
164
  */
155
- protected _healthCheck(): Promise<any>;
165
+ protected _healthCheck(): Promise<Object>;
156
166
  /**
157
167
  * Set the service state and emit event
158
168
  *
@@ -85,7 +85,8 @@ import {
85
85
  * @extends EventEmitter
86
86
  */
87
87
  export class ServiceBase extends EventEmitter {
88
- /** @type {*} */
88
+
89
+ /** @type {Object<string,any>|null} */
89
90
  #lastConfig = null;
90
91
 
91
92
  /**
@@ -97,6 +98,11 @@ export class ServiceBase extends EventEmitter {
97
98
  constructor(name, options = {}) {
98
99
  super();
99
100
 
101
+ if( typeof name !== 'string' )
102
+ {
103
+ throw new Error(`Service misses constructor parameter [name]`);
104
+ }
105
+
100
106
  /** @type {string} */
101
107
  this.name = name;
102
108
 
@@ -122,7 +128,7 @@ export class ServiceBase extends EventEmitter {
122
128
  /**
123
129
  * Configure the service with configuration
124
130
  *
125
- * @param {*} [config={}] - Service-specific configuration
131
+ * @param {Object<string,any>|null} [config={}]
126
132
  *
127
133
  * @returns {Promise<boolean>} True if configuration succeeded
128
134
  */
@@ -152,11 +158,20 @@ export class ServiceBase extends EventEmitter {
152
158
  this.logger.info('Service configured');
153
159
  return true;
154
160
  } catch (error) {
155
- this._setError('configuration', error);
161
+ this._setError('configuration', /** @type {Error} */ (error));
156
162
  return false;
157
163
  }
158
164
  }
159
165
 
166
+ /**
167
+ * Get the last applied config
168
+ *
169
+ * @returns {Object<string,any>} config
170
+ */
171
+ get lastConfig() {
172
+ return { ...this.#lastConfig };
173
+ }
174
+
160
175
  /**
161
176
  * Start the service
162
177
  *
@@ -180,7 +195,7 @@ export class ServiceBase extends EventEmitter {
180
195
  this.logger.info('Service started');
181
196
  return true;
182
197
  } catch (error) {
183
- this._setError('startup', error);
198
+ this._setError('startup', /** @type {Error} */ (error));
184
199
  return false;
185
200
  }
186
201
  }
@@ -224,12 +239,15 @@ export class ServiceBase extends EventEmitter {
224
239
  this.logger.info('Service stopped');
225
240
  return true;
226
241
  } catch (error) {
227
- if (error.message === 'Shutdown timeout' && options.force) {
242
+ if (
243
+ /** @type {Error} */ (error).message === 'Shutdown timeout' &&
244
+ options.force
245
+ ) {
228
246
  this.logger.warn('Forced shutdown after timeout');
229
247
  this._setState(STATE_STOPPED);
230
248
  return true;
231
249
  }
232
- this._setError('shutdown', error);
250
+ this._setError('shutdown', /** @type {Error} */ (error));
233
251
  return false;
234
252
  }
235
253
  }
@@ -267,7 +285,7 @@ export class ServiceBase extends EventEmitter {
267
285
  this.logger.info('Recovery successful');
268
286
  return true;
269
287
  } catch (error) {
270
- this._setError('recovery', error);
288
+ this._setError('recovery', /** @type {Error} */ (error));
271
289
  return false;
272
290
  }
273
291
  }
@@ -305,7 +323,7 @@ export class ServiceBase extends EventEmitter {
305
323
 
306
324
  return true;
307
325
  } catch (error) {
308
- this._setError('destruction', error);
326
+ this._setError('destruction', /** @type {Error} */ (error));
309
327
  return false;
310
328
  }
311
329
  }
@@ -332,7 +350,7 @@ export class ServiceBase extends EventEmitter {
332
350
  return {
333
351
  ...baseHealth,
334
352
  healthy: false,
335
- checkError: error.message
353
+ checkError: /** @type {Error} */ (error).message
336
354
  };
337
355
  }
338
356
  }
@@ -9,11 +9,11 @@ export type ServiceOptions = {
9
9
  /**
10
10
  * - Initial log level for the service
11
11
  */
12
- logLevel?: string;
12
+ logLevel?: string | undefined;
13
13
  /**
14
14
  * - Timeout for graceful shutdown
15
15
  */
16
- shutdownTimeout?: number;
16
+ shutdownTimeout?: number | undefined;
17
17
  };
18
18
  /**
19
19
  * Options for stopping a service
@@ -22,11 +22,11 @@ export type StopOptions = {
22
22
  /**
23
23
  * - Override shutdown timeout
24
24
  */
25
- timeout?: number;
25
+ timeout?: number | undefined;
26
26
  /**
27
27
  * - Force stop even if timeout exceeded
28
28
  */
29
- force?: boolean;
29
+ force?: boolean | undefined;
30
30
  };
31
31
  /**
32
32
  * Health status returned by service health checks
@@ -47,11 +47,11 @@ export type HealthStatus = {
47
47
  /**
48
48
  * - Error message if unhealthy
49
49
  */
50
- error?: string;
50
+ error?: string | undefined;
51
51
  /**
52
52
  * - Error from health check itself
53
53
  */
54
- checkError?: string;
54
+ checkError?: string | undefined;
55
55
  /**
56
56
  * - Additional health check properties
57
57
  */
@@ -61,7 +61,7 @@ export type HealthStatus = {
61
61
  * Base class interface that services must implement
62
62
  * Allows additional custom properties and methods via Record<string, any>
63
63
  */
64
- export type ServiceInstance = any & Record<string, any>;
64
+ export type ServiceInstance = Object & Record<string, any>;
65
65
  export type StateChangeEvent = {
66
66
  /**
67
67
  * - Service name (added by ServiceManager)
@@ -94,7 +94,7 @@ export type HealthChangeEvent = {
94
94
  /**
95
95
  * - Previous health status
96
96
  */
97
- wasHealthy?: boolean;
97
+ wasHealthy?: boolean | undefined;
98
98
  };
99
99
  /**
100
100
  * Event emitted when service encounters an error
@@ -7,6 +7,10 @@
7
7
  * @typedef {import('./typedef.js').HealthCheckResult} HealthCheckResult
8
8
  *
9
9
  * @typedef {import('../service-base/typedef.js').StopOptions} StopOptions
10
+ * @typedef {import('../service-base/typedef.js').StateChangeEvent} StateChangeEvent
11
+ * @typedef {import('../service-base/typedef.js').HealthChangeEvent} HealthChangeEvent
12
+ * @typedef {import('../service-base/typedef.js').ServiceErrorEvent} ServiceErrorEvent
13
+ * @typedef {import('../../logging/typedef.js').LogEvent} LogEvent
10
14
  */
11
15
  /**
12
16
  * Service Manager for lifecycle and dependency management
@@ -131,11 +135,11 @@ export class ServiceManager extends EventEmitter {
131
135
  /**
132
136
  * Listen to log messages emitted by individual services
133
137
  *
134
- * @param {Function} listener - Log event handler
138
+ * @param {(logEvent: LogEvent) => void} listener - Log event handler
135
139
  *
136
140
  * @returns {Function} Unsubscribe function
137
141
  */
138
- onServiceLogEvent(listener: Function): Function;
142
+ onServiceLogEvent(listener: (logEvent: LogEvent) => void): Function;
139
143
  /**
140
144
  * Set log level for the ServiceManager itself
141
145
  *
@@ -181,5 +185,9 @@ export type ServiceEntry = import("./typedef.js").ServiceEntry;
181
185
  export type ServiceConfigOrLabel = import("./typedef.js").ServiceConfigOrLabel;
182
186
  export type HealthCheckResult = import("./typedef.js").HealthCheckResult;
183
187
  export type StopOptions = import("../service-base/typedef.js").StopOptions;
188
+ export type StateChangeEvent = import("../service-base/typedef.js").StateChangeEvent;
189
+ export type HealthChangeEvent = import("../service-base/typedef.js").HealthChangeEvent;
190
+ export type ServiceErrorEvent = import("../service-base/typedef.js").ServiceErrorEvent;
191
+ export type LogEvent = import("../../logging/typedef.js").LogEvent;
184
192
  import { EventEmitter } from '../../generic/events.js';
185
193
  import { Logger } from '../../logging/index.js';
@@ -85,6 +85,10 @@ import {
85
85
  * @typedef {import('./typedef.js').HealthCheckResult} HealthCheckResult
86
86
  *
87
87
  * @typedef {import('../service-base/typedef.js').StopOptions} StopOptions
88
+ * @typedef {import('../service-base/typedef.js').StateChangeEvent} StateChangeEvent
89
+ * @typedef {import('../service-base/typedef.js').HealthChangeEvent} HealthChangeEvent
90
+ * @typedef {import('../service-base/typedef.js').ServiceErrorEvent} ServiceErrorEvent
91
+ * @typedef {import('../../logging/typedef.js').LogEvent} LogEvent
88
92
  */
89
93
 
90
94
  /**
@@ -106,7 +110,8 @@ export class ServiceManager extends EventEmitter {
106
110
  /** @type {Map<string, ServiceEntry>} */
107
111
  this.services = new Map();
108
112
 
109
- const defaultLogLevel = config.defaultLogLevel || (config.debug ? DEBUG : INFO);
113
+ const defaultLogLevel =
114
+ config.defaultLogLevel || (config.debug ? DEBUG : INFO);
110
115
  const managerLogLevel = config.managerLogLevel || defaultLogLevel;
111
116
  const serviceLogLevels = config.serviceLogLevels;
112
117
 
@@ -118,16 +123,16 @@ export class ServiceManager extends EventEmitter {
118
123
  debug: config.debug ?? false,
119
124
  autoStart: config.autoStart ?? false,
120
125
  stopTimeout: config.stopTimeout || 10000,
121
- defaultLogLevel,
122
- managerLogLevel
126
+ defaultLogLevel
127
+ // managerLogLevel will be set bysetManagerLogLevel()
123
128
  // serviceLogLevels will be set by setServiceLogLevel()
124
129
  };
125
130
 
131
+ this.setManagerLogLevel(managerLogLevel);
132
+
126
133
  if (serviceLogLevels) {
127
134
  this.setServiceLogLevel(serviceLogLevels);
128
135
  }
129
-
130
- this.#setupLogging();
131
136
  }
132
137
 
133
138
  /**
@@ -196,10 +201,8 @@ export class ServiceManager extends EventEmitter {
196
201
 
197
202
  // Track dependents
198
203
  entry.dependencies.forEach((dep) => {
199
- const depEntry = this.services.get(dep);
200
- if (depEntry) {
201
- depEntry.dependents.add(name);
202
- }
204
+ const depEntry = this.#getServiceEntry(dep);
205
+ depEntry.dependents.add(name);
203
206
  });
204
207
 
205
208
  this.services.set(name, entry);
@@ -219,11 +222,8 @@ export class ServiceManager extends EventEmitter {
219
222
  * Service instance or null if not found
220
223
  */
221
224
  get(name) {
222
- const entry = this.services.get(name);
223
- if (!entry) {
224
- this.logger.warn(`Service '${name}' not found`);
225
- return null;
226
- }
225
+ // @throws service not found
226
+ const entry = this.#getServiceEntry(name);
227
227
 
228
228
  if (!entry.instance) {
229
229
  try {
@@ -240,7 +240,10 @@ export class ServiceManager extends EventEmitter {
240
240
 
241
241
  this.logger.debug(`Created instance for '${name}'`);
242
242
  } catch (error) {
243
- this.logger.error(`Failed to create instance for '${name}'`, error);
243
+ this.logger.error(
244
+ `Failed to create instance for '${name}'`,
245
+ /** @type {Error} */ (error)
246
+ );
244
247
  return null;
245
248
  }
246
249
  }
@@ -259,7 +262,8 @@ export class ServiceManager extends EventEmitter {
259
262
  const instance = this.get(name);
260
263
  if (!instance) return false;
261
264
 
262
- const entry = this.services.get(name);
265
+ const entry = this.#getServiceEntry(name);
266
+
263
267
  const config = await this.#resolveServiceConfig(name, entry);
264
268
 
265
269
  return await instance.configure(config);
@@ -273,7 +277,7 @@ export class ServiceManager extends EventEmitter {
273
277
  * @returns {Promise<boolean>} True if service started successfully
274
278
  */
275
279
  async startService(name) {
276
- const entry = this.services.get(name);
280
+ const entry = this.#getServiceEntry(name);
277
281
  if (!entry) {
278
282
  this.logger.warn(`Cannot start unregistered service '${name}'`);
279
283
  return false;
@@ -324,13 +328,15 @@ export class ServiceManager extends EventEmitter {
324
328
  */
325
329
  async stopService(name, options = {}) {
326
330
  const instance = this.get(name);
331
+
327
332
  if (!instance) {
328
333
  this.logger.warn(`Cannot stop unregistered service '${name}'`);
329
334
  return true; // Already stopped
330
335
  }
331
336
 
332
337
  // Check dependents
333
- const entry = this.services.get(name);
338
+ const entry = this.#getServiceEntry(name);
339
+
334
340
  if (!options.force && entry && entry.dependents.size > 0) {
335
341
  const runningDependents = [];
336
342
  for (const dep of entry.dependents) {
@@ -489,7 +495,7 @@ export class ServiceManager extends EventEmitter {
489
495
  /**
490
496
  * Listen to log messages emitted by individual services
491
497
  *
492
- * @param {Function} listener - Log event handler
498
+ * @param {(logEvent: LogEvent) => void} listener - Log event handler
493
499
  *
494
500
  * @returns {Function} Unsubscribe function
495
501
  */
@@ -528,7 +534,9 @@ export class ServiceManager extends EventEmitter {
528
534
  } else {
529
535
  // Single service name
530
536
  if (!level) {
531
- throw new Error(`Level parameter required for service '${nameOrConfig}'`);
537
+ throw new Error(
538
+ `Level parameter required for service '${nameOrConfig}'`
539
+ );
532
540
  }
533
541
  serviceLevels[nameOrConfig] = level;
534
542
  }
@@ -579,27 +587,45 @@ export class ServiceManager extends EventEmitter {
579
587
  */
580
588
  _attachServiceEvents(name, instance) {
581
589
  // Forward service events
582
- instance.on('stateChanged', (data) => {
590
+ instance.on('stateChanged', (/** @type {StateChangeEvent} */ data) => {
583
591
  this.emit('service:stateChanged', { service: name, data });
584
592
  });
585
593
 
586
- instance.on('healthChanged', (data) => {
594
+ instance.on('healthChanged', (/** @type {HealthChangeEvent} */ data) => {
587
595
  this.emit('service:healthChanged', { service: name, data });
588
596
  });
589
597
 
590
- instance.on('error', (data) => {
598
+ instance.on('error', (/** @type {ServiceErrorEvent} */ data) => {
591
599
  this.emit('service:error', { service: name, data });
592
600
  });
593
601
 
594
602
  // Forward log events
595
-
596
- instance.logger.on('log', (logEvent) => {
603
+ instance.logger.on('log', (/** @type {LogEvent} */ logEvent) => {
597
604
  this.emit('service:log', logEvent);
598
605
  });
599
606
  }
600
607
 
601
608
  // Internal methods
602
609
 
610
+ /**
611
+ * Get internal service registration entry by name
612
+ *
613
+ * @param {string} name
614
+ *
615
+ * @throws {Error} service not registered
616
+ *
617
+ * @returns {ServiceEntry}
618
+ */
619
+ #getServiceEntry(name) {
620
+ const entry = this.services.get(name);
621
+
622
+ if (!entry) {
623
+ throw new Error(`Service [${name}] has not been registered`);
624
+ }
625
+
626
+ return entry;
627
+ }
628
+
603
629
  /**
604
630
  * Resolve service configuration using plugins
605
631
  *
@@ -633,23 +659,6 @@ export class ServiceManager extends EventEmitter {
633
659
  }
634
660
  }
635
661
 
636
- /**
637
- * Setup logging configuration based on config.debug
638
- */
639
- #setupLogging() {
640
- // Set default level for services based on debug flag if not explicitly set
641
- if (!this.config.defaultLogLevel) {
642
- this.config.defaultLogLevel = this.config.debug ? DEBUG : INFO;
643
- }
644
-
645
- // Set manager log level (use defaultLogLevel as fallback)
646
- const managerLevel = this.config.managerLogLevel ||
647
- this.config.defaultLogLevel;
648
- if (managerLevel) {
649
- this.logger.setLevel(managerLevel);
650
- }
651
- }
652
-
653
662
  /**
654
663
  * Get the appropriate log level for a service
655
664
  *
@@ -688,7 +697,10 @@ export class ServiceManager extends EventEmitter {
688
697
  const success = await this.stopService(name, options);
689
698
  results.set(name, success);
690
699
  } catch (error) {
691
- this.logger.error(`Error stopping '${name}'`, error);
700
+ this.logger.error(
701
+ `Error stopping '${name}'`,
702
+ /** @type {Error} */ (error)
703
+ );
692
704
  results.set(name, false);
693
705
  }
694
706
  }
@@ -697,15 +709,18 @@ export class ServiceManager extends EventEmitter {
697
709
  /**
698
710
  * Sort services by dependencies using topological sort
699
711
  *
700
- * @returns {string[]} Service names in dependency order
701
712
  * @throws {Error} If circular dependencies are detected
713
+ *
714
+ * @returns {string[]} Service names in dependency order
702
715
  */
703
716
  #topologicalSort() {
717
+ /** @type {string[]}*/
704
718
  const sorted = [];
719
+
705
720
  const visited = new Set();
706
721
  const visiting = new Set();
707
722
 
708
- const visit = (name) => {
723
+ const visit = (/** @type {string} */ name) => {
709
724
  if (visited.has(name)) return;
710
725
  if (visiting.has(name)) {
711
726
  throw new Error(`Circular dependency detected involving '${name}'`);
@@ -713,11 +728,10 @@ export class ServiceManager extends EventEmitter {
713
728
 
714
729
  visiting.add(name);
715
730
 
716
- const entry = this.services.get(name);
717
- if (entry) {
718
- for (const dep of entry.dependencies) {
719
- visit(dep);
720
- }
731
+ const entry = this.#getServiceEntry(name);
732
+
733
+ for (const dep of entry.dependencies) {
734
+ visit(dep);
721
735
  }
722
736
 
723
737
  visiting.delete(name);
@@ -11,15 +11,15 @@ export type ServiceRegistrationOptions = {
11
11
  /**
12
12
  * - Services this service depends on
13
13
  */
14
- dependencies?: string[];
14
+ dependencies?: string[] | undefined;
15
15
  /**
16
16
  * - Tags for grouping services
17
17
  */
18
- tags?: string[];
18
+ tags?: string[] | undefined;
19
19
  /**
20
20
  * - Higher starts first
21
21
  */
22
- startupPriority?: number;
22
+ startupPriority?: number | undefined;
23
23
  };
24
24
  /**
25
25
  * Configuration for ServiceManager
@@ -28,23 +28,23 @@ export type ServiceManagerConfig = {
28
28
  /**
29
29
  * - Debug mode switch
30
30
  */
31
- debug?: boolean;
31
+ debug?: boolean | undefined;
32
32
  /**
33
33
  * - Auto-start services on registration
34
34
  */
35
- autoStart?: boolean;
35
+ autoStart?: boolean | undefined;
36
36
  /**
37
37
  * - Default timeout for stopping services
38
38
  */
39
- stopTimeout?: number;
39
+ stopTimeout?: number | undefined;
40
40
  /**
41
41
  * - Default log level for new services
42
42
  */
43
- defaultLogLevel?: string;
43
+ defaultLogLevel?: string | undefined;
44
44
  /**
45
45
  * - Initial log level for ServiceManager
46
46
  */
47
- managerLogLevel?: string;
47
+ managerLogLevel?: string | undefined;
48
48
  /**
49
49
  * Per-service log levels:
50
50
  * - String: "auth:debug,database:info"
@@ -52,7 +52,7 @@ export type ServiceManagerConfig = {
52
52
  */
53
53
  serviceLogLevels?: string | {
54
54
  [x: string]: string;
55
- };
55
+ } | undefined;
56
56
  };
57
57
  /**
58
58
  * Result of health check for all services
@@ -87,10 +87,11 @@ export type ServiceManagerPlugin = {
87
87
  /**
88
88
  * - Optional config resolution method
89
89
  */
90
- resolveServiceConfig?: (arg0: string, arg1: ServiceEntry, arg2: any) => Promise<any | undefined>;
90
+ resolveServiceConfig?: ((arg0: string, arg1: ServiceEntry, arg2: any) => Promise<any | undefined>) | undefined;
91
91
  };
92
92
  /**
93
- * Internal service registry entry
93
+ * Internal service registry entry, an internal registry entry that the
94
+ * ServiceManager uses to track each registered service.
94
95
  */
95
96
  export type ServiceEntry = {
96
97
  /**
@@ -87,7 +87,8 @@
87
87
  // ============================================================================
88
88
 
89
89
  /**
90
- * Internal service registry entry
90
+ * Internal service registry entry, an internal registry entry that the
91
+ * ServiceManager uses to track each registered service.
91
92
  *
92
93
  * @typedef {Object} ServiceEntry
93
94
  * @property {ServiceConstructor} ServiceClass - Service class constructor
@@ -45,7 +45,7 @@ export default class FiniteStateMachine extends EventEmitter {
45
45
  * @param {string} event
46
46
  * @param {any[]} args
47
47
  */
48
- debounce(wait: number, event: string, ...args: any[]): Promise<any>;
48
+ debounce(wait: number | undefined, event: string, ...args: any[]): Promise<any>;
49
49
  /** The current state. */
50
50
  get current(): any;
51
51
  #private;
@@ -6,10 +6,10 @@
6
6
  * Event emitted when entering a state
7
7
  * @type {string}
8
8
  */
9
- export const ENTER = 'enter';
9
+ export const ENTER = '_enter';
10
10
 
11
11
  /**
12
12
  * Event emitted when exiting a state
13
13
  * @type {string}
14
14
  */
15
- export const EXIT = 'exit';
15
+ export const EXIT = '_exit';
@@ -4,7 +4,7 @@
4
4
  export default class LoadingStateMachine extends FiniteStateMachine {
5
5
  constructor();
6
6
  /** The last error */
7
- get error(): Error;
7
+ get error(): Error | null;
8
8
  /**
9
9
  * Transition to timeout state
10
10
  * - Only valid when currently loading
@@ -21,7 +21,7 @@ export namespace metaThemeColorBase {
21
21
  function get(): void;
22
22
  }
23
23
  export namespace metaThemeColorDark {
24
- let subscribe_1: (this: void, run: import("svelte/store").Subscriber<string>, invalidate?: () => void) => import("svelte/store").Unsubscriber;
24
+ let subscribe_1: (this: void, run: import("svelte/store").Subscriber<string | null>, invalidate?: () => void) => import("svelte/store").Unsubscriber;
25
25
  export { subscribe_1 as subscribe };
26
26
  export function get_1(): void;
27
27
  export { get_1 as get };
@@ -3,17 +3,17 @@ type ButtonGroup = {
3
3
  $on?(type: string, callback: (e: any) => void): () => void;
4
4
  $set?(props: Partial<{
5
5
  [attr: string]: any;
6
- base?: string;
7
- bg?: string;
8
- classes?: string;
6
+ base?: string | undefined;
7
+ bg?: string | undefined;
8
+ classes?: string | undefined;
9
9
  buttons: ButtonDef[];
10
- selected?: ButtonDef;
11
- select?: (label: string) => void;
10
+ selected?: ButtonDef | null | undefined;
11
+ select?: ((label: string) => void) | undefined;
12
12
  buttonSnippet: Snippet<[{
13
13
  text: string;
14
14
  value: string;
15
15
  label: string;
16
- props: any;
16
+ props: Object;
17
17
  }]>;
18
18
  }>): void;
19
19
  };
@@ -29,6 +29,6 @@ declare const ButtonGroup: import("svelte").Component<{
29
29
  text: string;
30
30
  value: string;
31
31
  label: string;
32
- props: any;
32
+ props: Object;
33
33
  }]>;
34
34
  }, {}, "select" | "selected">;
@@ -3,5 +3,5 @@ export type ButtonDef = {
3
3
  value?: any;
4
4
  label?: string;
5
5
  hide?: boolean;
6
- props?: any;
6
+ props?: Object;
7
7
  };
@@ -2,11 +2,11 @@ export default CompareLeftRight;
2
2
  type CompareLeftRight = {
3
3
  $on?(type: string, callback: (e: any) => void): () => void;
4
4
  $set?(props: Partial<{
5
- leftContent?: Snippet<[]>;
6
- rightContent?: Snippet<[]>;
7
- classes?: string;
8
- dividerColor?: string;
9
- handleColor?: string;
5
+ leftContent?: Snippet<[]> | undefined;
6
+ rightContent?: Snippet<[]> | undefined;
7
+ classes?: string | undefined;
8
+ dividerColor?: string | undefined;
9
+ handleColor?: string | undefined;
10
10
  } & Record<string, any>>): void;
11
11
  };
12
12
  declare const CompareLeftRight: import("svelte").Component<{
@@ -8,7 +8,7 @@ export class DragController {
8
8
  */
9
9
  constructor(event: DragEvent);
10
10
  event: DragEvent;
11
- dataTransfer: DataTransfer;
11
+ dataTransfer: DataTransfer | null;
12
12
  targetElement: HTMLElement;
13
13
  offsetX: number;
14
14
  offsetY: number;