@hkdigital/lib-core 0.3.9 → 0.3.11

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 (428) hide show
  1. package/README.md +149 -149
  2. package/dist/assets/autospuiten/car-paint-picker.d.ts +7 -7
  3. package/dist/assets/autospuiten/car-paint-picker.js +41 -41
  4. package/dist/assets/autospuiten/labels.js +7 -7
  5. package/dist/classes/data/IterableTree.d.ts +15 -24
  6. package/dist/classes/data/IterableTree.js +242 -243
  7. package/dist/classes/data/Selector.js +190 -190
  8. package/dist/classes/data/index.js +2 -2
  9. package/dist/classes/data/typedef.d.ts +8 -0
  10. package/dist/classes/data/typedef.js +9 -0
  11. package/dist/classes/event-emitter/EventEmitter.js +273 -275
  12. package/dist/classes/event-emitter/index.js +2 -2
  13. package/dist/classes/index.js +4 -4
  14. package/dist/classes/promise/HkPromise.d.ts +18 -17
  15. package/dist/classes/promise/HkPromise.js +384 -377
  16. package/dist/classes/promise/index.js +1 -1
  17. package/dist/classes/stores/SubscribersCount.js +107 -107
  18. package/dist/classes/stores/index.js +1 -1
  19. package/dist/classes/streams/LogTransformStream.js +19 -19
  20. package/dist/classes/streams/ServerEventsStore.d.ts +2 -3
  21. package/dist/classes/streams/ServerEventsStore.js +111 -110
  22. package/dist/classes/streams/TimeStampSource.js +26 -26
  23. package/dist/classes/streams/index.js +3 -3
  24. package/dist/classes/svelte/finite-state-machine/FiniteStateMachine.svelte.js +133 -133
  25. package/dist/classes/svelte/finite-state-machine/index.js +1 -1
  26. package/dist/classes/svelte/index.d.ts +0 -8
  27. package/dist/classes/svelte/index.js +11 -14
  28. package/dist/classes/svelte/loading-state-machine/LoadingStateMachine.svelte.js +109 -109
  29. package/dist/classes/svelte/loading-state-machine/constants.js +16 -16
  30. package/dist/classes/svelte/loading-state-machine/index.js +3 -3
  31. package/dist/config/README.md +196 -0
  32. package/dist/config/{imagetools-config.js → generators/imagetools.js} +189 -189
  33. package/dist/config/generators/vite.d.ts +47 -0
  34. package/dist/config/generators/vite.js +142 -0
  35. package/dist/config/imagetools.d.ts +72 -72
  36. package/dist/config/vite.d.ts +1 -0
  37. package/dist/config/vite.js +5 -0
  38. package/dist/constants/bases/index.js +13 -13
  39. package/dist/constants/http/headers.js +6 -6
  40. package/dist/constants/http/index.js +2 -2
  41. package/dist/constants/http/methods.js +14 -14
  42. package/dist/constants/index.js +6 -6
  43. package/dist/constants/mime/application.js +5 -5
  44. package/dist/constants/mime/audio.js +13 -13
  45. package/dist/constants/mime/image.js +3 -3
  46. package/dist/constants/mime/index.js +4 -4
  47. package/dist/constants/mime/text.js +2 -2
  48. package/dist/constants/regexp/README.md +95 -0
  49. package/dist/constants/regexp/index.d.ts +1 -1
  50. package/dist/constants/regexp/index.js +31 -31
  51. package/dist/constants/regexp/inspiratie.js__ +95 -95
  52. package/dist/constants/regexp/text.d.ts +3 -3
  53. package/dist/constants/regexp/text.js +49 -49
  54. package/dist/constants/regexp/url.d.ts +1 -0
  55. package/dist/constants/regexp/url.js +3 -0
  56. package/dist/constants/regexp/user.d.ts +0 -1
  57. package/dist/constants/regexp/user.js +29 -33
  58. package/dist/constants/states/drag.js +6 -6
  59. package/dist/constants/states/drop.js +6 -6
  60. package/dist/constants/states/index.js +4 -4
  61. package/dist/constants/states/input.js +11 -11
  62. package/dist/constants/states/submit.js +4 -4
  63. package/dist/constants/time/index.js +28 -28
  64. package/dist/css/utilities.css +43 -43
  65. package/dist/design/README.md +405 -0
  66. package/dist/design/{design-config.js → config/design-config.js} +73 -73
  67. package/dist/{util/design-system/tailwind.js → design/generators/index.js} +288 -288
  68. package/dist/design/index.d.ts +8 -0
  69. package/dist/design/index.js +97 -0
  70. package/dist/{util/design-system → design/plugins}/skeleton.js +208 -208
  71. package/dist/design/tailwind-theme-extend.js +158 -158
  72. package/dist/design/themes/README.md +103 -0
  73. package/dist/{themes → design/themes}/hkdev/components/blocks/text-block.css +34 -34
  74. package/dist/{themes → design/themes}/hkdev/components/boxes/game-box.css +11 -11
  75. package/dist/{themes → design/themes}/hkdev/components/buttons/button-icon-steeze.css +22 -22
  76. package/dist/{themes → design/themes}/hkdev/components/buttons/button-text.css +32 -32
  77. package/dist/{themes → design/themes}/hkdev/components/buttons/button.css +146 -146
  78. package/dist/{themes → design/themes}/hkdev/components/buttons/skip-button.css +5 -5
  79. package/dist/{themes → design/themes}/hkdev/components/drag-drop/draggable.css +73 -73
  80. package/dist/{themes → design/themes}/hkdev/components/drag-drop/drop-zone.css +58 -58
  81. package/dist/{themes → design/themes}/hkdev/components/icons/icon-steeze.css +15 -15
  82. package/dist/{themes → design/themes}/hkdev/components/inputs/text-input.css +102 -102
  83. package/dist/{themes → design/themes}/hkdev/components/panels/panel.css +25 -25
  84. package/dist/{themes → design/themes}/hkdev/components/rows/panel-grid-row.css +4 -4
  85. package/dist/{themes → design/themes}/hkdev/components/rows/panel-row-2.css +5 -5
  86. package/dist/{themes → design/themes}/hkdev/components.css +29 -29
  87. package/dist/design/themes/hkdev/debug.css +2 -0
  88. package/dist/{themes → design/themes}/hkdev/global/layout.css +32 -32
  89. package/dist/{themes → design/themes}/hkdev/global/on-colors.css +32 -32
  90. package/dist/{themes → design/themes}/hkdev/globals.css +3 -3
  91. package/dist/{themes → design/themes}/hkdev/responsive.css +12 -12
  92. package/dist/{themes → design/themes}/hkdev/theme-ext.js +12 -12
  93. package/dist/{themes → design/themes}/hkdev/theme.css +218 -218
  94. package/dist/{util/design-system/css → design/utils}/clamp.js +66 -66
  95. package/dist/{util/design-system/css/root-design-vars.d.ts → design/utils/root-vars.d.ts} +2 -2
  96. package/dist/{util/design-system/css/root-design-vars.js → design/utils/root-vars.js} +102 -102
  97. package/dist/{util/design-system/layout → design/utils}/scaling.js +228 -228
  98. package/dist/{util/design-system/components → design/utils}/states.js +22 -22
  99. package/dist/errors/api.js +9 -9
  100. package/dist/errors/generic.js +20 -20
  101. package/dist/errors/http.js +16 -16
  102. package/dist/errors/index.d.ts +1 -0
  103. package/dist/errors/index.js +5 -4
  104. package/dist/errors/jwt.js +5 -5
  105. package/dist/errors/promise.d.ts +27 -0
  106. package/dist/errors/promise.js +26 -0
  107. package/dist/logging/index.js +7 -7
  108. package/dist/logging/internal/adapters/console.js +114 -114
  109. package/dist/logging/internal/adapters/index.js +2 -2
  110. package/dist/logging/internal/adapters/pino.d.ts +1 -0
  111. package/dist/logging/internal/adapters/pino.js +142 -115
  112. package/dist/logging/internal/adapters/typedef.d.ts +24 -0
  113. package/dist/logging/internal/adapters/typedef.js +10 -0
  114. package/dist/logging/internal/factories/client.js +21 -21
  115. package/dist/logging/internal/factories/server.js +22 -22
  116. package/dist/logging/internal/factories/universal.js +22 -22
  117. package/dist/logging/internal/unified-logger/Logger.js +217 -217
  118. package/dist/logging/internal/unified-logger/constants.js +22 -22
  119. package/dist/logging/internal/unified-logger/index.js +6 -6
  120. package/dist/logging/internal/unified-logger/typedef.js +17 -17
  121. package/dist/network/README.md +173 -0
  122. package/dist/{classes → network}/cache/IndexedDbCache.js +1407 -1407
  123. package/dist/{classes → network}/cache/MemoryResponseCache.js +138 -138
  124. package/dist/{classes → network}/cache/index.js +5 -5
  125. package/dist/{classes → network}/cache/typedef.js +41 -41
  126. package/dist/network/cache.d.ts +3 -0
  127. package/dist/network/cache.js +4 -0
  128. package/dist/{util → network}/http/caching.js +261 -263
  129. package/dist/{util → network}/http/errors.js +97 -97
  130. package/dist/{util → network}/http/headers.js +75 -75
  131. package/dist/{util → network}/http/http-request.js +578 -578
  132. package/dist/{util → network}/http/index.js +22 -22
  133. package/dist/{util → network}/http/json-request.js +224 -224
  134. package/dist/{util → network}/http/mocks.js +65 -65
  135. package/dist/{util → network}/http/response.js +318 -318
  136. package/dist/{util → network}/http/typedef.js +93 -93
  137. package/dist/{util → network}/http/url.js +52 -52
  138. package/dist/network/http.d.ts +6 -0
  139. package/dist/network/http.js +6 -0
  140. package/dist/network/loaders/README.md +255 -0
  141. package/dist/{classes/svelte → network/loaders}/audio/AudioLoader.svelte.d.ts +1 -1
  142. package/dist/{classes/svelte → network/loaders}/audio/AudioLoader.svelte.js +58 -58
  143. package/dist/{classes/svelte → network/loaders}/audio/AudioScene.svelte.js +324 -324
  144. package/dist/{classes/svelte → network/loaders}/audio/mocks.js +35 -35
  145. package/dist/network/loaders/audio.d.ts +2 -0
  146. package/dist/network/loaders/audio.js +2 -0
  147. package/dist/{classes/svelte → network/loaders}/image/ImageLoader.svelte.d.ts +3 -6
  148. package/dist/{classes/svelte → network/loaders}/image/ImageLoader.svelte.js +44 -45
  149. package/dist/{classes/svelte → network/loaders}/image/ImageScene.svelte.d.ts +5 -7
  150. package/dist/{classes/svelte → network/loaders}/image/ImageScene.svelte.js +248 -249
  151. package/dist/{classes/svelte → network/loaders}/image/ImageVariantsLoader.svelte.d.ts +4 -4
  152. package/dist/{classes/svelte → network/loaders}/image/ImageVariantsLoader.svelte.js +150 -152
  153. package/dist/{classes/svelte → network/loaders}/image/index.js +4 -4
  154. package/dist/{classes/svelte → network/loaders}/image/mocks.js +35 -35
  155. package/dist/{classes/svelte → network/loaders}/image/typedef.js +8 -8
  156. package/dist/{util/image → network/loaders/image/utils}/index.d.ts +2 -2
  157. package/dist/{util/image → network/loaders/image/utils}/index.js +86 -86
  158. package/dist/network/loaders/image.d.ts +5 -0
  159. package/dist/network/loaders/image.js +8 -0
  160. package/dist/{typedef/image.js → network/loaders/typedef.js} +38 -38
  161. package/dist/network/loaders.d.ts +2 -0
  162. package/dist/network/loaders.js +2 -0
  163. package/dist/{classes/svelte/network-loader → network/states}/NetworkLoader.svelte.d.ts +1 -1
  164. package/dist/{classes/svelte/network-loader → network/states}/NetworkLoader.svelte.js +338 -338
  165. package/dist/{classes/svelte/network-loader → network/states}/constants.js +3 -3
  166. package/dist/{classes/svelte/network-loader → network/states}/index.js +3 -3
  167. package/dist/{classes/svelte/network-loader → network/states}/mocks.js +30 -30
  168. package/dist/{classes/svelte/network-loader → network/states}/typedef.js +8 -8
  169. package/dist/network/typedef.d.ts +4 -0
  170. package/dist/network/typedef.js +10 -0
  171. package/dist/services/index.js +1 -1
  172. package/dist/services/internal/index.js +8 -8
  173. package/dist/services/internal/service-base/ServiceBase.js +462 -462
  174. package/dist/services/internal/service-base/constants.js +110 -110
  175. package/dist/services/internal/service-base/index.js +3 -3
  176. package/dist/services/internal/service-base/typedef.js +101 -101
  177. package/dist/services/internal/service-manager/ServiceManager.d.ts +2 -35
  178. package/dist/services/internal/service-manager/ServiceManager.js +608 -614
  179. package/dist/services/internal/service-manager/constants.js +6 -6
  180. package/dist/services/internal/service-manager/typedef.js +90 -90
  181. package/dist/states/index.js +1 -1
  182. package/dist/states/navigation.svelte.js +55 -55
  183. package/dist/stores/index.js +1 -1
  184. package/dist/stores/theme.js +80 -80
  185. package/dist/typedef/context.js +6 -6
  186. package/dist/typedef/drag.js +25 -25
  187. package/dist/typedef/drop.js +12 -12
  188. package/dist/typedef/index.d.ts +0 -1
  189. package/dist/typedef/index.js +4 -4
  190. package/dist/{components → ui/components}/button-group/ButtonGroup.svelte +82 -82
  191. package/dist/{components → ui/components}/button-group/typedef.js +10 -10
  192. package/dist/{components → ui/components}/compare-left-right/CompareLeftRight.svelte +179 -179
  193. package/dist/{components → ui/components}/compare-left-right/index.js +1 -1
  194. package/dist/{components → ui/components}/game-box/GameBox.svelte +577 -577
  195. package/dist/{components → ui/components}/game-box/gamebox.util.js +83 -83
  196. package/dist/ui/components/hk-app-layout/HkAppLayout.state.svelte.d.ts +6 -0
  197. package/dist/{components → ui/components}/hk-app-layout/HkAppLayout.state.svelte.js +25 -25
  198. package/dist/{components → ui/components}/hk-app-layout/HkAppLayout.svelte +251 -251
  199. package/dist/{components → ui/components}/image-box/ImageBox.svelte +210 -210
  200. package/dist/{components → ui/components}/image-box/ImageBox.svelte.d.ts +6 -6
  201. package/dist/ui/components/image-box/index.js +5 -0
  202. package/dist/{components → ui/components}/image-box/typedef.js +32 -32
  203. package/dist/{components → ui/components}/index.js +23 -23
  204. package/dist/{components → ui/components}/presenter/ImageSlide.svelte +64 -64
  205. package/dist/{components → ui/components}/presenter/ImageSlide.svelte.d.ts +2 -2
  206. package/dist/{components → ui/components}/presenter/Presenter.state.svelte.d.ts +1 -1
  207. package/dist/{components → ui/components}/presenter/Presenter.state.svelte.js +638 -638
  208. package/dist/{components → ui/components}/presenter/Presenter.svelte +142 -142
  209. package/dist/{components → ui/components}/presenter/constants.js +7 -7
  210. package/dist/{components → ui/components}/presenter/index.js +10 -10
  211. package/dist/{components → ui/components}/presenter/typedef.js +106 -106
  212. package/dist/{components → ui/components}/presenter/util.js +210 -210
  213. package/dist/{components → ui/components}/virtual-viewport/VirtualViewport.svelte +196 -196
  214. package/dist/{primitives → ui/primitives}/area/HkArea.svelte +49 -49
  215. package/dist/{primitives → ui/primitives}/area/HkGridArea.svelte +77 -77
  216. package/dist/{primitives → ui/primitives}/area/index.js +2 -2
  217. package/dist/{primitives → ui/primitives}/buttons/button/Button.svelte +82 -82
  218. package/dist/{primitives → ui/primitives}/buttons/button/Button.svelte.d.ts +1 -1
  219. package/dist/{primitives → ui/primitives}/buttons/button-icon-steeze/SteezeIconButton.svelte +30 -30
  220. package/dist/{primitives → ui/primitives}/buttons/button-text/TextButton.svelte +21 -21
  221. package/dist/{primitives → ui/primitives}/buttons/index.js +3 -3
  222. package/dist/{primitives → ui/primitives}/debug/debug-panel-design-scaling/DebugPanelDesignScaling.svelte +146 -146
  223. package/dist/{primitives → ui/primitives}/debug/index.js +1 -1
  224. package/dist/{primitives → ui/primitives}/drag-drop/DragController.js +44 -44
  225. package/dist/{primitives → ui/primitives}/drag-drop/DragDropContext.svelte +111 -111
  226. package/dist/{primitives → ui/primitives}/drag-drop/DragDropContext.svelte.d.ts +1 -1
  227. package/dist/{primitives → ui/primitives}/drag-drop/Draggable.svelte +519 -519
  228. package/dist/{primitives → ui/primitives}/drag-drop/Draggable.svelte.d.ts +1 -1
  229. package/dist/{primitives → ui/primitives}/drag-drop/DropZone.svelte +258 -258
  230. package/dist/{primitives → ui/primitives}/drag-drop/DropZone.svelte.d.ts +3 -3
  231. package/dist/{primitives → ui/primitives}/drag-drop/DropZoneArea.svelte +119 -119
  232. package/dist/{primitives → ui/primitives}/drag-drop/DropZoneArea.svelte.d.ts +3 -3
  233. package/dist/{primitives → ui/primitives}/drag-drop/DropZoneList.svelte +125 -125
  234. package/dist/{primitives → ui/primitives}/drag-drop/DropZoneList.svelte.d.ts +3 -3
  235. package/dist/{primitives → ui/primitives}/drag-drop/actions.js +26 -26
  236. package/dist/{primitives → ui/primitives}/drag-drop/drag-state.svelte.d.ts +11 -11
  237. package/dist/{primitives → ui/primitives}/drag-drop/drag-state.svelte.js +322 -322
  238. package/dist/{primitives → ui/primitives}/drag-drop/index.js +7 -7
  239. package/dist/{primitives → ui/primitives}/drag-drop/util.js +85 -85
  240. package/dist/{primitives → ui/primitives}/hkdev/blocks/TextBlock.svelte +46 -46
  241. package/dist/{primitives → ui/primitives}/hkdev/buttons/CheckButton.svelte +62 -62
  242. package/dist/{primitives → ui/primitives}/icons/HkIcon.svelte +86 -86
  243. package/dist/{primitives → ui/primitives}/icons/HkTabIcon.svelte +116 -116
  244. package/dist/{primitives → ui/primitives}/icons/SteezeIcon.svelte +97 -97
  245. package/dist/{primitives → ui/primitives}/icons/index.js +6 -6
  246. package/dist/{primitives → ui/primitives}/icons/typedef.js +16 -16
  247. package/dist/{primitives → ui/primitives}/index.js +2 -2
  248. package/dist/{primitives → ui/primitives}/inputs/index.js +1 -1
  249. package/dist/{primitives → ui/primitives}/inputs/text-input/TextInput.svelte +223 -223
  250. package/dist/{primitives → ui/primitives}/inputs/text-input/assets/IconInvalid.svelte +14 -14
  251. package/dist/{primitives → ui/primitives}/inputs/text-input/assets/IconValid.svelte +12 -12
  252. package/dist/{primitives → ui/primitives}/layout/grid-layers/GridLayers.svelte +63 -63
  253. package/dist/{primitives → ui/primitives}/layout/grid-layers/util.js +74 -74
  254. package/dist/{primitives → ui/primitives}/layout/index.js +1 -1
  255. package/dist/{primitives → ui/primitives}/panels/index.js +1 -1
  256. package/dist/{primitives → ui/primitives}/panels/panel/Panel.svelte +43 -43
  257. package/dist/{primitives → ui/primitives}/rows/index.js +3 -3
  258. package/dist/{primitives → ui/primitives}/rows/panel-grid-row/PanelGridRow.svelte +104 -104
  259. package/dist/{primitives → ui/primitives}/rows/panel-row-2/PanelRow2.svelte +40 -40
  260. package/dist/{primitives → ui/primitives}/tab-bar/HkTabBar.state.svelte.d.ts +3 -3
  261. package/dist/{primitives → ui/primitives}/tab-bar/HkTabBar.state.svelte.js +149 -149
  262. package/dist/{primitives → ui/primitives}/tab-bar/HkTabBar.svelte +74 -74
  263. package/dist/{primitives → ui/primitives}/tab-bar/HkTabBarSelector.state.svelte.d.ts +3 -3
  264. package/dist/{primitives → ui/primitives}/tab-bar/HkTabBarSelector.state.svelte.js +93 -93
  265. package/dist/{primitives → ui/primitives}/tab-bar/HkTabBarSelector.svelte +49 -49
  266. package/dist/{primitives → ui/primitives}/tab-bar/index.js +17 -17
  267. package/dist/{primitives → ui/primitives}/tab-bar/typedef.js +11 -11
  268. package/dist/util/array/index.js +436 -436
  269. package/dist/util/bases/base58.js +262 -262
  270. package/dist/util/bases/index.js +1 -1
  271. package/dist/util/compare/index.js +247 -247
  272. package/dist/util/css/css-vars.js +83 -83
  273. package/dist/util/css/index.js +1 -1
  274. package/dist/util/env/index.js +9 -9
  275. package/dist/util/exceptions/index.js +23 -23
  276. package/dist/util/expect/arrays.js +47 -47
  277. package/dist/util/expect/index.js +259 -259
  278. package/dist/util/expect/primitives.js +55 -55
  279. package/dist/util/expect/url.d.ts +6 -6
  280. package/dist/util/expect/url.js +60 -60
  281. package/dist/util/function/index.js +218 -218
  282. package/dist/util/geo/index.js +26 -26
  283. package/dist/util/index.d.ts +3 -1
  284. package/dist/util/index.js +7 -3
  285. package/dist/util/is/index.d.ts +15 -14
  286. package/dist/util/is/index.js +147 -140
  287. package/dist/util/iterate/index.d.ts +37 -69
  288. package/dist/util/iterate/index.js +204 -234
  289. package/dist/util/object/index.d.ts +38 -57
  290. package/dist/util/object/index.js +1345 -1361
  291. package/dist/util/singleton/index.js +97 -97
  292. package/dist/util/string/array-path.js +75 -75
  293. package/dist/util/string/convert.js +54 -54
  294. package/dist/util/string/fs.js +226 -226
  295. package/dist/util/string/index.js +5 -5
  296. package/dist/util/string/interpolate.js +61 -61
  297. package/dist/util/string/pad.js +10 -10
  298. package/dist/util/svelte/index.js +4 -4
  299. package/dist/util/svelte/loading/loading-tracker.svelte.js +108 -108
  300. package/dist/util/svelte/observe/index.js +49 -49
  301. package/dist/util/svelte/state-context/index.js +117 -117
  302. package/dist/util/svelte/wait/index.js +38 -38
  303. package/dist/util/sveltekit/index.js +1 -1
  304. package/dist/util/sveltekit/route-folders/index.js +101 -101
  305. package/dist/util/time/index.js +328 -323
  306. package/dist/util/unique/index.js +231 -249
  307. package/dist/valibot/README.md +50 -0
  308. package/dist/valibot/index.d.ts +4 -4
  309. package/dist/valibot/index.js +8 -9
  310. package/dist/valibot/{url.d.ts → parsers/url.d.ts} +13 -5
  311. package/dist/valibot/{url.js → parsers/url.js} +111 -95
  312. package/dist/valibot/{user.js → parsers/user.js} +23 -23
  313. package/dist/valibot/parsers.d.ts +2 -0
  314. package/dist/valibot/parsers.js +4 -0
  315. package/package.json +131 -133
  316. package/dist/components/hk-app-layout/HkAppLayout.state.svelte.d.ts +0 -6
  317. package/dist/components/image-box/index.js +0 -5
  318. package/dist/constants/regexp/web.d.ts +0 -1
  319. package/dist/constants/regexp/web.js +0 -3
  320. package/dist/primitives/inputs/text-input/TestTextInput.svelte__ +0 -102
  321. package/dist/primitives/inputs/text-input/TextInput.svelte___ +0 -83
  322. package/dist/primitives/layout/grid-layers/GridLayers.svelte__heightFrom__ +0 -372
  323. package/dist/schemas/index.d.ts +0 -1
  324. package/dist/schemas/index.js +0 -1
  325. package/dist/schemas/validate-url.d.ts +0 -30
  326. package/dist/schemas/validate-url.js +0 -180
  327. package/dist/themes/hkdev/debug.css +0 -2
  328. package/dist/themes/index.d.ts +0 -1
  329. package/dist/themes/index.js +0 -1
  330. package/dist/util/design-system/index.d.ts +0 -5
  331. package/dist/util/design-system/index.js +0 -5
  332. package/dist/util/http/test-data__/content-length-test-hkdigital-small.V4HfZyBQ.avif +0 -0
  333. package/dist/valibot/date.js__ +0 -10
  334. package/dist/zod/all.d.ts +0 -6
  335. package/dist/zod/all.js +0 -33
  336. package/dist/zod/generic.d.ts +0 -6
  337. package/dist/zod/generic.js +0 -11
  338. package/dist/zod/javascript.d.ts +0 -8
  339. package/dist/zod/javascript.js +0 -32
  340. package/dist/zod/user.d.ts +0 -9
  341. package/dist/zod/user.js +0 -16
  342. package/dist/zod/web.d.ts +0 -21
  343. package/dist/zod/web.js +0 -52
  344. /package/dist/config/{imagetools-config.d.ts → generators/imagetools.d.ts} +0 -0
  345. /package/dist/design/{design-config.d.ts → config/design-config.d.ts} +0 -0
  346. /package/dist/{util/design-system/tailwind.d.ts → design/generators/index.d.ts} +0 -0
  347. /package/dist/{util/design-system → design/plugins}/skeleton.d.ts +0 -0
  348. /package/dist/{themes → design/themes}/hkdev/theme-ext.d.ts +0 -0
  349. /package/dist/{util/design-system/css → design/utils}/clamp.d.ts +0 -0
  350. /package/dist/{util/design-system/layout → design/utils}/scaling.d.ts +0 -0
  351. /package/dist/{util/design-system/components → design/utils}/states.d.ts +0 -0
  352. /package/dist/{classes → network}/cache/IndexedDbCache.d.ts +0 -0
  353. /package/dist/{classes → network}/cache/MemoryResponseCache.d.ts +0 -0
  354. /package/dist/{classes → network}/cache/index.d.ts +0 -0
  355. /package/dist/{classes → network}/cache/typedef.d.ts +0 -0
  356. /package/dist/{util → network}/http/caching.d.ts +0 -0
  357. /package/dist/{util → network}/http/errors.d.ts +0 -0
  358. /package/dist/{util → network}/http/headers.d.ts +0 -0
  359. /package/dist/{util → network}/http/http-request.d.ts +0 -0
  360. /package/dist/{util → network}/http/index.d.ts +0 -0
  361. /package/dist/{util → network}/http/json-request.d.ts +0 -0
  362. /package/dist/{util → network}/http/mocks.d.ts +0 -0
  363. /package/dist/{util → network}/http/response.d.ts +0 -0
  364. /package/dist/{util → network}/http/typedef.d.ts +0 -0
  365. /package/dist/{util → network}/http/url.d.ts +0 -0
  366. /package/dist/{classes/svelte → network/loaders}/audio/AudioScene.svelte.d.ts +0 -0
  367. /package/dist/{classes/svelte → network/loaders}/audio/mocks.d.ts +0 -0
  368. /package/dist/{classes/svelte → network/loaders}/image/index.d.ts +0 -0
  369. /package/dist/{classes/svelte → network/loaders}/image/mocks.d.ts +0 -0
  370. /package/dist/{classes/svelte → network/loaders}/image/typedef.d.ts +0 -0
  371. /package/dist/{typedef/image.d.ts → network/loaders/typedef.d.ts} +0 -0
  372. /package/dist/{classes/svelte/network-loader → network/states}/constants.d.ts +0 -0
  373. /package/dist/{classes/svelte/network-loader → network/states}/index.d.ts +0 -0
  374. /package/dist/{classes/svelte/network-loader → network/states}/mocks.d.ts +0 -0
  375. /package/dist/{classes/svelte/network-loader → network/states}/typedef.d.ts +0 -0
  376. /package/dist/{components → ui/components}/button-group/ButtonGroup.svelte.d.ts +0 -0
  377. /package/dist/{components → ui/components}/button-group/typedef.d.ts +0 -0
  378. /package/dist/{components → ui/components}/compare-left-right/CompareLeftRight.svelte.d.ts +0 -0
  379. /package/dist/{components → ui/components}/compare-left-right/index.d.ts +0 -0
  380. /package/dist/{components → ui/components}/game-box/GameBox.svelte.d.ts +0 -0
  381. /package/dist/{components → ui/components}/game-box/gamebox.util.d.ts +0 -0
  382. /package/dist/{components → ui/components}/hk-app-layout/HkAppLayout.svelte.d.ts +0 -0
  383. /package/dist/{components → ui/components}/image-box/index.d.ts +0 -0
  384. /package/dist/{components → ui/components}/image-box/typedef.d.ts +0 -0
  385. /package/dist/{components → ui/components}/index.d.ts +0 -0
  386. /package/dist/{components → ui/components}/presenter/Presenter.svelte.d.ts +0 -0
  387. /package/dist/{components → ui/components}/presenter/constants.d.ts +0 -0
  388. /package/dist/{components → ui/components}/presenter/index.d.ts +0 -0
  389. /package/dist/{components → ui/components}/presenter/typedef.d.ts +0 -0
  390. /package/dist/{components → ui/components}/presenter/util.d.ts +0 -0
  391. /package/dist/{components → ui/components}/virtual-viewport/VirtualViewport.svelte.d.ts +0 -0
  392. /package/dist/{primitives → ui/primitives}/area/HkArea.svelte.d.ts +0 -0
  393. /package/dist/{primitives → ui/primitives}/area/HkGridArea.svelte.d.ts +0 -0
  394. /package/dist/{primitives → ui/primitives}/area/index.d.ts +0 -0
  395. /package/dist/{primitives → ui/primitives}/buttons/button-icon-steeze/SteezeIconButton.svelte.d.ts +0 -0
  396. /package/dist/{primitives → ui/primitives}/buttons/button-text/TextButton.svelte.d.ts +0 -0
  397. /package/dist/{primitives → ui/primitives}/buttons/index.d.ts +0 -0
  398. /package/dist/{primitives → ui/primitives}/debug/debug-panel-design-scaling/DebugPanelDesignScaling.svelte.d.ts +0 -0
  399. /package/dist/{primitives → ui/primitives}/debug/index.d.ts +0 -0
  400. /package/dist/{primitives → ui/primitives}/drag-drop/DragController.d.ts +0 -0
  401. /package/dist/{primitives → ui/primitives}/drag-drop/actions.d.ts +0 -0
  402. /package/dist/{primitives → ui/primitives}/drag-drop/index.d.ts +0 -0
  403. /package/dist/{primitives → ui/primitives}/drag-drop/util.d.ts +0 -0
  404. /package/dist/{primitives → ui/primitives}/hkdev/blocks/TextBlock.svelte.d.ts +0 -0
  405. /package/dist/{primitives → ui/primitives}/hkdev/buttons/CheckButton.svelte.d.ts +0 -0
  406. /package/dist/{primitives → ui/primitives}/icons/HkIcon.svelte.d.ts +0 -0
  407. /package/dist/{primitives → ui/primitives}/icons/HkTabIcon.svelte.d.ts +0 -0
  408. /package/dist/{primitives → ui/primitives}/icons/SteezeIcon.svelte.d.ts +0 -0
  409. /package/dist/{primitives → ui/primitives}/icons/index.d.ts +0 -0
  410. /package/dist/{primitives → ui/primitives}/icons/typedef.d.ts +0 -0
  411. /package/dist/{primitives → ui/primitives}/index.d.ts +0 -0
  412. /package/dist/{primitives → ui/primitives}/inputs/index.d.ts +0 -0
  413. /package/dist/{primitives → ui/primitives}/inputs/text-input/TextInput.svelte.d.ts +0 -0
  414. /package/dist/{primitives → ui/primitives}/inputs/text-input/assets/IconInvalid.svelte.d.ts +0 -0
  415. /package/dist/{primitives → ui/primitives}/inputs/text-input/assets/IconValid.svelte.d.ts +0 -0
  416. /package/dist/{primitives → ui/primitives}/layout/grid-layers/GridLayers.svelte.d.ts +0 -0
  417. /package/dist/{primitives → ui/primitives}/layout/grid-layers/util.d.ts +0 -0
  418. /package/dist/{primitives → ui/primitives}/layout/index.d.ts +0 -0
  419. /package/dist/{primitives → ui/primitives}/panels/index.d.ts +0 -0
  420. /package/dist/{primitives → ui/primitives}/panels/panel/Panel.svelte.d.ts +0 -0
  421. /package/dist/{primitives → ui/primitives}/rows/index.d.ts +0 -0
  422. /package/dist/{primitives → ui/primitives}/rows/panel-grid-row/PanelGridRow.svelte.d.ts +0 -0
  423. /package/dist/{primitives → ui/primitives}/rows/panel-row-2/PanelRow2.svelte.d.ts +0 -0
  424. /package/dist/{primitives → ui/primitives}/tab-bar/HkTabBar.svelte.d.ts +0 -0
  425. /package/dist/{primitives → ui/primitives}/tab-bar/HkTabBarSelector.svelte.d.ts +0 -0
  426. /package/dist/{primitives → ui/primitives}/tab-bar/index.d.ts +0 -0
  427. /package/dist/{primitives → ui/primitives}/tab-bar/typedef.d.ts +0 -0
  428. /package/dist/valibot/{user.d.ts → parsers/user.d.ts} +0 -0
@@ -1,462 +1,462 @@
1
- /**
2
- * @fileoverview Base service class with lifecycle management, health checks,
3
- * and integrated logging.
4
- *
5
- * ServiceBase provides a standardized lifecycle for all services with states,
6
- * events, logging, and error handling. Services extend this class and override
7
- * the protected methods to implement their specific functionality.
8
- *
9
- * @example
10
- * // Basic service implementation
11
- * import { ServiceBase } from './ServiceBase.js';
12
- *
13
- * class DatabaseService extends ServiceBase {
14
- * async _init(config) {
15
- * this.connectionString = config.connectionString;
16
- * }
17
- *
18
- * async _start() {
19
- * this.connection = await createConnection(this.connectionString);
20
- * }
21
- *
22
- * async _stop() {
23
- * await this.connection?.close();
24
- * }
25
- * }
26
- *
27
- * // Usage
28
- * const db = new DatabaseService('database');
29
- * await db.initialize({ connectionString: 'postgres://...' });
30
- * await db.start();
31
- *
32
- * // Listen to events
33
- * db.on('healthChanged', ({ healthy }) => {
34
- * console.log(`Database is ${healthy ? 'healthy' : 'unhealthy'}`);
35
- * });
36
- *
37
- * @example
38
- * // Service with recovery and health checks
39
- * class ApiService extends ServiceBase {
40
- * async _recover() {
41
- * // Custom recovery logic
42
- * await this.reconnect();
43
- * }
44
- *
45
- * async _healthCheck() {
46
- * const start = Date.now();
47
- * await this.ping();
48
- * return { latency: Date.now() - start };
49
- * }
50
- * }
51
- */
52
-
53
- import { EventEmitter } from '../../../classes/event-emitter';
54
- import { Logger, INFO } from '../../../logging/internal/unified-logger';
55
-
56
- import {
57
- CREATED,
58
- INITIALIZING,
59
- INITIALIZED,
60
- STARTING,
61
- RUNNING,
62
- STOPPING,
63
- STOPPED,
64
- DESTROYING,
65
- DESTROYED,
66
- ERROR as ERROR_STATE,
67
- RECOVERING
68
- } from './constants.js';
69
-
70
- /**
71
- * @typedef {import('./typedef.js').ServiceOptions} ServiceOptions
72
- * @typedef {import('./typedef.js').StopOptions} StopOptions
73
- * @typedef {import('./typedef.js').HealthStatus} HealthStatus
74
- * @typedef {import('./typedef.js').StateChangeEvent} StateChangeEvent
75
- * @typedef {import('./typedef.js').HealthChangeEvent} HealthChangeEvent
76
- * @typedef {import('./typedef.js').ServiceErrorEvent} ServiceErrorEvent
77
- */
78
-
79
- /**
80
- * Base class for all services with lifecycle management
81
- * @extends EventEmitter
82
- */
83
- export class ServiceBase extends EventEmitter {
84
- /**
85
- * Create a new service instance
86
- *
87
- * @param {string} name - Service name
88
- * @param {ServiceOptions} [options={}] - Service options
89
- */
90
- constructor(name, options = {}) {
91
- super();
92
-
93
- /** @type {string} */
94
- this.name = name;
95
-
96
- /** @type {string} */
97
- this.state = CREATED;
98
-
99
- /** @type {boolean} */
100
- this.healthy = false;
101
-
102
- /** @type {Error|null} */
103
- this.error = null;
104
-
105
- /** @type {Logger} */
106
- this.logger = new Logger(name, options.logLevel || INFO);
107
-
108
- /** @private @type {number} */
109
- this._shutdownTimeout = options.shutdownTimeout || 5000;
110
- }
111
-
112
- /**
113
- * Initialize the service with configuration
114
- *
115
- * @param {*} [config={}] - Service-specific configuration
116
- *
117
- * @returns {Promise<boolean>} True if initialization succeeded
118
- */
119
- async initialize(config = {}) {
120
- if (this.state !== CREATED &&
121
- this.state !== STOPPED &&
122
- this.state !== DESTROYED) {
123
- this.logger.warn(`Cannot initialize from state: ${this.state}`);
124
- return false;
125
- }
126
-
127
- try {
128
- this._setState(INITIALIZING);
129
- this.logger.debug('Initializing service', { config });
130
-
131
- await this._init(config);
132
-
133
- this._setState(INITIALIZED);
134
- this.logger.info('Service initialized');
135
- return true;
136
- } catch (error) {
137
- this._setError('initialization', error);
138
- return false;
139
- }
140
- }
141
-
142
- /**
143
- * Start the service
144
- *
145
- * @returns {Promise<boolean>} True if the service started successfully
146
- */
147
- async start() {
148
- if (this.state !== INITIALIZED && this.state !== STOPPED) {
149
- this.logger.warn(`Cannot start from state: ${this.state}`);
150
- return false;
151
- }
152
-
153
- try {
154
- this._setState(STARTING);
155
- this.logger.debug('Starting service');
156
-
157
- await this._start();
158
-
159
- this._setState(RUNNING);
160
- this._setHealthy(true);
161
- this.logger.info('Service started');
162
- return true;
163
- } catch (error) {
164
- this._setError('startup', error);
165
- return false;
166
- }
167
- }
168
-
169
- /**
170
- * Stop the service with optional timeout
171
- *
172
- * @param {StopOptions} [options={}] - Stop options
173
- *
174
- * @returns {Promise<boolean>} True if the service stopped successfully
175
- */
176
- async stop(options = {}) {
177
- if (this.state !== RUNNING && this.state !== ERROR_STATE) {
178
- this.logger.warn(`Cannot stop from state: ${this.state}`);
179
- return true; // Already stopped
180
- }
181
-
182
- const timeout = options.timeout ?? this._shutdownTimeout;
183
-
184
- try {
185
- this._setState(STOPPING);
186
- this._setHealthy(false);
187
- this.logger.debug('Stopping service');
188
-
189
- // Wrap _stop in a timeout
190
- const stopPromise = this._stop();
191
-
192
- if (timeout > 0) {
193
- await Promise.race([
194
- stopPromise,
195
- new Promise((_, reject) =>
196
- setTimeout(() => reject(new Error('Shutdown timeout')), timeout)
197
- )
198
- ]);
199
- } else {
200
- await stopPromise;
201
- }
202
-
203
- this._setState(STOPPED);
204
- this.logger.info('Service stopped');
205
- return true;
206
- } catch (error) {
207
- if (error.message === 'Shutdown timeout' && options.force) {
208
- this.logger.warn('Forced shutdown after timeout');
209
- this._setState(STOPPED);
210
- return true;
211
- }
212
- this._setError('shutdown', error);
213
- return false;
214
- }
215
- }
216
-
217
- /**
218
- * Recover the service from error state
219
- *
220
- * @returns {Promise<boolean>} True if recovery succeeded
221
- */
222
- async recover() {
223
- if (this.state !== ERROR_STATE) {
224
- this.logger.warn(
225
- `Can only recover from ERROR state, current: ${this.state}`
226
- );
227
- return false;
228
- }
229
-
230
- try {
231
- this._setState(RECOVERING);
232
- this.logger.info('Attempting recovery');
233
-
234
- // Try custom recovery first
235
- if (this._recover) {
236
- await this._recover();
237
- this._setState(RUNNING);
238
- this._setHealthy(true);
239
- } else {
240
- // Default: restart
241
- this._setState(STOPPED);
242
- await this.start();
243
- }
244
-
245
- this.error = null;
246
- this.logger.info('Recovery successful');
247
- return true;
248
- } catch (error) {
249
- this._setError('recovery', error);
250
- return false;
251
- }
252
- }
253
-
254
- /**
255
- * Destroy the service and cleanup resources
256
- *
257
- * @returns {Promise<boolean>} True if destruction succeeded
258
- */
259
- async destroy() {
260
- if (this.state === DESTROYED) {
261
- return true;
262
- }
263
-
264
- try {
265
- if (this.state === RUNNING) {
266
- await this.stop();
267
- }
268
-
269
- this._setState(DESTROYING);
270
- this.logger.debug('Destroying service');
271
-
272
- if (this._destroy) {
273
- await this._destroy();
274
- }
275
-
276
- this._setState(DESTROYED);
277
- this._setHealthy(false);
278
- this.logger.info('Service destroyed');
279
-
280
- // Cleanup
281
- this.removeAllListeners();
282
- this.logger.removeAllListeners();
283
-
284
- return true;
285
- } catch (error) {
286
- this._setError('destruction', error);
287
- return false;
288
- }
289
- }
290
-
291
- /**
292
- * Get the current health status of the service
293
- *
294
- * @returns {Promise<HealthStatus>} Health status object
295
- */
296
- async getHealth() {
297
- const baseHealth = {
298
- name: this.name,
299
- state: this.state,
300
- healthy: this.healthy,
301
- error: this.error?.message
302
- };
303
-
304
- if (this._healthCheck) {
305
- try {
306
- const customHealth = await this._healthCheck();
307
- return { ...baseHealth, ...customHealth };
308
- } catch (error) {
309
- return {
310
- ...baseHealth,
311
- healthy: false,
312
- checkError: error.message
313
- };
314
- }
315
- }
316
-
317
- return baseHealth;
318
- }
319
-
320
- /**
321
- * Set the service log level
322
- *
323
- * @param {string} level - New log level
324
- *
325
- * @returns {boolean} True if the level was set successfully
326
- */
327
- setLogLevel(level) {
328
- return this.logger.setLevel(level);
329
- }
330
-
331
- // Protected methods to override in subclasses
332
-
333
- /**
334
- * Initialize the service (override in subclass)
335
- *
336
- * @protected
337
- * @param {*} config - Service configuration
338
- *
339
- * @returns {Promise<void>}
340
- */
341
- async _init(config) {
342
- // Override in subclass
343
- }
344
-
345
- /**
346
- * Start the service (override in subclass)
347
- *
348
- * @protected
349
- *
350
- * @returns {Promise<void>}
351
- */
352
- async _start() {
353
- // Override in subclass
354
- }
355
-
356
- /**
357
- * Stop the service (override in subclass)
358
- *
359
- * @protected
360
- *
361
- * @returns {Promise<void>}
362
- */
363
- async _stop() {
364
- // Override in subclass
365
- }
366
-
367
- /**
368
- * Destroy the service (optional override)
369
- *
370
- * @protected
371
- *
372
- * @returns {Promise<void>}
373
- */
374
- async _destroy() {
375
- // Override in subclass if needed
376
- }
377
-
378
- /**
379
- * Recover from error state (optional override)
380
- *
381
- * @protected
382
- *
383
- * @returns {Promise<void>}
384
- */
385
- async _recover() {
386
- // Override in subclass if custom recovery needed
387
- // Default behavior is stop + start
388
- }
389
-
390
- /**
391
- * Perform health check (optional override)
392
- *
393
- * @protected
394
- *
395
- * @returns {Promise<Object>} Additional health information
396
- */
397
- async _healthCheck() {
398
- // Override in subclass if health checks needed
399
- return {};
400
- }
401
-
402
- // Private methods
403
-
404
- /**
405
- * Set the service state and emit event
406
- *
407
- * @private
408
- * @param {string} newState - New state value
409
- */
410
- _setState(newState) {
411
- const oldState = this.state;
412
- this.state = newState;
413
-
414
- this.emit('stateChanged', {
415
- oldState,
416
- newState
417
- });
418
- }
419
-
420
- /**
421
- * Set the health status and emit event if changed
422
- *
423
- * @private
424
- * @param {boolean} healthy - New health status
425
- */
426
- _setHealthy(healthy) {
427
- const wasHealthy = this.healthy;
428
- this.healthy = healthy;
429
-
430
- if (wasHealthy !== healthy) {
431
- this.emit('healthChanged', {
432
- healthy,
433
- wasHealthy
434
- });
435
- }
436
- }
437
-
438
- /**
439
- * Set error state and emit error event
440
- *
441
- * @private
442
- * @param {string} operation - Operation that failed
443
- * @param {Error} error - Error that occurred
444
- */
445
- _setError(operation, error) {
446
- this.error = error;
447
- this._setState(ERROR_STATE);
448
- this._setHealthy(false);
449
-
450
- this.logger.error(`${operation} failed`, {
451
- error: error.message,
452
- stack: error.stack
453
- });
454
-
455
- this.emit('error', {
456
- operation,
457
- error
458
- });
459
- }
460
- }
461
-
462
- export default ServiceBase;
1
+ /**
2
+ * @fileoverview Base service class with lifecycle management, health checks,
3
+ * and integrated logging.
4
+ *
5
+ * ServiceBase provides a standardized lifecycle for all services with states,
6
+ * events, logging, and error handling. Services extend this class and override
7
+ * the protected methods to implement their specific functionality.
8
+ *
9
+ * @example
10
+ * // Basic service implementation
11
+ * import { ServiceBase } from './ServiceBase.js';
12
+ *
13
+ * class DatabaseService extends ServiceBase {
14
+ * async _init(config) {
15
+ * this.connectionString = config.connectionString;
16
+ * }
17
+ *
18
+ * async _start() {
19
+ * this.connection = await createConnection(this.connectionString);
20
+ * }
21
+ *
22
+ * async _stop() {
23
+ * await this.connection?.close();
24
+ * }
25
+ * }
26
+ *
27
+ * // Usage
28
+ * const db = new DatabaseService('database');
29
+ * await db.initialize({ connectionString: 'postgres://...' });
30
+ * await db.start();
31
+ *
32
+ * // Listen to events
33
+ * db.on('healthChanged', ({ healthy }) => {
34
+ * console.log(`Database is ${healthy ? 'healthy' : 'unhealthy'}`);
35
+ * });
36
+ *
37
+ * @example
38
+ * // Service with recovery and health checks
39
+ * class ApiService extends ServiceBase {
40
+ * async _recover() {
41
+ * // Custom recovery logic
42
+ * await this.reconnect();
43
+ * }
44
+ *
45
+ * async _healthCheck() {
46
+ * const start = Date.now();
47
+ * await this.ping();
48
+ * return { latency: Date.now() - start };
49
+ * }
50
+ * }
51
+ */
52
+
53
+ import { EventEmitter } from '../../../classes/event-emitter';
54
+ import { Logger, INFO } from '../../../logging/internal/unified-logger';
55
+
56
+ import {
57
+ CREATED,
58
+ INITIALIZING,
59
+ INITIALIZED,
60
+ STARTING,
61
+ RUNNING,
62
+ STOPPING,
63
+ STOPPED,
64
+ DESTROYING,
65
+ DESTROYED,
66
+ ERROR as ERROR_STATE,
67
+ RECOVERING
68
+ } from './constants.js';
69
+
70
+ /**
71
+ * @typedef {import('./typedef.js').ServiceOptions} ServiceOptions
72
+ * @typedef {import('./typedef.js').StopOptions} StopOptions
73
+ * @typedef {import('./typedef.js').HealthStatus} HealthStatus
74
+ * @typedef {import('./typedef.js').StateChangeEvent} StateChangeEvent
75
+ * @typedef {import('./typedef.js').HealthChangeEvent} HealthChangeEvent
76
+ * @typedef {import('./typedef.js').ServiceErrorEvent} ServiceErrorEvent
77
+ */
78
+
79
+ /**
80
+ * Base class for all services with lifecycle management
81
+ * @extends EventEmitter
82
+ */
83
+ export class ServiceBase extends EventEmitter {
84
+ /**
85
+ * Create a new service instance
86
+ *
87
+ * @param {string} name - Service name
88
+ * @param {ServiceOptions} [options={}] - Service options
89
+ */
90
+ constructor(name, options = {}) {
91
+ super();
92
+
93
+ /** @type {string} */
94
+ this.name = name;
95
+
96
+ /** @type {string} */
97
+ this.state = CREATED;
98
+
99
+ /** @type {boolean} */
100
+ this.healthy = false;
101
+
102
+ /** @type {Error|null} */
103
+ this.error = null;
104
+
105
+ /** @type {Logger} */
106
+ this.logger = new Logger(name, options.logLevel || INFO);
107
+
108
+ /** @private @type {number} */
109
+ this._shutdownTimeout = options.shutdownTimeout || 5000;
110
+ }
111
+
112
+ /**
113
+ * Initialize the service with configuration
114
+ *
115
+ * @param {*} [config={}] - Service-specific configuration
116
+ *
117
+ * @returns {Promise<boolean>} True if initialization succeeded
118
+ */
119
+ async initialize(config = {}) {
120
+ if (this.state !== CREATED &&
121
+ this.state !== STOPPED &&
122
+ this.state !== DESTROYED) {
123
+ this.logger.warn(`Cannot initialize from state: ${this.state}`);
124
+ return false;
125
+ }
126
+
127
+ try {
128
+ this._setState(INITIALIZING);
129
+ this.logger.debug('Initializing service', { config });
130
+
131
+ await this._init(config);
132
+
133
+ this._setState(INITIALIZED);
134
+ this.logger.info('Service initialized');
135
+ return true;
136
+ } catch (error) {
137
+ this._setError('initialization', error);
138
+ return false;
139
+ }
140
+ }
141
+
142
+ /**
143
+ * Start the service
144
+ *
145
+ * @returns {Promise<boolean>} True if the service started successfully
146
+ */
147
+ async start() {
148
+ if (this.state !== INITIALIZED && this.state !== STOPPED) {
149
+ this.logger.warn(`Cannot start from state: ${this.state}`);
150
+ return false;
151
+ }
152
+
153
+ try {
154
+ this._setState(STARTING);
155
+ this.logger.debug('Starting service');
156
+
157
+ await this._start();
158
+
159
+ this._setState(RUNNING);
160
+ this._setHealthy(true);
161
+ this.logger.info('Service started');
162
+ return true;
163
+ } catch (error) {
164
+ this._setError('startup', error);
165
+ return false;
166
+ }
167
+ }
168
+
169
+ /**
170
+ * Stop the service with optional timeout
171
+ *
172
+ * @param {StopOptions} [options={}] - Stop options
173
+ *
174
+ * @returns {Promise<boolean>} True if the service stopped successfully
175
+ */
176
+ async stop(options = {}) {
177
+ if (this.state !== RUNNING && this.state !== ERROR_STATE) {
178
+ this.logger.warn(`Cannot stop from state: ${this.state}`);
179
+ return true; // Already stopped
180
+ }
181
+
182
+ const timeout = options.timeout ?? this._shutdownTimeout;
183
+
184
+ try {
185
+ this._setState(STOPPING);
186
+ this._setHealthy(false);
187
+ this.logger.debug('Stopping service');
188
+
189
+ // Wrap _stop in a timeout
190
+ const stopPromise = this._stop();
191
+
192
+ if (timeout > 0) {
193
+ await Promise.race([
194
+ stopPromise,
195
+ new Promise((_, reject) =>
196
+ setTimeout(() => reject(new Error('Shutdown timeout')), timeout)
197
+ )
198
+ ]);
199
+ } else {
200
+ await stopPromise;
201
+ }
202
+
203
+ this._setState(STOPPED);
204
+ this.logger.info('Service stopped');
205
+ return true;
206
+ } catch (error) {
207
+ if (error.message === 'Shutdown timeout' && options.force) {
208
+ this.logger.warn('Forced shutdown after timeout');
209
+ this._setState(STOPPED);
210
+ return true;
211
+ }
212
+ this._setError('shutdown', error);
213
+ return false;
214
+ }
215
+ }
216
+
217
+ /**
218
+ * Recover the service from error state
219
+ *
220
+ * @returns {Promise<boolean>} True if recovery succeeded
221
+ */
222
+ async recover() {
223
+ if (this.state !== ERROR_STATE) {
224
+ this.logger.warn(
225
+ `Can only recover from ERROR state, current: ${this.state}`
226
+ );
227
+ return false;
228
+ }
229
+
230
+ try {
231
+ this._setState(RECOVERING);
232
+ this.logger.info('Attempting recovery');
233
+
234
+ // Try custom recovery first
235
+ if (this._recover) {
236
+ await this._recover();
237
+ this._setState(RUNNING);
238
+ this._setHealthy(true);
239
+ } else {
240
+ // Default: restart
241
+ this._setState(STOPPED);
242
+ await this.start();
243
+ }
244
+
245
+ this.error = null;
246
+ this.logger.info('Recovery successful');
247
+ return true;
248
+ } catch (error) {
249
+ this._setError('recovery', error);
250
+ return false;
251
+ }
252
+ }
253
+
254
+ /**
255
+ * Destroy the service and cleanup resources
256
+ *
257
+ * @returns {Promise<boolean>} True if destruction succeeded
258
+ */
259
+ async destroy() {
260
+ if (this.state === DESTROYED) {
261
+ return true;
262
+ }
263
+
264
+ try {
265
+ if (this.state === RUNNING) {
266
+ await this.stop();
267
+ }
268
+
269
+ this._setState(DESTROYING);
270
+ this.logger.debug('Destroying service');
271
+
272
+ if (this._destroy) {
273
+ await this._destroy();
274
+ }
275
+
276
+ this._setState(DESTROYED);
277
+ this._setHealthy(false);
278
+ this.logger.info('Service destroyed');
279
+
280
+ // Cleanup
281
+ this.removeAllListeners();
282
+ this.logger.removeAllListeners();
283
+
284
+ return true;
285
+ } catch (error) {
286
+ this._setError('destruction', error);
287
+ return false;
288
+ }
289
+ }
290
+
291
+ /**
292
+ * Get the current health status of the service
293
+ *
294
+ * @returns {Promise<HealthStatus>} Health status object
295
+ */
296
+ async getHealth() {
297
+ const baseHealth = {
298
+ name: this.name,
299
+ state: this.state,
300
+ healthy: this.healthy,
301
+ error: this.error?.message
302
+ };
303
+
304
+ if (this._healthCheck) {
305
+ try {
306
+ const customHealth = await this._healthCheck();
307
+ return { ...baseHealth, ...customHealth };
308
+ } catch (error) {
309
+ return {
310
+ ...baseHealth,
311
+ healthy: false,
312
+ checkError: error.message
313
+ };
314
+ }
315
+ }
316
+
317
+ return baseHealth;
318
+ }
319
+
320
+ /**
321
+ * Set the service log level
322
+ *
323
+ * @param {string} level - New log level
324
+ *
325
+ * @returns {boolean} True if the level was set successfully
326
+ */
327
+ setLogLevel(level) {
328
+ return this.logger.setLevel(level);
329
+ }
330
+
331
+ // Protected methods to override in subclasses
332
+
333
+ /**
334
+ * Initialize the service (override in subclass)
335
+ *
336
+ * @protected
337
+ * @param {*} config - Service configuration
338
+ *
339
+ * @returns {Promise<void>}
340
+ */
341
+ async _init(config) {
342
+ // Override in subclass
343
+ }
344
+
345
+ /**
346
+ * Start the service (override in subclass)
347
+ *
348
+ * @protected
349
+ *
350
+ * @returns {Promise<void>}
351
+ */
352
+ async _start() {
353
+ // Override in subclass
354
+ }
355
+
356
+ /**
357
+ * Stop the service (override in subclass)
358
+ *
359
+ * @protected
360
+ *
361
+ * @returns {Promise<void>}
362
+ */
363
+ async _stop() {
364
+ // Override in subclass
365
+ }
366
+
367
+ /**
368
+ * Destroy the service (optional override)
369
+ *
370
+ * @protected
371
+ *
372
+ * @returns {Promise<void>}
373
+ */
374
+ async _destroy() {
375
+ // Override in subclass if needed
376
+ }
377
+
378
+ /**
379
+ * Recover from error state (optional override)
380
+ *
381
+ * @protected
382
+ *
383
+ * @returns {Promise<void>}
384
+ */
385
+ async _recover() {
386
+ // Override in subclass if custom recovery needed
387
+ // Default behavior is stop + start
388
+ }
389
+
390
+ /**
391
+ * Perform health check (optional override)
392
+ *
393
+ * @protected
394
+ *
395
+ * @returns {Promise<Object>} Additional health information
396
+ */
397
+ async _healthCheck() {
398
+ // Override in subclass if health checks needed
399
+ return {};
400
+ }
401
+
402
+ // Private methods
403
+
404
+ /**
405
+ * Set the service state and emit event
406
+ *
407
+ * @private
408
+ * @param {string} newState - New state value
409
+ */
410
+ _setState(newState) {
411
+ const oldState = this.state;
412
+ this.state = newState;
413
+
414
+ this.emit('stateChanged', {
415
+ oldState,
416
+ newState
417
+ });
418
+ }
419
+
420
+ /**
421
+ * Set the health status and emit event if changed
422
+ *
423
+ * @private
424
+ * @param {boolean} healthy - New health status
425
+ */
426
+ _setHealthy(healthy) {
427
+ const wasHealthy = this.healthy;
428
+ this.healthy = healthy;
429
+
430
+ if (wasHealthy !== healthy) {
431
+ this.emit('healthChanged', {
432
+ healthy,
433
+ wasHealthy
434
+ });
435
+ }
436
+ }
437
+
438
+ /**
439
+ * Set error state and emit error event
440
+ *
441
+ * @private
442
+ * @param {string} operation - Operation that failed
443
+ * @param {Error} error - Error that occurred
444
+ */
445
+ _setError(operation, error) {
446
+ this.error = error;
447
+ this._setState(ERROR_STATE);
448
+ this._setHealthy(false);
449
+
450
+ this.logger.error(`${operation} failed`, {
451
+ error: error.message,
452
+ stack: error.stack
453
+ });
454
+
455
+ this.emit('error', {
456
+ operation,
457
+ error
458
+ });
459
+ }
460
+ }
461
+
462
+ export default ServiceBase;