@hkdigital/lib-sveltekit 0.1.5 → 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.
- 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 +0 -14
- package/dist/components/area/HkGridArea.svelte +77 -77
- package/dist/components/area/HkGridArea.svelte.d.ts +0 -22
- 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 +0 -15
- 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 +0 -22
- package/dist/components/buttons/button/Button.svelte +75 -75
- package/dist/components/buttons/button/Button.svelte.d.ts +0 -21
- package/dist/components/buttons/button-text/TextButton.svelte +21 -21
- package/dist/components/buttons/button-text/TextButton.svelte.d.ts +0 -7
- package/dist/components/buttons/index.js +2 -2
- package/dist/components/hkdev/blocks/TextBlock.svelte +46 -46
- package/dist/components/hkdev/blocks/TextBlock.svelte.d.ts +0 -13
- package/dist/components/hkdev/buttons/CheckButton.svelte +62 -62
- package/dist/components/hkdev/buttons/CheckButton.svelte.d.ts +0 -18
- package/dist/components/icon/HkIcon.svelte +86 -86
- package/dist/components/icon/HkIcon.svelte.d.ts +0 -12
- package/dist/components/icon/HkTabIcon.svelte +116 -116
- package/dist/components/icon/HkTabIcon.svelte.d.ts +0 -21
- package/dist/components/icon/index.js +4 -4
- package/dist/components/icon/typedef.js +16 -16
- package/dist/components/image/ImageBox.svelte +208 -208
- package/dist/components/image/ImageBox.svelte.d.ts +0 -19
- 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 +0 -28
- 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 +0 -11
- package/dist/components/layout/HkGridLayers.svelte +82 -82
- package/dist/components/layout/HkGridLayers.svelte.d.ts +0 -23
- 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 +0 -12
- 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 +0 -14
- package/dist/components/rows/panel-row-2/PanelRow2.svelte +40 -40
- package/dist/components/rows/panel-row-2/PanelRow2.svelte.d.ts +0 -14
- 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 +0 -18
- 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 +0 -19
- package/dist/components/tab-bar/index.js +17 -17
- 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 +0 -10
- 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 +151 -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-text.postcss +34 -34
- package/dist/themes/hkdev/components/buttons/button.postcss +138 -138
- package/dist/themes/hkdev/components/buttons/skip-button.postcss +8 -8
- 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 +55 -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.d.ts +2 -2
- 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/themes/hkdev/components/buttons/button.postcss__ +0 -40
- package/dist/themes/hkdev/components/buttons/button.postcss___ +0 -91
package/dist/util/expect/url.js
CHANGED
@@ -1,60 +1,60 @@
|
|
1
|
-
// > Imports
|
2
|
-
|
3
|
-
import * as v from 'valibot';
|
4
|
-
|
5
|
-
import {
|
6
|
-
ValidateUrl,
|
7
|
-
ValidateUrlOrEmptyString,
|
8
|
-
ValidateUrlPath,
|
9
|
-
ValidateRelativeUrl,
|
10
|
-
ValidateAbsOrRelUrl
|
11
|
-
} from '../../schemas/validate-url.js';
|
12
|
-
|
13
|
-
// > Exports
|
14
|
-
|
15
|
-
/**
|
16
|
-
* Throws a validation error if value is not an url
|
17
|
-
*
|
18
|
-
* @param {any} value
|
19
|
-
*/
|
20
|
-
export function url(value) {
|
21
|
-
v.parse(ValidateUrl, value);
|
22
|
-
}
|
23
|
-
|
24
|
-
/**
|
25
|
-
* Throws a validation error if value is not an url or
|
26
|
-
* an empty string
|
27
|
-
*
|
28
|
-
* @param {any} value
|
29
|
-
*/
|
30
|
-
export function urlOrEmptyString(value) {
|
31
|
-
v.parse(ValidateUrlOrEmptyString, value);
|
32
|
-
}
|
33
|
-
|
34
|
-
/**
|
35
|
-
* Throws a validation error if value is not a relative url
|
36
|
-
*
|
37
|
-
* @param {any} value
|
38
|
-
*/
|
39
|
-
export function urlPath(value) {
|
40
|
-
v.parse(ValidateUrlPath, value);
|
41
|
-
}
|
42
|
-
|
43
|
-
/**
|
44
|
-
* Throws a validation error if value is not a relative url
|
45
|
-
*
|
46
|
-
* @param {any} value
|
47
|
-
*/
|
48
|
-
export function relativeUrl(value) {
|
49
|
-
v.parse(ValidateRelativeUrl, value);
|
50
|
-
}
|
51
|
-
|
52
|
-
/**
|
53
|
-
* Throws a validation error if value is not an absolute
|
54
|
-
* or relative url
|
55
|
-
*
|
56
|
-
* @param {any} value
|
57
|
-
*/
|
58
|
-
export function absOrRelUrl(value) {
|
59
|
-
v.parse(ValidateAbsOrRelUrl, value);
|
60
|
-
}
|
1
|
+
// > Imports
|
2
|
+
|
3
|
+
import * as v from 'valibot';
|
4
|
+
|
5
|
+
import {
|
6
|
+
ValidateUrl,
|
7
|
+
ValidateUrlOrEmptyString,
|
8
|
+
ValidateUrlPath,
|
9
|
+
ValidateRelativeUrl,
|
10
|
+
ValidateAbsOrRelUrl
|
11
|
+
} from '../../schemas/validate-url.js';
|
12
|
+
|
13
|
+
// > Exports
|
14
|
+
|
15
|
+
/**
|
16
|
+
* Throws a validation error if value is not an url
|
17
|
+
*
|
18
|
+
* @param {any} value
|
19
|
+
*/
|
20
|
+
export function url(value) {
|
21
|
+
v.parse(ValidateUrl, value);
|
22
|
+
}
|
23
|
+
|
24
|
+
/**
|
25
|
+
* Throws a validation error if value is not an url or
|
26
|
+
* an empty string
|
27
|
+
*
|
28
|
+
* @param {any} value
|
29
|
+
*/
|
30
|
+
export function urlOrEmptyString(value) {
|
31
|
+
v.parse(ValidateUrlOrEmptyString, value);
|
32
|
+
}
|
33
|
+
|
34
|
+
/**
|
35
|
+
* Throws a validation error if value is not a relative url
|
36
|
+
*
|
37
|
+
* @param {any} value
|
38
|
+
*/
|
39
|
+
export function urlPath(value) {
|
40
|
+
v.parse(ValidateUrlPath, value);
|
41
|
+
}
|
42
|
+
|
43
|
+
/**
|
44
|
+
* Throws a validation error if value is not a relative url
|
45
|
+
*
|
46
|
+
* @param {any} value
|
47
|
+
*/
|
48
|
+
export function relativeUrl(value) {
|
49
|
+
v.parse(ValidateRelativeUrl, value);
|
50
|
+
}
|
51
|
+
|
52
|
+
/**
|
53
|
+
* Throws a validation error if value is not an absolute
|
54
|
+
* or relative url
|
55
|
+
*
|
56
|
+
* @param {any} value
|
57
|
+
*/
|
58
|
+
export function absOrRelUrl(value) {
|
59
|
+
v.parse(ValidateAbsOrRelUrl, value);
|
60
|
+
}
|
@@ -1,218 +1,218 @@
|
|
1
|
-
/**
|
2
|
-
* function.js
|
3
|
-
*
|
4
|
-
* @description
|
5
|
-
* This file contains code for working with functions
|
6
|
-
*
|
7
|
-
* @example
|
8
|
-
*
|
9
|
-
* import { once } from "./function.js";
|
10
|
-
*
|
11
|
-
* const sayHelloOnce = once( () => { console.log("Hello"); } );
|
12
|
-
*
|
13
|
-
* sayHelloOnce();
|
14
|
-
* sayHelloOnce();
|
15
|
-
*
|
16
|
-
* @example
|
17
|
-
*
|
18
|
-
* import { defer } from './process.js';
|
19
|
-
*
|
20
|
-
* defer( () => {
|
21
|
-
* console.log("The execution of the function has been defered");
|
22
|
-
* } );
|
23
|
-
*/
|
24
|
-
|
25
|
-
/* ------------------------------------------------------------------ Imports */
|
26
|
-
|
27
|
-
import * as expect from '../expect/index.js';
|
28
|
-
|
29
|
-
/* ---------------------------------------------------------------- Internals */
|
30
|
-
|
31
|
-
const NEXT_TICK_MESSAGE = 'hk-next-tick';
|
32
|
-
|
33
|
-
/**
|
34
|
-
* Detect and return the most suitable setImmediate implementation available
|
35
|
-
* on the current platform
|
36
|
-
*/
|
37
|
-
function set_immediate_implementation() {
|
38
|
-
if (typeof global !== 'undefined') {
|
39
|
-
if (undefined !== global.setImmediate) {
|
40
|
-
return global.setImmediate;
|
41
|
-
}
|
42
|
-
} else if (typeof window !== 'undefined') {
|
43
|
-
if (window.postMessage && window.addEventListener) {
|
44
|
-
const queue = [];
|
45
|
-
|
46
|
-
window.addEventListener(
|
47
|
-
'message',
|
48
|
-
(event) => {
|
49
|
-
const source = event.source;
|
50
|
-
|
51
|
-
if ((source === window || source === null) && event.data === NEXT_TICK_MESSAGE) {
|
52
|
-
event.stopPropagation();
|
53
|
-
if (queue.length > 0) {
|
54
|
-
const fn = queue.shift();
|
55
|
-
fn();
|
56
|
-
}
|
57
|
-
}
|
58
|
-
},
|
59
|
-
true
|
60
|
-
);
|
61
|
-
|
62
|
-
return function nextTickUsingPostMessage(fn) {
|
63
|
-
expect.function(fn);
|
64
|
-
|
65
|
-
queue.push(fn);
|
66
|
-
window.postMessage(NEXT_TICK_MESSAGE, '*');
|
67
|
-
};
|
68
|
-
}
|
69
|
-
}
|
70
|
-
|
71
|
-
throw new Error('No suitable [setImmediate] implementation available');
|
72
|
-
}
|
73
|
-
|
74
|
-
/* ------------------------------------------------------------------ Exports */
|
75
|
-
|
76
|
-
/**
|
77
|
-
* 'No operation' function
|
78
|
-
* - A function that does nothing
|
79
|
-
*/
|
80
|
-
export const noop = () => {};
|
81
|
-
|
82
|
-
// -----------------------------------------------------------------------------
|
83
|
-
|
84
|
-
/**
|
85
|
-
* Wraps a function so that the callback function will be called only once
|
86
|
-
*
|
87
|
-
* @param {function} callback
|
88
|
-
*
|
89
|
-
* @returns {function} callback wrapped in `once` function
|
90
|
-
*/
|
91
|
-
export function once(callback) {
|
92
|
-
expect.function(callback);
|
93
|
-
|
94
|
-
let ignore = false;
|
95
|
-
|
96
|
-
return function () {
|
97
|
-
if (!ignore) {
|
98
|
-
ignore = true;
|
99
|
-
callback(...arguments);
|
100
|
-
}
|
101
|
-
};
|
102
|
-
}
|
103
|
-
|
104
|
-
// -----------------------------------------------------------------------------
|
105
|
-
|
106
|
-
/**
|
107
|
-
* Returns a debounced function
|
108
|
-
* - The original function is not called more than once during the
|
109
|
-
* specified interval
|
110
|
-
*
|
111
|
-
* @param {function} fn
|
112
|
-
* @param {number} [intervalMs=200]
|
113
|
-
*
|
114
|
-
* @returns {function} debounced function
|
115
|
-
*/
|
116
|
-
export function debounce(fn, intervalMs = 200) {
|
117
|
-
let idleTimer;
|
118
|
-
let lastArguments;
|
119
|
-
|
120
|
-
// console.log("debounce");
|
121
|
-
|
122
|
-
return function debounced() {
|
123
|
-
// console.log("debounced");
|
124
|
-
|
125
|
-
if (idleTimer) {
|
126
|
-
// console.log("idleTimer running");
|
127
|
-
|
128
|
-
// The function has been called recently
|
129
|
-
lastArguments = arguments;
|
130
|
-
return;
|
131
|
-
}
|
132
|
-
|
133
|
-
idleTimer = setTimeout(() => {
|
134
|
-
// console.log("idleTimer finished", lastArguments);
|
135
|
-
|
136
|
-
idleTimer = null;
|
137
|
-
|
138
|
-
if (lastArguments) {
|
139
|
-
//
|
140
|
-
// At least one call has been "debounced"
|
141
|
-
// -> make call with last arguments, so function always receives
|
142
|
-
// the arguments of the last call to the function
|
143
|
-
//
|
144
|
-
fn(...lastArguments);
|
145
|
-
lastArguments = undefined;
|
146
|
-
}
|
147
|
-
}, intervalMs);
|
148
|
-
|
149
|
-
fn(...arguments);
|
150
|
-
};
|
151
|
-
}
|
152
|
-
|
153
|
-
// -----------------------------------------------------------------------------
|
154
|
-
|
155
|
-
/**
|
156
|
-
* Defer the execution of a function
|
157
|
-
* - Uses the best 'setImmediate' implementation supported by the current
|
158
|
-
* runtime environment
|
159
|
-
*
|
160
|
-
* @param {function} fn - Function to execute
|
161
|
-
*
|
162
|
-
* --
|
163
|
-
*
|
164
|
-
* @note setImmediate is preferred over nextTick
|
165
|
-
*
|
166
|
-
* @see https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/
|
167
|
-
*/
|
168
|
-
export const defer = set_immediate_implementation();
|
169
|
-
|
170
|
-
// -----------------------------------------------------------------------------
|
171
|
-
|
172
|
-
/**
|
173
|
-
* Adds a wrapper around a function that only calls the supplied function
|
174
|
-
* if the (first) supplied argument to the returned function is not `null`
|
175
|
-
*
|
176
|
-
* @param {object} [object]
|
177
|
-
* Optional function context to be used as `this`
|
178
|
-
*
|
179
|
-
* @param {function} functionOrMethodName
|
180
|
-
*
|
181
|
-
* @returns {function} not null wrapper function
|
182
|
-
*/
|
183
|
-
// export function ifNotNull( /* object, functionOrMethodName */ )
|
184
|
-
// {
|
185
|
-
// let fn;
|
186
|
-
|
187
|
-
// switch( arguments.length )
|
188
|
-
// {
|
189
|
-
// case 1:
|
190
|
-
// fn = arguments[0];
|
191
|
-
// expectFunction( fn, "Missing or invalid parameter [fn]" );
|
192
|
-
// break;
|
193
|
-
|
194
|
-
// case 2:
|
195
|
-
// {
|
196
|
-
// const object = arguments[0];
|
197
|
-
// const methodName = arguments[1];
|
198
|
-
|
199
|
-
// expectObject( object, "Invalid parameter [object]" );
|
200
|
-
// expectNotEmptyString( methodName, "Invalid parameter [methodName]" );
|
201
|
-
|
202
|
-
// fn = object[ methodName ].bind( object );
|
203
|
-
|
204
|
-
// expectFunction( fn, `Invalid method [<object>.${methodName}]` );
|
205
|
-
// }
|
206
|
-
// break;
|
207
|
-
|
208
|
-
// default:
|
209
|
-
// throw new Error("Invalid number of arguments");
|
210
|
-
// }
|
211
|
-
|
212
|
-
// return async ( value ) => {
|
213
|
-
// if( null !== value )
|
214
|
-
// {
|
215
|
-
// await fn( value );
|
216
|
-
// }
|
217
|
-
// };
|
218
|
-
// }
|
1
|
+
/**
|
2
|
+
* function.js
|
3
|
+
*
|
4
|
+
* @description
|
5
|
+
* This file contains code for working with functions
|
6
|
+
*
|
7
|
+
* @example
|
8
|
+
*
|
9
|
+
* import { once } from "./function.js";
|
10
|
+
*
|
11
|
+
* const sayHelloOnce = once( () => { console.log("Hello"); } );
|
12
|
+
*
|
13
|
+
* sayHelloOnce();
|
14
|
+
* sayHelloOnce();
|
15
|
+
*
|
16
|
+
* @example
|
17
|
+
*
|
18
|
+
* import { defer } from './process.js';
|
19
|
+
*
|
20
|
+
* defer( () => {
|
21
|
+
* console.log("The execution of the function has been defered");
|
22
|
+
* } );
|
23
|
+
*/
|
24
|
+
|
25
|
+
/* ------------------------------------------------------------------ Imports */
|
26
|
+
|
27
|
+
import * as expect from '../expect/index.js';
|
28
|
+
|
29
|
+
/* ---------------------------------------------------------------- Internals */
|
30
|
+
|
31
|
+
const NEXT_TICK_MESSAGE = 'hk-next-tick';
|
32
|
+
|
33
|
+
/**
|
34
|
+
* Detect and return the most suitable setImmediate implementation available
|
35
|
+
* on the current platform
|
36
|
+
*/
|
37
|
+
function set_immediate_implementation() {
|
38
|
+
if (typeof global !== 'undefined') {
|
39
|
+
if (undefined !== global.setImmediate) {
|
40
|
+
return global.setImmediate;
|
41
|
+
}
|
42
|
+
} else if (typeof window !== 'undefined') {
|
43
|
+
if (window.postMessage && window.addEventListener) {
|
44
|
+
const queue = [];
|
45
|
+
|
46
|
+
window.addEventListener(
|
47
|
+
'message',
|
48
|
+
(event) => {
|
49
|
+
const source = event.source;
|
50
|
+
|
51
|
+
if ((source === window || source === null) && event.data === NEXT_TICK_MESSAGE) {
|
52
|
+
event.stopPropagation();
|
53
|
+
if (queue.length > 0) {
|
54
|
+
const fn = queue.shift();
|
55
|
+
fn();
|
56
|
+
}
|
57
|
+
}
|
58
|
+
},
|
59
|
+
true
|
60
|
+
);
|
61
|
+
|
62
|
+
return function nextTickUsingPostMessage(fn) {
|
63
|
+
expect.function(fn);
|
64
|
+
|
65
|
+
queue.push(fn);
|
66
|
+
window.postMessage(NEXT_TICK_MESSAGE, '*');
|
67
|
+
};
|
68
|
+
}
|
69
|
+
}
|
70
|
+
|
71
|
+
throw new Error('No suitable [setImmediate] implementation available');
|
72
|
+
}
|
73
|
+
|
74
|
+
/* ------------------------------------------------------------------ Exports */
|
75
|
+
|
76
|
+
/**
|
77
|
+
* 'No operation' function
|
78
|
+
* - A function that does nothing
|
79
|
+
*/
|
80
|
+
export const noop = () => {};
|
81
|
+
|
82
|
+
// -----------------------------------------------------------------------------
|
83
|
+
|
84
|
+
/**
|
85
|
+
* Wraps a function so that the callback function will be called only once
|
86
|
+
*
|
87
|
+
* @param {function} callback
|
88
|
+
*
|
89
|
+
* @returns {function} callback wrapped in `once` function
|
90
|
+
*/
|
91
|
+
export function once(callback) {
|
92
|
+
expect.function(callback);
|
93
|
+
|
94
|
+
let ignore = false;
|
95
|
+
|
96
|
+
return function () {
|
97
|
+
if (!ignore) {
|
98
|
+
ignore = true;
|
99
|
+
callback(...arguments);
|
100
|
+
}
|
101
|
+
};
|
102
|
+
}
|
103
|
+
|
104
|
+
// -----------------------------------------------------------------------------
|
105
|
+
|
106
|
+
/**
|
107
|
+
* Returns a debounced function
|
108
|
+
* - The original function is not called more than once during the
|
109
|
+
* specified interval
|
110
|
+
*
|
111
|
+
* @param {function} fn
|
112
|
+
* @param {number} [intervalMs=200]
|
113
|
+
*
|
114
|
+
* @returns {function} debounced function
|
115
|
+
*/
|
116
|
+
export function debounce(fn, intervalMs = 200) {
|
117
|
+
let idleTimer;
|
118
|
+
let lastArguments;
|
119
|
+
|
120
|
+
// console.log("debounce");
|
121
|
+
|
122
|
+
return function debounced() {
|
123
|
+
// console.log("debounced");
|
124
|
+
|
125
|
+
if (idleTimer) {
|
126
|
+
// console.log("idleTimer running");
|
127
|
+
|
128
|
+
// The function has been called recently
|
129
|
+
lastArguments = arguments;
|
130
|
+
return;
|
131
|
+
}
|
132
|
+
|
133
|
+
idleTimer = setTimeout(() => {
|
134
|
+
// console.log("idleTimer finished", lastArguments);
|
135
|
+
|
136
|
+
idleTimer = null;
|
137
|
+
|
138
|
+
if (lastArguments) {
|
139
|
+
//
|
140
|
+
// At least one call has been "debounced"
|
141
|
+
// -> make call with last arguments, so function always receives
|
142
|
+
// the arguments of the last call to the function
|
143
|
+
//
|
144
|
+
fn(...lastArguments);
|
145
|
+
lastArguments = undefined;
|
146
|
+
}
|
147
|
+
}, intervalMs);
|
148
|
+
|
149
|
+
fn(...arguments);
|
150
|
+
};
|
151
|
+
}
|
152
|
+
|
153
|
+
// -----------------------------------------------------------------------------
|
154
|
+
|
155
|
+
/**
|
156
|
+
* Defer the execution of a function
|
157
|
+
* - Uses the best 'setImmediate' implementation supported by the current
|
158
|
+
* runtime environment
|
159
|
+
*
|
160
|
+
* @param {function} fn - Function to execute
|
161
|
+
*
|
162
|
+
* --
|
163
|
+
*
|
164
|
+
* @note setImmediate is preferred over nextTick
|
165
|
+
*
|
166
|
+
* @see https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/
|
167
|
+
*/
|
168
|
+
export const defer = set_immediate_implementation();
|
169
|
+
|
170
|
+
// -----------------------------------------------------------------------------
|
171
|
+
|
172
|
+
/**
|
173
|
+
* Adds a wrapper around a function that only calls the supplied function
|
174
|
+
* if the (first) supplied argument to the returned function is not `null`
|
175
|
+
*
|
176
|
+
* @param {object} [object]
|
177
|
+
* Optional function context to be used as `this`
|
178
|
+
*
|
179
|
+
* @param {function} functionOrMethodName
|
180
|
+
*
|
181
|
+
* @returns {function} not null wrapper function
|
182
|
+
*/
|
183
|
+
// export function ifNotNull( /* object, functionOrMethodName */ )
|
184
|
+
// {
|
185
|
+
// let fn;
|
186
|
+
|
187
|
+
// switch( arguments.length )
|
188
|
+
// {
|
189
|
+
// case 1:
|
190
|
+
// fn = arguments[0];
|
191
|
+
// expectFunction( fn, "Missing or invalid parameter [fn]" );
|
192
|
+
// break;
|
193
|
+
|
194
|
+
// case 2:
|
195
|
+
// {
|
196
|
+
// const object = arguments[0];
|
197
|
+
// const methodName = arguments[1];
|
198
|
+
|
199
|
+
// expectObject( object, "Invalid parameter [object]" );
|
200
|
+
// expectNotEmptyString( methodName, "Invalid parameter [methodName]" );
|
201
|
+
|
202
|
+
// fn = object[ methodName ].bind( object );
|
203
|
+
|
204
|
+
// expectFunction( fn, `Invalid method [<object>.${methodName}]` );
|
205
|
+
// }
|
206
|
+
// break;
|
207
|
+
|
208
|
+
// default:
|
209
|
+
// throw new Error("Invalid number of arguments");
|
210
|
+
// }
|
211
|
+
|
212
|
+
// return async ( value ) => {
|
213
|
+
// if( null !== value )
|
214
|
+
// {
|
215
|
+
// await fn( value );
|
216
|
+
// }
|
217
|
+
// };
|
218
|
+
// }
|