@weborigami/async-tree 0.5.7 → 0.6.0
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 +31 -35
- package/main.js +1 -2
- package/package.json +4 -7
- package/shared.js +77 -12
- package/src/Tree.js +8 -2
- package/src/drivers/AsyncMap.js +210 -0
- package/src/drivers/{BrowserFileTree.js → BrowserFileMap.js} +36 -27
- package/src/drivers/{calendarTree.js → CalendarMap.js} +81 -62
- package/src/drivers/ConstantMap.js +30 -0
- package/src/drivers/DeepObjectMap.js +27 -0
- package/src/drivers/{ExplorableSiteTree.js → ExplorableSiteMap.js} +7 -7
- package/src/drivers/FileMap.js +245 -0
- package/src/drivers/{FunctionTree.js → FunctionMap.js} +19 -22
- package/src/drivers/ObjectMap.js +139 -0
- package/src/drivers/SetMap.js +13 -0
- package/src/drivers/{SiteTree.js → SiteMap.js} +16 -17
- package/src/drivers/SyncMap.js +245 -0
- package/src/jsonKeys.d.ts +2 -2
- package/src/jsonKeys.js +6 -5
- package/src/operations/addNextPrevious.js +35 -36
- package/src/operations/assign.js +30 -21
- package/src/operations/cache.js +29 -35
- package/src/operations/cachedKeyFunctions.js +1 -1
- package/src/operations/calendar.js +5 -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 +31 -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 +27 -30
- package/src/operations/mapExtension.js +20 -16
- package/src/operations/mapReduce.js +22 -17
- package/src/operations/mask.js +31 -22
- 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 +8 -8
- package/src/operations/plain.js +6 -6
- 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/shuffle.js +23 -16
- package/src/operations/size.js +13 -0
- package/src/operations/sort.js +55 -40
- package/src/operations/sync.js +21 -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 +13 -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 +10 -2
- 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 +22 -18
- package/test/SampleAsyncMap.js +34 -0
- package/test/browser/assert.js +20 -0
- package/test/browser/index.html +54 -21
- package/test/drivers/AsyncMap.test.js +119 -0
- package/test/drivers/{BrowserFileTree.test.js → BrowserFileMap.test.js} +42 -23
- package/test/drivers/{calendarTree.test.js → CalendarMap.test.js} +17 -19
- package/test/drivers/ConstantMap.test.js +15 -0
- package/test/drivers/DeepObjectMap.test.js +36 -0
- package/test/drivers/{ExplorableSiteTree.test.js → ExplorableSiteMap.test.js} +29 -14
- package/test/drivers/FileMap.test.js +185 -0
- package/test/drivers/FunctionMap.test.js +56 -0
- package/test/drivers/ObjectMap.test.js +166 -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 +321 -0
- package/test/jsonKeys.test.js +2 -2
- package/test/operations/addNextPrevious.test.js +3 -2
- package/test/operations/assign.test.js +30 -35
- package/test/operations/cache.test.js +8 -6
- package/test/operations/cachedKeyFunctions.test.js +6 -5
- package/test/operations/clear.test.js +6 -27
- package/test/operations/deepEntries.test.js +32 -0
- package/test/operations/deepMerge.test.js +6 -5
- 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 +23 -31
- package/test/operations/globKeys.test.js +9 -9
- package/test/operations/groupBy.test.js +6 -5
- package/test/operations/inners.test.js +4 -4
- 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 +20 -18
- package/test/operations/mapExtension.test.js +6 -6
- package/test/operations/mapReduce.test.js +2 -2
- package/test/operations/mask.test.js +4 -3
- package/test/operations/match.test.js +2 -2
- package/test/operations/merge.test.js +15 -11
- package/test/operations/paginate.test.js +5 -5
- package/test/operations/parent.test.js +3 -3
- package/test/operations/paths.test.js +6 -6
- package/test/operations/plain.test.js +8 -8
- package/test/operations/regExpKeys.test.js +12 -11
- package/test/operations/reverse.test.js +4 -3
- package/test/operations/scope.test.js +6 -5
- 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 +4 -5
- package/test/operations/withKeys.test.js +2 -2
- 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
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import assert from "node:assert";
|
|
2
|
+
import { describe, test } from "node:test";
|
|
3
|
+
import isMaplike from "../../src/operations/isMaplike.js";
|
|
4
|
+
|
|
5
|
+
describe("isMaplike", () => {
|
|
6
|
+
test("returns true if the argument can be cast to an async map", () => {
|
|
7
|
+
assert(!isMaplike(null));
|
|
8
|
+
assert(!isMaplike(1));
|
|
9
|
+
assert(isMaplike({}));
|
|
10
|
+
assert(isMaplike([]));
|
|
11
|
+
assert(isMaplike(new Map()));
|
|
12
|
+
assert(isMaplike(new Map().keys())); // Iterator
|
|
13
|
+
assert(isMaplike(new Set()));
|
|
14
|
+
});
|
|
15
|
+
});
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import assert from "node:assert";
|
|
2
2
|
import { describe, test } from "node:test";
|
|
3
|
-
import
|
|
3
|
+
import from from "../../src/operations/from.js";
|
|
4
4
|
import json from "../../src/operations/json.js";
|
|
5
5
|
|
|
6
6
|
describe("json", () => {
|
|
7
7
|
test("renders a tree in JSON format", async () => {
|
|
8
|
-
const tree =
|
|
8
|
+
const tree = from({ person1: "Alice", person2: "Bob" });
|
|
9
9
|
const result = await json(tree);
|
|
10
10
|
assert.equal(
|
|
11
11
|
result,
|
|
@@ -1,15 +1,28 @@
|
|
|
1
1
|
import assert from "node:assert";
|
|
2
2
|
import { describe, test } from "node:test";
|
|
3
|
+
import AsyncMap from "../../src/drivers/AsyncMap.js";
|
|
4
|
+
import ObjectMap from "../../src/drivers/ObjectMap.js";
|
|
3
5
|
import keys from "../../src/operations/keys.js";
|
|
4
6
|
|
|
5
7
|
describe("keys", () => {
|
|
6
|
-
test("
|
|
7
|
-
const obj = {
|
|
8
|
+
test("handles regular iterable", async () => {
|
|
9
|
+
const obj = new ObjectMap({
|
|
8
10
|
a: 1,
|
|
9
11
|
b: 2,
|
|
10
12
|
c: 3,
|
|
11
|
-
};
|
|
13
|
+
});
|
|
12
14
|
const result = await keys(obj);
|
|
13
15
|
assert.deepEqual(result, ["a", "b", "c"]);
|
|
14
16
|
});
|
|
17
|
+
|
|
18
|
+
test("handles async iterable", async () => {
|
|
19
|
+
const map = new AsyncMap();
|
|
20
|
+
map.keys = async function* () {
|
|
21
|
+
yield "x";
|
|
22
|
+
yield "y";
|
|
23
|
+
yield "z";
|
|
24
|
+
};
|
|
25
|
+
const result = await keys(map);
|
|
26
|
+
assert.deepEqual(result, ["x", "y", "z"]);
|
|
27
|
+
});
|
|
15
28
|
});
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import assert from "node:assert";
|
|
2
2
|
import { describe, test } from "node:test";
|
|
3
|
-
import
|
|
3
|
+
import DeepObjectMap from "../../src/drivers/DeepObjectMap.js";
|
|
4
|
+
import ObjectMap from "../../src/drivers/ObjectMap.js";
|
|
4
5
|
import map from "../../src/operations/map.js";
|
|
6
|
+
import plain from "../../src/operations/plain.js";
|
|
5
7
|
import * as trailingSlash from "../../src/trailingSlash.js";
|
|
6
8
|
|
|
7
9
|
describe("map", () => {
|
|
@@ -16,7 +18,7 @@ describe("map", () => {
|
|
|
16
18
|
});
|
|
17
19
|
|
|
18
20
|
test("maps values", async () => {
|
|
19
|
-
const tree = new
|
|
21
|
+
const tree = new ObjectMap({
|
|
20
22
|
a: "letter a",
|
|
21
23
|
b: "letter b",
|
|
22
24
|
c: undefined, // Won't be mapped
|
|
@@ -28,7 +30,7 @@ describe("map", () => {
|
|
|
28
30
|
return sourceValue.toUpperCase();
|
|
29
31
|
},
|
|
30
32
|
});
|
|
31
|
-
assert.deepEqual(await
|
|
33
|
+
assert.deepEqual(await plain(mapped), {
|
|
32
34
|
a: "LETTER A",
|
|
33
35
|
b: "LETTER B",
|
|
34
36
|
c: undefined,
|
|
@@ -44,7 +46,7 @@ describe("map", () => {
|
|
|
44
46
|
assert(sourceKey === "a" || sourceKey === "b");
|
|
45
47
|
return sourceValue.toUpperCase();
|
|
46
48
|
});
|
|
47
|
-
assert.deepEqual(await
|
|
49
|
+
assert.deepEqual(await plain(uppercaseValues), {
|
|
48
50
|
a: "LETTER A",
|
|
49
51
|
b: "LETTER B",
|
|
50
52
|
});
|
|
@@ -59,7 +61,7 @@ describe("map", () => {
|
|
|
59
61
|
key: addUnderscore,
|
|
60
62
|
inverseKey: removeUnderscore,
|
|
61
63
|
});
|
|
62
|
-
assert.deepEqual(await
|
|
64
|
+
assert.deepEqual(await plain(underscoreKeys), {
|
|
63
65
|
_a: "letter a",
|
|
64
66
|
_b: "letter b",
|
|
65
67
|
});
|
|
@@ -73,23 +75,23 @@ describe("map", () => {
|
|
|
73
75
|
const underscoreKeys = await map(tree, {
|
|
74
76
|
key: addUnderscore,
|
|
75
77
|
});
|
|
76
|
-
assert.deepEqual(await
|
|
78
|
+
assert.deepEqual(await plain(underscoreKeys), {
|
|
77
79
|
_a: "letter a",
|
|
78
80
|
_b: "letter b",
|
|
79
81
|
});
|
|
80
82
|
});
|
|
81
83
|
|
|
82
84
|
test("maps keys and values", async () => {
|
|
83
|
-
const
|
|
85
|
+
const maplike = new ObjectMap([
|
|
84
86
|
{ name: "Alice", age: 1 },
|
|
85
87
|
{ name: "Bob", age: 2 },
|
|
86
88
|
{ name: "Carol", age: 3 },
|
|
87
89
|
]);
|
|
88
|
-
const result = await map(
|
|
90
|
+
const result = await map(maplike, {
|
|
89
91
|
key: (value, key, tree) => value.name,
|
|
90
92
|
value: (value, key, tree) => value.age,
|
|
91
93
|
});
|
|
92
|
-
assert.deepEqual(await
|
|
94
|
+
assert.deepEqual(await plain(result), {
|
|
93
95
|
Alice: 1,
|
|
94
96
|
Bob: 2,
|
|
95
97
|
Carol: 3,
|
|
@@ -108,7 +110,7 @@ describe("map", () => {
|
|
|
108
110
|
inverseKey: async (resultKey, tree) => resultKey.slice(1),
|
|
109
111
|
value: async (sourceValue, sourceKey, tree) => sourceKey,
|
|
110
112
|
});
|
|
111
|
-
assert.deepEqual(await
|
|
113
|
+
assert.deepEqual(await plain(underscoreKeys), {
|
|
112
114
|
_a: "a",
|
|
113
115
|
_more: "more",
|
|
114
116
|
});
|
|
@@ -123,14 +125,14 @@ describe("map", () => {
|
|
|
123
125
|
b: "letter b",
|
|
124
126
|
};
|
|
125
127
|
const mapped = await map(tree, uppercase);
|
|
126
|
-
assert.deepEqual(await
|
|
128
|
+
assert.deepEqual(await plain(mapped), {
|
|
127
129
|
_a: "LETTER A",
|
|
128
130
|
_b: "LETTER B",
|
|
129
131
|
});
|
|
130
132
|
});
|
|
131
133
|
|
|
132
134
|
test("deep maps values", async () => {
|
|
133
|
-
const tree = new
|
|
135
|
+
const tree = new DeepObjectMap({
|
|
134
136
|
a: "letter a",
|
|
135
137
|
more: {
|
|
136
138
|
b: "letter b",
|
|
@@ -140,7 +142,7 @@ describe("map", () => {
|
|
|
140
142
|
deep: true,
|
|
141
143
|
value: (sourceValue, sourceKey, tree) => sourceValue.toUpperCase(),
|
|
142
144
|
});
|
|
143
|
-
assert.deepEqual(await
|
|
145
|
+
assert.deepEqual(await plain(uppercaseValues), {
|
|
144
146
|
a: "LETTER A",
|
|
145
147
|
more: {
|
|
146
148
|
b: "LETTER B",
|
|
@@ -149,7 +151,7 @@ describe("map", () => {
|
|
|
149
151
|
});
|
|
150
152
|
|
|
151
153
|
test("deep maps leaf keys", async () => {
|
|
152
|
-
const tree = new
|
|
154
|
+
const tree = new DeepObjectMap({
|
|
153
155
|
a: "letter a",
|
|
154
156
|
more: {
|
|
155
157
|
b: "letter b",
|
|
@@ -160,7 +162,7 @@ describe("map", () => {
|
|
|
160
162
|
key: addUnderscore,
|
|
161
163
|
inverseKey: removeUnderscore,
|
|
162
164
|
});
|
|
163
|
-
assert.deepEqual(await
|
|
165
|
+
assert.deepEqual(await plain(underscoreKeys), {
|
|
164
166
|
_a: "letter a",
|
|
165
167
|
more: {
|
|
166
168
|
_b: "letter b",
|
|
@@ -169,7 +171,7 @@ describe("map", () => {
|
|
|
169
171
|
});
|
|
170
172
|
|
|
171
173
|
test("deep maps leaf keys and values", async () => {
|
|
172
|
-
const tree = new
|
|
174
|
+
const tree = new DeepObjectMap({
|
|
173
175
|
a: "letter a",
|
|
174
176
|
more: {
|
|
175
177
|
b: "letter b",
|
|
@@ -181,7 +183,7 @@ describe("map", () => {
|
|
|
181
183
|
inverseKey: removeUnderscore,
|
|
182
184
|
value: async (sourceValue, sourceKey, tree) => sourceValue.toUpperCase(),
|
|
183
185
|
});
|
|
184
|
-
assert.deepEqual(await
|
|
186
|
+
assert.deepEqual(await plain(underscoreKeysUppercaseValues), {
|
|
185
187
|
_a: "LETTER A",
|
|
186
188
|
more: {
|
|
187
189
|
_b: "LETTER B",
|
|
@@ -202,7 +204,7 @@ describe("map", () => {
|
|
|
202
204
|
return key.toUpperCase();
|
|
203
205
|
},
|
|
204
206
|
});
|
|
205
|
-
assert.deepEqual(await
|
|
207
|
+
assert.deepEqual(await plain(mapped), {
|
|
206
208
|
A: "letter a",
|
|
207
209
|
B: "letter b",
|
|
208
210
|
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,11 +1,11 @@
|
|
|
1
1
|
import assert from "node:assert";
|
|
2
2
|
import { describe, test } from "node:test";
|
|
3
|
-
import
|
|
3
|
+
import DeepObjectMap from "../../src/drivers/DeepObjectMap.js";
|
|
4
4
|
import mapReduce from "../../src/operations/mapReduce.js";
|
|
5
5
|
|
|
6
6
|
describe("mapReduce", () => {
|
|
7
7
|
test("can map values and reduce them", async () => {
|
|
8
|
-
const tree = new
|
|
8
|
+
const tree = new DeepObjectMap({
|
|
9
9
|
a: 1,
|
|
10
10
|
b: 2,
|
|
11
11
|
more: {
|
|
@@ -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,8 +22,8 @@ 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,
|
|
@@ -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,23 @@
|
|
|
1
1
|
import assert from "node:assert";
|
|
2
2
|
import { describe, test } from "node:test";
|
|
3
|
-
import
|
|
3
|
+
import DeepObjectMap from "../../src/drivers/DeepObjectMap.js";
|
|
4
|
+
import ObjectMap from "../../src/drivers/ObjectMap.js";
|
|
5
|
+
import keys from "../../src/operations/keys.js";
|
|
4
6
|
import merge from "../../src/operations/merge.js";
|
|
7
|
+
import plain from "../../src/operations/plain.js";
|
|
8
|
+
import traverse from "../../src/operations/traverse.js";
|
|
5
9
|
|
|
6
10
|
describe("merge", () => {
|
|
7
11
|
test("performs a shallow merge", async () => {
|
|
8
|
-
const fixture = merge(
|
|
9
|
-
new
|
|
12
|
+
const fixture = await merge(
|
|
13
|
+
new ObjectMap({
|
|
10
14
|
a: 1,
|
|
11
15
|
// Will be obscured by `b` that follows
|
|
12
16
|
b: {
|
|
13
17
|
c: 2,
|
|
14
18
|
},
|
|
15
19
|
}),
|
|
16
|
-
new
|
|
20
|
+
new ObjectMap({
|
|
17
21
|
b: {
|
|
18
22
|
d: 3,
|
|
19
23
|
},
|
|
@@ -23,7 +27,7 @@ describe("merge", () => {
|
|
|
23
27
|
})
|
|
24
28
|
);
|
|
25
29
|
|
|
26
|
-
assert.deepEqual(await
|
|
30
|
+
assert.deepEqual(await plain(fixture), {
|
|
27
31
|
a: 1,
|
|
28
32
|
b: {
|
|
29
33
|
d: 3,
|
|
@@ -34,23 +38,23 @@ describe("merge", () => {
|
|
|
34
38
|
});
|
|
35
39
|
|
|
36
40
|
// Merge is shallow, and last tree wins, so `b/c` doesn't exist
|
|
37
|
-
const c = await
|
|
41
|
+
const c = await traverse(fixture, "b", "c");
|
|
38
42
|
assert.equal(c, undefined);
|
|
39
43
|
});
|
|
40
44
|
|
|
41
45
|
test("subtree can overwrite a leaf node", async () => {
|
|
42
|
-
const fixture = merge(
|
|
43
|
-
new
|
|
46
|
+
const fixture = await merge(
|
|
47
|
+
new ObjectMap({
|
|
44
48
|
a: 1,
|
|
45
49
|
}),
|
|
46
|
-
new
|
|
50
|
+
new DeepObjectMap({
|
|
47
51
|
a: {
|
|
48
52
|
b: 2,
|
|
49
53
|
},
|
|
50
54
|
})
|
|
51
55
|
);
|
|
52
|
-
assert.deepEqual(
|
|
53
|
-
assert.deepEqual(await
|
|
56
|
+
assert.deepEqual(await keys(fixture), ["a/"]);
|
|
57
|
+
assert.deepEqual(await plain(fixture), {
|
|
54
58
|
a: {
|
|
55
59
|
b: 2,
|
|
56
60
|
},
|
|
@@ -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,12 +1,12 @@
|
|
|
1
1
|
import assert from "node:assert";
|
|
2
2
|
import { describe, test } from "node:test";
|
|
3
|
-
import
|
|
4
|
-
import
|
|
3
|
+
import DeepObjectMap from "../../src/drivers/DeepObjectMap.js";
|
|
4
|
+
import ObjectMap from "../../src/drivers/ObjectMap.js";
|
|
5
5
|
import paths from "../../src/operations/paths.js";
|
|
6
6
|
|
|
7
7
|
describe("paths", () => {
|
|
8
8
|
test("returns an array of paths to the values in the tree", async () => {
|
|
9
|
-
const tree = new
|
|
9
|
+
const tree = new DeepObjectMap({
|
|
10
10
|
a: 1,
|
|
11
11
|
b: 2,
|
|
12
12
|
c: {
|
|
@@ -18,15 +18,15 @@ describe("paths", () => {
|
|
|
18
18
|
});
|
|
19
19
|
|
|
20
20
|
test("can focus just on keys with trailing slashes", async () => {
|
|
21
|
-
const tree = new
|
|
21
|
+
const tree = new ObjectMap({
|
|
22
22
|
a: 1,
|
|
23
23
|
b: 2,
|
|
24
|
-
// This is a shallow
|
|
24
|
+
// This is a shallow ObjectMap, so `c` won't have a trailing slash
|
|
25
25
|
c: {
|
|
26
26
|
d: 3,
|
|
27
27
|
},
|
|
28
28
|
// Explicitly include a trailing slash to signal a subtree
|
|
29
|
-
"d/": new
|
|
29
|
+
"d/": new ObjectMap({
|
|
30
30
|
e: 4,
|
|
31
31
|
}),
|
|
32
32
|
});
|
|
@@ -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,12 +1,13 @@
|
|
|
1
1
|
import assert from "node:assert";
|
|
2
2
|
import { describe, test } from "node:test";
|
|
3
|
-
import
|
|
3
|
+
import DeepObjectMap from "../../src/drivers/DeepObjectMap.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
|
+
new DeepObjectMap({
|
|
10
11
|
"^a$": true,
|
|
11
12
|
"^b.*": true,
|
|
12
13
|
c: {
|
|
@@ -16,14 +17,14 @@ describe("regExpKeys", () => {
|
|
|
16
17
|
f: true,
|
|
17
18
|
})
|
|
18
19
|
);
|
|
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
|
|
20
|
+
assert(await traverse(fixture, "a"));
|
|
21
|
+
assert(!(await traverse(fixture, "alice")));
|
|
22
|
+
assert(await traverse(fixture, "bob"));
|
|
23
|
+
assert(await traverse(fixture, "brenda"));
|
|
24
|
+
assert(await traverse(fixture, "c/", "d"));
|
|
25
|
+
assert(await traverse(fixture, "c/", "eee"));
|
|
26
|
+
assert(await traverse(fixture, "f"));
|
|
27
|
+
assert(await traverse(fixture, "stef")); // contains "f"
|
|
28
|
+
assert(!(await traverse(fixture, "gail")));
|
|
28
29
|
});
|
|
29
30
|
});
|
|
@@ -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
|
});
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import assert from "node:assert";
|
|
2
2
|
import { describe, test } from "node:test";
|
|
3
|
+
import keys from "../../src/operations/keys.js";
|
|
3
4
|
import shuffle from "../../src/operations/shuffle.js";
|
|
4
5
|
|
|
5
6
|
describe("shuffle", () => {
|
|
@@ -12,7 +13,7 @@ describe("shuffle", () => {
|
|
|
12
13
|
e: 5,
|
|
13
14
|
};
|
|
14
15
|
const result = await shuffle(obj);
|
|
15
|
-
const
|
|
16
|
-
assert.deepEqual(
|
|
16
|
+
const treeKeys = await keys(result);
|
|
17
|
+
assert.deepEqual(treeKeys.sort(), Object.keys(obj).sort());
|
|
17
18
|
});
|
|
18
19
|
});
|