@weborigami/origami 0.0.58 → 0.0.60
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 +6 -2
- package/exports/exports.js +2 -6
- package/package.json +12 -12
- package/src/builtins/@arrowsMap.js +4 -5
- package/src/builtins/@breakpoint.js +12 -0
- package/src/builtins/@cache.js +3 -6
- package/src/builtins/@concat.js +3 -4
- package/src/builtins/@config.js +3 -12
- package/src/builtins/@constructor.js +3 -7
- package/src/builtins/@copy.js +2 -2
- package/src/builtins/@crawl.js +4 -6
- package/src/builtins/@debug.js +5 -6
- package/src/builtins/@deepMap.js +2 -2
- package/src/builtins/@deepMapFn.js +2 -2
- package/src/builtins/@deepMerge.js +3 -18
- package/src/builtins/@deepReverse.js +1 -3
- package/src/builtins/@deepTakeFn.js +5 -6
- package/src/builtins/@defineds.js +4 -7
- package/src/builtins/@document.js +2 -2
- package/src/builtins/@exceptions.js +1 -5
- package/src/builtins/@explore.js +15 -14
- package/src/builtins/@files.js +4 -6
- package/src/builtins/@filter.js +3 -6
- package/src/builtins/@fnTree.js +8 -22
- package/src/builtins/@globs.js +3 -6
- package/src/builtins/@groupFn.js +7 -8
- package/src/builtins/@help.js +2 -2
- package/src/builtins/@http.js +2 -2
- package/src/builtins/@https.js +2 -2
- package/src/builtins/@if.js +2 -2
- package/src/builtins/@image/format.js +5 -5
- package/src/builtins/@image/formatFn.js +6 -3
- package/src/builtins/@image/resize.js +5 -5
- package/src/builtins/@image/resizeFn.js +6 -3
- package/src/builtins/@inherited.js +2 -2
- package/src/builtins/@inline.js +5 -9
- package/src/builtins/@inners.js +0 -1
- package/src/builtins/@invoke.js +4 -7
- package/src/builtins/@json.js +5 -6
- package/src/builtins/@map.js +2 -2
- package/src/builtins/@mapFn.js +9 -10
- package/src/builtins/@match.js +17 -16
- package/src/builtins/@mdHtml.js +4 -1
- package/src/builtins/@merge.js +3 -18
- package/src/builtins/@once.js +2 -2
- package/src/builtins/@ori.js +8 -7
- package/src/builtins/@pack.js +2 -2
- package/src/builtins/@package.js +4 -8
- package/src/builtins/@paginateFn.js +1 -6
- package/src/builtins/@perf.js +4 -3
- package/src/builtins/@project.js +31 -22
- package/src/builtins/@reverse.js +1 -3
- package/src/builtins/@rss.js +2 -2
- package/src/builtins/@serve.js +2 -2
- package/src/builtins/@sitemap.js +4 -1
- package/src/builtins/@sortFn.js +6 -7
- package/src/builtins/@stdin.js +7 -1
- package/src/builtins/@string.js +2 -2
- package/src/builtins/@takeFn.js +5 -6
- package/src/builtins/@treeHttp.js +2 -2
- package/src/builtins/@treeHttps.js +2 -2
- package/src/builtins/@unpack.js +3 -3
- package/src/builtins/@watch.js +5 -12
- package/src/builtins/@yaml.js +5 -6
- package/src/builtins/jpeg_handler.js +4 -0
- package/src/builtins/ori_handler.js +3 -3
- package/src/builtins/~.js +3 -3
- package/src/cli/cli.js +6 -19
- package/src/common/ConstantTree.js +1 -0
- package/src/common/ExplorableSiteTransform.js +9 -12
- package/src/common/documentObject.js +2 -2
- package/src/common/processUnpackedContent.js +12 -18
- package/src/common/serialize.d.ts +0 -2
- package/src/common/serialize.js +3 -90
- package/src/misc/OriCommandTransform.js +1 -9
- package/src/misc/assertTreeIsDefined.d.ts +1 -0
- package/src/misc/assertTreeIsDefined.js +7 -0
- package/src/misc/getTreeArgument.js +11 -12
- package/src/server/constructResponse.js +4 -4
- package/src/server/server.js +3 -10
- package/src/builtins/@scope/extend.js +0 -22
- package/src/builtins/@scope/get.js +0 -25
- package/src/builtins/@scope/invoke.js +0 -22
- package/src/builtins/@scope/set.js +0 -25
- package/src/common/addValueKeyToScope.js +0 -23
- package/src/misc/assertScopeIsDefined.js +0 -7
package/exports/buildExports.js
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
/** @typedef {import("@weborigami/types").AsyncTree} AsyncTree */
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
keyFunctionsForExtensions,
|
|
4
|
+
map,
|
|
5
|
+
toString,
|
|
6
|
+
} from "@weborigami/async-tree";
|
|
3
7
|
import fileTypeOrigami from "../src/builtins/ori_handler.js";
|
|
4
8
|
import { transformObject } from "../src/common/utilities.js";
|
|
5
9
|
import PathTransform from "./PathTransform.js";
|
|
@@ -32,7 +36,7 @@ export default async function exportFile(src) {
|
|
|
32
36
|
* @this {AsyncTree}
|
|
33
37
|
*/
|
|
34
38
|
async function exportStatementForCode(codeBuffer, key) {
|
|
35
|
-
const code =
|
|
39
|
+
const code = toString(codeBuffer);
|
|
36
40
|
|
|
37
41
|
const exportsAnything = code.match(/^export /m);
|
|
38
42
|
if (!exportsAnything) {
|
package/exports/exports.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
export { default as addNextPrevious } from "../src/builtins/@addNextPrevious.js";
|
|
3
3
|
export { default as arrowsMap } from "../src/builtins/@arrowsMap.js";
|
|
4
4
|
export { default as basename } from "../src/builtins/@basename.js";
|
|
5
|
+
export { default as breakpoint } from "../src/builtins/@breakpoint.js";
|
|
5
6
|
export { default as builtins } from "../src/builtins/@builtins.js";
|
|
6
7
|
export { default as cache } from "../src/builtins/@cache.js";
|
|
7
8
|
export { default as changes } from "../src/builtins/@changes.js";
|
|
@@ -78,10 +79,6 @@ export { default as regexMatchFn } from "../src/builtins/@regexMatchFn.js";
|
|
|
78
79
|
export { default as repeat } from "../src/builtins/@repeat.js";
|
|
79
80
|
export { default as reverse } from "../src/builtins/@reverse.js";
|
|
80
81
|
export { default as rss } from "../src/builtins/@rss.js";
|
|
81
|
-
export { default as scopeExtend } from "../src/builtins/@scope/extend.js";
|
|
82
|
-
export { default as scopeGet } from "../src/builtins/@scope/get.js";
|
|
83
|
-
export { default as scopeInvoke } from "../src/builtins/@scope/invoke.js";
|
|
84
|
-
export { default as scopeSet } from "../src/builtins/@scope/set.js";
|
|
85
82
|
export { default as serve } from "../src/builtins/@serve.js";
|
|
86
83
|
export { default as setDeep } from "../src/builtins/@setDeep.js";
|
|
87
84
|
export { default as shell } from "../src/builtins/@shell.js";
|
|
@@ -122,7 +119,6 @@ export { default as yamlHandler } from "../src/builtins/yaml_handler.js";
|
|
|
122
119
|
export { default as ymlHandler } from "../src/builtins/yml_handler.js";
|
|
123
120
|
export { default as defaultModuleExport } from "../src/cli/defaultModuleExport.js";
|
|
124
121
|
export { default as showUsage } from "../src/cli/showUsage.js";
|
|
125
|
-
export { default as addValueKeyToScope } from "../src/common/addValueKeyToScope.js";
|
|
126
122
|
export { default as arrowsMapFn } from "../src/common/arrowsMapFn.js";
|
|
127
123
|
export { default as CommandModulesTransform } from "../src/common/CommandModulesTransform.js";
|
|
128
124
|
export { default as ConstantTree } from "../src/common/ConstantTree.js";
|
|
@@ -134,7 +130,7 @@ export { default as processUnpackedContent } from "../src/common/processUnpacked
|
|
|
134
130
|
export * from "../src/common/serialize.js";
|
|
135
131
|
export { default as ShuffleTransform } from "../src/common/ShuffleTransform.js";
|
|
136
132
|
export * from "../src/common/utilities.js";
|
|
137
|
-
export { default as
|
|
133
|
+
export { default as assertTreeIsDefined } from "../src/misc/assertTreeIsDefined.js";
|
|
138
134
|
export { default as getTreeArgument } from "../src/misc/getTreeArgument.js";
|
|
139
135
|
export { default as OriCommandTransform } from "../src/misc/OriCommandTransform.js";
|
|
140
136
|
export { default as treeDot } from "../src/misc/treeDot.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@weborigami/origami",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.60",
|
|
4
4
|
"description": "Web Origami language, CLI, framework, and server",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": {
|
|
@@ -13,22 +13,22 @@
|
|
|
13
13
|
"main": "./exports/exports.js",
|
|
14
14
|
"types": "./index.ts",
|
|
15
15
|
"devDependencies": {
|
|
16
|
-
"@types/node": "20.
|
|
17
|
-
"typescript": "5.
|
|
16
|
+
"@types/node": "20.14.9",
|
|
17
|
+
"typescript": "5.5.3"
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@weborigami/async-tree": "0.0.
|
|
21
|
-
"@weborigami/language": "0.0.
|
|
22
|
-
"@weborigami/types": "0.0.
|
|
20
|
+
"@weborigami/async-tree": "0.0.60",
|
|
21
|
+
"@weborigami/language": "0.0.60",
|
|
22
|
+
"@weborigami/types": "0.0.60",
|
|
23
23
|
"exif-parser": "0.1.12",
|
|
24
24
|
"graphviz-wasm": "3.0.2",
|
|
25
25
|
"highlight.js": "11.9.0",
|
|
26
|
-
"marked": "
|
|
27
|
-
"marked-gfm-heading-id": "
|
|
28
|
-
"marked-highlight": "2.1.
|
|
29
|
-
"marked-smartypants": "1.1.
|
|
30
|
-
"sharp": "0.33.
|
|
31
|
-
"yaml": "2.4.
|
|
26
|
+
"marked": "13.0.1",
|
|
27
|
+
"marked-gfm-heading-id": "4.0.0",
|
|
28
|
+
"marked-highlight": "2.1.3",
|
|
29
|
+
"marked-smartypants": "1.1.7",
|
|
30
|
+
"sharp": "0.33.4",
|
|
31
|
+
"yaml": "2.4.5"
|
|
32
32
|
},
|
|
33
33
|
"scripts": {
|
|
34
34
|
"build": "ori exports/buildExports.js src > exports/exports.js",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { functionResultsMap } from "@weborigami/language";
|
|
2
2
|
import arrowsMapFn from "../common/arrowsMapFn.js";
|
|
3
3
|
import { keySymbol } from "../common/utilities.js";
|
|
4
4
|
import getTreeArgument from "../misc/getTreeArgument.js";
|
|
@@ -15,10 +15,9 @@ import builtins from "./@builtins.js";
|
|
|
15
15
|
export default async function arrowsMap(treelike) {
|
|
16
16
|
const tree = await getTreeArgument(this, arguments, treelike, "arrowsMap");
|
|
17
17
|
const mapped = functionResultsMap(arrowsMapFn()(tree));
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
return scoped;
|
|
18
|
+
mapped.parent = this ?? builtins;
|
|
19
|
+
mapped[keySymbol] = "@arrowsMap";
|
|
20
|
+
return mapped;
|
|
22
21
|
}
|
|
23
22
|
|
|
24
23
|
arrowsMap.usage = `@arrowsMap <obj>\tInterpret arrow keys in the tree as function calls`;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Break into the JavaScript debugger.
|
|
3
|
+
*
|
|
4
|
+
* This can be used to pause execution of the JavaScript code and inspect the
|
|
5
|
+
* function argument and function target (`this`).
|
|
6
|
+
*
|
|
7
|
+
* @param {*} arg
|
|
8
|
+
*/
|
|
9
|
+
export default function breakpoint(arg) {
|
|
10
|
+
debugger;
|
|
11
|
+
return arg;
|
|
12
|
+
}
|
package/src/builtins/@cache.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { Tree, cache } from "@weborigami/async-tree";
|
|
2
|
-
import
|
|
3
|
-
import assertScopeIsDefined from "../misc/assertScopeIsDefined.js";
|
|
2
|
+
import assertTreeIsDefined from "../misc/assertTreeIsDefined.js";
|
|
4
3
|
|
|
5
4
|
/**
|
|
6
5
|
* Caches tree values in a storable cache.
|
|
@@ -18,12 +17,10 @@ export default async function cacheBuiltin(
|
|
|
18
17
|
cacheTreelike,
|
|
19
18
|
filterTreelike
|
|
20
19
|
) {
|
|
21
|
-
|
|
20
|
+
assertTreeIsDefined(this, "cache");
|
|
22
21
|
/** @type {any} */
|
|
23
22
|
const cacheTree = cacheTreelike ? Tree.from(cacheTreelike) : undefined;
|
|
24
|
-
|
|
25
|
-
let result = cache(sourceTreelike, cacheTree, filterTreelike);
|
|
26
|
-
result = Scope.treeWithScope(result, this);
|
|
23
|
+
const result = cache(sourceTreelike, cacheTree, filterTreelike);
|
|
27
24
|
return result;
|
|
28
25
|
}
|
|
29
26
|
|
package/src/builtins/@concat.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Tree } from "@weborigami/async-tree";
|
|
2
2
|
import { ops } from "@weborigami/language";
|
|
3
|
-
import
|
|
3
|
+
import assertTreeIsDefined from "../misc/assertTreeIsDefined.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Concatenate the text content of objects or trees.
|
|
@@ -11,9 +11,8 @@ import assertScopeIsDefined from "../misc/assertScopeIsDefined.js";
|
|
|
11
11
|
* @param {any[]} args
|
|
12
12
|
*/
|
|
13
13
|
export default async function concat(...args) {
|
|
14
|
-
|
|
15
|
-
const tree =
|
|
16
|
-
args.length === 0 ? await this?.get("@current") : Tree.from(args);
|
|
14
|
+
assertTreeIsDefined(this, "concat");
|
|
15
|
+
const tree = args.length === 0 ? this : Tree.from(args);
|
|
17
16
|
return ops.concat.call(this, tree);
|
|
18
17
|
}
|
|
19
18
|
|
package/src/builtins/@config.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { Scope } from "@weborigami/language";
|
|
2
1
|
import project from "./@project.js";
|
|
3
2
|
|
|
4
3
|
/**
|
|
@@ -15,17 +14,9 @@ import project from "./@project.js";
|
|
|
15
14
|
export default async function config(key) {
|
|
16
15
|
const projectTree = await project.call(this);
|
|
17
16
|
// HACK: We use specific knowledge of how @project returns a tree to get the
|
|
18
|
-
// config.
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const projectTreeScope = Scope.getScope(projectTree);
|
|
22
|
-
const trees = projectTreeScope?.trees;
|
|
23
|
-
if (!trees) {
|
|
24
|
-
return undefined;
|
|
25
|
-
}
|
|
26
|
-
trees.shift();
|
|
27
|
-
const scope = new Scope(...trees);
|
|
28
|
-
return key === undefined ? scope : scope.get(key);
|
|
17
|
+
// config. The config is always the parent of the project folder.
|
|
18
|
+
const parent = projectTree.parent;
|
|
19
|
+
return key === undefined ? parent : parent.get(key);
|
|
29
20
|
}
|
|
30
21
|
|
|
31
22
|
config.usage = `@config\tThe current project's configuration tree`;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ops } from "@weborigami/language";
|
|
2
|
-
import
|
|
2
|
+
import assertTreeIsDefined from "../misc/assertTreeIsDefined.js";
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* @typedef {import("@weborigami/types").AsyncTree} AsyncTree
|
|
@@ -8,10 +8,6 @@ import assertScopeIsDefined from "../misc/assertScopeIsDefined.js";
|
|
|
8
8
|
* @param {...any} keys
|
|
9
9
|
*/
|
|
10
10
|
export default function constructor(...keys) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
if (!scope) {
|
|
14
|
-
throw new Error("@constructor requires a non-null scope.");
|
|
15
|
-
}
|
|
16
|
-
return ops.constructor.call(scope, ...keys);
|
|
11
|
+
assertTreeIsDefined(this, "constructor");
|
|
12
|
+
return ops.constructor.call(this, ...keys);
|
|
17
13
|
}
|
package/src/builtins/@copy.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Tree } from "@weborigami/async-tree";
|
|
2
2
|
import process, { stdout } from "node:process";
|
|
3
3
|
import { transformObject } from "../common/utilities.js";
|
|
4
|
-
import
|
|
4
|
+
import assertTreeIsDefined from "../misc/assertTreeIsDefined.js";
|
|
5
5
|
import setDeep from "./@setDeep.js";
|
|
6
6
|
|
|
7
7
|
/**
|
|
@@ -13,7 +13,7 @@ import setDeep from "./@setDeep.js";
|
|
|
13
13
|
* @param {Treelike} target
|
|
14
14
|
*/
|
|
15
15
|
export default async function copy(source, target) {
|
|
16
|
-
|
|
16
|
+
assertTreeIsDefined(this, "copy");
|
|
17
17
|
// const start = performance.now();
|
|
18
18
|
const sourceTree = Tree.from(source);
|
|
19
19
|
/** @type {any} */ let targetTree = Tree.from(target);
|
package/src/builtins/@crawl.js
CHANGED
|
@@ -5,9 +5,9 @@ import {
|
|
|
5
5
|
isPlainObject,
|
|
6
6
|
keysFromPath,
|
|
7
7
|
} from "@weborigami/async-tree";
|
|
8
|
-
import { InvokeFunctionsTransform,
|
|
8
|
+
import { InvokeFunctionsTransform, extname } from "@weborigami/language";
|
|
9
9
|
import * as utilities from "../common/utilities.js";
|
|
10
|
-
import
|
|
10
|
+
import assertTreeIsDefined from "../misc/assertTreeIsDefined.js";
|
|
11
11
|
import treeHttps from "./@treeHttps.js";
|
|
12
12
|
|
|
13
13
|
// A fake base URL used to handle cases where an href is relative and must be
|
|
@@ -30,7 +30,7 @@ const fakeBaseUrl = new URL("https://fake");
|
|
|
30
30
|
* @returns {Promise<AsyncTree>}
|
|
31
31
|
*/
|
|
32
32
|
export default async function crawl(treelike, baseHref) {
|
|
33
|
-
|
|
33
|
+
assertTreeIsDefined(this, "crawl");
|
|
34
34
|
const tree =
|
|
35
35
|
typeof treelike === "string"
|
|
36
36
|
? treeHttps.call(this, treelike)
|
|
@@ -92,12 +92,10 @@ export default async function crawl(treelike, baseHref) {
|
|
|
92
92
|
// Merge the cache on top of the resources tree. If we have an actual value
|
|
93
93
|
// for something already, that's better than a function that will get that
|
|
94
94
|
// value.
|
|
95
|
-
|
|
96
|
-
let result = deepMerge(
|
|
95
|
+
const result = deepMerge(
|
|
97
96
|
new DeepObjectTree(cache),
|
|
98
97
|
new (InvokeFunctionsTransform(DeepObjectTree))(resources)
|
|
99
98
|
);
|
|
100
|
-
result = Scope.treeWithScope(result, this);
|
|
101
99
|
return result;
|
|
102
100
|
}
|
|
103
101
|
|
package/src/builtins/@debug.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { Tree } from "@weborigami/async-tree";
|
|
2
|
-
import { Scope } from "@weborigami/language";
|
|
3
2
|
import ExplorableSiteTransform from "../common/ExplorableSiteTransform.js";
|
|
4
3
|
import { isTransformApplied, transformObject } from "../common/utilities.js";
|
|
5
4
|
import OriCommandTransform from "../misc/OriCommandTransform.js";
|
|
@@ -37,14 +36,14 @@ function DebugTransform(Base) {
|
|
|
37
36
|
return class Debug extends OriCommandTransform(Base) {
|
|
38
37
|
async get(key) {
|
|
39
38
|
let value = await super.get(key);
|
|
40
|
-
const
|
|
39
|
+
const parent = this;
|
|
41
40
|
|
|
42
41
|
// Since this transform is for diagnostic purposes, cast any treelike
|
|
43
42
|
// result to a tree so we can debug the result too.
|
|
44
43
|
if (Tree.isTreelike(value)) {
|
|
45
44
|
value = Tree.from(value);
|
|
46
|
-
if (!value.parent
|
|
47
|
-
value =
|
|
45
|
+
if (!value.parent) {
|
|
46
|
+
value.parent = parent;
|
|
48
47
|
}
|
|
49
48
|
if (!isTransformApplied(DebugTransform, value)) {
|
|
50
49
|
value = transformObject(DebugTransform, value);
|
|
@@ -60,8 +59,8 @@ function DebugTransform(Base) {
|
|
|
60
59
|
}
|
|
61
60
|
/** @type {any} */
|
|
62
61
|
let tree = Tree.from(content);
|
|
63
|
-
if (!tree.parent
|
|
64
|
-
tree =
|
|
62
|
+
if (!tree.parent) {
|
|
63
|
+
tree.parent = parent;
|
|
65
64
|
}
|
|
66
65
|
if (!isTransformApplied(DebugTransform, tree)) {
|
|
67
66
|
tree = transformObject(DebugTransform, tree);
|
package/src/builtins/@deepMap.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import assertTreeIsDefined from "../misc/assertTreeIsDefined.js";
|
|
2
2
|
import deepMapFn from "./@deepMapFn.js";
|
|
3
3
|
|
|
4
4
|
/**
|
|
@@ -14,6 +14,6 @@ import deepMapFn from "./@deepMapFn.js";
|
|
|
14
14
|
* @param {ValueKeyFn|TreeMapOptions} operation
|
|
15
15
|
*/
|
|
16
16
|
export default function deepMap(source, operation) {
|
|
17
|
-
|
|
17
|
+
assertTreeIsDefined(this, "deepMap");
|
|
18
18
|
return deepMapFn.call(this, operation)(source);
|
|
19
19
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { isPlainObject } from "@weborigami/async-tree";
|
|
2
|
-
import
|
|
2
|
+
import assertTreeIsDefined from "../misc/assertTreeIsDefined.js";
|
|
3
3
|
import mapFn from "./@mapFn.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -14,7 +14,7 @@ import mapFn from "./@mapFn.js";
|
|
|
14
14
|
* @param {ValueKeyFn|TreeMapOptions} operation
|
|
15
15
|
*/
|
|
16
16
|
export default function deepMapFn(operation) {
|
|
17
|
-
|
|
17
|
+
assertTreeIsDefined(this, "deepMap");
|
|
18
18
|
/** @type {TreeMapOptions} */
|
|
19
19
|
const options = isPlainObject(operation)
|
|
20
20
|
? // Dictionary
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { deepMerge } from "@weborigami/async-tree";
|
|
2
|
-
import
|
|
3
|
-
import assertScopeIsDefined from "../misc/assertScopeIsDefined.js";
|
|
2
|
+
import assertTreeIsDefined from "../misc/assertTreeIsDefined.js";
|
|
4
3
|
|
|
5
4
|
/**
|
|
6
5
|
* Create a tree that's the result of deep merging the given trees.
|
|
@@ -11,7 +10,7 @@ import assertScopeIsDefined from "../misc/assertScopeIsDefined.js";
|
|
|
11
10
|
* @param {Treelike[]} trees
|
|
12
11
|
*/
|
|
13
12
|
export default async function treedeepMerge(...trees) {
|
|
14
|
-
|
|
13
|
+
assertTreeIsDefined(this, "deepMerge");
|
|
15
14
|
// Filter out null or undefined trees.
|
|
16
15
|
const filtered = trees.filter((tree) => tree);
|
|
17
16
|
|
|
@@ -20,22 +19,8 @@ export default async function treedeepMerge(...trees) {
|
|
|
20
19
|
return filtered[0];
|
|
21
20
|
}
|
|
22
21
|
|
|
23
|
-
// If a tree can take a scope, give it one that includes the other trees and
|
|
24
|
-
// the current scope.
|
|
25
|
-
const scopedTrees = filtered.map((tree) => {
|
|
26
|
-
const otherTrees = filtered.filter((g) => g !== tree);
|
|
27
|
-
const scope = new Scope(...otherTrees, this);
|
|
28
|
-
// Each tree will be included first in its own scope.
|
|
29
|
-
return Scope.treeWithScope(tree, scope);
|
|
30
|
-
});
|
|
31
|
-
|
|
32
22
|
// Merge the trees.
|
|
33
|
-
const result = deepMerge(...
|
|
34
|
-
|
|
35
|
-
// Give the overall mixed tree a scope that includes the component trees and
|
|
36
|
-
// the current scope.
|
|
37
|
-
/** @type {any} */ (result).scope = new Scope(result, this);
|
|
38
|
-
|
|
23
|
+
const result = deepMerge(...filtered);
|
|
39
24
|
return result;
|
|
40
25
|
}
|
|
41
26
|
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { deepReverse } from "@weborigami/async-tree";
|
|
2
|
-
import { Scope } from "@weborigami/language";
|
|
3
2
|
import getTreeArgument from "../misc/getTreeArgument.js";
|
|
4
3
|
|
|
5
4
|
/**
|
|
@@ -13,7 +12,6 @@ import getTreeArgument from "../misc/getTreeArgument.js";
|
|
|
13
12
|
*/
|
|
14
13
|
export default async function deepReverseBuiltin(treelike) {
|
|
15
14
|
const tree = await getTreeArgument(this, arguments, treelike, "@deepReverse");
|
|
16
|
-
|
|
17
|
-
reversed = Scope.treeWithScope(reversed, this);
|
|
15
|
+
const reversed = deepReverse(tree);
|
|
18
16
|
return reversed;
|
|
19
17
|
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { deepTakeFn } from "@weborigami/async-tree";
|
|
2
|
-
import
|
|
3
|
-
import assertScopeIsDefined from "../misc/assertScopeIsDefined.js";
|
|
2
|
+
import assertTreeIsDefined from "../misc/assertTreeIsDefined.js";
|
|
4
3
|
|
|
5
4
|
/**
|
|
6
5
|
* Returns a function that traverses a tree deeply and returns the values of the
|
|
@@ -12,11 +11,11 @@ import assertScopeIsDefined from "../misc/assertScopeIsDefined.js";
|
|
|
12
11
|
* @param {number} count
|
|
13
12
|
*/
|
|
14
13
|
export default function deepTakeFnBuiltin(count) {
|
|
15
|
-
|
|
16
|
-
const
|
|
14
|
+
assertTreeIsDefined(this, "deepTakeFn");
|
|
15
|
+
const parent = this;
|
|
17
16
|
return async (treelike) => {
|
|
18
17
|
const taken = await deepTakeFn(count)(treelike);
|
|
19
|
-
|
|
20
|
-
return
|
|
18
|
+
taken.parent = parent;
|
|
19
|
+
return taken;
|
|
21
20
|
};
|
|
22
21
|
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { Tree } from "@weborigami/async-tree";
|
|
2
|
-
import { Scope } from "@weborigami/language";
|
|
3
2
|
import getTreeArgument from "../misc/getTreeArgument.js";
|
|
4
3
|
|
|
5
4
|
/**
|
|
@@ -14,20 +13,18 @@ import getTreeArgument from "../misc/getTreeArgument.js";
|
|
|
14
13
|
export default async function defineds(treelike) {
|
|
15
14
|
const tree = await getTreeArgument(this, arguments, treelike, "@defineds");
|
|
16
15
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const result = {};
|
|
16
|
+
const result = await Tree.mapReduce(tree, null, async (values, keys) => {
|
|
17
|
+
const object = {};
|
|
20
18
|
let someValuesExist = false;
|
|
21
19
|
for (let i = 0; i < keys.length; i++) {
|
|
22
20
|
const value = values[i];
|
|
23
21
|
if (value != null) {
|
|
24
22
|
someValuesExist = true;
|
|
25
|
-
|
|
23
|
+
object[keys[i]] = values[i];
|
|
26
24
|
}
|
|
27
25
|
}
|
|
28
|
-
return someValuesExist ?
|
|
26
|
+
return someValuesExist ? object : null;
|
|
29
27
|
});
|
|
30
28
|
|
|
31
|
-
result = Scope.treeWithScope(result, this);
|
|
32
29
|
return result;
|
|
33
30
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import documentObject from "../common/documentObject.js";
|
|
2
|
-
import
|
|
2
|
+
import assertTreeIsDefined from "../misc/assertTreeIsDefined.js";
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* @typedef {import("@weborigami/types").AsyncTree} AsyncTree
|
|
@@ -10,6 +10,6 @@ import assertScopeIsDefined from "../misc/assertScopeIsDefined.js";
|
|
|
10
10
|
* @param {any} [data]
|
|
11
11
|
*/
|
|
12
12
|
export default async function documentBuiltin(text, data) {
|
|
13
|
-
|
|
13
|
+
assertTreeIsDefined(this, "document");
|
|
14
14
|
return documentObject(text, data);
|
|
15
15
|
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { Tree } from "@weborigami/async-tree";
|
|
2
|
-
import { Scope } from "@weborigami/language";
|
|
3
2
|
import getTreeArgument from "../misc/getTreeArgument.js";
|
|
4
3
|
import defineds from "./@defineds.js";
|
|
5
4
|
|
|
@@ -11,10 +10,7 @@ import defineds from "./@defineds.js";
|
|
|
11
10
|
*/
|
|
12
11
|
export default async function exceptions(treelike) {
|
|
13
12
|
const tree = await getTreeArgument(this, arguments, treelike, "@exceptions");
|
|
14
|
-
|
|
15
|
-
/** @type {AsyncTree} */
|
|
16
|
-
let exceptionsTree = new ExceptionsTree(tree);
|
|
17
|
-
exceptionsTree = Scope.treeWithScope(exceptionsTree, this);
|
|
13
|
+
const exceptionsTree = new ExceptionsTree(tree);
|
|
18
14
|
return defineds.call(this, exceptionsTree);
|
|
19
15
|
}
|
|
20
16
|
|
package/src/builtins/@explore.js
CHANGED
|
@@ -1,33 +1,33 @@
|
|
|
1
1
|
/** @typedef {import("@weborigami/types").AsyncTree} AsyncTree */
|
|
2
|
-
import {
|
|
3
|
-
import { OrigamiFiles
|
|
2
|
+
import { Tree, scope } from "@weborigami/async-tree";
|
|
3
|
+
import { OrigamiFiles } from "@weborigami/language";
|
|
4
4
|
import builtins from "../builtins/@builtins.js";
|
|
5
5
|
import { keySymbol } from "../common/utilities.js";
|
|
6
|
+
import assertTreeIsDefined from "../misc/assertTreeIsDefined.js";
|
|
6
7
|
import debug from "./@debug.js";
|
|
7
8
|
|
|
8
9
|
const miscUrl = new URL("../misc", import.meta.url);
|
|
9
|
-
const miscFiles =
|
|
10
|
+
const miscFiles = new OrigamiFiles(miscUrl);
|
|
11
|
+
miscFiles.parent = builtins;
|
|
10
12
|
|
|
11
13
|
/**
|
|
12
14
|
* @this {AsyncTree|null}
|
|
13
15
|
*/
|
|
14
16
|
export default async function explore(...keys) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
}
|
|
19
|
-
ambientsTree[keySymbol] = "explore command";
|
|
20
|
-
const extendedScope = new Scope(ambientsTree, scope);
|
|
17
|
+
assertTreeIsDefined(this, "explore");
|
|
18
|
+
if (!this) {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
21
|
|
|
22
22
|
/** @type {any} */
|
|
23
23
|
let result;
|
|
24
24
|
if (keys.length > 0) {
|
|
25
25
|
// Traverse the scope using the given keys.
|
|
26
|
-
const
|
|
27
|
-
if (!
|
|
26
|
+
const debugTree = await debug.call(this, this);
|
|
27
|
+
if (!debugTree) {
|
|
28
28
|
return undefined;
|
|
29
29
|
}
|
|
30
|
-
|
|
30
|
+
const debugScope = scope(debugTree);
|
|
31
31
|
// HACK: reproduce logic of ExplorableSiteTransform that turns a trailing
|
|
32
32
|
// slash into index.html. Calling `debug` applies that transform and the
|
|
33
33
|
// transform should handle that logic, but unfortunately the `traverse`
|
|
@@ -42,11 +42,12 @@ export default async function explore(...keys) {
|
|
|
42
42
|
const templateFile = await miscFiles.get("explore.ori");
|
|
43
43
|
const template = await templateFile.unpack();
|
|
44
44
|
|
|
45
|
-
const data = await getScopeData(scope);
|
|
45
|
+
const data = await getScopeData(scope(this));
|
|
46
46
|
const text = await template(data);
|
|
47
47
|
|
|
48
48
|
result = new String(text);
|
|
49
|
-
|
|
49
|
+
const tree = this;
|
|
50
|
+
result.unpack = () => debug.call(tree, tree);
|
|
50
51
|
}
|
|
51
52
|
|
|
52
53
|
return result;
|
package/src/builtins/@files.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { OrigamiFiles
|
|
1
|
+
import { OrigamiFiles } from "@weborigami/language";
|
|
2
2
|
import os from "node:os";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import process from "node:process";
|
|
5
|
-
import
|
|
5
|
+
import assertTreeIsDefined from "../misc/assertTreeIsDefined.js";
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* @typedef {import("@weborigami/types").AsyncTree} AsyncTree
|
|
@@ -11,7 +11,7 @@ import assertScopeIsDefined from "../misc/assertScopeIsDefined.js";
|
|
|
11
11
|
* @param {string[]} keys
|
|
12
12
|
*/
|
|
13
13
|
export default async function files(...keys) {
|
|
14
|
-
|
|
14
|
+
assertTreeIsDefined(this, "files");
|
|
15
15
|
|
|
16
16
|
// If path begins with `~`, treat it relative to the home directory.
|
|
17
17
|
// Otherwise, treat it relative to the current working directory.
|
|
@@ -25,9 +25,7 @@ export default async function files(...keys) {
|
|
|
25
25
|
}
|
|
26
26
|
const resolved = path.resolve(basePath, relativePath);
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
let result = new OrigamiFiles(resolved);
|
|
30
|
-
result = Scope.treeWithScope(result, this);
|
|
28
|
+
const result = new OrigamiFiles(resolved);
|
|
31
29
|
return result;
|
|
32
30
|
}
|
|
33
31
|
|
package/src/builtins/@filter.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { Scope } from "@weborigami/language";
|
|
2
1
|
import FilterTree from "../common/FilterTree.js";
|
|
3
|
-
import
|
|
2
|
+
import assertTreeIsDefined from "../misc/assertTreeIsDefined.js";
|
|
4
3
|
|
|
5
4
|
/**
|
|
6
5
|
* Apply a filter to a tree.
|
|
@@ -12,10 +11,8 @@ import assertScopeIsDefined from "../misc/assertScopeIsDefined.js";
|
|
|
12
11
|
* @param {Treelike} filterVariant
|
|
13
12
|
*/
|
|
14
13
|
export default async function filter(treelike, filterVariant) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
let result = new FilterTree(treelike, filterVariant);
|
|
18
|
-
result = Scope.treeWithScope(result, this);
|
|
14
|
+
assertTreeIsDefined(this, "filter");
|
|
15
|
+
const result = new FilterTree(treelike, filterVariant);
|
|
19
16
|
return result;
|
|
20
17
|
}
|
|
21
18
|
|