@weborigami/origami 0.0.41 → 0.0.43
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/exports/buildExports.js +1 -1
- package/exports/exports.js +32 -34
- package/package.json +4 -4
- package/src/builtins/@arrows.js +1 -1
- package/src/builtins/@builtins.js +2 -5
- package/src/builtins/@cache.js +1 -1
- package/src/builtins/{@tree/concat.js → @concat.js} +3 -3
- package/src/builtins/@copy.js +2 -2
- package/src/builtins/{@tree/count.js → @count.js} +3 -3
- package/src/builtins/@crawl.js +1 -1
- package/src/builtins/@debug.js +1 -1
- package/src/builtins/{@tree/defineds.js → @defineds.js} +2 -2
- package/src/builtins/@document.js +1 -1
- package/src/builtins/{@tree/exceptions.js → @exceptions.js} +4 -4
- package/src/builtins/@explore.js +2 -5
- package/src/builtins/@files.js +1 -1
- package/src/builtins/@filter.js +1 -1
- package/src/builtins/{@tree/first.js → @first.js} +3 -3
- package/src/builtins/{@tree/fn.js → @fnTree.js} +7 -7
- package/src/builtins/@globs.js +1 -1
- package/src/builtins/{@tree/groupBy.js → @groupBy.js} +6 -6
- package/src/builtins/@help.js +1 -1
- package/src/builtins/@http.js +1 -1
- package/src/builtins/@https.js +1 -1
- package/src/builtins/@if.js +1 -1
- package/src/builtins/@image/format.js +36 -2
- package/src/builtins/@image/resize.js +32 -2
- package/src/builtins/@index.js +1 -1
- package/src/builtins/@inherited.js +1 -1
- package/src/builtins/@inline.js +2 -2
- package/src/builtins/{@tree/inners.js → @inners.js} +3 -3
- package/src/builtins/@invoke.js +1 -1
- package/src/builtins/{@tree/isAsyncTree.js → @isAsyncTree.js} +1 -1
- package/src/builtins/@json.js +1 -1
- package/src/builtins/{@tree/keys.js → @keys.js} +3 -3
- package/src/builtins/{@tree/keysJson.js → @keysJson.js} +3 -3
- package/src/builtins/@loaders/ori.js +18 -18
- package/src/builtins/@map.js +13 -1
- package/src/builtins/@match.js +1 -1
- package/src/builtins/{@tree/merge.js → @merge.js} +2 -2
- package/src/builtins/{@tree/mergeDeep.js → @mergeDeep.js} +3 -3
- package/src/builtins/@once.js +1 -1
- package/src/builtins/@ori.js +1 -1
- package/src/builtins/@pack.js +1 -1
- package/src/builtins/{@tree/parent.js → @parent.js} +3 -3
- package/src/builtins/{@tree/paths.js → @paths.js} +3 -3
- package/src/builtins/@perf.js +18 -0
- package/src/builtins/{@tree/plain.js → @plain.js} +3 -3
- package/src/builtins/@project.js +1 -1
- package/src/builtins/@redirect.js +8 -0
- package/src/builtins/{@tree/reverse.js → @reverse.js} +3 -3
- package/src/builtins/@rss.js +1 -1
- package/src/builtins/@scope/extend.js +6 -6
- package/src/builtins/@scope/get.js +1 -1
- package/src/builtins/@scope/set.js +4 -4
- package/src/builtins/@serve.js +1 -1
- package/src/builtins/{@tree/setDeep.js → @setDeep.js} +1 -1
- package/src/builtins/{@tree/shuffle.js → @shuffle.js} +5 -5
- package/src/builtins/{@tree/sitemap.js → @sitemap.js} +8 -8
- package/src/builtins/{@tree/sort.js → @sort.js} +4 -4
- package/src/builtins/{@tree/sortBy.js → @sortBy.js} +6 -6
- package/src/builtins/{@tree/static.js → @static.js} +5 -5
- package/src/builtins/@svg.js +2 -2
- package/src/builtins/{@tree/table.js → @table.js} +3 -3
- package/src/builtins/{@tree/take.js → @take.js} +3 -3
- package/src/builtins/{@tree/from.js → @tree.js} +3 -3
- package/src/builtins/@treeHttp.js +1 -1
- package/src/builtins/@treeHttps.js +1 -1
- package/src/builtins/@unpack.js +1 -1
- package/src/builtins/{@tree/values.js → @values.js} +3 -3
- package/src/builtins/{@tree/valuesDeep.js → @valuesDeep.js} +3 -3
- package/src/builtins/@watch.js +1 -1
- package/src/builtins/@with.js +1 -1
- package/src/builtins/@yaml.js +1 -1
- package/src/builtins/{@tree/map.d.ts → map.d.ts} +1 -1
- package/src/cli/cli.js +2 -15
- package/src/common/ExplorableSiteTransform.js +6 -4
- package/src/misc/assertScopeIsDefined.js +2 -2
- package/src/misc/explore.ori +4 -4
- package/src/misc/getTreeArgument.js +16 -6
- package/src/{builtins/@tree/dot.js → misc/treeDot.js} +8 -8
- package/src/server/constructResponse.js +126 -0
- package/src/server/mediaTypes.js +0 -16
- package/src/server/server.js +62 -131
- package/src/builtins/@tree/flowSvg.js +0 -55
- package/src/builtins/@tree/fromJson.js +0 -6
- package/src/builtins/@tree/fromYaml.js +0 -24
- package/src/builtins/@tree/nextKey.js +0 -29
- package/src/builtins/@tree/previousKey.js +0 -29
package/src/builtins/@inline.js
CHANGED
|
@@ -4,7 +4,7 @@ import assertScopeIsDefined from "../misc/assertScopeIsDefined.js";
|
|
|
4
4
|
import unpackOrigamiExpression from "./@loaders/ori.js";
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
|
-
* Inline any Origami expressions found inside {
|
|
7
|
+
* Inline any Origami expressions found inside ${...} placeholders in the input
|
|
8
8
|
* text.
|
|
9
9
|
*
|
|
10
10
|
* @typedef {import("@weborigami/types").AsyncTree} AsyncTree
|
|
@@ -14,7 +14,7 @@ import unpackOrigamiExpression from "./@loaders/ori.js";
|
|
|
14
14
|
* @param {StringLike} input
|
|
15
15
|
*/
|
|
16
16
|
export default async function inline(input) {
|
|
17
|
-
assertScopeIsDefined(this);
|
|
17
|
+
assertScopeIsDefined(this, "inline");
|
|
18
18
|
|
|
19
19
|
// Get the input text and any attached front matter.
|
|
20
20
|
let inputDocument;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Tree } from "@weborigami/async-tree";
|
|
2
2
|
import { Scope } from "@weborigami/language";
|
|
3
|
-
import getTreeArgument from "
|
|
3
|
+
import getTreeArgument from "../misc/getTreeArgument.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Return the source nodes of the tree: the nodes with children.
|
|
@@ -11,7 +11,7 @@ import getTreeArgument from "../../misc/getTreeArgument.js";
|
|
|
11
11
|
* @param {Treelike} [treelike]
|
|
12
12
|
*/
|
|
13
13
|
export default async function inners(treelike) {
|
|
14
|
-
const tree = await getTreeArgument(this, arguments, treelike);
|
|
14
|
+
const tree = await getTreeArgument(this, arguments, treelike, "@inners");
|
|
15
15
|
|
|
16
16
|
/** @type {AsyncTree} */
|
|
17
17
|
let result = {
|
|
@@ -35,5 +35,5 @@ export default async function inners(treelike) {
|
|
|
35
35
|
return result;
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
-
inners.usage =
|
|
38
|
+
inners.usage = `@inners <tree>\tThe source nodes of the tree`;
|
|
39
39
|
inners.documentation = "https://weborigami.org/cli/builtins.html#inners";
|
package/src/builtins/@invoke.js
CHANGED
|
@@ -23,7 +23,7 @@ import builtins from "./@builtins.js";
|
|
|
23
23
|
* @this {import("@weborigami/types").AsyncTree|null}
|
|
24
24
|
*/
|
|
25
25
|
export default async function invoke(fn) {
|
|
26
|
-
assertScopeIsDefined(this);
|
|
26
|
+
assertScopeIsDefined(this, "invoke");
|
|
27
27
|
// A fragment of the logic from getTreeArgument.js
|
|
28
28
|
if (arguments.length > 0 && fn === undefined) {
|
|
29
29
|
throw new Error(
|
|
@@ -12,6 +12,6 @@ export default function isAsyncTree(value) {
|
|
|
12
12
|
return Tree.isAsyncTree(value);
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
isAsyncTree.usage = `@
|
|
15
|
+
isAsyncTree.usage = `@isAsyncTree <value>\tReturn true for an async tree`;
|
|
16
16
|
isAsyncTree.documentation =
|
|
17
17
|
"https://weborigami.org/cli/builtins.html#isAsyncTree";
|
package/src/builtins/@json.js
CHANGED
|
@@ -9,7 +9,7 @@ import assertScopeIsDefined from "../misc/assertScopeIsDefined.js";
|
|
|
9
9
|
* @param {any} [obj]
|
|
10
10
|
*/
|
|
11
11
|
export default async function json(obj) {
|
|
12
|
-
assertScopeIsDefined(this);
|
|
12
|
+
assertScopeIsDefined(this, "json");
|
|
13
13
|
// A fragment of the logic from getTreeArgument.js
|
|
14
14
|
if (arguments.length > 0 && obj === undefined) {
|
|
15
15
|
throw new Error(
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import getTreeArgument from "
|
|
1
|
+
import getTreeArgument from "../misc/getTreeArgument.js";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Return the top-level keys in the tree as an array.
|
|
@@ -9,10 +9,10 @@ import getTreeArgument from "../../misc/getTreeArgument.js";
|
|
|
9
9
|
* @param {Treelike} [treelike]
|
|
10
10
|
*/
|
|
11
11
|
export default async function keys(treelike) {
|
|
12
|
-
const tree = await getTreeArgument(this, arguments, treelike);
|
|
12
|
+
const tree = await getTreeArgument(this, arguments, treelike, "@keys");
|
|
13
13
|
const keys = await tree.keys();
|
|
14
14
|
return Array.from(keys);
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
keys.usage =
|
|
17
|
+
keys.usage = `@keys <tree>\tThe top-level keys in the tree`;
|
|
18
18
|
keys.documentation = "https://weborigami.org/cli/builtins.html#keys";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Tree, keysJson } from "@weborigami/async-tree";
|
|
2
2
|
import { Scope } from "@weborigami/language";
|
|
3
|
-
import { transformObject } from "
|
|
4
|
-
import getTreeArgument from "
|
|
3
|
+
import { transformObject } from "../common/utilities.js";
|
|
4
|
+
import getTreeArgument from "../misc/getTreeArgument.js";
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Expose .keys.json for a tree.
|
|
@@ -12,7 +12,7 @@ import getTreeArgument from "../../misc/getTreeArgument.js";
|
|
|
12
12
|
* @param {Treelike} treelike
|
|
13
13
|
*/
|
|
14
14
|
export default async function treeKeysJson(treelike) {
|
|
15
|
-
const tree = await getTreeArgument(this, arguments, treelike);
|
|
15
|
+
const tree = await getTreeArgument(this, arguments, treelike, "@keysJson");
|
|
16
16
|
let result = transformObject(KeysJsonTransform, tree);
|
|
17
17
|
result = Scope.treeWithScope(result, this);
|
|
18
18
|
return result;
|
|
@@ -17,27 +17,27 @@ export default async function unpackOrigamiExpression(
|
|
|
17
17
|
options.parent ??
|
|
18
18
|
/** @type {any} */ (inputDocument).parent ??
|
|
19
19
|
/** @type {any} */ (inputDocument)[utilities.parentSymbol];
|
|
20
|
-
const compiler = options.compiler ?? compile.expression;
|
|
21
20
|
|
|
22
|
-
//
|
|
23
|
-
const
|
|
24
|
-
let
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
if (options.key) {
|
|
30
|
-
location += `${options.key}`;
|
|
31
|
-
}
|
|
32
|
-
if (error.location) {
|
|
33
|
-
const { start } = error.location;
|
|
34
|
-
location += `, line ${start.line}, column ${start.column}`;
|
|
35
|
-
}
|
|
36
|
-
if (location) {
|
|
37
|
-
error.message += ` (${location})`;
|
|
21
|
+
// Construct an object to represent the source code.
|
|
22
|
+
const sourceName = options.key;
|
|
23
|
+
let url;
|
|
24
|
+
if (sourceName && parent?.url) {
|
|
25
|
+
let parentHref = parent.url.href;
|
|
26
|
+
if (!parentHref.endsWith("/")) {
|
|
27
|
+
parentHref += "/";
|
|
38
28
|
}
|
|
39
|
-
|
|
29
|
+
url = new URL(sourceName, parentHref);
|
|
40
30
|
}
|
|
31
|
+
|
|
32
|
+
const source = {
|
|
33
|
+
text: utilities.toString(inputDocument),
|
|
34
|
+
name: options.key,
|
|
35
|
+
url,
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
// Compile the source code as an Origami expression and evaluate it.
|
|
39
|
+
const compiler = options.compiler ?? compile.expression;
|
|
40
|
+
const fn = compiler(source);
|
|
41
41
|
const parentScope = parent ? Scope.getScope(parent) : builtins;
|
|
42
42
|
let content = await fn.call(parentScope);
|
|
43
43
|
|
package/src/builtins/@map.js
CHANGED
|
@@ -47,8 +47,16 @@ export default function treeMap(param1, param2) {
|
|
|
47
47
|
// or the second.
|
|
48
48
|
let source;
|
|
49
49
|
let options;
|
|
50
|
-
if (
|
|
50
|
+
if (arguments.length === 0) {
|
|
51
|
+
throw new TypeError(
|
|
52
|
+
`@map: You must give @map a function or a dictionary of options.`
|
|
53
|
+
);
|
|
54
|
+
} else if (!param1) {
|
|
55
|
+
throw new TypeError(`@map: The first argument was undefined.`);
|
|
56
|
+
} else if (arguments.length === 1) {
|
|
51
57
|
options = param1;
|
|
58
|
+
} else if (!param2) {
|
|
59
|
+
throw new TypeError(`@map: The second argument was undefined.`);
|
|
52
60
|
} else {
|
|
53
61
|
source = param1;
|
|
54
62
|
options = param2;
|
|
@@ -63,6 +71,10 @@ export default function treeMap(param1, param2) {
|
|
|
63
71
|
) {
|
|
64
72
|
valueMap = options;
|
|
65
73
|
options = {};
|
|
74
|
+
} else if (!options) {
|
|
75
|
+
throw new TypeError(
|
|
76
|
+
`@map: You must specify a valueMap function or options dictionary.`
|
|
77
|
+
);
|
|
66
78
|
} else {
|
|
67
79
|
valueMap = options.valueMap;
|
|
68
80
|
}
|
package/src/builtins/@match.js
CHANGED
|
@@ -26,7 +26,7 @@ import assertScopeIsDefined from "../misc/assertScopeIsDefined.js";
|
|
|
26
26
|
* @this {AsyncTree|null}
|
|
27
27
|
*/
|
|
28
28
|
export default function match(pattern, resultFn, keys = []) {
|
|
29
|
-
assertScopeIsDefined(this);
|
|
29
|
+
assertScopeIsDefined(this, "match");
|
|
30
30
|
let regex;
|
|
31
31
|
if (typeof pattern === "string") {
|
|
32
32
|
// Convert the simple pattern format into a regular expression.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { merge } from "@weborigami/async-tree";
|
|
2
2
|
import { Scope } from "@weborigami/language";
|
|
3
|
-
import assertScopeIsDefined from "
|
|
3
|
+
import assertScopeIsDefined from "../misc/assertScopeIsDefined.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Create a tree that's the result of merging the given trees.
|
|
@@ -12,7 +12,7 @@ import assertScopeIsDefined from "../../misc/assertScopeIsDefined.js";
|
|
|
12
12
|
* @param {(Treelike|null)[]} trees
|
|
13
13
|
*/
|
|
14
14
|
export default async function treeMerge(...trees) {
|
|
15
|
-
assertScopeIsDefined(this);
|
|
15
|
+
assertScopeIsDefined(this, "merge");
|
|
16
16
|
|
|
17
17
|
// Filter out null or undefined trees.
|
|
18
18
|
/** @type {Treelike[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { mergeDeep } from "@weborigami/async-tree";
|
|
2
2
|
import { Scope } from "@weborigami/language";
|
|
3
|
-
import assertScopeIsDefined from "
|
|
3
|
+
import assertScopeIsDefined from "../misc/assertScopeIsDefined.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Create a tree that's the result of deep merging the given trees.
|
|
@@ -11,7 +11,7 @@ import assertScopeIsDefined from "../../misc/assertScopeIsDefined.js";
|
|
|
11
11
|
* @param {Treelike[]} trees
|
|
12
12
|
*/
|
|
13
13
|
export default async function treeMergeDeep(...trees) {
|
|
14
|
-
assertScopeIsDefined(this);
|
|
14
|
+
assertScopeIsDefined(this, "mergeDeep");
|
|
15
15
|
// Filter out null or undefined trees.
|
|
16
16
|
const filtered = trees.filter((tree) => tree);
|
|
17
17
|
|
|
@@ -39,6 +39,6 @@ export default async function treeMergeDeep(...trees) {
|
|
|
39
39
|
return result;
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
-
treeMergeDeep.usage =
|
|
42
|
+
treeMergeDeep.usage = `@mergeDeep <...trees>\tMerge the given trees deeply`;
|
|
43
43
|
treeMergeDeep.documentation =
|
|
44
44
|
"https://weborigami.org/cli/builtins.html#mergeDeep";
|
package/src/builtins/@once.js
CHANGED
package/src/builtins/@ori.js
CHANGED
package/src/builtins/@pack.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import getTreeArgument from "
|
|
1
|
+
import getTreeArgument from "../misc/getTreeArgument.js";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Returns the parent of the current tree.
|
|
@@ -10,9 +10,9 @@ import getTreeArgument from "../../misc/getTreeArgument.js";
|
|
|
10
10
|
* @param {Treelike} [treelike]
|
|
11
11
|
*/
|
|
12
12
|
export default async function parent(treelike) {
|
|
13
|
-
const tree = await getTreeArgument(this, arguments, treelike);
|
|
13
|
+
const tree = await getTreeArgument(this, arguments, treelike, "@parent");
|
|
14
14
|
return tree.parent;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
parent.usage =
|
|
17
|
+
parent.usage = `@parent\tThe parent of the current tree`;
|
|
18
18
|
parent.documentation = "https://weborigami.org/cli/builtins.html#parent";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Tree } from "@weborigami/async-tree";
|
|
2
|
-
import getTreeArgument from "
|
|
2
|
+
import getTreeArgument from "../misc/getTreeArgument.js";
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Return an array of paths to the values in the tree.
|
|
@@ -12,7 +12,7 @@ import getTreeArgument from "../../misc/getTreeArgument.js";
|
|
|
12
12
|
* @param {string} [prefix]
|
|
13
13
|
*/
|
|
14
14
|
export default async function paths(treelike, prefix = "") {
|
|
15
|
-
const tree = await getTreeArgument(this, arguments, treelike);
|
|
15
|
+
const tree = await getTreeArgument(this, arguments, treelike, "@paths");
|
|
16
16
|
const result = [];
|
|
17
17
|
for (const key of await tree.keys()) {
|
|
18
18
|
const valuePath = prefix ? `${prefix}/${key}` : key;
|
|
@@ -27,4 +27,4 @@ export default async function paths(treelike, prefix = "") {
|
|
|
27
27
|
return result;
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
paths.usage =
|
|
30
|
+
paths.usage = `@paths(tree)\tReturn an array of paths to the values in the tree`;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import assertScopeIsDefined from "../misc/assertScopeIsDefined.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Return the number of milliseconds required to execute the given function the
|
|
5
|
+
* specified number of times.
|
|
6
|
+
*
|
|
7
|
+
* @this {import("@weborigami/types").AsyncTree|null}
|
|
8
|
+
* @param {Function} fn
|
|
9
|
+
*/
|
|
10
|
+
export default async function perf(fn, count = 10000) {
|
|
11
|
+
assertScopeIsDefined(this, "perf");
|
|
12
|
+
const start = performance.now();
|
|
13
|
+
for (let i = 0; i < count; i++) {
|
|
14
|
+
await fn.call(this);
|
|
15
|
+
}
|
|
16
|
+
const end = performance.now();
|
|
17
|
+
return end - start;
|
|
18
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Tree } from "@weborigami/async-tree";
|
|
2
|
-
import getTreeArgument from "
|
|
2
|
+
import getTreeArgument from "../misc/getTreeArgument.js";
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Return the interior nodes of the tree.
|
|
@@ -10,9 +10,9 @@ import getTreeArgument from "../../misc/getTreeArgument.js";
|
|
|
10
10
|
* @param {Treelike} [treelike]
|
|
11
11
|
*/
|
|
12
12
|
export default async function plain(treelike) {
|
|
13
|
-
const tree = await getTreeArgument(this, arguments, treelike);
|
|
13
|
+
const tree = await getTreeArgument(this, arguments, treelike, "@plain");
|
|
14
14
|
return Tree.plain(tree);
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
plain.usage =
|
|
17
|
+
plain.usage = `@plain <tree>\tA plain JavaScript object representation of the tree`;
|
|
18
18
|
plain.documentation = "https://weborigami.org/cli/builtins.html#plain";
|
package/src/builtins/@project.js
CHANGED
|
@@ -21,7 +21,7 @@ const configFileName = "ori.config.js";
|
|
|
21
21
|
* @param {any} [key]
|
|
22
22
|
*/
|
|
23
23
|
export default async function project(key) {
|
|
24
|
-
assertScopeIsDefined(this);
|
|
24
|
+
assertScopeIsDefined(this, "project");
|
|
25
25
|
|
|
26
26
|
const dirname = process.cwd();
|
|
27
27
|
const currentTree = new OrigamiFiles(dirname);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Tree } from "@weborigami/async-tree";
|
|
2
2
|
import { Scope } from "@weborigami/language";
|
|
3
|
-
import getTreeArgument from "
|
|
3
|
+
import getTreeArgument from "../misc/getTreeArgument.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Reverse the order of the top-level keys in the tree.
|
|
@@ -14,7 +14,7 @@ import getTreeArgument from "../../misc/getTreeArgument.js";
|
|
|
14
14
|
* @param {PlainObject} [options]
|
|
15
15
|
*/
|
|
16
16
|
export default async function reverse(treelike, options = {}) {
|
|
17
|
-
const tree = await getTreeArgument(this, arguments, treelike);
|
|
17
|
+
const tree = await getTreeArgument(this, arguments, treelike, "@reverse");
|
|
18
18
|
const scope = this;
|
|
19
19
|
const deep = options.deep ?? false;
|
|
20
20
|
|
|
@@ -42,5 +42,5 @@ export default async function reverse(treelike, options = {}) {
|
|
|
42
42
|
return reversed;
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
reverse.usage =
|
|
45
|
+
reverse.usage = `@reverse <tree>\tReverses the order of the tree's top-level keys`;
|
|
46
46
|
reverse.documentation = "https://weborigami.org/cli/builtins.html#reverse";
|
package/src/builtins/@rss.js
CHANGED
|
@@ -8,7 +8,7 @@ import assertScopeIsDefined from "../misc/assertScopeIsDefined.js";
|
|
|
8
8
|
* @param {Treelike} jsonFeedTree
|
|
9
9
|
*/
|
|
10
10
|
export default async function rss(jsonFeedTree) {
|
|
11
|
-
assertScopeIsDefined(this);
|
|
11
|
+
assertScopeIsDefined(this, "rss");
|
|
12
12
|
const jsonFeed = await Tree.plain(jsonFeedTree);
|
|
13
13
|
const { description, home_page_url, items, feed_url, title } = jsonFeed;
|
|
14
14
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import assertScopeIsDefined from "../../misc/assertScopeIsDefined.js";
|
|
2
|
-
import
|
|
2
|
+
import scopeSet from "./set.js";
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Return a copy of the given tree whose scope includes the given trees *and*
|
|
@@ -12,11 +12,11 @@ import setScope from "./set.js";
|
|
|
12
12
|
* @param {...Treelike} scopeTrees
|
|
13
13
|
* @this {AsyncTree|null}
|
|
14
14
|
*/
|
|
15
|
-
export default function
|
|
16
|
-
assertScopeIsDefined(this);
|
|
15
|
+
export default function scopeExtend(treelike, ...scopeTrees) {
|
|
16
|
+
assertScopeIsDefined(this, "scopeExtend");
|
|
17
17
|
const scope = this;
|
|
18
|
-
return
|
|
18
|
+
return scopeSet.call(scope, treelike, ...scopeTrees, scope);
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
scopeExtend.usage = `@scope/extend <tree>, <...trees>\tExtends tree's scope with the given trees`;
|
|
22
|
+
scopeExtend.documentation = "https://weborigami.org/cli/builtins.html#@scope";
|
|
@@ -11,7 +11,7 @@ import assertScopeIsDefined from "../../misc/assertScopeIsDefined.js";
|
|
|
11
11
|
* @param {any} [obj]
|
|
12
12
|
*/
|
|
13
13
|
export default async function getScope(obj) {
|
|
14
|
-
assertScopeIsDefined(this);
|
|
14
|
+
assertScopeIsDefined(this, "getScope");
|
|
15
15
|
if (obj) {
|
|
16
16
|
/** @type {any} */
|
|
17
17
|
const tree = Tree.from(obj);
|
|
@@ -12,8 +12,8 @@ import assertScopeIsDefined from "../../misc/assertScopeIsDefined.js";
|
|
|
12
12
|
* @param {...(Treelike|null)} scopeTrees
|
|
13
13
|
* @this {AsyncTree|null}
|
|
14
14
|
*/
|
|
15
|
-
export default function
|
|
16
|
-
assertScopeIsDefined(this);
|
|
15
|
+
export default function scopeSet(treelike, ...scopeTrees) {
|
|
16
|
+
assertScopeIsDefined(this, "scopeSet");
|
|
17
17
|
const tree = Tree.from(treelike);
|
|
18
18
|
const scope = scopeTrees.length === 0 ? this : new Scope(...scopeTrees);
|
|
19
19
|
const result = Scope.treeWithScope(tree, scope);
|
|
@@ -21,5 +21,5 @@ export default function setScope(treelike, ...scopeTrees) {
|
|
|
21
21
|
return result;
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
scopeSet.usage = `@scope/set <tree>, <...trees>\tReturns a tree copy with the given scope`;
|
|
25
|
+
scopeSet.documentation = "https://weborigami.org/cli/builtins.html#@scope";
|
package/src/builtins/@serve.js
CHANGED
|
@@ -41,5 +41,5 @@ async function applyUpdateForKey(source, target, key) {
|
|
|
41
41
|
await target.set(key, sourceValue);
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
-
setDeep.usage =
|
|
44
|
+
setDeep.usage = `@setDeep <target>, <source>\tApplies the source tree to the target`;
|
|
45
45
|
setDeep.documentation = "https://weborigami.org/cli/builtins.html#setDeep";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Scope } from "@weborigami/language";
|
|
2
|
-
import ShuffleTransform from "
|
|
3
|
-
import { transformObject } from "
|
|
4
|
-
import getTreeArgument from "
|
|
2
|
+
import ShuffleTransform from "../common/ShuffleTransform.js";
|
|
3
|
+
import { transformObject } from "../common/utilities.js";
|
|
4
|
+
import getTreeArgument from "../misc/getTreeArgument.js";
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Return a new tree with the original's keys shuffled
|
|
@@ -13,7 +13,7 @@ import getTreeArgument from "../../misc/getTreeArgument.js";
|
|
|
13
13
|
* @param {Treelike} [treelike]
|
|
14
14
|
*/
|
|
15
15
|
export default async function shuffle(treelike) {
|
|
16
|
-
const tree = await getTreeArgument(this, arguments, treelike);
|
|
16
|
+
const tree = await getTreeArgument(this, arguments, treelike, "@shuffle");
|
|
17
17
|
|
|
18
18
|
/** @type {AsyncTree} */
|
|
19
19
|
let shuffled = transformObject(ShuffleTransform, tree);
|
|
@@ -21,5 +21,5 @@ export default async function shuffle(treelike) {
|
|
|
21
21
|
return shuffled;
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
shuffle.usage =
|
|
24
|
+
shuffle.usage = `@shuffle <tree>\tReturn a new tree with the original's keys shuffled`;
|
|
25
25
|
shuffle.documentation = "https://weborigami.org/cli/builtins.html#shuffle";
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import getTreeArgument from "
|
|
2
|
-
import builtins from "
|
|
3
|
-
import unpackOrigamiExpression from "
|
|
4
|
-
import paths from "
|
|
1
|
+
import getTreeArgument from "../misc/getTreeArgument.js";
|
|
2
|
+
import builtins from "./@builtins.js";
|
|
3
|
+
import unpackOrigamiExpression from "./@loaders/ori.js";
|
|
4
|
+
import paths from "./@paths.js";
|
|
5
5
|
|
|
6
6
|
const templateText = `=\`<?xml version="1.0" encoding="UTF-8"?>
|
|
7
7
|
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
|
8
|
-
{
|
|
8
|
+
\${ @map(=\`
|
|
9
9
|
<url>
|
|
10
|
-
<loc
|
|
10
|
+
<loc>\${ _ }</loc>
|
|
11
11
|
</url>
|
|
12
|
-
\`)(_) }
|
|
12
|
+
\`)(_) }
|
|
13
13
|
</urlset>
|
|
14
14
|
\`
|
|
15
15
|
`;
|
|
@@ -22,7 +22,7 @@ const templateText = `=\`<?xml version="1.0" encoding="UTF-8"?>
|
|
|
22
22
|
* @param {string} [baseHref ]
|
|
23
23
|
*/
|
|
24
24
|
export default async function sitemap(treelike, baseHref = "") {
|
|
25
|
-
const tree = await getTreeArgument(this, arguments, treelike);
|
|
25
|
+
const tree = await getTreeArgument(this, arguments, treelike, "@sitemap");
|
|
26
26
|
|
|
27
27
|
// We're only interested in keys that end in .html or with no extension.
|
|
28
28
|
function test(key) {
|
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
import { sortNatural } from "@weborigami/async-tree";
|
|
2
2
|
import { Scope } from "@weborigami/language";
|
|
3
|
-
import getTreeArgument from "
|
|
3
|
+
import getTreeArgument from "../misc/getTreeArgument.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Return a new tree with the original's keys sorted in natural sort order.
|
|
7
7
|
*
|
|
8
8
|
* @typedef {import("@weborigami/types").AsyncTree} AsyncTree
|
|
9
9
|
* @typedef {import("@weborigami/async-tree").Treelike} Treelike
|
|
10
|
-
* @typedef {import("
|
|
10
|
+
* @typedef {import("../../index.ts").Invocable} Invocable
|
|
11
11
|
*
|
|
12
12
|
* @this {AsyncTree|null}
|
|
13
13
|
* @param {Treelike} [treelike]
|
|
14
14
|
*/
|
|
15
15
|
export default async function sort(treelike) {
|
|
16
|
-
const tree = await getTreeArgument(this, arguments, treelike);
|
|
16
|
+
const tree = await getTreeArgument(this, arguments, treelike, "@sort");
|
|
17
17
|
const sorted = sortNatural()(tree);
|
|
18
18
|
const scoped = Scope.treeWithScope(sorted, this);
|
|
19
19
|
return scoped;
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
sort.usage =
|
|
22
|
+
sort.usage = `@sort <tree>\tReturn a new tree with the original's keys sorted`;
|
|
23
23
|
sort.documentation = "https://weborigami.org/cli/builtins.html#@sort";
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { sortBy } from "@weborigami/async-tree";
|
|
2
2
|
import { Scope } from "@weborigami/language";
|
|
3
|
-
import addValueKeyToScope from "
|
|
4
|
-
import { toFunction } from "
|
|
5
|
-
import getTreeArgument from "
|
|
3
|
+
import addValueKeyToScope from "../common/addValueKeyToScope.js";
|
|
4
|
+
import { toFunction } from "../common/utilities.js";
|
|
5
|
+
import getTreeArgument from "../misc/getTreeArgument.js";
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* Return a new tree with the original's keys sorted using the given function to
|
|
@@ -10,14 +10,14 @@ import getTreeArgument from "../../misc/getTreeArgument.js";
|
|
|
10
10
|
*
|
|
11
11
|
* @typedef {import("@weborigami/types").AsyncTree} AsyncTree
|
|
12
12
|
* @typedef {import("@weborigami/async-tree").Treelike} Treelike
|
|
13
|
-
* @typedef {import("
|
|
13
|
+
* @typedef {import("../../index.ts").Invocable} Invocable
|
|
14
14
|
*
|
|
15
15
|
* @this {AsyncTree|null}
|
|
16
16
|
* @param {Treelike} treelike
|
|
17
17
|
* @param {Invocable} sortKeyFn
|
|
18
18
|
*/
|
|
19
19
|
export default async function sortByBuiltin(treelike, sortKeyFn) {
|
|
20
|
-
const tree = await getTreeArgument(this, arguments, treelike);
|
|
20
|
+
const tree = await getTreeArgument(this, arguments, treelike, "@sortBy");
|
|
21
21
|
|
|
22
22
|
const fn = toFunction(sortKeyFn);
|
|
23
23
|
const baseScope = Scope.getScope(this);
|
|
@@ -33,5 +33,5 @@ export default async function sortByBuiltin(treelike, sortKeyFn) {
|
|
|
33
33
|
return scoped;
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
sortByBuiltin.usage =
|
|
36
|
+
sortByBuiltin.usage = `@sortBy <tree>, [sortKeyFn]\tReturn a new tree with the original's keys sorted`;
|
|
37
37
|
sortByBuiltin.documentation = "https://weborigami.org/cli/builtins.html#@sort";
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Tree, keysJson } from "@weborigami/async-tree";
|
|
2
2
|
import { Scope } from "@weborigami/language";
|
|
3
|
-
import { transformObject } from "
|
|
4
|
-
import getTreeArgument from "
|
|
5
|
-
import index from "
|
|
3
|
+
import { transformObject } from "../common/utilities.js";
|
|
4
|
+
import getTreeArgument from "../misc/getTreeArgument.js";
|
|
5
|
+
import index from "./@index.js";
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* Expose common static keys (index.html, .keys.json) for a tree.
|
|
@@ -13,7 +13,7 @@ import index from "../@index.js";
|
|
|
13
13
|
* @param {Treelike} treelike
|
|
14
14
|
*/
|
|
15
15
|
export default async function staticTree(treelike) {
|
|
16
|
-
const tree = await getTreeArgument(this, arguments, treelike);
|
|
16
|
+
const tree = await getTreeArgument(this, arguments, treelike, "@static");
|
|
17
17
|
let result = transformObject(StaticTransform, tree);
|
|
18
18
|
result = Scope.treeWithScope(result, this);
|
|
19
19
|
return result;
|
|
@@ -42,5 +42,5 @@ function StaticTransform(Base) {
|
|
|
42
42
|
};
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
staticTree.usage =
|
|
45
|
+
staticTree.usage = `@static <tree>\tAdd keys for generating common static files`;
|
|
46
46
|
staticTree.documentation = "https://weborigami.org/cli/builtins.html#static";
|