@hkdigital/lib-sveltekit 0.2.20 → 0.2.21

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 (254) 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 +210 -210
  15. package/dist/classes/logging/constants.js +16 -16
  16. package/dist/classes/logging/index.js +4 -4
  17. package/dist/classes/logging/typedef.js +17 -17
  18. package/dist/classes/promise/HkPromise.js +377 -377
  19. package/dist/classes/promise/index.js +1 -1
  20. package/dist/classes/services/ServiceBase.js +463 -463
  21. package/dist/classes/services/ServiceManager.js +614 -614
  22. package/dist/classes/services/index.js +5 -5
  23. package/dist/classes/services/service-states.js +205 -205
  24. package/dist/classes/services/typedef.js +179 -179
  25. package/dist/classes/stores/SubscribersCount.js +107 -107
  26. package/dist/classes/stores/index.js +1 -1
  27. package/dist/classes/streams/LogTransformStream.js +19 -19
  28. package/dist/classes/streams/ServerEventsStore.js +110 -110
  29. package/dist/classes/streams/TimeStampSource.js +26 -26
  30. package/dist/classes/streams/index.js +3 -3
  31. package/dist/classes/svelte/audio/AudioLoader.svelte.js +58 -58
  32. package/dist/classes/svelte/audio/AudioScene.svelte.js +324 -324
  33. package/dist/classes/svelte/audio/mocks.js +35 -35
  34. package/dist/classes/svelte/finite-state-machine/FiniteStateMachine.svelte.js +133 -133
  35. package/dist/classes/svelte/finite-state-machine/index.js +1 -1
  36. package/dist/classes/svelte/image/ImageLoader.svelte.js +45 -45
  37. package/dist/classes/svelte/image/ImageScene.svelte.js +249 -249
  38. package/dist/classes/svelte/image/ImageVariantsLoader.svelte.js +152 -152
  39. package/dist/classes/svelte/image/index.js +4 -4
  40. package/dist/classes/svelte/image/mocks.js +35 -35
  41. package/dist/classes/svelte/image/typedef.js +8 -8
  42. package/dist/classes/svelte/index.js +14 -14
  43. package/dist/classes/svelte/loading-state-machine/LoadingStateMachine.svelte.js +109 -109
  44. package/dist/classes/svelte/loading-state-machine/constants.js +16 -16
  45. package/dist/classes/svelte/loading-state-machine/index.js +3 -3
  46. package/dist/classes/svelte/network-loader/NetworkLoader.svelte.js +338 -338
  47. package/dist/classes/svelte/network-loader/constants.js +3 -3
  48. package/dist/classes/svelte/network-loader/index.js +3 -3
  49. package/dist/classes/svelte/network-loader/mocks.js +30 -30
  50. package/dist/classes/svelte/network-loader/typedef.js +8 -8
  51. package/dist/components/area/HkArea.svelte +49 -49
  52. package/dist/components/area/HkGridArea.svelte +77 -77
  53. package/dist/components/area/index.js +2 -2
  54. package/dist/components/buttons/button/Button.svelte +82 -82
  55. package/dist/components/buttons/button-icon-steeze/SteezeIconButton.svelte +30 -30
  56. package/dist/components/buttons/button-text/TextButton.svelte +21 -21
  57. package/dist/components/buttons/index.js +3 -3
  58. package/dist/components/debug/debug-panel-design-scaling/DebugPanelDesignScaling.svelte +146 -146
  59. package/dist/components/debug/index.js +1 -1
  60. package/dist/components/drag-drop/DragController.js +44 -44
  61. package/dist/components/drag-drop/DragDropContext.svelte +111 -111
  62. package/dist/components/drag-drop/Draggable.svelte +519 -519
  63. package/dist/components/drag-drop/DropZoneArea.svelte +119 -119
  64. package/dist/components/drag-drop/DropZoneList.svelte +125 -125
  65. package/dist/components/drag-drop/{DropZone.svelte → Dropzone.svelte} +258 -258
  66. package/dist/components/drag-drop/actions.js +26 -26
  67. package/dist/components/drag-drop/drag-state.svelte.js +322 -322
  68. package/dist/components/drag-drop/index.js +7 -7
  69. package/dist/components/drag-drop/util.js +85 -85
  70. package/dist/components/hkdev/blocks/TextBlock.svelte +46 -46
  71. package/dist/components/hkdev/buttons/CheckButton.svelte +62 -62
  72. package/dist/components/icons/HkIcon.svelte +86 -86
  73. package/dist/components/icons/HkTabIcon.svelte +116 -116
  74. package/dist/components/icons/SteezeIcon.svelte +97 -97
  75. package/dist/components/icons/index.js +6 -6
  76. package/dist/components/icons/typedef.js +16 -16
  77. package/dist/components/index.js +2 -2
  78. package/dist/components/inputs/index.js +1 -1
  79. package/dist/components/inputs/text-input/TestTextInput.svelte__ +102 -102
  80. package/dist/components/inputs/text-input/TextInput.svelte +223 -223
  81. package/dist/components/inputs/text-input/TextInput.svelte___ +83 -83
  82. package/dist/components/inputs/text-input/assets/IconInvalid.svelte +14 -14
  83. package/dist/components/inputs/text-input/assets/IconValid.svelte +12 -12
  84. package/dist/components/layout/grid-layers/GridLayers.svelte +63 -63
  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 +14 -14
  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/logging/adapters/console.js +114 -114
  148. package/dist/logging/adapters/pino.js +60 -60
  149. package/dist/logging/constants.js +1 -1
  150. package/dist/logging/factories/client.js +21 -21
  151. package/dist/logging/factories/server.js +22 -22
  152. package/dist/logging/factories/universal.js +23 -23
  153. package/dist/logging/index.js +8 -8
  154. package/dist/schemas/index.js +1 -1
  155. package/dist/schemas/validate-url.js +180 -180
  156. package/dist/server/index.js +1 -1
  157. package/dist/server/logger.js +94 -94
  158. package/dist/states/index.js +1 -1
  159. package/dist/states/navigation.svelte.js +55 -55
  160. package/dist/stores/index.js +1 -1
  161. package/dist/stores/theme.js +80 -80
  162. package/dist/themes/hkdev/components/blocks/text-block.css +34 -41
  163. package/dist/themes/hkdev/components/boxes/game-box.css +11 -12
  164. package/dist/themes/hkdev/components/buttons/button-icon-steeze.css +22 -22
  165. package/dist/themes/hkdev/components/buttons/button-text.css +32 -32
  166. package/dist/themes/hkdev/components/buttons/button.css +146 -146
  167. package/dist/themes/hkdev/components/buttons/skip-button.css +5 -6
  168. package/dist/themes/hkdev/components/drag-drop/draggable.css +73 -73
  169. package/dist/themes/hkdev/components/drag-drop/drop-zone.css +58 -48
  170. package/dist/themes/hkdev/components/icons/icon-steeze.css +16 -22
  171. package/dist/themes/hkdev/components/inputs/text-input.css +102 -104
  172. package/dist/themes/hkdev/components/panels/panel.css +25 -27
  173. package/dist/themes/hkdev/components/rows/panel-grid-row.css +4 -6
  174. package/dist/themes/hkdev/components/rows/panel-row-2.css +5 -7
  175. package/dist/themes/hkdev/components.css +29 -53
  176. package/dist/themes/hkdev/debug.css +1 -1
  177. package/dist/themes/hkdev/global/layout.css +32 -39
  178. package/dist/themes/hkdev/global/on-colors.css +32 -53
  179. package/dist/themes/hkdev/globals.css +4 -11
  180. package/dist/themes/hkdev/responsive.css +12 -12
  181. package/dist/themes/hkdev/theme-ext.js +12 -15
  182. package/dist/themes/hkdev/theme.css +219 -0
  183. package/dist/themes/index.d.ts +1 -1
  184. package/dist/themes/index.js +1 -1
  185. package/dist/typedef/context.js +6 -6
  186. package/dist/typedef/drag.js +25 -25
  187. package/dist/typedef/drop.js +12 -12
  188. package/dist/typedef/image.js +38 -38
  189. package/dist/typedef/index.js +4 -4
  190. package/dist/util/array/index.js +436 -436
  191. package/dist/util/bases/base58.js +262 -262
  192. package/dist/util/bases/index.js +1 -1
  193. package/dist/util/compare/index.js +247 -247
  194. package/dist/util/css/css-vars.js +83 -83
  195. package/dist/util/css/index.js +1 -1
  196. package/dist/util/design-system/components/states.js +22 -22
  197. package/dist/util/design-system/css/clamp.js +66 -66
  198. package/dist/util/design-system/css/root-design-vars.js +102 -102
  199. package/dist/util/design-system/index.js +5 -5
  200. package/dist/util/design-system/layout/scaling.js +228 -228
  201. package/dist/util/design-system/skeleton.js +208 -208
  202. package/dist/util/design-system/tailwind.js +288 -288
  203. package/dist/util/env/index.js +9 -9
  204. package/dist/util/expect/arrays.js +47 -47
  205. package/dist/util/expect/index.js +259 -259
  206. package/dist/util/expect/primitives.js +55 -55
  207. package/dist/util/expect/url.js +60 -60
  208. package/dist/util/function/index.js +218 -218
  209. package/dist/util/geo/index.js +26 -26
  210. package/dist/util/http/caching.js +263 -263
  211. package/dist/util/http/errors.js +97 -97
  212. package/dist/util/http/headers.js +75 -75
  213. package/dist/util/http/http-request.js +578 -578
  214. package/dist/util/http/index.js +22 -22
  215. package/dist/util/http/json-request.js +224 -224
  216. package/dist/util/http/mocks.js +65 -65
  217. package/dist/util/http/response.js +294 -294
  218. package/dist/util/http/typedef.js +93 -93
  219. package/dist/util/http/url.js +52 -52
  220. package/dist/util/image/index.js +86 -86
  221. package/dist/util/index.js +2 -2
  222. package/dist/util/is/index.js +140 -140
  223. package/dist/util/iterate/index.js +234 -234
  224. package/dist/util/object/index.js +1361 -1361
  225. package/dist/util/singleton/index.js +97 -97
  226. package/dist/util/string/array-path.js +75 -75
  227. package/dist/util/string/convert.js +54 -54
  228. package/dist/util/string/fs.js +226 -226
  229. package/dist/util/string/index.js +5 -5
  230. package/dist/util/string/interpolate.js +61 -61
  231. package/dist/util/string/pad.js +10 -10
  232. package/dist/util/svelte/index.js +4 -4
  233. package/dist/util/svelte/loading/loading-tracker.svelte.js +108 -108
  234. package/dist/util/svelte/observe/index.js +49 -49
  235. package/dist/util/svelte/state-context/index.js +117 -117
  236. package/dist/util/svelte/wait/index.js +38 -38
  237. package/dist/util/sveltekit/index.js +1 -1
  238. package/dist/util/sveltekit/route-folders/index.js +101 -101
  239. package/dist/util/time/index.js +323 -323
  240. package/dist/util/unique/index.js +249 -249
  241. package/dist/valibot/date.js__ +10 -10
  242. package/dist/valibot/index.js +9 -9
  243. package/dist/valibot/url.js +95 -95
  244. package/dist/valibot/user.js +23 -23
  245. package/dist/zod/all.js +33 -33
  246. package/dist/zod/generic.js +11 -11
  247. package/dist/zod/javascript.js +32 -32
  248. package/dist/zod/user.js +16 -16
  249. package/dist/zod/web.js +52 -52
  250. package/package.json +132 -129
  251. package/dist/components/layout/grid-layers/GridLayers.svelte__heightFrom__ +0 -372
  252. package/dist/themes/hkdev/theme.d.ts +0 -234
  253. package/dist/themes/hkdev/theme.js +0 -235
  254. package/dist/util/http/test-data__/content-length-test-hkdigital-small.V4HfZyBQ.avif +0 -0
@@ -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
+ }