@elaraai/e3 1.0.69 → 1.0.71

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.
@@ -0,0 +1,6 @@
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
+ export {};
6
+ //# sourceMappingURL=open-beast-link.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-beast-link.spec.d.ts","sourceRoot":"","sources":["../../src/open-beast-link.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,134 @@
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
+ * `FileSystem.openBeast` across the stock runners (#660): a function that
7
+ * opens a beast2 file lazily calls the GENERIC platform function
8
+ * `fs_open_beast<T>`, provided by the std family on every runtime. Exported
9
+ * from one language and imported into a task (#628), it links against the
10
+ * east-node, east-c and east-py stock runners alike — the family rule
11
+ * (`runnerProvides`) needs no change for a generic call — and a runner
12
+ * without the family is refused naming the call. The std compliance corpus
13
+ * pins the values the three implementations produce for the same IR.
14
+ */
15
+ import { describe, it, before, after } from 'node:test';
16
+ import * as assert from 'node:assert';
17
+ import * as fs from 'node:fs';
18
+ import * as os from 'node:os';
19
+ import * as path from 'node:path';
20
+ import yauzl from 'yauzl';
21
+ import { East, DictType, FunctionType, IntegerType, StringType, StructType, decodeBeast2For, decodeEastIR, walkIR, IMPORT_PLATFORM, } from '@elaraai/east';
22
+ import { DatasetRefType } from '@elaraai/e3-types';
23
+ import { export_ } from './export.js';
24
+ import { package_ } from './package.js';
25
+ import { task } from './task.js';
26
+ import { input } from './input.js';
27
+ import { runnerProvides } from './runner.js';
28
+ // The declaration every std package implements; the wrapper in
29
+ // @elaraai/east-node-std spells the same call.
30
+ const fs_open_beast = East.genericPlatform('fs_open_beast', ['T'], [StringType], 'T');
31
+ const TableType = DictType(IntegerType, StructType({ id: IntegerType, name: StringType }));
32
+ const total = East.function([StringType], IntegerType, ($, file) => {
33
+ const table = $.let(fs_open_beast([TableType], file));
34
+ const sum = $.let(0n);
35
+ $.for(table, ($, row) => {
36
+ $.assign(sum, sum.add(row.id));
37
+ });
38
+ return sum;
39
+ });
40
+ const manifest = East.exportFunctions('tables', '1.0.0', { total }, { providers: { fs_open_beast: 'east-py-std' } });
41
+ const tot = East.importFunction('tables', 'total', FunctionType([StringType], IntegerType));
42
+ function countImports(ir) {
43
+ let n = 0;
44
+ walkIR(ir, (node) => { if (node.type === 'Platform' && node.value.name === IMPORT_PLATFORM)
45
+ n += 1; });
46
+ return n;
47
+ }
48
+ function genericPlatformCalls(ir) {
49
+ const calls = [];
50
+ walkIR(ir, (node) => {
51
+ if (node.type === 'Platform' && node.value.name !== IMPORT_PLATFORM) {
52
+ calls.push({ name: node.value.name, typeParameters: node.value.type_parameters.length });
53
+ }
54
+ });
55
+ return calls;
56
+ }
57
+ /** Reads a zip into a path → bytes map. */
58
+ async function readZip(zipPath) {
59
+ return new Promise((resolve, reject) => {
60
+ yauzl.open(zipPath, { lazyEntries: true }, (err, zipfile) => {
61
+ if (err)
62
+ return reject(err);
63
+ if (!zipfile)
64
+ return reject(new Error('No zipfile'));
65
+ const entries = new Map();
66
+ zipfile.readEntry();
67
+ zipfile.on('entry', (entry) => {
68
+ if (/\/$/.test(entry.fileName)) {
69
+ zipfile.readEntry();
70
+ }
71
+ else {
72
+ zipfile.openReadStream(entry, (err, readStream) => {
73
+ if (err)
74
+ return reject(err);
75
+ if (!readStream)
76
+ return reject(new Error('No read stream'));
77
+ const chunks = [];
78
+ readStream.on('data', (chunk) => chunks.push(chunk));
79
+ readStream.on('end', () => {
80
+ entries.set(entry.fileName, Buffer.concat(chunks));
81
+ zipfile.readEntry();
82
+ });
83
+ });
84
+ }
85
+ });
86
+ zipfile.on('end', () => resolve(entries));
87
+ zipfile.on('error', reject);
88
+ });
89
+ });
90
+ }
91
+ /** The IR object a bundle holds for `data/<refPath>.ref`. */
92
+ function irAt(entries, refPath) {
93
+ const ref = decodeBeast2For(DatasetRefType)(new Uint8Array(entries.get(`data/${refPath}.ref`)));
94
+ assert.strictEqual(ref.type, 'value');
95
+ const hash = ref.value.hash;
96
+ return decodeEastIR(new Uint8Array(entries.get(`objects/${hash.slice(0, 2)}/${hash.slice(2)}.beast2`)));
97
+ }
98
+ const STOCK_RUNNERS = [
99
+ { runtime: 'east-node', platforms: ['@elaraai/east-node-std'] },
100
+ { runtime: 'east-c', platforms: ['east-c-std'] },
101
+ { runtime: 'east-py', platforms: ['east-py-std'] },
102
+ ];
103
+ describe('FileSystem.openBeast links on every stock runner (#660)', () => {
104
+ let tempDir;
105
+ before(() => { tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'e3-open-beast-')); });
106
+ after(() => { fs.rmSync(tempDir, { recursive: true, force: true }); });
107
+ it('the generic call is provided by the std family of each stock runner', () => {
108
+ for (const runner of STOCK_RUNNERS) {
109
+ assert.ok(runnerProvides(runner, 'east-py-std'), `${runner.runtime} provides the std family`);
110
+ }
111
+ assert.ok(!runnerProvides({ runtime: 'east-node', platforms: ['@elaraai/east-node-io'] }, 'east-py-std'));
112
+ });
113
+ for (const runner of STOCK_RUNNERS) {
114
+ it(`embeds the imported function for the ${runner.runtime} runner, its generic platform call intact`, async () => {
115
+ const file = input('file', StringType, 'rows.beast2');
116
+ const use = task('sum_rows', [file], East.function([StringType], IntegerType, ($, p) => tot(p)), { runner });
117
+ const pkg = package_('importer', '1.0.0', use);
118
+ const zipPath = path.join(tempDir, `importer-${runner.runtime}.zip`);
119
+ await export_(pkg, zipPath, { functions: [manifest] });
120
+ const bundle = irAt(await readZip(zipPath), 'tasks/sum_rows/function_ir');
121
+ assert.strictEqual(countImports(bundle.ir), 0, 'the import resolved to embedded IR');
122
+ assert.deepStrictEqual(genericPlatformCalls(bundle.ir), [{ name: 'fs_open_beast', typeParameters: 1 }]);
123
+ });
124
+ }
125
+ it("refuses a runner whose packages do not provide the call, naming it", async () => {
126
+ const file = input('file', StringType, 'rows.beast2');
127
+ const use = task('sum_rows', [file], East.function([StringType], IntegerType, ($, p) => tot(p)), {
128
+ runner: { runtime: 'east-node', platforms: ['@elaraai/east-node-io'] },
129
+ });
130
+ const pkg = package_('importer', '1.0.0', use);
131
+ await assert.rejects(export_(pkg, path.join(tempDir, 'bad-runner.zip'), { functions: [manifest] }), /task "sum_rows" imports tables\.total, which calls platform function "fs_open_beast" provided by east-py-std, but its east-node runner lists @elaraai\/east-node-io/);
132
+ });
133
+ });
134
+ //# sourceMappingURL=open-beast-link.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-beast-link.spec.js","sourceRoot":"","sources":["../../src/open-beast-link.spec.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elaraai/e3",
3
- "version": "1.0.69",
3
+ "version": "1.0.71",
4
4
  "description": "TypeScript SDK for authoring e3 packages",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",
@@ -19,10 +19,10 @@
19
19
  "dependencies": {
20
20
  "smol-toml": "^1.3.1",
21
21
  "yazl": "^2.5.1",
22
- "@elaraai/e3-types": "1.0.69"
22
+ "@elaraai/e3-types": "1.0.71"
23
23
  },
24
24
  "peerDependencies": {
25
- "@elaraai/east": "1.0.69"
25
+ "@elaraai/east": "1.0.71"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@types/node": "^22.10.1",