@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.
Files changed (182) hide show
  1. package/browser.js +1 -1
  2. package/index.ts +43 -35
  3. package/main.js +1 -2
  4. package/package.json +4 -7
  5. package/shared.js +74 -12
  6. package/src/Tree.js +11 -2
  7. package/src/drivers/AsyncMap.js +237 -0
  8. package/src/drivers/{BrowserFileTree.js → BrowserFileMap.js} +54 -38
  9. package/src/drivers/{calendarTree.js → CalendarMap.js} +80 -63
  10. package/src/drivers/ConstantMap.js +28 -0
  11. package/src/drivers/{ExplorableSiteTree.js → ExplorableSiteMap.js} +7 -7
  12. package/src/drivers/FileMap.js +238 -0
  13. package/src/drivers/{FunctionTree.js → FunctionMap.js} +19 -22
  14. package/src/drivers/ObjectMap.js +151 -0
  15. package/src/drivers/SetMap.js +13 -0
  16. package/src/drivers/{SiteTree.js → SiteMap.js} +17 -20
  17. package/src/drivers/SyncMap.js +260 -0
  18. package/src/jsonKeys.d.ts +2 -2
  19. package/src/jsonKeys.js +20 -5
  20. package/src/operations/addNextPrevious.js +35 -36
  21. package/src/operations/assign.js +27 -23
  22. package/src/operations/cache.js +30 -36
  23. package/src/operations/cachedKeyFunctions.js +1 -1
  24. package/src/operations/calendar.js +5 -0
  25. package/src/operations/child.js +35 -0
  26. package/src/operations/clear.js +13 -12
  27. package/src/operations/constant.js +5 -0
  28. package/src/operations/deepEntries.js +23 -0
  29. package/src/operations/deepMap.js +9 -9
  30. package/src/operations/deepMerge.js +36 -25
  31. package/src/operations/deepReverse.js +23 -16
  32. package/src/operations/deepTake.js +7 -7
  33. package/src/operations/deepText.js +4 -4
  34. package/src/operations/deepValues.js +3 -6
  35. package/src/operations/deepValuesIterator.js +11 -11
  36. package/src/operations/delete.js +8 -12
  37. package/src/operations/entries.js +17 -10
  38. package/src/operations/filter.js +9 -7
  39. package/src/operations/first.js +12 -10
  40. package/src/operations/forEach.js +10 -13
  41. package/src/operations/from.js +30 -39
  42. package/src/operations/globKeys.js +22 -17
  43. package/src/operations/group.js +2 -2
  44. package/src/operations/groupBy.js +24 -22
  45. package/src/operations/has.js +7 -9
  46. package/src/operations/indent.js +2 -2
  47. package/src/operations/inners.js +19 -15
  48. package/src/operations/invokeFunctions.js +22 -10
  49. package/src/operations/isAsyncMutableTree.js +5 -12
  50. package/src/operations/isAsyncTree.js +5 -20
  51. package/src/operations/isMap.js +39 -0
  52. package/src/operations/isMaplike.js +34 -0
  53. package/src/operations/isReadOnlyMap.js +14 -0
  54. package/src/operations/isTraversable.js +3 -3
  55. package/src/operations/isTreelike.js +5 -30
  56. package/src/operations/json.js +4 -12
  57. package/src/operations/keys.js +17 -8
  58. package/src/operations/length.js +9 -8
  59. package/src/operations/map.js +28 -30
  60. package/src/operations/mapExtension.js +20 -16
  61. package/src/operations/mapReduce.js +38 -24
  62. package/src/operations/mask.js +54 -29
  63. package/src/operations/match.js +13 -9
  64. package/src/operations/merge.js +43 -35
  65. package/src/operations/paginate.js +26 -18
  66. package/src/operations/parent.js +7 -7
  67. package/src/operations/paths.js +20 -22
  68. package/src/operations/plain.js +6 -6
  69. package/src/operations/reduce.js +16 -0
  70. package/src/operations/regExpKeys.js +21 -12
  71. package/src/operations/reverse.js +21 -15
  72. package/src/operations/root.js +6 -5
  73. package/src/operations/scope.js +31 -26
  74. package/src/operations/set.js +20 -0
  75. package/src/operations/shuffle.js +23 -16
  76. package/src/operations/size.js +13 -0
  77. package/src/operations/sort.js +55 -40
  78. package/src/operations/sync.js +14 -0
  79. package/src/operations/take.js +23 -11
  80. package/src/operations/text.js +4 -4
  81. package/src/operations/toFunction.js +7 -7
  82. package/src/operations/traverse.js +4 -4
  83. package/src/operations/traverseOrThrow.js +18 -9
  84. package/src/operations/traversePath.js +2 -2
  85. package/src/operations/values.js +18 -9
  86. package/src/operations/withKeys.js +22 -16
  87. package/src/symbols.js +1 -0
  88. package/src/utilities/castArraylike.js +24 -13
  89. package/src/utilities/getMapArgument.js +38 -0
  90. package/src/utilities/getParent.js +2 -2
  91. package/src/utilities/isStringlike.js +7 -5
  92. package/src/utilities/setParent.js +7 -7
  93. package/src/utilities/toFunction.js +2 -2
  94. package/src/utilities/toPlainValue.js +21 -19
  95. package/test/SampleAsyncMap.js +34 -0
  96. package/test/browser/assert.js +20 -0
  97. package/test/browser/index.html +53 -21
  98. package/test/drivers/AsyncMap.test.js +119 -0
  99. package/test/drivers/{BrowserFileTree.test.js → BrowserFileMap.test.js} +50 -33
  100. package/test/drivers/{calendarTree.test.js → CalendarMap.test.js} +17 -19
  101. package/test/drivers/ConstantMap.test.js +15 -0
  102. package/test/drivers/{ExplorableSiteTree.test.js → ExplorableSiteMap.test.js} +29 -14
  103. package/test/drivers/FileMap.test.js +156 -0
  104. package/test/drivers/FunctionMap.test.js +56 -0
  105. package/test/drivers/ObjectMap.test.js +194 -0
  106. package/test/drivers/SetMap.test.js +35 -0
  107. package/test/drivers/{SiteTree.test.js → SiteMap.test.js} +14 -10
  108. package/test/drivers/SyncMap.test.js +335 -0
  109. package/test/jsonKeys.test.js +18 -6
  110. package/test/operations/addNextPrevious.test.js +3 -2
  111. package/test/operations/assign.test.js +30 -35
  112. package/test/operations/cache.test.js +17 -12
  113. package/test/operations/cachedKeyFunctions.test.js +12 -9
  114. package/test/operations/child.test.js +34 -0
  115. package/test/operations/clear.test.js +6 -27
  116. package/test/operations/deepEntries.test.js +32 -0
  117. package/test/operations/deepMerge.test.js +23 -16
  118. package/test/operations/deepReverse.test.js +2 -2
  119. package/test/operations/deepTake.test.js +2 -2
  120. package/test/operations/deepText.test.js +4 -4
  121. package/test/operations/deepValuesIterator.test.js +2 -2
  122. package/test/operations/delete.test.js +2 -2
  123. package/test/operations/extensionKeyFunctions.test.js +6 -5
  124. package/test/operations/filter.test.js +3 -3
  125. package/test/operations/from.test.js +25 -31
  126. package/test/operations/globKeys.test.js +9 -9
  127. package/test/operations/groupBy.test.js +6 -5
  128. package/test/operations/inners.test.js +17 -14
  129. package/test/operations/invokeFunctions.test.js +2 -2
  130. package/test/operations/isMap.test.js +15 -0
  131. package/test/operations/isMaplike.test.js +15 -0
  132. package/test/operations/json.test.js +2 -2
  133. package/test/operations/keys.test.js +16 -3
  134. package/test/operations/map.test.js +40 -30
  135. package/test/operations/mapExtension.test.js +6 -6
  136. package/test/operations/mapReduce.test.js +14 -12
  137. package/test/operations/mask.test.js +16 -3
  138. package/test/operations/match.test.js +2 -2
  139. package/test/operations/merge.test.js +20 -14
  140. package/test/operations/paginate.test.js +5 -5
  141. package/test/operations/parent.test.js +3 -3
  142. package/test/operations/paths.test.js +20 -27
  143. package/test/operations/plain.test.js +8 -8
  144. package/test/operations/regExpKeys.test.js +22 -18
  145. package/test/operations/reverse.test.js +4 -3
  146. package/test/operations/scope.test.js +6 -5
  147. package/test/operations/set.test.js +11 -0
  148. package/test/operations/shuffle.test.js +3 -2
  149. package/test/operations/sort.test.js +7 -10
  150. package/test/operations/sync.test.js +43 -0
  151. package/test/operations/take.test.js +2 -2
  152. package/test/operations/toFunction.test.js +2 -2
  153. package/test/operations/traverse.test.js +17 -5
  154. package/test/operations/withKeys.test.js +2 -2
  155. package/test/utilities/castArrayLike.test.js +53 -0
  156. package/test/utilities/setParent.test.js +6 -6
  157. package/test/utilities/toFunction.test.js +2 -2
  158. package/test/utilities/toPlainValue.test.js +51 -12
  159. package/src/drivers/DeepMapTree.js +0 -23
  160. package/src/drivers/DeepObjectTree.js +0 -18
  161. package/src/drivers/DeferredTree.js +0 -81
  162. package/src/drivers/FileTree.js +0 -276
  163. package/src/drivers/MapTree.js +0 -70
  164. package/src/drivers/ObjectTree.js +0 -158
  165. package/src/drivers/SetTree.js +0 -34
  166. package/src/drivers/constantTree.js +0 -19
  167. package/src/drivers/limitConcurrency.js +0 -63
  168. package/src/internal.js +0 -16
  169. package/src/utilities/getTreeArgument.js +0 -43
  170. package/test/drivers/DeepMapTree.test.js +0 -17
  171. package/test/drivers/DeepObjectTree.test.js +0 -35
  172. package/test/drivers/DeferredTree.test.js +0 -22
  173. package/test/drivers/FileTree.test.js +0 -192
  174. package/test/drivers/FunctionTree.test.js +0 -46
  175. package/test/drivers/MapTree.test.js +0 -59
  176. package/test/drivers/ObjectTree.test.js +0 -163
  177. package/test/drivers/SetTree.test.js +0 -44
  178. package/test/drivers/constantTree.test.js +0 -13
  179. package/test/drivers/limitConcurrency.test.js +0 -41
  180. package/test/operations/isAsyncMutableTree.test.js +0 -17
  181. package/test/operations/isAsyncTree.test.js +0 -26
  182. 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 { DeepObjectTree, Tree } from "../../src/internal.js";
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 DeepObjectTree({
10
- a: {
11
- b: 0, // Will be obscured by `b` below
12
- c: {
13
- d: 2,
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
- new DeepObjectTree({
18
- a: {
19
- b: 1,
20
- c: {
21
- e: 3,
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 Tree.plain(fixture), {
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 Tree.plain(reversed), {
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 Tree.plain(result), [1, 2, 3, 4]);
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 FunctionTree from "../../src/drivers/FunctionTree.js";
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 = Tree.from({
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 FunctionTree(
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 { ObjectTree } from "../../src/internal.js";
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 ObjectTree({
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 ObjectTree from "../../src/drivers/ObjectTree.js";
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 ObjectTree({
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 { ObjectTree, Tree } from "../../src/internal.js";
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 ObjectTree({
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 Tree.plain(fixture), {
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 ObjectTree({
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 Tree.plain(fixture), {
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 Tree.plain(result), {
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 Tree.plain(result), {
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 DeepObjectTree from "../../src/drivers/DeepObjectTree.js";
4
- import ObjectTree from "../../src/drivers/ObjectTree.js";
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 plain from "../../src/operations/plain.js";
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 an async tree as is", async () => {
11
- const tree1 = new ObjectTree({
12
- a: "Hello, 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("uses an object's unpack() method if defined", async () => {
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 DeepObjectTree);
26
+ assert(tree instanceof ObjectMap);
27
+ assert(tree.deep);
37
28
  });
38
29
 
39
- test("returns a deep object tree if object has [deep] symbol set", async () => {
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 DeepObjectTree);
38
+ assert(tree instanceof ObjectMap);
39
+ assert(tree.deep);
48
40
  });
49
41
 
50
- test("creates a deferred tree if unpack() returns a promise", async () => {
51
- const obj = new String();
52
- /** @type {any} */ (obj).unpack = async () => ({
53
- a: "Hello, a.",
54
- });
55
- const tree = from(obj);
56
- assert.deepEqual(await plain(tree), {
57
- a: "Hello, a.",
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 Tree.traverse(globTree, "sub/", "file"), "default");
30
- assert.equal(await Tree.traverse(globTree, "sub/", "foo"), "bar");
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 Tree.traverse(globTree, "a/", "b/", "foo.txt"), true);
47
- assert.equal(await Tree.traverse(globTree, "c/", "foo"), false);
48
- assert.equal(await Tree.traverse(globTree, "sub/", "file.md"), true);
49
- assert.equal(await Tree.traverse(globTree, "sub/", "file.txt"), true);
50
- assert.equal(await Tree.traverse(globTree, "sub/", "file.html"), true);
51
- assert.equal(await Tree.traverse(globTree, "sub/", "file"), false);
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 { Tree } from "../../src/internal.js";
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 = Tree.from(fonts);
15
+ const tree = from(fonts);
15
16
  const grouped = await groupBy(tree, (value, key, tree) => value.tags);
16
- assert.deepEqual(await Tree.plain(grouped), {
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 = Tree.from(fonts);
36
+ const tree = from(fonts);
36
37
  const grouped = await groupBy(tree, (value, key, tree) => value.tags);
37
- assert.deepEqual(await Tree.plain(grouped), {
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 { DeepObjectTree, Tree } from "../../src/internal.js";
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 DeepObjectTree({
9
- a: 1,
10
- b: {
11
- c: 2,
12
- d: {
13
- e: 3,
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
- f: 4,
17
- g: {
18
- h: 5,
19
- },
20
- });
23
+ { deep: true }
24
+ );
21
25
  const result = await inners(obj);
22
- const plain = await Tree.plain(result);
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 Tree.plain(fixture), {
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 { Tree } from "../../src/internal.js";
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 = Tree.from({ person1: "Alice", person2: "Bob" });
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("returns the keys of a tree as an array", async () => {
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
  });