@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,7 +1,8 @@
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 ObjectMap from "../../src/drivers/ObjectMap.js";
4
4
  import map from "../../src/operations/map.js";
5
+ import plain from "../../src/operations/plain.js";
5
6
  import * as trailingSlash from "../../src/trailingSlash.js";
6
7
 
7
8
  describe("map", () => {
@@ -16,7 +17,7 @@ describe("map", () => {
16
17
  });
17
18
 
18
19
  test("maps values", async () => {
19
- const tree = new ObjectTree({
20
+ const tree = new ObjectMap({
20
21
  a: "letter a",
21
22
  b: "letter b",
22
23
  c: undefined, // Won't be mapped
@@ -28,7 +29,7 @@ describe("map", () => {
28
29
  return sourceValue.toUpperCase();
29
30
  },
30
31
  });
31
- assert.deepEqual(await Tree.plain(mapped), {
32
+ assert.deepEqual(await plain(mapped), {
32
33
  a: "LETTER A",
33
34
  b: "LETTER B",
34
35
  c: undefined,
@@ -44,7 +45,7 @@ describe("map", () => {
44
45
  assert(sourceKey === "a" || sourceKey === "b");
45
46
  return sourceValue.toUpperCase();
46
47
  });
47
- assert.deepEqual(await Tree.plain(uppercaseValues), {
48
+ assert.deepEqual(await plain(uppercaseValues), {
48
49
  a: "LETTER A",
49
50
  b: "LETTER B",
50
51
  });
@@ -59,7 +60,7 @@ describe("map", () => {
59
60
  key: addUnderscore,
60
61
  inverseKey: removeUnderscore,
61
62
  });
62
- assert.deepEqual(await Tree.plain(underscoreKeys), {
63
+ assert.deepEqual(await plain(underscoreKeys), {
63
64
  _a: "letter a",
64
65
  _b: "letter b",
65
66
  });
@@ -73,23 +74,23 @@ describe("map", () => {
73
74
  const underscoreKeys = await map(tree, {
74
75
  key: addUnderscore,
75
76
  });
76
- assert.deepEqual(await Tree.plain(underscoreKeys), {
77
+ assert.deepEqual(await plain(underscoreKeys), {
77
78
  _a: "letter a",
78
79
  _b: "letter b",
79
80
  });
80
81
  });
81
82
 
82
83
  test("maps keys and values", async () => {
83
- const treelike = new ObjectTree([
84
+ const maplike = new ObjectMap([
84
85
  { name: "Alice", age: 1 },
85
86
  { name: "Bob", age: 2 },
86
87
  { name: "Carol", age: 3 },
87
88
  ]);
88
- const result = await map(treelike, {
89
+ const result = await map(maplike, {
89
90
  key: (value, key, tree) => value.name,
90
91
  value: (value, key, tree) => value.age,
91
92
  });
92
- assert.deepEqual(await Tree.plain(result), {
93
+ assert.deepEqual(await plain(result), {
93
94
  Alice: 1,
94
95
  Bob: 2,
95
96
  Carol: 3,
@@ -108,7 +109,7 @@ describe("map", () => {
108
109
  inverseKey: async (resultKey, tree) => resultKey.slice(1),
109
110
  value: async (sourceValue, sourceKey, tree) => sourceKey,
110
111
  });
111
- assert.deepEqual(await Tree.plain(underscoreKeys), {
112
+ assert.deepEqual(await plain(underscoreKeys), {
112
113
  _a: "a",
113
114
  _more: "more",
114
115
  });
@@ -123,24 +124,27 @@ describe("map", () => {
123
124
  b: "letter b",
124
125
  };
125
126
  const mapped = await map(tree, uppercase);
126
- assert.deepEqual(await Tree.plain(mapped), {
127
+ assert.deepEqual(await plain(mapped), {
127
128
  _a: "LETTER A",
128
129
  _b: "LETTER B",
129
130
  });
130
131
  });
131
132
 
132
133
  test("deep maps values", async () => {
133
- const tree = new DeepObjectTree({
134
- a: "letter a",
135
- more: {
136
- b: "letter b",
134
+ const tree = new ObjectMap(
135
+ {
136
+ a: "letter a",
137
+ more: {
138
+ b: "letter b",
139
+ },
137
140
  },
138
- });
141
+ { deep: true }
142
+ );
139
143
  const uppercaseValues = await map(tree, {
140
144
  deep: true,
141
145
  value: (sourceValue, sourceKey, tree) => sourceValue.toUpperCase(),
142
146
  });
143
- assert.deepEqual(await Tree.plain(uppercaseValues), {
147
+ assert.deepEqual(await plain(uppercaseValues), {
144
148
  a: "LETTER A",
145
149
  more: {
146
150
  b: "LETTER B",
@@ -149,18 +153,21 @@ describe("map", () => {
149
153
  });
150
154
 
151
155
  test("deep maps leaf keys", async () => {
152
- const tree = new DeepObjectTree({
153
- a: "letter a",
154
- more: {
155
- b: "letter b",
156
+ const tree = new ObjectMap(
157
+ {
158
+ a: "letter a",
159
+ more: {
160
+ b: "letter b",
161
+ },
156
162
  },
157
- });
163
+ { deep: true }
164
+ );
158
165
  const underscoreKeys = await map(tree, {
159
166
  deep: true,
160
167
  key: addUnderscore,
161
168
  inverseKey: removeUnderscore,
162
169
  });
163
- assert.deepEqual(await Tree.plain(underscoreKeys), {
170
+ assert.deepEqual(await plain(underscoreKeys), {
164
171
  _a: "letter a",
165
172
  more: {
166
173
  _b: "letter b",
@@ -169,19 +176,22 @@ describe("map", () => {
169
176
  });
170
177
 
171
178
  test("deep maps leaf keys and values", async () => {
172
- const tree = new DeepObjectTree({
173
- a: "letter a",
174
- more: {
175
- b: "letter b",
179
+ const tree = new ObjectMap(
180
+ {
181
+ a: "letter a",
182
+ more: {
183
+ b: "letter b",
184
+ },
176
185
  },
177
- });
186
+ { deep: true }
187
+ );
178
188
  const underscoreKeysUppercaseValues = await map(tree, {
179
189
  deep: true,
180
190
  key: addUnderscore,
181
191
  inverseKey: removeUnderscore,
182
192
  value: async (sourceValue, sourceKey, tree) => sourceValue.toUpperCase(),
183
193
  });
184
- assert.deepEqual(await Tree.plain(underscoreKeysUppercaseValues), {
194
+ assert.deepEqual(await plain(underscoreKeysUppercaseValues), {
185
195
  _a: "LETTER A",
186
196
  more: {
187
197
  _b: "LETTER B",
@@ -202,7 +212,7 @@ describe("map", () => {
202
212
  return key.toUpperCase();
203
213
  },
204
214
  });
205
- assert.deepEqual(await Tree.plain(mapped), {
215
+ assert.deepEqual(await plain(mapped), {
206
216
  A: "letter a",
207
217
  B: "letter b",
208
218
  C: "letter c",
@@ -5,12 +5,12 @@ import plain from "../../src/operations/plain.js";
5
5
 
6
6
  describe("mapExtension", () => {
7
7
  test("can add an extension to a key", async () => {
8
- const 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,22 +1,24 @@
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 ObjectMap from "../../src/drivers/ObjectMap.js";
4
4
  import mapReduce from "../../src/operations/mapReduce.js";
5
+ import values from "../../src/operations/values.js";
5
6
 
6
7
  describe("mapReduce", () => {
7
8
  test("can map values and reduce them", async () => {
8
- const tree = new DeepObjectTree({
9
- a: 1,
10
- b: 2,
11
- more: {
12
- c: 3,
9
+ const tree = new ObjectMap(
10
+ {
11
+ a: 1,
12
+ b: 2,
13
+ more: {
14
+ c: 3,
15
+ },
16
+ d: 4,
13
17
  },
14
- d: 4,
15
- });
16
- const reduced = await mapReduce(
17
- tree,
18
- (value) => value,
19
- async (values) => String.prototype.concat(...values)
18
+ { deep: true }
19
+ );
20
+ const reduced = await mapReduce(tree, null, async (mapped) =>
21
+ String.prototype.concat(...(await values(mapped)))
20
22
  );
21
23
  assert.deepEqual(reduced, "1234");
22
24
  });
@@ -1,7 +1,8 @@
1
1
  import assert from "node:assert";
2
2
  import { describe, test } from "node:test";
3
- import { 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,12 +22,24 @@ 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,
29
30
  },
30
31
  });
31
32
  });
33
+
34
+ test("can pull from a functional map", async () => {
35
+ const result = await mask((key) => key.toUpperCase(), {
36
+ a: true,
37
+ b: false,
38
+ c: true,
39
+ });
40
+ assert.deepEqual(await plain(result), {
41
+ a: "A",
42
+ c: "C",
43
+ });
44
+ });
32
45
  });
@@ -1,7 +1,7 @@
1
1
  import assert from "node:assert";
2
2
  import { describe, test } from "node:test";
3
- import { Tree } from "../../src/internal.js";
4
3
  import match from "../../src/operations/match.js";
4
+ import plain from "../../src/operations/plain.js";
5
5
 
6
6
  describe("match", () => {
7
7
  test("matches keys against a simplified pattern", async () => {
@@ -13,7 +13,7 @@ describe("match", () => {
13
13
  "Bob.html",
14
14
  "Carol.html",
15
15
  ]);
16
- assert.deepEqual(await 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,22 @@
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 ObjectMap from "../../src/drivers/ObjectMap.js";
4
+ import keys from "../../src/operations/keys.js";
4
5
  import merge from "../../src/operations/merge.js";
6
+ import plain from "../../src/operations/plain.js";
7
+ import traverse from "../../src/operations/traverse.js";
5
8
 
6
9
  describe("merge", () => {
7
10
  test("performs a shallow merge", async () => {
8
- const fixture = merge(
9
- new ObjectTree({
11
+ const fixture = await merge(
12
+ new ObjectMap({
10
13
  a: 1,
11
14
  // Will be obscured by `b` that follows
12
15
  b: {
13
16
  c: 2,
14
17
  },
15
18
  }),
16
- new ObjectTree({
19
+ new ObjectMap({
17
20
  b: {
18
21
  d: 3,
19
22
  },
@@ -23,7 +26,7 @@ describe("merge", () => {
23
26
  })
24
27
  );
25
28
 
26
- assert.deepEqual(await Tree.plain(fixture), {
29
+ assert.deepEqual(await plain(fixture), {
27
30
  a: 1,
28
31
  b: {
29
32
  d: 3,
@@ -34,23 +37,26 @@ describe("merge", () => {
34
37
  });
35
38
 
36
39
  // Merge is shallow, and last tree wins, so `b/c` doesn't exist
37
- const c = await Tree.traverse(fixture, "b", "c");
40
+ const c = await traverse(fixture, "b", "c");
38
41
  assert.equal(c, undefined);
39
42
  });
40
43
 
41
44
  test("subtree can overwrite a leaf node", async () => {
42
- const fixture = merge(
43
- new ObjectTree({
45
+ const fixture = await merge(
46
+ new ObjectMap({
44
47
  a: 1,
45
48
  }),
46
- new DeepObjectTree({
47
- a: {
48
- b: 2,
49
+ new ObjectMap(
50
+ {
51
+ a: {
52
+ b: 2,
53
+ },
49
54
  },
50
- })
55
+ { deep: true }
56
+ )
51
57
  );
52
- assert.deepEqual([...(await fixture.keys())], ["a/"]);
53
- assert.deepEqual(await Tree.plain(fixture), {
58
+ assert.deepEqual(await keys(fixture), ["a/"]);
59
+ assert.deepEqual(await plain(fixture), {
54
60
  a: {
55
61
  b: 2,
56
62
  },
@@ -1,20 +1,20 @@
1
1
  import assert from "node:assert";
2
2
  import { describe, test } from "node:test";
3
- import { Tree } from "../../src/internal.js";
4
3
  import paginate from "../../src/operations/paginate.js";
4
+ import plain from "../../src/operations/plain.js";
5
5
 
6
6
  describe("paginate", () => {
7
7
  test("divides tree keys into fixed-length chunks", async () => {
8
- const 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,40 +1,33 @@
1
1
  import assert from "node:assert";
2
2
  import { describe, test } from "node:test";
3
- import DeepObjectTree from "../../src/drivers/DeepObjectTree.js";
4
- import ObjectTree from "../../src/drivers/ObjectTree.js";
5
3
  import paths from "../../src/operations/paths.js";
6
4
 
7
5
  describe("paths", () => {
8
6
  test("returns an array of paths to the values in the tree", async () => {
9
- const tree = new DeepObjectTree({
10
- a: 1,
11
- b: 2,
12
- c: {
13
- d: 3,
14
- e: 4,
15
- },
16
- });
7
+ const tree = new /** @type {any} */ (Map)([
8
+ ["a", 1],
9
+ ["b", 2],
10
+ [
11
+ "c",
12
+ new Map([
13
+ ["d", 3],
14
+ ["e", 4],
15
+ ]),
16
+ ],
17
+ ]);
17
18
  assert.deepEqual(await paths(tree), ["a", "b", "c/d", "c/e"]);
18
19
  });
19
20
 
20
- test("can focus just on keys with trailing slashes", async () => {
21
- const tree = new ObjectTree({
22
- a: 1,
23
- b: 2,
24
- // This is a shallow ObjectTree, so `c` won't have a trailing slash
25
- c: {
26
- d: 3,
27
- },
21
+ test("focuses only on trailing slashes if map supports them", async () => {
22
+ const tree = new /** @type {any} */ (Map)([
23
+ ["a", 1],
24
+ ["b", 2],
25
+ // No trailing slash; paths will skip this subtree
26
+ ["c", new Map([["d", 3]])],
28
27
  // Explicitly include a trailing slash to signal a subtree
29
- "d/": new ObjectTree({
30
- e: 4,
31
- }),
32
- });
33
- assert.deepEqual(await paths(tree, { assumeSlashes: true }), [
34
- "a",
35
- "b",
36
- "c",
37
- "d/e",
28
+ ["d/", new Map([["e", 4]])],
38
29
  ]);
30
+ tree.trailingSlashKeys = true;
31
+ assert.deepEqual(await paths(tree), ["a", "b", "c", "d/e"]);
39
32
  });
40
33
  });
@@ -1,11 +1,11 @@
1
1
  import assert from "node:assert";
2
2
  import { describe, test } from "node:test";
3
- import 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,29 +1,33 @@
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 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
- "^a$": true,
11
- "^b.*": true,
12
- c: {
13
- d: true,
14
- "e*": true,
10
+ new ObjectMap(
11
+ {
12
+ "^a$": true,
13
+ "^b.*": true,
14
+ c: {
15
+ d: true,
16
+ "e*": true,
17
+ },
18
+ f: true,
15
19
  },
16
- f: true,
17
- })
20
+ { deep: true }
21
+ )
18
22
  );
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")));
23
+ assert(await traverse(fixture, "a"));
24
+ assert(!(await traverse(fixture, "alice")));
25
+ assert(await traverse(fixture, "bob"));
26
+ assert(await traverse(fixture, "brenda"));
27
+ assert(await traverse(fixture, "c/", "d"));
28
+ assert(await traverse(fixture, "c/", "eee"));
29
+ assert(await traverse(fixture, "f"));
30
+ assert(await traverse(fixture, "stef")); // contains "f"
31
+ assert(!(await traverse(fixture, "gail")));
28
32
  });
29
33
  });
@@ -1,6 +1,7 @@
1
1
  import assert from "node:assert";
2
2
  import { describe, test } from "node:test";
3
- import { 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
  });
@@ -0,0 +1,11 @@
1
+ import assert from "node:assert";
2
+ import { describe, test } from "node:test";
3
+ import set from "../../src/operations/set.js";
4
+
5
+ describe("set", () => {
6
+ test("sets a value", async () => {
7
+ const map = new Map();
8
+ await set(map, "key", "value");
9
+ assert.strictEqual(map.get("key"), "value");
10
+ });
11
+ });