@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.
Files changed (178) hide show
  1. package/browser.js +1 -1
  2. package/index.ts +31 -35
  3. package/main.js +1 -2
  4. package/package.json +4 -7
  5. package/shared.js +77 -12
  6. package/src/Tree.js +8 -2
  7. package/src/drivers/AsyncMap.js +210 -0
  8. package/src/drivers/{BrowserFileTree.js → BrowserFileMap.js} +36 -27
  9. package/src/drivers/{calendarTree.js → CalendarMap.js} +81 -62
  10. package/src/drivers/ConstantMap.js +30 -0
  11. package/src/drivers/DeepObjectMap.js +27 -0
  12. package/src/drivers/{ExplorableSiteTree.js → ExplorableSiteMap.js} +7 -7
  13. package/src/drivers/FileMap.js +245 -0
  14. package/src/drivers/{FunctionTree.js → FunctionMap.js} +19 -22
  15. package/src/drivers/ObjectMap.js +139 -0
  16. package/src/drivers/SetMap.js +13 -0
  17. package/src/drivers/{SiteTree.js → SiteMap.js} +16 -17
  18. package/src/drivers/SyncMap.js +245 -0
  19. package/src/jsonKeys.d.ts +2 -2
  20. package/src/jsonKeys.js +6 -5
  21. package/src/operations/addNextPrevious.js +35 -36
  22. package/src/operations/assign.js +30 -21
  23. package/src/operations/cache.js +29 -35
  24. package/src/operations/cachedKeyFunctions.js +1 -1
  25. package/src/operations/calendar.js +5 -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 +31 -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 +27 -30
  60. package/src/operations/mapExtension.js +20 -16
  61. package/src/operations/mapReduce.js +22 -17
  62. package/src/operations/mask.js +31 -22
  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 +8 -8
  68. package/src/operations/plain.js +6 -6
  69. package/src/operations/regExpKeys.js +21 -12
  70. package/src/operations/reverse.js +21 -15
  71. package/src/operations/root.js +6 -5
  72. package/src/operations/scope.js +31 -26
  73. package/src/operations/shuffle.js +23 -16
  74. package/src/operations/size.js +13 -0
  75. package/src/operations/sort.js +55 -40
  76. package/src/operations/sync.js +21 -0
  77. package/src/operations/take.js +23 -11
  78. package/src/operations/text.js +4 -4
  79. package/src/operations/toFunction.js +7 -7
  80. package/src/operations/traverse.js +4 -4
  81. package/src/operations/traverseOrThrow.js +13 -9
  82. package/src/operations/traversePath.js +2 -2
  83. package/src/operations/values.js +18 -9
  84. package/src/operations/withKeys.js +22 -16
  85. package/src/symbols.js +1 -0
  86. package/src/utilities/castArraylike.js +10 -2
  87. package/src/utilities/getMapArgument.js +38 -0
  88. package/src/utilities/getParent.js +2 -2
  89. package/src/utilities/isStringlike.js +7 -5
  90. package/src/utilities/setParent.js +7 -7
  91. package/src/utilities/toFunction.js +2 -2
  92. package/src/utilities/toPlainValue.js +22 -18
  93. package/test/SampleAsyncMap.js +34 -0
  94. package/test/browser/assert.js +20 -0
  95. package/test/browser/index.html +54 -21
  96. package/test/drivers/AsyncMap.test.js +119 -0
  97. package/test/drivers/{BrowserFileTree.test.js → BrowserFileMap.test.js} +42 -23
  98. package/test/drivers/{calendarTree.test.js → CalendarMap.test.js} +17 -19
  99. package/test/drivers/ConstantMap.test.js +15 -0
  100. package/test/drivers/DeepObjectMap.test.js +36 -0
  101. package/test/drivers/{ExplorableSiteTree.test.js → ExplorableSiteMap.test.js} +29 -14
  102. package/test/drivers/FileMap.test.js +185 -0
  103. package/test/drivers/FunctionMap.test.js +56 -0
  104. package/test/drivers/ObjectMap.test.js +166 -0
  105. package/test/drivers/SetMap.test.js +35 -0
  106. package/test/drivers/{SiteTree.test.js → SiteMap.test.js} +14 -10
  107. package/test/drivers/SyncMap.test.js +321 -0
  108. package/test/jsonKeys.test.js +2 -2
  109. package/test/operations/addNextPrevious.test.js +3 -2
  110. package/test/operations/assign.test.js +30 -35
  111. package/test/operations/cache.test.js +8 -6
  112. package/test/operations/cachedKeyFunctions.test.js +6 -5
  113. package/test/operations/clear.test.js +6 -27
  114. package/test/operations/deepEntries.test.js +32 -0
  115. package/test/operations/deepMerge.test.js +6 -5
  116. package/test/operations/deepReverse.test.js +2 -2
  117. package/test/operations/deepTake.test.js +2 -2
  118. package/test/operations/deepText.test.js +4 -4
  119. package/test/operations/deepValuesIterator.test.js +2 -2
  120. package/test/operations/delete.test.js +2 -2
  121. package/test/operations/extensionKeyFunctions.test.js +6 -5
  122. package/test/operations/filter.test.js +3 -3
  123. package/test/operations/from.test.js +23 -31
  124. package/test/operations/globKeys.test.js +9 -9
  125. package/test/operations/groupBy.test.js +6 -5
  126. package/test/operations/inners.test.js +4 -4
  127. package/test/operations/invokeFunctions.test.js +2 -2
  128. package/test/operations/isMap.test.js +15 -0
  129. package/test/operations/isMaplike.test.js +15 -0
  130. package/test/operations/json.test.js +2 -2
  131. package/test/operations/keys.test.js +16 -3
  132. package/test/operations/map.test.js +20 -18
  133. package/test/operations/mapExtension.test.js +6 -6
  134. package/test/operations/mapReduce.test.js +2 -2
  135. package/test/operations/mask.test.js +4 -3
  136. package/test/operations/match.test.js +2 -2
  137. package/test/operations/merge.test.js +15 -11
  138. package/test/operations/paginate.test.js +5 -5
  139. package/test/operations/parent.test.js +3 -3
  140. package/test/operations/paths.test.js +6 -6
  141. package/test/operations/plain.test.js +8 -8
  142. package/test/operations/regExpKeys.test.js +12 -11
  143. package/test/operations/reverse.test.js +4 -3
  144. package/test/operations/scope.test.js +6 -5
  145. package/test/operations/shuffle.test.js +3 -2
  146. package/test/operations/sort.test.js +7 -10
  147. package/test/operations/sync.test.js +43 -0
  148. package/test/operations/take.test.js +2 -2
  149. package/test/operations/toFunction.test.js +2 -2
  150. package/test/operations/traverse.test.js +4 -5
  151. package/test/operations/withKeys.test.js +2 -2
  152. package/test/utilities/setParent.test.js +6 -6
  153. package/test/utilities/toFunction.test.js +2 -2
  154. package/test/utilities/toPlainValue.test.js +51 -12
  155. package/src/drivers/DeepMapTree.js +0 -23
  156. package/src/drivers/DeepObjectTree.js +0 -18
  157. package/src/drivers/DeferredTree.js +0 -81
  158. package/src/drivers/FileTree.js +0 -276
  159. package/src/drivers/MapTree.js +0 -70
  160. package/src/drivers/ObjectTree.js +0 -158
  161. package/src/drivers/SetTree.js +0 -34
  162. package/src/drivers/constantTree.js +0 -19
  163. package/src/drivers/limitConcurrency.js +0 -63
  164. package/src/internal.js +0 -16
  165. package/src/utilities/getTreeArgument.js +0 -43
  166. package/test/drivers/DeepMapTree.test.js +0 -17
  167. package/test/drivers/DeepObjectTree.test.js +0 -35
  168. package/test/drivers/DeferredTree.test.js +0 -22
  169. package/test/drivers/FileTree.test.js +0 -192
  170. package/test/drivers/FunctionTree.test.js +0 -46
  171. package/test/drivers/MapTree.test.js +0 -59
  172. package/test/drivers/ObjectTree.test.js +0 -163
  173. package/test/drivers/SetTree.test.js +0 -44
  174. package/test/drivers/constantTree.test.js +0 -13
  175. package/test/drivers/limitConcurrency.test.js +0 -41
  176. package/test/operations/isAsyncMutableTree.test.js +0 -17
  177. package/test/operations/isAsyncTree.test.js +0 -26
  178. 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 { 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
  });
@@ -1,7 +1,9 @@
1
1
  import assert from "node:assert";
2
2
  import { describe, test } from "node:test";
3
- import { DeepObjectTree, ObjectTree, Tree } from "../../src/internal.js";
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 ObjectTree({
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 Tree.plain(mapped), {
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 Tree.plain(uppercaseValues), {
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 Tree.plain(underscoreKeys), {
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 Tree.plain(underscoreKeys), {
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 treelike = new ObjectTree([
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(treelike, {
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 Tree.plain(result), {
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 Tree.plain(underscoreKeys), {
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 Tree.plain(mapped), {
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 DeepObjectTree({
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 Tree.plain(uppercaseValues), {
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 DeepObjectTree({
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 Tree.plain(underscoreKeys), {
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 DeepObjectTree({
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 Tree.plain(underscoreKeysUppercaseValues), {
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 Tree.plain(mapped), {
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 treelike = {
8
+ const maplike = {
9
9
  "file0.txt": 1,
10
10
  file1: 2,
11
11
  file2: 3,
12
12
  };
13
- const fixture = await mapExtension(treelike, "->.data");
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 treelike = {
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(treelike, {
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 treelike = {
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(treelike, ".txt->", {
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 DeepObjectTree from "../../src/drivers/DeepObjectTree.js";
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 DeepObjectTree({
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 { Tree } from "../../src/internal.js";
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 result.keys(), ["a", "c/"]);
25
- assert.deepEqual(await Tree.plain(result), {
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 Tree.plain(tree), {
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 { DeepObjectTree, ObjectTree, Tree } from "../../src/internal.js";
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 ObjectTree({
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 ObjectTree({
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 Tree.plain(fixture), {
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 Tree.traverse(fixture, "b", "c");
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 ObjectTree({
46
+ const fixture = await merge(
47
+ new ObjectMap({
44
48
  a: 1,
45
49
  }),
46
- new DeepObjectTree({
50
+ new DeepObjectMap({
47
51
  a: {
48
52
  b: 2,
49
53
  },
50
54
  })
51
55
  );
52
- assert.deepEqual([...(await fixture.keys())], ["a/"]);
53
- assert.deepEqual(await Tree.plain(fixture), {
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 treelike = {
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(treelike, 2);
16
- const plain = await Tree.plain(paginated);
17
- assert.deepEqual(await plain, {
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 { ObjectTree } from "../../src/internal.js";
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 ObjectTree({
9
- sub: new ObjectTree({}),
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 DeepObjectTree from "../../src/drivers/DeepObjectTree.js";
4
- import ObjectTree from "../../src/drivers/ObjectTree.js";
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 DeepObjectTree({
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 ObjectTree({
21
+ const tree = new ObjectMap({
22
22
  a: 1,
23
23
  b: 2,
24
- // This is a shallow ObjectTree, so `c` won't have a trailing slash
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 ObjectTree({
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 ObjectTree from "../../src/drivers/ObjectTree.js";
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 ObjectTree({
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 ObjectTree(original);
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 ObjectTree(original);
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 ObjectTree as necessary", async () => {
47
- const tree = new ObjectTree({});
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 ObjectTree([]);
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 ObjectTree({
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 { DeepObjectTree, Tree } from "../../src/internal.js";
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 DeepObjectTree({
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 Tree.traverse(fixture, "a"));
20
- assert(!(await Tree.traverse(fixture, "alice")));
21
- assert(await Tree.traverse(fixture, "bob"));
22
- assert(await Tree.traverse(fixture, "brenda"));
23
- assert(await Tree.traverse(fixture, "c/", "d"));
24
- assert(await Tree.traverse(fixture, "c/", "eee"));
25
- assert(await Tree.traverse(fixture, "f"));
26
- assert(await Tree.traverse(fixture, "stef")); // contains "f"
27
- assert(!(await Tree.traverse(fixture, "gail")));
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 { Tree } from "../../src/internal.js";
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(Array.from(await reversed.keys()), ["c", "b", "a"]);
16
+ assert.deepEqual(await keys(reversed), ["c", "b", "a"]);
16
17
  // @ts-ignore
17
- assert.deepEqual(await Tree.plain(reversed), {
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 { ObjectTree } from "../../src/internal.js";
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 ObjectTree({
9
+ const outer = new ObjectMap({
9
10
  a: 1,
10
11
  b: 2,
11
12
  });
12
- const inner = new ObjectTree({
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([...(await innerScope.keys())], ["a", "b"]);
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 keys = Array.from(await result.keys());
16
- assert.deepEqual(keys.sort(), Object.keys(obj).sort());
16
+ const treeKeys = await keys(result);
17
+ assert.deepEqual(treeKeys.sort(), Object.keys(obj).sort());
17
18
  });
18
19
  });