@hkdigital/lib-sveltekit 0.1.4 → 0.1.6

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 (224) hide show
  1. package/README.md +127 -127
  2. package/dist/classes/data/IterableTree.js +243 -243
  3. package/dist/classes/data/Selector.js +190 -190
  4. package/dist/classes/data/index.js +2 -2
  5. package/dist/classes/index.js +3 -3
  6. package/dist/classes/promise/HkPromise.js +377 -377
  7. package/dist/classes/promise/index.js +1 -1
  8. package/dist/classes/stores/SubscribersCount.js +107 -107
  9. package/dist/classes/stores/index.js +1 -1
  10. package/dist/classes/streams/LogTransformStream.js +19 -19
  11. package/dist/classes/streams/ServerEventsStore.js +110 -110
  12. package/dist/classes/streams/TimeStampSource.js +26 -26
  13. package/dist/classes/streams/index.js +3 -3
  14. package/dist/classes/{svkit → svelte}/audio/AudioLoader.svelte.js +58 -58
  15. package/dist/classes/{svkit → svelte}/audio/AudioScene.svelte.js +282 -282
  16. package/dist/classes/{svkit → svelte}/audio/mocks.js +35 -35
  17. package/dist/classes/{svkit → svelte}/final-state-machine/FiniteStateMachine.svelte.js +133 -133
  18. package/dist/classes/{svkit → svelte}/final-state-machine/index.js +1 -1
  19. package/dist/classes/{svkit → svelte}/image/ImageLoader.svelte.js +47 -47
  20. package/dist/classes/{svkit → svelte}/image/ImageScene.svelte.js +253 -253
  21. package/dist/classes/{svkit → svelte}/image/ImageVariantsLoader.svelte.js +152 -152
  22. package/dist/classes/{svkit → svelte}/image/index.js +4 -4
  23. package/dist/classes/{svkit → svelte}/image/mocks.js +35 -35
  24. package/dist/classes/{svkit → svelte}/image/typedef.js +8 -8
  25. package/dist/classes/{svkit → svelte}/loading-state-machine/LoadingStateMachine.svelte.js +109 -109
  26. package/dist/classes/{svkit → svelte}/loading-state-machine/constants.js +16 -16
  27. package/dist/classes/{svkit → svelte}/loading-state-machine/index.js +3 -3
  28. package/dist/classes/{svkit → svelte}/network-loader/NetworkLoader.svelte.js +331 -331
  29. package/dist/classes/{svkit → svelte}/network-loader/constants.js +3 -3
  30. package/dist/classes/{svkit → svelte}/network-loader/index.js +3 -3
  31. package/dist/classes/{svkit → svelte}/network-loader/mocks.js +30 -30
  32. package/dist/classes/{svkit → svelte}/network-loader/typedef.js +8 -8
  33. package/dist/components/area/HkArea.svelte +49 -49
  34. package/dist/components/area/HkArea.svelte.d.ts +0 -14
  35. package/dist/components/area/HkGridArea.svelte +77 -77
  36. package/dist/components/area/HkGridArea.svelte.d.ts +0 -22
  37. package/dist/components/area/index.js +2 -2
  38. package/dist/components/boxes/game-box/GameBox.svelte +112 -112
  39. package/dist/components/boxes/game-box/GameBox.svelte.d.ts +0 -15
  40. package/dist/components/boxes/game-box/gamebox.util.js +83 -83
  41. package/dist/components/boxes/index.js +2 -2
  42. package/dist/components/boxes/virtual-viewport/VirtualViewport.svelte +199 -199
  43. package/dist/components/boxes/virtual-viewport/VirtualViewport.svelte.d.ts +0 -22
  44. package/dist/components/buttons/button/Button.svelte +75 -75
  45. package/dist/components/buttons/button/Button.svelte.d.ts +0 -21
  46. package/dist/components/buttons/button-text/TextButton.svelte +21 -21
  47. package/dist/components/buttons/button-text/TextButton.svelte.d.ts +0 -7
  48. package/dist/components/buttons/index.js +2 -2
  49. package/dist/components/hkdev/blocks/TextBlock.svelte +46 -46
  50. package/dist/components/hkdev/blocks/TextBlock.svelte.d.ts +0 -13
  51. package/dist/components/hkdev/buttons/CheckButton.svelte +62 -62
  52. package/dist/components/hkdev/buttons/CheckButton.svelte.d.ts +0 -18
  53. package/dist/components/icon/HkIcon.svelte +86 -86
  54. package/dist/components/icon/HkIcon.svelte.d.ts +0 -12
  55. package/dist/components/icon/HkTabIcon.svelte +116 -116
  56. package/dist/components/icon/HkTabIcon.svelte.d.ts +0 -21
  57. package/dist/components/icon/index.js +4 -4
  58. package/dist/components/icon/typedef.js +16 -16
  59. package/dist/components/image/ImageBox.svelte +208 -208
  60. package/dist/components/image/ImageBox.svelte.d.ts +2 -21
  61. package/dist/components/image/index.js +5 -5
  62. package/dist/components/image/typedef.js +32 -32
  63. package/dist/components/index.js +2 -2
  64. package/dist/components/inputs/index.js +1 -1
  65. package/dist/components/inputs/text-input/TestTextInput.svelte__ +102 -102
  66. package/dist/components/inputs/text-input/TextInput.svelte +226 -226
  67. package/dist/components/inputs/text-input/TextInput.svelte.d.ts +0 -28
  68. package/dist/components/inputs/text-input/TextInput.svelte___ +83 -83
  69. package/dist/components/inputs/text-input/assets/IconInvalid.svelte +14 -14
  70. package/dist/components/inputs/text-input/assets/IconValid.svelte +12 -12
  71. package/dist/components/layout/HkAppLayout.state.svelte.js +25 -25
  72. package/dist/components/layout/HkAppLayout.svelte +251 -251
  73. package/dist/components/layout/HkAppLayout.svelte.d.ts +0 -11
  74. package/dist/components/layout/HkGridLayers.svelte +82 -82
  75. package/dist/components/layout/HkGridLayers.svelte.d.ts +0 -23
  76. package/dist/components/layout/index.js +9 -9
  77. package/dist/components/panels/index.js +1 -1
  78. package/dist/components/panels/plain-panel/PlainPanel.svelte +33 -33
  79. package/dist/components/panels/plain-panel/PlainPanel.svelte.d.ts +0 -12
  80. package/dist/components/rows/index.js +3 -3
  81. package/dist/components/rows/panel-grid-row/PanelGridRow.svelte +104 -104
  82. package/dist/components/rows/panel-grid-row/PanelGridRow.svelte.d.ts +0 -14
  83. package/dist/components/rows/panel-row-2/PanelRow2.svelte +40 -40
  84. package/dist/components/rows/panel-row-2/PanelRow2.svelte.d.ts +0 -14
  85. package/dist/components/tab-bar/HkTabBar.state.svelte.js +149 -149
  86. package/dist/components/tab-bar/HkTabBar.svelte +74 -74
  87. package/dist/components/tab-bar/HkTabBar.svelte.d.ts +0 -18
  88. package/dist/components/tab-bar/HkTabBarSelector.state.svelte.js +93 -93
  89. package/dist/components/tab-bar/HkTabBarSelector.svelte +49 -49
  90. package/dist/components/tab-bar/HkTabBarSelector.svelte.d.ts +0 -19
  91. package/dist/components/tab-bar/index.js +17 -17
  92. package/dist/components/tab-bar/typedef.js +8 -8
  93. package/dist/components/widgets/compare-left-right/CompareLeftRight.svelte +179 -179
  94. package/dist/components/widgets/compare-left-right/CompareLeftRight.svelte.d.ts +0 -10
  95. package/dist/components/widgets/compare-left-right/index.js +1 -1
  96. package/dist/components/widgets/scale-control/index.js +1 -1
  97. package/dist/config/imagetools-config.js +189 -189
  98. package/dist/config/imagetools.d.ts +71 -71
  99. package/dist/config/typedef.js +8 -8
  100. package/dist/constants/errors/api.js +9 -9
  101. package/dist/constants/errors/generic.js +5 -5
  102. package/dist/constants/errors/index.js +3 -3
  103. package/dist/constants/errors/jwt.js +5 -5
  104. package/dist/constants/http/headers.js +6 -6
  105. package/dist/constants/http/index.js +2 -2
  106. package/dist/constants/http/methods.js +2 -2
  107. package/dist/constants/index.js +3 -3
  108. package/dist/constants/mime/application.js +5 -5
  109. package/dist/constants/mime/audio.js +13 -13
  110. package/dist/constants/mime/image.js +3 -3
  111. package/dist/constants/mime/index.js +4 -4
  112. package/dist/constants/mime/text.js +2 -2
  113. package/dist/constants/regexp/index.js +31 -31
  114. package/dist/constants/regexp/inspiratie.js__ +95 -95
  115. package/dist/constants/regexp/text.js +49 -49
  116. package/dist/constants/regexp/user.js +32 -32
  117. package/dist/constants/regexp/web.js +3 -3
  118. package/dist/constants/state-labels/input-states.js +11 -11
  119. package/dist/constants/state-labels/submit-states.js +4 -4
  120. package/dist/constants/time.js +28 -28
  121. package/dist/css/tw-prose.postcss__ +259 -259
  122. package/dist/css/utilities.postcss +43 -43
  123. package/dist/{design-system → design}/design-config.js +73 -73
  124. package/dist/{design-system → design}/tailwind-theme-extend.d.ts +4 -4
  125. package/dist/{design-system → design}/tailwind-theme-extend.js +151 -151
  126. package/dist/schemas/index.js +1 -1
  127. package/dist/schemas/validate-url.js +180 -180
  128. package/dist/server/index.js +1 -1
  129. package/dist/server/logger.js +94 -94
  130. package/dist/states/index.js +1 -1
  131. package/dist/states/navigation.svelte.js +55 -55
  132. package/dist/stores/index.js +1 -1
  133. package/dist/stores/theme.js +80 -80
  134. package/dist/themes/hkdev/components/blocks/text-block.postcss +40 -40
  135. package/dist/themes/hkdev/components/boxes/game-box.postcss +13 -13
  136. package/dist/themes/hkdev/components/buttons/button-text.postcss +34 -34
  137. package/dist/themes/hkdev/components/buttons/button.postcss +138 -138
  138. package/dist/themes/hkdev/components/buttons/skip-button.postcss +8 -8
  139. package/dist/themes/hkdev/components/inputs/text-input.postcss +108 -108
  140. package/dist/themes/hkdev/components/panels/plain-panel.postcss +46 -46
  141. package/dist/themes/hkdev/components/panels/speech-bubble.postcss +52 -52
  142. package/dist/themes/hkdev/components/rows/panel-grid-row.postcss +7 -7
  143. package/dist/themes/hkdev/components/rows/panel-row-2.postcss +9 -9
  144. package/dist/themes/hkdev/components.postcss +55 -55
  145. package/dist/themes/hkdev/debug.postcss +1 -1
  146. package/dist/themes/hkdev/global/layout.postcss +39 -39
  147. package/dist/themes/hkdev/global/on-colors.postcss +53 -53
  148. package/dist/themes/hkdev/global/text.postcss__ +34 -34
  149. package/dist/themes/hkdev/global/vars.postcss__ +7 -7
  150. package/dist/themes/hkdev/globals.postcss +11 -11
  151. package/dist/themes/hkdev/responsive.postcss +12 -12
  152. package/dist/themes/hkdev/theme-ext.js +15 -15
  153. package/dist/themes/hkdev/theme.js +227 -227
  154. package/dist/themes/index.js +1 -1
  155. package/dist/util/array/index.js +455 -455
  156. package/dist/util/compare/index.js +247 -247
  157. package/dist/util/css/css-vars.js +83 -83
  158. package/dist/util/css/index.js +1 -1
  159. package/dist/util/design-system/components/states.js +22 -22
  160. package/dist/util/design-system/css/clamp.d.ts +2 -2
  161. package/dist/util/design-system/css/clamp.js +66 -66
  162. package/dist/util/design-system/css/root-design-vars.js +100 -100
  163. package/dist/util/design-system/index.js +5 -5
  164. package/dist/util/design-system/layout/scaling.js +97 -97
  165. package/dist/util/design-system/tailwind.js +289 -289
  166. package/dist/util/expect/arrays.js +47 -47
  167. package/dist/util/expect/index.js +259 -259
  168. package/dist/util/expect/primitives.js +55 -55
  169. package/dist/util/expect/url.js +60 -60
  170. package/dist/util/function/index.js +218 -218
  171. package/dist/util/http/errors.js +97 -97
  172. package/dist/util/http/headers.js +45 -45
  173. package/dist/util/http/http-request.js +273 -273
  174. package/dist/util/http/index.js +22 -22
  175. package/dist/util/http/json-request.js +143 -143
  176. package/dist/util/http/mocks.js +65 -65
  177. package/dist/util/http/response.js +228 -228
  178. package/dist/util/http/url.js +52 -52
  179. package/dist/util/image/index.js +86 -86
  180. package/dist/util/index.js +2 -2
  181. package/dist/util/is/index.js +140 -140
  182. package/dist/util/iterate/index.js +234 -234
  183. package/dist/util/object/index.js +1361 -1361
  184. package/dist/util/singleton/index.js +97 -97
  185. package/dist/util/string/index.js +184 -184
  186. package/dist/util/svelte/index.js +2 -2
  187. package/dist/util/svelte/observe/index.js +49 -49
  188. package/dist/util/svelte/state-context/index.js +83 -83
  189. package/dist/util/svelte/wait/index.js +38 -38
  190. package/dist/util/sveltekit/index.js +1 -1
  191. package/dist/util/sveltekit/route-folders/index.js +82 -82
  192. package/dist/util/time/index.js +339 -339
  193. package/dist/valibot/date.js__ +10 -10
  194. package/dist/valibot/index.js +9 -9
  195. package/dist/valibot/url.js +95 -95
  196. package/dist/valibot/user.js +23 -23
  197. package/dist/zod/all.js +33 -33
  198. package/dist/zod/generic.js +11 -11
  199. package/dist/zod/javascript.js +32 -32
  200. package/dist/zod/user.js +16 -16
  201. package/dist/zod/web.js +52 -52
  202. package/package.json +99 -99
  203. package/dist/themes/hkdev/components/buttons/button.postcss__ +0 -40
  204. package/dist/themes/hkdev/components/buttons/button.postcss___ +0 -91
  205. /package/dist/classes/{svkit → svelte}/audio/AudioLoader.svelte.d.ts +0 -0
  206. /package/dist/classes/{svkit → svelte}/audio/AudioScene.svelte.d.ts +0 -0
  207. /package/dist/classes/{svkit → svelte}/audio/mocks.d.ts +0 -0
  208. /package/dist/classes/{svkit → svelte}/final-state-machine/FiniteStateMachine.svelte.d.ts +0 -0
  209. /package/dist/classes/{svkit → svelte}/final-state-machine/index.d.ts +0 -0
  210. /package/dist/classes/{svkit → svelte}/image/ImageLoader.svelte.d.ts +0 -0
  211. /package/dist/classes/{svkit → svelte}/image/ImageScene.svelte.d.ts +0 -0
  212. /package/dist/classes/{svkit → svelte}/image/ImageVariantsLoader.svelte.d.ts +0 -0
  213. /package/dist/classes/{svkit → svelte}/image/index.d.ts +0 -0
  214. /package/dist/classes/{svkit → svelte}/image/mocks.d.ts +0 -0
  215. /package/dist/classes/{svkit → svelte}/image/typedef.d.ts +0 -0
  216. /package/dist/classes/{svkit → svelte}/loading-state-machine/LoadingStateMachine.svelte.d.ts +0 -0
  217. /package/dist/classes/{svkit → svelte}/loading-state-machine/constants.d.ts +0 -0
  218. /package/dist/classes/{svkit → svelte}/loading-state-machine/index.d.ts +0 -0
  219. /package/dist/classes/{svkit → svelte}/network-loader/NetworkLoader.svelte.d.ts +0 -0
  220. /package/dist/classes/{svkit → svelte}/network-loader/constants.d.ts +0 -0
  221. /package/dist/classes/{svkit → svelte}/network-loader/index.d.ts +0 -0
  222. /package/dist/classes/{svkit → svelte}/network-loader/mocks.d.ts +0 -0
  223. /package/dist/classes/{svkit → svelte}/network-loader/typedef.d.ts +0 -0
  224. /package/dist/{design-system → design}/design-config.d.ts +0 -0
@@ -1,339 +1,339 @@
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
- /* ------------------------------------------------------------------ Imports */
32
-
33
- import * as expect from '../expect/index.js';
34
- import { HkPromise } from '../../classes/promise/index.js';
35
-
36
- /* ---------------------------------------------------------------- Internals */
37
-
38
- /* ------------------------------------------------------------------ Exports */
39
-
40
- export const SECOND_MS = 1000;
41
- export const MINUTE_MS = 60 * SECOND_MS;
42
- export const HOUR_MS = 60 * MINUTE_MS;
43
- export const DAY_MS = 24 * HOUR_MS;
44
- export const WEEK_MS = 7 * DAY_MS;
45
-
46
- export const TIME_2020_01_01 = 1577836800000; // 2020-01-01T00:00:00.000Z
47
- export const TIME_2100_01_01 = 4102444800000; // 2100-01-01T00:00:00.000Z
48
-
49
- /**
50
- * Returns a promise that resolves after a specified timeout
51
- * - If the returned promise is rejected, the timeout is cancelled
52
- *
53
- * @param {number} delayOrMinDelayMs
54
- * Number of milliseconds to wait before promise resolves
55
- *
56
- * @param {number} [maxDelayMs=delayOrMinDelayMs]
57
- * Maximum number of milliseconds to wait before the returned promise
58
- * resolves. If this parameter is set, the delay will be chosen randomly
59
- * between the values [delayOrMinDelayMs, maxDelayMs]
60
- *
61
- * @returns {Promise} promise that resolves after a specified timeout
62
- */
63
- export function delay(delayOrMinDelayMs, maxDelayMs) {
64
- expect.number(delayOrMinDelayMs);
65
-
66
- if (maxDelayMs) {
67
- //
68
- // maxDelayMs was set -> generate random delay
69
- //
70
- if (maxDelayMs > delayOrMinDelayMs) {
71
- delayOrMinDelayMs = Math.floor(
72
- delayOrMinDelayMs + Math.random() * (maxDelayMs - delayOrMinDelayMs)
73
- );
74
- }
75
- }
76
-
77
- const promise = new HkPromise();
78
-
79
- let timer = setTimeout(() => {
80
- timer = null;
81
- promise.resolve();
82
- }, delayOrMinDelayMs);
83
-
84
- // Register catch method to cancel timer when promise is rejected
85
- promise.catch(() => {
86
- if (timer) {
87
- clearTimeout(timer);
88
- timer = null;
89
- }
90
- });
91
-
92
- return promise;
93
- }
94
-
95
- // -----------------------------------------------------------------------------
96
-
97
- /**
98
- * Get the number of milliseconds since the specified time stamp of the default
99
- * reference time stamp TIME_2020_01_01
100
- *
101
- * @param {number} [sinceMs=TIME_2020_01_01]
102
- *
103
- * @returns {number} number of milliseconds since the specified time
104
- */
105
- export function sinceMs(sinceMs = TIME_2020_01_01) {
106
- return Date.now() - sinceMs;
107
- }
108
-
109
- // -----------------------------------------------------------------------------
110
-
111
- /**
112
- * Get a string that represents the time in a readable
113
- * string format: [DD:][HH:]MM:SS.mmm
114
- *
115
- * @param {number} timeMs [description]
116
- *
117
- * @returns {string} time in human readable format
118
- */
119
- export function timeToString(timeMs) {
120
- const days = Math.floor(timeMs / DAY_MS);
121
-
122
- let restMs = timeMs - days * DAY_MS;
123
-
124
- const hours = Math.floor(restMs / HOUR_MS);
125
-
126
- restMs = restMs - hours * HOUR_MS;
127
-
128
- const minutes = Math.floor(restMs / MINUTE_MS);
129
-
130
- restMs = restMs - minutes * MINUTE_MS;
131
-
132
- const seconds = Math.floor(restMs / SECOND_MS);
133
-
134
- restMs = restMs - seconds * SECOND_MS;
135
-
136
- let str = '';
137
-
138
- if (days) {
139
- str += `${days.toString().padStart(2, '0')}:`;
140
- str += `${hours.toString().padStart(2, '0')}:`;
141
- } else if (hours) {
142
- str += `${hours.toString().padStart(2, '0')}:`;
143
- }
144
-
145
- str += `${minutes.toString().padStart(2, '0')}:`;
146
- str += `${seconds.toString().padStart(2, '0')}.`;
147
- str += `${restMs.toString().padEnd(3, '0')}`;
148
-
149
- return str;
150
- }
151
-
152
- // -----------------------------------------------------------------------------
153
-
154
- /**
155
- * Returns a Date object
156
- * - The input can be a Date object or a numeric timestamp
157
- *
158
- * @param {Date|number} dateOrTimestamp
159
- *
160
- * @returns {Date} date object
161
- */
162
- export function toDate(dateOrTimestamp) {
163
- if (dateOrTimestamp instanceof Date) {
164
- return dateOrTimestamp;
165
- }
166
-
167
- if (typeof dateOrTimestamp === 'number') {
168
- return new Date(dateOrTimestamp);
169
- }
170
-
171
- throw new Error('Missing or invalid parameter [dateOrTimestamp]');
172
- }
173
-
174
- // -----------------------------------------------------------------------------
175
-
176
- /**
177
- * Get the ISO 8601 week number of the specified date
178
- *
179
- * @see https://stackoverflow.com
180
- * /questions/6117814/get-week-of-year-in-javascript-like-in-php
181
- *
182
- * @param {Date|number} dateOrTimestamp
183
- *
184
- * @returns {number} week number
185
- */
186
- export function getWeekNumber(dateOrTimestamp) {
187
- const date = toDate(dateOrTimestamp);
188
-
189
- //
190
- // Create a copy of this date object
191
- //
192
- const target = new Date(date.valueOf());
193
-
194
- //
195
- // ISO week date weeks start on Monday, so correct the day number
196
- //
197
- const dayNumber = (date.getDay() + 6) % 7;
198
-
199
- //
200
- // ISO 8601 states that week 1 is the week with the first Thursday
201
- // of that year.
202
- //
203
- // Set the target date to the Thursday in the target week
204
- //
205
- target.setDate(target.getDate() - dayNumber + 3);
206
-
207
- //
208
- // Store the millisecond value of the target date
209
- //
210
- const firstThursday = target.valueOf();
211
-
212
- // Set the target to the first Thursday of the year
213
- // First, set the target to January 1st
214
- target.setMonth(0, 1);
215
-
216
- //
217
- // Not a Thursday? Correct the date to the next Thursday
218
- //
219
- if (target.getDay() !== 4) {
220
- target.setMonth(0, 1 + ((4 - target.getDay() + 7) % 7));
221
- }
222
-
223
- //
224
- // The week number is the number of weeks between the first Thursday
225
- // of the year and the Thursday in the target week
226
- // (604800000 = 7 * 24 * 3600 * 1000)
227
- //
228
- return 1 + Math.ceil((firstThursday - target) / 604800000);
229
- }
230
-
231
- // -----------------------------------------------------------------------------
232
-
233
- /**
234
- * Get the name of the month
235
- * - Returns the English name of the month
236
- *
237
- * - Use the output as label in combination with the functions
238
- * text() and translate() for international month names
239
- *
240
- * e.g.
241
- *
242
- * setTranslations()
243
- * ...
244
- *
245
- * text( getMonthName( new Date() ) );
246
- *
247
- * --
248
- *
249
- * @param {Date|number} dateOrTimestamp
250
- *
251
- * @returns {string} name of the month (English)
252
- */
253
- export function getMonthName(dateOrTimestamp) {
254
- throw new Error('Not implemented yet');
255
- // return MONTH_NAME_LABELS_EN[toDate(dateOrTimestamp).getMonth()];
256
- }
257
-
258
- // -----------------------------------------------------------------------------
259
-
260
- /**
261
- * Get the name of the day
262
- * - Returns the English name of the day
263
- *
264
- * - Use the output as label in combination with the functions
265
- * text() and translate() for international day names
266
- *
267
- * e.g.
268
- *
269
- * setTranslations()
270
- * ...
271
- *
272
- * text( getDayName( new Date() ) );
273
- *
274
- * --
275
- *
276
- * @param {Date|number} dateOrTimestamp
277
- *
278
- * @returns {string} name of the day (English)
279
- */
280
- export function getDayName(dateOrTimestamp) {
281
- throw new Error('Not implemented yet');
282
- // return DAY_NAME_LABELS_EN[toDate(dateOrTimestamp).getDay()];
283
- }
284
-
285
- // -----------------------------------------------------------------------------
286
-
287
- /**
288
- * Return the timestamp of the start of the day
289
- * - Midnight
290
- *
291
- * @param {Date|number} dateOrTimestamp
292
- *
293
- * @returns {number} timestamp of start of the day (00:00:00:0000)
294
- */
295
- export function getTimeAtStartOfDay(dateOrTimestamp) {
296
- let d;
297
-
298
- if (dateOrTimestamp) {
299
- d = toDate(dateOrTimestamp);
300
- } else {
301
- // today, now
302
- d = new Date();
303
- }
304
-
305
- d.setHours(0);
306
- d.setMinutes(0);
307
- d.setSeconds(0);
308
- d.setMilliseconds(0);
309
-
310
- return d.getTime();
311
- }
312
-
313
- // -----------------------------------------------------------------------------
314
-
315
- /**
316
- * Return the timestamp of the end of the day
317
- * - Midnight - 1 millisecond
318
- *
319
- * @param {Date|number} dateOrTimestamp
320
- *
321
- * @returns {number} timestamp of start of the day
322
- */
323
- export function getTimeAtEndOfDay(dateOrTimestamp) {
324
- let d;
325
-
326
- if (dateOrTimestamp) {
327
- d = toDate(dateOrTimestamp);
328
- } else {
329
- // today, now
330
- d = new Date();
331
- }
332
-
333
- d.setHours(23);
334
- d.setMinutes(59);
335
- d.setSeconds(59);
336
- d.setMilliseconds(999);
337
-
338
- return d.getTime();
339
- }
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
+ /* ------------------------------------------------------------------ Imports */
32
+
33
+ import * as expect from '../expect/index.js';
34
+ import { HkPromise } from '../../classes/promise/index.js';
35
+
36
+ /* ---------------------------------------------------------------- Internals */
37
+
38
+ /* ------------------------------------------------------------------ Exports */
39
+
40
+ export const SECOND_MS = 1000;
41
+ export const MINUTE_MS = 60 * SECOND_MS;
42
+ export const HOUR_MS = 60 * MINUTE_MS;
43
+ export const DAY_MS = 24 * HOUR_MS;
44
+ export const WEEK_MS = 7 * DAY_MS;
45
+
46
+ export const TIME_2020_01_01 = 1577836800000; // 2020-01-01T00:00:00.000Z
47
+ export const TIME_2100_01_01 = 4102444800000; // 2100-01-01T00:00:00.000Z
48
+
49
+ /**
50
+ * Returns a promise that resolves after a specified timeout
51
+ * - If the returned promise is rejected, the timeout is cancelled
52
+ *
53
+ * @param {number} delayOrMinDelayMs
54
+ * Number of milliseconds to wait before promise resolves
55
+ *
56
+ * @param {number} [maxDelayMs=delayOrMinDelayMs]
57
+ * Maximum number of milliseconds to wait before the returned promise
58
+ * resolves. If this parameter is set, the delay will be chosen randomly
59
+ * between the values [delayOrMinDelayMs, maxDelayMs]
60
+ *
61
+ * @returns {Promise} promise that resolves after a specified timeout
62
+ */
63
+ export function delay(delayOrMinDelayMs, maxDelayMs) {
64
+ expect.number(delayOrMinDelayMs);
65
+
66
+ if (maxDelayMs) {
67
+ //
68
+ // maxDelayMs was set -> generate random delay
69
+ //
70
+ if (maxDelayMs > delayOrMinDelayMs) {
71
+ delayOrMinDelayMs = Math.floor(
72
+ delayOrMinDelayMs + Math.random() * (maxDelayMs - delayOrMinDelayMs)
73
+ );
74
+ }
75
+ }
76
+
77
+ const promise = new HkPromise();
78
+
79
+ let timer = setTimeout(() => {
80
+ timer = null;
81
+ promise.resolve();
82
+ }, delayOrMinDelayMs);
83
+
84
+ // Register catch method to cancel timer when promise is rejected
85
+ promise.catch(() => {
86
+ if (timer) {
87
+ clearTimeout(timer);
88
+ timer = null;
89
+ }
90
+ });
91
+
92
+ return promise;
93
+ }
94
+
95
+ // -----------------------------------------------------------------------------
96
+
97
+ /**
98
+ * Get the number of milliseconds since the specified time stamp of the default
99
+ * reference time stamp TIME_2020_01_01
100
+ *
101
+ * @param {number} [sinceMs=TIME_2020_01_01]
102
+ *
103
+ * @returns {number} number of milliseconds since the specified time
104
+ */
105
+ export function sinceMs(sinceMs = TIME_2020_01_01) {
106
+ return Date.now() - sinceMs;
107
+ }
108
+
109
+ // -----------------------------------------------------------------------------
110
+
111
+ /**
112
+ * Get a string that represents the time in a readable
113
+ * string format: [DD:][HH:]MM:SS.mmm
114
+ *
115
+ * @param {number} timeMs [description]
116
+ *
117
+ * @returns {string} time in human readable format
118
+ */
119
+ export function timeToString(timeMs) {
120
+ const days = Math.floor(timeMs / DAY_MS);
121
+
122
+ let restMs = timeMs - days * DAY_MS;
123
+
124
+ const hours = Math.floor(restMs / HOUR_MS);
125
+
126
+ restMs = restMs - hours * HOUR_MS;
127
+
128
+ const minutes = Math.floor(restMs / MINUTE_MS);
129
+
130
+ restMs = restMs - minutes * MINUTE_MS;
131
+
132
+ const seconds = Math.floor(restMs / SECOND_MS);
133
+
134
+ restMs = restMs - seconds * SECOND_MS;
135
+
136
+ let str = '';
137
+
138
+ if (days) {
139
+ str += `${days.toString().padStart(2, '0')}:`;
140
+ str += `${hours.toString().padStart(2, '0')}:`;
141
+ } else if (hours) {
142
+ str += `${hours.toString().padStart(2, '0')}:`;
143
+ }
144
+
145
+ str += `${minutes.toString().padStart(2, '0')}:`;
146
+ str += `${seconds.toString().padStart(2, '0')}.`;
147
+ str += `${restMs.toString().padEnd(3, '0')}`;
148
+
149
+ return str;
150
+ }
151
+
152
+ // -----------------------------------------------------------------------------
153
+
154
+ /**
155
+ * Returns a Date object
156
+ * - The input can be a Date object or a numeric timestamp
157
+ *
158
+ * @param {Date|number} dateOrTimestamp
159
+ *
160
+ * @returns {Date} date object
161
+ */
162
+ export function toDate(dateOrTimestamp) {
163
+ if (dateOrTimestamp instanceof Date) {
164
+ return dateOrTimestamp;
165
+ }
166
+
167
+ if (typeof dateOrTimestamp === 'number') {
168
+ return new Date(dateOrTimestamp);
169
+ }
170
+
171
+ throw new Error('Missing or invalid parameter [dateOrTimestamp]');
172
+ }
173
+
174
+ // -----------------------------------------------------------------------------
175
+
176
+ /**
177
+ * Get the ISO 8601 week number of the specified date
178
+ *
179
+ * @see https://stackoverflow.com
180
+ * /questions/6117814/get-week-of-year-in-javascript-like-in-php
181
+ *
182
+ * @param {Date|number} dateOrTimestamp
183
+ *
184
+ * @returns {number} week number
185
+ */
186
+ export function getWeekNumber(dateOrTimestamp) {
187
+ const date = toDate(dateOrTimestamp);
188
+
189
+ //
190
+ // Create a copy of this date object
191
+ //
192
+ const target = new Date(date.valueOf());
193
+
194
+ //
195
+ // ISO week date weeks start on Monday, so correct the day number
196
+ //
197
+ const dayNumber = (date.getDay() + 6) % 7;
198
+
199
+ //
200
+ // ISO 8601 states that week 1 is the week with the first Thursday
201
+ // of that year.
202
+ //
203
+ // Set the target date to the Thursday in the target week
204
+ //
205
+ target.setDate(target.getDate() - dayNumber + 3);
206
+
207
+ //
208
+ // Store the millisecond value of the target date
209
+ //
210
+ const firstThursday = target.valueOf();
211
+
212
+ // Set the target to the first Thursday of the year
213
+ // First, set the target to January 1st
214
+ target.setMonth(0, 1);
215
+
216
+ //
217
+ // Not a Thursday? Correct the date to the next Thursday
218
+ //
219
+ if (target.getDay() !== 4) {
220
+ target.setMonth(0, 1 + ((4 - target.getDay() + 7) % 7));
221
+ }
222
+
223
+ //
224
+ // The week number is the number of weeks between the first Thursday
225
+ // of the year and the Thursday in the target week
226
+ // (604800000 = 7 * 24 * 3600 * 1000)
227
+ //
228
+ return 1 + Math.ceil((firstThursday - target) / 604800000);
229
+ }
230
+
231
+ // -----------------------------------------------------------------------------
232
+
233
+ /**
234
+ * Get the name of the month
235
+ * - Returns the English name of the month
236
+ *
237
+ * - Use the output as label in combination with the functions
238
+ * text() and translate() for international month names
239
+ *
240
+ * e.g.
241
+ *
242
+ * setTranslations()
243
+ * ...
244
+ *
245
+ * text( getMonthName( new Date() ) );
246
+ *
247
+ * --
248
+ *
249
+ * @param {Date|number} dateOrTimestamp
250
+ *
251
+ * @returns {string} name of the month (English)
252
+ */
253
+ export function getMonthName(dateOrTimestamp) {
254
+ throw new Error('Not implemented yet');
255
+ // return MONTH_NAME_LABELS_EN[toDate(dateOrTimestamp).getMonth()];
256
+ }
257
+
258
+ // -----------------------------------------------------------------------------
259
+
260
+ /**
261
+ * Get the name of the day
262
+ * - Returns the English name of the day
263
+ *
264
+ * - Use the output as label in combination with the functions
265
+ * text() and translate() for international day names
266
+ *
267
+ * e.g.
268
+ *
269
+ * setTranslations()
270
+ * ...
271
+ *
272
+ * text( getDayName( new Date() ) );
273
+ *
274
+ * --
275
+ *
276
+ * @param {Date|number} dateOrTimestamp
277
+ *
278
+ * @returns {string} name of the day (English)
279
+ */
280
+ export function getDayName(dateOrTimestamp) {
281
+ throw new Error('Not implemented yet');
282
+ // return DAY_NAME_LABELS_EN[toDate(dateOrTimestamp).getDay()];
283
+ }
284
+
285
+ // -----------------------------------------------------------------------------
286
+
287
+ /**
288
+ * Return the timestamp of the start of the day
289
+ * - Midnight
290
+ *
291
+ * @param {Date|number} dateOrTimestamp
292
+ *
293
+ * @returns {number} timestamp of start of the day (00:00:00:0000)
294
+ */
295
+ export function getTimeAtStartOfDay(dateOrTimestamp) {
296
+ let d;
297
+
298
+ if (dateOrTimestamp) {
299
+ d = toDate(dateOrTimestamp);
300
+ } else {
301
+ // today, now
302
+ d = new Date();
303
+ }
304
+
305
+ d.setHours(0);
306
+ d.setMinutes(0);
307
+ d.setSeconds(0);
308
+ d.setMilliseconds(0);
309
+
310
+ return d.getTime();
311
+ }
312
+
313
+ // -----------------------------------------------------------------------------
314
+
315
+ /**
316
+ * Return the timestamp of the end of the day
317
+ * - Midnight - 1 millisecond
318
+ *
319
+ * @param {Date|number} dateOrTimestamp
320
+ *
321
+ * @returns {number} timestamp of start of the day
322
+ */
323
+ export function getTimeAtEndOfDay(dateOrTimestamp) {
324
+ let d;
325
+
326
+ if (dateOrTimestamp) {
327
+ d = toDate(dateOrTimestamp);
328
+ } else {
329
+ // today, now
330
+ d = new Date();
331
+ }
332
+
333
+ d.setHours(23);
334
+ d.setMinutes(59);
335
+ d.setSeconds(59);
336
+ d.setMilliseconds(999);
337
+
338
+ return d.getTime();
339
+ }