@elaraai/east 1.0.68 → 1.0.70
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/dist/src/ast.d.ts +2 -0
- package/dist/src/ast.d.ts.map +1 -1
- package/dist/src/ast_to_ir.d.ts +7 -3
- package/dist/src/ast_to_ir.d.ts.map +1 -1
- package/dist/src/ast_to_ir.js +62 -15
- package/dist/src/ast_to_ir.js.map +1 -1
- package/dist/src/builtins.d.ts +1 -1
- package/dist/src/builtins.d.ts.map +1 -1
- package/dist/src/builtins.js +7 -0
- package/dist/src/builtins.js.map +1 -1
- package/dist/src/codegen/codegen.spec.d.ts +6 -0
- package/dist/src/codegen/codegen.spec.d.ts.map +1 -0
- package/dist/src/codegen/codegen.spec.js +763 -0
- package/dist/src/codegen/codegen.spec.js.map +1 -0
- package/dist/src/codegen/doc.d.ts +111 -0
- package/dist/src/codegen/doc.d.ts.map +1 -0
- package/dist/src/codegen/doc.js +350 -0
- package/dist/src/codegen/doc.js.map +1 -0
- package/dist/src/codegen/doc.spec.d.ts +6 -0
- package/dist/src/codegen/doc.spec.d.ts.map +1 -0
- package/dist/src/codegen/doc.spec.js +86 -0
- package/dist/src/codegen/doc.spec.js.map +1 -0
- package/dist/src/codegen/index.d.ts +15 -0
- package/dist/src/codegen/index.d.ts.map +1 -0
- package/dist/src/codegen/index.js +15 -0
- package/dist/src/codegen/index.js.map +1 -0
- package/dist/src/codegen/printer.d.ts +63 -0
- package/dist/src/codegen/printer.d.ts.map +1 -0
- package/dist/src/codegen/printer.js +1529 -0
- package/dist/src/codegen/printer.js.map +1 -0
- package/dist/src/codegen/spellings.d.ts +73 -0
- package/dist/src/codegen/spellings.d.ts.map +1 -0
- package/dist/src/codegen/spellings.js +299 -0
- package/dist/src/codegen/spellings.js.map +1 -0
- package/dist/src/codegen/spellings.spec.d.ts +6 -0
- package/dist/src/codegen/spellings.spec.d.ts.map +1 -0
- package/dist/src/codegen/spellings.spec.js +191 -0
- package/dist/src/codegen/spellings.spec.js.map +1 -0
- package/dist/src/codegen/types.d.ts +67 -0
- package/dist/src/codegen/types.d.ts.map +1 -0
- package/dist/src/codegen/types.js +173 -0
- package/dist/src/codegen/types.js.map +1 -0
- package/dist/src/compile.d.ts.map +1 -1
- package/dist/src/compile.js +50 -2
- package/dist/src/compile.js.map +1 -1
- package/dist/src/compile.open_beast.spec.d.ts +6 -0
- package/dist/src/compile.open_beast.spec.d.ts.map +1 -0
- package/dist/src/compile.open_beast.spec.js +99 -0
- package/dist/src/compile.open_beast.spec.js.map +1 -0
- package/dist/src/expr/blob.d.ts +41 -1
- package/dist/src/expr/blob.d.ts.map +1 -1
- package/dist/src/expr/blob.js +52 -0
- package/dist/src/expr/blob.js.map +1 -1
- package/dist/src/expr/block.d.ts +148 -0
- package/dist/src/expr/block.d.ts.map +1 -1
- package/dist/src/expr/block.js +168 -4
- package/dist/src/expr/block.js.map +1 -1
- package/dist/src/expr/index.d.ts +155 -2
- package/dist/src/expr/index.d.ts.map +1 -1
- package/dist/src/expr/index.js +155 -2
- package/dist/src/expr/index.js.map +1 -1
- package/dist/src/expr/libs/datetime.d.ts +11 -0
- package/dist/src/expr/libs/datetime.d.ts.map +1 -1
- package/dist/src/expr/libs/datetime.js +11 -0
- package/dist/src/expr/libs/datetime.js.map +1 -1
- package/dist/src/functions.crossimport.spec.d.ts +6 -0
- package/dist/src/functions.crossimport.spec.d.ts.map +1 -0
- package/dist/src/functions.crossimport.spec.js +45 -0
- package/dist/src/functions.crossimport.spec.js.map +1 -0
- package/dist/src/functions.d.ts +4103 -0
- package/dist/src/functions.d.ts.map +1 -0
- package/dist/src/functions.js +443 -0
- package/dist/src/functions.js.map +1 -0
- package/dist/src/functions.spec.d.ts +6 -0
- package/dist/src/functions.spec.d.ts.map +1 -0
- package/dist/src/functions.spec.js +123 -0
- package/dist/src/functions.spec.js.map +1 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/naming.d.ts +50 -0
- package/dist/src/naming.d.ts.map +1 -0
- package/dist/src/naming.js +194 -0
- package/dist/src/naming.js.map +1 -0
- package/dist/src/naming.spec.d.ts +6 -0
- package/dist/src/naming.spec.d.ts.map +1 -0
- package/dist/src/naming.spec.js +154 -0
- package/dist/src/naming.spec.js.map +1 -0
- package/dist/src/serialization/beast2/index.d.ts +16 -1
- package/dist/src/serialization/beast2/index.d.ts.map +1 -1
- package/dist/src/serialization/beast2/index.js +24 -3
- package/dist/src/serialization/beast2/index.js.map +1 -1
- package/dist/src/serialization/beast2/index.spec.js +25 -0
- package/dist/src/serialization/beast2/index.spec.js.map +1 -1
- package/dist/src/serialization/beast2/shared.d.ts +1 -1
- package/dist/src/serialization/beast2/shared.d.ts.map +1 -1
- package/dist/src/serialization/beast2/shared.js +9 -1
- package/dist/src/serialization/beast2/shared.js.map +1 -1
- package/dist/src/serialization/beast2/v4/container.d.ts +10 -0
- package/dist/src/serialization/beast2/v4/container.d.ts.map +1 -1
- package/dist/src/serialization/beast2/v4/container.js +13 -0
- package/dist/src/serialization/beast2/v4/container.js.map +1 -1
- package/dist/src/serialization/beast2/v5/frames.d.ts +17 -0
- package/dist/src/serialization/beast2/v5/frames.d.ts.map +1 -1
- package/dist/src/serialization/beast2/v5/frames.js +40 -0
- package/dist/src/serialization/beast2/v5/frames.js.map +1 -1
- package/dist/src/serialization/beast2/v5/geometry.d.ts +10 -113
- package/dist/src/serialization/beast2/v5/geometry.d.ts.map +1 -1
- package/dist/src/serialization/beast2/v5/geometry.js +7 -151
- package/dist/src/serialization/beast2/v5/geometry.js.map +1 -1
- package/dist/src/serialization/beast2/v5/lazy.d.ts +8 -2
- package/dist/src/serialization/beast2/v5/lazy.d.ts.map +1 -1
- package/dist/src/serialization/beast2/v5/lazy.js +9 -3
- package/dist/src/serialization/beast2/v5/lazy.js.map +1 -1
- package/dist/src/serialization/beast2/v5/range.d.ts +201 -0
- package/dist/src/serialization/beast2/v5/range.d.ts.map +1 -0
- package/dist/src/serialization/beast2/v5/range.js +252 -0
- package/dist/src/serialization/beast2/v5/range.js.map +1 -0
- package/dist/src/serialization/beast2/v5/stream.d.ts +29 -5
- package/dist/src/serialization/beast2/v5/stream.d.ts.map +1 -1
- package/dist/src/serialization/beast2/v5/stream.js +86 -19
- package/dist/src/serialization/beast2/v5/stream.js.map +1 -1
- package/dist/src/serialization/beast2/v5/sync-reader.spec.d.ts +6 -0
- package/dist/src/serialization/beast2/v5/sync-reader.spec.d.ts.map +1 -0
- package/dist/src/serialization/beast2/v5/sync-reader.spec.js +228 -0
- package/dist/src/serialization/beast2/v5/sync-reader.spec.js.map +1 -0
- package/dist/src/serialization/index.d.ts +1 -1
- package/dist/src/serialization/index.d.ts.map +1 -1
- package/dist/src/serialization/index.js +1 -1
- package/dist/src/serialization/index.js.map +1 -1
- package/package.json +11 -2
package/dist/src/index.d.ts
CHANGED
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC"}
|
package/dist/src/index.js
CHANGED
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Authoring names for IR variables (#639).
|
|
7
|
+
*
|
|
8
|
+
* The IR carries a name on every variable; the builders used to mint `_N`.
|
|
9
|
+
* These helpers recover the names the author wrote, with no new API:
|
|
10
|
+
*
|
|
11
|
+
* - a body's **parameters** from the function's own source text
|
|
12
|
+
* (`Function.prototype.toString()`): `($, items, threshold) => …` names
|
|
13
|
+
* `items` and `threshold`;
|
|
14
|
+
* - a **`$.let` / `$.const` binding** from the call site the source map
|
|
15
|
+
* already resolves: the declaration whose initializer is the call at that
|
|
16
|
+
* position — `const total = $.let(` names `total`.
|
|
17
|
+
*
|
|
18
|
+
* Both are read with the TypeScript compiler's parser (`typescript`, an
|
|
19
|
+
* optional peer dependency loaded through node's `require` on first use),
|
|
20
|
+
* never by matching patterns against text. Where the compiler is absent — a
|
|
21
|
+
* browser, a project without TypeScript — or a source cannot be read (a REPL
|
|
22
|
+
* line that is gone, a native function), the name stays `_N`, exactly as
|
|
23
|
+
* before. Uniqueness is the lowering's job (`ast_to_ir` suffixes a
|
|
24
|
+
* collision), not this module's.
|
|
25
|
+
*/
|
|
26
|
+
import type { Location } from "./location.js";
|
|
27
|
+
/**
|
|
28
|
+
* The parameter names of a JavaScript function, from its source text, or
|
|
29
|
+
* `null` when they cannot be read (a native or bound function, no compiler).
|
|
30
|
+
*
|
|
31
|
+
* @param fn - The body function (an arrow, a `function`, or a method)
|
|
32
|
+
* @returns The names in order — the block parameter included, at index 0; a
|
|
33
|
+
* destructured parameter is `""` (it names no slot); nothing past a rest
|
|
34
|
+
* parameter
|
|
35
|
+
*/
|
|
36
|
+
export declare function parameterNames(fn: unknown): string[] | null;
|
|
37
|
+
/**
|
|
38
|
+
* The name a `$.let` / `$.const` call binds: the variable whose declaration
|
|
39
|
+
* (or assignment) has that call as its initializer. Takes the first location
|
|
40
|
+
* (the caller's frame; East's own frames are already filtered out) and the
|
|
41
|
+
* innermost call whose head holds it, so a call inside another call's
|
|
42
|
+
* arguments, or one with a further call chained onto it, is its own.
|
|
43
|
+
*
|
|
44
|
+
* @param frames - The call-site locations, innermost first
|
|
45
|
+
* @returns The binding name, or `null` when the call binds none (a bare
|
|
46
|
+
* `$.let(...)` statement, a call inside another call's arguments, a chained
|
|
47
|
+
* `$.let(...).add(...)`, an unreadable file, no compiler)
|
|
48
|
+
*/
|
|
49
|
+
export declare function bindingNameAt(frames: readonly Location[]): string | null;
|
|
50
|
+
//# sourceMappingURL=naming.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naming.d.ts","sourceRoot":"","sources":["../../src/naming.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAyB9C;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,OAAO,GAAG,MAAM,EAAE,GAAG,IAAI,CAmB3D;AAgHD;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,GAAG,MAAM,GAAG,IAAI,CAiBxE"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
let compilerModule;
|
|
6
|
+
/** The TypeScript compiler, required once from this module's location; `null` where it cannot be. */
|
|
7
|
+
function compiler() {
|
|
8
|
+
if (compilerModule !== undefined)
|
|
9
|
+
return compilerModule;
|
|
10
|
+
compilerModule = null;
|
|
11
|
+
try {
|
|
12
|
+
const proc = globalThis.process;
|
|
13
|
+
const nodeModule = typeof proc?.getBuiltinModule === "function" ? proc.getBuiltinModule("node:module") : null;
|
|
14
|
+
if (nodeModule)
|
|
15
|
+
compilerModule = nodeModule.createRequire(import.meta.url)("typescript");
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
compilerModule = null;
|
|
19
|
+
}
|
|
20
|
+
return compilerModule;
|
|
21
|
+
}
|
|
22
|
+
// ── parameter names from the function's source ────────────────────────────
|
|
23
|
+
/**
|
|
24
|
+
* The parameter names of a JavaScript function, from its source text, or
|
|
25
|
+
* `null` when they cannot be read (a native or bound function, no compiler).
|
|
26
|
+
*
|
|
27
|
+
* @param fn - The body function (an arrow, a `function`, or a method)
|
|
28
|
+
* @returns The names in order — the block parameter included, at index 0; a
|
|
29
|
+
* destructured parameter is `""` (it names no slot); nothing past a rest
|
|
30
|
+
* parameter
|
|
31
|
+
*/
|
|
32
|
+
export function parameterNames(fn) {
|
|
33
|
+
if (typeof fn !== "function")
|
|
34
|
+
return null;
|
|
35
|
+
const ts = compiler();
|
|
36
|
+
if (ts === null)
|
|
37
|
+
return null;
|
|
38
|
+
let text;
|
|
39
|
+
try {
|
|
40
|
+
text = Function.prototype.toString.call(fn);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
// an arrow or a `function` parses as an expression; a method (`name(a, b) { … }`) as an object literal's member
|
|
46
|
+
const node = functionNode(ts, `(${text})`) ?? functionNode(ts, `({${text}})`);
|
|
47
|
+
if (node === null)
|
|
48
|
+
return null;
|
|
49
|
+
const names = [];
|
|
50
|
+
for (const p of node.parameters) {
|
|
51
|
+
if (p.dotDotDotToken !== undefined)
|
|
52
|
+
break;
|
|
53
|
+
names.push(ts.isIdentifier(p.name) ? p.name.text : "");
|
|
54
|
+
}
|
|
55
|
+
return names;
|
|
56
|
+
}
|
|
57
|
+
/** The outermost function-like node of `source`, or `null` when it does not parse cleanly. */
|
|
58
|
+
function functionNode(ts, source) {
|
|
59
|
+
const file = ts.createSourceFile("body.js", source, ts.ScriptTarget.Latest, true, ts.ScriptKind.JS);
|
|
60
|
+
const diagnostics = file.parseDiagnostics ?? [];
|
|
61
|
+
if (diagnostics.length > 0)
|
|
62
|
+
return null;
|
|
63
|
+
let found = null;
|
|
64
|
+
const visit = (node) => {
|
|
65
|
+
if (found !== null)
|
|
66
|
+
return;
|
|
67
|
+
if (ts.isFunctionLike(node)) {
|
|
68
|
+
found = node;
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
ts.forEachChild(node, visit);
|
|
72
|
+
};
|
|
73
|
+
visit(file);
|
|
74
|
+
return found;
|
|
75
|
+
}
|
|
76
|
+
const bindingCache = new Map();
|
|
77
|
+
const CACHE_LIMIT = 512;
|
|
78
|
+
/** A location's file as a path `fs` can open (the source map stores `file://` URLs and relative paths). */
|
|
79
|
+
function pathOf(filename) {
|
|
80
|
+
if (filename.startsWith("file://")) {
|
|
81
|
+
try {
|
|
82
|
+
const proc = globalThis.process;
|
|
83
|
+
const url = typeof proc?.getBuiltinModule === "function" ? proc.getBuiltinModule("node:url") : null;
|
|
84
|
+
if (url)
|
|
85
|
+
return url.fileURLToPath(filename);
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
// fall through
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return filename;
|
|
92
|
+
}
|
|
93
|
+
function scriptKind(ts, filename) {
|
|
94
|
+
if (filename.endsWith(".tsx"))
|
|
95
|
+
return ts.ScriptKind.TSX;
|
|
96
|
+
if (filename.endsWith(".ts") || filename.endsWith(".mts") || filename.endsWith(".cts"))
|
|
97
|
+
return ts.ScriptKind.TS;
|
|
98
|
+
if (filename.endsWith(".jsx"))
|
|
99
|
+
return ts.ScriptKind.JSX;
|
|
100
|
+
return ts.ScriptKind.JS;
|
|
101
|
+
}
|
|
102
|
+
/** The variable `call` initializes — `const x = call(…)`, `x = call(…)` — or `null`. */
|
|
103
|
+
function bindingOf(ts, call) {
|
|
104
|
+
const parent = call.parent;
|
|
105
|
+
if (ts.isVariableDeclaration(parent) && parent.initializer === call && ts.isIdentifier(parent.name))
|
|
106
|
+
return parent.name.text;
|
|
107
|
+
if (ts.isBinaryExpression(parent) && parent.right === call && parent.operatorToken.kind === ts.SyntaxKind.EqualsToken && ts.isIdentifier(parent.left)) {
|
|
108
|
+
return parent.left.text;
|
|
109
|
+
}
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
/** Every call of a source file, by the lines its head spans. */
|
|
113
|
+
function indexCalls(ts, filename, text) {
|
|
114
|
+
const file = ts.createSourceFile(filename, text, ts.ScriptTarget.Latest, true, scriptKind(ts, filename));
|
|
115
|
+
const index = new Map();
|
|
116
|
+
const visit = (node) => {
|
|
117
|
+
if (ts.isCallExpression(node)) {
|
|
118
|
+
const from = node.getStart(file);
|
|
119
|
+
const to = node.arguments.pos;
|
|
120
|
+
const start = file.getLineAndCharacterOfPosition(from);
|
|
121
|
+
const end = file.getLineAndCharacterOfPosition(to);
|
|
122
|
+
const head = {
|
|
123
|
+
fromLine: start.line + 1, fromColumn: start.character + 1, toLine: end.line + 1, toColumn: end.character + 1,
|
|
124
|
+
from, to, name: bindingOf(ts, node),
|
|
125
|
+
};
|
|
126
|
+
for (let line = head.fromLine; line <= head.toLine; line++) {
|
|
127
|
+
const heads = index.get(line);
|
|
128
|
+
if (heads === undefined)
|
|
129
|
+
index.set(line, [head]);
|
|
130
|
+
else
|
|
131
|
+
heads.push(head);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
ts.forEachChild(node, visit);
|
|
135
|
+
};
|
|
136
|
+
visit(file);
|
|
137
|
+
return index;
|
|
138
|
+
}
|
|
139
|
+
/** The call index of a file, built once; `null` where the file cannot be read. */
|
|
140
|
+
function callsOf(ts, filename) {
|
|
141
|
+
const hit = bindingCache.get(filename);
|
|
142
|
+
if (hit !== undefined)
|
|
143
|
+
return hit;
|
|
144
|
+
if (bindingCache.size >= CACHE_LIMIT)
|
|
145
|
+
bindingCache.clear();
|
|
146
|
+
let index = null;
|
|
147
|
+
try {
|
|
148
|
+
const proc = globalThis.process;
|
|
149
|
+
const fs = typeof proc?.getBuiltinModule === "function" ? proc.getBuiltinModule("node:fs") : null;
|
|
150
|
+
if (fs)
|
|
151
|
+
index = indexCalls(ts, filename, fs.readFileSync(filename, "utf-8"));
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
index = null;
|
|
155
|
+
}
|
|
156
|
+
bindingCache.set(filename, index);
|
|
157
|
+
return index;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* The name a `$.let` / `$.const` call binds: the variable whose declaration
|
|
161
|
+
* (or assignment) has that call as its initializer. Takes the first location
|
|
162
|
+
* (the caller's frame; East's own frames are already filtered out) and the
|
|
163
|
+
* innermost call whose head holds it, so a call inside another call's
|
|
164
|
+
* arguments, or one with a further call chained onto it, is its own.
|
|
165
|
+
*
|
|
166
|
+
* @param frames - The call-site locations, innermost first
|
|
167
|
+
* @returns The binding name, or `null` when the call binds none (a bare
|
|
168
|
+
* `$.let(...)` statement, a call inside another call's arguments, a chained
|
|
169
|
+
* `$.let(...).add(...)`, an unreadable file, no compiler)
|
|
170
|
+
*/
|
|
171
|
+
export function bindingNameAt(frames) {
|
|
172
|
+
const frame = frames[0];
|
|
173
|
+
if (frame === undefined)
|
|
174
|
+
return null;
|
|
175
|
+
const ts = compiler();
|
|
176
|
+
if (ts === null)
|
|
177
|
+
return null;
|
|
178
|
+
const index = callsOf(ts, pathOf(frame.filename));
|
|
179
|
+
if (index === null)
|
|
180
|
+
return null;
|
|
181
|
+
const line = Number(frame.line);
|
|
182
|
+
const column = Number(frame.column);
|
|
183
|
+
let innermost = null;
|
|
184
|
+
for (const head of index.get(line) ?? []) {
|
|
185
|
+
const afterStart = line > head.fromLine || column >= head.fromColumn;
|
|
186
|
+
const beforeEnd = line < head.toLine || column <= head.toColumn;
|
|
187
|
+
if (!afterStart || !beforeEnd)
|
|
188
|
+
continue;
|
|
189
|
+
if (innermost === null || head.from > innermost.from || (head.from === innermost.from && head.to < innermost.to))
|
|
190
|
+
innermost = head;
|
|
191
|
+
}
|
|
192
|
+
return innermost === null ? null : innermost.name;
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=naming.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naming.js","sourceRoot":"","sources":["../../src/naming.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naming.spec.d.ts","sourceRoot":"","sources":["../../src/naming.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Authoring names in the IR (#639): a body's parameter names and the
|
|
7
|
+
* `$.let` / `$.const` binding names reach the IR's variables, unique per
|
|
8
|
+
* build, and come back out of `East.toSource`. Python twin:
|
|
9
|
+
* `libs/east-py/packages/east-py/tests/test_authoring_names.py`.
|
|
10
|
+
*/
|
|
11
|
+
import { describe, test } from "node:test";
|
|
12
|
+
import assert from "node:assert/strict";
|
|
13
|
+
import { mkdtempSync, writeFileSync } from "node:fs";
|
|
14
|
+
import { tmpdir } from "node:os";
|
|
15
|
+
import { join } from "node:path";
|
|
16
|
+
import { pathToFileURL } from "node:url";
|
|
17
|
+
import { East, ArrayType, FloatType, IntegerType, StringType, VariantType, variant } from "./index.js";
|
|
18
|
+
import { bindingNameAt, parameterNames } from "./naming.js";
|
|
19
|
+
/** Every distinct `Variable` name in the IR, in first-seen order. */
|
|
20
|
+
function variableNames(ir) {
|
|
21
|
+
const names = [];
|
|
22
|
+
const walk = (node) => {
|
|
23
|
+
if (Array.isArray(node)) {
|
|
24
|
+
for (const child of node)
|
|
25
|
+
walk(child);
|
|
26
|
+
}
|
|
27
|
+
else if (node !== null && typeof node === "object") {
|
|
28
|
+
const rec = node;
|
|
29
|
+
if (rec.type === "Variable" && rec.value !== null && typeof rec.value === "object") {
|
|
30
|
+
const name = rec.value.name;
|
|
31
|
+
if (typeof name === "string" && !names.includes(name))
|
|
32
|
+
names.push(name);
|
|
33
|
+
}
|
|
34
|
+
for (const child of Object.values(rec))
|
|
35
|
+
walk(child);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
walk(ir);
|
|
39
|
+
return names;
|
|
40
|
+
}
|
|
41
|
+
describe("parameterNames", () => {
|
|
42
|
+
test("reads arrows, functions, a bare parameter, defaults and async", () => {
|
|
43
|
+
assert.deepEqual(parameterNames(($, items, threshold) => [$, items, threshold]), ["$", "items", "threshold"]);
|
|
44
|
+
assert.deepEqual(parameterNames(function ($, a) { return [$, a]; }), ["$", "a"]);
|
|
45
|
+
assert.deepEqual(parameterNames((x) => x), ["x"]);
|
|
46
|
+
assert.deepEqual(parameterNames(($, a = 1) => [$, a]), ["$", "a"]);
|
|
47
|
+
assert.deepEqual(parameterNames(async ($, a) => [$, a]), ["$", "a"]);
|
|
48
|
+
assert.deepEqual(parameterNames(() => 0), []);
|
|
49
|
+
});
|
|
50
|
+
test("a destructured parameter names no slot; nothing past a rest parameter", () => {
|
|
51
|
+
assert.deepEqual(parameterNames(($, { a }, b) => [$, a, b]), ["$", "", "b"]);
|
|
52
|
+
assert.deepEqual(parameterNames(($, ...rest) => [$, rest]), ["$"]);
|
|
53
|
+
});
|
|
54
|
+
test("gives up on what has no readable source", () => {
|
|
55
|
+
assert.equal(parameterNames(Math.max), null);
|
|
56
|
+
assert.equal(parameterNames((($, a) => [$, a]).bind(null)), null);
|
|
57
|
+
assert.equal(parameterNames(null), null);
|
|
58
|
+
assert.equal(parameterNames("($, a) => a"), null);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
describe("bindingNameAt", () => {
|
|
62
|
+
const dir = mkdtempSync(join(tmpdir(), "east-naming-"));
|
|
63
|
+
const file = join(dir, "body.ts");
|
|
64
|
+
writeFileSync(file, [
|
|
65
|
+
"const total = $.let(0n);",
|
|
66
|
+
"$.let(1n);",
|
|
67
|
+
"const wide =",
|
|
68
|
+
" $.let(2n);",
|
|
69
|
+
"const a = $.let(1n), b = $.let(2n);",
|
|
70
|
+
"let count: bigint = $.let(3n);",
|
|
71
|
+
"const outer = $.let(f($.const(1n)));",
|
|
72
|
+
"const chained = $.let(0n).add(1n);",
|
|
73
|
+
"let later; later = $.let(4n);",
|
|
74
|
+
"const split = $",
|
|
75
|
+
" .let(5n);",
|
|
76
|
+
].join("\n"));
|
|
77
|
+
const at = (line, column) => bindingNameAt([{ filename: file, line: BigInt(line), column: BigInt(column) }]);
|
|
78
|
+
test("names the binding on the calling line, at the callee or its property", () => {
|
|
79
|
+
assert.equal(at(1, 17), "total"); // `let`, where V8 points
|
|
80
|
+
assert.equal(at(1, 15), "total"); // `$`, where a source map may
|
|
81
|
+
assert.equal(at(6, 23), "count");
|
|
82
|
+
});
|
|
83
|
+
test("a bare statement binds nothing", () => {
|
|
84
|
+
assert.equal(at(2, 1), null);
|
|
85
|
+
});
|
|
86
|
+
test("a call indented under `const x =` takes the name above", () => {
|
|
87
|
+
assert.equal(at(4, 7), "wide");
|
|
88
|
+
});
|
|
89
|
+
test("two bindings on one line resolve by column", () => {
|
|
90
|
+
assert.equal(at(5, 13), "a");
|
|
91
|
+
assert.equal(at(5, 28), "b");
|
|
92
|
+
});
|
|
93
|
+
test("only the call that is the initializer names the variable", () => {
|
|
94
|
+
assert.equal(at(7, 17), "outer"); // `$.let(` — the `let` token, where V8 points
|
|
95
|
+
assert.equal(at(7, 25), null); // `$.const(` inside the arguments
|
|
96
|
+
assert.equal(at(8, 19), null); // `$.let(0n).add(1n)` binds the sum
|
|
97
|
+
assert.equal(at(9, 22), "later"); // an assignment, not a declaration
|
|
98
|
+
assert.equal(at(11, 6), "split"); // the callee split over two lines
|
|
99
|
+
});
|
|
100
|
+
test("a file:// location, a missing file and no frames", () => {
|
|
101
|
+
assert.equal(bindingNameAt([{ filename: pathToFileURL(file).href, line: 1n, column: 17n }]), "total");
|
|
102
|
+
assert.equal(bindingNameAt([{ filename: join(dir, "missing.ts"), line: 1n, column: 17n }]), null);
|
|
103
|
+
assert.equal(bindingNameAt([]), null);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
describe("IR variables carry the authoring names", () => {
|
|
107
|
+
const Shape = VariantType({ circle: FloatType, square: FloatType });
|
|
108
|
+
const fn = East.function([ArrayType(IntegerType), StringType], StringType, ($, items, label) => {
|
|
109
|
+
const total = $.let(0n);
|
|
110
|
+
$.for(items, ($, item, index) => {
|
|
111
|
+
$.assign(total, total.add(item.multiply(index)));
|
|
112
|
+
});
|
|
113
|
+
const doubled = $.const(items.map(($, x) => x.multiply(2n)).reduce(($, acc, x) => acc.add(x), 0n));
|
|
114
|
+
const shape = $.const(variant("circle", 2.0), Shape);
|
|
115
|
+
const area = $.const(shape.match({
|
|
116
|
+
circle: ($, radius) => radius.multiply(radius),
|
|
117
|
+
square: ($, side) => side.multiply(side),
|
|
118
|
+
}));
|
|
119
|
+
return label.concat(East.print(total)).concat(East.print(doubled)).concat(East.print(area));
|
|
120
|
+
});
|
|
121
|
+
const names = variableNames(fn.toIR().ir);
|
|
122
|
+
test("parameters, bindings, loop and callback variables, match arms", () => {
|
|
123
|
+
for (const expected of ["items", "label", "total", "item", "index", "doubled", "x", "acc", "area", "radius", "side"]) {
|
|
124
|
+
assert.ok(names.includes(expected), `${expected} in ${names.join(", ")}`);
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
test("sibling bodies reuse a name; a slot the body did not name stays _N", () => {
|
|
128
|
+
assert.ok(!names.includes("x_2"), `the map's and the reduce's x are siblings: ${names.join(", ")}`);
|
|
129
|
+
assert.ok(names.some(n => /^_\d+$/.test(n)), `an unnamed slot in ${names.join(", ")}`);
|
|
130
|
+
assert.ok(!names.includes("$"));
|
|
131
|
+
});
|
|
132
|
+
test("a name still in scope takes a suffix, so an alias to the outer variable keeps its meaning", () => {
|
|
133
|
+
const shadowing = East.function([ArrayType(IntegerType), IntegerType], IntegerType, ($, xs, x) => {
|
|
134
|
+
const outer = x; // an alias to the parameter
|
|
135
|
+
const inner = $.const(xs.map(($, x) => x.add(outer)).sum()); // the callback shadows `x`
|
|
136
|
+
return inner.add(xs.map(($, x) => x).size()); // a sibling reuses `x`
|
|
137
|
+
});
|
|
138
|
+
assert.deepEqual(variableNames(shadowing.toIR().ir).filter(n => /^x(_\d+)?$/.test(n)), ["x", "x_2"]);
|
|
139
|
+
assert.equal(shadowing.toIR().compile([])([1n, 2n], 10n), 25n);
|
|
140
|
+
});
|
|
141
|
+
test("the names come back out of East.toSource", () => {
|
|
142
|
+
const source = East.toSource(fn);
|
|
143
|
+
assert.match(source, /const total = \$\.let\(0n\)/);
|
|
144
|
+
assert.match(source, /\$\.for\(items, \(\$, item, index/);
|
|
145
|
+
assert.match(source, /circle: \(\$, radius\) => radius\.multiply\(radius\)/);
|
|
146
|
+
assert.match(source, /reduce\(\(\$, acc, x, _\d+\) => acc\.add\(x\)/);
|
|
147
|
+
});
|
|
148
|
+
test("names start afresh for every build", () => {
|
|
149
|
+
const again = East.function([IntegerType], IntegerType, ($, x) => $.const(x.add(1n)));
|
|
150
|
+
assert.deepEqual(variableNames(again.toIR().ir).filter(n => n === "x"), ["x"]);
|
|
151
|
+
assert.deepEqual(variableNames(fn.toIR().ir), names);
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
//# sourceMappingURL=naming.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naming.spec.js","sourceRoot":"","sources":["../../src/naming.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,8 +24,23 @@ export { MAGIC_BYTES_V5 } from "./v5/codec.js";
|
|
|
24
24
|
export type { Beast2DecodeOptions } from "./shared.js";
|
|
25
25
|
export type { Beast2Codec } from "./v5/frames.js";
|
|
26
26
|
export { Beast2Writer, type Beast2WriterOptions, encodeBeast2SegmentsFor, encodeBeast2PagedFor, type Beast2PagedEncodeOptions, BEAST2_PAGED_BATCH_DEFAULT, BEAST2_PAGED_TARGET_BYTES_DEFAULT, iterBeast2SegmentsFor, Beast2Pages, openBeast2PagesFor, } from "./v5/stream.js";
|
|
27
|
-
export { type Beast2Extents, readBeast2Extents, carveBeast2, spliceBeast2, rebuildBeast2, type RebuildBeast2Options, type Beast2RangeReader, type Beast2RangedExtents, type ReadBeast2ExtentsRangedOptions, readBeast2ExtentsRanged, carveBeast2Ranged, spliceBeast2Tail, } from "./v5/geometry.js";
|
|
27
|
+
export { type Beast2Extents, readBeast2Extents, carveBeast2, spliceBeast2, rebuildBeast2, type RebuildBeast2Options, type Beast2RangeReader, type Beast2SyncRangeReader, type Beast2RangedExtents, type ReadBeast2ExtentsRangedOptions, readBeast2ExtentsRanged, readBeast2ExtentsSync, isBeast2SyncRangeReader, carveBeast2Ranged, spliceBeast2Tail, } from "./v5/geometry.js";
|
|
28
28
|
export { openBeast2LazyFor, isBeast2LazySafe, type Beast2LazySafeOptions } from "./v5/lazy.js";
|
|
29
|
+
/**
|
|
30
|
+
* Reads the root type a beast2 blob's header declares, without decoding the
|
|
31
|
+
* value.
|
|
32
|
+
*
|
|
33
|
+
* Both container versions carry the type up front, so this is O(header) for
|
|
34
|
+
* either; the version is sniffed from the magic. A decoder built for another
|
|
35
|
+
* type would read garbage, which is what the in-expression opens
|
|
36
|
+
* (`blob.openBeast`, `FileSystem.openBeast`) check against on every runtime.
|
|
37
|
+
*
|
|
38
|
+
* @param data - the blob to inspect
|
|
39
|
+
* @returns the declared root type
|
|
40
|
+
* @throws {Error} When the data is not a beast2 container, or its type
|
|
41
|
+
* section is malformed.
|
|
42
|
+
*/
|
|
43
|
+
export declare function readBeast2Type(data: Uint8Array): EastTypeValue;
|
|
29
44
|
/**
|
|
30
45
|
* Whether a blob carries the v5 trailing paging index (a well-formed
|
|
31
46
|
* index + footer). O(index) — inspects the blob's tail without decoding any
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/serialization/beast2/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;GAOG;AAEH,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE5E,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAU,KAAK,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/serialization/beast2/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;GAOG;AAEH,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE5E,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAU,KAAK,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAiBvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAwB,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAExE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EACL,YAAY,EACZ,KAAK,mBAAmB,EACxB,uBAAuB,EACvB,oBAAoB,EACpB,KAAK,wBAAwB,EAC7B,0BAA0B,EAC1B,iCAAiC,EACjC,qBAAqB,EACrB,WAAW,EACX,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,KAAK,aAAa,EAClB,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,aAAa,EACb,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,8BAA8B,EACnC,uBAAuB,EACvB,qBAAqB,EACrB,uBAAuB,EACvB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,KAAK,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAG/F;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,aAAa,CAG9D;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAMxD;AAMD,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AA6B9F,mDAAmD;AACnD,MAAM,MAAM,mBAAmB,GAAG;IAChC,+EAA+E;IAC/E,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAC7B;6EACyE;IACzE,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,yDAAyD;IACzD,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB;+BAC2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,CAAC,KAAK,EAAE,GAAG,KAAK,UAAU,CAAA;AAC/G,wBAAgB,eAAe,CAAC,CAAC,SAAS,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,UAAU,CAAA;AAYlI;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,CAAC,IAAI,EAAE,UAAU,KAAK,GAAG,CAAA;AAC9G,wBAAgB,eAAe,CAAC,CAAC,SAAS,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,CAAC,IAAI,EAAE,UAAU,KAAK,WAAW,CAAC,CAAC,CAAC,CAAA;AAiBjI;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,CAAC,IAAI,EAAE,UAAU,KAAK,OAAO,CAAC,GAAG,CAAC,CAAA;AAC5H,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,CAAC,IAAI,EAAE,UAAU,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;AAmB/I;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,GAAG,CAAA;CAAE,CAKjH;AAWD;;qDAEqD;AACrD,wBAAgB,YAAY,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,mBAAmB,EAAE,WAAW,CAAC,GAAG,UAAU,CAEvJ;AAED;;uEAEuE;AACvE,wBAAgB,YAAY,CAAC,CAAC,SAAS,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAQ7F;AAED,8CAA8C;AAC9C,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,UAAU,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAQvG;AAiBD,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,gBAAgB,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,CAAC,CAErH;AAED,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,eAAe,EAAE,QAAQ,EAAE,gBAAgB,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAExI"}
|
|
@@ -14,16 +14,37 @@ import { toEastTypeValue } from "../../type_of_type.js";
|
|
|
14
14
|
import { isVariant } from "../../containers/variant.js";
|
|
15
15
|
import { IRType } from "../../ir.js";
|
|
16
16
|
import { EastIR, AsyncEastIR } from "../../eastir.js";
|
|
17
|
+
import { BufferReader } from "../binary-utils.js";
|
|
17
18
|
import {} from "./shared.js";
|
|
18
|
-
import {
|
|
19
|
+
import { readTypeSection } from "./v5/type-section.js";
|
|
20
|
+
import { MAGIC_BYTES, encodeBeast2V4For, decodeBeast2V4For, decodeBeast2V4, decodeIRWithSourceMapV4, readBeast2V4Type, } from "./v4/container.js";
|
|
19
21
|
import { encodeBeast2V5For, decodeBeast2V5For, decodeBeast2V5ForAsync, decodeBeast2V5, decodeIRWithSourceMapV5, } from "./v5/codec.js";
|
|
20
22
|
import { BEAST2_WRITE_VERSION } from "./version.js";
|
|
21
23
|
export { MAGIC_BYTES } from "./v4/container.js";
|
|
22
24
|
export { MAGIC_BYTES_V5 } from "./v5/codec.js";
|
|
23
25
|
export { Beast2Writer, encodeBeast2SegmentsFor, encodeBeast2PagedFor, BEAST2_PAGED_BATCH_DEFAULT, BEAST2_PAGED_TARGET_BYTES_DEFAULT, iterBeast2SegmentsFor, Beast2Pages, openBeast2PagesFor, } from "./v5/stream.js";
|
|
24
|
-
export { readBeast2Extents, carveBeast2, spliceBeast2, rebuildBeast2, readBeast2ExtentsRanged, carveBeast2Ranged, spliceBeast2Tail, } from "./v5/geometry.js";
|
|
26
|
+
export { readBeast2Extents, carveBeast2, spliceBeast2, rebuildBeast2, readBeast2ExtentsRanged, readBeast2ExtentsSync, isBeast2SyncRangeReader, carveBeast2Ranged, spliceBeast2Tail, } from "./v5/geometry.js";
|
|
25
27
|
export { openBeast2LazyFor, isBeast2LazySafe } from "./v5/lazy.js";
|
|
26
|
-
import { readIndex } from "./v5/codec.js";
|
|
28
|
+
import { readIndex, MAGIC_BYTES_V5 } from "./v5/codec.js";
|
|
29
|
+
/**
|
|
30
|
+
* Reads the root type a beast2 blob's header declares, without decoding the
|
|
31
|
+
* value.
|
|
32
|
+
*
|
|
33
|
+
* Both container versions carry the type up front, so this is O(header) for
|
|
34
|
+
* either; the version is sniffed from the magic. A decoder built for another
|
|
35
|
+
* type would read garbage, which is what the in-expression opens
|
|
36
|
+
* (`blob.openBeast`, `FileSystem.openBeast`) check against on every runtime.
|
|
37
|
+
*
|
|
38
|
+
* @param data - the blob to inspect
|
|
39
|
+
* @returns the declared root type
|
|
40
|
+
* @throws {Error} When the data is not a beast2 container, or its type
|
|
41
|
+
* section is malformed.
|
|
42
|
+
*/
|
|
43
|
+
export function readBeast2Type(data) {
|
|
44
|
+
if (sniffVersion(data) !== 5)
|
|
45
|
+
return readBeast2V4Type(data);
|
|
46
|
+
return readTypeSection(new BufferReader(data, MAGIC_BYTES_V5.length)).rootType;
|
|
47
|
+
}
|
|
27
48
|
/**
|
|
28
49
|
* Whether a blob carries the v5 trailing paging index (a well-formed
|
|
29
50
|
* index + footer). O(index) — inspects the blob's tail without decoding any
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/serialization/beast2/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;GAOG;AAEH,OAAO,EAAE,eAAe,EAAsB,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAExD,OAAO,EAAE,MAAM,EAAyC,MAAM,aAAa,CAAC;AAE5E,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEtD,OAAO,EAA4B,MAAM,aAAa,CAAC;AACvD,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,uBAAuB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/serialization/beast2/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,7 @@ import { toEastTypeValue, EastTypeValueType } from "../../type_of_type.js";
|
|
|
14
14
|
import { IRType } from "../../ir.js";
|
|
15
15
|
import { equalFor } from "../../comparison.js";
|
|
16
16
|
import { East, variant, ref, some, none } from "../../index.js";
|
|
17
|
+
import { EastError } from "../../error.js";
|
|
17
18
|
import { matrix } from "../../containers/matrix.js";
|
|
18
19
|
import { encodeBeast2For, decodeBeast2For, decodeBeast2, } from "./index.js";
|
|
19
20
|
const typeEqual = equalFor(EastTypeValueType);
|
|
@@ -401,6 +402,30 @@ describe("Beast2 v2 — Functions (round-trip)", () => {
|
|
|
401
402
|
assert.equal(decoded[0](5n), 6n);
|
|
402
403
|
assert.equal(decoded[1](5n), 10n);
|
|
403
404
|
});
|
|
405
|
+
test("decoded function resolves error locations against the blob's map (#626)", () => {
|
|
406
|
+
const FnType = FunctionType([IntegerType], IntegerType);
|
|
407
|
+
const compiled = East.compile(East.function([IntegerType], IntegerType, ($, x) => x.divide(0n)), []);
|
|
408
|
+
const decoded = decodeBeast2For(FnType)(encodeBeast2For(FnType)(compiled));
|
|
409
|
+
const raised = (fn) => {
|
|
410
|
+
try {
|
|
411
|
+
fn(1n);
|
|
412
|
+
}
|
|
413
|
+
catch (e) {
|
|
414
|
+
if (e instanceof EastError)
|
|
415
|
+
return e;
|
|
416
|
+
throw e;
|
|
417
|
+
}
|
|
418
|
+
throw new Error("expected the division by zero to raise");
|
|
419
|
+
};
|
|
420
|
+
const original = raised(compiled);
|
|
421
|
+
const replayed = raised(decoded);
|
|
422
|
+
// The map rides the blob, and the decoded compile runs under it — so the
|
|
423
|
+
// replayed error names the authoring site exactly as the original does,
|
|
424
|
+
// rather than whatever map happened to be ambient at decode time.
|
|
425
|
+
assert.ok(original.location.length > 0, "the original reports its authoring frames");
|
|
426
|
+
assert.match(original.location[0].filename, /index\.spec\.[cm]?[jt]s$/);
|
|
427
|
+
assert.deepEqual(replayed.location, original.location, "the decoded function reports the same frames");
|
|
428
|
+
});
|
|
404
429
|
});
|
|
405
430
|
// =============================================================================
|
|
406
431
|
// 8. Recursive types via EastTypeValue (encodeBeast2For with toEastTypeValue)
|