@weborigami/origami 0.0.41 → 0.0.42

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 (87) hide show
  1. package/exports/exports.js +32 -34
  2. package/package.json +4 -4
  3. package/src/builtins/@arrows.js +1 -1
  4. package/src/builtins/@builtins.js +2 -5
  5. package/src/builtins/@cache.js +1 -1
  6. package/src/builtins/{@tree/concat.js → @concat.js} +3 -3
  7. package/src/builtins/@copy.js +2 -2
  8. package/src/builtins/{@tree/count.js → @count.js} +3 -3
  9. package/src/builtins/@crawl.js +1 -1
  10. package/src/builtins/@debug.js +1 -1
  11. package/src/builtins/{@tree/defineds.js → @defineds.js} +2 -2
  12. package/src/builtins/@document.js +1 -1
  13. package/src/builtins/{@tree/exceptions.js → @exceptions.js} +4 -4
  14. package/src/builtins/@explore.js +2 -5
  15. package/src/builtins/@files.js +1 -1
  16. package/src/builtins/@filter.js +1 -1
  17. package/src/builtins/{@tree/first.js → @first.js} +3 -3
  18. package/src/builtins/{@tree/fn.js → @fnTree.js} +7 -7
  19. package/src/builtins/@globs.js +1 -1
  20. package/src/builtins/{@tree/groupBy.js → @groupBy.js} +6 -6
  21. package/src/builtins/@help.js +1 -1
  22. package/src/builtins/@http.js +1 -1
  23. package/src/builtins/@https.js +1 -1
  24. package/src/builtins/@if.js +1 -1
  25. package/src/builtins/@image/format.js +36 -2
  26. package/src/builtins/@image/resize.js +30 -2
  27. package/src/builtins/@index.js +1 -1
  28. package/src/builtins/@inherited.js +1 -1
  29. package/src/builtins/@inline.js +1 -1
  30. package/src/builtins/{@tree/inners.js → @inners.js} +3 -3
  31. package/src/builtins/@invoke.js +1 -1
  32. package/src/builtins/{@tree/isAsyncTree.js → @isAsyncTree.js} +1 -1
  33. package/src/builtins/@json.js +1 -1
  34. package/src/builtins/{@tree/keys.js → @keys.js} +3 -3
  35. package/src/builtins/{@tree/keysJson.js → @keysJson.js} +3 -3
  36. package/src/builtins/@loaders/ori.js +18 -18
  37. package/src/builtins/@map.js +13 -1
  38. package/src/builtins/@match.js +1 -1
  39. package/src/builtins/{@tree/merge.js → @merge.js} +2 -2
  40. package/src/builtins/{@tree/mergeDeep.js → @mergeDeep.js} +3 -3
  41. package/src/builtins/@once.js +1 -1
  42. package/src/builtins/@ori.js +1 -1
  43. package/src/builtins/@pack.js +1 -1
  44. package/src/builtins/{@tree/parent.js → @parent.js} +3 -3
  45. package/src/builtins/{@tree/paths.js → @paths.js} +3 -3
  46. package/src/builtins/@perf.js +18 -0
  47. package/src/builtins/{@tree/plain.js → @plain.js} +3 -3
  48. package/src/builtins/@project.js +1 -1
  49. package/src/builtins/@redirect.js +8 -0
  50. package/src/builtins/{@tree/reverse.js → @reverse.js} +3 -3
  51. package/src/builtins/@rss.js +1 -1
  52. package/src/builtins/@scope/extend.js +6 -6
  53. package/src/builtins/@scope/get.js +1 -1
  54. package/src/builtins/@scope/set.js +4 -4
  55. package/src/builtins/@serve.js +1 -1
  56. package/src/builtins/{@tree/setDeep.js → @setDeep.js} +1 -1
  57. package/src/builtins/{@tree/shuffle.js → @shuffle.js} +5 -5
  58. package/src/builtins/{@tree/sitemap.js → @sitemap.js} +5 -5
  59. package/src/builtins/{@tree/sort.js → @sort.js} +4 -4
  60. package/src/builtins/{@tree/sortBy.js → @sortBy.js} +6 -6
  61. package/src/builtins/{@tree/static.js → @static.js} +5 -5
  62. package/src/builtins/@svg.js +2 -2
  63. package/src/builtins/{@tree/table.js → @table.js} +3 -3
  64. package/src/builtins/{@tree/take.js → @take.js} +3 -3
  65. package/src/builtins/{@tree/from.js → @tree.js} +3 -3
  66. package/src/builtins/@treeHttp.js +1 -1
  67. package/src/builtins/@treeHttps.js +1 -1
  68. package/src/builtins/@unpack.js +1 -1
  69. package/src/builtins/{@tree/values.js → @values.js} +3 -3
  70. package/src/builtins/{@tree/valuesDeep.js → @valuesDeep.js} +3 -3
  71. package/src/builtins/@watch.js +1 -1
  72. package/src/builtins/@with.js +1 -1
  73. package/src/builtins/@yaml.js +1 -1
  74. package/src/builtins/{@tree/map.d.ts → map.d.ts} +1 -1
  75. package/src/cli/cli.js +2 -15
  76. package/src/common/ExplorableSiteTransform.js +6 -4
  77. package/src/misc/assertScopeIsDefined.js +2 -2
  78. package/src/misc/getTreeArgument.js +16 -6
  79. package/src/{builtins/@tree/dot.js → misc/treeDot.js} +3 -7
  80. package/src/server/constructResponse.js +126 -0
  81. package/src/server/mediaTypes.js +0 -16
  82. package/src/server/server.js +62 -131
  83. package/src/builtins/@tree/flowSvg.js +0 -55
  84. package/src/builtins/@tree/fromJson.js +0 -6
  85. package/src/builtins/@tree/fromYaml.js +0 -24
  86. package/src/builtins/@tree/nextKey.js +0 -29
  87. package/src/builtins/@tree/previousKey.js +0 -29
@@ -1,6 +1,6 @@
1
1
  import { Tree } from "@weborigami/async-tree";
2
2
  import { Scope } from "@weborigami/language";
3
- import getTreeArgument from "../../misc/getTreeArgument.js";
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 = `inners <tree>\tThe source nodes of the tree`;
38
+ inners.usage = `@inners <tree>\tThe source nodes of the tree`;
39
39
  inners.documentation = "https://weborigami.org/cli/builtins.html#inners";
@@ -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 = `@tree/isAsyncTree <value>\tReturn true for an async tree`;
15
+ isAsyncTree.usage = `@isAsyncTree <value>\tReturn true for an async tree`;
16
16
  isAsyncTree.documentation =
17
17
  "https://weborigami.org/cli/builtins.html#isAsyncTree";
@@ -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 "../../misc/getTreeArgument.js";
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 = `keys <tree>\tThe top-level keys in the tree`;
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 "../../common/utilities.js";
4
- import getTreeArgument from "../../misc/getTreeArgument.js";
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
- // Compile the body text as an Origami expression and evaluate it.
23
- const inputText = utilities.toString(inputDocument);
24
- let fn;
25
- try {
26
- fn = compiler(inputText);
27
- } catch (/** @type {any} */ error) {
28
- let location = "";
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
- throw error;
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
 
@@ -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 (param2 === undefined) {
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
  }
@@ -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 "../../misc/assertScopeIsDefined.js";
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 "../../misc/assertScopeIsDefined.js";
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 = `mergeDeep <...trees>\tMerge the given trees deeply`;
42
+ treeMergeDeep.usage = `@mergeDeep <...trees>\tMerge the given trees deeply`;
43
43
  treeMergeDeep.documentation =
44
44
  "https://weborigami.org/cli/builtins.html#mergeDeep";
@@ -10,7 +10,7 @@ const fnPromiseMap = new WeakMap();
10
10
  * @param {Function} fn
11
11
  */
12
12
  export default async function once(fn) {
13
- assertScopeIsDefined(this);
13
+ assertScopeIsDefined(this, "once");
14
14
  if (!fnPromiseMap.has(fn)) {
15
15
  fnPromiseMap.set(fn, fn.call(this));
16
16
  }
@@ -19,7 +19,7 @@ export default async function ori(
19
19
  expression,
20
20
  options = { formatResult: true }
21
21
  ) {
22
- assertScopeIsDefined(this);
22
+ assertScopeIsDefined(this, "ori");
23
23
  // In case expression is a Buffer, cast it to a string.
24
24
  expression = String(expression);
25
25
 
@@ -8,6 +8,6 @@ import assertScopeIsDefined from "../misc/assertScopeIsDefined.js";
8
8
  * @returns
9
9
  */
10
10
  export default function pack(obj) {
11
- assertScopeIsDefined(this);
11
+ assertScopeIsDefined(this, "pack");
12
12
  return obj?.pack?.();
13
13
  }
@@ -1,4 +1,4 @@
1
- import getTreeArgument from "../../misc/getTreeArgument.js";
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 = `parent\tThe parent of the current tree`;
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 "../../misc/getTreeArgument.js";
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 = `paths(tree)\tReturn an array of paths to the values in the tree`;
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 "../../misc/getTreeArgument.js";
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 = `plain <tree>\tA plain JavaScript object representation of the tree`;
17
+ plain.usage = `@plain <tree>\tA plain JavaScript object representation of the tree`;
18
18
  plain.documentation = "https://weborigami.org/cli/builtins.html#plain";
@@ -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);
@@ -0,0 +1,8 @@
1
+ export default function redirect(url, options = { permanent: false }) {
2
+ return new Response("ok", {
3
+ headers: {
4
+ Location: url,
5
+ },
6
+ status: options.permanent ? 301 : 307,
7
+ });
8
+ }
@@ -1,6 +1,6 @@
1
1
  import { Tree } from "@weborigami/async-tree";
2
2
  import { Scope } from "@weborigami/language";
3
- import getTreeArgument from "../../misc/getTreeArgument.js";
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 = `reverse <tree>\tReverses the order of the tree's top-level keys`;
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";
@@ -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 setScope from "./set.js";
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 extendScope(treelike, ...scopeTrees) {
16
- assertScopeIsDefined(this);
15
+ export default function scopeExtend(treelike, ...scopeTrees) {
16
+ assertScopeIsDefined(this, "scopeExtend");
17
17
  const scope = this;
18
- return setScope.call(scope, treelike, ...scopeTrees, scope);
18
+ return scopeSet.call(scope, treelike, ...scopeTrees, scope);
19
19
  }
20
20
 
21
- extendScope.usage = `@scope/extend <tree>, <...trees>\tExtends tree's scope with the given trees`;
22
- extendScope.documentation = "https://weborigami.org/cli/builtins.html#@scope";
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 setScope(treelike, ...scopeTrees) {
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
- setScope.usage = `@scope/set <tree>, <...trees>\tReturns a tree copy with the given scope`;
25
- setScope.documentation = "https://weborigami.org/cli/builtins.html#@scope";
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";
@@ -22,7 +22,7 @@ const defaultPort = 5000;
22
22
  * @this {AsyncTree|null}
23
23
  */
24
24
  export default async function serve(treelike, port) {
25
- assertScopeIsDefined(this);
25
+ assertScopeIsDefined(this, "serve");
26
26
  let tree;
27
27
  if (treelike) {
28
28
  tree = Tree.from(treelike);
@@ -41,5 +41,5 @@ async function applyUpdateForKey(source, target, key) {
41
41
  await target.set(key, sourceValue);
42
42
  }
43
43
 
44
- setDeep.usage = `setDeep <target>, <source>\tApplies the source tree to the target`;
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 "../../common/ShuffleTransform.js";
3
- import { transformObject } from "../../common/utilities.js";
4
- import getTreeArgument from "../../misc/getTreeArgument.js";
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 = `shuffle <tree>\tReturn a new tree with the original's keys shuffled`;
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,7 +1,7 @@
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";
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">
@@ -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 "../../misc/getTreeArgument.js";
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("../../../index.ts").Invocable} Invocable
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 = `sort <tree>\tReturn a new tree with the original's keys sorted`;
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 "../../common/addValueKeyToScope.js";
4
- import { toFunction } from "../../common/utilities.js";
5
- import getTreeArgument from "../../misc/getTreeArgument.js";
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("../../../index.ts").Invocable} Invocable
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 = `sortBy <tree>, [sortKeyFn]\tReturn a new tree with the original's keys sorted`;
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 "../../common/utilities.js";
4
- import getTreeArgument from "../../misc/getTreeArgument.js";
5
- import index from "../@index.js";
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 = `static <tree>\tAdd keys for generating common static files`;
45
+ staticTree.usage = `@static <tree>\tAdd keys for generating common static files`;
46
46
  staticTree.documentation = "https://weborigami.org/cli/builtins.html#static";
@@ -1,6 +1,6 @@
1
1
  import graphviz from "graphviz-wasm";
2
2
  import getTreeArgument from "../misc/getTreeArgument.js";
3
- import dot from "./@tree/dot.js";
3
+ import dot from "../misc/treeDot.js";
4
4
 
5
5
  let graphvizLoaded = false;
6
6
 
@@ -20,7 +20,7 @@ export default async function svg(treelike, options = {}) {
20
20
  await graphviz.loadWASM();
21
21
  graphvizLoaded = true;
22
22
  }
23
- const tree = await getTreeArgument(this, arguments, treelike);
23
+ const tree = await getTreeArgument(this, arguments, treelike, "@svg");
24
24
  const dotText = await dot.call(this, tree, options);
25
25
  if (dotText === undefined) {
26
26
  return undefined;
@@ -1,5 +1,5 @@
1
1
  import { Tree } from "@weborigami/async-tree";
2
- import getTreeArgument from "../../misc/getTreeArgument.js";
2
+ import getTreeArgument from "../misc/getTreeArgument.js";
3
3
 
4
4
  /**
5
5
  * @typedef {import("@weborigami/types").AsyncTree} AsyncTree
@@ -8,7 +8,7 @@ import getTreeArgument from "../../misc/getTreeArgument.js";
8
8
  * @param {Treelike} treelike
9
9
  */
10
10
  export default async function table(treelike) {
11
- const tree = await getTreeArgument(this, arguments, treelike);
11
+ const tree = await getTreeArgument(this, arguments, treelike, "@table");
12
12
  const firstValue = await valueForFirstKey(tree);
13
13
  if (Tree.isAsyncTree(firstValue)) {
14
14
  return fullTable(tree, firstValue);
@@ -65,5 +65,5 @@ async function valueForFirstKey(tree) {
65
65
  }
66
66
 
67
67
  table.usage =
68
- "table <tree>\tFormat the tree's top level as a tab-delimited table";
68
+ "@table <tree>\tFormat the tree's top level as a tab-delimited table";
69
69
  table.documentation = "https://weborigami.org/cli/builtins.html#table";