@hkdigital/lib-sveltekit 0.2.8 → 0.2.9

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 (243) hide show
  1. package/README.md +135 -135
  2. package/dist/assets/autospuiten/car-paint-picker.js +41 -41
  3. package/dist/assets/autospuiten/labels.js +7 -7
  4. package/dist/classes/cache/IndexedDbCache.js +1407 -1407
  5. package/dist/classes/cache/MemoryResponseCache.js +138 -138
  6. package/dist/classes/cache/index.js +5 -5
  7. package/dist/classes/cache/typedef.js +41 -41
  8. package/dist/classes/data/IterableTree.js +243 -243
  9. package/dist/classes/data/Selector.js +190 -190
  10. package/dist/classes/data/index.js +2 -2
  11. package/dist/classes/events/EventEmitter.js +275 -275
  12. package/dist/classes/events/index.js +2 -2
  13. package/dist/classes/index.js +4 -4
  14. package/dist/classes/logging/Logger.js +158 -158
  15. package/dist/classes/logging/constants.js +18 -18
  16. package/dist/classes/logging/index.js +4 -4
  17. package/dist/classes/promise/HkPromise.js +377 -377
  18. package/dist/classes/promise/index.js +1 -1
  19. package/dist/classes/services/ServiceBase.js +409 -409
  20. package/dist/classes/services/ServiceManager.js +1114 -1114
  21. package/dist/classes/services/constants.js +12 -12
  22. package/dist/classes/services/index.js +5 -5
  23. package/dist/classes/stores/SubscribersCount.js +107 -107
  24. package/dist/classes/stores/index.js +1 -1
  25. package/dist/classes/streams/LogTransformStream.js +19 -19
  26. package/dist/classes/streams/ServerEventsStore.js +110 -110
  27. package/dist/classes/streams/TimeStampSource.js +26 -26
  28. package/dist/classes/streams/index.js +3 -3
  29. package/dist/classes/svelte/audio/AudioLoader.svelte.js +58 -58
  30. package/dist/classes/svelte/audio/AudioScene.svelte.js +324 -324
  31. package/dist/classes/svelte/audio/mocks.js +35 -35
  32. package/dist/classes/svelte/finite-state-machine/FiniteStateMachine.svelte.js +133 -133
  33. package/dist/classes/svelte/finite-state-machine/index.js +1 -1
  34. package/dist/classes/svelte/image/ImageLoader.svelte.js +45 -45
  35. package/dist/classes/svelte/image/ImageScene.svelte.js +249 -249
  36. package/dist/classes/svelte/image/ImageVariantsLoader.svelte.js +152 -152
  37. package/dist/classes/svelte/image/index.js +4 -4
  38. package/dist/classes/svelte/image/mocks.js +35 -35
  39. package/dist/classes/svelte/image/typedef.js +8 -8
  40. package/dist/classes/svelte/index.js +14 -14
  41. package/dist/classes/svelte/loading-state-machine/LoadingStateMachine.svelte.js +109 -109
  42. package/dist/classes/svelte/loading-state-machine/constants.js +16 -16
  43. package/dist/classes/svelte/loading-state-machine/index.js +3 -3
  44. package/dist/classes/svelte/network-loader/NetworkLoader.svelte.js +338 -338
  45. package/dist/classes/svelte/network-loader/constants.js +3 -3
  46. package/dist/classes/svelte/network-loader/index.js +3 -3
  47. package/dist/classes/svelte/network-loader/mocks.js +30 -30
  48. package/dist/classes/svelte/network-loader/typedef.js +8 -8
  49. package/dist/components/area/HkArea.svelte +49 -49
  50. package/dist/components/area/HkGridArea.svelte +77 -77
  51. package/dist/components/area/index.js +2 -2
  52. package/dist/components/buttons/button/Button.svelte +82 -82
  53. package/dist/components/buttons/button-icon-steeze/SteezeIconButton.svelte +30 -30
  54. package/dist/components/buttons/button-text/TextButton.svelte +21 -21
  55. package/dist/components/buttons/index.js +3 -3
  56. package/dist/components/debug/debug-panel-design-scaling/DebugPanelDesignScaling.svelte +146 -146
  57. package/dist/components/debug/index.js +1 -1
  58. package/dist/components/drag-drop/DragController.js +44 -44
  59. package/dist/components/drag-drop/DragDropContext.svelte +112 -110
  60. package/dist/components/drag-drop/Draggable.svelte +498 -512
  61. package/dist/components/drag-drop/{Dropzone.svelte → DropZone.svelte} +258 -258
  62. package/dist/components/drag-drop/DropZoneArea.svelte +119 -119
  63. package/dist/components/drag-drop/DropZoneList.svelte +125 -125
  64. package/dist/components/drag-drop/actions.d.ts +6 -0
  65. package/dist/components/drag-drop/actions.js +18 -0
  66. package/dist/components/drag-drop/drag-state.svelte.js +319 -319
  67. package/dist/components/drag-drop/index.js +7 -7
  68. package/dist/components/drag-drop/util.js +85 -85
  69. package/dist/components/hkdev/blocks/TextBlock.svelte +46 -46
  70. package/dist/components/hkdev/buttons/CheckButton.svelte +62 -62
  71. package/dist/components/icons/HkIcon.svelte +86 -86
  72. package/dist/components/icons/HkTabIcon.svelte +116 -116
  73. package/dist/components/icons/SteezeIcon.svelte +97 -97
  74. package/dist/components/icons/index.js +6 -6
  75. package/dist/components/icons/typedef.js +16 -16
  76. package/dist/components/index.js +2 -2
  77. package/dist/components/inputs/index.js +1 -1
  78. package/dist/components/inputs/text-input/TestTextInput.svelte__ +102 -102
  79. package/dist/components/inputs/text-input/TextInput.svelte +223 -223
  80. package/dist/components/inputs/text-input/TextInput.svelte___ +83 -83
  81. package/dist/components/inputs/text-input/assets/IconInvalid.svelte +14 -14
  82. package/dist/components/inputs/text-input/assets/IconValid.svelte +12 -12
  83. package/dist/components/layout/grid-layers/GridLayers.svelte +63 -63
  84. package/dist/components/layout/grid-layers/GridLayers.svelte__heightFrom__ +372 -0
  85. package/dist/components/layout/grid-layers/util.js +74 -74
  86. package/dist/components/layout/index.js +1 -1
  87. package/dist/components/panels/index.js +1 -1
  88. package/dist/components/panels/panel/Panel.svelte +43 -43
  89. package/dist/components/rows/index.js +3 -3
  90. package/dist/components/rows/panel-grid-row/PanelGridRow.svelte +104 -104
  91. package/dist/components/rows/panel-row-2/PanelRow2.svelte +40 -40
  92. package/dist/components/tab-bar/HkTabBar.state.svelte.js +149 -149
  93. package/dist/components/tab-bar/HkTabBar.svelte +74 -74
  94. package/dist/components/tab-bar/HkTabBarSelector.state.svelte.js +93 -93
  95. package/dist/components/tab-bar/HkTabBarSelector.svelte +49 -49
  96. package/dist/components/tab-bar/index.js +17 -17
  97. package/dist/components/tab-bar/typedef.js +11 -11
  98. package/dist/config/imagetools-config.js +189 -189
  99. package/dist/config/imagetools.d.ts +72 -72
  100. package/dist/constants/bases.js +13 -13
  101. package/dist/constants/errors/api.js +9 -9
  102. package/dist/constants/errors/generic.js +5 -5
  103. package/dist/constants/errors/index.js +3 -3
  104. package/dist/constants/errors/jwt.js +5 -5
  105. package/dist/constants/http/headers.js +6 -6
  106. package/dist/constants/http/index.js +2 -2
  107. package/dist/constants/http/methods.js +2 -2
  108. package/dist/constants/index.js +3 -3
  109. package/dist/constants/mime/application.js +5 -5
  110. package/dist/constants/mime/audio.js +13 -13
  111. package/dist/constants/mime/image.js +3 -3
  112. package/dist/constants/mime/index.js +4 -4
  113. package/dist/constants/mime/text.js +2 -2
  114. package/dist/constants/regexp/index.js +31 -31
  115. package/dist/constants/regexp/inspiratie.js__ +95 -95
  116. package/dist/constants/regexp/text.js +49 -49
  117. package/dist/constants/regexp/user.js +32 -32
  118. package/dist/constants/regexp/web.js +3 -3
  119. package/dist/constants/state-labels/drag-states.js +6 -6
  120. package/dist/constants/state-labels/drop-states.js +6 -6
  121. package/dist/constants/state-labels/input-states.js +11 -11
  122. package/dist/constants/state-labels/submit-states.js +4 -4
  123. package/dist/constants/time.js +28 -28
  124. package/dist/css/utilities.css +43 -43
  125. package/dist/design/design-config.js +73 -73
  126. package/dist/design/tailwind-theme-extend.js +158 -158
  127. package/dist/features/button-group/ButtonGroup.svelte +82 -82
  128. package/dist/features/button-group/typedef.js +10 -10
  129. package/dist/features/compare-left-right/CompareLeftRight.svelte +179 -179
  130. package/dist/features/compare-left-right/index.js +1 -1
  131. package/dist/features/game-box/GameBox.svelte +577 -577
  132. package/dist/features/game-box/gamebox.util.js +83 -83
  133. package/dist/features/hk-app-layout/HkAppLayout.state.svelte.js +25 -25
  134. package/dist/features/hk-app-layout/HkAppLayout.svelte +251 -251
  135. package/dist/features/image-box/ImageBox.svelte +210 -210
  136. package/dist/features/image-box/index.js +5 -5
  137. package/dist/features/image-box/typedef.js +32 -32
  138. package/dist/features/index.js +23 -23
  139. package/dist/features/presenter/ImageSlide.svelte +64 -64
  140. package/dist/features/presenter/Presenter.state.svelte.js +638 -638
  141. package/dist/features/presenter/Presenter.svelte +142 -142
  142. package/dist/features/presenter/constants.js +7 -7
  143. package/dist/features/presenter/index.js +10 -10
  144. package/dist/features/presenter/typedef.js +106 -106
  145. package/dist/features/presenter/util.js +210 -210
  146. package/dist/features/virtual-viewport/VirtualViewport.svelte +196 -196
  147. package/dist/schemas/index.js +1 -1
  148. package/dist/schemas/validate-url.js +180 -180
  149. package/dist/server/index.js +1 -1
  150. package/dist/server/logger.js +94 -94
  151. package/dist/states/index.js +1 -1
  152. package/dist/states/navigation.svelte.js +55 -55
  153. package/dist/stores/index.js +1 -1
  154. package/dist/stores/theme.js +80 -80
  155. package/dist/themes/hkdev/components/blocks/text-block.css +41 -41
  156. package/dist/themes/hkdev/components/boxes/game-box.css +12 -12
  157. package/dist/themes/hkdev/components/buttons/button-icon-steeze.css +22 -22
  158. package/dist/themes/hkdev/components/buttons/button-text.css +32 -32
  159. package/dist/themes/hkdev/components/buttons/button.css +146 -146
  160. package/dist/themes/hkdev/components/buttons/skip-button.css +6 -6
  161. package/dist/themes/hkdev/components/drag-drop/draggable.css +73 -73
  162. package/dist/themes/hkdev/components/drag-drop/drop-zone.css +48 -48
  163. package/dist/themes/hkdev/components/icons/icon-steeze.css +22 -22
  164. package/dist/themes/hkdev/components/inputs/text-input.css +104 -104
  165. package/dist/themes/hkdev/components/panels/panel.css +27 -27
  166. package/dist/themes/hkdev/components/rows/panel-grid-row.css +6 -6
  167. package/dist/themes/hkdev/components/rows/panel-row-2.css +7 -7
  168. package/dist/themes/hkdev/components.css +53 -53
  169. package/dist/themes/hkdev/debug.css +1 -1
  170. package/dist/themes/hkdev/global/layout.css +39 -39
  171. package/dist/themes/hkdev/global/on-colors.css +53 -53
  172. package/dist/themes/hkdev/globals.css +11 -11
  173. package/dist/themes/hkdev/responsive.css +12 -12
  174. package/dist/themes/hkdev/theme-ext.js +15 -15
  175. package/dist/themes/hkdev/theme.js +235 -235
  176. package/dist/themes/index.js +1 -1
  177. package/dist/typedef/context.js +6 -6
  178. package/dist/typedef/drag.js +25 -25
  179. package/dist/typedef/drop.js +12 -12
  180. package/dist/typedef/image.js +38 -38
  181. package/dist/typedef/index.js +4 -4
  182. package/dist/util/array/index.js +436 -436
  183. package/dist/util/bases/base58.js +262 -262
  184. package/dist/util/bases/index.js +1 -1
  185. package/dist/util/compare/index.js +247 -247
  186. package/dist/util/css/css-vars.js +83 -83
  187. package/dist/util/css/index.js +1 -1
  188. package/dist/util/design-system/components/states.js +22 -22
  189. package/dist/util/design-system/css/clamp.js +66 -66
  190. package/dist/util/design-system/css/root-design-vars.js +102 -102
  191. package/dist/util/design-system/index.js +5 -5
  192. package/dist/util/design-system/layout/scaling.js +228 -228
  193. package/dist/util/design-system/skeleton.js +208 -208
  194. package/dist/util/design-system/tailwind.js +288 -288
  195. package/dist/util/env/index.js +9 -9
  196. package/dist/util/expect/arrays.js +47 -47
  197. package/dist/util/expect/index.js +259 -259
  198. package/dist/util/expect/primitives.js +55 -55
  199. package/dist/util/expect/url.js +60 -60
  200. package/dist/util/function/index.js +218 -218
  201. package/dist/util/geo/index.js +26 -26
  202. package/dist/util/http/caching.js +263 -263
  203. package/dist/util/http/errors.js +97 -97
  204. package/dist/util/http/headers.js +75 -75
  205. package/dist/util/http/http-request.js +379 -379
  206. package/dist/util/http/index.js +22 -22
  207. package/dist/util/http/json-request.js +224 -224
  208. package/dist/util/http/mocks.js +65 -65
  209. package/dist/util/http/response.js +294 -294
  210. package/dist/util/http/test-data__/content-length-test-hkdigital-small.V4HfZyBQ.avif +0 -0
  211. package/dist/util/http/typedef.js +93 -93
  212. package/dist/util/http/url.js +52 -52
  213. package/dist/util/image/index.js +86 -86
  214. package/dist/util/index.js +2 -2
  215. package/dist/util/is/index.js +140 -140
  216. package/dist/util/iterate/index.js +234 -234
  217. package/dist/util/object/index.js +1361 -1361
  218. package/dist/util/singleton/index.js +97 -97
  219. package/dist/util/string/array-path.js +75 -75
  220. package/dist/util/string/convert.js +54 -54
  221. package/dist/util/string/fs.js +226 -226
  222. package/dist/util/string/index.js +5 -5
  223. package/dist/util/string/interpolate.js +61 -61
  224. package/dist/util/string/pad.js +10 -10
  225. package/dist/util/svelte/index.js +4 -4
  226. package/dist/util/svelte/loading/loading-tracker.svelte.js +108 -108
  227. package/dist/util/svelte/observe/index.js +49 -49
  228. package/dist/util/svelte/state-context/index.js +117 -117
  229. package/dist/util/svelte/wait/index.js +38 -38
  230. package/dist/util/sveltekit/index.js +1 -1
  231. package/dist/util/sveltekit/route-folders/index.js +101 -101
  232. package/dist/util/time/index.js +323 -323
  233. package/dist/util/unique/index.js +249 -249
  234. package/dist/valibot/date.js__ +10 -10
  235. package/dist/valibot/index.js +9 -9
  236. package/dist/valibot/url.js +95 -95
  237. package/dist/valibot/user.js +23 -23
  238. package/dist/zod/all.js +33 -33
  239. package/dist/zod/generic.js +11 -11
  240. package/dist/zod/javascript.js +32 -32
  241. package/dist/zod/user.js +16 -16
  242. package/dist/zod/web.js +52 -52
  243. package/package.json +112 -112
@@ -1,436 +1,436 @@
1
- /* ------------------------------------------------------------------ Imports */
2
-
3
- import * as expect from '../expect/index.js';
4
-
5
- import { smallestFirst, largestFirst } from '../compare/index.js';
6
-
7
- import { objectGet, PATH_SEPARATOR } from '../object/index.js';
8
-
9
- import Selector from '../../classes/data/Selector.js';
10
-
11
- /* ---------------------------------------------------------------- Internals */
12
-
13
- const arraySlice = Array.prototype.slice;
14
- const arrayConcat = Array.prototype.concat;
15
-
16
- /* ------------------------------------------------------------------ Exports */
17
-
18
- export { PATH_SEPARATOR } from '../object/index.js';
19
-
20
- export { smallestFirst, largestFirst };
21
-
22
- export { arraySlice, arrayConcat };
23
-
24
- /**
25
- * Convert a value to an array
26
- * - Converts an Arguments object to plain JS array
27
- * - If the value is undefined or null, an empty array is returned
28
- * - A primitive value is "wrapped" in an array
29
- *
30
- * @param {any} value - Item to convert
31
- *
32
- * @param {number} [start]
33
- * Index of the array to start extraction.
34
- * (the first element of the array is at index 0)
35
- *
36
- * @param {number} [end]
37
- * Index of the array where the extraction should end
38
- *
39
- * --
40
- *
41
- * @returns {Array} array
42
- *
43
- * --
44
- *
45
- * @example
46
- * toArray( [ 1, 2, 3, 4, 5 ], 2, 4 ) returns [ 3, 4 ]
47
- */
48
- export function toArray(value, start, end) {
49
- if (Array.isArray(value)) {
50
- //
51
- // Do not clone input value if it is already an array
52
- //
53
- // @note this behaviour differs from Array.from
54
- //
55
- if (undefined === start) {
56
- return value;
57
- }
58
-
59
- return value.slice(start, end);
60
- }
61
-
62
- if (undefined === value || null === value) {
63
- //
64
- // Return an empty array if value is undefined or null
65
- //
66
- // ==> this behaviour differs from Array.from() <==
67
- //
68
- return [];
69
- } else if (!(value instanceof Object)) {
70
- //
71
- // Wrap (non-object) in array (e.g. a string)
72
- //
73
- // @note this behaviour differs from Array.from
74
- //
75
- return [value];
76
- }
77
-
78
- if (undefined === start) {
79
- //
80
- // Construct a new array from the value
81
- //
82
- return Array.from(value);
83
- } else {
84
- return arraySlice.call(value, start, end);
85
- }
86
- }
87
-
88
- /**
89
- * Convert an async iterator to an array
90
- * - If no async iterator is passed, the value will be processed by `from()`
91
- *
92
- * @param {AsyncIterator|any} value
93
- * Async iterator or value to convert to array
94
- *
95
- * @returns {Promise<Array>} list of items returned by the iterator
96
- */
97
- export async function toArrayAsync(value) {
98
- if (
99
- value instanceof Object &&
100
- typeof value[Symbol.asyncIterator] === 'function'
101
- ) {
102
- // value is an async iterator
103
-
104
- const arr = [];
105
-
106
- for await (const item of value) {
107
- arr.push(item);
108
- }
109
-
110
- return arr;
111
- } else {
112
- // value is not an async iterator
113
-
114
- return toArray(value);
115
- }
116
- }
117
-
118
- /**
119
- * Convert a path string to an array path
120
- * - The path string will be spit at the `pathSeparator` token
121
- * - If the supplied path is already an array, the original array will
122
- * be returned
123
- *
124
- * @param {string|string[]} path
125
- * String or array path (e.g. "some.path.to")
126
- *
127
- * @param {string} [pathSeparator=PATH_SEPARATOR]
128
- * A custom path separator to use instead of the default "."
129
- *
130
- * @returns {string[]} array path (e.g. ["some", "path", "to"])
131
- */
132
- export function toArrayPath(path, pathSeparator = PATH_SEPARATOR) {
133
- if (typeof path === 'string') {
134
- return path.split(pathSeparator);
135
- } else if (Array.isArray(path)) {
136
- // path is already an array
137
- return path;
138
- } else {
139
- throw new Error(
140
- 'Missing or invalid parameter [path] (expected string or array)'
141
- );
142
- }
143
- }
144
-
145
- /**
146
- * Push a value to an array if it is not null, undefined or an empty string
147
- *
148
- * @template {array} T
149
- * @param {T} arr
150
- * @param {any} value
151
- *
152
- * @returns {T} arr
153
- */
154
- export function pushNotEmpty(arr, value) {
155
- expect.array(arr);
156
-
157
- if (value !== null && value !== undefined && value !== '') {
158
- arr.push(value);
159
- }
160
-
161
- return arr;
162
- }
163
-
164
- /**
165
- * Loop over the supplied array and call the callback for every element
166
- * - The callback will receive the current element of the array as
167
- * first argument
168
- * - Via [additionalArguments], additional arguments may be supplied that
169
- * will be passed to the callback function
170
- *
171
- * @param {array} arr - The array to loop
172
- * @param {function} callback - Callback to call for every element
173
- * @param {array} additionalArguments The additional arguments
174
- */
175
- export function loop(arr, callback, additionalArguments) {
176
- expect.function(callback);
177
-
178
- if (!arr) {
179
- return;
180
- }
181
-
182
- expect.array(arr);
183
-
184
- if (!arr.length) {
185
- // Nothing to do
186
- return;
187
- }
188
-
189
- // >> CASE A: no additional arguments
190
-
191
- if (!additionalArguments) {
192
- for (let j = 0, n = arr.length; j < n; j = j + 1) {
193
- callback(arr[j]);
194
- }
195
-
196
- return;
197
- }
198
-
199
- // >> CASE B: additional arguments
200
-
201
- expect.arrayLike(additionalArguments);
202
-
203
- const args = [null, ...additionalArguments];
204
-
205
- for (let j = 0, n = arr.length; j < n; j = j + 1) {
206
- args[0] = arr[j];
207
- callback(...args);
208
- }
209
- }
210
-
211
- /**
212
- * Get a list of all values from the items in the array at the
213
- * specified path
214
- *
215
- * @param {object[]} items
216
- *
217
- * @param {object} [options]
218
- *
219
- * @param {boolean} [options.outputAsSet=false]
220
- * Output a Set instead of an array
221
- *
222
- * @param {string} [options.pathSeparator=PATH_SEPARATOR]
223
- * A custom path separator to use instead of the default "."
224
- *
225
- *
226
- *
227
- * @returns {any[]|Set<any>} values
228
- */
229
- export function pathValues(items, path, options = {}) {
230
- // == Process parameters
231
-
232
- expect.array(items);
233
-
234
- const { outputAsSet = false, pathSeparator = PATH_SEPARATOR } = options;
235
-
236
- if (typeof path === 'string') {
237
- path = toArrayPath(path, pathSeparator);
238
- } else {
239
- expect.stringArray(path);
240
- }
241
-
242
- // >> CASE A: Output as plain Array
243
-
244
- if (!outputAsSet) {
245
- const values = [];
246
-
247
- for (let j = 0, n = items.length; j < n; j = j + 1) {
248
- const item = items[j];
249
-
250
- expect.object(item);
251
-
252
- values.push(objectGet(item, path));
253
- }
254
-
255
- return values;
256
- }
257
-
258
- // >> CASE B: Output as Set
259
-
260
- const values = new Set();
261
-
262
- for (let j = 0, n = items.length; j < n; j = j + 1) {
263
- const item = items[j];
264
-
265
- expect.object(item);
266
-
267
- values.add(objectGet(item, path));
268
- }
269
-
270
- return values;
271
- }
272
-
273
- /**
274
- * Sort function that sorts a list of objects by values encountered at the
275
- * specified key values of the object.
276
- * - Sorts array inline (no new array is returned)
277
- * - This method is faster than `sortByPathValue` since the value lookup in the
278
- * items can be done faster
279
- *
280
- * @param {Object[]} items - List of items to sort
281
- *
282
- * @param {string} key
283
- * Object key to use for getting the values in the items to compare.
284
- *
285
- * @param {function} [compareFn=smallestFirst]
286
- * Function to use to compare values. See `compare.js`.
287
- */
288
- export function sortByKeyValue(items, key, compareFn = smallestFirst) {
289
- expect.function(compareFn);
290
-
291
- expect.array(items);
292
-
293
- expect.string(key);
294
-
295
- items.sort((itemA, itemB) => {
296
- return compareFn(itemA[key], itemB[key]);
297
- });
298
- }
299
-
300
- /**
301
- * Sort function that sorts a list of objects by values encountered at the
302
- * specified key values of the object.
303
- * - Sorts array inline (no new array is returned)
304
- * - This method is faster than `sortByPathValue` since the value lookup in the
305
- * items can be done faster
306
- *
307
- * @param {Object[]} items - List of items to sort
308
- *
309
- * @param {string} key
310
- * Object key to use for getting the values in the items to compare.
311
- *
312
- * @param {function} [compareFn=smallestFirst]
313
- * Function to use to compare values. See `compare.js`.
314
- */
315
- export function sortByKeyValueReversed(items, key, compareFn = largestFirst) {
316
- expect.function(compareFn);
317
-
318
- expect.array(items);
319
-
320
- expect.string(key);
321
-
322
- items.sort((itemA, itemB) => {
323
- return compareFn(itemA[key], itemB[key]);
324
- });
325
- }
326
-
327
- /**
328
- * Sort function that sorts a list of objects by values encountered at the
329
- * specified object path.
330
- * - Sorts array inline (no new array is returned)
331
- *
332
- * @param {Object[]} items - List of items to sort
333
- *
334
- * @param {string[]|string} path
335
- * Path to use for getting the values in the items to compare.
336
- * If a string path has been supplied, the default path separator
337
- * (PATH_SEPARATOR) is assumed. Use `toArrayPath` to convert paths with
338
- * custom path separators.
339
- *
340
- * @param {function} [compareFn=smallestFirst]
341
- * Function to use to compare values. See `compare.js`.
342
- */
343
- export function sortByPathValue(items, path, compareFn = smallestFirst) {
344
- expect.function(compareFn);
345
-
346
- expect.array(items);
347
-
348
- if (typeof path === 'string') {
349
- path = toArrayPath(path);
350
- } else {
351
- expect.stringArray(path);
352
- }
353
-
354
- const cache = new Map();
355
-
356
- items.sort((itemA, itemB) => {
357
- let valueA = cache.get(itemA);
358
-
359
- if (undefined === valueA) {
360
- valueA = objectGet(itemA, path);
361
-
362
- if (undefined !== valueA) {
363
- cache.set(itemA, valueA);
364
- }
365
- }
366
-
367
- let valueB = cache.get(itemB);
368
-
369
- if (undefined === valueB) {
370
- valueB = objectGet(itemB, path);
371
-
372
- if (undefined !== valueB) {
373
- cache.set(itemB, valueB);
374
- }
375
- }
376
-
377
- return compareFn(valueA, valueB);
378
- });
379
-
380
- cache.clear();
381
- }
382
-
383
- /**
384
- * Find the first item in the list of objects that matches the selector
385
- * - All items in the supplied array must be objects
386
- *
387
- * @template {object} T
388
- * @param {T[]} arr
389
- * @param {object|null} selector
390
- *
391
- * @returns {T|null} first matched item
392
- */
393
- export function findFirst(arr, selector) {
394
- const selectorObj = new Selector(selector);
395
-
396
- return selectorObj.findFirst(arr);
397
- }
398
-
399
- /**
400
- * Returns all items from the list of items that match the selector
401
- * - All items in the supplied array must be objects
402
- *
403
- * @template {object} T
404
- * @param {T[]} arr
405
- * @param {object|null} selector
406
- *
407
- * @returns {T[]} matching items
408
- */
409
- export function findAll(arr, selector) {
410
- const selectorObj = new Selector(selector);
411
-
412
- return selectorObj.findAll(arr);
413
- }
414
-
415
- /**
416
- * Convert array to an object using a list of keys for each index
417
- *
418
- * @param {array} arr
419
- * @param {string[]} keys
420
- *
421
- * @returns {object}
422
- */
423
- export function arrayToObject(arr, keys) {
424
- expect.array(arr);
425
- expect.array(keys);
426
-
427
- const obj = {};
428
-
429
- const n = Math.min(arr.length, keys.length);
430
-
431
- for (let j = 0; j < n; j = j + 1) {
432
- obj[keys[j]] = arr[j];
433
- }
434
-
435
- return obj;
436
- }
1
+ /* ------------------------------------------------------------------ Imports */
2
+
3
+ import * as expect from '../expect/index.js';
4
+
5
+ import { smallestFirst, largestFirst } from '../compare/index.js';
6
+
7
+ import { objectGet, PATH_SEPARATOR } from '../object/index.js';
8
+
9
+ import Selector from '../../classes/data/Selector.js';
10
+
11
+ /* ---------------------------------------------------------------- Internals */
12
+
13
+ const arraySlice = Array.prototype.slice;
14
+ const arrayConcat = Array.prototype.concat;
15
+
16
+ /* ------------------------------------------------------------------ Exports */
17
+
18
+ export { PATH_SEPARATOR } from '../object/index.js';
19
+
20
+ export { smallestFirst, largestFirst };
21
+
22
+ export { arraySlice, arrayConcat };
23
+
24
+ /**
25
+ * Convert a value to an array
26
+ * - Converts an Arguments object to plain JS array
27
+ * - If the value is undefined or null, an empty array is returned
28
+ * - A primitive value is "wrapped" in an array
29
+ *
30
+ * @param {any} value - Item to convert
31
+ *
32
+ * @param {number} [start]
33
+ * Index of the array to start extraction.
34
+ * (the first element of the array is at index 0)
35
+ *
36
+ * @param {number} [end]
37
+ * Index of the array where the extraction should end
38
+ *
39
+ * --
40
+ *
41
+ * @returns {Array} array
42
+ *
43
+ * --
44
+ *
45
+ * @example
46
+ * toArray( [ 1, 2, 3, 4, 5 ], 2, 4 ) returns [ 3, 4 ]
47
+ */
48
+ export function toArray(value, start, end) {
49
+ if (Array.isArray(value)) {
50
+ //
51
+ // Do not clone input value if it is already an array
52
+ //
53
+ // @note this behaviour differs from Array.from
54
+ //
55
+ if (undefined === start) {
56
+ return value;
57
+ }
58
+
59
+ return value.slice(start, end);
60
+ }
61
+
62
+ if (undefined === value || null === value) {
63
+ //
64
+ // Return an empty array if value is undefined or null
65
+ //
66
+ // ==> this behaviour differs from Array.from() <==
67
+ //
68
+ return [];
69
+ } else if (!(value instanceof Object)) {
70
+ //
71
+ // Wrap (non-object) in array (e.g. a string)
72
+ //
73
+ // @note this behaviour differs from Array.from
74
+ //
75
+ return [value];
76
+ }
77
+
78
+ if (undefined === start) {
79
+ //
80
+ // Construct a new array from the value
81
+ //
82
+ return Array.from(value);
83
+ } else {
84
+ return arraySlice.call(value, start, end);
85
+ }
86
+ }
87
+
88
+ /**
89
+ * Convert an async iterator to an array
90
+ * - If no async iterator is passed, the value will be processed by `from()`
91
+ *
92
+ * @param {AsyncIterator|any} value
93
+ * Async iterator or value to convert to array
94
+ *
95
+ * @returns {Promise<Array>} list of items returned by the iterator
96
+ */
97
+ export async function toArrayAsync(value) {
98
+ if (
99
+ value instanceof Object &&
100
+ typeof value[Symbol.asyncIterator] === 'function'
101
+ ) {
102
+ // value is an async iterator
103
+
104
+ const arr = [];
105
+
106
+ for await (const item of value) {
107
+ arr.push(item);
108
+ }
109
+
110
+ return arr;
111
+ } else {
112
+ // value is not an async iterator
113
+
114
+ return toArray(value);
115
+ }
116
+ }
117
+
118
+ /**
119
+ * Convert a path string to an array path
120
+ * - The path string will be spit at the `pathSeparator` token
121
+ * - If the supplied path is already an array, the original array will
122
+ * be returned
123
+ *
124
+ * @param {string|string[]} path
125
+ * String or array path (e.g. "some.path.to")
126
+ *
127
+ * @param {string} [pathSeparator=PATH_SEPARATOR]
128
+ * A custom path separator to use instead of the default "."
129
+ *
130
+ * @returns {string[]} array path (e.g. ["some", "path", "to"])
131
+ */
132
+ export function toArrayPath(path, pathSeparator = PATH_SEPARATOR) {
133
+ if (typeof path === 'string') {
134
+ return path.split(pathSeparator);
135
+ } else if (Array.isArray(path)) {
136
+ // path is already an array
137
+ return path;
138
+ } else {
139
+ throw new Error(
140
+ 'Missing or invalid parameter [path] (expected string or array)'
141
+ );
142
+ }
143
+ }
144
+
145
+ /**
146
+ * Push a value to an array if it is not null, undefined or an empty string
147
+ *
148
+ * @template {array} T
149
+ * @param {T} arr
150
+ * @param {any} value
151
+ *
152
+ * @returns {T} arr
153
+ */
154
+ export function pushNotEmpty(arr, value) {
155
+ expect.array(arr);
156
+
157
+ if (value !== null && value !== undefined && value !== '') {
158
+ arr.push(value);
159
+ }
160
+
161
+ return arr;
162
+ }
163
+
164
+ /**
165
+ * Loop over the supplied array and call the callback for every element
166
+ * - The callback will receive the current element of the array as
167
+ * first argument
168
+ * - Via [additionalArguments], additional arguments may be supplied that
169
+ * will be passed to the callback function
170
+ *
171
+ * @param {array} arr - The array to loop
172
+ * @param {function} callback - Callback to call for every element
173
+ * @param {array} additionalArguments The additional arguments
174
+ */
175
+ export function loop(arr, callback, additionalArguments) {
176
+ expect.function(callback);
177
+
178
+ if (!arr) {
179
+ return;
180
+ }
181
+
182
+ expect.array(arr);
183
+
184
+ if (!arr.length) {
185
+ // Nothing to do
186
+ return;
187
+ }
188
+
189
+ // >> CASE A: no additional arguments
190
+
191
+ if (!additionalArguments) {
192
+ for (let j = 0, n = arr.length; j < n; j = j + 1) {
193
+ callback(arr[j]);
194
+ }
195
+
196
+ return;
197
+ }
198
+
199
+ // >> CASE B: additional arguments
200
+
201
+ expect.arrayLike(additionalArguments);
202
+
203
+ const args = [null, ...additionalArguments];
204
+
205
+ for (let j = 0, n = arr.length; j < n; j = j + 1) {
206
+ args[0] = arr[j];
207
+ callback(...args);
208
+ }
209
+ }
210
+
211
+ /**
212
+ * Get a list of all values from the items in the array at the
213
+ * specified path
214
+ *
215
+ * @param {object[]} items
216
+ *
217
+ * @param {object} [options]
218
+ *
219
+ * @param {boolean} [options.outputAsSet=false]
220
+ * Output a Set instead of an array
221
+ *
222
+ * @param {string} [options.pathSeparator=PATH_SEPARATOR]
223
+ * A custom path separator to use instead of the default "."
224
+ *
225
+ *
226
+ *
227
+ * @returns {any[]|Set<any>} values
228
+ */
229
+ export function pathValues(items, path, options = {}) {
230
+ // == Process parameters
231
+
232
+ expect.array(items);
233
+
234
+ const { outputAsSet = false, pathSeparator = PATH_SEPARATOR } = options;
235
+
236
+ if (typeof path === 'string') {
237
+ path = toArrayPath(path, pathSeparator);
238
+ } else {
239
+ expect.stringArray(path);
240
+ }
241
+
242
+ // >> CASE A: Output as plain Array
243
+
244
+ if (!outputAsSet) {
245
+ const values = [];
246
+
247
+ for (let j = 0, n = items.length; j < n; j = j + 1) {
248
+ const item = items[j];
249
+
250
+ expect.object(item);
251
+
252
+ values.push(objectGet(item, path));
253
+ }
254
+
255
+ return values;
256
+ }
257
+
258
+ // >> CASE B: Output as Set
259
+
260
+ const values = new Set();
261
+
262
+ for (let j = 0, n = items.length; j < n; j = j + 1) {
263
+ const item = items[j];
264
+
265
+ expect.object(item);
266
+
267
+ values.add(objectGet(item, path));
268
+ }
269
+
270
+ return values;
271
+ }
272
+
273
+ /**
274
+ * Sort function that sorts a list of objects by values encountered at the
275
+ * specified key values of the object.
276
+ * - Sorts array inline (no new array is returned)
277
+ * - This method is faster than `sortByPathValue` since the value lookup in the
278
+ * items can be done faster
279
+ *
280
+ * @param {Object[]} items - List of items to sort
281
+ *
282
+ * @param {string} key
283
+ * Object key to use for getting the values in the items to compare.
284
+ *
285
+ * @param {function} [compareFn=smallestFirst]
286
+ * Function to use to compare values. See `compare.js`.
287
+ */
288
+ export function sortByKeyValue(items, key, compareFn = smallestFirst) {
289
+ expect.function(compareFn);
290
+
291
+ expect.array(items);
292
+
293
+ expect.string(key);
294
+
295
+ items.sort((itemA, itemB) => {
296
+ return compareFn(itemA[key], itemB[key]);
297
+ });
298
+ }
299
+
300
+ /**
301
+ * Sort function that sorts a list of objects by values encountered at the
302
+ * specified key values of the object.
303
+ * - Sorts array inline (no new array is returned)
304
+ * - This method is faster than `sortByPathValue` since the value lookup in the
305
+ * items can be done faster
306
+ *
307
+ * @param {Object[]} items - List of items to sort
308
+ *
309
+ * @param {string} key
310
+ * Object key to use for getting the values in the items to compare.
311
+ *
312
+ * @param {function} [compareFn=smallestFirst]
313
+ * Function to use to compare values. See `compare.js`.
314
+ */
315
+ export function sortByKeyValueReversed(items, key, compareFn = largestFirst) {
316
+ expect.function(compareFn);
317
+
318
+ expect.array(items);
319
+
320
+ expect.string(key);
321
+
322
+ items.sort((itemA, itemB) => {
323
+ return compareFn(itemA[key], itemB[key]);
324
+ });
325
+ }
326
+
327
+ /**
328
+ * Sort function that sorts a list of objects by values encountered at the
329
+ * specified object path.
330
+ * - Sorts array inline (no new array is returned)
331
+ *
332
+ * @param {Object[]} items - List of items to sort
333
+ *
334
+ * @param {string[]|string} path
335
+ * Path to use for getting the values in the items to compare.
336
+ * If a string path has been supplied, the default path separator
337
+ * (PATH_SEPARATOR) is assumed. Use `toArrayPath` to convert paths with
338
+ * custom path separators.
339
+ *
340
+ * @param {function} [compareFn=smallestFirst]
341
+ * Function to use to compare values. See `compare.js`.
342
+ */
343
+ export function sortByPathValue(items, path, compareFn = smallestFirst) {
344
+ expect.function(compareFn);
345
+
346
+ expect.array(items);
347
+
348
+ if (typeof path === 'string') {
349
+ path = toArrayPath(path);
350
+ } else {
351
+ expect.stringArray(path);
352
+ }
353
+
354
+ const cache = new Map();
355
+
356
+ items.sort((itemA, itemB) => {
357
+ let valueA = cache.get(itemA);
358
+
359
+ if (undefined === valueA) {
360
+ valueA = objectGet(itemA, path);
361
+
362
+ if (undefined !== valueA) {
363
+ cache.set(itemA, valueA);
364
+ }
365
+ }
366
+
367
+ let valueB = cache.get(itemB);
368
+
369
+ if (undefined === valueB) {
370
+ valueB = objectGet(itemB, path);
371
+
372
+ if (undefined !== valueB) {
373
+ cache.set(itemB, valueB);
374
+ }
375
+ }
376
+
377
+ return compareFn(valueA, valueB);
378
+ });
379
+
380
+ cache.clear();
381
+ }
382
+
383
+ /**
384
+ * Find the first item in the list of objects that matches the selector
385
+ * - All items in the supplied array must be objects
386
+ *
387
+ * @template {object} T
388
+ * @param {T[]} arr
389
+ * @param {object|null} selector
390
+ *
391
+ * @returns {T|null} first matched item
392
+ */
393
+ export function findFirst(arr, selector) {
394
+ const selectorObj = new Selector(selector);
395
+
396
+ return selectorObj.findFirst(arr);
397
+ }
398
+
399
+ /**
400
+ * Returns all items from the list of items that match the selector
401
+ * - All items in the supplied array must be objects
402
+ *
403
+ * @template {object} T
404
+ * @param {T[]} arr
405
+ * @param {object|null} selector
406
+ *
407
+ * @returns {T[]} matching items
408
+ */
409
+ export function findAll(arr, selector) {
410
+ const selectorObj = new Selector(selector);
411
+
412
+ return selectorObj.findAll(arr);
413
+ }
414
+
415
+ /**
416
+ * Convert array to an object using a list of keys for each index
417
+ *
418
+ * @param {array} arr
419
+ * @param {string[]} keys
420
+ *
421
+ * @returns {object}
422
+ */
423
+ export function arrayToObject(arr, keys) {
424
+ expect.array(arr);
425
+ expect.array(keys);
426
+
427
+ const obj = {};
428
+
429
+ const n = Math.min(arr.length, keys.length);
430
+
431
+ for (let j = 0; j < n; j = j + 1) {
432
+ obj[keys[j]] = arr[j];
433
+ }
434
+
435
+ return obj;
436
+ }