@vertesia/json 0.42.2

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/LICENSE ADDED
@@ -0,0 +1,13 @@
1
+ Copyright 2024 Composable
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./types.js"), exports);
18
+ __exportStar(require("./walk.js"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6CAA0B;AAC1B,4CAAyB"}
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "commonjs"
3
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AsyncObjectWalker = exports.ObjectWalker = void 0;
4
+ class ObjectWalker {
5
+ supportIterators = false; // only array are supported by default
6
+ constructor(supportIterators = false) {
7
+ this.supportIterators = supportIterators;
8
+ }
9
+ walk(obj, visitor) {
10
+ this._walk(undefined, obj, visitor);
11
+ }
12
+ _walk(key, obj, visitor) {
13
+ const type = typeof obj;
14
+ if (!obj || type !== 'object' || obj instanceof Date) {
15
+ visitor.onValue && visitor.onValue(key, obj);
16
+ }
17
+ else if (Array.isArray(obj)) {
18
+ this._walkIterable(key, obj, visitor);
19
+ }
20
+ else if (this.supportIterators && obj[Symbol.iterator] === 'function') {
21
+ this._walkIterable(key, obj, visitor);
22
+ }
23
+ else if (obj.constructor === Object) { // a plain object
24
+ this._walkObject(key, obj, visitor);
25
+ }
26
+ else { // a random object - we treat it as a value
27
+ visitor.onValue && visitor.onValue(key, obj);
28
+ }
29
+ }
30
+ _walkIterable(key, obj, visitor) {
31
+ visitor.onStartIteration && visitor.onStartIteration(key, obj);
32
+ let i = 0;
33
+ for (const value of obj) {
34
+ this._walk(i++, value, visitor);
35
+ }
36
+ visitor.onEndIteration && visitor.onEndIteration(key, obj);
37
+ }
38
+ _walkObject(key, obj, visitor) {
39
+ visitor.onStartObject && visitor.onStartObject(key, obj);
40
+ for (const k of Object.keys(obj)) {
41
+ this._walk(k, obj[k], visitor);
42
+ }
43
+ visitor.onEndObject && visitor.onEndObject(key, obj);
44
+ }
45
+ map(obj, mapFn) {
46
+ const visitor = new MapVisitor(mapFn);
47
+ this.walk(obj, visitor);
48
+ return visitor.result;
49
+ }
50
+ }
51
+ exports.ObjectWalker = ObjectWalker;
52
+ class AsyncObjectWalker {
53
+ supportIterators = false; // only array are supported by default
54
+ constructor(supportIterators = false) {
55
+ this.supportIterators = supportIterators;
56
+ }
57
+ async walk(obj, visitor) {
58
+ await this._walk(undefined, obj, visitor);
59
+ }
60
+ async _walk(key, obj, visitor) {
61
+ const type = typeof obj;
62
+ if (!obj || type !== 'object' || obj instanceof Date) {
63
+ visitor.onValue && (await visitor.onValue(key, obj));
64
+ }
65
+ else if (Array.isArray(obj)) {
66
+ await this._walkIterable(key, obj, visitor);
67
+ }
68
+ else if (this.supportIterators && obj[Symbol.iterator] === 'function') {
69
+ await this._walkIterable(key, obj, visitor);
70
+ }
71
+ else if (obj.constructor === Object) { // a plain object
72
+ await this._walkObject(key, obj, visitor);
73
+ }
74
+ else { // a random object - we treat it as a value
75
+ visitor.onValue && (await visitor.onValue(key, obj));
76
+ }
77
+ }
78
+ async _walkIterable(key, obj, visitor) {
79
+ visitor.onStartIteration && (await visitor.onStartIteration(key, obj));
80
+ let i = 0;
81
+ for (const value of obj) {
82
+ await this._walk(i++, value, visitor);
83
+ }
84
+ visitor.onEndIteration && (await visitor.onEndIteration(key, obj));
85
+ }
86
+ async _walkObject(key, obj, visitor) {
87
+ visitor.onStartObject && (await visitor.onStartObject(key, obj));
88
+ for (const k of Object.keys(obj)) {
89
+ await this._walk(k, obj[k], visitor);
90
+ }
91
+ visitor.onEndObject && (await visitor.onEndObject(key, obj));
92
+ }
93
+ async map(obj, mapFn) {
94
+ const visitor = new AsyncMapVisitor(mapFn);
95
+ await this.walk(obj, visitor);
96
+ return visitor.result;
97
+ }
98
+ }
99
+ exports.AsyncObjectWalker = AsyncObjectWalker;
100
+ class MapVisitor {
101
+ mapFn;
102
+ result;
103
+ current;
104
+ stack = [];
105
+ constructor(mapFn) {
106
+ this.mapFn = mapFn;
107
+ }
108
+ onStartObject(key) {
109
+ if (key === undefined) {
110
+ this.result = {};
111
+ this.current = this.result;
112
+ }
113
+ else {
114
+ this.stack.push(this.current);
115
+ const obj = {};
116
+ this.current[key] = obj;
117
+ this.current = obj;
118
+ }
119
+ }
120
+ onEndObject() {
121
+ this.current = this.stack.pop();
122
+ }
123
+ onStartIteration(key) {
124
+ if (key === undefined) {
125
+ this.result = [];
126
+ this.current = this.result;
127
+ }
128
+ else {
129
+ this.stack.push(this.current);
130
+ const ar = [];
131
+ this.current[key] = ar;
132
+ this.current = ar;
133
+ }
134
+ }
135
+ onEndIteration() {
136
+ this.current = this.stack.pop();
137
+ }
138
+ onValue(key, value) {
139
+ const r = this.mapFn(key, value);
140
+ if (key === undefined) {
141
+ this.result = r;
142
+ }
143
+ else if (r !== undefined) {
144
+ this.current[key] = r;
145
+ }
146
+ }
147
+ }
148
+ class AsyncMapVisitor {
149
+ mapFn;
150
+ result;
151
+ current;
152
+ stack = [];
153
+ constructor(mapFn) {
154
+ this.mapFn = mapFn;
155
+ }
156
+ async onStartObject(key) {
157
+ if (key === undefined) {
158
+ this.result = {};
159
+ this.current = this.result;
160
+ }
161
+ else {
162
+ this.stack.push(this.current);
163
+ const obj = {};
164
+ this.current[key] = obj;
165
+ this.current = obj;
166
+ }
167
+ }
168
+ async onEndObject() {
169
+ this.current = this.stack.pop();
170
+ }
171
+ async onStartIteration(key) {
172
+ if (key === undefined) {
173
+ this.result = [];
174
+ this.current = this.result;
175
+ }
176
+ else {
177
+ this.stack.push(this.current);
178
+ const ar = [];
179
+ this.current[key] = ar;
180
+ this.current = ar;
181
+ }
182
+ }
183
+ async onEndIteration() {
184
+ this.current = this.stack.pop();
185
+ }
186
+ async onValue(key, value) {
187
+ const r = await this.mapFn(key, value);
188
+ if (key === undefined) {
189
+ this.result = r;
190
+ }
191
+ else if (r !== undefined) {
192
+ this.current[key] = r;
193
+ }
194
+ }
195
+ }
196
+ //# sourceMappingURL=walk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walk.js","sourceRoot":"","sources":["../../src/walk.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from "./types.js";
2
+ export * from "./walk.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,191 @@
1
+ export class ObjectWalker {
2
+ supportIterators = false; // only array are supported by default
3
+ constructor(supportIterators = false) {
4
+ this.supportIterators = supportIterators;
5
+ }
6
+ walk(obj, visitor) {
7
+ this._walk(undefined, obj, visitor);
8
+ }
9
+ _walk(key, obj, visitor) {
10
+ const type = typeof obj;
11
+ if (!obj || type !== 'object' || obj instanceof Date) {
12
+ visitor.onValue && visitor.onValue(key, obj);
13
+ }
14
+ else if (Array.isArray(obj)) {
15
+ this._walkIterable(key, obj, visitor);
16
+ }
17
+ else if (this.supportIterators && obj[Symbol.iterator] === 'function') {
18
+ this._walkIterable(key, obj, visitor);
19
+ }
20
+ else if (obj.constructor === Object) { // a plain object
21
+ this._walkObject(key, obj, visitor);
22
+ }
23
+ else { // a random object - we treat it as a value
24
+ visitor.onValue && visitor.onValue(key, obj);
25
+ }
26
+ }
27
+ _walkIterable(key, obj, visitor) {
28
+ visitor.onStartIteration && visitor.onStartIteration(key, obj);
29
+ let i = 0;
30
+ for (const value of obj) {
31
+ this._walk(i++, value, visitor);
32
+ }
33
+ visitor.onEndIteration && visitor.onEndIteration(key, obj);
34
+ }
35
+ _walkObject(key, obj, visitor) {
36
+ visitor.onStartObject && visitor.onStartObject(key, obj);
37
+ for (const k of Object.keys(obj)) {
38
+ this._walk(k, obj[k], visitor);
39
+ }
40
+ visitor.onEndObject && visitor.onEndObject(key, obj);
41
+ }
42
+ map(obj, mapFn) {
43
+ const visitor = new MapVisitor(mapFn);
44
+ this.walk(obj, visitor);
45
+ return visitor.result;
46
+ }
47
+ }
48
+ export class AsyncObjectWalker {
49
+ supportIterators = false; // only array are supported by default
50
+ constructor(supportIterators = false) {
51
+ this.supportIterators = supportIterators;
52
+ }
53
+ async walk(obj, visitor) {
54
+ await this._walk(undefined, obj, visitor);
55
+ }
56
+ async _walk(key, obj, visitor) {
57
+ const type = typeof obj;
58
+ if (!obj || type !== 'object' || obj instanceof Date) {
59
+ visitor.onValue && (await visitor.onValue(key, obj));
60
+ }
61
+ else if (Array.isArray(obj)) {
62
+ await this._walkIterable(key, obj, visitor);
63
+ }
64
+ else if (this.supportIterators && obj[Symbol.iterator] === 'function') {
65
+ await this._walkIterable(key, obj, visitor);
66
+ }
67
+ else if (obj.constructor === Object) { // a plain object
68
+ await this._walkObject(key, obj, visitor);
69
+ }
70
+ else { // a random object - we treat it as a value
71
+ visitor.onValue && (await visitor.onValue(key, obj));
72
+ }
73
+ }
74
+ async _walkIterable(key, obj, visitor) {
75
+ visitor.onStartIteration && (await visitor.onStartIteration(key, obj));
76
+ let i = 0;
77
+ for (const value of obj) {
78
+ await this._walk(i++, value, visitor);
79
+ }
80
+ visitor.onEndIteration && (await visitor.onEndIteration(key, obj));
81
+ }
82
+ async _walkObject(key, obj, visitor) {
83
+ visitor.onStartObject && (await visitor.onStartObject(key, obj));
84
+ for (const k of Object.keys(obj)) {
85
+ await this._walk(k, obj[k], visitor);
86
+ }
87
+ visitor.onEndObject && (await visitor.onEndObject(key, obj));
88
+ }
89
+ async map(obj, mapFn) {
90
+ const visitor = new AsyncMapVisitor(mapFn);
91
+ await this.walk(obj, visitor);
92
+ return visitor.result;
93
+ }
94
+ }
95
+ class MapVisitor {
96
+ mapFn;
97
+ result;
98
+ current;
99
+ stack = [];
100
+ constructor(mapFn) {
101
+ this.mapFn = mapFn;
102
+ }
103
+ onStartObject(key) {
104
+ if (key === undefined) {
105
+ this.result = {};
106
+ this.current = this.result;
107
+ }
108
+ else {
109
+ this.stack.push(this.current);
110
+ const obj = {};
111
+ this.current[key] = obj;
112
+ this.current = obj;
113
+ }
114
+ }
115
+ onEndObject() {
116
+ this.current = this.stack.pop();
117
+ }
118
+ onStartIteration(key) {
119
+ if (key === undefined) {
120
+ this.result = [];
121
+ this.current = this.result;
122
+ }
123
+ else {
124
+ this.stack.push(this.current);
125
+ const ar = [];
126
+ this.current[key] = ar;
127
+ this.current = ar;
128
+ }
129
+ }
130
+ onEndIteration() {
131
+ this.current = this.stack.pop();
132
+ }
133
+ onValue(key, value) {
134
+ const r = this.mapFn(key, value);
135
+ if (key === undefined) {
136
+ this.result = r;
137
+ }
138
+ else if (r !== undefined) {
139
+ this.current[key] = r;
140
+ }
141
+ }
142
+ }
143
+ class AsyncMapVisitor {
144
+ mapFn;
145
+ result;
146
+ current;
147
+ stack = [];
148
+ constructor(mapFn) {
149
+ this.mapFn = mapFn;
150
+ }
151
+ async onStartObject(key) {
152
+ if (key === undefined) {
153
+ this.result = {};
154
+ this.current = this.result;
155
+ }
156
+ else {
157
+ this.stack.push(this.current);
158
+ const obj = {};
159
+ this.current[key] = obj;
160
+ this.current = obj;
161
+ }
162
+ }
163
+ async onEndObject() {
164
+ this.current = this.stack.pop();
165
+ }
166
+ async onStartIteration(key) {
167
+ if (key === undefined) {
168
+ this.result = [];
169
+ this.current = this.result;
170
+ }
171
+ else {
172
+ this.stack.push(this.current);
173
+ const ar = [];
174
+ this.current[key] = ar;
175
+ this.current = ar;
176
+ }
177
+ }
178
+ async onEndIteration() {
179
+ this.current = this.stack.pop();
180
+ }
181
+ async onValue(key, value) {
182
+ const r = await this.mapFn(key, value);
183
+ if (key === undefined) {
184
+ this.result = r;
185
+ }
186
+ else if (r !== undefined) {
187
+ this.current[key] = r;
188
+ }
189
+ }
190
+ }
191
+ //# sourceMappingURL=walk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walk.js","sourceRoot":"","sources":["../../src/walk.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from "./types.js";
2
+ export * from "./walk.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA"}
@@ -0,0 +1,8 @@
1
+ export type JSONPrimitive = string | number | boolean | null;
2
+ export type JSONArray = JSONValue[];
3
+ export type JSONObject = {
4
+ [key: string]: JSONValue;
5
+ };
6
+ export type JSONComposite = JSONArray | JSONObject;
7
+ export type JSONValue = JSONPrimitive | JSONComposite;
8
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAC7D,MAAM,MAAM,SAAS,GAAG,SAAS,EAAE,CAAC;AACpC,MAAM,MAAM,UAAU,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AACtD,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,UAAU,CAAC;AACnD,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,aAAa,CAAC"}
@@ -0,0 +1,34 @@
1
+ export type ObjectKey = string | number | undefined;
2
+ export interface ObjectVisitor {
3
+ onStartObject?: (key: ObjectKey, value: any) => void;
4
+ onEndObject?: (key: ObjectKey, value: any) => void;
5
+ onStartIteration?: (key: ObjectKey, value: Iterable<any>) => void;
6
+ onEndIteration?: (key: ObjectKey, value: Iterable<any>) => void;
7
+ onValue?: (key: ObjectKey, value: any) => void;
8
+ }
9
+ export interface AsyncObjectVisitor {
10
+ onStartObject?: (key: ObjectKey, value: any) => Promise<void>;
11
+ onEndObject?: (key: ObjectKey, value: any) => Promise<void>;
12
+ onStartIteration?: (key: ObjectKey, value: Iterable<any>) => Promise<void>;
13
+ onEndIteration?: (key: ObjectKey, value: Iterable<any>) => Promise<void>;
14
+ onValue?: (key: ObjectKey, value: any) => Promise<void>;
15
+ }
16
+ export declare class ObjectWalker {
17
+ supportIterators: boolean;
18
+ constructor(supportIterators?: boolean);
19
+ walk(obj: any, visitor: ObjectVisitor): void;
20
+ _walk(key: ObjectKey, obj: any, visitor: ObjectVisitor): void;
21
+ _walkIterable(key: ObjectKey, obj: any, visitor: ObjectVisitor): void;
22
+ _walkObject(key: ObjectKey, obj: any, visitor: ObjectVisitor): void;
23
+ map(obj: any, mapFn: (key: ObjectKey, value: any) => any): any;
24
+ }
25
+ export declare class AsyncObjectWalker {
26
+ supportIterators: boolean;
27
+ constructor(supportIterators?: boolean);
28
+ walk(obj: any, visitor: AsyncObjectVisitor): Promise<void>;
29
+ _walk(key: ObjectKey, obj: any, visitor: AsyncObjectVisitor): Promise<void>;
30
+ _walkIterable(key: ObjectKey, obj: any, visitor: AsyncObjectVisitor): Promise<void>;
31
+ _walkObject(key: ObjectKey, obj: any, visitor: AsyncObjectVisitor): Promise<void>;
32
+ map(obj: any, mapFn: (key: ObjectKey, value: any) => Promise<any>): Promise<any>;
33
+ }
34
+ //# sourceMappingURL=walk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walk.d.ts","sourceRoot":"","sources":["../../src/walk.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AACpD,MAAM,WAAW,aAAa;IAC1B,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IACrD,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IACnD,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;IAClE,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;IAChE,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;CAClD;AAED,MAAM,WAAW,kBAAkB;IAC/B,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzE,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3D;AAED,qBAAa,YAAY;IACrB,gBAAgB,UAAS;gBACb,gBAAgB,UAAQ;IAGpC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,aAAa;IAGrC,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,aAAa;IAetD,aAAa,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,aAAa;IAS9D,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,aAAa;IAQ5D,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,KAAK,GAAG;CAK3D;AAGD,qBAAa,iBAAiB;IAC1B,gBAAgB,UAAS;gBACb,gBAAgB,UAAQ;IAG9B,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,kBAAkB;IAG1C,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,kBAAkB;IAe3D,aAAa,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,kBAAkB;IASnE,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,kBAAkB;IAQjE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC;CAK1E"}
package/package.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "@vertesia/json",
3
+ "version": "0.42.2",
4
+ "description": "JSON utlities",
5
+ "type": "module",
6
+ "types": "./lib/types/index.d.ts",
7
+ "files": [
8
+ "lib",
9
+ "src"
10
+ ],
11
+ "license": "Apache-2.0",
12
+ "exports": {
13
+ "types": "./lib/types/index.d.ts",
14
+ "import": "./lib/esm/index.js",
15
+ "require": "./lib/cjs/index.js"
16
+ },
17
+ "devDependencies": {
18
+ "ts-dual-module": "^0.6.3",
19
+ "typescript": "^5.0.2",
20
+ "vitest": "^2.1.6"
21
+ },
22
+ "ts_dual_module": {
23
+ "outDir": "lib"
24
+ },
25
+ "scripts": {
26
+ "test": "vitest run",
27
+ "build": "pnpm exec tsmod build",
28
+ "clean": "rimraf ./node_modules ./lib ./tsconfig.tsbuildinfo"
29
+ }
30
+ }
package/src/index.ts ADDED
@@ -0,0 +1,2 @@
1
+ export * from "./types.js"
2
+ export * from "./walk.js"
package/src/types.ts ADDED
@@ -0,0 +1,5 @@
1
+ export type JSONPrimitive = string | number | boolean | null;
2
+ export type JSONArray = JSONValue[];
3
+ export type JSONObject = { [key: string]: JSONValue };
4
+ export type JSONComposite = JSONArray | JSONObject;
5
+ export type JSONValue = JSONPrimitive | JSONComposite;
@@ -0,0 +1,105 @@
1
+ import { describe, expect, test } from "vitest";
2
+ import { ObjectWalker, AsyncObjectWalker } from "./walk.ts";
3
+
4
+ describe('walk object', () => {
5
+
6
+ test('find string values', () => {
7
+ const obj = {
8
+ name: "foo",
9
+ age: 42,
10
+ children: [{
11
+ name: "bar",
12
+ age: 12,
13
+ },
14
+ {
15
+ name: "baz",
16
+ age: 15,
17
+ }],
18
+ folder: {
19
+ subfolder: {
20
+ name: "file",
21
+ }
22
+ }
23
+ }
24
+ const values = ["foo", "bar", "baz", "file"].sort().join(',');
25
+ const found: string[] = [];
26
+ new ObjectWalker().walk(obj, {
27
+ onValue(key, value) {
28
+ if (typeof value === "string") {
29
+ found.push(value);
30
+ }
31
+ }
32
+ })
33
+ expect(found.sort().join(',')).toBe(values);
34
+ })
35
+
36
+ test('map numbers to string values', () => {
37
+ const obj = {
38
+ name: "foo",
39
+ age: 42,
40
+ children: [{
41
+ name: "bar",
42
+ age: 12,
43
+ },
44
+ {
45
+ name: "baz",
46
+ age: 15,
47
+ }],
48
+ folder: {
49
+ subfolder: {
50
+ name: 123,
51
+ }
52
+ }
53
+ }
54
+ const r = new ObjectWalker().map(obj, (_key, value) => {
55
+ if (typeof value === "number") {
56
+ return String(value)
57
+ }
58
+ return value;
59
+ });
60
+ expect(r.age).toBe("42");
61
+ expect(r.children[0].age).toBe("12");
62
+ expect(r.children[1].age).toBe("15");
63
+ expect(r.folder.subfolder.name).toBe("123");
64
+ })
65
+
66
+ test('map numbers in an array to string values', () => {
67
+ const obj = [123, { x: 1 }, { y: 2 }, { z: 3 }]
68
+ const r = new ObjectWalker().map(obj, (_key, value) => {
69
+ if (typeof value === "number") {
70
+ return String(value)
71
+ }
72
+ return value;
73
+ });
74
+ expect(r.length).toBe(4);
75
+ expect(r[0]).toBe("123");
76
+ expect(r[1].x).toBe("1");
77
+ expect(r[2].y).toBe("2");
78
+ expect(r[3].z).toBe("3");
79
+ })
80
+
81
+ test('async map', async () => {
82
+ const obj = { ar: [123, { x: 1 }, { y: { a: 1, b: [2] } }] };
83
+ const r: any = await new AsyncObjectWalker().map(obj, async (_key, value) => {
84
+ if (typeof value === "number") {
85
+ return new Promise((resolve) => {
86
+ return setTimeout(() => {
87
+ resolve(String(value));
88
+ }, 50);
89
+ });
90
+ }
91
+ return value;
92
+ });
93
+ expect(Array.isArray(r.ar)).toBe(true);
94
+ expect(r.ar.length).toBe(obj.ar.length);
95
+ expect(r.ar[0]).toBe("123");
96
+ expect(r.ar[1].x).toBe("1");
97
+ const y: any = r.ar[2].y;
98
+ expect(y.a).toBe("1");
99
+ console.log(y.b);
100
+ expect(Array.isArray(y.b)).toBe(true);
101
+ expect(y.b.length).toBe(1);
102
+ expect(y.b[0]).toBe("2");
103
+ })
104
+
105
+ })
package/src/walk.ts ADDED
@@ -0,0 +1,206 @@
1
+
2
+ export type ObjectKey = string | number | undefined;
3
+ export interface ObjectVisitor {
4
+ onStartObject?: (key: ObjectKey, value: any) => void;
5
+ onEndObject?: (key: ObjectKey, value: any) => void;
6
+ onStartIteration?: (key: ObjectKey, value: Iterable<any>) => void;
7
+ onEndIteration?: (key: ObjectKey, value: Iterable<any>) => void;
8
+ onValue?: (key: ObjectKey, value: any) => void;
9
+ }
10
+
11
+ export interface AsyncObjectVisitor {
12
+ onStartObject?: (key: ObjectKey, value: any) => Promise<void>;
13
+ onEndObject?: (key: ObjectKey, value: any) => Promise<void>;
14
+ onStartIteration?: (key: ObjectKey, value: Iterable<any>) => Promise<void>;
15
+ onEndIteration?: (key: ObjectKey, value: Iterable<any>) => Promise<void>;
16
+ onValue?: (key: ObjectKey, value: any) => Promise<void>;
17
+ }
18
+
19
+ export class ObjectWalker {
20
+ supportIterators = false; // only array are supported by default
21
+ constructor(supportIterators = false) {
22
+ this.supportIterators = supportIterators;
23
+ }
24
+ walk(obj: any, visitor: ObjectVisitor) {
25
+ this._walk(undefined, obj, visitor);
26
+ }
27
+ _walk(key: ObjectKey, obj: any, visitor: ObjectVisitor) {
28
+ const type = typeof obj;
29
+ if (!obj || type !== 'object' || obj instanceof Date) {
30
+ visitor.onValue && visitor.onValue(key, obj);
31
+ } else if (Array.isArray(obj)) {
32
+ this._walkIterable(key, obj, visitor);
33
+ } else if (this.supportIterators && obj[Symbol.iterator] === 'function') {
34
+ this._walkIterable(key, obj, visitor);
35
+ } else if (obj.constructor === Object) { // a plain object
36
+ this._walkObject(key, obj, visitor);
37
+ } else { // a random object - we treat it as a value
38
+ visitor.onValue && visitor.onValue(key, obj);
39
+ }
40
+ }
41
+
42
+ _walkIterable(key: ObjectKey, obj: any, visitor: ObjectVisitor) {
43
+ visitor.onStartIteration && visitor.onStartIteration(key, obj);
44
+ let i = 0;
45
+ for (const value of obj) {
46
+ this._walk(i++, value, visitor);
47
+ }
48
+ visitor.onEndIteration && visitor.onEndIteration(key, obj);
49
+ }
50
+
51
+ _walkObject(key: ObjectKey, obj: any, visitor: ObjectVisitor) {
52
+ visitor.onStartObject && visitor.onStartObject(key, obj);
53
+ for (const k of Object.keys(obj)) {
54
+ this._walk(k, obj[k], visitor);
55
+ }
56
+ visitor.onEndObject && visitor.onEndObject(key, obj);
57
+ }
58
+
59
+ map(obj: any, mapFn: (key: ObjectKey, value: any) => any) {
60
+ const visitor = new MapVisitor(mapFn);
61
+ this.walk(obj, visitor);
62
+ return visitor.result;
63
+ }
64
+ }
65
+
66
+
67
+ export class AsyncObjectWalker {
68
+ supportIterators = false; // only array are supported by default
69
+ constructor(supportIterators = false) {
70
+ this.supportIterators = supportIterators;
71
+ }
72
+ async walk(obj: any, visitor: AsyncObjectVisitor) {
73
+ await this._walk(undefined, obj, visitor);
74
+ }
75
+ async _walk(key: ObjectKey, obj: any, visitor: AsyncObjectVisitor) {
76
+ const type = typeof obj;
77
+ if (!obj || type !== 'object' || obj instanceof Date) {
78
+ visitor.onValue && (await visitor.onValue(key, obj));
79
+ } else if (Array.isArray(obj)) {
80
+ await this._walkIterable(key, obj, visitor);
81
+ } else if (this.supportIterators && obj[Symbol.iterator] === 'function') {
82
+ await this._walkIterable(key, obj, visitor);
83
+ } else if (obj.constructor === Object) { // a plain object
84
+ await this._walkObject(key, obj, visitor);
85
+ } else { // a random object - we treat it as a value
86
+ visitor.onValue && (await visitor.onValue(key, obj));
87
+ }
88
+ }
89
+
90
+ async _walkIterable(key: ObjectKey, obj: any, visitor: AsyncObjectVisitor) {
91
+ visitor.onStartIteration && (await visitor.onStartIteration(key, obj));
92
+ let i = 0;
93
+ for (const value of obj) {
94
+ await this._walk(i++, value, visitor);
95
+ }
96
+ visitor.onEndIteration && (await visitor.onEndIteration(key, obj));
97
+ }
98
+
99
+ async _walkObject(key: ObjectKey, obj: any, visitor: AsyncObjectVisitor) {
100
+ visitor.onStartObject && (await visitor.onStartObject(key, obj));
101
+ for (const k of Object.keys(obj)) {
102
+ await this._walk(k, obj[k], visitor);
103
+ }
104
+ visitor.onEndObject && (await visitor.onEndObject(key, obj));
105
+ }
106
+
107
+ async map(obj: any, mapFn: (key: ObjectKey, value: any) => Promise<any>) {
108
+ const visitor = new AsyncMapVisitor(mapFn);
109
+ await this.walk(obj, visitor);
110
+ return visitor.result;
111
+ }
112
+ }
113
+
114
+ class MapVisitor implements ObjectVisitor {
115
+ result: any;
116
+ current: any;
117
+ stack: any[] = [];
118
+ constructor(private mapFn: (key: ObjectKey, value: any) => any) { }
119
+
120
+ onStartObject(key: ObjectKey) {
121
+ if (key === undefined) {
122
+ this.result = {};
123
+ this.current = this.result;
124
+ } else {
125
+ this.stack.push(this.current);
126
+ const obj = {};
127
+ this.current[key] = obj;
128
+ this.current = obj;
129
+ }
130
+ }
131
+ onEndObject() {
132
+ this.current = this.stack.pop();
133
+ }
134
+
135
+ onStartIteration(key: ObjectKey) {
136
+ if (key === undefined) {
137
+ this.result = [];
138
+ this.current = this.result;
139
+ } else {
140
+ this.stack.push(this.current);
141
+ const ar: any[] = [];
142
+ this.current[key] = ar;
143
+ this.current = ar;
144
+ }
145
+ }
146
+
147
+ onEndIteration() {
148
+ this.current = this.stack.pop();
149
+ }
150
+
151
+ onValue(key: ObjectKey, value: any) {
152
+ const r = this.mapFn(key, value);
153
+ if (key === undefined) {
154
+ this.result = r;
155
+ } else if (r !== undefined) {
156
+ this.current[key] = r;
157
+ }
158
+ }
159
+ }
160
+
161
+ class AsyncMapVisitor implements AsyncObjectVisitor {
162
+ result: any;
163
+ current: any;
164
+ stack: any[] = [];
165
+ constructor(private mapFn: (key: ObjectKey, value: any) => Promise<any>) { }
166
+
167
+ async onStartObject(key: ObjectKey) {
168
+ if (key === undefined) {
169
+ this.result = {};
170
+ this.current = this.result;
171
+ } else {
172
+ this.stack.push(this.current);
173
+ const obj = {};
174
+ this.current[key] = obj;
175
+ this.current = obj;
176
+ }
177
+ }
178
+ async onEndObject() {
179
+ this.current = this.stack.pop();
180
+ }
181
+
182
+ async onStartIteration(key: ObjectKey) {
183
+ if (key === undefined) {
184
+ this.result = [];
185
+ this.current = this.result;
186
+ } else {
187
+ this.stack.push(this.current);
188
+ const ar: any[] = [];
189
+ this.current[key] = ar;
190
+ this.current = ar;
191
+ }
192
+ }
193
+
194
+ async onEndIteration() {
195
+ this.current = this.stack.pop();
196
+ }
197
+
198
+ async onValue(key: ObjectKey, value: any) {
199
+ const r = await this.mapFn(key, value);
200
+ if (key === undefined) {
201
+ this.result = r;
202
+ } else if (r !== undefined) {
203
+ this.current[key] = r;
204
+ }
205
+ }
206
+ }