@weborigami/async-tree 0.6.0 → 0.6.2
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/index.ts +13 -1
- package/package.json +1 -1
- package/shared.js +13 -16
- package/src/Tree.js +3 -0
- package/src/drivers/AsyncMap.js +30 -3
- package/src/drivers/BrowserFileMap.js +30 -23
- package/src/drivers/CalendarMap.js +0 -2
- package/src/drivers/ConstantMap.js +1 -3
- package/src/drivers/ExplorableSiteMap.js +2 -0
- package/src/drivers/FileMap.js +50 -57
- package/src/drivers/ObjectMap.js +22 -10
- package/src/drivers/SiteMap.js +4 -6
- package/src/drivers/SyncMap.js +22 -7
- package/src/jsonKeys.js +15 -1
- package/src/operations/assign.js +7 -12
- package/src/operations/cache.js +2 -2
- package/src/operations/child.js +35 -0
- package/src/operations/from.js +5 -6
- package/src/operations/globKeys.js +2 -3
- package/src/operations/isMaplike.js +1 -1
- package/src/operations/map.js +22 -3
- package/src/operations/mapReduce.js +28 -19
- package/src/operations/mask.js +34 -18
- package/src/operations/paths.js +14 -16
- package/src/operations/reduce.js +16 -0
- package/src/operations/root.js +2 -2
- package/src/operations/set.js +20 -0
- package/src/operations/sync.js +2 -9
- package/src/operations/traverseOrThrow.js +5 -0
- package/src/utilities/castArraylike.js +23 -20
- package/src/utilities/toPlainValue.js +6 -8
- package/test/browser/index.html +0 -1
- package/test/drivers/BrowserFileMap.test.js +21 -23
- package/test/drivers/FileMap.test.js +2 -31
- package/test/drivers/ObjectMap.test.js +28 -0
- package/test/drivers/SyncMap.test.js +19 -5
- package/test/jsonKeys.test.js +18 -6
- package/test/operations/cache.test.js +11 -8
- package/test/operations/cachedKeyFunctions.test.js +8 -6
- package/test/operations/child.test.js +34 -0
- package/test/operations/deepMerge.test.js +20 -14
- package/test/operations/from.test.js +6 -4
- package/test/operations/inners.test.js +15 -12
- package/test/operations/map.test.js +24 -16
- package/test/operations/mapReduce.test.js +14 -12
- package/test/operations/mask.test.js +12 -0
- package/test/operations/merge.test.js +7 -5
- package/test/operations/paths.test.js +20 -27
- package/test/operations/regExpKeys.test.js +12 -9
- package/test/operations/root.test.js +23 -0
- package/test/operations/set.test.js +11 -0
- package/test/operations/traverse.test.js +13 -0
- package/test/utilities/castArrayLike.test.js +53 -0
- package/src/drivers/DeepObjectMap.js +0 -27
- package/test/drivers/DeepObjectMap.test.js +0 -36
|
@@ -1,21 +1,24 @@
|
|
|
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 regExpKeys from "../../src/operations/regExpKeys.js";
|
|
5
5
|
import traverse from "../../src/operations/traverse.js";
|
|
6
6
|
|
|
7
7
|
describe("regExpKeys", () => {
|
|
8
8
|
test("matches keys using regular expressions", async () => {
|
|
9
9
|
const fixture = await regExpKeys(
|
|
10
|
-
new
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
10
|
+
new ObjectMap(
|
|
11
|
+
{
|
|
12
|
+
"^a$": true,
|
|
13
|
+
"^b.*": true,
|
|
14
|
+
c: {
|
|
15
|
+
d: true,
|
|
16
|
+
"e*": true,
|
|
17
|
+
},
|
|
18
|
+
f: true,
|
|
16
19
|
},
|
|
17
|
-
|
|
18
|
-
|
|
20
|
+
{ deep: true }
|
|
21
|
+
)
|
|
19
22
|
);
|
|
20
23
|
assert(await traverse(fixture, "a"));
|
|
21
24
|
assert(!(await traverse(fixture, "alice")));
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import assert from "node:assert";
|
|
2
|
+
import { describe, test } from "node:test";
|
|
3
|
+
import ObjectMap from "../../src/drivers/ObjectMap.js";
|
|
4
|
+
import root from "../../src/operations/root.js";
|
|
5
|
+
import traverse from "../../src/operations/traverse.js";
|
|
6
|
+
|
|
7
|
+
describe("root", () => {
|
|
8
|
+
test("returns root of a tree", async () => {
|
|
9
|
+
const tree = new ObjectMap(
|
|
10
|
+
{
|
|
11
|
+
a: {
|
|
12
|
+
b: {
|
|
13
|
+
c: {},
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
{ deep: true }
|
|
18
|
+
);
|
|
19
|
+
const c = await traverse(tree, "a", "b", "c");
|
|
20
|
+
const r = await root(c);
|
|
21
|
+
assert.strictEqual(r, tree);
|
|
22
|
+
});
|
|
23
|
+
});
|
|
@@ -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
|
+
});
|
|
@@ -39,4 +39,17 @@ describe("traverse", () => {
|
|
|
39
39
|
});
|
|
40
40
|
assert.equal(await traverse(tree, "a", "b", "c"), "Hello");
|
|
41
41
|
});
|
|
42
|
+
|
|
43
|
+
test("unpacks last value if key ends in a slash", async () => {
|
|
44
|
+
const tree = new ObjectMap({
|
|
45
|
+
a: {
|
|
46
|
+
b: Object.assign(new String("packed"), {
|
|
47
|
+
unpack() {
|
|
48
|
+
return "unpacked";
|
|
49
|
+
},
|
|
50
|
+
}),
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
assert.equal(await traverse(tree, "a/", "b/"), "unpacked");
|
|
54
|
+
});
|
|
42
55
|
});
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import assert from "node:assert";
|
|
2
|
+
import { describe, test } from "node:test";
|
|
3
|
+
import castArraylike from "../../src/utilities/castArraylike.js";
|
|
4
|
+
|
|
5
|
+
describe("castArraylike", () => {
|
|
6
|
+
test("returns an object if any keys are not integers", () => {
|
|
7
|
+
const map = new /** @type {any} */ (Map)([
|
|
8
|
+
[0, "a"],
|
|
9
|
+
[1, "b"],
|
|
10
|
+
["x", "c"],
|
|
11
|
+
]);
|
|
12
|
+
const result = castArraylike(map);
|
|
13
|
+
assert.deepEqual(result, {
|
|
14
|
+
0: "a",
|
|
15
|
+
1: "b",
|
|
16
|
+
x: "c",
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
test("returns values as is if keys are numeric and 0..length-1", () => {
|
|
21
|
+
const map = new /** @type {any} */ (Map)([
|
|
22
|
+
[0, "a"],
|
|
23
|
+
[1, "b"],
|
|
24
|
+
[2, "c"],
|
|
25
|
+
]);
|
|
26
|
+
const result = castArraylike(map);
|
|
27
|
+
assert.deepEqual(result, ["a", "b", "c"]);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
test("order of keys doesn't matter as long as they're all present", () => {
|
|
31
|
+
const map = new /** @type {any} */ (Map)([
|
|
32
|
+
[1, "a"],
|
|
33
|
+
[0, "b"],
|
|
34
|
+
[2, "c"],
|
|
35
|
+
]);
|
|
36
|
+
const result = castArraylike(map);
|
|
37
|
+
assert.deepEqual(result, ["a", "b", "c"]);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
test("resorts object if numeric keys are missing", () => {
|
|
41
|
+
const map = new /** @type {any} */ (Map)([
|
|
42
|
+
[1, "a"],
|
|
43
|
+
[0, "b"],
|
|
44
|
+
[3, "c"],
|
|
45
|
+
]);
|
|
46
|
+
const result = castArraylike(map);
|
|
47
|
+
assert.deepEqual(result, {
|
|
48
|
+
1: "a",
|
|
49
|
+
0: "b",
|
|
50
|
+
3: "c",
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
});
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import isMap from "../operations/isMap.js";
|
|
2
|
-
import isPlainObject from "../utilities/isPlainObject.js";
|
|
3
|
-
import ObjectMap from "./ObjectMap.js";
|
|
4
|
-
|
|
5
|
-
export default class DeepObjectMap extends ObjectMap {
|
|
6
|
-
// Implement delete (and set) to keep the Map read-write
|
|
7
|
-
delete(key) {
|
|
8
|
-
return super.delete(key);
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
get(key) {
|
|
12
|
-
let value = super.get(key);
|
|
13
|
-
if (value instanceof Array || isPlainObject(value)) {
|
|
14
|
-
value = Reflect.construct(this.constructor, [value]);
|
|
15
|
-
}
|
|
16
|
-
return value;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
isSubtree(value) {
|
|
20
|
-
return value instanceof Array || isPlainObject(value) || isMap(value);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
// See delete()
|
|
24
|
-
set(key, value) {
|
|
25
|
-
return super.set(key, value);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import assert from "node:assert";
|
|
2
|
-
import { describe, test } from "node:test";
|
|
3
|
-
import DeepObjectMap from "../../src/drivers/DeepObjectMap.js";
|
|
4
|
-
import plain from "../../src/operations/plain.js";
|
|
5
|
-
|
|
6
|
-
describe("DeepObjectMap", () => {
|
|
7
|
-
test("returns a map for a value that's a plain sub-object or sub-array", async () => {
|
|
8
|
-
const map = createFixture();
|
|
9
|
-
|
|
10
|
-
const object = await map.get("object");
|
|
11
|
-
assert.equal(object instanceof DeepObjectMap, true);
|
|
12
|
-
assert.deepEqual(await plain(object), { b: 2 });
|
|
13
|
-
assert.equal(object.parent, map);
|
|
14
|
-
|
|
15
|
-
const array = await map.get("array");
|
|
16
|
-
assert.equal(array instanceof DeepObjectMap, true);
|
|
17
|
-
assert.deepEqual(await plain(array), [3]);
|
|
18
|
-
assert.equal(array.parent, map);
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
test("adds trailing slashes to keys for submaps including plain objects or arrays", async () => {
|
|
22
|
-
const map = createFixture();
|
|
23
|
-
const keys = Array.from(await map.keys());
|
|
24
|
-
assert.deepEqual(keys, ["a", "object/", "array/"]);
|
|
25
|
-
});
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
function createFixture() {
|
|
29
|
-
return new DeepObjectMap({
|
|
30
|
-
a: 1,
|
|
31
|
-
object: {
|
|
32
|
-
b: 2,
|
|
33
|
-
},
|
|
34
|
-
array: [3],
|
|
35
|
-
});
|
|
36
|
-
}
|