@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,242 +1,242 @@
1
- /* ------------------------------------------------------------------ Imports */
2
-
3
- import * as expect from '../../util/expect/index.js';
4
-
5
- import { PATH_SEPARATOR } from '../../util/object/index.js';
6
-
7
- /* ------------------------------------------------------------------ Typedef */
8
-
9
- /* ------------------------------------------------------------------ Exports */
10
-
11
- export default class IterableTree {
12
- #options;
13
-
14
- /**
15
- * Construct an object that can be used to iterate paths and values in
16
- * an object.
17
- * - Returns path-value pairs for all leaves of the object (tree)
18
- * - Iterates "own properties" only (not inherited properties)
19
- *
20
- * @param {object} obj - Object to iterate
21
- * @param {import('./typedef.js').IterableTreeOptions} [options]
22
- * @param {string[]} [_parentArrPath]
23
- */
24
- constructor(obj, options, _parentArrPath) {
25
- //super( ...arguments );
26
-
27
- expect.object(obj);
28
-
29
- this.obj = obj;
30
-
31
- this.#options = Object.assign(
32
- {
33
- walkArrays: false,
34
- ignoreEmptyObjectLeaves: false,
35
- expandPathKeys: false,
36
- outputIntermediateNodes: false
37
- },
38
- options
39
- );
40
-
41
- this._parentArrPath = _parentArrPath || null;
42
- }
43
-
44
- /* --------------------------------------------------------- Public methods */
45
-
46
- // -------------------------------------------------------------------- Method
47
-
48
- /**
49
- * Get an iterator to iterate over all object [ path, value ] entries
50
- *
51
- * @returns {Iterable<[string[], any]>} iterable that yields [path, value] pairs
52
- */
53
- *entries() {
54
- const obj = this.obj;
55
- const parentArrPath = this._parentArrPath;
56
-
57
- const options = this.#options;
58
-
59
- let { expandPathKeys, ignoreEmptyObjectLeaves, outputIntermediateNodes } =
60
- this.#options;
61
-
62
- if (parentArrPath) {
63
- // Never expand keys if not in root object
64
- expandPathKeys = false;
65
- }
66
-
67
- // @note keys are own properties only
68
- const keys = Object.keys(obj);
69
-
70
- let pathKeys;
71
-
72
- if (expandPathKeys) {
73
- pathKeys = [];
74
- }
75
-
76
- // -- STEP 1: Normal object iteration (and gather path keys)
77
-
78
- for (let j = 0, n = keys.length; j < n; j = j + 1) {
79
- const key = keys[j];
80
-
81
- if (expandPathKeys && key.includes(PATH_SEPARATOR)) {
82
- // Gather pathKeys
83
- pathKeys.push(key);
84
- continue;
85
- }
86
-
87
- const valueAtPath = obj[key];
88
-
89
- if (undefined === valueAtPath) {
90
- // Ignore path-value pair if valueAtPath is undefined
91
- continue;
92
- }
93
-
94
- let path;
95
-
96
- if (parentArrPath) {
97
- path = parentArrPath.slice(0);
98
- path.push(key);
99
- } else {
100
- path = [key];
101
- }
102
-
103
- // No recursion >>
104
-
105
- if (!this.#shouldRecurse(valueAtPath)) {
106
- if (
107
- ignoreEmptyObjectLeaves &&
108
- valueAtPath instanceof Object &&
109
- 0 === Object.keys(valueAtPath).length
110
- ) {
111
- // Ignore empty object leave
112
- continue;
113
- }
114
-
115
- yield [path, valueAtPath];
116
- continue;
117
- }
118
-
119
- // Recursion >>
120
-
121
- // console.log( { path, valueAtPath, outputIntermediateNodes } );
122
-
123
- if (outputIntermediateNodes) {
124
- // outputIntermediateNodes=true
125
- // -> Output itermediate node
126
-
127
- if (Array.isArray(valueAtPath)) {
128
- // Intermediate node is an array
129
- yield [path, []];
130
- } else {
131
- // Intermediate node is plain object
132
- yield [path, {}];
133
- }
134
- }
135
-
136
- const objectIterator = new IterableTree(valueAtPath, options, path);
137
-
138
- for (const entry of objectIterator.entries()) {
139
- yield entry;
140
- }
141
- } // end for
142
-
143
- // -- STEP 2: Output entries from "path keys"
144
-
145
- if (!pathKeys || !pathKeys.length) {
146
- // No path keys -> done
147
- return;
148
- }
149
-
150
- for (let j = 0, n = pathKeys.length; j < n; j = j + 1) {
151
- // @note path keys do not output intermediate nodes
152
-
153
- const key = pathKeys[j];
154
-
155
- const valueAtPath = obj[key];
156
- const path = key.split(PATH_SEPARATOR);
157
-
158
- yield [path, valueAtPath];
159
- }
160
- }
161
-
162
- // -------------------------------------------------------------------- Method
163
-
164
- /**
165
- * Get an iterator to iterate over all object paths
166
- *
167
- * @returns {Iterable<string[]>} iterable that yields path arrays
168
- */
169
- *paths() {
170
- for (const entry of this.entries()) {
171
- yield entry[0];
172
- }
173
- }
174
-
175
- // -------------------------------------------------------------------- Method
176
-
177
- /**
178
- * Get an iterator to iterate over all values at the leaves of the paths in
179
- * the object
180
- *
181
- * @returns {Iterable<any>} iterable that yields leaf values
182
- */
183
- *values() {
184
- for (const entry of this.entries()) {
185
- yield entry[1];
186
- }
187
- }
188
-
189
- // -------------------------------------------------------------------- Method
190
-
191
- /**
192
- * Make the class iterable by implementing Symbol.iterator
193
- * Defaults to iterating over entries (path-value pairs)
194
- *
195
- * @returns {Iterable<[string[], any]>} iterable that yields [path, value] pairs
196
- */
197
- *[Symbol.iterator]() {
198
- yield* this.entries();
199
- }
200
-
201
- // -------------------------------------------------------------------- Method
202
-
203
- /**
204
- * Returns true if the iterator should recurse into the specified value
205
- *
206
- * @param {any} value
207
- *
208
- * @return {boolean} true if the value should be iterated
209
- */
210
- #shouldRecurse(value) {
211
- if (!(value instanceof Object)) {
212
- // not an object -> no recursion
213
- return false;
214
- }
215
-
216
- const walkArrays = this.#options.walkArrays;
217
-
218
- if (walkArrays && Array.isArray(value)) {
219
- // walkArrays=true AND isArray
220
-
221
- if (!value.length) {
222
- // Array is empty -> no recursion
223
- return false;
224
- }
225
-
226
- return true;
227
- }
228
-
229
- if ('[object Object]' !== value.toString()) {
230
- // Not a plain object -> no recursion
231
- return false;
232
- }
233
-
234
- if (Object.keys(value).length) {
235
- // Object is not empty -> recursion
236
- return true;
237
- }
238
-
239
- // Otherwise -> no recursion
240
- return false;
241
- }
242
- } // end class
1
+ /* ------------------------------------------------------------------ Imports */
2
+
3
+ import * as expect from '../../util/expect/index.js';
4
+
5
+ import { PATH_SEPARATOR } from '../../util/object/index.js';
6
+
7
+ /* ------------------------------------------------------------------ Typedef */
8
+
9
+ /* ------------------------------------------------------------------ Exports */
10
+
11
+ export default class IterableTree {
12
+ #options;
13
+
14
+ /**
15
+ * Construct an object that can be used to iterate paths and values in
16
+ * an object.
17
+ * - Returns path-value pairs for all leaves of the object (tree)
18
+ * - Iterates "own properties" only (not inherited properties)
19
+ *
20
+ * @param {object} obj - Object to iterate
21
+ * @param {import('./typedef.js').IterableTreeOptions} [options]
22
+ * @param {string[]} [_parentArrPath]
23
+ */
24
+ constructor(obj, options, _parentArrPath) {
25
+ //super( ...arguments );
26
+
27
+ expect.object(obj);
28
+
29
+ this.obj = obj;
30
+
31
+ this.#options = Object.assign(
32
+ {
33
+ walkArrays: false,
34
+ ignoreEmptyObjectLeaves: false,
35
+ expandPathKeys: false,
36
+ outputIntermediateNodes: false
37
+ },
38
+ options
39
+ );
40
+
41
+ this._parentArrPath = _parentArrPath || null;
42
+ }
43
+
44
+ /* --------------------------------------------------------- Public methods */
45
+
46
+ // -------------------------------------------------------------------- Method
47
+
48
+ /**
49
+ * Get an iterator to iterate over all object [ path, value ] entries
50
+ *
51
+ * @returns {Iterable<[string[], any]>} iterable that yields [path, value] pairs
52
+ */
53
+ *entries() {
54
+ const obj = this.obj;
55
+ const parentArrPath = this._parentArrPath;
56
+
57
+ const options = this.#options;
58
+
59
+ let { expandPathKeys, ignoreEmptyObjectLeaves, outputIntermediateNodes } =
60
+ this.#options;
61
+
62
+ if (parentArrPath) {
63
+ // Never expand keys if not in root object
64
+ expandPathKeys = false;
65
+ }
66
+
67
+ // @note keys are own properties only
68
+ const keys = Object.keys(obj);
69
+
70
+ let pathKeys;
71
+
72
+ if (expandPathKeys) {
73
+ pathKeys = [];
74
+ }
75
+
76
+ // -- STEP 1: Normal object iteration (and gather path keys)
77
+
78
+ for (let j = 0, n = keys.length; j < n; j = j + 1) {
79
+ const key = keys[j];
80
+
81
+ if (expandPathKeys && key.includes(PATH_SEPARATOR)) {
82
+ // Gather pathKeys
83
+ pathKeys.push(key);
84
+ continue;
85
+ }
86
+
87
+ const valueAtPath = obj[key];
88
+
89
+ if (undefined === valueAtPath) {
90
+ // Ignore path-value pair if valueAtPath is undefined
91
+ continue;
92
+ }
93
+
94
+ let path;
95
+
96
+ if (parentArrPath) {
97
+ path = parentArrPath.slice(0);
98
+ path.push(key);
99
+ } else {
100
+ path = [key];
101
+ }
102
+
103
+ // No recursion >>
104
+
105
+ if (!this.#shouldRecurse(valueAtPath)) {
106
+ if (
107
+ ignoreEmptyObjectLeaves &&
108
+ valueAtPath instanceof Object &&
109
+ 0 === Object.keys(valueAtPath).length
110
+ ) {
111
+ // Ignore empty object leave
112
+ continue;
113
+ }
114
+
115
+ yield [path, valueAtPath];
116
+ continue;
117
+ }
118
+
119
+ // Recursion >>
120
+
121
+ // console.log( { path, valueAtPath, outputIntermediateNodes } );
122
+
123
+ if (outputIntermediateNodes) {
124
+ // outputIntermediateNodes=true
125
+ // -> Output itermediate node
126
+
127
+ if (Array.isArray(valueAtPath)) {
128
+ // Intermediate node is an array
129
+ yield [path, []];
130
+ } else {
131
+ // Intermediate node is plain object
132
+ yield [path, {}];
133
+ }
134
+ }
135
+
136
+ const objectIterator = new IterableTree(valueAtPath, options, path);
137
+
138
+ for (const entry of objectIterator.entries()) {
139
+ yield entry;
140
+ }
141
+ } // end for
142
+
143
+ // -- STEP 2: Output entries from "path keys"
144
+
145
+ if (!pathKeys || !pathKeys.length) {
146
+ // No path keys -> done
147
+ return;
148
+ }
149
+
150
+ for (let j = 0, n = pathKeys.length; j < n; j = j + 1) {
151
+ // @note path keys do not output intermediate nodes
152
+
153
+ const key = pathKeys[j];
154
+
155
+ const valueAtPath = obj[key];
156
+ const path = key.split(PATH_SEPARATOR);
157
+
158
+ yield [path, valueAtPath];
159
+ }
160
+ }
161
+
162
+ // -------------------------------------------------------------------- Method
163
+
164
+ /**
165
+ * Get an iterator to iterate over all object paths
166
+ *
167
+ * @returns {Iterable<string[]>} iterable that yields path arrays
168
+ */
169
+ *paths() {
170
+ for (const entry of this.entries()) {
171
+ yield entry[0];
172
+ }
173
+ }
174
+
175
+ // -------------------------------------------------------------------- Method
176
+
177
+ /**
178
+ * Get an iterator to iterate over all values at the leaves of the paths in
179
+ * the object
180
+ *
181
+ * @returns {Iterable<any>} iterable that yields leaf values
182
+ */
183
+ *values() {
184
+ for (const entry of this.entries()) {
185
+ yield entry[1];
186
+ }
187
+ }
188
+
189
+ // -------------------------------------------------------------------- Method
190
+
191
+ /**
192
+ * Make the class iterable by implementing Symbol.iterator
193
+ * Defaults to iterating over entries (path-value pairs)
194
+ *
195
+ * @returns {Iterable<[string[], any]>} iterable that yields [path, value] pairs
196
+ */
197
+ *[Symbol.iterator]() {
198
+ yield* this.entries();
199
+ }
200
+
201
+ // -------------------------------------------------------------------- Method
202
+
203
+ /**
204
+ * Returns true if the iterator should recurse into the specified value
205
+ *
206
+ * @param {any} value
207
+ *
208
+ * @return {boolean} true if the value should be iterated
209
+ */
210
+ #shouldRecurse(value) {
211
+ if (!(value instanceof Object)) {
212
+ // not an object -> no recursion
213
+ return false;
214
+ }
215
+
216
+ const walkArrays = this.#options.walkArrays;
217
+
218
+ if (walkArrays && Array.isArray(value)) {
219
+ // walkArrays=true AND isArray
220
+
221
+ if (!value.length) {
222
+ // Array is empty -> no recursion
223
+ return false;
224
+ }
225
+
226
+ return true;
227
+ }
228
+
229
+ if ('[object Object]' !== value.toString()) {
230
+ // Not a plain object -> no recursion
231
+ return false;
232
+ }
233
+
234
+ if (Object.keys(value).length) {
235
+ // Object is not empty -> recursion
236
+ return true;
237
+ }
238
+
239
+ // Otherwise -> no recursion
240
+ return false;
241
+ }
242
+ } // end class