@hkdigital/lib-sveltekit 0.1.6 → 0.1.7
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.
- package/README.md +127 -127
- package/dist/classes/data/IterableTree.js +243 -243
- package/dist/classes/data/Selector.js +190 -190
- package/dist/classes/data/index.js +2 -2
- package/dist/classes/index.js +3 -3
- package/dist/classes/promise/HkPromise.js +377 -377
- package/dist/classes/promise/index.js +1 -1
- package/dist/classes/stores/SubscribersCount.js +107 -107
- package/dist/classes/stores/index.js +1 -1
- package/dist/classes/streams/LogTransformStream.js +19 -19
- package/dist/classes/streams/ServerEventsStore.js +110 -110
- package/dist/classes/streams/TimeStampSource.js +26 -26
- package/dist/classes/streams/index.js +3 -3
- package/dist/classes/svelte/audio/AudioLoader.svelte.js +58 -58
- package/dist/classes/svelte/audio/AudioScene.svelte.js +282 -282
- package/dist/classes/svelte/audio/mocks.js +35 -35
- package/dist/classes/svelte/final-state-machine/FiniteStateMachine.svelte.js +133 -133
- package/dist/classes/svelte/final-state-machine/index.js +1 -1
- package/dist/classes/svelte/image/ImageLoader.svelte.js +47 -47
- package/dist/classes/svelte/image/ImageScene.svelte.js +253 -253
- package/dist/classes/svelte/image/ImageVariantsLoader.svelte.js +152 -152
- package/dist/classes/svelte/image/index.js +4 -4
- package/dist/classes/svelte/image/mocks.js +35 -35
- package/dist/classes/svelte/image/typedef.js +8 -8
- package/dist/classes/svelte/loading-state-machine/LoadingStateMachine.svelte.js +109 -109
- package/dist/classes/svelte/loading-state-machine/constants.js +16 -16
- package/dist/classes/svelte/loading-state-machine/index.js +3 -3
- package/dist/classes/svelte/network-loader/NetworkLoader.svelte.js +331 -331
- package/dist/classes/svelte/network-loader/constants.js +3 -3
- package/dist/classes/svelte/network-loader/index.js +3 -3
- package/dist/classes/svelte/network-loader/mocks.js +30 -30
- package/dist/classes/svelte/network-loader/typedef.js +8 -8
- package/dist/components/area/HkArea.svelte +49 -49
- package/dist/components/area/HkArea.svelte.d.ts +14 -0
- package/dist/components/area/HkGridArea.svelte +77 -77
- package/dist/components/area/HkGridArea.svelte.d.ts +22 -0
- package/dist/components/area/index.js +2 -2
- package/dist/components/boxes/game-box/GameBox.svelte +112 -112
- package/dist/components/boxes/game-box/GameBox.svelte.d.ts +15 -0
- package/dist/components/boxes/game-box/gamebox.util.js +83 -83
- package/dist/components/boxes/index.js +2 -2
- package/dist/components/boxes/virtual-viewport/VirtualViewport.svelte +199 -199
- package/dist/components/boxes/virtual-viewport/VirtualViewport.svelte.d.ts +22 -0
- package/dist/components/buttons/button/Button.svelte +76 -75
- package/dist/components/buttons/button/Button.svelte.d.ts +21 -0
- package/dist/components/buttons/button-icon-steeze/SteezeIconButton.svelte +30 -0
- package/dist/components/buttons/button-icon-steeze/SteezeIconButton.svelte.d.ts +16 -0
- package/dist/components/buttons/button-text/TextButton.svelte +21 -21
- package/dist/components/buttons/button-text/TextButton.svelte.d.ts +7 -0
- package/dist/components/buttons/index.d.ts +1 -0
- package/dist/components/buttons/index.js +3 -2
- package/dist/components/hkdev/blocks/TextBlock.svelte +46 -46
- package/dist/components/hkdev/blocks/TextBlock.svelte.d.ts +13 -0
- package/dist/components/hkdev/buttons/CheckButton.svelte +62 -62
- package/dist/components/hkdev/buttons/CheckButton.svelte.d.ts +18 -0
- package/dist/components/{icon → icons}/HkIcon.svelte +86 -86
- package/dist/components/icons/HkIcon.svelte.d.ts +22 -0
- package/dist/components/{icon → icons}/HkTabIcon.svelte +116 -116
- package/dist/components/icons/HkTabIcon.svelte.d.ts +40 -0
- package/dist/components/icons/SteezeIcon.svelte +96 -0
- package/dist/components/icons/SteezeIcon.svelte.d.ts +22 -0
- package/dist/components/{icon → icons}/index.d.ts +1 -0
- package/dist/components/{icon → icons}/index.js +6 -4
- package/dist/components/{icon → icons}/typedef.js +16 -16
- package/dist/components/image/ImageBox.svelte +208 -208
- package/dist/components/image/ImageBox.svelte.d.ts +19 -0
- package/dist/components/image/index.js +5 -5
- package/dist/components/image/typedef.js +32 -32
- package/dist/components/index.js +2 -2
- package/dist/components/inputs/index.js +1 -1
- package/dist/components/inputs/text-input/TestTextInput.svelte__ +102 -102
- package/dist/components/inputs/text-input/TextInput.svelte +226 -226
- package/dist/components/inputs/text-input/TextInput.svelte.d.ts +28 -0
- package/dist/components/inputs/text-input/TextInput.svelte___ +83 -83
- package/dist/components/inputs/text-input/assets/IconInvalid.svelte +14 -14
- package/dist/components/inputs/text-input/assets/IconValid.svelte +12 -12
- package/dist/components/layout/HkAppLayout.state.svelte.js +25 -25
- package/dist/components/layout/HkAppLayout.svelte +251 -251
- package/dist/components/layout/HkAppLayout.svelte.d.ts +11 -0
- package/dist/components/layout/HkGridLayers.svelte +82 -82
- package/dist/components/layout/HkGridLayers.svelte.d.ts +23 -0
- package/dist/components/layout/index.js +9 -9
- package/dist/components/panels/index.js +1 -1
- package/dist/components/panels/plain-panel/PlainPanel.svelte +33 -33
- package/dist/components/panels/plain-panel/PlainPanel.svelte.d.ts +12 -0
- package/dist/components/rows/index.js +3 -3
- package/dist/components/rows/panel-grid-row/PanelGridRow.svelte +104 -104
- package/dist/components/rows/panel-grid-row/PanelGridRow.svelte.d.ts +14 -0
- package/dist/components/rows/panel-row-2/PanelRow2.svelte +40 -40
- package/dist/components/rows/panel-row-2/PanelRow2.svelte.d.ts +14 -0
- package/dist/components/tab-bar/HkTabBar.state.svelte.js +149 -149
- package/dist/components/tab-bar/HkTabBar.svelte +74 -74
- package/dist/components/tab-bar/HkTabBar.svelte.d.ts +18 -0
- package/dist/components/tab-bar/HkTabBarSelector.state.svelte.js +93 -93
- package/dist/components/tab-bar/HkTabBarSelector.svelte +49 -49
- package/dist/components/tab-bar/HkTabBarSelector.svelte.d.ts +19 -0
- package/dist/components/tab-bar/index.js +17 -17
- package/dist/components/tab-bar/typedef.d.ts +1 -1
- package/dist/components/tab-bar/typedef.js +8 -8
- package/dist/components/widgets/compare-left-right/CompareLeftRight.svelte +179 -179
- package/dist/components/widgets/compare-left-right/CompareLeftRight.svelte.d.ts +10 -0
- package/dist/components/widgets/compare-left-right/index.js +1 -1
- package/dist/components/widgets/scale-control/index.js +1 -1
- package/dist/config/imagetools-config.js +189 -189
- package/dist/config/imagetools.d.ts +71 -71
- package/dist/config/typedef.js +8 -8
- package/dist/constants/errors/api.js +9 -9
- package/dist/constants/errors/generic.js +5 -5
- package/dist/constants/errors/index.js +3 -3
- package/dist/constants/errors/jwt.js +5 -5
- package/dist/constants/http/headers.js +6 -6
- package/dist/constants/http/index.js +2 -2
- package/dist/constants/http/methods.js +2 -2
- package/dist/constants/index.js +3 -3
- package/dist/constants/mime/application.js +5 -5
- package/dist/constants/mime/audio.js +13 -13
- package/dist/constants/mime/image.js +3 -3
- package/dist/constants/mime/index.js +4 -4
- package/dist/constants/mime/text.js +2 -2
- package/dist/constants/regexp/index.js +31 -31
- package/dist/constants/regexp/inspiratie.js__ +95 -95
- package/dist/constants/regexp/text.js +49 -49
- package/dist/constants/regexp/user.js +32 -32
- package/dist/constants/regexp/web.js +3 -3
- package/dist/constants/state-labels/input-states.js +11 -11
- package/dist/constants/state-labels/submit-states.js +4 -4
- package/dist/constants/time.js +28 -28
- package/dist/css/tw-prose.postcss__ +259 -259
- package/dist/css/utilities.postcss +43 -43
- package/dist/design/design-config.js +73 -73
- package/dist/design/tailwind-theme-extend.d.ts +4 -4
- package/dist/design/tailwind-theme-extend.js +160 -151
- package/dist/schemas/index.js +1 -1
- package/dist/schemas/validate-url.js +180 -180
- package/dist/server/index.js +1 -1
- package/dist/server/logger.js +94 -94
- package/dist/states/index.js +1 -1
- package/dist/states/navigation.svelte.js +55 -55
- package/dist/stores/index.js +1 -1
- package/dist/stores/theme.js +80 -80
- package/dist/themes/hkdev/components/blocks/text-block.postcss +40 -40
- package/dist/themes/hkdev/components/boxes/game-box.postcss +13 -13
- package/dist/themes/hkdev/components/buttons/button-icon-steeze.postcss +22 -0
- package/dist/themes/hkdev/components/buttons/button-text.postcss +34 -34
- package/dist/themes/hkdev/components/buttons/button.postcss +138 -138
- package/dist/themes/hkdev/components/buttons/button.postcss__ +40 -0
- package/dist/themes/hkdev/components/buttons/button.postcss___ +91 -0
- package/dist/themes/hkdev/components/buttons/skip-button.postcss +8 -8
- package/dist/themes/hkdev/components/icons/icon-steeze.postcss +22 -0
- package/dist/themes/hkdev/components/inputs/text-input.postcss +108 -108
- package/dist/themes/hkdev/components/panels/plain-panel.postcss +46 -46
- package/dist/themes/hkdev/components/panels/speech-bubble.postcss +52 -52
- package/dist/themes/hkdev/components/rows/panel-grid-row.postcss +7 -7
- package/dist/themes/hkdev/components/rows/panel-row-2.postcss +9 -9
- package/dist/themes/hkdev/components.postcss +61 -55
- package/dist/themes/hkdev/debug.postcss +1 -1
- package/dist/themes/hkdev/global/layout.postcss +39 -39
- package/dist/themes/hkdev/global/on-colors.postcss +53 -53
- package/dist/themes/hkdev/global/text.postcss__ +34 -34
- package/dist/themes/hkdev/global/vars.postcss__ +7 -7
- package/dist/themes/hkdev/globals.postcss +11 -11
- package/dist/themes/hkdev/responsive.postcss +12 -12
- package/dist/themes/hkdev/theme-ext.js +15 -15
- package/dist/themes/hkdev/theme.js +227 -227
- package/dist/themes/index.js +1 -1
- package/dist/util/array/index.js +455 -455
- package/dist/util/compare/index.js +247 -247
- package/dist/util/css/css-vars.js +83 -83
- package/dist/util/css/index.js +1 -1
- package/dist/util/design-system/components/states.js +22 -22
- package/dist/util/design-system/css/clamp.js +66 -66
- package/dist/util/design-system/css/root-design-vars.js +100 -100
- package/dist/util/design-system/index.js +5 -5
- package/dist/util/design-system/layout/scaling.js +97 -97
- package/dist/util/design-system/tailwind.js +289 -289
- package/dist/util/expect/arrays.js +47 -47
- package/dist/util/expect/index.js +259 -259
- package/dist/util/expect/primitives.js +55 -55
- package/dist/util/expect/url.js +60 -60
- package/dist/util/function/index.js +218 -218
- package/dist/util/http/errors.js +97 -97
- package/dist/util/http/headers.js +45 -45
- package/dist/util/http/http-request.js +273 -273
- package/dist/util/http/index.js +22 -22
- package/dist/util/http/json-request.js +143 -143
- package/dist/util/http/mocks.js +65 -65
- package/dist/util/http/response.js +228 -228
- package/dist/util/http/url.js +52 -52
- package/dist/util/image/index.js +86 -86
- package/dist/util/index.js +2 -2
- package/dist/util/is/index.js +140 -140
- package/dist/util/iterate/index.js +234 -234
- package/dist/util/object/index.js +1361 -1361
- package/dist/util/singleton/index.js +97 -97
- package/dist/util/string/index.js +184 -184
- package/dist/util/svelte/index.js +2 -2
- package/dist/util/svelte/observe/index.js +49 -49
- package/dist/util/svelte/state-context/index.js +83 -83
- package/dist/util/svelte/wait/index.js +38 -38
- package/dist/util/sveltekit/index.js +1 -1
- package/dist/util/sveltekit/route-folders/index.js +82 -82
- package/dist/util/time/index.js +339 -339
- package/dist/valibot/date.js__ +10 -10
- package/dist/valibot/index.js +9 -9
- package/dist/valibot/url.js +95 -95
- package/dist/valibot/user.js +23 -23
- package/dist/zod/all.js +33 -33
- package/dist/zod/generic.js +11 -11
- package/dist/zod/javascript.js +32 -32
- package/dist/zod/user.js +16 -16
- package/dist/zod/web.js +52 -52
- package/package.json +99 -99
- package/dist/components/icon/HkIcon.svelte.d.ts +0 -10
- package/dist/components/icon/HkTabIcon.svelte.d.ts +0 -19
- /package/dist/components/{icon → icons}/typedef.d.ts +0 -0
package/dist/util/time/index.js
CHANGED
@@ -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
|
+
}
|