@hkdigital/lib-core 0.3.11 → 0.3.13

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 (293) hide show
  1. package/README.md +173 -149
  2. package/dist/assets/autospuiten/car-paint-picker.js +41 -41
  3. package/dist/assets/autospuiten/labels.js +7 -7
  4. package/dist/classes/data/IterableTree.js +242 -242
  5. package/dist/classes/data/Selector.js +190 -190
  6. package/dist/classes/data/index.js +2 -2
  7. package/dist/classes/data/typedef.js +9 -9
  8. package/dist/classes/event-emitter/EventEmitter.js +273 -273
  9. package/dist/classes/event-emitter/index.js +2 -2
  10. package/dist/classes/index.js +4 -4
  11. package/dist/classes/promise/HkPromise.js +384 -384
  12. package/dist/classes/promise/index.js +1 -1
  13. package/dist/classes/stores/SubscribersCount.js +107 -107
  14. package/dist/classes/stores/index.js +1 -1
  15. package/dist/classes/streams/LogTransformStream.js +19 -19
  16. package/dist/classes/streams/ServerEventsStore.js +111 -111
  17. package/dist/classes/streams/TimeStampSource.js +26 -26
  18. package/dist/classes/streams/index.js +3 -3
  19. package/dist/classes/svelte/finite-state-machine/FiniteStateMachine.svelte.js +133 -133
  20. package/dist/classes/svelte/finite-state-machine/index.js +1 -1
  21. package/dist/classes/svelte/index.js +1 -11
  22. package/dist/classes/svelte/loading-state-machine/LoadingStateMachine.svelte.js +109 -109
  23. package/dist/classes/svelte/loading-state-machine/constants.js +16 -16
  24. package/dist/classes/svelte/loading-state-machine/index.js +3 -3
  25. package/dist/config/README.md +197 -196
  26. package/dist/config/generators/imagetools.js +189 -189
  27. package/dist/config/generators/vite.js +148 -142
  28. package/dist/config/imagetools.d.ts +72 -72
  29. package/dist/config/vite.js +4 -4
  30. package/dist/constants/bases/index.js +13 -13
  31. package/dist/constants/http/headers.js +6 -6
  32. package/dist/constants/http/index.js +2 -2
  33. package/dist/constants/http/methods.js +14 -14
  34. package/dist/constants/index.js +6 -6
  35. package/dist/constants/mime/application.js +5 -5
  36. package/dist/constants/mime/audio.js +13 -13
  37. package/dist/constants/mime/image.js +3 -3
  38. package/dist/constants/mime/index.js +4 -4
  39. package/dist/constants/mime/text.js +2 -2
  40. package/dist/constants/regexp/README.md +96 -95
  41. package/dist/constants/regexp/index.js +31 -31
  42. package/dist/constants/regexp/inspiratie.js__ +95 -95
  43. package/dist/constants/regexp/text.d.ts +4 -4
  44. package/dist/constants/regexp/text.js +49 -49
  45. package/dist/constants/regexp/url.js +3 -3
  46. package/dist/constants/regexp/user.js +29 -29
  47. package/dist/constants/states/drag.js +6 -6
  48. package/dist/constants/states/drop.js +6 -6
  49. package/dist/constants/states/index.js +4 -4
  50. package/dist/constants/states/input.js +11 -11
  51. package/dist/constants/states/submit.js +4 -4
  52. package/dist/constants/time/index.js +28 -28
  53. package/dist/css/utilities.css +43 -43
  54. package/dist/design/README.md +405 -405
  55. package/dist/design/config/design-config.js +73 -73
  56. package/dist/design/generators/index.js +288 -288
  57. package/dist/design/index.js +96 -96
  58. package/dist/design/plugins/skeleton.js +208 -208
  59. package/dist/design/tailwind-theme-extend.js +158 -158
  60. package/dist/design/themes/README.md +102 -102
  61. package/dist/design/themes/hkdev/components/blocks/text-block.css +34 -34
  62. package/dist/design/themes/hkdev/components/boxes/game-box.css +11 -11
  63. package/dist/design/themes/hkdev/components/buttons/button-icon-steeze.css +22 -22
  64. package/dist/design/themes/hkdev/components/buttons/button-text.css +32 -32
  65. package/dist/design/themes/hkdev/components/buttons/button.css +146 -146
  66. package/dist/design/themes/hkdev/components/buttons/skip-button.css +5 -5
  67. package/dist/design/themes/hkdev/components/drag-drop/draggable.css +73 -73
  68. package/dist/design/themes/hkdev/components/drag-drop/drop-zone.css +58 -58
  69. package/dist/design/themes/hkdev/components/icons/icon-steeze.css +15 -15
  70. package/dist/design/themes/hkdev/components/inputs/text-input.css +102 -102
  71. package/dist/design/themes/hkdev/components/panels/panel.css +25 -25
  72. package/dist/design/themes/hkdev/components/rows/panel-grid-row.css +4 -4
  73. package/dist/design/themes/hkdev/components/rows/panel-row-2.css +5 -5
  74. package/dist/design/themes/hkdev/components.css +29 -29
  75. package/dist/design/themes/hkdev/debug.css +1 -1
  76. package/dist/design/themes/hkdev/global/layout.css +32 -32
  77. package/dist/design/themes/hkdev/global/on-colors.css +32 -32
  78. package/dist/design/themes/hkdev/globals.css +3 -3
  79. package/dist/design/themes/hkdev/responsive.css +12 -12
  80. package/dist/design/themes/hkdev/theme-ext.js +12 -12
  81. package/dist/design/themes/hkdev/theme.css +218 -218
  82. package/dist/design/utils/clamp.js +66 -66
  83. package/dist/design/utils/root-vars.js +102 -102
  84. package/dist/design/utils/scaling.js +228 -228
  85. package/dist/design/utils/states.js +22 -22
  86. package/dist/errors/api.js +9 -9
  87. package/dist/errors/generic.js +20 -20
  88. package/dist/errors/http.js +16 -16
  89. package/dist/errors/index.js +5 -5
  90. package/dist/errors/jwt.js +5 -5
  91. package/dist/errors/promise.js +25 -25
  92. package/dist/logging/README.md +158 -0
  93. package/dist/logging/index.d.ts +3 -1
  94. package/dist/logging/index.js +11 -7
  95. package/dist/logging/internal/adapters/console.js +114 -114
  96. package/dist/logging/internal/adapters/index.js +2 -2
  97. package/dist/logging/internal/adapters/pino.js +160 -142
  98. package/dist/logging/internal/adapters/typedef.js +10 -10
  99. package/dist/logging/internal/{unified-logger/constants.js → constants.js} +22 -22
  100. package/dist/logging/internal/factories/client.d.ts +1 -1
  101. package/dist/logging/internal/factories/client.js +21 -21
  102. package/dist/logging/internal/factories/server.d.ts +1 -1
  103. package/dist/logging/internal/factories/server.js +22 -22
  104. package/dist/logging/internal/factories/universal.d.ts +2 -2
  105. package/dist/logging/internal/factories/universal.js +22 -22
  106. package/dist/logging/internal/{unified-logger → logger}/Logger.d.ts +2 -2
  107. package/dist/logging/internal/{unified-logger → logger}/Logger.js +217 -217
  108. package/dist/logging/internal/logger/index.d.ts +1 -0
  109. package/dist/logging/internal/logger/index.js +1 -0
  110. package/dist/logging/internal/{unified-logger/typedef.d.ts → typedef.d.ts} +2 -1
  111. package/dist/logging/internal/{unified-logger/typedef.js → typedef.js} +21 -17
  112. package/dist/network/README.md +172 -172
  113. package/dist/network/cache/IndexedDbCache.js +1407 -1407
  114. package/dist/network/cache/MemoryResponseCache.js +138 -138
  115. package/dist/network/cache/index.js +5 -5
  116. package/dist/network/cache/typedef.js +41 -41
  117. package/dist/network/cache.js +3 -3
  118. package/dist/network/http/caching.js +261 -261
  119. package/dist/network/http/errors.js +97 -97
  120. package/dist/network/http/headers.js +75 -75
  121. package/dist/network/http/http-request.js +578 -578
  122. package/dist/network/http/index.js +22 -22
  123. package/dist/network/http/json-request.js +224 -224
  124. package/dist/network/http/mocks.js +65 -65
  125. package/dist/network/http/response.js +318 -318
  126. package/dist/network/http/test-data__/content-length-test-hkdigital-small.V4HfZyBQ.avif +0 -0
  127. package/dist/network/http/typedef.js +93 -93
  128. package/dist/network/http/url.js +52 -52
  129. package/dist/network/http.js +5 -5
  130. package/dist/network/loaders/README.md +254 -254
  131. package/dist/network/loaders/audio/AudioLoader.svelte.js +58 -58
  132. package/dist/network/loaders/audio/AudioScene.svelte.js +324 -324
  133. package/dist/network/loaders/audio/mocks.js +35 -35
  134. package/dist/network/loaders/audio.js +1 -1
  135. package/dist/network/loaders/image/ImageLoader.svelte.js +44 -44
  136. package/dist/network/loaders/image/ImageScene.svelte.js +248 -248
  137. package/dist/network/loaders/image/ImageVariantsLoader.svelte.js +150 -150
  138. package/dist/network/loaders/image/index.js +4 -4
  139. package/dist/network/loaders/image/mocks.js +35 -35
  140. package/dist/network/loaders/image/typedef.js +8 -8
  141. package/dist/network/loaders/image/utils/index.js +86 -86
  142. package/dist/network/loaders/image.js +7 -7
  143. package/dist/network/loaders/typedef.js +38 -38
  144. package/dist/network/loaders.js +2 -2
  145. package/dist/network/states/NetworkLoader.svelte.js +338 -338
  146. package/dist/network/states/constants.js +3 -3
  147. package/dist/network/states/index.js +3 -3
  148. package/dist/network/states/mocks.js +30 -30
  149. package/dist/network/states/typedef.js +8 -8
  150. package/dist/network/typedef.js +9 -9
  151. package/dist/services/README.md +200 -0
  152. package/dist/services/index.d.ts +6 -1
  153. package/dist/services/index.js +8 -1
  154. package/dist/services/{internal/service-base → service-base}/ServiceBase.d.ts +2 -2
  155. package/dist/services/{internal/service-base → service-base}/ServiceBase.js +462 -462
  156. package/dist/services/{internal/service-base → service-base}/constants.d.ts +0 -12
  157. package/dist/services/{internal/service-base → service-base}/constants.js +98 -110
  158. package/dist/services/{internal/service-base → service-base}/index.js +3 -3
  159. package/dist/services/{internal/service-base → service-base}/typedef.d.ts +1 -1
  160. package/dist/services/{internal/service-base → service-base}/typedef.js +101 -101
  161. package/dist/services/{internal/service-manager → service-manager}/ServiceManager.d.ts +2 -2
  162. package/dist/services/{internal/service-manager → service-manager}/ServiceManager.js +608 -608
  163. package/dist/services/{internal/service-manager → service-manager}/constants.js +6 -6
  164. package/dist/services/{internal/service-manager → service-manager}/typedef.js +90 -90
  165. package/dist/states/index.js +1 -1
  166. package/dist/states/navigation.svelte.js +55 -55
  167. package/dist/stores/index.js +1 -1
  168. package/dist/stores/theme.js +80 -80
  169. package/dist/typedef/context.js +6 -6
  170. package/dist/typedef/drag.js +25 -25
  171. package/dist/typedef/drop.js +12 -12
  172. package/dist/typedef/index.d.ts +1 -0
  173. package/dist/typedef/index.js +4 -4
  174. package/dist/ui/components/button-group/ButtonGroup.svelte +82 -82
  175. package/dist/ui/components/button-group/typedef.js +10 -10
  176. package/dist/ui/components/compare-left-right/CompareLeftRight.svelte +179 -179
  177. package/dist/ui/components/compare-left-right/index.js +1 -1
  178. package/dist/ui/components/game-box/GameBox.svelte +577 -577
  179. package/dist/ui/components/game-box/gamebox.util.js +83 -83
  180. package/dist/ui/components/hk-app-layout/HkAppLayout.state.svelte.js +25 -25
  181. package/dist/ui/components/hk-app-layout/HkAppLayout.svelte +251 -251
  182. package/dist/ui/components/image-box/ImageBox.svelte +210 -210
  183. package/dist/ui/components/image-box/index.js +5 -5
  184. package/dist/ui/components/image-box/typedef.js +32 -32
  185. package/dist/ui/components/index.js +23 -23
  186. package/dist/ui/components/presenter/ImageSlide.svelte +64 -64
  187. package/dist/ui/components/presenter/Presenter.state.svelte.js +638 -638
  188. package/dist/ui/components/presenter/Presenter.svelte +142 -142
  189. package/dist/ui/components/presenter/constants.js +7 -7
  190. package/dist/ui/components/presenter/index.js +10 -10
  191. package/dist/ui/components/presenter/typedef.js +106 -106
  192. package/dist/ui/components/presenter/util.js +210 -210
  193. package/dist/ui/components/virtual-viewport/VirtualViewport.svelte +196 -196
  194. package/dist/ui/primitives/area/HkArea.svelte +49 -49
  195. package/dist/ui/primitives/area/HkGridArea.svelte +77 -77
  196. package/dist/ui/primitives/area/index.js +2 -2
  197. package/dist/ui/primitives/buttons/button/Button.svelte +82 -82
  198. package/dist/ui/primitives/buttons/button-icon-steeze/SteezeIconButton.svelte +30 -30
  199. package/dist/ui/primitives/buttons/button-text/TextButton.svelte +21 -21
  200. package/dist/ui/primitives/buttons/index.js +3 -3
  201. package/dist/ui/primitives/debug/debug-panel-design-scaling/DebugPanelDesignScaling.svelte +146 -146
  202. package/dist/ui/primitives/debug/index.js +1 -1
  203. package/dist/ui/primitives/drag-drop/DragController.js +44 -44
  204. package/dist/ui/primitives/drag-drop/DragDropContext.svelte +111 -111
  205. package/dist/ui/primitives/drag-drop/Draggable.svelte +519 -519
  206. package/dist/ui/primitives/drag-drop/DropZone.svelte +258 -258
  207. package/dist/ui/primitives/drag-drop/DropZoneArea.svelte +119 -119
  208. package/dist/ui/primitives/drag-drop/DropZoneList.svelte +125 -125
  209. package/dist/ui/primitives/drag-drop/actions.js +26 -26
  210. package/dist/ui/primitives/drag-drop/drag-state.svelte.js +322 -322
  211. package/dist/ui/primitives/drag-drop/index.js +7 -7
  212. package/dist/ui/primitives/drag-drop/util.js +85 -85
  213. package/dist/ui/primitives/hkdev/blocks/TextBlock.svelte +46 -46
  214. package/dist/ui/primitives/hkdev/buttons/CheckButton.svelte +62 -62
  215. package/dist/ui/primitives/icons/HkIcon.svelte +86 -86
  216. package/dist/ui/primitives/icons/HkTabIcon.svelte +116 -116
  217. package/dist/ui/primitives/icons/SteezeIcon.svelte +97 -97
  218. package/dist/ui/primitives/icons/index.js +6 -6
  219. package/dist/ui/primitives/icons/typedef.js +16 -16
  220. package/dist/ui/primitives/index.js +2 -2
  221. package/dist/ui/primitives/inputs/index.js +1 -1
  222. package/dist/ui/primitives/inputs/text-input/TestTextInput.svelte__ +102 -0
  223. package/dist/ui/primitives/inputs/text-input/TextInput.svelte +223 -223
  224. package/dist/ui/primitives/inputs/text-input/TextInput.svelte___ +83 -0
  225. package/dist/ui/primitives/inputs/text-input/assets/IconInvalid.svelte +14 -14
  226. package/dist/ui/primitives/inputs/text-input/assets/IconValid.svelte +12 -12
  227. package/dist/ui/primitives/layout/grid-layers/GridLayers.svelte +63 -63
  228. package/dist/ui/primitives/layout/grid-layers/GridLayers.svelte__heightFrom__ +372 -0
  229. package/dist/ui/primitives/layout/grid-layers/util.js +74 -74
  230. package/dist/ui/primitives/layout/index.js +1 -1
  231. package/dist/ui/primitives/panels/index.js +1 -1
  232. package/dist/ui/primitives/panels/panel/Panel.svelte +43 -43
  233. package/dist/ui/primitives/rows/index.js +3 -3
  234. package/dist/ui/primitives/rows/panel-grid-row/PanelGridRow.svelte +104 -104
  235. package/dist/ui/primitives/rows/panel-row-2/PanelRow2.svelte +40 -40
  236. package/dist/ui/primitives/tab-bar/HkTabBar.state.svelte.js +149 -149
  237. package/dist/ui/primitives/tab-bar/HkTabBar.svelte +74 -74
  238. package/dist/ui/primitives/tab-bar/HkTabBarSelector.state.svelte.js +93 -93
  239. package/dist/ui/primitives/tab-bar/HkTabBarSelector.svelte +49 -49
  240. package/dist/ui/primitives/tab-bar/index.js +17 -17
  241. package/dist/ui/primitives/tab-bar/typedef.js +11 -11
  242. package/dist/util/array/index.js +436 -436
  243. package/dist/util/bases/base58.js +262 -262
  244. package/dist/util/bases/index.js +1 -1
  245. package/dist/util/compare/index.js +247 -247
  246. package/dist/util/css/css-vars.js +83 -83
  247. package/dist/util/css/index.js +1 -1
  248. package/dist/util/env/index.js +9 -9
  249. package/dist/util/exceptions/index.d.ts +4 -3
  250. package/dist/util/exceptions/index.js +26 -23
  251. package/dist/util/expect/arrays.js +47 -47
  252. package/dist/util/expect/index.js +259 -259
  253. package/dist/util/expect/primitives.js +55 -55
  254. package/dist/util/expect/url.js +60 -60
  255. package/dist/util/function/index.js +218 -218
  256. package/dist/util/geo/index.js +26 -26
  257. package/dist/util/index.js +7 -7
  258. package/dist/util/is/index.js +147 -147
  259. package/dist/util/iterate/index.js +204 -204
  260. package/dist/util/object/index.js +1345 -1345
  261. package/dist/util/singleton/index.js +97 -97
  262. package/dist/util/string/array-path.js +75 -75
  263. package/dist/util/string/convert.js +54 -54
  264. package/dist/util/string/fs.js +226 -226
  265. package/dist/util/string/index.js +5 -5
  266. package/dist/util/string/interpolate.js +61 -61
  267. package/dist/util/string/pad.js +10 -10
  268. package/dist/util/svelte/index.js +4 -4
  269. package/dist/util/svelte/loading/loading-tracker.svelte.js +108 -108
  270. package/dist/util/svelte/observe/index.js +49 -49
  271. package/dist/util/svelte/state-context/index.js +117 -117
  272. package/dist/util/svelte/wait/index.js +38 -38
  273. package/dist/util/sveltekit/index.js +1 -1
  274. package/dist/util/sveltekit/route-folders/index.js +101 -101
  275. package/dist/util/time/index.js +328 -328
  276. package/dist/util/unique/index.js +231 -231
  277. package/dist/valibot/README.md +61 -50
  278. package/dist/valibot/index.js +8 -8
  279. package/dist/valibot/parsers/date.js__ +10 -0
  280. package/dist/valibot/parsers/email.d.ts +12 -0
  281. package/dist/valibot/parsers/email.js +34 -0
  282. package/dist/valibot/parsers/url.js +110 -110
  283. package/dist/valibot/parsers/user.js +23 -23
  284. package/dist/valibot/parsers.js +3 -3
  285. package/package.json +131 -131
  286. package/dist/logging/internal/unified-logger/index.d.ts +0 -3
  287. package/dist/logging/internal/unified-logger/index.js +0 -6
  288. package/dist/services/internal/index.d.ts +0 -6
  289. package/dist/services/internal/index.js +0 -8
  290. /package/dist/logging/internal/{unified-logger/constants.d.ts → constants.d.ts} +0 -0
  291. /package/dist/services/{internal/service-base → service-base}/index.d.ts +0 -0
  292. /package/dist/services/{internal/service-manager → service-manager}/constants.d.ts +0 -0
  293. /package/dist/services/{internal/service-manager → service-manager}/typedef.d.ts +0 -0
@@ -1,328 +1,328 @@
1
- /**
2
- * time.js
3
- *
4
- * @description
5
- * This file contains time related functionality
6
- *
7
- * @example
8
- *
9
- * import { delay, now } from './time.js';
10
- *
11
- * async function test()
12
- * {
13
- * console.log( `Current timestamp [${now()}]` );
14
- *
15
- * await delay( 1000 );
16
- *
17
- * console.log( `Current timestamp [${now()}]` );
18
- * }
19
- */
20
-
21
- /**
22
- * FIXME: use Intl.DateTimeFormat instead of custom conversions
23
- *
24
- * e.g.
25
- * return new Intl.DateTimeFormat('nl-NL', {
26
- * month: "long",
27
- * timeZone: 'Europe/Amsterdam'
28
- * }).format(d);
29
- */
30
-
31
- import {
32
- SECOND_MS,
33
- MINUTE_MS,
34
- HOUR_MS,
35
- DAY_MS,
36
- TIME_2025_01_01
37
- } from '../../constants/time/index.js';
38
-
39
- import * as expect from '../expect';
40
- import { HkPromise } from '../../classes/promise/index.js';
41
-
42
- /**
43
- * Returns a promise that resolves after a specified timeout
44
- * - If the returned promise is rejected, the timeout is cancelled
45
- *
46
- * @param {number} delayOrMinDelayMs
47
- * Number of milliseconds to wait before promise resolves
48
- *
49
- * @param {number} [maxDelayMs=delayOrMinDelayMs]
50
- * Maximum number of milliseconds to wait before the returned promise
51
- * resolves. If this parameter is set, the delay will be chosen randomly
52
- * between the values [delayOrMinDelayMs, maxDelayMs]
53
- *
54
- * @returns {HkPromise} promise that resolves after a specified timeout
55
- */
56
- export function delay(delayOrMinDelayMs, maxDelayMs) {
57
- expect.number(delayOrMinDelayMs);
58
-
59
- if (maxDelayMs) {
60
- //
61
- // maxDelayMs was set -> generate random delay
62
- //
63
- if (maxDelayMs > delayOrMinDelayMs) {
64
- delayOrMinDelayMs = Math.floor(
65
- delayOrMinDelayMs + Math.random() * (maxDelayMs - delayOrMinDelayMs)
66
- );
67
- }
68
- }
69
-
70
- const promise = new HkPromise();
71
-
72
- let timer = setTimeout(() => {
73
- timer = null;
74
- promise.resolve();
75
- }, delayOrMinDelayMs);
76
-
77
- // Register catch method to cancel timer when promise is rejected
78
- promise.catch(() => {
79
- if (timer) {
80
- clearTimeout(timer);
81
- timer = null;
82
- }
83
- });
84
-
85
- return promise;
86
- }
87
-
88
- /**
89
- * Get the number of milliseconds since the specified time stamp of the default
90
- * reference time stamp TIME_2025_01_01
91
- *
92
- * @param {number} [sinceMs=TIME_2025_01_01]
93
- *
94
- * @returns {number} number of milliseconds since the specified time
95
- */
96
- export function sinceMs(sinceMs = TIME_2025_01_01) {
97
- return Date.now() - sinceMs;
98
- }
99
-
100
- /**
101
- * Get a string that represents the time in a readable
102
- * string format: [DD:][HH:]MM:SS.mmm
103
- *
104
- * @param {number} timeMs [description]
105
- *
106
- * @returns {string} time in human readable format
107
- */
108
- export function timeToString(timeMs) {
109
- const days = Math.floor(timeMs / DAY_MS);
110
-
111
- let restMs = timeMs - days * DAY_MS;
112
-
113
- const hours = Math.floor(restMs / HOUR_MS);
114
-
115
- restMs = restMs - hours * HOUR_MS;
116
-
117
- const minutes = Math.floor(restMs / MINUTE_MS);
118
-
119
- restMs = restMs - minutes * MINUTE_MS;
120
-
121
- const seconds = Math.floor(restMs / SECOND_MS);
122
-
123
- restMs = restMs - seconds * SECOND_MS;
124
-
125
- let str = '';
126
-
127
- if (days) {
128
- str += `${days.toString().padStart(2, '0')}:`;
129
- str += `${hours.toString().padStart(2, '0')}:`;
130
- } else if (hours) {
131
- str += `${hours.toString().padStart(2, '0')}:`;
132
- }
133
-
134
- str += `${minutes.toString().padStart(2, '0')}:`;
135
- str += `${seconds.toString().padStart(2, '0')}.`;
136
- str += `${restMs.toString().padStart(3, '0')}`;
137
-
138
- return str;
139
- }
140
-
141
- /**
142
- * Returns a Date object
143
- * - The input can be a Date object or a numeric timestamp
144
- *
145
- * @param {Date|number} dateOrTimestamp
146
- *
147
- * @returns {Date} date object
148
- */
149
- export function toDate(dateOrTimestamp) {
150
- if (dateOrTimestamp instanceof Date) {
151
- return dateOrTimestamp;
152
- }
153
-
154
- if (typeof dateOrTimestamp === 'number') {
155
- return new Date(dateOrTimestamp);
156
- }
157
-
158
- throw new Error('Missing or invalid parameter [dateOrTimestamp]');
159
- }
160
-
161
- /**
162
- * Get the ISO 8601 week number of the specified date
163
- *
164
- * @see https://stackoverflow.com
165
- * /questions/6117814/get-week-of-year-in-javascript-like-in-php
166
- *
167
- * @param {Date|number} dateOrTimestamp
168
- *
169
- * @returns {number} week number
170
- */
171
- export function getWeekNumber(dateOrTimestamp) {
172
- const date = toDate(dateOrTimestamp);
173
-
174
- //
175
- // Create a copy of this date object
176
- //
177
- const target = new Date(date.valueOf());
178
-
179
- //
180
- // ISO week date weeks start on Monday, so correct the day number
181
- //
182
- const dayNumber = (date.getDay() + 6) % 7;
183
-
184
- //
185
- // ISO 8601 states that week 1 is the week with the first Thursday
186
- // of that year.
187
- //
188
- // Set the target date to the Thursday in the target week
189
- //
190
- target.setDate(target.getDate() - dayNumber + 3);
191
-
192
- //
193
- // Store the millisecond value of the target date
194
- //
195
- const firstThursday = target.valueOf();
196
-
197
- // Set the target to the first Thursday of the year
198
- // First, set the target to January 1st
199
- target.setMonth(0, 1);
200
-
201
- //
202
- // Not a Thursday? Correct the date to the next Thursday
203
- //
204
- if (target.getDay() !== 4) {
205
- target.setMonth(0, 1 + ((4 - target.getDay() + 7) % 7));
206
- }
207
-
208
- //
209
- // The week number is the number of weeks between the first Thursday
210
- // of the year and the Thursday in the target week
211
- // (604800000 = 7 * 24 * 3600 * 1000)
212
- //
213
- return 1 + Math.ceil((firstThursday - target.getTime()) / 604800000);
214
- }
215
-
216
- /**
217
- * Get the name of the month
218
- * - Returns the month name using Intl.DateTimeFormat
219
- * - By default uses English locale, but locale can be specified
220
- *
221
- * @param {Date|number} dateOrTimestamp - Date object or timestamp
222
- * @param {string} [locale='nl-NL'] - The locale to use for the month name
223
- *
224
- * @param {Object} [options]
225
- * @param {'numeric'|'2-digit'|'narrow'|'short'|'long'} [options.month='long']
226
- * @param {string} [options.timeZone] - Optional timezone
227
- *
228
- * @returns {string} name of the month in the specified locale
229
- */
230
- export function getMonthName(
231
- dateOrTimestamp,
232
- locale = 'nl-NL',
233
- options = { month: 'long' }
234
- ) {
235
- const date = toDate(dateOrTimestamp);
236
-
237
- // Create formatter with provided locale and options
238
- // @ts-ignore - TypeScript kan hier strikter zijn dan nodig met de options
239
- const formatter = new Intl.DateTimeFormat(locale, {
240
- month: options?.month || 'long',
241
- ...(options?.timeZone ? { timeZone: options.timeZone } : {})
242
- });
243
-
244
- return formatter.format(date);
245
- }
246
-
247
- /**
248
- * Get the name of the day of the week
249
- * - Returns the day name using Intl.DateTimeFormat
250
- * - By default uses English locale, but locale can be specified
251
- *
252
- * @param {Date|number} dateOrTimestamp - Date object or timestamp
253
- * @param {string} [locale='nl-NL'] - The locale to use for the day name
254
- *
255
- * @param {Object} [options]
256
- * @param {'narrow'|'short'|'long'} [options.weekday='long']
257
- * @param {string} [options.timeZone] - Optional timezone
258
- *
259
- * @returns {string} name of the day in the specified locale
260
- */
261
- export function getDayName(
262
- dateOrTimestamp,
263
- locale = 'nl-NL',
264
- options = { weekday: 'long' }
265
- ) {
266
- const date = toDate(dateOrTimestamp);
267
-
268
- // Create formatter with provided locale and options
269
- // @ts-ignore - TypeScript kan hier strikter zijn dan nodig met de options
270
- const formatter = new Intl.DateTimeFormat(locale, {
271
- weekday: options?.weekday || 'long',
272
- ...(options?.timeZone ? { timeZone: options.timeZone } : {})
273
- });
274
-
275
- return formatter.format(date);
276
- }
277
-
278
- /**
279
- * Return the timestamp of the start of the day
280
- * - Midnight
281
- *
282
- * @param {Date|number} [dateOrTimestamp]
283
- *
284
- * @returns {number} timestamp of start of the day (00:00:00:0000)
285
- */
286
- export function getTimeAtStartOfDay(dateOrTimestamp) {
287
- let d;
288
-
289
- if (dateOrTimestamp) {
290
- d = toDate(dateOrTimestamp);
291
- } else {
292
- // today, now
293
- d = new Date();
294
- }
295
-
296
- d.setHours(0);
297
- d.setMinutes(0);
298
- d.setSeconds(0);
299
- d.setMilliseconds(0);
300
-
301
- return d.getTime();
302
- }
303
-
304
- /**
305
- * Return the timestamp of the end of the day
306
- * - Midnight - 1 millisecond
307
- *
308
- * @param {Date|number} [dateOrTimestamp]
309
- *
310
- * @returns {number} timestamp of start of the day
311
- */
312
- export function getTimeAtEndOfDay(dateOrTimestamp) {
313
- let d;
314
-
315
- if (dateOrTimestamp) {
316
- d = toDate(dateOrTimestamp);
317
- } else {
318
- // today, now
319
- d = new Date();
320
- }
321
-
322
- d.setHours(23);
323
- d.setMinutes(59);
324
- d.setSeconds(59);
325
- d.setMilliseconds(999);
326
-
327
- return d.getTime();
328
- }
1
+ /**
2
+ * time.js
3
+ *
4
+ * @description
5
+ * This file contains time related functionality
6
+ *
7
+ * @example
8
+ *
9
+ * import { delay, now } from './time.js';
10
+ *
11
+ * async function test()
12
+ * {
13
+ * console.log( `Current timestamp [${now()}]` );
14
+ *
15
+ * await delay( 1000 );
16
+ *
17
+ * console.log( `Current timestamp [${now()}]` );
18
+ * }
19
+ */
20
+
21
+ /**
22
+ * FIXME: use Intl.DateTimeFormat instead of custom conversions
23
+ *
24
+ * e.g.
25
+ * return new Intl.DateTimeFormat('nl-NL', {
26
+ * month: "long",
27
+ * timeZone: 'Europe/Amsterdam'
28
+ * }).format(d);
29
+ */
30
+
31
+ import {
32
+ SECOND_MS,
33
+ MINUTE_MS,
34
+ HOUR_MS,
35
+ DAY_MS,
36
+ TIME_2025_01_01
37
+ } from '../../constants/time/index.js';
38
+
39
+ import * as expect from '../expect';
40
+ import { HkPromise } from '../../classes/promise/index.js';
41
+
42
+ /**
43
+ * Returns a promise that resolves after a specified timeout
44
+ * - If the returned promise is rejected, the timeout is cancelled
45
+ *
46
+ * @param {number} delayOrMinDelayMs
47
+ * Number of milliseconds to wait before promise resolves
48
+ *
49
+ * @param {number} [maxDelayMs=delayOrMinDelayMs]
50
+ * Maximum number of milliseconds to wait before the returned promise
51
+ * resolves. If this parameter is set, the delay will be chosen randomly
52
+ * between the values [delayOrMinDelayMs, maxDelayMs]
53
+ *
54
+ * @returns {HkPromise} promise that resolves after a specified timeout
55
+ */
56
+ export function delay(delayOrMinDelayMs, maxDelayMs) {
57
+ expect.number(delayOrMinDelayMs);
58
+
59
+ if (maxDelayMs) {
60
+ //
61
+ // maxDelayMs was set -> generate random delay
62
+ //
63
+ if (maxDelayMs > delayOrMinDelayMs) {
64
+ delayOrMinDelayMs = Math.floor(
65
+ delayOrMinDelayMs + Math.random() * (maxDelayMs - delayOrMinDelayMs)
66
+ );
67
+ }
68
+ }
69
+
70
+ const promise = new HkPromise();
71
+
72
+ let timer = setTimeout(() => {
73
+ timer = null;
74
+ promise.resolve();
75
+ }, delayOrMinDelayMs);
76
+
77
+ // Register catch method to cancel timer when promise is rejected
78
+ promise.catch(() => {
79
+ if (timer) {
80
+ clearTimeout(timer);
81
+ timer = null;
82
+ }
83
+ });
84
+
85
+ return promise;
86
+ }
87
+
88
+ /**
89
+ * Get the number of milliseconds since the specified time stamp of the default
90
+ * reference time stamp TIME_2025_01_01
91
+ *
92
+ * @param {number} [sinceMs=TIME_2025_01_01]
93
+ *
94
+ * @returns {number} number of milliseconds since the specified time
95
+ */
96
+ export function sinceMs(sinceMs = TIME_2025_01_01) {
97
+ return Date.now() - sinceMs;
98
+ }
99
+
100
+ /**
101
+ * Get a string that represents the time in a readable
102
+ * string format: [DD:][HH:]MM:SS.mmm
103
+ *
104
+ * @param {number} timeMs [description]
105
+ *
106
+ * @returns {string} time in human readable format
107
+ */
108
+ export function timeToString(timeMs) {
109
+ const days = Math.floor(timeMs / DAY_MS);
110
+
111
+ let restMs = timeMs - days * DAY_MS;
112
+
113
+ const hours = Math.floor(restMs / HOUR_MS);
114
+
115
+ restMs = restMs - hours * HOUR_MS;
116
+
117
+ const minutes = Math.floor(restMs / MINUTE_MS);
118
+
119
+ restMs = restMs - minutes * MINUTE_MS;
120
+
121
+ const seconds = Math.floor(restMs / SECOND_MS);
122
+
123
+ restMs = restMs - seconds * SECOND_MS;
124
+
125
+ let str = '';
126
+
127
+ if (days) {
128
+ str += `${days.toString().padStart(2, '0')}:`;
129
+ str += `${hours.toString().padStart(2, '0')}:`;
130
+ } else if (hours) {
131
+ str += `${hours.toString().padStart(2, '0')}:`;
132
+ }
133
+
134
+ str += `${minutes.toString().padStart(2, '0')}:`;
135
+ str += `${seconds.toString().padStart(2, '0')}.`;
136
+ str += `${restMs.toString().padStart(3, '0')}`;
137
+
138
+ return str;
139
+ }
140
+
141
+ /**
142
+ * Returns a Date object
143
+ * - The input can be a Date object or a numeric timestamp
144
+ *
145
+ * @param {Date|number} dateOrTimestamp
146
+ *
147
+ * @returns {Date} date object
148
+ */
149
+ export function toDate(dateOrTimestamp) {
150
+ if (dateOrTimestamp instanceof Date) {
151
+ return dateOrTimestamp;
152
+ }
153
+
154
+ if (typeof dateOrTimestamp === 'number') {
155
+ return new Date(dateOrTimestamp);
156
+ }
157
+
158
+ throw new Error('Missing or invalid parameter [dateOrTimestamp]');
159
+ }
160
+
161
+ /**
162
+ * Get the ISO 8601 week number of the specified date
163
+ *
164
+ * @see https://stackoverflow.com
165
+ * /questions/6117814/get-week-of-year-in-javascript-like-in-php
166
+ *
167
+ * @param {Date|number} dateOrTimestamp
168
+ *
169
+ * @returns {number} week number
170
+ */
171
+ export function getWeekNumber(dateOrTimestamp) {
172
+ const date = toDate(dateOrTimestamp);
173
+
174
+ //
175
+ // Create a copy of this date object
176
+ //
177
+ const target = new Date(date.valueOf());
178
+
179
+ //
180
+ // ISO week date weeks start on Monday, so correct the day number
181
+ //
182
+ const dayNumber = (date.getDay() + 6) % 7;
183
+
184
+ //
185
+ // ISO 8601 states that week 1 is the week with the first Thursday
186
+ // of that year.
187
+ //
188
+ // Set the target date to the Thursday in the target week
189
+ //
190
+ target.setDate(target.getDate() - dayNumber + 3);
191
+
192
+ //
193
+ // Store the millisecond value of the target date
194
+ //
195
+ const firstThursday = target.valueOf();
196
+
197
+ // Set the target to the first Thursday of the year
198
+ // First, set the target to January 1st
199
+ target.setMonth(0, 1);
200
+
201
+ //
202
+ // Not a Thursday? Correct the date to the next Thursday
203
+ //
204
+ if (target.getDay() !== 4) {
205
+ target.setMonth(0, 1 + ((4 - target.getDay() + 7) % 7));
206
+ }
207
+
208
+ //
209
+ // The week number is the number of weeks between the first Thursday
210
+ // of the year and the Thursday in the target week
211
+ // (604800000 = 7 * 24 * 3600 * 1000)
212
+ //
213
+ return 1 + Math.ceil((firstThursday - target.getTime()) / 604800000);
214
+ }
215
+
216
+ /**
217
+ * Get the name of the month
218
+ * - Returns the month name using Intl.DateTimeFormat
219
+ * - By default uses English locale, but locale can be specified
220
+ *
221
+ * @param {Date|number} dateOrTimestamp - Date object or timestamp
222
+ * @param {string} [locale='nl-NL'] - The locale to use for the month name
223
+ *
224
+ * @param {Object} [options]
225
+ * @param {'numeric'|'2-digit'|'narrow'|'short'|'long'} [options.month='long']
226
+ * @param {string} [options.timeZone] - Optional timezone
227
+ *
228
+ * @returns {string} name of the month in the specified locale
229
+ */
230
+ export function getMonthName(
231
+ dateOrTimestamp,
232
+ locale = 'nl-NL',
233
+ options = { month: 'long' }
234
+ ) {
235
+ const date = toDate(dateOrTimestamp);
236
+
237
+ // Create formatter with provided locale and options
238
+ // @ts-ignore - TypeScript kan hier strikter zijn dan nodig met de options
239
+ const formatter = new Intl.DateTimeFormat(locale, {
240
+ month: options?.month || 'long',
241
+ ...(options?.timeZone ? { timeZone: options.timeZone } : {})
242
+ });
243
+
244
+ return formatter.format(date);
245
+ }
246
+
247
+ /**
248
+ * Get the name of the day of the week
249
+ * - Returns the day name using Intl.DateTimeFormat
250
+ * - By default uses English locale, but locale can be specified
251
+ *
252
+ * @param {Date|number} dateOrTimestamp - Date object or timestamp
253
+ * @param {string} [locale='nl-NL'] - The locale to use for the day name
254
+ *
255
+ * @param {Object} [options]
256
+ * @param {'narrow'|'short'|'long'} [options.weekday='long']
257
+ * @param {string} [options.timeZone] - Optional timezone
258
+ *
259
+ * @returns {string} name of the day in the specified locale
260
+ */
261
+ export function getDayName(
262
+ dateOrTimestamp,
263
+ locale = 'nl-NL',
264
+ options = { weekday: 'long' }
265
+ ) {
266
+ const date = toDate(dateOrTimestamp);
267
+
268
+ // Create formatter with provided locale and options
269
+ // @ts-ignore - TypeScript kan hier strikter zijn dan nodig met de options
270
+ const formatter = new Intl.DateTimeFormat(locale, {
271
+ weekday: options?.weekday || 'long',
272
+ ...(options?.timeZone ? { timeZone: options.timeZone } : {})
273
+ });
274
+
275
+ return formatter.format(date);
276
+ }
277
+
278
+ /**
279
+ * Return the timestamp of the start of the day
280
+ * - Midnight
281
+ *
282
+ * @param {Date|number} [dateOrTimestamp]
283
+ *
284
+ * @returns {number} timestamp of start of the day (00:00:00:0000)
285
+ */
286
+ export function getTimeAtStartOfDay(dateOrTimestamp) {
287
+ let d;
288
+
289
+ if (dateOrTimestamp) {
290
+ d = toDate(dateOrTimestamp);
291
+ } else {
292
+ // today, now
293
+ d = new Date();
294
+ }
295
+
296
+ d.setHours(0);
297
+ d.setMinutes(0);
298
+ d.setSeconds(0);
299
+ d.setMilliseconds(0);
300
+
301
+ return d.getTime();
302
+ }
303
+
304
+ /**
305
+ * Return the timestamp of the end of the day
306
+ * - Midnight - 1 millisecond
307
+ *
308
+ * @param {Date|number} [dateOrTimestamp]
309
+ *
310
+ * @returns {number} timestamp of start of the day
311
+ */
312
+ export function getTimeAtEndOfDay(dateOrTimestamp) {
313
+ let d;
314
+
315
+ if (dateOrTimestamp) {
316
+ d = toDate(dateOrTimestamp);
317
+ } else {
318
+ // today, now
319
+ d = new Date();
320
+ }
321
+
322
+ d.setHours(23);
323
+ d.setMinutes(59);
324
+ d.setSeconds(59);
325
+ d.setMilliseconds(999);
326
+
327
+ return d.getTime();
328
+ }