@hkdigital/lib-sveltekit 0.1.5 → 0.1.6
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.
- package/README.md +127 -127
- package/dist/classes/data/IterableTree.js +243 -243
- package/dist/classes/data/Selector.js +190 -190
- package/dist/classes/data/index.js +2 -2
- package/dist/classes/index.js +3 -3
- package/dist/classes/promise/HkPromise.js +377 -377
- package/dist/classes/promise/index.js +1 -1
- package/dist/classes/stores/SubscribersCount.js +107 -107
- package/dist/classes/stores/index.js +1 -1
- package/dist/classes/streams/LogTransformStream.js +19 -19
- package/dist/classes/streams/ServerEventsStore.js +110 -110
- package/dist/classes/streams/TimeStampSource.js +26 -26
- package/dist/classes/streams/index.js +3 -3
- package/dist/classes/svelte/audio/AudioLoader.svelte.js +58 -58
- package/dist/classes/svelte/audio/AudioScene.svelte.js +282 -282
- package/dist/classes/svelte/audio/mocks.js +35 -35
- package/dist/classes/svelte/final-state-machine/FiniteStateMachine.svelte.js +133 -133
- package/dist/classes/svelte/final-state-machine/index.js +1 -1
- package/dist/classes/svelte/image/ImageLoader.svelte.js +47 -47
- package/dist/classes/svelte/image/ImageScene.svelte.js +253 -253
- package/dist/classes/svelte/image/ImageVariantsLoader.svelte.js +152 -152
- package/dist/classes/svelte/image/index.js +4 -4
- package/dist/classes/svelte/image/mocks.js +35 -35
- package/dist/classes/svelte/image/typedef.js +8 -8
- package/dist/classes/svelte/loading-state-machine/LoadingStateMachine.svelte.js +109 -109
- package/dist/classes/svelte/loading-state-machine/constants.js +16 -16
- package/dist/classes/svelte/loading-state-machine/index.js +3 -3
- package/dist/classes/svelte/network-loader/NetworkLoader.svelte.js +331 -331
- package/dist/classes/svelte/network-loader/constants.js +3 -3
- package/dist/classes/svelte/network-loader/index.js +3 -3
- package/dist/classes/svelte/network-loader/mocks.js +30 -30
- package/dist/classes/svelte/network-loader/typedef.js +8 -8
- package/dist/components/area/HkArea.svelte +49 -49
- package/dist/components/area/HkArea.svelte.d.ts +0 -14
- package/dist/components/area/HkGridArea.svelte +77 -77
- package/dist/components/area/HkGridArea.svelte.d.ts +0 -22
- package/dist/components/area/index.js +2 -2
- package/dist/components/boxes/game-box/GameBox.svelte +112 -112
- package/dist/components/boxes/game-box/GameBox.svelte.d.ts +0 -15
- package/dist/components/boxes/game-box/gamebox.util.js +83 -83
- package/dist/components/boxes/index.js +2 -2
- package/dist/components/boxes/virtual-viewport/VirtualViewport.svelte +199 -199
- package/dist/components/boxes/virtual-viewport/VirtualViewport.svelte.d.ts +0 -22
- package/dist/components/buttons/button/Button.svelte +75 -75
- package/dist/components/buttons/button/Button.svelte.d.ts +0 -21
- package/dist/components/buttons/button-text/TextButton.svelte +21 -21
- package/dist/components/buttons/button-text/TextButton.svelte.d.ts +0 -7
- package/dist/components/buttons/index.js +2 -2
- package/dist/components/hkdev/blocks/TextBlock.svelte +46 -46
- package/dist/components/hkdev/blocks/TextBlock.svelte.d.ts +0 -13
- package/dist/components/hkdev/buttons/CheckButton.svelte +62 -62
- package/dist/components/hkdev/buttons/CheckButton.svelte.d.ts +0 -18
- package/dist/components/icon/HkIcon.svelte +86 -86
- package/dist/components/icon/HkIcon.svelte.d.ts +0 -12
- package/dist/components/icon/HkTabIcon.svelte +116 -116
- package/dist/components/icon/HkTabIcon.svelte.d.ts +0 -21
- package/dist/components/icon/index.js +4 -4
- package/dist/components/icon/typedef.js +16 -16
- package/dist/components/image/ImageBox.svelte +208 -208
- package/dist/components/image/ImageBox.svelte.d.ts +0 -19
- package/dist/components/image/index.js +5 -5
- package/dist/components/image/typedef.js +32 -32
- package/dist/components/index.js +2 -2
- package/dist/components/inputs/index.js +1 -1
- package/dist/components/inputs/text-input/TestTextInput.svelte__ +102 -102
- package/dist/components/inputs/text-input/TextInput.svelte +226 -226
- package/dist/components/inputs/text-input/TextInput.svelte.d.ts +0 -28
- package/dist/components/inputs/text-input/TextInput.svelte___ +83 -83
- package/dist/components/inputs/text-input/assets/IconInvalid.svelte +14 -14
- package/dist/components/inputs/text-input/assets/IconValid.svelte +12 -12
- package/dist/components/layout/HkAppLayout.state.svelte.js +25 -25
- package/dist/components/layout/HkAppLayout.svelte +251 -251
- package/dist/components/layout/HkAppLayout.svelte.d.ts +0 -11
- package/dist/components/layout/HkGridLayers.svelte +82 -82
- package/dist/components/layout/HkGridLayers.svelte.d.ts +0 -23
- package/dist/components/layout/index.js +9 -9
- package/dist/components/panels/index.js +1 -1
- package/dist/components/panels/plain-panel/PlainPanel.svelte +33 -33
- package/dist/components/panels/plain-panel/PlainPanel.svelte.d.ts +0 -12
- package/dist/components/rows/index.js +3 -3
- package/dist/components/rows/panel-grid-row/PanelGridRow.svelte +104 -104
- package/dist/components/rows/panel-grid-row/PanelGridRow.svelte.d.ts +0 -14
- package/dist/components/rows/panel-row-2/PanelRow2.svelte +40 -40
- package/dist/components/rows/panel-row-2/PanelRow2.svelte.d.ts +0 -14
- package/dist/components/tab-bar/HkTabBar.state.svelte.js +149 -149
- package/dist/components/tab-bar/HkTabBar.svelte +74 -74
- package/dist/components/tab-bar/HkTabBar.svelte.d.ts +0 -18
- package/dist/components/tab-bar/HkTabBarSelector.state.svelte.js +93 -93
- package/dist/components/tab-bar/HkTabBarSelector.svelte +49 -49
- package/dist/components/tab-bar/HkTabBarSelector.svelte.d.ts +0 -19
- package/dist/components/tab-bar/index.js +17 -17
- package/dist/components/tab-bar/typedef.js +8 -8
- package/dist/components/widgets/compare-left-right/CompareLeftRight.svelte +179 -179
- package/dist/components/widgets/compare-left-right/CompareLeftRight.svelte.d.ts +0 -10
- package/dist/components/widgets/compare-left-right/index.js +1 -1
- package/dist/components/widgets/scale-control/index.js +1 -1
- package/dist/config/imagetools-config.js +189 -189
- package/dist/config/imagetools.d.ts +71 -71
- package/dist/config/typedef.js +8 -8
- package/dist/constants/errors/api.js +9 -9
- package/dist/constants/errors/generic.js +5 -5
- package/dist/constants/errors/index.js +3 -3
- package/dist/constants/errors/jwt.js +5 -5
- package/dist/constants/http/headers.js +6 -6
- package/dist/constants/http/index.js +2 -2
- package/dist/constants/http/methods.js +2 -2
- package/dist/constants/index.js +3 -3
- package/dist/constants/mime/application.js +5 -5
- package/dist/constants/mime/audio.js +13 -13
- package/dist/constants/mime/image.js +3 -3
- package/dist/constants/mime/index.js +4 -4
- package/dist/constants/mime/text.js +2 -2
- package/dist/constants/regexp/index.js +31 -31
- package/dist/constants/regexp/inspiratie.js__ +95 -95
- package/dist/constants/regexp/text.js +49 -49
- package/dist/constants/regexp/user.js +32 -32
- package/dist/constants/regexp/web.js +3 -3
- package/dist/constants/state-labels/input-states.js +11 -11
- package/dist/constants/state-labels/submit-states.js +4 -4
- package/dist/constants/time.js +28 -28
- package/dist/css/tw-prose.postcss__ +259 -259
- package/dist/css/utilities.postcss +43 -43
- package/dist/design/design-config.js +73 -73
- package/dist/design/tailwind-theme-extend.d.ts +4 -4
- package/dist/design/tailwind-theme-extend.js +151 -151
- package/dist/schemas/index.js +1 -1
- package/dist/schemas/validate-url.js +180 -180
- package/dist/server/index.js +1 -1
- package/dist/server/logger.js +94 -94
- package/dist/states/index.js +1 -1
- package/dist/states/navigation.svelte.js +55 -55
- package/dist/stores/index.js +1 -1
- package/dist/stores/theme.js +80 -80
- package/dist/themes/hkdev/components/blocks/text-block.postcss +40 -40
- package/dist/themes/hkdev/components/boxes/game-box.postcss +13 -13
- package/dist/themes/hkdev/components/buttons/button-text.postcss +34 -34
- package/dist/themes/hkdev/components/buttons/button.postcss +138 -138
- package/dist/themes/hkdev/components/buttons/skip-button.postcss +8 -8
- package/dist/themes/hkdev/components/inputs/text-input.postcss +108 -108
- package/dist/themes/hkdev/components/panels/plain-panel.postcss +46 -46
- package/dist/themes/hkdev/components/panels/speech-bubble.postcss +52 -52
- package/dist/themes/hkdev/components/rows/panel-grid-row.postcss +7 -7
- package/dist/themes/hkdev/components/rows/panel-row-2.postcss +9 -9
- package/dist/themes/hkdev/components.postcss +55 -55
- package/dist/themes/hkdev/debug.postcss +1 -1
- package/dist/themes/hkdev/global/layout.postcss +39 -39
- package/dist/themes/hkdev/global/on-colors.postcss +53 -53
- package/dist/themes/hkdev/global/text.postcss__ +34 -34
- package/dist/themes/hkdev/global/vars.postcss__ +7 -7
- package/dist/themes/hkdev/globals.postcss +11 -11
- package/dist/themes/hkdev/responsive.postcss +12 -12
- package/dist/themes/hkdev/theme-ext.js +15 -15
- package/dist/themes/hkdev/theme.js +227 -227
- package/dist/themes/index.js +1 -1
- package/dist/util/array/index.js +455 -455
- package/dist/util/compare/index.js +247 -247
- package/dist/util/css/css-vars.js +83 -83
- package/dist/util/css/index.js +1 -1
- package/dist/util/design-system/components/states.js +22 -22
- package/dist/util/design-system/css/clamp.d.ts +2 -2
- package/dist/util/design-system/css/clamp.js +66 -66
- package/dist/util/design-system/css/root-design-vars.js +100 -100
- package/dist/util/design-system/index.js +5 -5
- package/dist/util/design-system/layout/scaling.js +97 -97
- package/dist/util/design-system/tailwind.js +289 -289
- package/dist/util/expect/arrays.js +47 -47
- package/dist/util/expect/index.js +259 -259
- package/dist/util/expect/primitives.js +55 -55
- package/dist/util/expect/url.js +60 -60
- package/dist/util/function/index.js +218 -218
- package/dist/util/http/errors.js +97 -97
- package/dist/util/http/headers.js +45 -45
- package/dist/util/http/http-request.js +273 -273
- package/dist/util/http/index.js +22 -22
- package/dist/util/http/json-request.js +143 -143
- package/dist/util/http/mocks.js +65 -65
- package/dist/util/http/response.js +228 -228
- package/dist/util/http/url.js +52 -52
- package/dist/util/image/index.js +86 -86
- package/dist/util/index.js +2 -2
- package/dist/util/is/index.js +140 -140
- package/dist/util/iterate/index.js +234 -234
- package/dist/util/object/index.js +1361 -1361
- package/dist/util/singleton/index.js +97 -97
- package/dist/util/string/index.js +184 -184
- package/dist/util/svelte/index.js +2 -2
- package/dist/util/svelte/observe/index.js +49 -49
- package/dist/util/svelte/state-context/index.js +83 -83
- package/dist/util/svelte/wait/index.js +38 -38
- package/dist/util/sveltekit/index.js +1 -1
- package/dist/util/sveltekit/route-folders/index.js +82 -82
- package/dist/util/time/index.js +339 -339
- package/dist/valibot/date.js__ +10 -10
- package/dist/valibot/index.js +9 -9
- package/dist/valibot/url.js +95 -95
- package/dist/valibot/user.js +23 -23
- package/dist/zod/all.js +33 -33
- package/dist/zod/generic.js +11 -11
- package/dist/zod/javascript.js +32 -32
- package/dist/zod/user.js +16 -16
- package/dist/zod/web.js +52 -52
- package/package.json +99 -99
- package/dist/themes/hkdev/components/buttons/button.postcss__ +0 -40
- package/dist/themes/hkdev/components/buttons/button.postcss___ +0 -91
@@ -1,243 +1,243 @@
|
|
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
|
-
/**
|
10
|
-
* @typedef {object} Options
|
11
|
-
* @property {boolean} walkArrays
|
12
|
-
* @property {boolean} ignoreEmptyObjectLeaves
|
13
|
-
* @property {boolean} expandPathKeys
|
14
|
-
* @property {boolean} outputIntermediateNodes
|
15
|
-
*/
|
16
|
-
|
17
|
-
/* ------------------------------------------------------------------ Exports */
|
18
|
-
|
19
|
-
export default class IterableTree {
|
20
|
-
/**
|
21
|
-
* @type {Options}
|
22
|
-
*/
|
23
|
-
#options;
|
24
|
-
|
25
|
-
/**
|
26
|
-
* Construct an object that can be used to iterate paths and values in
|
27
|
-
* an object.
|
28
|
-
* - Returns path-value pairs for all leaves of the object (tree)
|
29
|
-
* - Iterates "own properties" only (not inherited properties)
|
30
|
-
*
|
31
|
-
* @param {object} obj - Object to iterate
|
32
|
-
* @param {Options} [options]
|
33
|
-
* @param {string[]} [_parentArrPath]
|
34
|
-
*
|
35
|
-
*
|
36
|
-
* @return {Iterator} iterable object
|
37
|
-
*/
|
38
|
-
constructor(obj, options, _parentArrPath) {
|
39
|
-
//super( ...arguments );
|
40
|
-
|
41
|
-
expect.object(obj);
|
42
|
-
|
43
|
-
this.obj = obj;
|
44
|
-
|
45
|
-
this.#options = Object.assign(
|
46
|
-
{
|
47
|
-
walkArrays: false,
|
48
|
-
ignoreEmptyObjectLeaves: false,
|
49
|
-
expandPathKeys: false,
|
50
|
-
outputIntermediateNodes: false
|
51
|
-
},
|
52
|
-
options
|
53
|
-
);
|
54
|
-
|
55
|
-
this._parentArrPath = _parentArrPath || null;
|
56
|
-
}
|
57
|
-
|
58
|
-
/* --------------------------------------------------------- Public methods */
|
59
|
-
|
60
|
-
// -------------------------------------------------------------------- Method
|
61
|
-
|
62
|
-
/**
|
63
|
-
* Get an iterator to iterate over all object [ path, value ] entries
|
64
|
-
*
|
65
|
-
* @returns {Iterator} object entries iterator
|
66
|
-
*/
|
67
|
-
*entries() {
|
68
|
-
const obj = this.obj;
|
69
|
-
const parentArrPath = this._parentArrPath;
|
70
|
-
|
71
|
-
const options = this.options;
|
72
|
-
|
73
|
-
let { expandPathKeys, ignoreEmptyObjectLeaves, outputIntermediateNodes } = this.#options;
|
74
|
-
|
75
|
-
if (parentArrPath) {
|
76
|
-
// Never expand keys if not in root object
|
77
|
-
expandPathKeys = false;
|
78
|
-
}
|
79
|
-
|
80
|
-
// @note keys are own properties only
|
81
|
-
const keys = Object.keys(obj);
|
82
|
-
|
83
|
-
let pathKeys;
|
84
|
-
|
85
|
-
if (expandPathKeys) {
|
86
|
-
pathKeys = [];
|
87
|
-
}
|
88
|
-
|
89
|
-
// -- STEP 1: Normal object iteration (and gather path keys)
|
90
|
-
|
91
|
-
for (let j = 0, n = keys.length; j < n; j = j + 1) {
|
92
|
-
const key = keys[j];
|
93
|
-
|
94
|
-
if (expandPathKeys && key.includes(PATH_SEPARATOR)) {
|
95
|
-
// Gather pathKeys
|
96
|
-
pathKeys.push(key);
|
97
|
-
continue;
|
98
|
-
}
|
99
|
-
|
100
|
-
const valueAtPath = obj[key];
|
101
|
-
|
102
|
-
if (undefined === valueAtPath) {
|
103
|
-
// Ignore path-value pair if valueAtPath is undefined
|
104
|
-
continue;
|
105
|
-
}
|
106
|
-
|
107
|
-
let path;
|
108
|
-
|
109
|
-
if (parentArrPath) {
|
110
|
-
path = parentArrPath.slice(0);
|
111
|
-
path.push(key);
|
112
|
-
} else {
|
113
|
-
path = [key];
|
114
|
-
}
|
115
|
-
|
116
|
-
// No recursion >>
|
117
|
-
|
118
|
-
if (!this.#shouldRecurse(valueAtPath)) {
|
119
|
-
if (
|
120
|
-
ignoreEmptyObjectLeaves &&
|
121
|
-
valueAtPath instanceof Object &&
|
122
|
-
0 === Object.keys(valueAtPath).length
|
123
|
-
) {
|
124
|
-
// Ignore empty object leave
|
125
|
-
continue;
|
126
|
-
}
|
127
|
-
|
128
|
-
yield [path, valueAtPath];
|
129
|
-
continue;
|
130
|
-
}
|
131
|
-
|
132
|
-
// Recursion >>
|
133
|
-
|
134
|
-
// console.log( { path, valueAtPath, outputIntermediateNodes } );
|
135
|
-
|
136
|
-
if (outputIntermediateNodes) {
|
137
|
-
// outputIntermediateNodes=true
|
138
|
-
// -> Output itermediate node
|
139
|
-
|
140
|
-
if (Array.isArray(valueAtPath)) {
|
141
|
-
// Intermediate node is an array
|
142
|
-
yield [path, []];
|
143
|
-
} else {
|
144
|
-
// Intermediate node is plain object
|
145
|
-
yield [path, {}];
|
146
|
-
}
|
147
|
-
}
|
148
|
-
|
149
|
-
const objectIterator = new IterableTree(valueAtPath, options, path);
|
150
|
-
|
151
|
-
for (const entry of objectIterator.entries()) {
|
152
|
-
yield entry;
|
153
|
-
}
|
154
|
-
} // end for
|
155
|
-
|
156
|
-
// -- STEP 2: Output entries from "path keys"
|
157
|
-
|
158
|
-
if (!pathKeys || !pathKeys.length) {
|
159
|
-
// No path keys -> done
|
160
|
-
return;
|
161
|
-
}
|
162
|
-
|
163
|
-
for (let j = 0, n = pathKeys.length; j < n; j = j + 1) {
|
164
|
-
// @note path keys do not output intermediate nodes
|
165
|
-
|
166
|
-
const key = pathKeys[j];
|
167
|
-
|
168
|
-
const valueAtPath = obj[key];
|
169
|
-
const path = key.split(PATH_SEPARATOR);
|
170
|
-
|
171
|
-
yield [path, valueAtPath];
|
172
|
-
}
|
173
|
-
}
|
174
|
-
|
175
|
-
// -------------------------------------------------------------------- Method
|
176
|
-
|
177
|
-
/**
|
178
|
-
* Get an iterator to iterate over all object paths
|
179
|
-
*
|
180
|
-
* @returns {Iterator} object path iterator
|
181
|
-
*/
|
182
|
-
*paths() {
|
183
|
-
for (const entry of this.entries()) {
|
184
|
-
yield entry[0];
|
185
|
-
}
|
186
|
-
}
|
187
|
-
|
188
|
-
// -------------------------------------------------------------------- Method
|
189
|
-
|
190
|
-
/**
|
191
|
-
* Get an iterator to iterate over all values at the leaves of the paths in
|
192
|
-
* the object
|
193
|
-
*
|
194
|
-
* @returns {Iterator} object value iterator
|
195
|
-
*/
|
196
|
-
*values() {
|
197
|
-
for (const entry of this.entries()) {
|
198
|
-
yield entry[1];
|
199
|
-
}
|
200
|
-
}
|
201
|
-
|
202
|
-
// -------------------------------------------------------------------- Method
|
203
|
-
|
204
|
-
/**
|
205
|
-
* Returns true if the iterator should recurse into the specified value
|
206
|
-
*
|
207
|
-
* @param {string} value
|
208
|
-
*
|
209
|
-
* @return {boolean} true if the value should be iterated
|
210
|
-
*/
|
211
|
-
#shouldRecurse(value) {
|
212
|
-
if (!(value instanceof Object)) {
|
213
|
-
// not an object -> no recursion
|
214
|
-
return false;
|
215
|
-
}
|
216
|
-
|
217
|
-
const walkArrays = this.#options.walkArrays;
|
218
|
-
|
219
|
-
if (walkArrays && Array.isArray(value)) {
|
220
|
-
// walkArrays=true AND isArray
|
221
|
-
|
222
|
-
if (!value.length) {
|
223
|
-
// Array is empty -> no recursion
|
224
|
-
return false;
|
225
|
-
}
|
226
|
-
|
227
|
-
return true;
|
228
|
-
}
|
229
|
-
|
230
|
-
if ('[object Object]' !== value.toString()) {
|
231
|
-
// Not a plain object -> no recursion
|
232
|
-
return false;
|
233
|
-
}
|
234
|
-
|
235
|
-
if (Object.keys(value).length) {
|
236
|
-
// Object is not empty -> recursion
|
237
|
-
return true;
|
238
|
-
}
|
239
|
-
|
240
|
-
// Otherwise -> no recursion
|
241
|
-
return false;
|
242
|
-
}
|
243
|
-
} // 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
|
+
/**
|
10
|
+
* @typedef {object} Options
|
11
|
+
* @property {boolean} walkArrays
|
12
|
+
* @property {boolean} ignoreEmptyObjectLeaves
|
13
|
+
* @property {boolean} expandPathKeys
|
14
|
+
* @property {boolean} outputIntermediateNodes
|
15
|
+
*/
|
16
|
+
|
17
|
+
/* ------------------------------------------------------------------ Exports */
|
18
|
+
|
19
|
+
export default class IterableTree {
|
20
|
+
/**
|
21
|
+
* @type {Options}
|
22
|
+
*/
|
23
|
+
#options;
|
24
|
+
|
25
|
+
/**
|
26
|
+
* Construct an object that can be used to iterate paths and values in
|
27
|
+
* an object.
|
28
|
+
* - Returns path-value pairs for all leaves of the object (tree)
|
29
|
+
* - Iterates "own properties" only (not inherited properties)
|
30
|
+
*
|
31
|
+
* @param {object} obj - Object to iterate
|
32
|
+
* @param {Options} [options]
|
33
|
+
* @param {string[]} [_parentArrPath]
|
34
|
+
*
|
35
|
+
*
|
36
|
+
* @return {Iterator} iterable object
|
37
|
+
*/
|
38
|
+
constructor(obj, options, _parentArrPath) {
|
39
|
+
//super( ...arguments );
|
40
|
+
|
41
|
+
expect.object(obj);
|
42
|
+
|
43
|
+
this.obj = obj;
|
44
|
+
|
45
|
+
this.#options = Object.assign(
|
46
|
+
{
|
47
|
+
walkArrays: false,
|
48
|
+
ignoreEmptyObjectLeaves: false,
|
49
|
+
expandPathKeys: false,
|
50
|
+
outputIntermediateNodes: false
|
51
|
+
},
|
52
|
+
options
|
53
|
+
);
|
54
|
+
|
55
|
+
this._parentArrPath = _parentArrPath || null;
|
56
|
+
}
|
57
|
+
|
58
|
+
/* --------------------------------------------------------- Public methods */
|
59
|
+
|
60
|
+
// -------------------------------------------------------------------- Method
|
61
|
+
|
62
|
+
/**
|
63
|
+
* Get an iterator to iterate over all object [ path, value ] entries
|
64
|
+
*
|
65
|
+
* @returns {Iterator} object entries iterator
|
66
|
+
*/
|
67
|
+
*entries() {
|
68
|
+
const obj = this.obj;
|
69
|
+
const parentArrPath = this._parentArrPath;
|
70
|
+
|
71
|
+
const options = this.options;
|
72
|
+
|
73
|
+
let { expandPathKeys, ignoreEmptyObjectLeaves, outputIntermediateNodes } = this.#options;
|
74
|
+
|
75
|
+
if (parentArrPath) {
|
76
|
+
// Never expand keys if not in root object
|
77
|
+
expandPathKeys = false;
|
78
|
+
}
|
79
|
+
|
80
|
+
// @note keys are own properties only
|
81
|
+
const keys = Object.keys(obj);
|
82
|
+
|
83
|
+
let pathKeys;
|
84
|
+
|
85
|
+
if (expandPathKeys) {
|
86
|
+
pathKeys = [];
|
87
|
+
}
|
88
|
+
|
89
|
+
// -- STEP 1: Normal object iteration (and gather path keys)
|
90
|
+
|
91
|
+
for (let j = 0, n = keys.length; j < n; j = j + 1) {
|
92
|
+
const key = keys[j];
|
93
|
+
|
94
|
+
if (expandPathKeys && key.includes(PATH_SEPARATOR)) {
|
95
|
+
// Gather pathKeys
|
96
|
+
pathKeys.push(key);
|
97
|
+
continue;
|
98
|
+
}
|
99
|
+
|
100
|
+
const valueAtPath = obj[key];
|
101
|
+
|
102
|
+
if (undefined === valueAtPath) {
|
103
|
+
// Ignore path-value pair if valueAtPath is undefined
|
104
|
+
continue;
|
105
|
+
}
|
106
|
+
|
107
|
+
let path;
|
108
|
+
|
109
|
+
if (parentArrPath) {
|
110
|
+
path = parentArrPath.slice(0);
|
111
|
+
path.push(key);
|
112
|
+
} else {
|
113
|
+
path = [key];
|
114
|
+
}
|
115
|
+
|
116
|
+
// No recursion >>
|
117
|
+
|
118
|
+
if (!this.#shouldRecurse(valueAtPath)) {
|
119
|
+
if (
|
120
|
+
ignoreEmptyObjectLeaves &&
|
121
|
+
valueAtPath instanceof Object &&
|
122
|
+
0 === Object.keys(valueAtPath).length
|
123
|
+
) {
|
124
|
+
// Ignore empty object leave
|
125
|
+
continue;
|
126
|
+
}
|
127
|
+
|
128
|
+
yield [path, valueAtPath];
|
129
|
+
continue;
|
130
|
+
}
|
131
|
+
|
132
|
+
// Recursion >>
|
133
|
+
|
134
|
+
// console.log( { path, valueAtPath, outputIntermediateNodes } );
|
135
|
+
|
136
|
+
if (outputIntermediateNodes) {
|
137
|
+
// outputIntermediateNodes=true
|
138
|
+
// -> Output itermediate node
|
139
|
+
|
140
|
+
if (Array.isArray(valueAtPath)) {
|
141
|
+
// Intermediate node is an array
|
142
|
+
yield [path, []];
|
143
|
+
} else {
|
144
|
+
// Intermediate node is plain object
|
145
|
+
yield [path, {}];
|
146
|
+
}
|
147
|
+
}
|
148
|
+
|
149
|
+
const objectIterator = new IterableTree(valueAtPath, options, path);
|
150
|
+
|
151
|
+
for (const entry of objectIterator.entries()) {
|
152
|
+
yield entry;
|
153
|
+
}
|
154
|
+
} // end for
|
155
|
+
|
156
|
+
// -- STEP 2: Output entries from "path keys"
|
157
|
+
|
158
|
+
if (!pathKeys || !pathKeys.length) {
|
159
|
+
// No path keys -> done
|
160
|
+
return;
|
161
|
+
}
|
162
|
+
|
163
|
+
for (let j = 0, n = pathKeys.length; j < n; j = j + 1) {
|
164
|
+
// @note path keys do not output intermediate nodes
|
165
|
+
|
166
|
+
const key = pathKeys[j];
|
167
|
+
|
168
|
+
const valueAtPath = obj[key];
|
169
|
+
const path = key.split(PATH_SEPARATOR);
|
170
|
+
|
171
|
+
yield [path, valueAtPath];
|
172
|
+
}
|
173
|
+
}
|
174
|
+
|
175
|
+
// -------------------------------------------------------------------- Method
|
176
|
+
|
177
|
+
/**
|
178
|
+
* Get an iterator to iterate over all object paths
|
179
|
+
*
|
180
|
+
* @returns {Iterator} object path iterator
|
181
|
+
*/
|
182
|
+
*paths() {
|
183
|
+
for (const entry of this.entries()) {
|
184
|
+
yield entry[0];
|
185
|
+
}
|
186
|
+
}
|
187
|
+
|
188
|
+
// -------------------------------------------------------------------- Method
|
189
|
+
|
190
|
+
/**
|
191
|
+
* Get an iterator to iterate over all values at the leaves of the paths in
|
192
|
+
* the object
|
193
|
+
*
|
194
|
+
* @returns {Iterator} object value iterator
|
195
|
+
*/
|
196
|
+
*values() {
|
197
|
+
for (const entry of this.entries()) {
|
198
|
+
yield entry[1];
|
199
|
+
}
|
200
|
+
}
|
201
|
+
|
202
|
+
// -------------------------------------------------------------------- Method
|
203
|
+
|
204
|
+
/**
|
205
|
+
* Returns true if the iterator should recurse into the specified value
|
206
|
+
*
|
207
|
+
* @param {string} value
|
208
|
+
*
|
209
|
+
* @return {boolean} true if the value should be iterated
|
210
|
+
*/
|
211
|
+
#shouldRecurse(value) {
|
212
|
+
if (!(value instanceof Object)) {
|
213
|
+
// not an object -> no recursion
|
214
|
+
return false;
|
215
|
+
}
|
216
|
+
|
217
|
+
const walkArrays = this.#options.walkArrays;
|
218
|
+
|
219
|
+
if (walkArrays && Array.isArray(value)) {
|
220
|
+
// walkArrays=true AND isArray
|
221
|
+
|
222
|
+
if (!value.length) {
|
223
|
+
// Array is empty -> no recursion
|
224
|
+
return false;
|
225
|
+
}
|
226
|
+
|
227
|
+
return true;
|
228
|
+
}
|
229
|
+
|
230
|
+
if ('[object Object]' !== value.toString()) {
|
231
|
+
// Not a plain object -> no recursion
|
232
|
+
return false;
|
233
|
+
}
|
234
|
+
|
235
|
+
if (Object.keys(value).length) {
|
236
|
+
// Object is not empty -> recursion
|
237
|
+
return true;
|
238
|
+
}
|
239
|
+
|
240
|
+
// Otherwise -> no recursion
|
241
|
+
return false;
|
242
|
+
}
|
243
|
+
} // end class
|