@hkdigital/lib-core 0.3.15 → 0.4.3

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 (296) hide show
  1. package/README.md +6 -6
  2. package/dist/auth/errors.d.ts +1 -0
  3. package/dist/auth/errors.js +1 -0
  4. package/dist/{states → browser/navigation}/navigation.svelte.js +1 -1
  5. package/dist/browser/navigation.d.ts +1 -0
  6. package/dist/browser/navigation.js +1 -0
  7. package/dist/config/README.md +1 -1
  8. package/dist/config/generators/imagetools.d.ts +2 -0
  9. package/dist/config/generators/imagetools.js +23 -10
  10. package/dist/config/generators/vite.js +1 -1
  11. package/dist/config/imagetools.d.ts +5 -5
  12. package/dist/config/typedef.d.ts +11 -0
  13. package/dist/config/typedef.js +17 -0
  14. package/dist/design/README.md +75 -0
  15. package/dist/design/generators/index.js +35 -0
  16. package/dist/design/themes/hkdev/components/buttons/button-text.css +20 -1
  17. package/dist/design/themes/hkdev/theme-ext.js +1 -1
  18. package/dist/{classes/data → generic/data/classes}/IterableTree.js +2 -2
  19. package/dist/{classes/data → generic/data/classes}/Selector.js +1 -1
  20. package/dist/generic/data/classes/typedef.d.ts +24 -0
  21. package/dist/generic/data/classes/typedef.js +14 -0
  22. package/dist/generic/data.d.ts +2 -0
  23. package/dist/generic/data.js +2 -0
  24. package/dist/generic/errors.d.ts +2 -0
  25. package/dist/generic/errors.js +2 -0
  26. package/dist/generic/events.d.ts +1 -0
  27. package/dist/generic/events.js +1 -0
  28. package/dist/{classes/promise → generic/promises/classes}/HkPromise.d.ts +17 -7
  29. package/dist/{classes/promise → generic/promises/classes}/HkPromise.js +20 -10
  30. package/dist/generic/promises.d.ts +1 -0
  31. package/dist/generic/promises.js +1 -0
  32. package/dist/{classes/streams → generic/streaming/classes}/ServerEventsStore.d.ts +1 -1
  33. package/dist/{classes/streams → generic/streaming/classes}/ServerEventsStore.js +2 -2
  34. package/dist/generic/streaming.d.ts +3 -0
  35. package/dist/generic/streaming.js +3 -0
  36. package/dist/generic/typedef.d.ts +1 -0
  37. package/dist/generic/typedef.js +1 -0
  38. package/dist/index.js +1 -0
  39. package/dist/logging/errors.d.ts +7 -0
  40. package/dist/logging/errors.js +11 -0
  41. package/dist/logging/internal/adapters/console.d.ts +1 -16
  42. package/dist/logging/internal/adapters/console.js +320 -8
  43. package/dist/logging/internal/adapters/formatting.d.ts +69 -0
  44. package/dist/logging/internal/adapters/formatting.js +395 -0
  45. package/dist/logging/internal/adapters/pino.js +112 -21
  46. package/dist/logging/internal/adapters/typedef.d.ts +30 -0
  47. package/dist/logging/internal/adapters/typedef.js +11 -0
  48. package/dist/logging/internal/factories/server.js +11 -1
  49. package/dist/logging/internal/logger/Logger.d.ts +7 -5
  50. package/dist/logging/internal/logger/Logger.js +41 -6
  51. package/dist/logging/internal/test-errors.d.ts +35 -0
  52. package/dist/logging/internal/test-errors.js +137 -0
  53. package/dist/network/cache/IndexedDbCache.d.ts +1 -1
  54. package/dist/network/cache/MemoryResponseCache.d.ts +5 -0
  55. package/dist/network/cache/MemoryResponseCache.js +5 -2
  56. package/dist/network/errors.d.ts +2 -0
  57. package/dist/network/errors.js +2 -0
  58. package/dist/network/http/caching.js +1 -1
  59. package/dist/network/http/errors.d.ts +2 -2
  60. package/dist/network/http/errors.js +5 -13
  61. package/dist/network/http/http-request.js +1 -1
  62. package/dist/network/http/json-request.js +1 -1
  63. package/dist/network/http/response.js +1 -1
  64. package/dist/network/http/url.js +1 -1
  65. package/dist/network/loaders/README.md +14 -7
  66. package/dist/network/loaders/audio/AudioScene.svelte.js +3 -2
  67. package/dist/network/loaders/image/ImageLoader.svelte.d.ts +2 -2
  68. package/dist/network/loaders/image/ImageLoader.svelte.js +1 -1
  69. package/dist/network/loaders/image/ImageScene.svelte.d.ts +2 -2
  70. package/dist/network/loaders/image/ImageScene.svelte.js +9 -8
  71. package/dist/network/loaders/image/ImageVariantsLoader.svelte.d.ts +5 -5
  72. package/dist/network/loaders/image/ImageVariantsLoader.svelte.js +14 -13
  73. package/dist/network/loaders/image/utils/index.d.ts +2 -2
  74. package/dist/network/loaders/image/utils/index.js +9 -12
  75. package/dist/network/loaders/typedef.d.ts +0 -9
  76. package/dist/network/loaders/typedef.js +0 -12
  77. package/dist/network/states/NetworkLoader.svelte.d.ts +1 -1
  78. package/dist/network/states/NetworkLoader.svelte.js +3 -2
  79. package/dist/services/service-base/ServiceBase.d.ts +2 -2
  80. package/dist/services/service-base/ServiceBase.js +15 -11
  81. package/dist/services/service-base/typedef.d.ts +2 -31
  82. package/dist/services/service-base/typedef.js +3 -2
  83. package/dist/services/service-manager/ServiceManager.d.ts +3 -3
  84. package/dist/services/service-manager/ServiceManager.js +2 -2
  85. package/dist/services/service-manager/typedef.d.ts +3 -3
  86. package/dist/services/service-manager/typedef.js +3 -3
  87. package/dist/{classes/svelte → state/classes}/loading-state-machine/LoadingStateMachine.svelte.d.ts +1 -1
  88. package/dist/{classes/svelte → state/classes}/loading-state-machine/LoadingStateMachine.svelte.js +1 -1
  89. package/dist/state/classes/subscribers-count/index.d.ts +1 -0
  90. package/dist/state/classes/subscribers-count/index.js +1 -0
  91. package/dist/state/classes.d.ts +3 -0
  92. package/dist/state/classes.js +3 -0
  93. package/dist/{util/svelte/state-context/index.d.ts → state/context/state-context.d.ts} +1 -1
  94. package/dist/{util/svelte/state-context/index.js → state/context/state-context.js} +4 -4
  95. package/dist/state/context.d.ts +1 -0
  96. package/dist/state/context.js +1 -0
  97. package/dist/state/stores.d.ts +1 -0
  98. package/dist/state/stores.js +1 -0
  99. package/dist/ui/README.md +49 -0
  100. package/dist/ui/components/button-group/index.d.ts +1 -0
  101. package/dist/ui/components/button-group/index.js +1 -0
  102. package/dist/ui/{primitives → components}/drag-drop/DragDropContext.svelte +1 -1
  103. package/dist/ui/{primitives → components}/drag-drop/DragDropContext.svelte.d.ts +1 -1
  104. package/dist/ui/{primitives → components}/drag-drop/Draggable.svelte +2 -2
  105. package/dist/ui/{primitives → components}/drag-drop/Draggable.svelte.d.ts +1 -1
  106. package/dist/ui/{primitives → components}/drag-drop/DropZone.svelte +4 -4
  107. package/dist/ui/{primitives → components}/drag-drop/DropZone.svelte.d.ts +3 -3
  108. package/dist/ui/{primitives → components}/drag-drop/DropZoneArea.svelte +3 -3
  109. package/dist/ui/{primitives → components}/drag-drop/DropZoneArea.svelte.d.ts +4 -4
  110. package/dist/ui/{primitives → components}/drag-drop/DropZoneList.svelte +3 -3
  111. package/dist/ui/{primitives → components}/drag-drop/DropZoneList.svelte.d.ts +3 -3
  112. package/dist/ui/{primitives → components}/drag-drop/drag-state.svelte.d.ts +11 -11
  113. package/dist/ui/{primitives → components}/drag-drop/drag-state.svelte.js +5 -5
  114. package/dist/ui/components/drag-drop/typedef.d.ts +2 -0
  115. package/dist/ui/components/drag-drop/typedef.js +2 -0
  116. package/dist/ui/components/game-box/index.d.ts +1 -0
  117. package/dist/ui/components/game-box/index.js +1 -0
  118. package/dist/ui/components/grid-layers/index.d.ts +1 -0
  119. package/dist/ui/components/grid-layers/index.js +1 -0
  120. package/dist/ui/{primitives/layout → components}/grid-layers/util.js +1 -1
  121. package/dist/ui/components/hk-app-layout/HkAppLayout.state.svelte.d.ts +3 -3
  122. package/dist/ui/components/hk-app-layout/HkAppLayout.state.svelte.js +3 -4
  123. package/dist/ui/components/hk-app-layout/index.d.ts +1 -0
  124. package/dist/ui/components/hk-app-layout/index.js +1 -0
  125. package/dist/ui/components/image-box/ImageBox.svelte +2 -2
  126. package/dist/ui/components/image-box/ImageBox.svelte.d.ts +3 -3
  127. package/dist/ui/components/image-box/index.d.ts +1 -1
  128. package/dist/ui/components/presenter/ImageSlide.svelte +1 -1
  129. package/dist/ui/components/presenter/ImageSlide.svelte.d.ts +2 -2
  130. package/dist/ui/components/presenter/Presenter.state.svelte.d.ts +3 -3
  131. package/dist/ui/components/presenter/Presenter.state.svelte.js +1 -1
  132. package/dist/ui/components/presenter/Presenter.svelte +1 -1
  133. package/dist/ui/components/presenter/Presenter.svelte.d.ts +1 -1
  134. package/dist/ui/{primitives → components}/rows/panel-grid-row/PanelGridRow.svelte.d.ts +1 -1
  135. package/dist/ui/{primitives → components}/rows/panel-row-2/PanelRow2.svelte.d.ts +1 -1
  136. package/dist/ui/{primitives → components}/tab-bar/HkTabBar.state.svelte.d.ts +3 -3
  137. package/dist/ui/{primitives → components}/tab-bar/HkTabBar.state.svelte.js +4 -2
  138. package/dist/ui/{primitives → components}/tab-bar/HkTabBar.svelte +2 -2
  139. package/dist/ui/{primitives → components}/tab-bar/HkTabBar.svelte.d.ts +2 -2
  140. package/dist/ui/components/tab-bar/HkTabBarSelector.state.svelte.d.ts +19 -0
  141. package/dist/ui/{primitives → components}/tab-bar/HkTabBarSelector.state.svelte.js +2 -2
  142. package/dist/ui/{primitives → components}/tab-bar/HkTabBarSelector.svelte +1 -1
  143. package/dist/ui/{primitives → components}/tab-bar/HkTabBarSelector.svelte.d.ts +2 -2
  144. package/dist/ui/{primitives → components}/tab-bar/typedef.d.ts +1 -1
  145. package/dist/ui/{primitives → components}/tab-bar/typedef.js +1 -1
  146. package/dist/ui/components/typedef.d.ts +5 -0
  147. package/dist/ui/components/typedef.js +5 -0
  148. package/dist/ui/components/virtual-viewport/index.d.ts +1 -0
  149. package/dist/ui/components/virtual-viewport/index.js +1 -0
  150. package/dist/ui/components.d.ts +11 -0
  151. package/dist/ui/components.js +11 -0
  152. package/dist/ui/{primitives/hkdev → dev}/blocks/TextBlock.svelte +1 -1
  153. package/dist/ui/{primitives/debug → dev}/debug-panel-design-scaling/DebugPanelDesignScaling.svelte +1 -1
  154. package/dist/ui/dev.d.ts +3 -0
  155. package/dist/ui/dev.js +3 -0
  156. package/dist/ui/primitives/buttons/button/Button.svelte.d.ts +1 -1
  157. package/dist/ui/primitives/typedef.d.ts +1 -0
  158. package/dist/ui/primitives/typedef.js +1 -0
  159. package/dist/ui/primitives.d.ts +5 -0
  160. package/dist/ui/primitives.js +5 -0
  161. package/dist/ui/typedef.d.ts +2 -0
  162. package/dist/ui/typedef.js +2 -0
  163. package/dist/util/array/index.js +1 -1
  164. package/dist/util/bases/base58.d.ts +3 -3
  165. package/dist/util/bases/base58.js +3 -3
  166. package/dist/util/compare/index.d.ts +4 -5
  167. package/dist/util/compare/index.js +3 -4
  168. package/dist/util/exceptions/index.js +1 -1
  169. package/dist/util/expect/arrays.d.ts +11 -11
  170. package/dist/util/expect/arrays.js +14 -6
  171. package/dist/util/expect/index.js +2 -2
  172. package/dist/util/expect/primitives.d.ts +6 -5
  173. package/dist/util/expect/primitives.js +15 -5
  174. package/dist/util/expect/url.d.ts +6 -5
  175. package/dist/util/expect/url.js +15 -5
  176. package/dist/util/function/index.d.ts +1 -14
  177. package/dist/util/index.d.ts +5 -0
  178. package/dist/util/index.js +13 -0
  179. package/dist/util/is/index.d.ts +3 -2
  180. package/dist/util/is/index.js +2 -1
  181. package/dist/util/iterate/index.d.ts +6 -8
  182. package/dist/util/iterate/index.js +5 -5
  183. package/dist/util/object/index.d.ts +1 -2
  184. package/dist/util/object/index.js +2 -3
  185. package/dist/util/ssr/index.d.ts +16 -0
  186. package/dist/util/ssr/index.js +44 -0
  187. package/dist/util/svelte/index.d.ts +1 -1
  188. package/dist/util/svelte/index.js +1 -1
  189. package/dist/util/time/index.d.ts +2 -2
  190. package/dist/util/time/index.js +1 -1
  191. package/dist/valibot/index.d.ts +1 -1
  192. package/dist/valibot/index.js +27 -1
  193. package/package.json +3 -3
  194. package/dist/assets/autospuiten/car-paint-picker/army-green.jpg +0 -0
  195. package/dist/assets/autospuiten/car-paint-picker/electric-blue.jpg +0 -0
  196. package/dist/assets/autospuiten/car-paint-picker/lemon-yellow.jpg +0 -0
  197. package/dist/assets/autospuiten/car-paint-picker/opaque-purple.jpg +0 -0
  198. package/dist/assets/autospuiten/car-paint-picker/rusty.jpg +0 -0
  199. package/dist/assets/autospuiten/car-paint-picker/sunset-orange.jpg +0 -0
  200. package/dist/assets/autospuiten/car-paint-picker/tomato-red.jpg +0 -0
  201. package/dist/assets/autospuiten/car-paint-picker.d.ts +0 -17
  202. package/dist/assets/autospuiten/car-paint-picker.js +0 -41
  203. package/dist/assets/autospuiten/labels.d.ts +0 -7
  204. package/dist/assets/autospuiten/labels.js +0 -7
  205. package/dist/classes/data/index.d.ts +0 -2
  206. package/dist/classes/data/index.js +0 -2
  207. package/dist/classes/event-emitter/index.d.ts +0 -1
  208. package/dist/classes/event-emitter/index.js +0 -2
  209. package/dist/classes/index.d.ts +0 -4
  210. package/dist/classes/index.js +0 -4
  211. package/dist/classes/promise/index.d.ts +0 -1
  212. package/dist/classes/promise/index.js +0 -1
  213. package/dist/classes/stores/index.d.ts +0 -1
  214. package/dist/classes/stores/index.js +0 -1
  215. package/dist/classes/streams/index.d.ts +0 -3
  216. package/dist/classes/streams/index.js +0 -3
  217. package/dist/classes/svelte/index.d.ts +0 -1
  218. package/dist/classes/svelte/index.js +0 -1
  219. package/dist/errors/index.d.ts +0 -5
  220. package/dist/errors/index.js +0 -5
  221. package/dist/services/service-base/index.d.ts +0 -3
  222. package/dist/services/service-base/index.js +0 -3
  223. package/dist/states/index.d.ts +0 -1
  224. package/dist/states/index.js +0 -1
  225. package/dist/stores/index.d.ts +0 -1
  226. package/dist/stores/index.js +0 -1
  227. package/dist/typedef/index.d.ts +0 -3
  228. package/dist/typedef/index.js +0 -3
  229. package/dist/ui/primitives/debug/index.d.ts +0 -1
  230. package/dist/ui/primitives/debug/index.js +0 -1
  231. package/dist/ui/primitives/index.d.ts +0 -1
  232. package/dist/ui/primitives/index.js +0 -1
  233. package/dist/ui/primitives/layout/grid-layers/GridLayers.svelte__heightFrom__ +0 -372
  234. package/dist/ui/primitives/layout/index.d.ts +0 -1
  235. package/dist/ui/primitives/layout/index.js +0 -1
  236. package/dist/ui/primitives/tab-bar/HkTabBarSelector.state.svelte.d.ts +0 -19
  237. /package/dist/{errors → auth/errors}/jwt.d.ts +0 -0
  238. /package/dist/{errors → auth/errors}/jwt.js +0 -0
  239. /package/dist/{states → browser/navigation}/navigation.svelte.d.ts +0 -0
  240. /package/dist/{classes/data → generic/data/classes}/IterableTree.d.ts +0 -0
  241. /package/dist/{classes/data → generic/data/classes}/Selector.d.ts +0 -0
  242. /package/dist/{classes → generic}/data/typedef.d.ts +0 -0
  243. /package/dist/{classes → generic}/data/typedef.js +0 -0
  244. /package/dist/{errors → generic/errors}/generic.d.ts +0 -0
  245. /package/dist/{errors → generic/errors}/generic.js +0 -0
  246. /package/dist/{errors → generic/errors}/promise.d.ts +0 -0
  247. /package/dist/{errors → generic/errors}/promise.js +0 -0
  248. /package/dist/{classes/event-emitter → generic/events/classes}/EventEmitter.d.ts +0 -0
  249. /package/dist/{classes/event-emitter → generic/events/classes}/EventEmitter.js +0 -0
  250. /package/dist/{classes/streams → generic/streaming/classes}/LogTransformStream.d.ts +0 -0
  251. /package/dist/{classes/streams → generic/streaming/classes}/LogTransformStream.js +0 -0
  252. /package/dist/{classes/streams → generic/streaming/classes}/TimeStampSource.d.ts +0 -0
  253. /package/dist/{classes/streams → generic/streaming/classes}/TimeStampSource.js +0 -0
  254. /package/dist/{errors → network/errors}/api.d.ts +0 -0
  255. /package/dist/{errors → network/errors}/api.js +0 -0
  256. /package/dist/{errors → network/errors}/http.d.ts +0 -0
  257. /package/dist/{errors → network/errors}/http.js +0 -0
  258. /package/dist/{classes/svelte → state/classes}/finite-state-machine/FiniteStateMachine.svelte.d.ts +0 -0
  259. /package/dist/{classes/svelte → state/classes}/finite-state-machine/FiniteStateMachine.svelte.js +0 -0
  260. /package/dist/{classes/svelte → state/classes}/finite-state-machine/index.d.ts +0 -0
  261. /package/dist/{classes/svelte → state/classes}/finite-state-machine/index.js +0 -0
  262. /package/dist/{classes/svelte → state/classes}/loading-state-machine/constants.d.ts +0 -0
  263. /package/dist/{classes/svelte → state/classes}/loading-state-machine/constants.js +0 -0
  264. /package/dist/{classes/svelte → state/classes}/loading-state-machine/index.d.ts +0 -0
  265. /package/dist/{classes/svelte → state/classes}/loading-state-machine/index.js +0 -0
  266. /package/dist/{classes/stores → state/classes/subscribers-count}/SubscribersCount.d.ts +0 -0
  267. /package/dist/{classes/stores → state/classes/subscribers-count}/SubscribersCount.js +0 -0
  268. /package/dist/{typedef/context.d.ts → state/context/typedef.d.ts} +0 -0
  269. /package/dist/{typedef/context.js → state/context/typedef.js} +0 -0
  270. /package/dist/{stores → state/stores}/theme.d.ts +0 -0
  271. /package/dist/{stores → state/stores}/theme.js +0 -0
  272. /package/dist/ui/{primitives → components}/drag-drop/DragController.d.ts +0 -0
  273. /package/dist/ui/{primitives → components}/drag-drop/DragController.js +0 -0
  274. /package/dist/ui/{primitives → components}/drag-drop/actions.d.ts +0 -0
  275. /package/dist/ui/{primitives → components}/drag-drop/actions.js +0 -0
  276. /package/dist/ui/{primitives → components}/drag-drop/index.d.ts +0 -0
  277. /package/dist/ui/{primitives → components}/drag-drop/index.js +0 -0
  278. /package/dist/{typedef → ui/components/drag-drop/typedef}/drag.d.ts +0 -0
  279. /package/dist/{typedef → ui/components/drag-drop/typedef}/drag.js +0 -0
  280. /package/dist/{typedef → ui/components/drag-drop/typedef}/drop.d.ts +0 -0
  281. /package/dist/{typedef → ui/components/drag-drop/typedef}/drop.js +0 -0
  282. /package/dist/ui/{primitives → components}/drag-drop/util.d.ts +0 -0
  283. /package/dist/ui/{primitives → components}/drag-drop/util.js +0 -0
  284. /package/dist/ui/{primitives/layout → components}/grid-layers/GridLayers.svelte +0 -0
  285. /package/dist/ui/{primitives/layout → components}/grid-layers/GridLayers.svelte.d.ts +0 -0
  286. /package/dist/ui/{primitives/layout → components}/grid-layers/util.d.ts +0 -0
  287. /package/dist/ui/{primitives → components}/rows/index.d.ts +0 -0
  288. /package/dist/ui/{primitives → components}/rows/index.js +0 -0
  289. /package/dist/ui/{primitives → components}/rows/panel-grid-row/PanelGridRow.svelte +0 -0
  290. /package/dist/ui/{primitives → components}/rows/panel-row-2/PanelRow2.svelte +0 -0
  291. /package/dist/ui/{primitives → components}/tab-bar/index.d.ts +0 -0
  292. /package/dist/ui/{primitives → components}/tab-bar/index.js +0 -0
  293. /package/dist/ui/{primitives/hkdev → dev}/blocks/TextBlock.svelte.d.ts +0 -0
  294. /package/dist/ui/{primitives/hkdev → dev}/buttons/CheckButton.svelte +0 -0
  295. /package/dist/ui/{primitives/hkdev → dev}/buttons/CheckButton.svelte.d.ts +0 -0
  296. /package/dist/ui/{primitives/debug → dev}/debug-panel-design-scaling/DebugPanelDesignScaling.svelte.d.ts +0 -0
@@ -0,0 +1,395 @@
1
+ /**
2
+ * Shared error formatting logic for logging adapters
3
+ *
4
+ * This module contains reusable functions for analyzing and formatting
5
+ * errors with enhanced stack trace detection and error type identification.
6
+ */
7
+
8
+ /**
9
+ * Find the most relevant frame index for highlighting in stack traces
10
+ *
11
+ * @param {Error} error - The error object
12
+ * @param {string[]} cleanedStack - Array of cleaned stack trace frames
13
+ * @returns {number} Index of the most relevant frame to highlight
14
+ */
15
+ export function findRelevantFrameIndex(error, cleanedStack) {
16
+ // Check if this is a LoggerError - look for Logger.error call
17
+ if (error.name === 'LoggerError') {
18
+ const loggerErrorIndex = cleanedStack.findIndex(frame =>
19
+ frame.includes('Logger.error') && frame.includes('logger/Logger.js')
20
+ );
21
+ if (loggerErrorIndex >= 0 && loggerErrorIndex + 1 < cleanedStack.length) {
22
+ return loggerErrorIndex + 1;
23
+ }
24
+ }
25
+
26
+ if (error.name === 'ValiError') {
27
+ // Look for expect_ function first, user code is right after (handle Node.js format)
28
+ const expectIndex = cleanedStack.findIndex(frame =>
29
+ frame.includes('expect_') || frame.includes('Module.expect_')
30
+ );
31
+ if (expectIndex >= 0 && expectIndex + 1 < cleanedStack.length) {
32
+ return expectIndex + 1;
33
+ }
34
+
35
+ // If no expect_ function, look for valibotParser, user code is right after
36
+ const valibotIndex = cleanedStack.findIndex(frame => frame.includes('valibotParser'));
37
+ if (valibotIndex >= 0 && valibotIndex + 1 < cleanedStack.length) {
38
+ return valibotIndex + 1;
39
+ }
40
+ }
41
+
42
+ if (error.name === 'DetailedError') {
43
+ // Check if this DetailedError was created by Logger.error - look for Logger.error call first
44
+ // Handle both Firefox format (error@file) and Node.js format (at Logger.error (file))
45
+ const loggerErrorIndex = cleanedStack.findIndex(frame =>
46
+ (frame.includes('Logger.error') && frame.includes('logger/Logger.js')) ||
47
+ (frame.includes('error@') && frame.includes('logger/Logger.js'))
48
+ );
49
+ if (loggerErrorIndex >= 0 && loggerErrorIndex + 1 < cleanedStack.length) {
50
+ return loggerErrorIndex + 1;
51
+ }
52
+
53
+ // Look for rethrow, user code is right after (handle both Firefox and Node.js format)
54
+ const rethrowIndex = cleanedStack.findIndex(frame =>
55
+ frame.includes('rethrow@') || frame.includes('at rethrow (')
56
+ );
57
+ if (rethrowIndex >= 0 && rethrowIndex + 1 < cleanedStack.length) {
58
+ return rethrowIndex + 1;
59
+ }
60
+ }
61
+
62
+ if (error.name === 'PromiseError') {
63
+ // Look for HkPromise methods, user code is right after
64
+ const hkPromiseIndex = cleanedStack.findIndex(frame =>
65
+ frame.includes('reject@') ||
66
+ frame.includes('tryReject@') ||
67
+ frame.includes('setTimeout@') ||
68
+ frame.includes('cancel@') ||
69
+ frame.includes('tryCancel@')
70
+ );
71
+ if (hkPromiseIndex >= 0 && hkPromiseIndex + 1 < cleanedStack.length) {
72
+ return hkPromiseIndex + 1;
73
+ }
74
+ }
75
+
76
+ if (error.name === 'HttpError') {
77
+ // Find the last frame containing http-request.js, then highlight the next one
78
+ let lastHttpIndex = -1;
79
+ for (let i = 0; i < cleanedStack.length; i++) {
80
+ if (cleanedStack[i].includes('network/http/http-request.js')) {
81
+ lastHttpIndex = i;
82
+ }
83
+ }
84
+ if (lastHttpIndex >= 0 && lastHttpIndex + 1 < cleanedStack.length) {
85
+ return lastHttpIndex + 1;
86
+ }
87
+ }
88
+
89
+ // Default to first frame
90
+ return 0;
91
+ }
92
+
93
+ /**
94
+ * Detect error metadata for structured logging and display
95
+ *
96
+ * @param {Error} error - The error object
97
+ * @param {string[]} cleanedStack - Array of cleaned stack trace frames
98
+ * @returns {import('./typedef.js').ErrorSummaryMeta} Error metadata
99
+ */
100
+ export function detectErrorMeta(error, cleanedStack) {
101
+ const userFunctionName = extractUserFunctionName(error, cleanedStack);
102
+ const relevantFrameIndex = findRelevantFrameIndex(error, cleanedStack);
103
+
104
+ // Check if it's a LoggerError
105
+ if (error.name === 'LoggerError') {
106
+ return {
107
+ category: 'logger',
108
+ method: 'logger.error',
109
+ origin: userFunctionName,
110
+ relevantFrameIndex
111
+ };
112
+ }
113
+
114
+ // Check if it's a rethrow error
115
+ if (error.name === 'DetailedError') {
116
+ // Check if this DetailedError was created by Logger.error
117
+ const cleanedStackArray = cleanedStack || [];
118
+ const loggerErrorIndex = cleanedStackArray.findIndex(frame =>
119
+ (frame.includes('Logger.error') && frame.includes('logger/Logger.js')) ||
120
+ (frame.includes('error@') && frame.includes('logger/Logger.js'))
121
+ );
122
+
123
+ if (loggerErrorIndex >= 0) {
124
+ return {
125
+ category: 'logger',
126
+ method: 'logger.error',
127
+ origin: userFunctionName,
128
+ relevantFrameIndex
129
+ };
130
+ }
131
+
132
+ // Otherwise it's a regular rethrow error
133
+ return {
134
+ category: 'rethrow',
135
+ method: 'rethrow',
136
+ origin: userFunctionName,
137
+ relevantFrameIndex
138
+ };
139
+ }
140
+
141
+ // Check if it's a PromiseError (HkPromise)
142
+ if (error.name === 'PromiseError') {
143
+ const hkPromiseMethod = getHkPromiseMethod(cleanedStack);
144
+ return {
145
+ category: 'promise',
146
+ method: hkPromiseMethod ? `hkpromise.${hkPromiseMethod}` : 'hkpromise',
147
+ origin: userFunctionName,
148
+ relevantFrameIndex
149
+ };
150
+ }
151
+
152
+ // Check if it's an HttpError
153
+ if (error.name === 'HttpError') {
154
+ const httpMethod = getHttpMethod(cleanedStack);
155
+ return {
156
+ category: 'http',
157
+ method: httpMethod || 'http',
158
+ origin: userFunctionName,
159
+ relevantFrameIndex
160
+ };
161
+ }
162
+
163
+ // Check if it's a valibot validation error
164
+ if (error.name === 'ValiError' && cleanedStack.length > 0) {
165
+ // Look for our valibotParser wrapper function in the stack
166
+ const valibotFrame = cleanedStack.find(frame =>
167
+ frame.includes('valibotParser')
168
+ );
169
+
170
+ // Also check if it's called via an expect_ function (handle Node.js format)
171
+ const expectFrame = cleanedStack.find(frame =>
172
+ frame.includes('expect_') || frame.includes('Module.expect_')
173
+ );
174
+
175
+ if (valibotFrame || expectFrame) {
176
+ return {
177
+ category: 'validation',
178
+ method: expectFrame ? 'expect' : 'validation',
179
+ origin: userFunctionName,
180
+ relevantFrameIndex
181
+ };
182
+ }
183
+ }
184
+
185
+ // Default case
186
+ return {
187
+ category: 'error',
188
+ method: 'error',
189
+ origin: userFunctionName,
190
+ relevantFrameIndex
191
+ };
192
+ }
193
+
194
+ /**
195
+ * Format error metadata for console display
196
+ *
197
+ * @param {{category: string, method: string, origin?: string|null}} errorMeta - Error metadata
198
+ * @returns {string} Formatted display string (e.g., "httpGet in myFunction")
199
+ */
200
+ export function formatErrorDisplay(errorMeta) {
201
+ if (errorMeta.origin) {
202
+ return `${errorMeta.method} in ${errorMeta.origin}`;
203
+ }
204
+ return errorMeta.method;
205
+ }
206
+
207
+ /**
208
+ * Get the specific HkPromise method that caused the error
209
+ *
210
+ * @param {string[]} cleanedStack - Array of cleaned stack trace frames
211
+ * @returns {string|null} HkPromise method name or null
212
+ */
213
+ export function getHkPromiseMethod(cleanedStack) {
214
+ const hkPromiseFrame = cleanedStack.find(frame =>
215
+ frame.includes('reject@') ||
216
+ frame.includes('tryReject@') ||
217
+ frame.includes('setTimeout@') ||
218
+ frame.includes('cancel@') ||
219
+ frame.includes('tryCancel@')
220
+ );
221
+
222
+ if (!hkPromiseFrame) return null;
223
+
224
+ if (hkPromiseFrame.includes('reject@')) return 'reject';
225
+ if (hkPromiseFrame.includes('tryReject@')) return 'tryReject';
226
+ if (hkPromiseFrame.includes('setTimeout@')) return 'setTimeout';
227
+ if (hkPromiseFrame.includes('cancel@')) return 'cancel';
228
+ if (hkPromiseFrame.includes('tryCancel@')) return 'tryCancel';
229
+
230
+ return null;
231
+ }
232
+
233
+ /**
234
+ * Get the specific HTTP method that caused the error
235
+ *
236
+ * @param {string[]} cleanedStack - Array of cleaned stack trace frames
237
+ * @returns {string|null} HTTP method name or null
238
+ */
239
+ export function getHttpMethod(cleanedStack) {
240
+ const httpFrame = cleanedStack.find(frame =>
241
+ frame.includes('network/http/http-request.js')
242
+ );
243
+
244
+ if (!httpFrame) return null;
245
+
246
+ if (httpFrame.includes('httpGet@')) return 'httpGet';
247
+ if (httpFrame.includes('httpPost@')) return 'httpPost';
248
+ if (httpFrame.includes('httpPut@')) return 'httpPut';
249
+ if (httpFrame.includes('httpDelete@')) return 'httpDelete';
250
+ if (httpFrame.includes('httpPatch@')) return 'httpPatch';
251
+ if (httpFrame.includes('httpOptions@')) return 'httpOptions';
252
+ if (httpFrame.includes('httpRequest@')) return 'httpRequest';
253
+
254
+ return null;
255
+ }
256
+
257
+ /**
258
+ * Extract user function name from stack trace
259
+ *
260
+ * @param {Error} error - The error object
261
+ * @param {string[]} cleanedStack - Array of cleaned stack trace frames
262
+ * @returns {string|null} User function name or null
263
+ */
264
+ export function extractUserFunctionName(error, cleanedStack) {
265
+ // Check if this is a LoggerError - look for the frame after Logger.error
266
+ if (error.name === 'LoggerError' && cleanedStack.length > 1) {
267
+ const loggerErrorIndex = cleanedStack.findIndex(frame =>
268
+ frame.includes('Logger.error') && frame.includes('logger/Logger.js')
269
+ );
270
+ if (loggerErrorIndex >= 0 && loggerErrorIndex + 1 < cleanedStack.length) {
271
+ return parseFunctionName(cleanedStack[loggerErrorIndex + 1]);
272
+ }
273
+ }
274
+
275
+ if (error.name === 'DetailedError' && cleanedStack.length > 1) {
276
+ // Check if this DetailedError was created by Logger.error - look for the frame after Logger.error
277
+ const loggerErrorIndex = cleanedStack.findIndex(frame =>
278
+ (frame.includes('Logger.error') && frame.includes('logger/Logger.js')) ||
279
+ (frame.includes('error@') && frame.includes('logger/Logger.js'))
280
+ );
281
+ if (loggerErrorIndex >= 0 && loggerErrorIndex + 1 < cleanedStack.length) {
282
+ return parseFunctionName(cleanedStack[loggerErrorIndex + 1]);
283
+ }
284
+
285
+ // For rethrow errors, look for the frame after rethrow (handle both formats)
286
+ const rethrowIndex = cleanedStack.findIndex(frame =>
287
+ frame.includes('rethrow@') || frame.includes('at rethrow (')
288
+ );
289
+ if (rethrowIndex >= 0 && rethrowIndex + 1 < cleanedStack.length) {
290
+ return parseFunctionName(cleanedStack[rethrowIndex + 1]);
291
+ }
292
+ }
293
+
294
+ if (error.name === 'PromiseError' && cleanedStack.length > 1) {
295
+ // For PromiseError, look for the frame after HkPromise methods
296
+ const hkPromiseIndex = cleanedStack.findIndex(frame =>
297
+ frame.includes('reject@') ||
298
+ frame.includes('tryReject@') ||
299
+ frame.includes('setTimeout@') ||
300
+ frame.includes('cancel@') ||
301
+ frame.includes('tryCancel@')
302
+ );
303
+ if (hkPromiseIndex >= 0 && hkPromiseIndex + 1 < cleanedStack.length) {
304
+ return parseFunctionName(cleanedStack[hkPromiseIndex + 1]);
305
+ }
306
+ }
307
+
308
+ if (error.name === 'HttpError' && cleanedStack.length > 1) {
309
+ // For HttpError, find the last frame containing http-request.js, then take the next one
310
+ let lastHttpIndex = -1;
311
+ for (let i = 0; i < cleanedStack.length; i++) {
312
+ if (cleanedStack[i].includes('network/http/http-request.js')) {
313
+ lastHttpIndex = i;
314
+ }
315
+ }
316
+ if (lastHttpIndex >= 0 && lastHttpIndex + 1 < cleanedStack.length) {
317
+ return parseFunctionName(cleanedStack[lastHttpIndex + 1]);
318
+ }
319
+ }
320
+
321
+ if (error.name === 'ValiError' && cleanedStack.length > 1) {
322
+ // For validation errors, look for the frame after expect_ function first (handle Node.js format)
323
+ const expectIndex = cleanedStack.findIndex(frame =>
324
+ frame.includes('expect_') || frame.includes('Module.expect_')
325
+ );
326
+ if (expectIndex >= 0 && expectIndex + 1 < cleanedStack.length) {
327
+ return parseFunctionName(cleanedStack[expectIndex + 1]);
328
+ }
329
+
330
+ // If no expect_ function, look for valibotParser wrapper
331
+ const valibotIndex = cleanedStack.findIndex(frame => frame.includes('valibotParser'));
332
+ if (valibotIndex >= 0 && valibotIndex + 1 < cleanedStack.length) {
333
+ return parseFunctionName(cleanedStack[valibotIndex + 1]);
334
+ }
335
+ }
336
+
337
+ // Find the first meaningful function name (skip anonymous functions and framework code)
338
+ for (let i = 0; i < cleanedStack.length; i++) {
339
+ const functionName = parseFunctionName(cleanedStack[i]);
340
+ if (functionName && isMeaningfulFunctionName(functionName)) {
341
+ return functionName;
342
+ }
343
+ }
344
+
345
+ return null;
346
+ }
347
+
348
+ /**
349
+ * Check if function name is meaningful (not anonymous or framework code)
350
+ *
351
+ * @param {string} functionName - Function name to check
352
+ * @returns {boolean} True if the function name is meaningful
353
+ */
354
+ export function isMeaningfulFunctionName(functionName) {
355
+ // Skip empty names, anonymous functions, and framework/internal functions
356
+ if (!functionName ||
357
+ functionName === '' ||
358
+ functionName.includes('<') ||
359
+ functionName.includes('/') ||
360
+ functionName.startsWith('async ') ||
361
+ functionName === 'async' ||
362
+ functionName === 'Promise' ||
363
+ functionName === 'new Promise' ||
364
+ functionName.includes('internal') ||
365
+ functionName.includes('node_modules')) {
366
+ return false;
367
+ }
368
+
369
+ return true;
370
+ }
371
+
372
+ /**
373
+ * Parse function name from stack frame
374
+ *
375
+ * @param {string} frame - Stack trace frame
376
+ * @returns {string|null} Function name or null
377
+ */
378
+ export function parseFunctionName(frame) {
379
+ // Handle both Firefox format: "functionName@file:line:col"
380
+ // and Node.js format: "at functionName (file:line:col)" or "at Module.functionName (file:line:col)"
381
+
382
+ // Firefox format
383
+ const firefoxMatch = frame.match(/^([^@]+)@/);
384
+ if (firefoxMatch) {
385
+ return firefoxMatch[1];
386
+ }
387
+
388
+ // Node.js format
389
+ const nodeMatch = frame.match(/^\s*at\s+(?:Module\.)?([^\s(]+)/);
390
+ if (nodeMatch) {
391
+ return nodeMatch[1];
392
+ }
393
+
394
+ return null;
395
+ }
@@ -1,10 +1,16 @@
1
1
  /**
2
2
  * Pino adapter for server-side logging
3
3
  */
4
-
5
4
  import pino from 'pino';
6
5
  import { dev } from '$app/environment';
7
6
 
7
+ import {
8
+ detectErrorMeta,
9
+ findRelevantFrameIndex,
10
+ formatErrorDisplay,
11
+ parseFunctionName
12
+ } from './formatting.js';
13
+
8
14
  /**
9
15
  * Pino adapter that bridges Logger events to pino
10
16
  */
@@ -21,27 +27,94 @@ export class PinoAdapter {
21
27
  this.#projectRoot = import.meta.env.VITE_PROJECT_ROOT || process.cwd();
22
28
  const baseOptions = {
23
29
  serializers: {
24
- err: (err) => {
30
+ errors: (err) => {
31
+
32
+ /** @type {import('./typedef').ErrorSummary[]} */
25
33
  const chain = [];
34
+ let loggedAt = null;
35
+
26
36
  let current = err;
27
37
  let isFirst = true;
28
38
 
29
- while (current) {
39
+ while (current && current instanceof Error) {
40
+ // Check if this is the first error and it's a LoggerError - extract logging context
41
+ if (isFirst && current.name === 'LoggerError') {
42
+ if (current.stack) {
43
+ const cleanedStackString = this.#cleanStackTrace(current.stack);
44
+ const cleanedStackArray = cleanedStackString
45
+ .split('\n')
46
+ .map((line) => line.trim())
47
+ .filter(
48
+ (line) =>
49
+ line && line !== current.name + ': ' + current.message
50
+ );
51
+
52
+ // For LoggerError, we know it's a logger.error call, so find the relevant frame
53
+ const loggerErrorIndex = cleanedStackArray.findIndex(frame =>
54
+ (frame.includes('Logger.error') && frame.includes('logger/Logger.js')) ||
55
+ (frame.includes('error@') && frame.includes('logger/Logger.js'))
56
+ );
57
+
58
+ if (loggerErrorIndex >= 0 && loggerErrorIndex + 1 < cleanedStackArray.length) {
59
+ const relevantFrame = cleanedStackArray[loggerErrorIndex + 1];
60
+
61
+ // Extract function name from the relevant frame
62
+ // const functionName = parseFunctionName(relevantFrame);
63
+
64
+ // const errorType = functionName ? `logger.error in ${functionName}` : 'logger.error';
65
+ loggedAt = relevantFrame.slice(3); // remove "at "
66
+ }
67
+ }
68
+
69
+ // Skip the LoggerError and move to the actual error
70
+ current = current.cause;
71
+ isFirst = false;
72
+ continue;
73
+ }
30
74
  /** @type {import('./typedef').ErrorSummary} */
31
75
  const serialized = {
32
76
  name: current.name,
33
- message: current.message,
34
- ...(isFirst && {
35
- stack: this.#cleanStackTrace(current.stack)
36
- })
77
+ message: current.message
37
78
  };
38
79
 
80
+ // Add error metadata for structured logging and terminal display
81
+ if (current.stack) {
82
+ // Convert cleaned stack string to array format expected by formatting functions
83
+ const cleanedStackString = this.#cleanStackTrace(current.stack);
84
+ const cleanedStackArray = cleanedStackString
85
+ .split('\n')
86
+ .map((line) => line.trim())
87
+ .filter(
88
+ (line) =>
89
+ line && line !== current.name + ': ' + current.message
90
+ );
91
+
92
+ const errorMeta = detectErrorMeta(current, cleanedStackArray);
93
+ const relevantFrameIndex = findRelevantFrameIndex(
94
+ current,
95
+ cleanedStackArray
96
+ );
97
+
98
+ serialized.meta = errorMeta;
99
+ serialized.errorType = formatErrorDisplay(errorMeta);
100
+
101
+ // Include stack frames for terminal display
102
+ serialized.stackFrames = cleanedStackArray
103
+ .slice(0, 9)
104
+ .map((frame, index) => {
105
+ const marker = index === relevantFrameIndex ? '→' : ' ';
106
+
107
+ return `${marker} ${frame}`;
108
+ });
109
+ }
110
+
39
111
  // Include HttpError-specific properties
40
- if (current.status !== undefined) {
41
- serialized.status = current.status;
112
+ const httpError = /** @type {import('../../../network/errors.js').HttpError} */ (current);
113
+ if (httpError.status !== undefined) {
114
+ serialized.status = httpError.status;
42
115
  }
43
- if (current.details !== undefined) {
44
- serialized.details = current.details;
116
+ if (httpError.details !== undefined) {
117
+ serialized.details = httpError.details;
45
118
  }
46
119
 
47
120
  chain.push(serialized);
@@ -49,19 +122,20 @@ export class PinoAdapter {
49
122
  isFirst = false;
50
123
  }
51
124
 
52
- return { errorChain: chain };
125
+ return loggedAt ? { chain, loggedAt } : chain;
53
126
  }
54
127
  }
55
128
  };
56
129
 
57
130
  // Add error handling for missing pino-pretty in dev
58
- if (dev) {
131
+ if ( dev) {
59
132
  const devOptions = {
60
133
  level: 'debug',
61
134
  transport: {
62
135
  target: 'pino-pretty',
63
136
  options: {
64
- colorize: true
137
+ colorize: true,
138
+ ignore: 'hostname,pid'
65
139
  }
66
140
  }
67
141
  };
@@ -69,7 +143,10 @@ export class PinoAdapter {
69
143
  try {
70
144
  this.pino = pino({ ...baseOptions, ...devOptions, ...options });
71
145
  } catch (error) {
72
- if (error.message.includes('pino-pretty')) {
146
+ if (
147
+ error.message.includes('Cannot find module') &&
148
+ error.message.includes('pino-pretty')
149
+ ) {
73
150
  const errorMessage = `
74
151
  ╭─────────────────────────────────────────────────────────────╮
75
152
  │ Missing Dependency │
@@ -101,16 +178,23 @@ export class PinoAdapter {
101
178
  let cleaned = stack;
102
179
 
103
180
  // Escape special regex characters in the project root path
104
- const escapedRoot = this.#projectRoot.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
105
-
181
+ const escapedRoot = this.#projectRoot.replace(
182
+ /[.*+?^${}()|[\]\\]/g,
183
+ '\\$&'
184
+ );
185
+
106
186
  // Replace project root path with relative path, handling file:// protocol
107
187
  // Match both regular paths and file:// URLs
108
- const rootRegex = new RegExp(`(\\s+at\\s+.*\\()(file://)?${escapedRoot}[\\/\\\\]`, 'g');
188
+ const rootRegex = new RegExp(
189
+ `(\\s+at\\s+.*\\()(file://)?${escapedRoot}[\\/\\\\]`,
190
+ 'g'
191
+ );
109
192
  cleaned = cleaned.replace(rootRegex, '$1');
110
193
 
111
194
  // Simplify pnpm paths: node_modules/.pnpm/package@version_deps/node_modules/package
112
195
  // becomes: node_modules/package
113
- const pnpmRegex = /node_modules\/\.pnpm\/([^@\/]+)@[^\/]+\/node_modules\/\1/g;
196
+ const pnpmRegex =
197
+ /node_modules\/\.pnpm\/([^@\/]+)@[^\/]+\/node_modules\/\1/g;
114
198
  cleaned = cleaned.replace(pnpmRegex, 'node_modules/$1');
115
199
 
116
200
  // Also handle cases where the package name might be different in the final path
@@ -137,11 +221,12 @@ export class PinoAdapter {
137
221
  if (details) {
138
222
  if (details instanceof Error) {
139
223
  // details is directly an error
140
- logData.err = details;
224
+ logData.errors = details;
141
225
  } else if (details.error instanceof Error) {
142
226
  // details has an error property
143
- logData.err = details.error;
227
+ logData.errors = details.error;
144
228
  // Include other details except the error
229
+ // eslint-disable-next-line no-unused-vars
145
230
  const { error, ...otherDetails } = details;
146
231
  if (Object.keys(otherDetails).length > 0) {
147
232
  logData.details = otherDetails;
@@ -152,6 +237,12 @@ export class PinoAdapter {
152
237
  }
153
238
  }
154
239
 
240
+ // Check if we have loggedAt info from the serializer
241
+ if (logData.errors && typeof logData.errors === 'object' && logData.errors.loggedAt) {
242
+ logData.loggedAt = logData.errors.loggedAt;
243
+ logData.errors = logData.errors.chain;
244
+ }
245
+
155
246
  this.pino[level](logData, message);
156
247
  }
157
248
 
@@ -1,5 +1,23 @@
1
1
  declare const _default: {};
2
2
  export default _default;
3
+ export type ErrorSummaryMeta = {
4
+ /**
5
+ * - Error category (rethrow, validation, http, promise, error)
6
+ */
7
+ category: string;
8
+ /**
9
+ * - Specific method (rethrow, expect, httpGet, hkpromise.timeout, etc)
10
+ */
11
+ method: string;
12
+ /**
13
+ * - User function name where error originated
14
+ */
15
+ origin?: string;
16
+ /**
17
+ * - Index of most relevant stack frame to highlight
18
+ */
19
+ relevantFrameIndex?: number;
20
+ };
3
21
  export type ErrorSummary = {
4
22
  /**
5
23
  * - The name of the exception/error
@@ -9,6 +27,10 @@ export type ErrorSummary = {
9
27
  * - The error message
10
28
  */
11
29
  message: string;
30
+ /**
31
+ * - Error meta
32
+ */
33
+ meta?: ErrorSummaryMeta;
12
34
  /**
13
35
  * Stack trace (in debug mode for first exception)
14
36
  */
@@ -21,4 +43,12 @@ export type ErrorSummary = {
21
43
  * - Additional error details (for HttpError instances)
22
44
  */
23
45
  details?: any;
46
+ /**
47
+ * - Formatted error type for display
48
+ */
49
+ errorType?: string;
50
+ /**
51
+ * - Cleaned stack frames for terminal display
52
+ */
53
+ stackFrames?: string[];
24
54
  };
@@ -1,10 +1,21 @@
1
+ /**
2
+ * @typedef {Object} ErrorSummaryMeta
3
+ * @property {string} category - Error category (rethrow, validation, http, promise, error)
4
+ * @property {string} method - Specific method (rethrow, expect, httpGet, hkpromise.timeout, etc)
5
+ * @property {string} [origin] - User function name where error originated
6
+ * @property {number} [relevantFrameIndex] - Index of most relevant stack frame to highlight
7
+ */
8
+
1
9
  /**
2
10
  * @typedef {Object} ErrorSummary
3
11
  * @property {string} name - The name of the exception/error
4
12
  * @property {string} message - The error message
13
+ * @property {ErrorSummaryMeta} [meta] - Error meta
5
14
  * @property {string} [stack] Stack trace (in debug mode for first exception)
6
15
  * @property {number} [status] - HTTP status code (for HttpError instances)
7
16
  * @property {*} [details] - Additional error details (for HttpError instances)
17
+ * @property {string} [errorType] - Formatted error type for display
18
+ * @property {string[]} [stackFrames] - Cleaned stack frames for terminal display
8
19
  */
9
20
 
10
21
  export default {};