@hkdigital/lib-sveltekit 0.2.21 → 0.2.22

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 +149 -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/{Dropzone.svelte → DropZone.svelte} +258 -258
  64. package/dist/components/drag-drop/DropZoneArea.svelte +119 -119
  65. package/dist/components/drag-drop/DropZoneList.svelte +125 -125
  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/GridLayers.svelte__heightFrom__ +372 -0
  86. package/dist/components/layout/grid-layers/util.js +74 -74
  87. package/dist/components/layout/index.js +1 -1
  88. package/dist/components/panels/index.js +1 -1
  89. package/dist/components/panels/panel/Panel.svelte +43 -43
  90. package/dist/components/rows/index.js +3 -3
  91. package/dist/components/rows/panel-grid-row/PanelGridRow.svelte +104 -104
  92. package/dist/components/rows/panel-row-2/PanelRow2.svelte +40 -40
  93. package/dist/components/tab-bar/HkTabBar.state.svelte.js +149 -149
  94. package/dist/components/tab-bar/HkTabBar.svelte +74 -74
  95. package/dist/components/tab-bar/HkTabBarSelector.state.svelte.js +93 -93
  96. package/dist/components/tab-bar/HkTabBarSelector.svelte +49 -49
  97. package/dist/components/tab-bar/index.js +17 -17
  98. package/dist/components/tab-bar/typedef.js +11 -11
  99. package/dist/config/imagetools-config.js +189 -189
  100. package/dist/config/imagetools.d.ts +72 -72
  101. package/dist/constants/bases.js +13 -13
  102. package/dist/constants/errors/api.js +9 -9
  103. package/dist/constants/errors/generic.js +5 -5
  104. package/dist/constants/errors/index.js +3 -3
  105. package/dist/constants/errors/jwt.js +5 -5
  106. package/dist/constants/http/headers.js +6 -6
  107. package/dist/constants/http/index.js +2 -2
  108. package/dist/constants/http/methods.js +14 -14
  109. package/dist/constants/index.js +3 -3
  110. package/dist/constants/mime/application.js +5 -5
  111. package/dist/constants/mime/audio.js +13 -13
  112. package/dist/constants/mime/image.js +3 -3
  113. package/dist/constants/mime/index.js +4 -4
  114. package/dist/constants/mime/text.js +2 -2
  115. package/dist/constants/regexp/index.js +31 -31
  116. package/dist/constants/regexp/inspiratie.js__ +95 -95
  117. package/dist/constants/regexp/text.js +49 -49
  118. package/dist/constants/regexp/user.js +32 -32
  119. package/dist/constants/regexp/web.js +3 -3
  120. package/dist/constants/state-labels/drag-states.js +6 -6
  121. package/dist/constants/state-labels/drop-states.js +6 -6
  122. package/dist/constants/state-labels/input-states.js +11 -11
  123. package/dist/constants/state-labels/submit-states.js +4 -4
  124. package/dist/constants/time.js +28 -28
  125. package/dist/css/utilities.css +43 -43
  126. package/dist/design/design-config.js +73 -73
  127. package/dist/design/tailwind-theme-extend.js +158 -158
  128. package/dist/features/button-group/ButtonGroup.svelte +82 -82
  129. package/dist/features/button-group/typedef.js +10 -10
  130. package/dist/features/compare-left-right/CompareLeftRight.svelte +179 -179
  131. package/dist/features/compare-left-right/index.js +1 -1
  132. package/dist/features/game-box/GameBox.svelte +577 -577
  133. package/dist/features/game-box/gamebox.util.js +83 -83
  134. package/dist/features/hk-app-layout/HkAppLayout.state.svelte.js +25 -25
  135. package/dist/features/hk-app-layout/HkAppLayout.svelte +251 -251
  136. package/dist/features/image-box/ImageBox.svelte +210 -210
  137. package/dist/features/image-box/index.js +5 -5
  138. package/dist/features/image-box/typedef.js +32 -32
  139. package/dist/features/index.js +23 -23
  140. package/dist/features/presenter/ImageSlide.svelte +64 -64
  141. package/dist/features/presenter/Presenter.state.svelte.js +638 -638
  142. package/dist/features/presenter/Presenter.svelte +142 -142
  143. package/dist/features/presenter/constants.js +7 -7
  144. package/dist/features/presenter/index.js +10 -10
  145. package/dist/features/presenter/typedef.js +106 -106
  146. package/dist/features/presenter/util.js +210 -210
  147. package/dist/features/virtual-viewport/VirtualViewport.svelte +196 -196
  148. package/dist/logging/adapters/console.js +114 -114
  149. package/dist/logging/adapters/pino.js +60 -60
  150. package/dist/logging/constants.js +1 -1
  151. package/dist/logging/factories/client.js +21 -21
  152. package/dist/logging/factories/server.js +22 -22
  153. package/dist/logging/factories/universal.js +23 -23
  154. package/dist/logging/index.js +8 -8
  155. package/dist/schemas/index.js +1 -1
  156. package/dist/schemas/validate-url.js +180 -180
  157. package/dist/server/index.js +1 -1
  158. package/dist/server/logger.js +94 -94
  159. package/dist/states/index.js +1 -1
  160. package/dist/states/navigation.svelte.js +55 -55
  161. package/dist/stores/index.js +1 -1
  162. package/dist/stores/theme.js +80 -80
  163. package/dist/themes/hkdev/components/blocks/text-block.css +34 -34
  164. package/dist/themes/hkdev/components/boxes/game-box.css +11 -11
  165. package/dist/themes/hkdev/components/buttons/button-icon-steeze.css +22 -22
  166. package/dist/themes/hkdev/components/buttons/button-text.css +32 -32
  167. package/dist/themes/hkdev/components/buttons/button.css +146 -146
  168. package/dist/themes/hkdev/components/buttons/skip-button.css +5 -5
  169. package/dist/themes/hkdev/components/drag-drop/draggable.css +73 -73
  170. package/dist/themes/hkdev/components/drag-drop/drop-zone.css +58 -58
  171. package/dist/themes/hkdev/components/icons/icon-steeze.css +15 -15
  172. package/dist/themes/hkdev/components/inputs/text-input.css +102 -102
  173. package/dist/themes/hkdev/components/panels/panel.css +25 -25
  174. package/dist/themes/hkdev/components/rows/panel-grid-row.css +4 -4
  175. package/dist/themes/hkdev/components/rows/panel-row-2.css +5 -5
  176. package/dist/themes/hkdev/components.css +29 -29
  177. package/dist/themes/hkdev/debug.css +1 -1
  178. package/dist/themes/hkdev/global/layout.css +32 -32
  179. package/dist/themes/hkdev/global/on-colors.css +32 -32
  180. package/dist/themes/hkdev/globals.css +3 -3
  181. package/dist/themes/hkdev/responsive.css +12 -12
  182. package/dist/themes/hkdev/theme-ext.js +12 -12
  183. package/dist/themes/hkdev/theme.css +218 -218
  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/exceptions/index.d.ts +11 -0
  205. package/dist/util/exceptions/index.js +17 -0
  206. package/dist/util/expect/arrays.js +47 -47
  207. package/dist/util/expect/index.js +259 -259
  208. package/dist/util/expect/primitives.js +55 -55
  209. package/dist/util/expect/url.js +60 -60
  210. package/dist/util/function/index.js +218 -218
  211. package/dist/util/geo/index.js +26 -26
  212. package/dist/util/http/caching.js +263 -263
  213. package/dist/util/http/errors.js +97 -97
  214. package/dist/util/http/headers.js +75 -75
  215. package/dist/util/http/http-request.js +578 -578
  216. package/dist/util/http/index.js +22 -22
  217. package/dist/util/http/json-request.js +224 -224
  218. package/dist/util/http/mocks.js +65 -65
  219. package/dist/util/http/response.js +294 -294
  220. package/dist/util/http/test-data__/content-length-test-hkdigital-small.V4HfZyBQ.avif +0 -0
  221. package/dist/util/http/typedef.js +93 -93
  222. package/dist/util/http/url.js +52 -52
  223. package/dist/util/image/index.js +86 -86
  224. package/dist/util/index.d.ts +1 -0
  225. package/dist/util/index.js +3 -2
  226. package/dist/util/is/index.js +140 -140
  227. package/dist/util/iterate/index.js +234 -234
  228. package/dist/util/object/index.js +1361 -1361
  229. package/dist/util/singleton/index.js +97 -97
  230. package/dist/util/string/array-path.js +75 -75
  231. package/dist/util/string/convert.js +54 -54
  232. package/dist/util/string/fs.js +226 -226
  233. package/dist/util/string/index.js +5 -5
  234. package/dist/util/string/interpolate.js +61 -61
  235. package/dist/util/string/pad.js +10 -10
  236. package/dist/util/svelte/index.js +4 -4
  237. package/dist/util/svelte/loading/loading-tracker.svelte.js +108 -108
  238. package/dist/util/svelte/observe/index.js +49 -49
  239. package/dist/util/svelte/state-context/index.js +117 -117
  240. package/dist/util/svelte/wait/index.js +38 -38
  241. package/dist/util/sveltekit/index.js +1 -1
  242. package/dist/util/sveltekit/route-folders/index.js +101 -101
  243. package/dist/util/time/index.js +323 -323
  244. package/dist/util/unique/index.js +249 -249
  245. package/dist/valibot/date.js__ +10 -10
  246. package/dist/valibot/index.js +9 -9
  247. package/dist/valibot/url.js +95 -95
  248. package/dist/valibot/user.js +23 -23
  249. package/dist/zod/all.js +33 -33
  250. package/dist/zod/generic.js +11 -11
  251. package/dist/zod/javascript.js +32 -32
  252. package/dist/zod/user.js +16 -16
  253. package/dist/zod/web.js +52 -52
  254. package/package.json +133 -132
@@ -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
+ }