@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,30 +1,37 @@
|
|
|
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 deepMerge from "../../src/operations/deepMerge.js";
|
|
5
|
+
import plain from "../../src/operations/plain.js";
|
|
5
6
|
|
|
6
7
|
describe("mergeDeep", () => {
|
|
7
8
|
test("can merge deep", async () => {
|
|
8
|
-
const fixture = deepMerge(
|
|
9
|
-
new
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
const fixture = await deepMerge(
|
|
10
|
+
new ObjectMap(
|
|
11
|
+
{
|
|
12
|
+
a: {
|
|
13
|
+
b: 0, // Will be obscured by `b` below
|
|
14
|
+
c: {
|
|
15
|
+
d: 2,
|
|
16
|
+
},
|
|
14
17
|
},
|
|
15
18
|
},
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
{ deep: true }
|
|
20
|
+
),
|
|
21
|
+
new ObjectMap(
|
|
22
|
+
{
|
|
23
|
+
a: {
|
|
24
|
+
b: 1,
|
|
25
|
+
c: {
|
|
26
|
+
e: 3,
|
|
27
|
+
},
|
|
28
|
+
f: 4,
|
|
22
29
|
},
|
|
23
|
-
f: 4,
|
|
24
30
|
},
|
|
25
|
-
|
|
31
|
+
{ deep: true }
|
|
32
|
+
)
|
|
26
33
|
);
|
|
27
|
-
assert.deepEqual(await
|
|
34
|
+
assert.deepEqual(await plain(fixture), {
|
|
28
35
|
a: {
|
|
29
36
|
b: 1,
|
|
30
37
|
c: {
|
|
@@ -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 deepReverse from "../../src/operations/deepReverse.js";
|
|
4
|
+
import plain from "../../src/operations/plain.js";
|
|
5
5
|
|
|
6
6
|
describe("deepReverse", () => {
|
|
7
7
|
test("reverses keys at all levels of a tree", async () => {
|
|
@@ -13,7 +13,7 @@ describe("deepReverse", () => {
|
|
|
13
13
|
},
|
|
14
14
|
};
|
|
15
15
|
const reversed = await deepReverse(tree);
|
|
16
|
-
assert.deepEqual(await
|
|
16
|
+
assert.deepEqual(await plain(reversed), {
|
|
17
17
|
b: {
|
|
18
18
|
d: 3,
|
|
19
19
|
c: 2,
|
|
@@ -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 deepTake from "../../src/operations/deepTake.js";
|
|
4
|
+
import plain from "../../src/operations/plain.js";
|
|
5
5
|
|
|
6
6
|
describe("deepTake", () => {
|
|
7
7
|
test("traverses deeply and returns a limited number of items", async () => {
|
|
@@ -17,6 +17,6 @@ describe("deepTake", () => {
|
|
|
17
17
|
g: 5,
|
|
18
18
|
};
|
|
19
19
|
const result = await deepTake(tree, 4);
|
|
20
|
-
assert.deepEqual(await
|
|
20
|
+
assert.deepEqual(await plain(result), [1, 2, 3, 4]);
|
|
21
21
|
});
|
|
22
22
|
});
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import assert from "node:assert";
|
|
2
2
|
import { describe, test } from "node:test";
|
|
3
|
-
import
|
|
4
|
-
import { Tree } from "../../src/internal.js";
|
|
3
|
+
import FunctionMap from "../../src/drivers/FunctionMap.js";
|
|
5
4
|
import deepText from "../../src/operations/deepText.js";
|
|
5
|
+
import from from "../../src/operations/from.js";
|
|
6
6
|
|
|
7
7
|
describe("deepText", () => {
|
|
8
8
|
test("concatenates deep tree values", async () => {
|
|
9
|
-
const tree =
|
|
9
|
+
const tree = from({
|
|
10
10
|
a: "A",
|
|
11
11
|
b: "B",
|
|
12
12
|
c: "C",
|
|
@@ -21,7 +21,7 @@ describe("deepText", () => {
|
|
|
21
21
|
|
|
22
22
|
test("concatenates deep tree-like values", async () => {
|
|
23
23
|
const letters = ["a", "b", "c"];
|
|
24
|
-
const specimens = new
|
|
24
|
+
const specimens = new FunctionMap(
|
|
25
25
|
(letter) => ({
|
|
26
26
|
lowercase: letter,
|
|
27
27
|
uppercase: letter.toUpperCase(),
|
|
@@ -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 deepValuesIterator from "../../src/operations/deepValuesIterator.js";
|
|
5
5
|
|
|
6
6
|
describe("deepValuesIterator", () => {
|
|
7
7
|
test("returns an iterator of a tree's deep values", async () => {
|
|
8
|
-
const tree = new
|
|
8
|
+
const tree = new ObjectMap({
|
|
9
9
|
a: 1,
|
|
10
10
|
b: 2,
|
|
11
11
|
more: {
|
|
@@ -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 { default as del } from "../../src/operations/delete.js";
|
|
5
5
|
import plain from "../../src/operations/plain.js";
|
|
6
6
|
|
|
7
7
|
describe("delete", () => {
|
|
8
8
|
test("removes a value", async () => {
|
|
9
|
-
const fixture = new
|
|
9
|
+
const fixture = new ObjectMap({
|
|
10
10
|
"Alice.md": "Hello, **Alice**.",
|
|
11
11
|
"Bob.md": "Hello, **Bob**.",
|
|
12
12
|
"Carol.md": "Hello, **Carol**.",
|
|
@@ -1,8 +1,9 @@
|
|
|
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 extensionKeyFunctions from "../../src/operations/extensionKeyFunctions.js";
|
|
5
5
|
import map from "../../src/operations/map.js";
|
|
6
|
+
import plain from "../../src/operations/plain.js";
|
|
6
7
|
|
|
7
8
|
describe("keyMapsForExtensions", () => {
|
|
8
9
|
test("returns key functions that pass a matching key through", async () => {
|
|
@@ -34,7 +35,7 @@ describe("keyMapsForExtensions", () => {
|
|
|
34
35
|
});
|
|
35
36
|
|
|
36
37
|
test("works with map to handle keys that end in a given resultExtension", async () => {
|
|
37
|
-
const files = new
|
|
38
|
+
const files = new ObjectMap({
|
|
38
39
|
"file1.txt": "will be mapped",
|
|
39
40
|
file2: "won't be mapped",
|
|
40
41
|
"file3.foo": "won't be mapped",
|
|
@@ -45,13 +46,13 @@ describe("keyMapsForExtensions", () => {
|
|
|
45
46
|
key,
|
|
46
47
|
value: (sourceValue, sourceKey, tree) => sourceValue.toUpperCase(),
|
|
47
48
|
});
|
|
48
|
-
assert.deepEqual(await
|
|
49
|
+
assert.deepEqual(await plain(fixture), {
|
|
49
50
|
"file1.txt": "WILL BE MAPPED",
|
|
50
51
|
});
|
|
51
52
|
});
|
|
52
53
|
|
|
53
54
|
test("works with map to change a key's resultExtension", async () => {
|
|
54
|
-
const files = new
|
|
55
|
+
const files = new ObjectMap({
|
|
55
56
|
"file1.txt": "will be mapped",
|
|
56
57
|
file2: "won't be mapped",
|
|
57
58
|
"file3.foo": "won't be mapped",
|
|
@@ -62,7 +63,7 @@ describe("keyMapsForExtensions", () => {
|
|
|
62
63
|
key,
|
|
63
64
|
value: (sourceValue, sourceKey, tree) => sourceValue.toUpperCase(),
|
|
64
65
|
});
|
|
65
|
-
assert.deepEqual(await
|
|
66
|
+
assert.deepEqual(await plain(fixture), {
|
|
66
67
|
"file1.upper": "WILL BE MAPPED",
|
|
67
68
|
});
|
|
68
69
|
});
|
|
@@ -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 filter from "../../src/operations/filter.js";
|
|
4
|
+
import plain from "../../src/operations/plain.js";
|
|
5
5
|
|
|
6
6
|
describe("filter", () => {
|
|
7
7
|
test("returns values that pass a filter function", async () => {
|
|
@@ -14,7 +14,7 @@ describe("filter", () => {
|
|
|
14
14
|
},
|
|
15
15
|
(value) => value % 2 === 1 // odd
|
|
16
16
|
);
|
|
17
|
-
assert.deepEqual(await
|
|
17
|
+
assert.deepEqual(await plain(result), {
|
|
18
18
|
a: 1,
|
|
19
19
|
c: 3,
|
|
20
20
|
});
|
|
@@ -35,7 +35,7 @@ describe("filter", () => {
|
|
|
35
35
|
test: (value) => value % 2 === 1, // odd
|
|
36
36
|
}
|
|
37
37
|
);
|
|
38
|
-
assert.deepEqual(await
|
|
38
|
+
assert.deepEqual(await plain(result), {
|
|
39
39
|
a: 1,
|
|
40
40
|
c: {
|
|
41
41
|
d: 3,
|
|
@@ -1,42 +1,33 @@
|
|
|
1
1
|
import assert from "node:assert";
|
|
2
2
|
import { describe, test } from "node:test";
|
|
3
|
-
import
|
|
4
|
-
import
|
|
3
|
+
import ObjectMap from "../../src/drivers/ObjectMap.js";
|
|
4
|
+
import SetMap from "../../src/drivers/SetMap.js";
|
|
5
5
|
import from from "../../src/operations/from.js";
|
|
6
|
-
import
|
|
6
|
+
import values from "../../src/operations/values.js";
|
|
7
7
|
import * as symbols from "../../src/symbols.js";
|
|
8
8
|
|
|
9
9
|
describe("from", () => {
|
|
10
|
-
test("returns
|
|
11
|
-
const tree1 = new
|
|
12
|
-
a
|
|
13
|
-
|
|
10
|
+
test("returns a Map as is", async () => {
|
|
11
|
+
const tree1 = new Map([
|
|
12
|
+
["a", 1],
|
|
13
|
+
["b", 2],
|
|
14
|
+
]);
|
|
14
15
|
const tree2 = from(tree1);
|
|
15
16
|
assert.equal(tree2, tree1);
|
|
16
17
|
});
|
|
17
18
|
|
|
18
|
-
test("
|
|
19
|
-
const obj = new String();
|
|
20
|
-
/** @type {any} */ (obj).unpack = () => ({
|
|
21
|
-
a: "Hello, a.",
|
|
22
|
-
});
|
|
23
|
-
const tree = from(obj);
|
|
24
|
-
assert.deepEqual(await plain(tree), {
|
|
25
|
-
a: "Hello, a.",
|
|
26
|
-
});
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
test("returns a deep object tree if deep option is true", async () => {
|
|
19
|
+
test("returns a deep object map if deep option is true", async () => {
|
|
30
20
|
const obj = {
|
|
31
21
|
sub: {
|
|
32
22
|
a: 1,
|
|
33
23
|
},
|
|
34
24
|
};
|
|
35
25
|
const tree = from(obj, { deep: true });
|
|
36
|
-
assert(tree instanceof
|
|
26
|
+
assert(tree instanceof ObjectMap);
|
|
27
|
+
assert(tree.deep);
|
|
37
28
|
});
|
|
38
29
|
|
|
39
|
-
test("returns a deep object
|
|
30
|
+
test("returns a deep object map if object has [deep] symbol set", async () => {
|
|
40
31
|
const obj = {
|
|
41
32
|
sub: {
|
|
42
33
|
a: 1,
|
|
@@ -44,18 +35,21 @@ describe("from", () => {
|
|
|
44
35
|
};
|
|
45
36
|
Object.defineProperty(obj, symbols.deep, { value: true });
|
|
46
37
|
const tree = from(obj);
|
|
47
|
-
assert(tree instanceof
|
|
38
|
+
assert(tree instanceof ObjectMap);
|
|
39
|
+
assert(tree.deep);
|
|
48
40
|
});
|
|
49
41
|
|
|
50
|
-
test("
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
42
|
+
test("returns a SetMap for Set objects", async () => {
|
|
43
|
+
const set = new Set(["a", "b", "c"]);
|
|
44
|
+
const map = from(set);
|
|
45
|
+
assert(map instanceof SetMap);
|
|
46
|
+
assert.deepEqual(await values(map), ["a", "b", "c"]);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
test("returns an array for an Iterator", async () => {
|
|
50
|
+
const set = new Set(["a", "b", "c"]);
|
|
51
|
+
const map = from(set.values());
|
|
52
|
+
assert.deepEqual(await values(map), ["a", "b", "c"]);
|
|
59
53
|
});
|
|
60
54
|
|
|
61
55
|
test("autoboxes primitive values", async () => {
|
|
@@ -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 globKeys from "../../src/operations/globKeys.js";
|
|
4
|
+
import traverse from "../../src/operations/traverse.js";
|
|
5
5
|
|
|
6
6
|
describe("globKeys", () => {
|
|
7
7
|
test("matches globs", async () => {
|
|
@@ -26,8 +26,8 @@ describe("globKeys", () => {
|
|
|
26
26
|
"*": "default",
|
|
27
27
|
},
|
|
28
28
|
});
|
|
29
|
-
assert.equal(await
|
|
30
|
-
assert.equal(await
|
|
29
|
+
assert.equal(await traverse(globTree, "sub/", "file"), "default");
|
|
30
|
+
assert.equal(await traverse(globTree, "sub/", "foo"), "bar");
|
|
31
31
|
});
|
|
32
32
|
|
|
33
33
|
test("supports deep matches with globstar", async () => {
|
|
@@ -43,11 +43,11 @@ describe("globKeys", () => {
|
|
|
43
43
|
"*.html": true,
|
|
44
44
|
},
|
|
45
45
|
});
|
|
46
|
-
assert.equal(await
|
|
47
|
-
assert.equal(await
|
|
48
|
-
assert.equal(await
|
|
49
|
-
assert.equal(await
|
|
50
|
-
assert.equal(await
|
|
51
|
-
assert.equal(await
|
|
46
|
+
assert.equal(await traverse(globTree, "a/", "b/", "foo.txt"), true);
|
|
47
|
+
assert.equal(await traverse(globTree, "c/", "foo"), false);
|
|
48
|
+
assert.equal(await traverse(globTree, "sub/", "file.md"), true);
|
|
49
|
+
assert.equal(await traverse(globTree, "sub/", "file.txt"), true);
|
|
50
|
+
assert.equal(await traverse(globTree, "sub/", "file.html"), true);
|
|
51
|
+
assert.equal(await traverse(globTree, "sub/", "file"), false);
|
|
52
52
|
});
|
|
53
53
|
});
|
|
@@ -1,7 +1,8 @@
|
|
|
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 groupBy from "../../src/operations/groupBy.js";
|
|
5
|
+
import plain from "../../src/operations/plain.js";
|
|
5
6
|
|
|
6
7
|
describe("groupBy transform", () => {
|
|
7
8
|
test("groups an array using a group key function", async () => {
|
|
@@ -11,9 +12,9 @@ describe("groupBy transform", () => {
|
|
|
11
12
|
{ name: "Alegreya", tags: ["Serif"] },
|
|
12
13
|
{ name: "Work Sans", tags: ["Grotesque", "Sans Serif"] },
|
|
13
14
|
];
|
|
14
|
-
const tree =
|
|
15
|
+
const tree = from(fonts);
|
|
15
16
|
const grouped = await groupBy(tree, (value, key, tree) => value.tags);
|
|
16
|
-
assert.deepEqual(await
|
|
17
|
+
assert.deepEqual(await plain(grouped), {
|
|
17
18
|
Geometric: [{ name: "Albert Sans", tags: ["Geometric", "Sans Serif"] }],
|
|
18
19
|
Grotesque: [{ name: "Work Sans", tags: ["Grotesque", "Sans Serif"] }],
|
|
19
20
|
"Sans Serif": [
|
|
@@ -32,9 +33,9 @@ describe("groupBy transform", () => {
|
|
|
32
33
|
Alegreya: { tags: ["Serif"] },
|
|
33
34
|
"Work Sans": { tags: ["Grotesque", "Sans Serif"] },
|
|
34
35
|
};
|
|
35
|
-
const tree =
|
|
36
|
+
const tree = from(fonts);
|
|
36
37
|
const grouped = await groupBy(tree, (value, key, tree) => value.tags);
|
|
37
|
-
assert.deepEqual(await
|
|
38
|
+
assert.deepEqual(await plain(grouped), {
|
|
38
39
|
Geometric: {
|
|
39
40
|
"Albert Sans": { tags: ["Geometric", "Sans Serif"] },
|
|
40
41
|
},
|
|
@@ -1,26 +1,29 @@
|
|
|
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 inners from "../../src/operations/inners.js";
|
|
5
|
+
import plain from "../../src/operations/plain.js";
|
|
5
6
|
|
|
6
7
|
describe("inners", () => {
|
|
7
8
|
test("returns the interior nodes of a tree", async () => {
|
|
8
|
-
const obj = new
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
const obj = new ObjectMap(
|
|
10
|
+
{
|
|
11
|
+
a: 1,
|
|
12
|
+
b: {
|
|
13
|
+
c: 2,
|
|
14
|
+
d: {
|
|
15
|
+
e: 3,
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
f: 4,
|
|
19
|
+
g: {
|
|
20
|
+
h: 5,
|
|
14
21
|
},
|
|
15
22
|
},
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
h: 5,
|
|
19
|
-
},
|
|
20
|
-
});
|
|
23
|
+
{ deep: true }
|
|
24
|
+
);
|
|
21
25
|
const result = await inners(obj);
|
|
22
|
-
|
|
23
|
-
assert.deepEqual(plain, {
|
|
26
|
+
assert.deepEqual(await plain(result), {
|
|
24
27
|
b: {
|
|
25
28
|
d: {},
|
|
26
29
|
},
|
|
@@ -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 invokeFunctions from "../../src/operations/invokeFunctions.js";
|
|
4
|
+
import plain from "../../src/operations/plain.js";
|
|
5
5
|
|
|
6
6
|
describe("invokeFunctions", () => {
|
|
7
7
|
test("invokes function values, leaves other values as is", async () => {
|
|
@@ -9,7 +9,7 @@ describe("invokeFunctions", () => {
|
|
|
9
9
|
a: 1,
|
|
10
10
|
b: () => 2,
|
|
11
11
|
});
|
|
12
|
-
assert.deepEqual(await
|
|
12
|
+
assert.deepEqual(await plain(fixture), {
|
|
13
13
|
a: 1,
|
|
14
14
|
b: 2,
|
|
15
15
|
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import assert from "node:assert";
|
|
2
|
+
import { describe, test } from "node:test";
|
|
3
|
+
import AsyncMap from "../../src/drivers/AsyncMap.js";
|
|
4
|
+
import isMap from "../../src/operations/isMap.js";
|
|
5
|
+
|
|
6
|
+
describe("isMap", () => {
|
|
7
|
+
test("returns true if the object is a Map or AsyncMap", () => {
|
|
8
|
+
assert(!isMap(null));
|
|
9
|
+
assert(!isMap(1));
|
|
10
|
+
assert(!isMap({}));
|
|
11
|
+
assert(!isMap([]));
|
|
12
|
+
assert(isMap(new Map()));
|
|
13
|
+
assert(isMap(new AsyncMap()));
|
|
14
|
+
});
|
|
15
|
+
});
|
|
@@ -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
|
});
|