@weborigami/async-tree 0.5.8 → 0.6.1
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/browser.js +1 -1
- package/index.ts +43 -35
- package/main.js +1 -2
- package/package.json +4 -7
- package/shared.js +74 -12
- package/src/Tree.js +11 -2
- package/src/drivers/AsyncMap.js +237 -0
- package/src/drivers/{BrowserFileTree.js → BrowserFileMap.js} +54 -38
- package/src/drivers/{calendarTree.js → CalendarMap.js} +80 -63
- package/src/drivers/ConstantMap.js +28 -0
- package/src/drivers/{ExplorableSiteTree.js → ExplorableSiteMap.js} +7 -7
- package/src/drivers/FileMap.js +238 -0
- package/src/drivers/{FunctionTree.js → FunctionMap.js} +19 -22
- package/src/drivers/ObjectMap.js +151 -0
- package/src/drivers/SetMap.js +13 -0
- package/src/drivers/{SiteTree.js → SiteMap.js} +17 -20
- package/src/drivers/SyncMap.js +260 -0
- package/src/jsonKeys.d.ts +2 -2
- package/src/jsonKeys.js +20 -5
- package/src/operations/addNextPrevious.js +35 -36
- package/src/operations/assign.js +27 -23
- package/src/operations/cache.js +30 -36
- package/src/operations/cachedKeyFunctions.js +1 -1
- package/src/operations/calendar.js +5 -0
- package/src/operations/child.js +35 -0
- package/src/operations/clear.js +13 -12
- package/src/operations/constant.js +5 -0
- package/src/operations/deepEntries.js +23 -0
- package/src/operations/deepMap.js +9 -9
- package/src/operations/deepMerge.js +36 -25
- package/src/operations/deepReverse.js +23 -16
- package/src/operations/deepTake.js +7 -7
- package/src/operations/deepText.js +4 -4
- package/src/operations/deepValues.js +3 -6
- package/src/operations/deepValuesIterator.js +11 -11
- package/src/operations/delete.js +8 -12
- package/src/operations/entries.js +17 -10
- package/src/operations/filter.js +9 -7
- package/src/operations/first.js +12 -10
- package/src/operations/forEach.js +10 -13
- package/src/operations/from.js +30 -39
- package/src/operations/globKeys.js +22 -17
- package/src/operations/group.js +2 -2
- package/src/operations/groupBy.js +24 -22
- package/src/operations/has.js +7 -9
- package/src/operations/indent.js +2 -2
- package/src/operations/inners.js +19 -15
- package/src/operations/invokeFunctions.js +22 -10
- package/src/operations/isAsyncMutableTree.js +5 -12
- package/src/operations/isAsyncTree.js +5 -20
- package/src/operations/isMap.js +39 -0
- package/src/operations/isMaplike.js +34 -0
- package/src/operations/isReadOnlyMap.js +14 -0
- package/src/operations/isTraversable.js +3 -3
- package/src/operations/isTreelike.js +5 -30
- package/src/operations/json.js +4 -12
- package/src/operations/keys.js +17 -8
- package/src/operations/length.js +9 -8
- package/src/operations/map.js +28 -30
- package/src/operations/mapExtension.js +20 -16
- package/src/operations/mapReduce.js +38 -24
- package/src/operations/mask.js +54 -29
- package/src/operations/match.js +13 -9
- package/src/operations/merge.js +43 -35
- package/src/operations/paginate.js +26 -18
- package/src/operations/parent.js +7 -7
- package/src/operations/paths.js +20 -22
- package/src/operations/plain.js +6 -6
- package/src/operations/reduce.js +16 -0
- package/src/operations/regExpKeys.js +21 -12
- package/src/operations/reverse.js +21 -15
- package/src/operations/root.js +6 -5
- package/src/operations/scope.js +31 -26
- package/src/operations/set.js +20 -0
- package/src/operations/shuffle.js +23 -16
- package/src/operations/size.js +13 -0
- package/src/operations/sort.js +55 -40
- package/src/operations/sync.js +14 -0
- package/src/operations/take.js +23 -11
- package/src/operations/text.js +4 -4
- package/src/operations/toFunction.js +7 -7
- package/src/operations/traverse.js +4 -4
- package/src/operations/traverseOrThrow.js +18 -9
- package/src/operations/traversePath.js +2 -2
- package/src/operations/values.js +18 -9
- package/src/operations/withKeys.js +22 -16
- package/src/symbols.js +1 -0
- package/src/utilities/castArraylike.js +24 -13
- package/src/utilities/getMapArgument.js +38 -0
- package/src/utilities/getParent.js +2 -2
- package/src/utilities/isStringlike.js +7 -5
- package/src/utilities/setParent.js +7 -7
- package/src/utilities/toFunction.js +2 -2
- package/src/utilities/toPlainValue.js +21 -19
- package/test/SampleAsyncMap.js +34 -0
- package/test/browser/assert.js +20 -0
- package/test/browser/index.html +53 -21
- package/test/drivers/AsyncMap.test.js +119 -0
- package/test/drivers/{BrowserFileTree.test.js → BrowserFileMap.test.js} +50 -33
- package/test/drivers/{calendarTree.test.js → CalendarMap.test.js} +17 -19
- package/test/drivers/ConstantMap.test.js +15 -0
- package/test/drivers/{ExplorableSiteTree.test.js → ExplorableSiteMap.test.js} +29 -14
- package/test/drivers/FileMap.test.js +156 -0
- package/test/drivers/FunctionMap.test.js +56 -0
- package/test/drivers/ObjectMap.test.js +194 -0
- package/test/drivers/SetMap.test.js +35 -0
- package/test/drivers/{SiteTree.test.js → SiteMap.test.js} +14 -10
- package/test/drivers/SyncMap.test.js +335 -0
- package/test/jsonKeys.test.js +18 -6
- package/test/operations/addNextPrevious.test.js +3 -2
- package/test/operations/assign.test.js +30 -35
- package/test/operations/cache.test.js +17 -12
- package/test/operations/cachedKeyFunctions.test.js +12 -9
- package/test/operations/child.test.js +34 -0
- package/test/operations/clear.test.js +6 -27
- package/test/operations/deepEntries.test.js +32 -0
- package/test/operations/deepMerge.test.js +23 -16
- package/test/operations/deepReverse.test.js +2 -2
- package/test/operations/deepTake.test.js +2 -2
- package/test/operations/deepText.test.js +4 -4
- package/test/operations/deepValuesIterator.test.js +2 -2
- package/test/operations/delete.test.js +2 -2
- package/test/operations/extensionKeyFunctions.test.js +6 -5
- package/test/operations/filter.test.js +3 -3
- package/test/operations/from.test.js +25 -31
- package/test/operations/globKeys.test.js +9 -9
- package/test/operations/groupBy.test.js +6 -5
- package/test/operations/inners.test.js +17 -14
- package/test/operations/invokeFunctions.test.js +2 -2
- package/test/operations/isMap.test.js +15 -0
- package/test/operations/isMaplike.test.js +15 -0
- package/test/operations/json.test.js +2 -2
- package/test/operations/keys.test.js +16 -3
- package/test/operations/map.test.js +40 -30
- package/test/operations/mapExtension.test.js +6 -6
- package/test/operations/mapReduce.test.js +14 -12
- package/test/operations/mask.test.js +16 -3
- package/test/operations/match.test.js +2 -2
- package/test/operations/merge.test.js +20 -14
- package/test/operations/paginate.test.js +5 -5
- package/test/operations/parent.test.js +3 -3
- package/test/operations/paths.test.js +20 -27
- package/test/operations/plain.test.js +8 -8
- package/test/operations/regExpKeys.test.js +22 -18
- package/test/operations/reverse.test.js +4 -3
- package/test/operations/scope.test.js +6 -5
- package/test/operations/set.test.js +11 -0
- package/test/operations/shuffle.test.js +3 -2
- package/test/operations/sort.test.js +7 -10
- package/test/operations/sync.test.js +43 -0
- package/test/operations/take.test.js +2 -2
- package/test/operations/toFunction.test.js +2 -2
- package/test/operations/traverse.test.js +17 -5
- package/test/operations/withKeys.test.js +2 -2
- package/test/utilities/castArrayLike.test.js +53 -0
- package/test/utilities/setParent.test.js +6 -6
- package/test/utilities/toFunction.test.js +2 -2
- package/test/utilities/toPlainValue.test.js +51 -12
- package/src/drivers/DeepMapTree.js +0 -23
- package/src/drivers/DeepObjectTree.js +0 -18
- package/src/drivers/DeferredTree.js +0 -81
- package/src/drivers/FileTree.js +0 -276
- package/src/drivers/MapTree.js +0 -70
- package/src/drivers/ObjectTree.js +0 -158
- package/src/drivers/SetTree.js +0 -34
- package/src/drivers/constantTree.js +0 -19
- package/src/drivers/limitConcurrency.js +0 -63
- package/src/internal.js +0 -16
- package/src/utilities/getTreeArgument.js +0 -43
- package/test/drivers/DeepMapTree.test.js +0 -17
- package/test/drivers/DeepObjectTree.test.js +0 -35
- package/test/drivers/DeferredTree.test.js +0 -22
- package/test/drivers/FileTree.test.js +0 -192
- package/test/drivers/FunctionTree.test.js +0 -46
- package/test/drivers/MapTree.test.js +0 -59
- package/test/drivers/ObjectTree.test.js +0 -163
- package/test/drivers/SetTree.test.js +0 -44
- package/test/drivers/constantTree.test.js +0 -13
- package/test/drivers/limitConcurrency.test.js +0 -41
- package/test/operations/isAsyncMutableTree.test.js +0 -17
- package/test/operations/isAsyncTree.test.js +0 -26
- package/test/operations/isTreelike.test.js +0 -13
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import assert from "node:assert";
|
|
2
2
|
import { describe, test } from "node:test";
|
|
3
|
-
import
|
|
3
|
+
import ObjectMap from "../../src/drivers/ObjectMap.js";
|
|
4
4
|
import map from "../../src/operations/map.js";
|
|
5
|
+
import plain from "../../src/operations/plain.js";
|
|
5
6
|
import * as trailingSlash from "../../src/trailingSlash.js";
|
|
6
7
|
|
|
7
8
|
describe("map", () => {
|
|
@@ -16,7 +17,7 @@ describe("map", () => {
|
|
|
16
17
|
});
|
|
17
18
|
|
|
18
19
|
test("maps values", async () => {
|
|
19
|
-
const tree = new
|
|
20
|
+
const tree = new ObjectMap({
|
|
20
21
|
a: "letter a",
|
|
21
22
|
b: "letter b",
|
|
22
23
|
c: undefined, // Won't be mapped
|
|
@@ -28,7 +29,7 @@ describe("map", () => {
|
|
|
28
29
|
return sourceValue.toUpperCase();
|
|
29
30
|
},
|
|
30
31
|
});
|
|
31
|
-
assert.deepEqual(await
|
|
32
|
+
assert.deepEqual(await plain(mapped), {
|
|
32
33
|
a: "LETTER A",
|
|
33
34
|
b: "LETTER B",
|
|
34
35
|
c: undefined,
|
|
@@ -44,7 +45,7 @@ describe("map", () => {
|
|
|
44
45
|
assert(sourceKey === "a" || sourceKey === "b");
|
|
45
46
|
return sourceValue.toUpperCase();
|
|
46
47
|
});
|
|
47
|
-
assert.deepEqual(await
|
|
48
|
+
assert.deepEqual(await plain(uppercaseValues), {
|
|
48
49
|
a: "LETTER A",
|
|
49
50
|
b: "LETTER B",
|
|
50
51
|
});
|
|
@@ -59,7 +60,7 @@ describe("map", () => {
|
|
|
59
60
|
key: addUnderscore,
|
|
60
61
|
inverseKey: removeUnderscore,
|
|
61
62
|
});
|
|
62
|
-
assert.deepEqual(await
|
|
63
|
+
assert.deepEqual(await plain(underscoreKeys), {
|
|
63
64
|
_a: "letter a",
|
|
64
65
|
_b: "letter b",
|
|
65
66
|
});
|
|
@@ -73,23 +74,23 @@ describe("map", () => {
|
|
|
73
74
|
const underscoreKeys = await map(tree, {
|
|
74
75
|
key: addUnderscore,
|
|
75
76
|
});
|
|
76
|
-
assert.deepEqual(await
|
|
77
|
+
assert.deepEqual(await plain(underscoreKeys), {
|
|
77
78
|
_a: "letter a",
|
|
78
79
|
_b: "letter b",
|
|
79
80
|
});
|
|
80
81
|
});
|
|
81
82
|
|
|
82
83
|
test("maps keys and values", async () => {
|
|
83
|
-
const
|
|
84
|
+
const maplike = new ObjectMap([
|
|
84
85
|
{ name: "Alice", age: 1 },
|
|
85
86
|
{ name: "Bob", age: 2 },
|
|
86
87
|
{ name: "Carol", age: 3 },
|
|
87
88
|
]);
|
|
88
|
-
const result = await map(
|
|
89
|
+
const result = await map(maplike, {
|
|
89
90
|
key: (value, key, tree) => value.name,
|
|
90
91
|
value: (value, key, tree) => value.age,
|
|
91
92
|
});
|
|
92
|
-
assert.deepEqual(await
|
|
93
|
+
assert.deepEqual(await plain(result), {
|
|
93
94
|
Alice: 1,
|
|
94
95
|
Bob: 2,
|
|
95
96
|
Carol: 3,
|
|
@@ -108,7 +109,7 @@ describe("map", () => {
|
|
|
108
109
|
inverseKey: async (resultKey, tree) => resultKey.slice(1),
|
|
109
110
|
value: async (sourceValue, sourceKey, tree) => sourceKey,
|
|
110
111
|
});
|
|
111
|
-
assert.deepEqual(await
|
|
112
|
+
assert.deepEqual(await plain(underscoreKeys), {
|
|
112
113
|
_a: "a",
|
|
113
114
|
_more: "more",
|
|
114
115
|
});
|
|
@@ -123,24 +124,27 @@ describe("map", () => {
|
|
|
123
124
|
b: "letter b",
|
|
124
125
|
};
|
|
125
126
|
const mapped = await map(tree, uppercase);
|
|
126
|
-
assert.deepEqual(await
|
|
127
|
+
assert.deepEqual(await plain(mapped), {
|
|
127
128
|
_a: "LETTER A",
|
|
128
129
|
_b: "LETTER B",
|
|
129
130
|
});
|
|
130
131
|
});
|
|
131
132
|
|
|
132
133
|
test("deep maps values", async () => {
|
|
133
|
-
const tree = new
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
134
|
+
const tree = new ObjectMap(
|
|
135
|
+
{
|
|
136
|
+
a: "letter a",
|
|
137
|
+
more: {
|
|
138
|
+
b: "letter b",
|
|
139
|
+
},
|
|
137
140
|
},
|
|
138
|
-
|
|
141
|
+
{ deep: true }
|
|
142
|
+
);
|
|
139
143
|
const uppercaseValues = await map(tree, {
|
|
140
144
|
deep: true,
|
|
141
145
|
value: (sourceValue, sourceKey, tree) => sourceValue.toUpperCase(),
|
|
142
146
|
});
|
|
143
|
-
assert.deepEqual(await
|
|
147
|
+
assert.deepEqual(await plain(uppercaseValues), {
|
|
144
148
|
a: "LETTER A",
|
|
145
149
|
more: {
|
|
146
150
|
b: "LETTER B",
|
|
@@ -149,18 +153,21 @@ describe("map", () => {
|
|
|
149
153
|
});
|
|
150
154
|
|
|
151
155
|
test("deep maps leaf keys", async () => {
|
|
152
|
-
const tree = new
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
+
const tree = new ObjectMap(
|
|
157
|
+
{
|
|
158
|
+
a: "letter a",
|
|
159
|
+
more: {
|
|
160
|
+
b: "letter b",
|
|
161
|
+
},
|
|
156
162
|
},
|
|
157
|
-
|
|
163
|
+
{ deep: true }
|
|
164
|
+
);
|
|
158
165
|
const underscoreKeys = await map(tree, {
|
|
159
166
|
deep: true,
|
|
160
167
|
key: addUnderscore,
|
|
161
168
|
inverseKey: removeUnderscore,
|
|
162
169
|
});
|
|
163
|
-
assert.deepEqual(await
|
|
170
|
+
assert.deepEqual(await plain(underscoreKeys), {
|
|
164
171
|
_a: "letter a",
|
|
165
172
|
more: {
|
|
166
173
|
_b: "letter b",
|
|
@@ -169,19 +176,22 @@ describe("map", () => {
|
|
|
169
176
|
});
|
|
170
177
|
|
|
171
178
|
test("deep maps leaf keys and values", async () => {
|
|
172
|
-
const tree = new
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
179
|
+
const tree = new ObjectMap(
|
|
180
|
+
{
|
|
181
|
+
a: "letter a",
|
|
182
|
+
more: {
|
|
183
|
+
b: "letter b",
|
|
184
|
+
},
|
|
176
185
|
},
|
|
177
|
-
|
|
186
|
+
{ deep: true }
|
|
187
|
+
);
|
|
178
188
|
const underscoreKeysUppercaseValues = await map(tree, {
|
|
179
189
|
deep: true,
|
|
180
190
|
key: addUnderscore,
|
|
181
191
|
inverseKey: removeUnderscore,
|
|
182
192
|
value: async (sourceValue, sourceKey, tree) => sourceValue.toUpperCase(),
|
|
183
193
|
});
|
|
184
|
-
assert.deepEqual(await
|
|
194
|
+
assert.deepEqual(await plain(underscoreKeysUppercaseValues), {
|
|
185
195
|
_a: "LETTER A",
|
|
186
196
|
more: {
|
|
187
197
|
_b: "LETTER B",
|
|
@@ -202,7 +212,7 @@ describe("map", () => {
|
|
|
202
212
|
return key.toUpperCase();
|
|
203
213
|
},
|
|
204
214
|
});
|
|
205
|
-
assert.deepEqual(await
|
|
215
|
+
assert.deepEqual(await plain(mapped), {
|
|
206
216
|
A: "letter a",
|
|
207
217
|
B: "letter b",
|
|
208
218
|
C: "letter c",
|
|
@@ -5,12 +5,12 @@ import plain from "../../src/operations/plain.js";
|
|
|
5
5
|
|
|
6
6
|
describe("mapExtension", () => {
|
|
7
7
|
test("can add an extension to a key", async () => {
|
|
8
|
-
const
|
|
8
|
+
const maplike = {
|
|
9
9
|
"file0.txt": 1,
|
|
10
10
|
file1: 2,
|
|
11
11
|
file2: 3,
|
|
12
12
|
};
|
|
13
|
-
const fixture = await mapExtension(
|
|
13
|
+
const fixture = await mapExtension(maplike, "->.data");
|
|
14
14
|
assert.deepEqual(await plain(fixture), {
|
|
15
15
|
"file0.txt.data": 1,
|
|
16
16
|
"file1.data": 2,
|
|
@@ -19,12 +19,12 @@ describe("mapExtension", () => {
|
|
|
19
19
|
});
|
|
20
20
|
|
|
21
21
|
test("can change a key's extension", async () => {
|
|
22
|
-
const
|
|
22
|
+
const maplike = {
|
|
23
23
|
"file1.lower": "will be mapped",
|
|
24
24
|
file2: "won't be mapped",
|
|
25
25
|
"file3.foo": "won't be mapped",
|
|
26
26
|
};
|
|
27
|
-
const fixture = await mapExtension(
|
|
27
|
+
const fixture = await mapExtension(maplike, {
|
|
28
28
|
extension: ".lower->.upper",
|
|
29
29
|
value: (sourceValue) => sourceValue.toUpperCase(),
|
|
30
30
|
});
|
|
@@ -34,13 +34,13 @@ describe("mapExtension", () => {
|
|
|
34
34
|
});
|
|
35
35
|
|
|
36
36
|
test("can manipulate extensions deeply", async () => {
|
|
37
|
-
const
|
|
37
|
+
const maplike = {
|
|
38
38
|
"file1.txt": 1,
|
|
39
39
|
more: {
|
|
40
40
|
"file2.txt": 2,
|
|
41
41
|
},
|
|
42
42
|
};
|
|
43
|
-
const fixture = await mapExtension(
|
|
43
|
+
const fixture = await mapExtension(maplike, ".txt->", {
|
|
44
44
|
deep: true,
|
|
45
45
|
});
|
|
46
46
|
assert.deepEqual(await plain(fixture), {
|
|
@@ -1,22 +1,24 @@
|
|
|
1
1
|
import assert from "node:assert";
|
|
2
2
|
import { describe, test } from "node:test";
|
|
3
|
-
import
|
|
3
|
+
import ObjectMap from "../../src/drivers/ObjectMap.js";
|
|
4
4
|
import mapReduce from "../../src/operations/mapReduce.js";
|
|
5
|
+
import values from "../../src/operations/values.js";
|
|
5
6
|
|
|
6
7
|
describe("mapReduce", () => {
|
|
7
8
|
test("can map values and reduce them", async () => {
|
|
8
|
-
const tree = new
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
const tree = new ObjectMap(
|
|
10
|
+
{
|
|
11
|
+
a: 1,
|
|
12
|
+
b: 2,
|
|
13
|
+
more: {
|
|
14
|
+
c: 3,
|
|
15
|
+
},
|
|
16
|
+
d: 4,
|
|
13
17
|
},
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
const reduced = await mapReduce(
|
|
17
|
-
|
|
18
|
-
(value) => value,
|
|
19
|
-
async (values) => String.prototype.concat(...values)
|
|
18
|
+
{ deep: true }
|
|
19
|
+
);
|
|
20
|
+
const reduced = await mapReduce(tree, null, async (mapped) =>
|
|
21
|
+
String.prototype.concat(...(await values(mapped)))
|
|
20
22
|
);
|
|
21
23
|
assert.deepEqual(reduced, "1234");
|
|
22
24
|
});
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import assert from "node:assert";
|
|
2
2
|
import { describe, test } from "node:test";
|
|
3
|
-
import
|
|
3
|
+
import keys from "../../src/operations/keys.js";
|
|
4
4
|
import mask from "../../src/operations/mask.js";
|
|
5
|
+
import plain from "../../src/operations/plain.js";
|
|
5
6
|
|
|
6
7
|
describe("mask", () => {
|
|
7
8
|
test("removes keys and values whose mask values are falsy", async () => {
|
|
@@ -21,12 +22,24 @@ describe("mask", () => {
|
|
|
21
22
|
},
|
|
22
23
|
}
|
|
23
24
|
);
|
|
24
|
-
assert.deepEqual(await
|
|
25
|
-
assert.deepEqual(await
|
|
25
|
+
assert.deepEqual(await keys(result), ["a", "c/"]);
|
|
26
|
+
assert.deepEqual(await plain(result), {
|
|
26
27
|
a: 1,
|
|
27
28
|
c: {
|
|
28
29
|
d: 3,
|
|
29
30
|
},
|
|
30
31
|
});
|
|
31
32
|
});
|
|
33
|
+
|
|
34
|
+
test("can pull from a functional map", async () => {
|
|
35
|
+
const result = await mask((key) => key.toUpperCase(), {
|
|
36
|
+
a: true,
|
|
37
|
+
b: false,
|
|
38
|
+
c: true,
|
|
39
|
+
});
|
|
40
|
+
assert.deepEqual(await plain(result), {
|
|
41
|
+
a: "A",
|
|
42
|
+
c: "C",
|
|
43
|
+
});
|
|
44
|
+
});
|
|
32
45
|
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import assert from "node:assert";
|
|
2
2
|
import { describe, test } from "node:test";
|
|
3
|
-
import { Tree } from "../../src/internal.js";
|
|
4
3
|
import match from "../../src/operations/match.js";
|
|
4
|
+
import plain from "../../src/operations/plain.js";
|
|
5
5
|
|
|
6
6
|
describe("match", () => {
|
|
7
7
|
test("matches keys against a simplified pattern", async () => {
|
|
@@ -13,7 +13,7 @@ describe("match", () => {
|
|
|
13
13
|
"Bob.html",
|
|
14
14
|
"Carol.html",
|
|
15
15
|
]);
|
|
16
|
-
assert.deepEqual(await
|
|
16
|
+
assert.deepEqual(await plain(tree), {
|
|
17
17
|
"Alice.html": "Hello, Alice!",
|
|
18
18
|
"Bob.html": "Hello, Bob!",
|
|
19
19
|
"Carol.html": "Hello, Carol!",
|
|
@@ -1,19 +1,22 @@
|
|
|
1
1
|
import assert from "node:assert";
|
|
2
2
|
import { describe, test } from "node:test";
|
|
3
|
-
import
|
|
3
|
+
import ObjectMap from "../../src/drivers/ObjectMap.js";
|
|
4
|
+
import keys from "../../src/operations/keys.js";
|
|
4
5
|
import merge from "../../src/operations/merge.js";
|
|
6
|
+
import plain from "../../src/operations/plain.js";
|
|
7
|
+
import traverse from "../../src/operations/traverse.js";
|
|
5
8
|
|
|
6
9
|
describe("merge", () => {
|
|
7
10
|
test("performs a shallow merge", async () => {
|
|
8
|
-
const fixture = merge(
|
|
9
|
-
new
|
|
11
|
+
const fixture = await merge(
|
|
12
|
+
new ObjectMap({
|
|
10
13
|
a: 1,
|
|
11
14
|
// Will be obscured by `b` that follows
|
|
12
15
|
b: {
|
|
13
16
|
c: 2,
|
|
14
17
|
},
|
|
15
18
|
}),
|
|
16
|
-
new
|
|
19
|
+
new ObjectMap({
|
|
17
20
|
b: {
|
|
18
21
|
d: 3,
|
|
19
22
|
},
|
|
@@ -23,7 +26,7 @@ describe("merge", () => {
|
|
|
23
26
|
})
|
|
24
27
|
);
|
|
25
28
|
|
|
26
|
-
assert.deepEqual(await
|
|
29
|
+
assert.deepEqual(await plain(fixture), {
|
|
27
30
|
a: 1,
|
|
28
31
|
b: {
|
|
29
32
|
d: 3,
|
|
@@ -34,23 +37,26 @@ describe("merge", () => {
|
|
|
34
37
|
});
|
|
35
38
|
|
|
36
39
|
// Merge is shallow, and last tree wins, so `b/c` doesn't exist
|
|
37
|
-
const c = await
|
|
40
|
+
const c = await traverse(fixture, "b", "c");
|
|
38
41
|
assert.equal(c, undefined);
|
|
39
42
|
});
|
|
40
43
|
|
|
41
44
|
test("subtree can overwrite a leaf node", async () => {
|
|
42
|
-
const fixture = merge(
|
|
43
|
-
new
|
|
45
|
+
const fixture = await merge(
|
|
46
|
+
new ObjectMap({
|
|
44
47
|
a: 1,
|
|
45
48
|
}),
|
|
46
|
-
new
|
|
47
|
-
|
|
48
|
-
|
|
49
|
+
new ObjectMap(
|
|
50
|
+
{
|
|
51
|
+
a: {
|
|
52
|
+
b: 2,
|
|
53
|
+
},
|
|
49
54
|
},
|
|
50
|
-
|
|
55
|
+
{ deep: true }
|
|
56
|
+
)
|
|
51
57
|
);
|
|
52
|
-
assert.deepEqual(
|
|
53
|
-
assert.deepEqual(await
|
|
58
|
+
assert.deepEqual(await keys(fixture), ["a/"]);
|
|
59
|
+
assert.deepEqual(await plain(fixture), {
|
|
54
60
|
a: {
|
|
55
61
|
b: 2,
|
|
56
62
|
},
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
import assert from "node:assert";
|
|
2
2
|
import { describe, test } from "node:test";
|
|
3
|
-
import { Tree } from "../../src/internal.js";
|
|
4
3
|
import paginate from "../../src/operations/paginate.js";
|
|
4
|
+
import plain from "../../src/operations/plain.js";
|
|
5
5
|
|
|
6
6
|
describe("paginate", () => {
|
|
7
7
|
test("divides tree keys into fixed-length chunks", async () => {
|
|
8
|
-
const
|
|
8
|
+
const maplike = {
|
|
9
9
|
a: 1,
|
|
10
10
|
b: 2,
|
|
11
11
|
c: 3,
|
|
12
12
|
d: 4,
|
|
13
13
|
e: 5,
|
|
14
14
|
};
|
|
15
|
-
const paginated = await paginate(
|
|
16
|
-
const
|
|
17
|
-
assert.deepEqual(
|
|
15
|
+
const paginated = await paginate(maplike, 2);
|
|
16
|
+
const result = await plain(paginated);
|
|
17
|
+
assert.deepEqual(result, {
|
|
18
18
|
1: {
|
|
19
19
|
items: { a: 1, b: 2 },
|
|
20
20
|
nextPage: 2,
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import assert from "node:assert";
|
|
2
2
|
import { describe, test } from "node:test";
|
|
3
|
-
import
|
|
3
|
+
import ObjectMap from "../../src/drivers/ObjectMap.js";
|
|
4
4
|
import parent from "../../src/operations/parent.js";
|
|
5
5
|
|
|
6
6
|
describe("parent", () => {
|
|
7
7
|
test("returns a tree's parent", async () => {
|
|
8
|
-
const tree = new
|
|
9
|
-
sub: new
|
|
8
|
+
const tree = new ObjectMap({
|
|
9
|
+
sub: new ObjectMap({}),
|
|
10
10
|
});
|
|
11
11
|
const sub = await tree.get("sub");
|
|
12
12
|
const result = await parent(sub);
|
|
@@ -1,40 +1,33 @@
|
|
|
1
1
|
import assert from "node:assert";
|
|
2
2
|
import { describe, test } from "node:test";
|
|
3
|
-
import DeepObjectTree from "../../src/drivers/DeepObjectTree.js";
|
|
4
|
-
import ObjectTree from "../../src/drivers/ObjectTree.js";
|
|
5
3
|
import paths from "../../src/operations/paths.js";
|
|
6
4
|
|
|
7
5
|
describe("paths", () => {
|
|
8
6
|
test("returns an array of paths to the values in the tree", async () => {
|
|
9
|
-
const tree = new
|
|
10
|
-
a
|
|
11
|
-
b
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
7
|
+
const tree = new /** @type {any} */ (Map)([
|
|
8
|
+
["a", 1],
|
|
9
|
+
["b", 2],
|
|
10
|
+
[
|
|
11
|
+
"c",
|
|
12
|
+
new Map([
|
|
13
|
+
["d", 3],
|
|
14
|
+
["e", 4],
|
|
15
|
+
]),
|
|
16
|
+
],
|
|
17
|
+
]);
|
|
17
18
|
assert.deepEqual(await paths(tree), ["a", "b", "c/d", "c/e"]);
|
|
18
19
|
});
|
|
19
20
|
|
|
20
|
-
test("
|
|
21
|
-
const tree = new
|
|
22
|
-
a
|
|
23
|
-
b
|
|
24
|
-
//
|
|
25
|
-
c
|
|
26
|
-
d: 3,
|
|
27
|
-
},
|
|
21
|
+
test("focuses only on trailing slashes if map supports them", async () => {
|
|
22
|
+
const tree = new /** @type {any} */ (Map)([
|
|
23
|
+
["a", 1],
|
|
24
|
+
["b", 2],
|
|
25
|
+
// No trailing slash; paths will skip this subtree
|
|
26
|
+
["c", new Map([["d", 3]])],
|
|
28
27
|
// Explicitly include a trailing slash to signal a subtree
|
|
29
|
-
"d/"
|
|
30
|
-
e: 4,
|
|
31
|
-
}),
|
|
32
|
-
});
|
|
33
|
-
assert.deepEqual(await paths(tree, { assumeSlashes: true }), [
|
|
34
|
-
"a",
|
|
35
|
-
"b",
|
|
36
|
-
"c",
|
|
37
|
-
"d/e",
|
|
28
|
+
["d/", new Map([["e", 4]])],
|
|
38
29
|
]);
|
|
30
|
+
tree.trailingSlashKeys = true;
|
|
31
|
+
assert.deepEqual(await paths(tree), ["a", "b", "c", "d/e"]);
|
|
39
32
|
});
|
|
40
33
|
});
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import assert from "node:assert";
|
|
2
2
|
import { describe, test } from "node:test";
|
|
3
|
-
import
|
|
3
|
+
import ObjectMap from "../../src/drivers/ObjectMap.js";
|
|
4
4
|
import plain from "../../src/operations/plain.js";
|
|
5
5
|
|
|
6
6
|
describe("plain", () => {
|
|
7
7
|
test("produces a plain object version of a tree", async () => {
|
|
8
|
-
const tree = new
|
|
8
|
+
const tree = new ObjectMap({
|
|
9
9
|
a: 1,
|
|
10
10
|
// Slashes should be normalized
|
|
11
11
|
"sub1/": {
|
|
@@ -28,7 +28,7 @@ describe("plain", () => {
|
|
|
28
28
|
|
|
29
29
|
test("produces an array for an array-like tree", async () => {
|
|
30
30
|
const original = ["a", "b", "c"];
|
|
31
|
-
const tree = new
|
|
31
|
+
const tree = new ObjectMap(original);
|
|
32
32
|
assert.deepEqual(await plain(tree), original);
|
|
33
33
|
});
|
|
34
34
|
|
|
@@ -39,14 +39,14 @@ describe("plain", () => {
|
|
|
39
39
|
// missing
|
|
40
40
|
3: "c",
|
|
41
41
|
};
|
|
42
|
-
const tree = new
|
|
42
|
+
const tree = new ObjectMap(original);
|
|
43
43
|
assert.deepEqual(await plain(tree), original);
|
|
44
44
|
});
|
|
45
45
|
|
|
46
|
-
test("returns empty array or object for
|
|
47
|
-
const tree = new
|
|
46
|
+
test("returns empty array or object for ObjectMap as necessary", async () => {
|
|
47
|
+
const tree = new ObjectMap({});
|
|
48
48
|
assert.deepEqual(await plain(tree), {});
|
|
49
|
-
const arrayTree = new
|
|
49
|
+
const arrayTree = new ObjectMap([]);
|
|
50
50
|
assert.deepEqual(await plain(arrayTree), []);
|
|
51
51
|
});
|
|
52
52
|
|
|
@@ -60,7 +60,7 @@ describe("plain", () => {
|
|
|
60
60
|
});
|
|
61
61
|
|
|
62
62
|
test("coerces TypedArray values to strings", async () => {
|
|
63
|
-
const tree = new
|
|
63
|
+
const tree = new ObjectMap({
|
|
64
64
|
a: new TextEncoder().encode("Hello, world."),
|
|
65
65
|
});
|
|
66
66
|
const result = await plain(tree);
|
|
@@ -1,29 +1,33 @@
|
|
|
1
1
|
import assert from "node:assert";
|
|
2
2
|
import { describe, test } from "node:test";
|
|
3
|
-
import
|
|
3
|
+
import ObjectMap from "../../src/drivers/ObjectMap.js";
|
|
4
4
|
import regExpKeys from "../../src/operations/regExpKeys.js";
|
|
5
|
+
import traverse from "../../src/operations/traverse.js";
|
|
5
6
|
|
|
6
7
|
describe("regExpKeys", () => {
|
|
7
8
|
test("matches keys using regular expressions", async () => {
|
|
8
9
|
const fixture = await regExpKeys(
|
|
9
|
-
new
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
10
|
+
new ObjectMap(
|
|
11
|
+
{
|
|
12
|
+
"^a$": true,
|
|
13
|
+
"^b.*": true,
|
|
14
|
+
c: {
|
|
15
|
+
d: true,
|
|
16
|
+
"e*": true,
|
|
17
|
+
},
|
|
18
|
+
f: true,
|
|
15
19
|
},
|
|
16
|
-
|
|
17
|
-
|
|
20
|
+
{ deep: true }
|
|
21
|
+
)
|
|
18
22
|
);
|
|
19
|
-
assert(await
|
|
20
|
-
assert(!(await
|
|
21
|
-
assert(await
|
|
22
|
-
assert(await
|
|
23
|
-
assert(await
|
|
24
|
-
assert(await
|
|
25
|
-
assert(await
|
|
26
|
-
assert(await
|
|
27
|
-
assert(!(await
|
|
23
|
+
assert(await traverse(fixture, "a"));
|
|
24
|
+
assert(!(await traverse(fixture, "alice")));
|
|
25
|
+
assert(await traverse(fixture, "bob"));
|
|
26
|
+
assert(await traverse(fixture, "brenda"));
|
|
27
|
+
assert(await traverse(fixture, "c/", "d"));
|
|
28
|
+
assert(await traverse(fixture, "c/", "eee"));
|
|
29
|
+
assert(await traverse(fixture, "f"));
|
|
30
|
+
assert(await traverse(fixture, "stef")); // contains "f"
|
|
31
|
+
assert(!(await traverse(fixture, "gail")));
|
|
28
32
|
});
|
|
29
33
|
});
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import assert from "node:assert";
|
|
2
2
|
import { describe, test } from "node:test";
|
|
3
|
-
import
|
|
3
|
+
import keys from "../../src/operations/keys.js";
|
|
4
|
+
import plain from "../../src/operations/plain.js";
|
|
4
5
|
import reverse from "../../src/operations/reverse.js";
|
|
5
6
|
|
|
6
7
|
describe("reverse", () => {
|
|
@@ -12,9 +13,9 @@ describe("reverse", () => {
|
|
|
12
13
|
};
|
|
13
14
|
const reversed = await reverse(tree);
|
|
14
15
|
// @ts-ignore
|
|
15
|
-
assert.deepEqual(
|
|
16
|
+
assert.deepEqual(await keys(reversed), ["c", "b", "a"]);
|
|
16
17
|
// @ts-ignore
|
|
17
|
-
assert.deepEqual(await
|
|
18
|
+
assert.deepEqual(await plain(reversed), {
|
|
18
19
|
c: "C",
|
|
19
20
|
b: "B",
|
|
20
21
|
a: "A",
|
|
@@ -1,25 +1,26 @@
|
|
|
1
1
|
import assert from "node:assert";
|
|
2
2
|
import { describe, test } from "node:test";
|
|
3
|
-
import
|
|
3
|
+
import ObjectMap from "../../src/drivers/ObjectMap.js";
|
|
4
|
+
import keys from "../../src/operations/keys.js";
|
|
4
5
|
import scope from "../../src/operations/scope.js";
|
|
5
6
|
|
|
6
7
|
describe("scope", () => {
|
|
7
8
|
test("gets the first defined value from the scope trees", async () => {
|
|
8
|
-
const outer = new
|
|
9
|
+
const outer = new ObjectMap({
|
|
9
10
|
a: 1,
|
|
10
11
|
b: 2,
|
|
11
12
|
});
|
|
12
|
-
const inner = new
|
|
13
|
+
const inner = new ObjectMap({
|
|
13
14
|
a: 3,
|
|
14
15
|
});
|
|
15
16
|
inner.parent = outer;
|
|
16
17
|
const innerScope = await scope(inner);
|
|
17
|
-
assert.deepEqual(
|
|
18
|
+
assert.deepEqual(await keys(innerScope), ["a", "b"]);
|
|
18
19
|
// Inner tree has precedence
|
|
19
20
|
assert.equal(await innerScope.get("a"), 3);
|
|
20
21
|
// If tree doesn't have value, finds value from parent
|
|
21
22
|
assert.equal(await innerScope.get("b"), 2);
|
|
22
23
|
assert.equal(await innerScope.get("c"), undefined);
|
|
23
|
-
assert.deepEqual(innerScope.trees, [inner, outer]);
|
|
24
|
+
assert.deepEqual(/** @type {any} */ (innerScope).trees, [inner, outer]);
|
|
24
25
|
});
|
|
25
26
|
});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import assert from "node:assert";
|
|
2
|
+
import { describe, test } from "node:test";
|
|
3
|
+
import set from "../../src/operations/set.js";
|
|
4
|
+
|
|
5
|
+
describe("set", () => {
|
|
6
|
+
test("sets a value", async () => {
|
|
7
|
+
const map = new Map();
|
|
8
|
+
await set(map, "key", "value");
|
|
9
|
+
assert.strictEqual(map.get("key"), "value");
|
|
10
|
+
});
|
|
11
|
+
});
|