@hkdigital/lib-core 0.3.11 → 0.3.12

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 (292) 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.js +4 -4
  173. package/dist/ui/components/button-group/ButtonGroup.svelte +82 -82
  174. package/dist/ui/components/button-group/typedef.js +10 -10
  175. package/dist/ui/components/compare-left-right/CompareLeftRight.svelte +179 -179
  176. package/dist/ui/components/compare-left-right/index.js +1 -1
  177. package/dist/ui/components/game-box/GameBox.svelte +577 -577
  178. package/dist/ui/components/game-box/gamebox.util.js +83 -83
  179. package/dist/ui/components/hk-app-layout/HkAppLayout.state.svelte.js +25 -25
  180. package/dist/ui/components/hk-app-layout/HkAppLayout.svelte +251 -251
  181. package/dist/ui/components/image-box/ImageBox.svelte +210 -210
  182. package/dist/ui/components/image-box/index.js +5 -5
  183. package/dist/ui/components/image-box/typedef.js +32 -32
  184. package/dist/ui/components/index.js +23 -23
  185. package/dist/ui/components/presenter/ImageSlide.svelte +64 -64
  186. package/dist/ui/components/presenter/Presenter.state.svelte.js +638 -638
  187. package/dist/ui/components/presenter/Presenter.svelte +142 -142
  188. package/dist/ui/components/presenter/constants.js +7 -7
  189. package/dist/ui/components/presenter/index.js +10 -10
  190. package/dist/ui/components/presenter/typedef.js +106 -106
  191. package/dist/ui/components/presenter/util.js +210 -210
  192. package/dist/ui/components/virtual-viewport/VirtualViewport.svelte +196 -196
  193. package/dist/ui/primitives/area/HkArea.svelte +49 -49
  194. package/dist/ui/primitives/area/HkGridArea.svelte +77 -77
  195. package/dist/ui/primitives/area/index.js +2 -2
  196. package/dist/ui/primitives/buttons/button/Button.svelte +82 -82
  197. package/dist/ui/primitives/buttons/button-icon-steeze/SteezeIconButton.svelte +30 -30
  198. package/dist/ui/primitives/buttons/button-text/TextButton.svelte +21 -21
  199. package/dist/ui/primitives/buttons/index.js +3 -3
  200. package/dist/ui/primitives/debug/debug-panel-design-scaling/DebugPanelDesignScaling.svelte +146 -146
  201. package/dist/ui/primitives/debug/index.js +1 -1
  202. package/dist/ui/primitives/drag-drop/DragController.js +44 -44
  203. package/dist/ui/primitives/drag-drop/DragDropContext.svelte +111 -111
  204. package/dist/ui/primitives/drag-drop/Draggable.svelte +519 -519
  205. package/dist/ui/primitives/drag-drop/DropZone.svelte +258 -258
  206. package/dist/ui/primitives/drag-drop/DropZoneArea.svelte +119 -119
  207. package/dist/ui/primitives/drag-drop/DropZoneList.svelte +125 -125
  208. package/dist/ui/primitives/drag-drop/actions.js +26 -26
  209. package/dist/ui/primitives/drag-drop/drag-state.svelte.js +322 -322
  210. package/dist/ui/primitives/drag-drop/index.js +7 -7
  211. package/dist/ui/primitives/drag-drop/util.js +85 -85
  212. package/dist/ui/primitives/hkdev/blocks/TextBlock.svelte +46 -46
  213. package/dist/ui/primitives/hkdev/buttons/CheckButton.svelte +62 -62
  214. package/dist/ui/primitives/icons/HkIcon.svelte +86 -86
  215. package/dist/ui/primitives/icons/HkTabIcon.svelte +116 -116
  216. package/dist/ui/primitives/icons/SteezeIcon.svelte +97 -97
  217. package/dist/ui/primitives/icons/index.js +6 -6
  218. package/dist/ui/primitives/icons/typedef.js +16 -16
  219. package/dist/ui/primitives/index.js +2 -2
  220. package/dist/ui/primitives/inputs/index.js +1 -1
  221. package/dist/ui/primitives/inputs/text-input/TestTextInput.svelte__ +102 -0
  222. package/dist/ui/primitives/inputs/text-input/TextInput.svelte +223 -223
  223. package/dist/ui/primitives/inputs/text-input/TextInput.svelte___ +83 -0
  224. package/dist/ui/primitives/inputs/text-input/assets/IconInvalid.svelte +14 -14
  225. package/dist/ui/primitives/inputs/text-input/assets/IconValid.svelte +12 -12
  226. package/dist/ui/primitives/layout/grid-layers/GridLayers.svelte +63 -63
  227. package/dist/ui/primitives/layout/grid-layers/GridLayers.svelte__heightFrom__ +372 -0
  228. package/dist/ui/primitives/layout/grid-layers/util.js +74 -74
  229. package/dist/ui/primitives/layout/index.js +1 -1
  230. package/dist/ui/primitives/panels/index.js +1 -1
  231. package/dist/ui/primitives/panels/panel/Panel.svelte +43 -43
  232. package/dist/ui/primitives/rows/index.js +3 -3
  233. package/dist/ui/primitives/rows/panel-grid-row/PanelGridRow.svelte +104 -104
  234. package/dist/ui/primitives/rows/panel-row-2/PanelRow2.svelte +40 -40
  235. package/dist/ui/primitives/tab-bar/HkTabBar.state.svelte.js +149 -149
  236. package/dist/ui/primitives/tab-bar/HkTabBar.svelte +74 -74
  237. package/dist/ui/primitives/tab-bar/HkTabBarSelector.state.svelte.js +93 -93
  238. package/dist/ui/primitives/tab-bar/HkTabBarSelector.svelte +49 -49
  239. package/dist/ui/primitives/tab-bar/index.js +17 -17
  240. package/dist/ui/primitives/tab-bar/typedef.js +11 -11
  241. package/dist/util/array/index.js +436 -436
  242. package/dist/util/bases/base58.js +262 -262
  243. package/dist/util/bases/index.js +1 -1
  244. package/dist/util/compare/index.js +247 -247
  245. package/dist/util/css/css-vars.js +83 -83
  246. package/dist/util/css/index.js +1 -1
  247. package/dist/util/env/index.js +9 -9
  248. package/dist/util/exceptions/index.d.ts +4 -3
  249. package/dist/util/exceptions/index.js +26 -23
  250. package/dist/util/expect/arrays.js +47 -47
  251. package/dist/util/expect/index.js +259 -259
  252. package/dist/util/expect/primitives.js +55 -55
  253. package/dist/util/expect/url.js +60 -60
  254. package/dist/util/function/index.js +218 -218
  255. package/dist/util/geo/index.js +26 -26
  256. package/dist/util/index.js +7 -7
  257. package/dist/util/is/index.js +147 -147
  258. package/dist/util/iterate/index.js +204 -204
  259. package/dist/util/object/index.js +1345 -1345
  260. package/dist/util/singleton/index.js +97 -97
  261. package/dist/util/string/array-path.js +75 -75
  262. package/dist/util/string/convert.js +54 -54
  263. package/dist/util/string/fs.js +226 -226
  264. package/dist/util/string/index.js +5 -5
  265. package/dist/util/string/interpolate.js +61 -61
  266. package/dist/util/string/pad.js +10 -10
  267. package/dist/util/svelte/index.js +4 -4
  268. package/dist/util/svelte/loading/loading-tracker.svelte.js +108 -108
  269. package/dist/util/svelte/observe/index.js +49 -49
  270. package/dist/util/svelte/state-context/index.js +117 -117
  271. package/dist/util/svelte/wait/index.js +38 -38
  272. package/dist/util/sveltekit/index.js +1 -1
  273. package/dist/util/sveltekit/route-folders/index.js +101 -101
  274. package/dist/util/time/index.js +328 -328
  275. package/dist/util/unique/index.js +231 -231
  276. package/dist/valibot/README.md +61 -50
  277. package/dist/valibot/index.js +8 -8
  278. package/dist/valibot/parsers/date.js__ +10 -0
  279. package/dist/valibot/parsers/email.d.ts +12 -0
  280. package/dist/valibot/parsers/email.js +34 -0
  281. package/dist/valibot/parsers/url.js +110 -110
  282. package/dist/valibot/parsers/user.js +23 -23
  283. package/dist/valibot/parsers.js +3 -3
  284. package/package.json +131 -131
  285. package/dist/logging/internal/unified-logger/index.d.ts +0 -3
  286. package/dist/logging/internal/unified-logger/index.js +0 -6
  287. package/dist/services/internal/index.d.ts +0 -6
  288. package/dist/services/internal/index.js +0 -8
  289. /package/dist/logging/internal/{unified-logger/constants.d.ts → constants.d.ts} +0 -0
  290. /package/dist/services/{internal/service-base → service-base}/index.d.ts +0 -0
  291. /package/dist/services/{internal/service-manager → service-manager}/constants.d.ts +0 -0
  292. /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