@weborigami/origami 0.5.3 → 0.5.5
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 +0 -4
- package/main.js +20 -3
- package/package.json +4 -4
- package/src/builtinsProgram.js +1 -10
- package/src/common/documentObject.js +2 -2
- package/src/common/loadJsDom.js +13 -0
- package/src/common/utilities.d.ts +0 -1
- package/src/common/utilities.js +0 -36
- package/src/dev/ExplorableSiteTransform.js +0 -4
- package/src/dev/changes.js +10 -5
- package/src/dev/code.js +1 -6
- package/src/dev/copy.js +4 -8
- package/src/dev/crawler/audit.js +8 -8
- package/src/dev/crawler/crawl.js +3 -5
- package/src/dev/crawler/findPaths.js +9 -3
- package/src/dev/crawler/pathsInHtml.js +4 -3
- package/src/dev/debug.js +4 -7
- package/src/dev/dev.js +4 -2
- package/src/dev/explore.js +4 -3
- package/src/dev/help.js +0 -4
- package/src/dev/help.yaml +14 -13
- package/src/dev/log.js +1 -2
- package/src/dev/serve.js +5 -18
- package/src/dev/treeDot.js +5 -6
- package/src/dev/watch.js +8 -12
- package/src/handlers/csv.handler.js +3 -0
- package/src/handlers/oridocument.handler.js +1 -1
- package/src/origami/csv.js +1 -5
- package/src/origami/document.js +2 -5
- package/src/origami/htmlDom.js +3 -2
- package/src/origami/image/format.js +0 -5
- package/src/origami/image/resize.js +0 -3
- package/src/origami/inline.js +3 -8
- package/src/origami/json.js +2 -6
- package/src/origami/jsonKeys.js +4 -10
- package/src/origami/mdHtml.js +5 -5
- package/src/origami/once.js +3 -7
- package/src/origami/ori.js +5 -0
- package/src/origami/origami.js +1 -2
- package/src/origami/pack.js +0 -5
- package/src/origami/post.js +4 -3
- package/src/origami/rss.js +7 -8
- package/src/origami/sitemap.js +5 -7
- package/src/origami/static.js +5 -7
- package/src/origami/string.js +0 -4
- package/src/origami/unpack.js +0 -5
- package/src/protocols/explore.js +0 -2
- package/src/protocols/httpstree.js +0 -2
- package/src/protocols/httptree.js +0 -2
- package/src/protocols/package.js +2 -2
- package/src/server/constructResponse.js +2 -2
- package/src/server/server.js +2 -33
- package/src/common/ConstantTree.js +0 -18
- package/src/protocols/js.js +0 -13
- package/src/tree/addNextPrevious.js +0 -22
- package/src/tree/cache.js +0 -22
- package/src/tree/calendar.js +0 -1
- package/src/tree/clear.js +0 -19
- package/src/tree/concat.js +0 -17
- package/src/tree/constant.js +0 -1
- package/src/tree/deepMap.js +0 -32
- package/src/tree/deepMerge.js +0 -18
- package/src/tree/deepReverse.js +0 -23
- package/src/tree/deepTake.js +0 -26
- package/src/tree/deepValues.js +0 -22
- package/src/tree/defineds.js +0 -30
- package/src/tree/filter.js +0 -19
- package/src/tree/first.js +0 -19
- package/src/tree/fromFn.js +0 -29
- package/src/tree/globKeys.js +0 -19
- package/src/tree/group.js +0 -26
- package/src/tree/inners.js +0 -30
- package/src/tree/keys.js +0 -15
- package/src/tree/length.js +0 -15
- package/src/tree/map.d.ts +0 -11
- package/src/tree/map.js +0 -125
- package/src/tree/mask.js +0 -19
- package/src/tree/match.js +0 -79
- package/src/tree/merge.js +0 -41
- package/src/tree/paginate.js +0 -20
- package/src/tree/parent.js +0 -15
- package/src/tree/plain.js +0 -15
- package/src/tree/regExpKeys.js +0 -19
- package/src/tree/reverse.js +0 -17
- package/src/tree/setDeep.js +0 -49
- package/src/tree/shuffle.js +0 -57
- package/src/tree/sort.js +0 -52
- package/src/tree/take.js +0 -19
- package/src/tree/tree.js +0 -52
- package/src/tree/values.js +0 -15
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @typedef {import("@weborigami/types").AsyncTree} AsyncTree
|
|
3
|
-
* @implements {AsyncTree}
|
|
4
|
-
*/
|
|
5
|
-
export default class ConstantTree {
|
|
6
|
-
constructor(value) {
|
|
7
|
-
this.value = value;
|
|
8
|
-
this.parent = null;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
async get(key) {
|
|
12
|
-
return this.value;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
async keys() {
|
|
16
|
-
return [];
|
|
17
|
-
}
|
|
18
|
-
}
|
package/src/protocols/js.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { Tree } from "@weborigami/async-tree";
|
|
2
|
-
import { attachWarning, jsGlobals } from "@weborigami/language";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* @this {import("@weborigami/types").AsyncTree}
|
|
6
|
-
*/
|
|
7
|
-
export default async function js(...keys) {
|
|
8
|
-
const result = await Tree.traverseOrThrow.call(this, jsGlobals, ...keys);
|
|
9
|
-
return attachWarning(
|
|
10
|
-
result,
|
|
11
|
-
"The js:<name> protocol is deprecated. Drop the js: and just use <name> instead."
|
|
12
|
-
);
|
|
13
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { addNextPrevious, symbols } from "@weborigami/async-tree";
|
|
2
|
-
import getTreeArgument from "../common/getTreeArgument.js";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Add nextKey/previousKey properties to values.
|
|
6
|
-
*
|
|
7
|
-
* @typedef {import("@weborigami/types").AsyncTree} AsyncTree
|
|
8
|
-
*
|
|
9
|
-
* @this {AsyncTree|null}
|
|
10
|
-
* @param {import("@weborigami/async-tree").Treelike} treelike
|
|
11
|
-
*/
|
|
12
|
-
export default async function addNextPreviousBuiltin(treelike) {
|
|
13
|
-
const tree = await getTreeArgument(
|
|
14
|
-
this,
|
|
15
|
-
arguments,
|
|
16
|
-
treelike,
|
|
17
|
-
"addNextPrevious"
|
|
18
|
-
);
|
|
19
|
-
const result = await addNextPrevious(tree);
|
|
20
|
-
result[symbols.parent] = this;
|
|
21
|
-
return result;
|
|
22
|
-
}
|
package/src/tree/cache.js
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { Tree, cache } from "@weborigami/async-tree";
|
|
2
|
-
import assertTreeIsDefined from "../common/assertTreeIsDefined.js";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Caches tree values in a storable cache.
|
|
6
|
-
*
|
|
7
|
-
* @typedef {import("@weborigami/types").AsyncTree} AsyncTree
|
|
8
|
-
* @typedef {import("@weborigami/types").AsyncMutableTree} AsyncMutableTree
|
|
9
|
-
* @typedef {import("@weborigami/async-tree").Treelike} Treelike
|
|
10
|
-
* @param {Treelike} sourceTreelike
|
|
11
|
-
* @param {Treelike} [cacheTreelike]
|
|
12
|
-
* @this {AsyncTree|null}
|
|
13
|
-
*/
|
|
14
|
-
export default async function cacheBuiltin(sourceTreelike, cacheTreelike) {
|
|
15
|
-
assertTreeIsDefined(this, "cache");
|
|
16
|
-
/** @type {any} */
|
|
17
|
-
const cacheTree = cacheTreelike
|
|
18
|
-
? Tree.from(cacheTreelike, { parent: this })
|
|
19
|
-
: undefined;
|
|
20
|
-
const result = cache(sourceTreelike, cacheTree);
|
|
21
|
-
return result;
|
|
22
|
-
}
|
package/src/tree/calendar.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { calendarTree as default } from "@weborigami/async-tree";
|
package/src/tree/clear.js
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { Tree } from "@weborigami/async-tree";
|
|
2
|
-
import getTreeArgument from "../common/getTreeArgument.js";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* @typedef {import("@weborigami/types").AsyncTree} AsyncTree
|
|
6
|
-
*
|
|
7
|
-
* @this {AsyncTree|null}
|
|
8
|
-
* @param {import("@weborigami/async-tree").Treelike} treelike
|
|
9
|
-
*/
|
|
10
|
-
export default async function clear(treelike) {
|
|
11
|
-
const tree = await getTreeArgument(this, arguments, treelike, "clear");
|
|
12
|
-
if (!Tree.isAsyncMutableTree(tree)) {
|
|
13
|
-
throw new TypeError("clean: the given tree is read-only.");
|
|
14
|
-
}
|
|
15
|
-
const keys = Array.from(await tree.keys());
|
|
16
|
-
const promises = keys.map((key) => tree.set(key, undefined));
|
|
17
|
-
await Promise.all(promises);
|
|
18
|
-
return tree;
|
|
19
|
-
}
|
package/src/tree/concat.js
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { Tree } from "@weborigami/async-tree";
|
|
2
|
-
import { ops } from "@weborigami/language";
|
|
3
|
-
import assertTreeIsDefined from "../common/assertTreeIsDefined.js";
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Concatenate the text content of objects or trees.
|
|
7
|
-
*
|
|
8
|
-
* @typedef {import("@weborigami/types").AsyncTree} AsyncTree
|
|
9
|
-
*
|
|
10
|
-
* @this {AsyncTree|null}
|
|
11
|
-
* @param {any[]} args
|
|
12
|
-
*/
|
|
13
|
-
export default async function concat(...args) {
|
|
14
|
-
assertTreeIsDefined(this, "concat");
|
|
15
|
-
const tree = args.length === 0 ? this : Tree.from(args, { parent: this });
|
|
16
|
-
return ops.concat.call(this, tree);
|
|
17
|
-
}
|
package/src/tree/constant.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { constantTree as default } from "@weborigami/async-tree";
|
package/src/tree/deepMap.js
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { isPlainObject } from "@weborigami/async-tree";
|
|
2
|
-
import getTreeArgument from "../common/getTreeArgument.js";
|
|
3
|
-
import map from "./map.js";
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Shorthand for calling `map` with `deep: true` option.
|
|
7
|
-
*
|
|
8
|
-
* @typedef {import("@weborigami/types").AsyncTree} AsyncTree
|
|
9
|
-
* @typedef {import("@weborigami/async-tree").Treelike} Treelike
|
|
10
|
-
* @typedef {import("@weborigami/async-tree").ValueKeyFn} ValueKeyFn
|
|
11
|
-
* @typedef {import("./map.d.ts").TreeMapOptions} TreeMapOptions
|
|
12
|
-
*
|
|
13
|
-
* @this {AsyncTree|null}
|
|
14
|
-
* @param {Treelike} treelike
|
|
15
|
-
* @param {ValueKeyFn|TreeMapOptions} operation
|
|
16
|
-
*/
|
|
17
|
-
export default async function deepMap(treelike, operation) {
|
|
18
|
-
const tree = await getTreeArgument(
|
|
19
|
-
this,
|
|
20
|
-
arguments,
|
|
21
|
-
treelike,
|
|
22
|
-
"deepMap",
|
|
23
|
-
true
|
|
24
|
-
);
|
|
25
|
-
/** @type {TreeMapOptions} */
|
|
26
|
-
const options = isPlainObject(operation)
|
|
27
|
-
? // Dictionary
|
|
28
|
-
{ ...operation, deep: true }
|
|
29
|
-
: // Function
|
|
30
|
-
{ deep: true, value: operation };
|
|
31
|
-
return map.call(this, tree, options);
|
|
32
|
-
}
|
package/src/tree/deepMerge.js
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { deepMerge } from "@weborigami/async-tree";
|
|
2
|
-
import assertTreeIsDefined from "../common/assertTreeIsDefined.js";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Create a tree that's the result of deep merging the given trees.
|
|
6
|
-
*
|
|
7
|
-
* @typedef {import("@weborigami/types").AsyncTree} AsyncTree
|
|
8
|
-
* @typedef {import("@weborigami/async-tree").Treelike} Treelike
|
|
9
|
-
* @this {AsyncTree|null}
|
|
10
|
-
* @param {Treelike[]} trees
|
|
11
|
-
*/
|
|
12
|
-
export default async function treeDeepMerge(...trees) {
|
|
13
|
-
assertTreeIsDefined(this, "deepMerge");
|
|
14
|
-
// Merge the trees.
|
|
15
|
-
const result = deepMerge(...trees);
|
|
16
|
-
result.parent = this;
|
|
17
|
-
return result;
|
|
18
|
-
}
|
package/src/tree/deepReverse.js
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { deepReverse } from "@weborigami/async-tree";
|
|
2
|
-
import getTreeArgument from "../common/getTreeArgument.js";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Reverse the order of keys at all levels of the tree.
|
|
6
|
-
*
|
|
7
|
-
* @typedef {import("@weborigami/types").AsyncTree} AsyncTree
|
|
8
|
-
* @typedef {import("@weborigami/async-tree").Treelike} Treelike
|
|
9
|
-
*
|
|
10
|
-
* @this {AsyncTree|null}
|
|
11
|
-
* @param {Treelike} [treelike]
|
|
12
|
-
*/
|
|
13
|
-
export default async function deepReverseBuiltin(treelike) {
|
|
14
|
-
const tree = await getTreeArgument(
|
|
15
|
-
this,
|
|
16
|
-
arguments,
|
|
17
|
-
treelike,
|
|
18
|
-
"deepReverse",
|
|
19
|
-
true
|
|
20
|
-
);
|
|
21
|
-
const reversed = deepReverse(tree);
|
|
22
|
-
return reversed;
|
|
23
|
-
}
|
package/src/tree/deepTake.js
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { deepTake as deepTakeTransform } from "@weborigami/async-tree";
|
|
2
|
-
import getTreeArgument from "../common/getTreeArgument.js";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Returns a function that traverses a tree deeply and returns the values of the
|
|
6
|
-
* first `count` keys.
|
|
7
|
-
*
|
|
8
|
-
* @typedef {import("@weborigami/types").AsyncTree} AsyncTree
|
|
9
|
-
* @typedef {import("@weborigami/async-tree").Treelike} Treelike
|
|
10
|
-
*
|
|
11
|
-
* @this {AsyncTree|null}
|
|
12
|
-
* @param {Treelike} treelike
|
|
13
|
-
* @param {number} count
|
|
14
|
-
*/
|
|
15
|
-
export default async function deepTake(treelike, count) {
|
|
16
|
-
const tree = await getTreeArgument(
|
|
17
|
-
this,
|
|
18
|
-
arguments,
|
|
19
|
-
treelike,
|
|
20
|
-
"deepTake",
|
|
21
|
-
true
|
|
22
|
-
);
|
|
23
|
-
const taken = await deepTakeTransform(tree, count);
|
|
24
|
-
taken.parent = this;
|
|
25
|
-
return taken;
|
|
26
|
-
}
|
package/src/tree/deepValues.js
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { deepValues } from "@weborigami/async-tree";
|
|
2
|
-
import getTreeArgument from "../common/getTreeArgument.js";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Return the in-order exterior values of a tree as a flat array.
|
|
6
|
-
*
|
|
7
|
-
* @typedef {import("@weborigami/types").AsyncTree} AsyncTree
|
|
8
|
-
* @typedef {import("@weborigami/async-tree").Treelike} Treelike
|
|
9
|
-
*
|
|
10
|
-
* @this {AsyncTree|null}
|
|
11
|
-
* @param {Treelike} [treelike]
|
|
12
|
-
*/
|
|
13
|
-
export default async function deepValuesBuiltin(treelike) {
|
|
14
|
-
const tree = await getTreeArgument(
|
|
15
|
-
this,
|
|
16
|
-
arguments,
|
|
17
|
-
treelike,
|
|
18
|
-
"deepValues",
|
|
19
|
-
true
|
|
20
|
-
);
|
|
21
|
-
return deepValues(tree);
|
|
22
|
-
}
|
package/src/tree/defineds.js
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { Tree } from "@weborigami/async-tree";
|
|
2
|
-
import getTreeArgument from "../common/getTreeArgument.js";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Return only the defined (not `undefined`) values in the tree.
|
|
6
|
-
*
|
|
7
|
-
* @typedef {import("@weborigami/types").AsyncTree} AsyncTree
|
|
8
|
-
* @typedef {import("@weborigami/async-tree").Treelike} Treelike
|
|
9
|
-
*
|
|
10
|
-
* @this {AsyncTree|null}
|
|
11
|
-
* @param {Treelike} treelike
|
|
12
|
-
*/
|
|
13
|
-
export default async function defineds(treelike) {
|
|
14
|
-
const tree = await getTreeArgument(this, arguments, treelike, "defineds");
|
|
15
|
-
|
|
16
|
-
const result = await Tree.mapReduce(tree, null, async (values, keys) => {
|
|
17
|
-
const object = {};
|
|
18
|
-
let someValuesExist = false;
|
|
19
|
-
for (let i = 0; i < keys.length; i++) {
|
|
20
|
-
const value = values[i];
|
|
21
|
-
if (value != null) {
|
|
22
|
-
someValuesExist = true;
|
|
23
|
-
object[keys[i]] = values[i];
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
return someValuesExist ? object : null;
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
return result;
|
|
30
|
-
}
|
package/src/tree/filter.js
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { filter } from "@weborigami/async-tree";
|
|
2
|
-
import assertTreeIsDefined from "../common/assertTreeIsDefined.js";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Apply a filter to a tree
|
|
6
|
-
*
|
|
7
|
-
* @typedef {import("@weborigami/types").AsyncTree} AsyncTree
|
|
8
|
-
* @typedef {import("@weborigami/async-tree").Treelike} Treelike
|
|
9
|
-
*
|
|
10
|
-
* @this {AsyncTree|null}
|
|
11
|
-
* @param {Treelike} sourceTreelike
|
|
12
|
-
* @param {Treelike} filterTreelike
|
|
13
|
-
*/
|
|
14
|
-
export default async function filterBuiltin(sourceTreelike, filterTreelike) {
|
|
15
|
-
assertTreeIsDefined(this, "filter");
|
|
16
|
-
const result = filter(sourceTreelike, filterTreelike);
|
|
17
|
-
result.parent = this;
|
|
18
|
-
return result;
|
|
19
|
-
}
|
package/src/tree/first.js
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import getTreeArgument from "../common/getTreeArgument.js";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Return the first value in the tree.
|
|
5
|
-
*
|
|
6
|
-
* @typedef {import("@weborigami/types").AsyncTree} AsyncTree
|
|
7
|
-
* @typedef {import("@weborigami/async-tree").Treelike} Treelike
|
|
8
|
-
* @this {AsyncTree|null}
|
|
9
|
-
* @param {Treelike} [treelike]
|
|
10
|
-
*/
|
|
11
|
-
export default async function first(treelike) {
|
|
12
|
-
const tree = await getTreeArgument(this, arguments, treelike, "first");
|
|
13
|
-
for (const key of await tree.keys()) {
|
|
14
|
-
// Just return first value immediately.
|
|
15
|
-
const value = await tree.get(key);
|
|
16
|
-
return value;
|
|
17
|
-
}
|
|
18
|
-
return undefined;
|
|
19
|
-
}
|
package/src/tree/fromFn.js
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { FunctionTree, isUnpackable } from "@weborigami/async-tree";
|
|
2
|
-
import assertTreeIsDefined from "../common/assertTreeIsDefined.js";
|
|
3
|
-
import { toFunction } from "../common/utilities.js";
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Create a tree from a function and a set of keys.
|
|
7
|
-
*
|
|
8
|
-
* @typedef {import("@weborigami/types").AsyncTree} AsyncTree
|
|
9
|
-
* @typedef {import("@weborigami/async-tree").Treelike} Treelike
|
|
10
|
-
* @typedef {import("../../index.ts").Invocable} Invocable
|
|
11
|
-
*
|
|
12
|
-
* @this {AsyncTree|null}
|
|
13
|
-
* @param {Invocable} [invocable]
|
|
14
|
-
*/
|
|
15
|
-
export default async function fromFn(invocable, keys = []) {
|
|
16
|
-
assertTreeIsDefined(this, "fromFn");
|
|
17
|
-
if (invocable === undefined) {
|
|
18
|
-
throw new Error(
|
|
19
|
-
"An Origami function was called with an initial argument, but its value is undefined."
|
|
20
|
-
);
|
|
21
|
-
}
|
|
22
|
-
const fn = toFunction(invocable);
|
|
23
|
-
if (isUnpackable(keys)) {
|
|
24
|
-
keys = await keys.unpack();
|
|
25
|
-
}
|
|
26
|
-
const tree = new FunctionTree(fn, keys);
|
|
27
|
-
tree.parent = this;
|
|
28
|
-
return tree;
|
|
29
|
-
}
|
package/src/tree/globKeys.js
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { setParent } from "@weborigami/async-tree";
|
|
2
|
-
import globKeys from "@weborigami/async-tree/src/operations/globKeys.js";
|
|
3
|
-
import assertTreeIsDefined from "../common/assertTreeIsDefined.js";
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Define a tree whose keys are globs.
|
|
7
|
-
*
|
|
8
|
-
* @typedef {import("@weborigami/types").AsyncTree} AsyncTree
|
|
9
|
-
* @typedef {import("@weborigami/async-tree").Treelike} Treelike
|
|
10
|
-
*
|
|
11
|
-
* @param {Treelike} tree
|
|
12
|
-
* @this {AsyncTree|null}
|
|
13
|
-
*/
|
|
14
|
-
export default async function globKeysBuiltin(tree) {
|
|
15
|
-
assertTreeIsDefined(this, "globs");
|
|
16
|
-
const result = globKeys(tree);
|
|
17
|
-
setParent(this, result);
|
|
18
|
-
return result;
|
|
19
|
-
}
|
package/src/tree/group.js
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { group as groupTransform } from "@weborigami/async-tree";
|
|
2
|
-
import getTreeArgument from "../common/getTreeArgument.js";
|
|
3
|
-
import { toFunction } from "../common/utilities.js";
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Map a tree to a new tree with the values from the original tree grouped by
|
|
7
|
-
* the given function.
|
|
8
|
-
*
|
|
9
|
-
* @typedef {import("@weborigami/types").AsyncTree} AsyncTree
|
|
10
|
-
*
|
|
11
|
-
* @this {AsyncTree|null}
|
|
12
|
-
* @param {import("@weborigami/async-tree").Treelike} treelike
|
|
13
|
-
* @param {import("../../index.ts").Invocable} groupKey
|
|
14
|
-
*/
|
|
15
|
-
export default async function groupBuiltin(treelike, groupKey) {
|
|
16
|
-
const tree = await getTreeArgument(this, arguments, treelike, "group");
|
|
17
|
-
|
|
18
|
-
const groupKeyFn = toFunction(groupKey);
|
|
19
|
-
// Have the group key function run in this tree.
|
|
20
|
-
const extendedGroupKeyFn = groupKeyFn.bind(tree);
|
|
21
|
-
|
|
22
|
-
// @ts-ignore
|
|
23
|
-
const grouped = await groupTransform(tree, extendedGroupKeyFn);
|
|
24
|
-
grouped.parent = tree;
|
|
25
|
-
return grouped;
|
|
26
|
-
}
|
package/src/tree/inners.js
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { trailingSlash, Tree } from "@weborigami/async-tree";
|
|
2
|
-
import getTreeArgument from "../common/getTreeArgument.js";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Return the interior nodes of the tree. This relies on subtree keys having
|
|
6
|
-
* trailing slashes.
|
|
7
|
-
*
|
|
8
|
-
* @typedef {import("@weborigami/types").AsyncTree} AsyncTree
|
|
9
|
-
* @typedef {import("@weborigami/async-tree").Treelike} Treelike
|
|
10
|
-
* @this {AsyncTree|null}
|
|
11
|
-
* @param {Treelike} [treelike]
|
|
12
|
-
*/
|
|
13
|
-
export default async function inners(treelike) {
|
|
14
|
-
const tree = await getTreeArgument(this, arguments, treelike, "inners");
|
|
15
|
-
|
|
16
|
-
const result = {
|
|
17
|
-
async get(key) {
|
|
18
|
-
const value = await tree.get(key);
|
|
19
|
-
return Tree.isAsyncTree(value) ? inners.call(this, value) : undefined;
|
|
20
|
-
},
|
|
21
|
-
|
|
22
|
-
async keys() {
|
|
23
|
-
const keys = [...(await tree.keys())];
|
|
24
|
-
const subtreeKeys = keys.filter(trailingSlash.has);
|
|
25
|
-
return subtreeKeys;
|
|
26
|
-
},
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
return result;
|
|
30
|
-
}
|
package/src/tree/keys.js
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import getTreeArgument from "../common/getTreeArgument.js";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Return the top-level keys in the tree as an array.
|
|
5
|
-
*
|
|
6
|
-
* @typedef {import("@weborigami/types").AsyncTree} AsyncTree
|
|
7
|
-
* @typedef {import("@weborigami/async-tree").Treelike} Treelike
|
|
8
|
-
* @this {AsyncTree|null}
|
|
9
|
-
* @param {Treelike} [treelike]
|
|
10
|
-
*/
|
|
11
|
-
export default async function keys(treelike) {
|
|
12
|
-
const tree = await getTreeArgument(this, arguments, treelike, "keys");
|
|
13
|
-
const keys = await tree.keys();
|
|
14
|
-
return Array.from(keys);
|
|
15
|
-
}
|
package/src/tree/length.js
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import getTreeArgument from "../common/getTreeArgument.js";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Return the number of keys in the tree.
|
|
5
|
-
*
|
|
6
|
-
* @typedef {import("@weborigami/types").AsyncTree} AsyncTree
|
|
7
|
-
* @typedef {import("@weborigami/async-tree").Treelike} Treelike
|
|
8
|
-
* @this {AsyncTree|null}
|
|
9
|
-
* @param {Treelike} [treelike]
|
|
10
|
-
*/
|
|
11
|
-
export default async function length(treelike) {
|
|
12
|
-
const tree = await getTreeArgument(this, arguments, treelike, "length");
|
|
13
|
-
const keys = Array.from(await tree.keys());
|
|
14
|
-
return keys.length;
|
|
15
|
-
}
|
package/src/tree/map.d.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { TreeMapOptions as AsyncTreeMapOptions, Treelike, ValueKeyFn } from "@weborigami/async-tree";
|
|
2
|
-
import { AsyncTree } from "@weborigami/types";
|
|
3
|
-
|
|
4
|
-
/* Add more properties to TreeMapOptions */
|
|
5
|
-
type TreeMapOptions = AsyncTreeMapOptions &{
|
|
6
|
-
description?: string;
|
|
7
|
-
extension?: string;
|
|
8
|
-
needsSourceValue?: boolean;
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
export default function treeMap(treelike: Treelike, options: ValueKeyFn | TreeMapOptions): AsyncTree;
|
package/src/tree/map.js
DELETED
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
isPlainObject,
|
|
3
|
-
isUnpackable,
|
|
4
|
-
map as mapTransform,
|
|
5
|
-
} from "@weborigami/async-tree";
|
|
6
|
-
import getTreeArgument from "../common/getTreeArgument.js";
|
|
7
|
-
import { toFunction } from "../common/utilities.js";
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Map a hierarchical tree of keys and values to a new tree of keys and values.
|
|
11
|
-
*
|
|
12
|
-
* @typedef {import("@weborigami/types").AsyncTree} AsyncTree
|
|
13
|
-
* @typedef {import("@weborigami/async-tree").Treelike} Treelike
|
|
14
|
-
* @typedef {import("@weborigami/async-tree").ValueKeyFn} ValueKeyFn
|
|
15
|
-
* @typedef {import("./map.js").TreeMapOptions} TreeMapOptions
|
|
16
|
-
*
|
|
17
|
-
* @this {AsyncTree|null}
|
|
18
|
-
* @param {Treelike} treelike
|
|
19
|
-
* @param {ValueKeyFn|TreeMapOptions} operation
|
|
20
|
-
*/
|
|
21
|
-
export default async function map(treelike, operation) {
|
|
22
|
-
if (isUnpackable(operation)) {
|
|
23
|
-
operation = await operation.unpack();
|
|
24
|
-
}
|
|
25
|
-
// The tree in which the map operation happens
|
|
26
|
-
const context = this;
|
|
27
|
-
const options = extendedOptions(context, operation);
|
|
28
|
-
|
|
29
|
-
// The tree we're going to map
|
|
30
|
-
const source = await getTreeArgument(
|
|
31
|
-
this,
|
|
32
|
-
arguments,
|
|
33
|
-
treelike,
|
|
34
|
-
"map",
|
|
35
|
-
options?.deep
|
|
36
|
-
);
|
|
37
|
-
|
|
38
|
-
const mapped = mapTransform(source, options);
|
|
39
|
-
mapped.parent = context;
|
|
40
|
-
return mapped;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Return a function that transforms a tree of keys and values to a new tree of
|
|
45
|
-
* keys and values.
|
|
46
|
-
*
|
|
47
|
-
* @param {AsyncTree|null} context
|
|
48
|
-
* @param {ValueKeyFn|TreeMapOptions} operation
|
|
49
|
-
*/
|
|
50
|
-
function extendedOptions(context, operation) {
|
|
51
|
-
// Identify whether the map instructions take the form of a value function or
|
|
52
|
-
// a dictionary of options.
|
|
53
|
-
/** @type {TreeMapOptions} */
|
|
54
|
-
let options;
|
|
55
|
-
/** @type {ValueKeyFn|undefined} */
|
|
56
|
-
let valueFn;
|
|
57
|
-
if (isPlainObject(operation)) {
|
|
58
|
-
// @ts-ignore
|
|
59
|
-
options = operation;
|
|
60
|
-
if (`value` in options && !options.value) {
|
|
61
|
-
throw new TypeError(`map: The value function is not defined.`);
|
|
62
|
-
}
|
|
63
|
-
valueFn = options?.value;
|
|
64
|
-
} else if (
|
|
65
|
-
typeof operation === "function" ||
|
|
66
|
-
typeof (/** @type {any} */ (operation)?.unpack) === "function"
|
|
67
|
-
) {
|
|
68
|
-
valueFn = operation;
|
|
69
|
-
options = {};
|
|
70
|
-
} else if (operation === undefined) {
|
|
71
|
-
/** @type {any} */
|
|
72
|
-
const error = new TypeError(`map: The second parameter was undefined.`);
|
|
73
|
-
error.position = 1;
|
|
74
|
-
throw error;
|
|
75
|
-
} else {
|
|
76
|
-
throw new TypeError(
|
|
77
|
-
`map: You must specify a value function or options dictionary as the second parameter.`
|
|
78
|
-
);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
const { deep, extension, needsSourceValue } = options;
|
|
82
|
-
const description = options.description ?? `map ${extension ?? ""}`;
|
|
83
|
-
let keyFn = options.key;
|
|
84
|
-
let inverseKeyFn = options.inverseKey;
|
|
85
|
-
|
|
86
|
-
if (valueFn) {
|
|
87
|
-
// @ts-ignore
|
|
88
|
-
valueFn = toFunction(valueFn);
|
|
89
|
-
// By default, run the value function in the context of this tree so that
|
|
90
|
-
// Origami builtins can be used as value functions.
|
|
91
|
-
// @ts-ignore
|
|
92
|
-
const bound = valueFn.bind(context);
|
|
93
|
-
// Transfer sidecar functions
|
|
94
|
-
// @ts-ignore
|
|
95
|
-
Object.assign(bound, valueFn);
|
|
96
|
-
valueFn = bound;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
if (!extension) {
|
|
100
|
-
if (keyFn) {
|
|
101
|
-
// Extend the key function to include a value parameter
|
|
102
|
-
keyFn = extendKeyFn(keyFn);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
return {
|
|
107
|
-
deep,
|
|
108
|
-
description,
|
|
109
|
-
extension,
|
|
110
|
-
inverseKey: inverseKeyFn,
|
|
111
|
-
key: keyFn,
|
|
112
|
-
needsSourceValue,
|
|
113
|
-
value: valueFn,
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
// Extend the key function to include a value parameter
|
|
118
|
-
function extendKeyFn(keyFn) {
|
|
119
|
-
keyFn = toFunction(keyFn);
|
|
120
|
-
return async function keyWithValueFn(sourceKey, sourceTree) {
|
|
121
|
-
const sourceValue = await sourceTree.get(sourceKey);
|
|
122
|
-
const resultKey = await keyFn(sourceValue, sourceKey, sourceTree);
|
|
123
|
-
return resultKey;
|
|
124
|
-
};
|
|
125
|
-
}
|
package/src/tree/mask.js
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { mask } from "@weborigami/async-tree";
|
|
2
|
-
import assertTreeIsDefined from "../common/assertTreeIsDefined.js";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Apply a mask to a tree
|
|
6
|
-
*
|
|
7
|
-
* @typedef {import("@weborigami/types").AsyncTree} AsyncTree
|
|
8
|
-
* @typedef {import("@weborigami/async-tree").Treelike} Treelike
|
|
9
|
-
*
|
|
10
|
-
* @this {AsyncTree|null}
|
|
11
|
-
* @param {Treelike} sourceTreelike
|
|
12
|
-
* @param {Treelike} maskTreelike
|
|
13
|
-
*/
|
|
14
|
-
export default async function maskBuiltin(sourceTreelike, maskTreelike) {
|
|
15
|
-
assertTreeIsDefined(this, "mask");
|
|
16
|
-
const result = mask(sourceTreelike, maskTreelike);
|
|
17
|
-
result.parent = this;
|
|
18
|
-
return result;
|
|
19
|
-
}
|