@hkdigital/lib-core 0.3.11 → 0.3.13

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 (293) hide show
  1. package/README.md +173 -149
  2. package/dist/assets/autospuiten/car-paint-picker.js +41 -41
  3. package/dist/assets/autospuiten/labels.js +7 -7
  4. package/dist/classes/data/IterableTree.js +242 -242
  5. package/dist/classes/data/Selector.js +190 -190
  6. package/dist/classes/data/index.js +2 -2
  7. package/dist/classes/data/typedef.js +9 -9
  8. package/dist/classes/event-emitter/EventEmitter.js +273 -273
  9. package/dist/classes/event-emitter/index.js +2 -2
  10. package/dist/classes/index.js +4 -4
  11. package/dist/classes/promise/HkPromise.js +384 -384
  12. package/dist/classes/promise/index.js +1 -1
  13. package/dist/classes/stores/SubscribersCount.js +107 -107
  14. package/dist/classes/stores/index.js +1 -1
  15. package/dist/classes/streams/LogTransformStream.js +19 -19
  16. package/dist/classes/streams/ServerEventsStore.js +111 -111
  17. package/dist/classes/streams/TimeStampSource.js +26 -26
  18. package/dist/classes/streams/index.js +3 -3
  19. package/dist/classes/svelte/finite-state-machine/FiniteStateMachine.svelte.js +133 -133
  20. package/dist/classes/svelte/finite-state-machine/index.js +1 -1
  21. package/dist/classes/svelte/index.js +1 -11
  22. package/dist/classes/svelte/loading-state-machine/LoadingStateMachine.svelte.js +109 -109
  23. package/dist/classes/svelte/loading-state-machine/constants.js +16 -16
  24. package/dist/classes/svelte/loading-state-machine/index.js +3 -3
  25. package/dist/config/README.md +197 -196
  26. package/dist/config/generators/imagetools.js +189 -189
  27. package/dist/config/generators/vite.js +148 -142
  28. package/dist/config/imagetools.d.ts +72 -72
  29. package/dist/config/vite.js +4 -4
  30. package/dist/constants/bases/index.js +13 -13
  31. package/dist/constants/http/headers.js +6 -6
  32. package/dist/constants/http/index.js +2 -2
  33. package/dist/constants/http/methods.js +14 -14
  34. package/dist/constants/index.js +6 -6
  35. package/dist/constants/mime/application.js +5 -5
  36. package/dist/constants/mime/audio.js +13 -13
  37. package/dist/constants/mime/image.js +3 -3
  38. package/dist/constants/mime/index.js +4 -4
  39. package/dist/constants/mime/text.js +2 -2
  40. package/dist/constants/regexp/README.md +96 -95
  41. package/dist/constants/regexp/index.js +31 -31
  42. package/dist/constants/regexp/inspiratie.js__ +95 -95
  43. package/dist/constants/regexp/text.d.ts +4 -4
  44. package/dist/constants/regexp/text.js +49 -49
  45. package/dist/constants/regexp/url.js +3 -3
  46. package/dist/constants/regexp/user.js +29 -29
  47. package/dist/constants/states/drag.js +6 -6
  48. package/dist/constants/states/drop.js +6 -6
  49. package/dist/constants/states/index.js +4 -4
  50. package/dist/constants/states/input.js +11 -11
  51. package/dist/constants/states/submit.js +4 -4
  52. package/dist/constants/time/index.js +28 -28
  53. package/dist/css/utilities.css +43 -43
  54. package/dist/design/README.md +405 -405
  55. package/dist/design/config/design-config.js +73 -73
  56. package/dist/design/generators/index.js +288 -288
  57. package/dist/design/index.js +96 -96
  58. package/dist/design/plugins/skeleton.js +208 -208
  59. package/dist/design/tailwind-theme-extend.js +158 -158
  60. package/dist/design/themes/README.md +102 -102
  61. package/dist/design/themes/hkdev/components/blocks/text-block.css +34 -34
  62. package/dist/design/themes/hkdev/components/boxes/game-box.css +11 -11
  63. package/dist/design/themes/hkdev/components/buttons/button-icon-steeze.css +22 -22
  64. package/dist/design/themes/hkdev/components/buttons/button-text.css +32 -32
  65. package/dist/design/themes/hkdev/components/buttons/button.css +146 -146
  66. package/dist/design/themes/hkdev/components/buttons/skip-button.css +5 -5
  67. package/dist/design/themes/hkdev/components/drag-drop/draggable.css +73 -73
  68. package/dist/design/themes/hkdev/components/drag-drop/drop-zone.css +58 -58
  69. package/dist/design/themes/hkdev/components/icons/icon-steeze.css +15 -15
  70. package/dist/design/themes/hkdev/components/inputs/text-input.css +102 -102
  71. package/dist/design/themes/hkdev/components/panels/panel.css +25 -25
  72. package/dist/design/themes/hkdev/components/rows/panel-grid-row.css +4 -4
  73. package/dist/design/themes/hkdev/components/rows/panel-row-2.css +5 -5
  74. package/dist/design/themes/hkdev/components.css +29 -29
  75. package/dist/design/themes/hkdev/debug.css +1 -1
  76. package/dist/design/themes/hkdev/global/layout.css +32 -32
  77. package/dist/design/themes/hkdev/global/on-colors.css +32 -32
  78. package/dist/design/themes/hkdev/globals.css +3 -3
  79. package/dist/design/themes/hkdev/responsive.css +12 -12
  80. package/dist/design/themes/hkdev/theme-ext.js +12 -12
  81. package/dist/design/themes/hkdev/theme.css +218 -218
  82. package/dist/design/utils/clamp.js +66 -66
  83. package/dist/design/utils/root-vars.js +102 -102
  84. package/dist/design/utils/scaling.js +228 -228
  85. package/dist/design/utils/states.js +22 -22
  86. package/dist/errors/api.js +9 -9
  87. package/dist/errors/generic.js +20 -20
  88. package/dist/errors/http.js +16 -16
  89. package/dist/errors/index.js +5 -5
  90. package/dist/errors/jwt.js +5 -5
  91. package/dist/errors/promise.js +25 -25
  92. package/dist/logging/README.md +158 -0
  93. package/dist/logging/index.d.ts +3 -1
  94. package/dist/logging/index.js +11 -7
  95. package/dist/logging/internal/adapters/console.js +114 -114
  96. package/dist/logging/internal/adapters/index.js +2 -2
  97. package/dist/logging/internal/adapters/pino.js +160 -142
  98. package/dist/logging/internal/adapters/typedef.js +10 -10
  99. package/dist/logging/internal/{unified-logger/constants.js → constants.js} +22 -22
  100. package/dist/logging/internal/factories/client.d.ts +1 -1
  101. package/dist/logging/internal/factories/client.js +21 -21
  102. package/dist/logging/internal/factories/server.d.ts +1 -1
  103. package/dist/logging/internal/factories/server.js +22 -22
  104. package/dist/logging/internal/factories/universal.d.ts +2 -2
  105. package/dist/logging/internal/factories/universal.js +22 -22
  106. package/dist/logging/internal/{unified-logger → logger}/Logger.d.ts +2 -2
  107. package/dist/logging/internal/{unified-logger → logger}/Logger.js +217 -217
  108. package/dist/logging/internal/logger/index.d.ts +1 -0
  109. package/dist/logging/internal/logger/index.js +1 -0
  110. package/dist/logging/internal/{unified-logger/typedef.d.ts → typedef.d.ts} +2 -1
  111. package/dist/logging/internal/{unified-logger/typedef.js → typedef.js} +21 -17
  112. package/dist/network/README.md +172 -172
  113. package/dist/network/cache/IndexedDbCache.js +1407 -1407
  114. package/dist/network/cache/MemoryResponseCache.js +138 -138
  115. package/dist/network/cache/index.js +5 -5
  116. package/dist/network/cache/typedef.js +41 -41
  117. package/dist/network/cache.js +3 -3
  118. package/dist/network/http/caching.js +261 -261
  119. package/dist/network/http/errors.js +97 -97
  120. package/dist/network/http/headers.js +75 -75
  121. package/dist/network/http/http-request.js +578 -578
  122. package/dist/network/http/index.js +22 -22
  123. package/dist/network/http/json-request.js +224 -224
  124. package/dist/network/http/mocks.js +65 -65
  125. package/dist/network/http/response.js +318 -318
  126. package/dist/network/http/test-data__/content-length-test-hkdigital-small.V4HfZyBQ.avif +0 -0
  127. package/dist/network/http/typedef.js +93 -93
  128. package/dist/network/http/url.js +52 -52
  129. package/dist/network/http.js +5 -5
  130. package/dist/network/loaders/README.md +254 -254
  131. package/dist/network/loaders/audio/AudioLoader.svelte.js +58 -58
  132. package/dist/network/loaders/audio/AudioScene.svelte.js +324 -324
  133. package/dist/network/loaders/audio/mocks.js +35 -35
  134. package/dist/network/loaders/audio.js +1 -1
  135. package/dist/network/loaders/image/ImageLoader.svelte.js +44 -44
  136. package/dist/network/loaders/image/ImageScene.svelte.js +248 -248
  137. package/dist/network/loaders/image/ImageVariantsLoader.svelte.js +150 -150
  138. package/dist/network/loaders/image/index.js +4 -4
  139. package/dist/network/loaders/image/mocks.js +35 -35
  140. package/dist/network/loaders/image/typedef.js +8 -8
  141. package/dist/network/loaders/image/utils/index.js +86 -86
  142. package/dist/network/loaders/image.js +7 -7
  143. package/dist/network/loaders/typedef.js +38 -38
  144. package/dist/network/loaders.js +2 -2
  145. package/dist/network/states/NetworkLoader.svelte.js +338 -338
  146. package/dist/network/states/constants.js +3 -3
  147. package/dist/network/states/index.js +3 -3
  148. package/dist/network/states/mocks.js +30 -30
  149. package/dist/network/states/typedef.js +8 -8
  150. package/dist/network/typedef.js +9 -9
  151. package/dist/services/README.md +200 -0
  152. package/dist/services/index.d.ts +6 -1
  153. package/dist/services/index.js +8 -1
  154. package/dist/services/{internal/service-base → service-base}/ServiceBase.d.ts +2 -2
  155. package/dist/services/{internal/service-base → service-base}/ServiceBase.js +462 -462
  156. package/dist/services/{internal/service-base → service-base}/constants.d.ts +0 -12
  157. package/dist/services/{internal/service-base → service-base}/constants.js +98 -110
  158. package/dist/services/{internal/service-base → service-base}/index.js +3 -3
  159. package/dist/services/{internal/service-base → service-base}/typedef.d.ts +1 -1
  160. package/dist/services/{internal/service-base → service-base}/typedef.js +101 -101
  161. package/dist/services/{internal/service-manager → service-manager}/ServiceManager.d.ts +2 -2
  162. package/dist/services/{internal/service-manager → service-manager}/ServiceManager.js +608 -608
  163. package/dist/services/{internal/service-manager → service-manager}/constants.js +6 -6
  164. package/dist/services/{internal/service-manager → service-manager}/typedef.js +90 -90
  165. package/dist/states/index.js +1 -1
  166. package/dist/states/navigation.svelte.js +55 -55
  167. package/dist/stores/index.js +1 -1
  168. package/dist/stores/theme.js +80 -80
  169. package/dist/typedef/context.js +6 -6
  170. package/dist/typedef/drag.js +25 -25
  171. package/dist/typedef/drop.js +12 -12
  172. package/dist/typedef/index.d.ts +1 -0
  173. package/dist/typedef/index.js +4 -4
  174. package/dist/ui/components/button-group/ButtonGroup.svelte +82 -82
  175. package/dist/ui/components/button-group/typedef.js +10 -10
  176. package/dist/ui/components/compare-left-right/CompareLeftRight.svelte +179 -179
  177. package/dist/ui/components/compare-left-right/index.js +1 -1
  178. package/dist/ui/components/game-box/GameBox.svelte +577 -577
  179. package/dist/ui/components/game-box/gamebox.util.js +83 -83
  180. package/dist/ui/components/hk-app-layout/HkAppLayout.state.svelte.js +25 -25
  181. package/dist/ui/components/hk-app-layout/HkAppLayout.svelte +251 -251
  182. package/dist/ui/components/image-box/ImageBox.svelte +210 -210
  183. package/dist/ui/components/image-box/index.js +5 -5
  184. package/dist/ui/components/image-box/typedef.js +32 -32
  185. package/dist/ui/components/index.js +23 -23
  186. package/dist/ui/components/presenter/ImageSlide.svelte +64 -64
  187. package/dist/ui/components/presenter/Presenter.state.svelte.js +638 -638
  188. package/dist/ui/components/presenter/Presenter.svelte +142 -142
  189. package/dist/ui/components/presenter/constants.js +7 -7
  190. package/dist/ui/components/presenter/index.js +10 -10
  191. package/dist/ui/components/presenter/typedef.js +106 -106
  192. package/dist/ui/components/presenter/util.js +210 -210
  193. package/dist/ui/components/virtual-viewport/VirtualViewport.svelte +196 -196
  194. package/dist/ui/primitives/area/HkArea.svelte +49 -49
  195. package/dist/ui/primitives/area/HkGridArea.svelte +77 -77
  196. package/dist/ui/primitives/area/index.js +2 -2
  197. package/dist/ui/primitives/buttons/button/Button.svelte +82 -82
  198. package/dist/ui/primitives/buttons/button-icon-steeze/SteezeIconButton.svelte +30 -30
  199. package/dist/ui/primitives/buttons/button-text/TextButton.svelte +21 -21
  200. package/dist/ui/primitives/buttons/index.js +3 -3
  201. package/dist/ui/primitives/debug/debug-panel-design-scaling/DebugPanelDesignScaling.svelte +146 -146
  202. package/dist/ui/primitives/debug/index.js +1 -1
  203. package/dist/ui/primitives/drag-drop/DragController.js +44 -44
  204. package/dist/ui/primitives/drag-drop/DragDropContext.svelte +111 -111
  205. package/dist/ui/primitives/drag-drop/Draggable.svelte +519 -519
  206. package/dist/ui/primitives/drag-drop/DropZone.svelte +258 -258
  207. package/dist/ui/primitives/drag-drop/DropZoneArea.svelte +119 -119
  208. package/dist/ui/primitives/drag-drop/DropZoneList.svelte +125 -125
  209. package/dist/ui/primitives/drag-drop/actions.js +26 -26
  210. package/dist/ui/primitives/drag-drop/drag-state.svelte.js +322 -322
  211. package/dist/ui/primitives/drag-drop/index.js +7 -7
  212. package/dist/ui/primitives/drag-drop/util.js +85 -85
  213. package/dist/ui/primitives/hkdev/blocks/TextBlock.svelte +46 -46
  214. package/dist/ui/primitives/hkdev/buttons/CheckButton.svelte +62 -62
  215. package/dist/ui/primitives/icons/HkIcon.svelte +86 -86
  216. package/dist/ui/primitives/icons/HkTabIcon.svelte +116 -116
  217. package/dist/ui/primitives/icons/SteezeIcon.svelte +97 -97
  218. package/dist/ui/primitives/icons/index.js +6 -6
  219. package/dist/ui/primitives/icons/typedef.js +16 -16
  220. package/dist/ui/primitives/index.js +2 -2
  221. package/dist/ui/primitives/inputs/index.js +1 -1
  222. package/dist/ui/primitives/inputs/text-input/TestTextInput.svelte__ +102 -0
  223. package/dist/ui/primitives/inputs/text-input/TextInput.svelte +223 -223
  224. package/dist/ui/primitives/inputs/text-input/TextInput.svelte___ +83 -0
  225. package/dist/ui/primitives/inputs/text-input/assets/IconInvalid.svelte +14 -14
  226. package/dist/ui/primitives/inputs/text-input/assets/IconValid.svelte +12 -12
  227. package/dist/ui/primitives/layout/grid-layers/GridLayers.svelte +63 -63
  228. package/dist/ui/primitives/layout/grid-layers/GridLayers.svelte__heightFrom__ +372 -0
  229. package/dist/ui/primitives/layout/grid-layers/util.js +74 -74
  230. package/dist/ui/primitives/layout/index.js +1 -1
  231. package/dist/ui/primitives/panels/index.js +1 -1
  232. package/dist/ui/primitives/panels/panel/Panel.svelte +43 -43
  233. package/dist/ui/primitives/rows/index.js +3 -3
  234. package/dist/ui/primitives/rows/panel-grid-row/PanelGridRow.svelte +104 -104
  235. package/dist/ui/primitives/rows/panel-row-2/PanelRow2.svelte +40 -40
  236. package/dist/ui/primitives/tab-bar/HkTabBar.state.svelte.js +149 -149
  237. package/dist/ui/primitives/tab-bar/HkTabBar.svelte +74 -74
  238. package/dist/ui/primitives/tab-bar/HkTabBarSelector.state.svelte.js +93 -93
  239. package/dist/ui/primitives/tab-bar/HkTabBarSelector.svelte +49 -49
  240. package/dist/ui/primitives/tab-bar/index.js +17 -17
  241. package/dist/ui/primitives/tab-bar/typedef.js +11 -11
  242. package/dist/util/array/index.js +436 -436
  243. package/dist/util/bases/base58.js +262 -262
  244. package/dist/util/bases/index.js +1 -1
  245. package/dist/util/compare/index.js +247 -247
  246. package/dist/util/css/css-vars.js +83 -83
  247. package/dist/util/css/index.js +1 -1
  248. package/dist/util/env/index.js +9 -9
  249. package/dist/util/exceptions/index.d.ts +4 -3
  250. package/dist/util/exceptions/index.js +26 -23
  251. package/dist/util/expect/arrays.js +47 -47
  252. package/dist/util/expect/index.js +259 -259
  253. package/dist/util/expect/primitives.js +55 -55
  254. package/dist/util/expect/url.js +60 -60
  255. package/dist/util/function/index.js +218 -218
  256. package/dist/util/geo/index.js +26 -26
  257. package/dist/util/index.js +7 -7
  258. package/dist/util/is/index.js +147 -147
  259. package/dist/util/iterate/index.js +204 -204
  260. package/dist/util/object/index.js +1345 -1345
  261. package/dist/util/singleton/index.js +97 -97
  262. package/dist/util/string/array-path.js +75 -75
  263. package/dist/util/string/convert.js +54 -54
  264. package/dist/util/string/fs.js +226 -226
  265. package/dist/util/string/index.js +5 -5
  266. package/dist/util/string/interpolate.js +61 -61
  267. package/dist/util/string/pad.js +10 -10
  268. package/dist/util/svelte/index.js +4 -4
  269. package/dist/util/svelte/loading/loading-tracker.svelte.js +108 -108
  270. package/dist/util/svelte/observe/index.js +49 -49
  271. package/dist/util/svelte/state-context/index.js +117 -117
  272. package/dist/util/svelte/wait/index.js +38 -38
  273. package/dist/util/sveltekit/index.js +1 -1
  274. package/dist/util/sveltekit/route-folders/index.js +101 -101
  275. package/dist/util/time/index.js +328 -328
  276. package/dist/util/unique/index.js +231 -231
  277. package/dist/valibot/README.md +61 -50
  278. package/dist/valibot/index.js +8 -8
  279. package/dist/valibot/parsers/date.js__ +10 -0
  280. package/dist/valibot/parsers/email.d.ts +12 -0
  281. package/dist/valibot/parsers/email.js +34 -0
  282. package/dist/valibot/parsers/url.js +110 -110
  283. package/dist/valibot/parsers/user.js +23 -23
  284. package/dist/valibot/parsers.js +3 -3
  285. package/package.json +131 -131
  286. package/dist/logging/internal/unified-logger/index.d.ts +0 -3
  287. package/dist/logging/internal/unified-logger/index.js +0 -6
  288. package/dist/services/internal/index.d.ts +0 -6
  289. package/dist/services/internal/index.js +0 -8
  290. /package/dist/logging/internal/{unified-logger/constants.d.ts → constants.d.ts} +0 -0
  291. /package/dist/services/{internal/service-base → service-base}/index.d.ts +0 -0
  292. /package/dist/services/{internal/service-manager → service-manager}/constants.d.ts +0 -0
  293. /package/dist/services/{internal/service-manager → service-manager}/typedef.d.ts +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
+ }