@elaraai/east-node-cli 1.0.67 → 1.0.69

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/README.md CHANGED
@@ -57,6 +57,35 @@ east-node version
57
57
  east-node version -p @elaraai/east-node-std -p @elaraai/east-node-io
58
58
  ```
59
59
 
60
+ ### Transpiling IR to TypeScript
61
+
62
+ ```bash
63
+ # Print an IR program as East.function builder source
64
+ east-node transpile ./program.beast2 -o program.ts
65
+
66
+ # Every IR file in a directory, plus the IR each printed module builds
67
+ # back — the round-trip check
68
+ east-node transpile ./ir/ -o ./ts/ --rebuild ./rebuilt/
69
+ ```
70
+
71
+ The printed module imports `@elaraai/east` and rebuilds the same IR
72
+ (equal under `east-c ir normalize`): the `$`-forms for statements,
73
+ expression methods and `East.value(..., T)` constructions for values.
74
+ Builtins the TypeScript surface has no spelling for print through
75
+ `East.builtin(...)`. `east-py transpile` is the python twin; the two
76
+ printers and the cross-language sweep are described in
77
+ `docs/conventions/EAST_CODEGEN.md`.
78
+
79
+ ### Exporting functions for another language
80
+
81
+ ```bash
82
+ # Write a module's `eastFunctions` export as a function manifest that a python
83
+ # package (or another TypeScript package) imports with East.import_function /
84
+ # East.importFunction; -p names the platform packages implementing any
85
+ # platform calls the functions make
86
+ east-node export-functions dist/pricing.js -o pricing.functions.beast2 -p @elaraai/east-node-std
87
+ ```
88
+
60
89
  ## CLI Reference
61
90
 
62
91
  ### `east-node run`
@@ -77,6 +106,43 @@ Options:
77
106
  -h, --help Display help
78
107
  ```
79
108
 
109
+ ### `east-node transpile`
110
+
111
+ Print an East IR program as TypeScript `East.function` builder source.
112
+
113
+ ```
114
+ east-node transpile <input> [options]
115
+
116
+ Arguments:
117
+ input Path to an IR file (.beast2, .beast, .east, or .json), or a directory of them
118
+
119
+ Options:
120
+ -o, --output <path> Write the module here (a directory when <input> is one; default: stdout)
121
+ --name <name> The module-level export bound to the rebuilt function (default: main)
122
+ --import-from <specifier> The module the printed source imports East from (default: @elaraai/east)
123
+ --rebuild <path> Import the printed module and write the IR it builds here
124
+ (.beast2 or .json; a directory in directory mode)
125
+ ```
126
+
127
+ ### `east-node export-functions`
128
+
129
+ Write a module's `eastFunctions` export (name → `East.function` result) as a function manifest.
130
+
131
+ ```
132
+ east-node export-functions <module> -o <file> [options]
133
+
134
+ Arguments:
135
+ module Path to the built module exporting `eastFunctions`
136
+
137
+ Options:
138
+ -o, --output <file> The manifest to write (.beast2)
139
+ -p, --package <package...> Platform packages implementing the functions' platform calls
140
+ (every dependency must be provided by one; recorded as its provider)
141
+ --name <name> The package name importers use (default: the module file's stem)
142
+ --package-version <version> The version recorded in the manifest (default: 0.0.0)
143
+ --only <name...> Export only these functions of `eastFunctions` (default: all)
144
+ ```
145
+
80
146
  ### `east-node version`
81
147
 
82
148
  Show version information.
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAkLH,wBAAgB,IAAI,IAAI,IAAI,CAkC3B"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA2PH,wBAAgB,IAAI,IAAI,IAAI,CAwD3B"}
package/dist/cli.js CHANGED
@@ -3,11 +3,15 @@
3
3
  * Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
4
4
  */
5
5
  import { Command } from 'commander';
6
+ import { writeFileSync } from 'node:fs';
6
7
  import { createRequire } from 'module';
7
8
  import { EastError } from '@elaraai/east/internal';
8
9
  import { loadPlatforms, loadPlatformWithMetadata } from './loader.js';
9
10
  import { runProgram } from './runner.js';
10
11
  import { writeSnapshot, readSnapshot } from './snapshot.js';
12
+ import { encodeRebuilt, isDirectory, transpile, transpileDir } from './transpile.js';
13
+ import { exportFunctionsFromModule } from './export-functions.js';
14
+ import { East } from '@elaraai/east';
11
15
  const require = createRequire(import.meta.url);
12
16
  const pkg = require('../package.json');
13
17
  /** Parses the streaming-execution flags into runner options. */
@@ -111,6 +115,65 @@ async function cmdRun(irFile, options) {
111
115
  : (e.stack ?? `Error: ${e.message ?? String(err)}`));
112
116
  }
113
117
  }
118
+ /**
119
+ * `east-node transpile` (#628): print an IR file — or every IR file in a
120
+ * directory — as the TypeScript `East.function` builder surface. With
121
+ * `--rebuild`, the printed module is imported and the IR it builds is
122
+ * written too: the round-trip check, and the TypeScript leg of the
123
+ * cross-language conformance sweep.
124
+ */
125
+ async function cmdTranspile(input, options) {
126
+ try {
127
+ const common = {};
128
+ if (options.name !== undefined)
129
+ common.name = options.name;
130
+ if (options.importFrom !== undefined)
131
+ common.importFrom = options.importFrom;
132
+ if (isDirectory(input)) {
133
+ if (!options.output) {
134
+ return fail('Error: transpiling a directory needs -o <directory> for the modules');
135
+ }
136
+ const stems = await transpileDir(input, options.output, options.rebuild !== undefined ? { ...common, rebuildDir: options.rebuild } : common);
137
+ console.error(`Transpiled ${stems.length} IR file(s) to ${options.output}` +
138
+ (options.rebuild ? `, rebuilt to ${options.rebuild}` : ''));
139
+ return;
140
+ }
141
+ const { source, rebuilt } = await transpile(input, { ...common, rebuild: options.rebuild !== undefined });
142
+ if (options.output) {
143
+ writeFileSync(options.output, source, 'utf-8');
144
+ }
145
+ else {
146
+ process.stdout.write(source);
147
+ }
148
+ if (options.rebuild) {
149
+ writeFileSync(options.rebuild, encodeRebuilt(rebuilt, options.rebuild));
150
+ }
151
+ }
152
+ catch (err) {
153
+ return fail(`Error: ${err.message}`);
154
+ }
155
+ }
156
+ /**
157
+ * `east-node export-functions` (#628): write a module's `eastFunctions` as a
158
+ * function manifest other packages — in TypeScript or python — import.
159
+ */
160
+ async function cmdExportFunctions(modulePath, options) {
161
+ try {
162
+ const opts = { packages: options.package ?? [] };
163
+ if (options.name !== undefined)
164
+ opts.name = options.name;
165
+ if (options.packageVersion !== undefined)
166
+ opts.version = options.packageVersion;
167
+ if (options.only !== undefined)
168
+ opts.only = options.only;
169
+ const manifest = await exportFunctionsFromModule(modulePath, opts);
170
+ writeFileSync(options.output, East.encodeFunctionManifest(manifest));
171
+ console.error(`Exported ${manifest.functions.length} function(s) of ${manifest.package}@${manifest.version} to ${options.output}`);
172
+ }
173
+ catch (err) {
174
+ return fail(`Error: ${err.message}`);
175
+ }
176
+ }
114
177
  async function cmdVersion(options) {
115
178
  console.log(`${pkg.name} ${pkg.version}`);
116
179
  // Try to get east version
@@ -156,6 +219,25 @@ export function main() {
156
219
  .option('--stream <index>', 'Feed the given -i input (0-based) lazily, segment-by-segment')
157
220
  .option('--lazy-inputs <bytes>', 'Open indexed collection inputs at or above this size lazily (0 disables; default 64 MiB)')
158
221
  .action(cmdRun);
222
+ program
223
+ .command('transpile')
224
+ .description('Print an East IR program as TypeScript East.function builder source')
225
+ .argument('<input>', 'Path to an IR file (.beast2, .beast, .east, or .json), or a directory of them')
226
+ .option('-o, --output <path>', 'Write the module here (a directory when <input> is one; default: stdout)')
227
+ .option('--name <name>', 'The module-level export bound to the rebuilt function (default: main)')
228
+ .option('--import-from <specifier>', 'The module the printed source imports East from (default: @elaraai/east)')
229
+ .option('--rebuild <path>', 'Import the printed module and write the IR it builds here (.beast2 or .json; a directory in directory mode)')
230
+ .action(cmdTranspile);
231
+ program
232
+ .command('export-functions')
233
+ .description("Write a module's `eastFunctions` export as a function manifest other packages (TypeScript or python) import")
234
+ .argument('<module>', 'Path to the built module exporting `eastFunctions` (name -> East.function)')
235
+ .requiredOption('-o, --output <file>', 'The manifest to write (.beast2)')
236
+ .option('-p, --package <package...>', "Platform packages implementing the functions' platform calls (each dependency must be provided by one)")
237
+ .option('--name <name>', "The package name importers use (default: the module file's stem)")
238
+ .option('--package-version <version>', 'The version recorded in the manifest (default: 0.0.0)')
239
+ .option('--only <name...>', 'Export only these functions of `eastFunctions` (default: all)')
240
+ .action(cmdExportFunctions);
159
241
  program
160
242
  .command('version')
161
243
  .description('Show version information')
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACrF,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAsC,CAAC;AAc5E,gEAAgE;AAChE,SAAS,gBAAgB,CAAC,OAAmB;IACzC,MAAM,GAAG,GAAuF,EAAE,CAAC;IACnG,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAChF,MAAM,IAAI,KAAK,CAAC,kDAAkD,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC;QACvF,CAAC;QACD,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC5B,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,qDAAqD,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QAC5F,CAAC;QACD,GAAG,CAAC,WAAW,GAAG,KAAK,CAAC;IAC5B,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,6DAA6D,OAAO,CAAC,UAAU,GAAG,CAAC,CAAC;QACxG,CAAC;QACD,GAAG,CAAC,cAAc,GAAG,KAAK,CAAC;IAC/B,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAqBD;;;;;;;;;GASG;AACH,SAAS,IAAI,CAAC,OAAe;IACzB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACrB,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE;QACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;AACP,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,MAA0B,EAAE,OAAmB;IACjE,IAAI,CAAC;QACD,sDAAsD;QACtD,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACvB,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;gBACrD,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;gBAClD,OAAO,IAAI,CAAC,qEAAqE,CAAC,CAAC;YACvF,CAAC;YACD,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YACpD,IAAI,CAAC;gBACD,MAAM,WAAW,GAAG,MAAM,aAAa,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;gBACrD,MAAM,UAAU,CACZ,EAAE,CAAC,MAAM,EACT,WAAW,EACX,EAAE,CAAC,QAAQ,EACX,EAAE,CAAC,UAAU,EACb,OAAO,CAAC,MAAM,EACd,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,EAAE,CACtE,CAAC;YACN,CAAC;oBAAS,CAAC;gBACP,EAAE,CAAC,OAAO,EAAE,CAAC;YACjB,CAAC;YACD,OAAO;QACX,CAAC;QAED,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,OAAO,IAAI,CAAC,iEAAiE,CAAC,CAAC;QACnF,CAAC;QAED,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QACvC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,qDAAqD;gBAC7D,iEAAiE,CAAC,CAAC;QAC3E,CAAC;QAED,qEAAqE;QACrE,oEAAoE;QACpE,oEAAoE;QACpE,IAAI,OAAO,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,EAAE,CAAC;YACnF,OAAO,IAAI,CACP,gFAAgF;gBAChF,kFAAkF,CACrF,CAAC;QACN,CAAC;QAED,gFAAgF;QAChF,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,aAAa,CAAC;gBAChB,OAAO,EAAK,OAAO,CAAC,QAAQ;gBAC5B,MAAM,EAAM,MAAM;gBAClB,UAAU,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE;gBAC/B,QAAQ;gBACR,UAAU,EAAE,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,EAAE;aAC3C,CAAC,CAAC;YACH,IAAI,OAAO,CAAC,OAAO;gBAAE,OAAO,CAAC,KAAK,CAAC,aAAa,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;QAElD,MAAM,UAAU,CACZ,MAAM,EACN,WAAW,EACX,QAAQ,EACR,OAAO,CAAC,KAAK,IAAI,EAAE,EACnB,OAAO,CAAC,MAAM,EACd,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,EAAE,CACtE,CAAC;IACN,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,kEAAkE;QAClE,sEAAsE;QACtE,qEAAqE;QACrE,qEAAqE;QACrE,oEAAoE;QACpE,MAAM,CAAC,GAAG,GAAY,CAAC;QACvB,OAAO,IAAI,CAAC,GAAG,YAAY,SAAS;YAChC,CAAC,CAAC,UAAU,GAAG,CAAC,QAAQ,EAAE,EAAE;YAC5B,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,UAAU,CAAC,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,YAAY,CAAC,KAAa,EAAE,OAAyB;IAChE,IAAI,CAAC;QACD,MAAM,MAAM,GAA2C,EAAE,CAAC;QAC1D,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;YAAE,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAC3D,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS;YAAE,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QAC7E,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBAClB,OAAO,IAAI,CAAC,qEAAqE,CAAC,CAAC;YACvF,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,EAClD,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACzF,OAAO,CAAC,KAAK,CAAC,cAAc,KAAK,CAAC,MAAM,kBAAkB,OAAO,CAAC,MAAM,EAAE;gBACtE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAChE,OAAO;QACX,CAAC;QACD,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC,CAAC;QAC1G,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACjB,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;QACD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAClB,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,OAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7E,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,OAAO,IAAI,CAAC,UAAW,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IACpD,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,kBAAkB,CAAC,UAAkB,EAAE,OAA+B;IACjF,IAAI,CAAC;QACD,MAAM,IAAI,GAA8E,EAAE,QAAQ,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;QAC5H,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;YAAE,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzD,IAAI,OAAO,CAAC,cAAc,KAAK,SAAS;YAAE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC;QAChF,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;YAAE,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzD,MAAM,QAAQ,GAAG,MAAM,yBAAyB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACnE,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrE,OAAO,CAAC,KAAK,CAAC,YAAY,QAAQ,CAAC,SAAS,CAAC,MAAM,mBAAmB,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,OAAO,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACvI,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,OAAO,IAAI,CAAC,UAAW,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IACpD,CAAC;AACL,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,OAAuB;IAC7C,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAE1C,0BAA0B;IAC1B,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,OAAO,CAAC,4BAA4B,CAAwB,CAAC;QAC7E,OAAO,CAAC,GAAG,CAAC,iBAAiB,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACL,mDAAmD;IACvD,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;IACvC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAE1B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACD,MAAM,IAAI,GAAG,MAAM,wBAAwB,CAAC,OAAO,CAAC,CAAC;gBACrD,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,sBAAsB,CAAC,CAAC;YAC1F,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3D,CAAC;QACL,CAAC;IACL,CAAC;AACL,CAAC;AAED,MAAM,UAAU,IAAI;IAChB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACF,IAAI,CAAC,WAAW,CAAC;SACjB,WAAW,CAAC,sDAAsD,CAAC;SACnE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAE1B,OAAO;SACF,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,wBAAwB,CAAC;SACrC,QAAQ,CAAC,WAAW,EAAE,oDAAoD,CAAC;SAC3E,MAAM,CAAC,4BAA4B,EAAE,6CAA6C,CAAC;SACnF,MAAM,CAAC,uBAAuB,EAAE,sDAAsD,CAAC;SACvF,MAAM,CAAC,qBAAqB,EAAE,6BAA6B,CAAC;SAC5D,MAAM,CAAC,eAAe,EAAE,uBAAuB,CAAC;SAChD,MAAM,CAAC,mBAAmB,EAAE,wDAAwD,CAAC;SACrF,MAAM,CAAC,wBAAwB,EAC5B,wEAAwE,CAAC;SAC5E,MAAM,CAAC,eAAe,EACnB,6FAA6F,CAAC;SACjG,MAAM,CAAC,kBAAkB,EACtB,8DAA8D,CAAC;SAClE,MAAM,CAAC,uBAAuB,EAC3B,0FAA0F,CAAC;SAC9F,MAAM,CAAC,MAAM,CAAC,CAAC;IAEpB,OAAO;SACF,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,qEAAqE,CAAC;SAClF,QAAQ,CAAC,SAAS,EAAE,+EAA+E,CAAC;SACpG,MAAM,CAAC,qBAAqB,EAAE,0EAA0E,CAAC;SACzG,MAAM,CAAC,eAAe,EAAE,uEAAuE,CAAC;SAChG,MAAM,CAAC,2BAA2B,EAAE,0EAA0E,CAAC;SAC/G,MAAM,CAAC,kBAAkB,EACtB,6GAA6G,CAAC;SACjH,MAAM,CAAC,YAAY,CAAC,CAAC;IAE1B,OAAO;SACF,OAAO,CAAC,kBAAkB,CAAC;SAC3B,WAAW,CAAC,6GAA6G,CAAC;SAC1H,QAAQ,CAAC,UAAU,EAAE,4EAA4E,CAAC;SAClG,cAAc,CAAC,qBAAqB,EAAE,iCAAiC,CAAC;SACxE,MAAM,CAAC,4BAA4B,EAAE,wGAAwG,CAAC;SAC9I,MAAM,CAAC,eAAe,EAAE,kEAAkE,CAAC;SAC3F,MAAM,CAAC,6BAA6B,EAAE,uDAAuD,CAAC;SAC9F,MAAM,CAAC,kBAAkB,EAAE,+DAA+D,CAAC;SAC3F,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAEhC,OAAO;SACF,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,0BAA0B,CAAC;SACvC,MAAM,CAAC,4BAA4B,EAAE,4BAA4B,CAAC;SAClE,MAAM,CAAC,UAAU,CAAC,CAAC;IAExB,OAAO,CAAC,KAAK,EAAE,CAAC;AACpB,CAAC"}
@@ -0,0 +1,29 @@
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
+ import { type FunctionManifest } from '@elaraai/east';
6
+ /** Options for {@link exportFunctionsFromModule}. */
7
+ export interface ExportFunctionsOptions {
8
+ /** The package name importers use (default: the module file's stem). */
9
+ name?: string;
10
+ /** The version recorded in the manifest (default `0.0.0`). */
11
+ version?: string;
12
+ /** Platform packages implementing the functions' platform calls. */
13
+ packages?: string[];
14
+ /** Export only these functions of `eastFunctions` (default: all); a name it does not export is an error naming what it does. */
15
+ only?: string[];
16
+ }
17
+ /**
18
+ * Loads a module and builds the manifest of its `eastFunctions` export
19
+ * (name → `East.function` result).
20
+ *
21
+ * @param modulePath - Path to the module (a built `.js` / `.mjs`)
22
+ * @param options - Package name, version, the providing platform packages, and the functions to export
23
+ * @returns The manifest value
24
+ * @throws When the module has no `eastFunctions` object, a function in
25
+ * `only` is not exported, a function is not a closed value, or a platform
26
+ * dependency has no providing package
27
+ */
28
+ export declare function exportFunctionsFromModule(modulePath: string, options?: ExportFunctionsOptions): Promise<FunctionManifest>;
29
+ //# sourceMappingURL=export-functions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-functions.d.ts","sourceRoot":"","sources":["../src/export-functions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH,OAAO,EAAQ,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAG5D,qDAAqD;AACrD,MAAM,WAAW,sBAAsB;IACnC,wEAAwE;IACxE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,gIAAgI;IAChI,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,yBAAyB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,sBAA2B,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAoCnI"}
@@ -0,0 +1,71 @@
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
+ * `east-node export-functions` (#628): a module's `eastFunctions` export
7
+ * written as a function manifest that other packages — in TypeScript or
8
+ * python — import with `East.importFunction` / `East.import_function`.
9
+ * The twin of `east-py export-functions`.
10
+ *
11
+ * Every platform function the exported functions call must be implemented
12
+ * by one of the `-p` platform packages, which is recorded as the
13
+ * dependency's provider; a dependency no package provides is an error
14
+ * naming it, so an importer's runner can be checked at its own build.
15
+ * `only` narrows the export to the named functions — what an importer
16
+ * actually uses — so a sibling function's platform call never fails an
17
+ * export that does not need it.
18
+ */
19
+ import { basename, extname, resolve } from 'node:path';
20
+ import { pathToFileURL } from 'node:url';
21
+ import { East } from '@elaraai/east';
22
+ import { loadPlatform } from './loader.js';
23
+ /**
24
+ * Loads a module and builds the manifest of its `eastFunctions` export
25
+ * (name → `East.function` result).
26
+ *
27
+ * @param modulePath - Path to the module (a built `.js` / `.mjs`)
28
+ * @param options - Package name, version, the providing platform packages, and the functions to export
29
+ * @returns The manifest value
30
+ * @throws When the module has no `eastFunctions` object, a function in
31
+ * `only` is not exported, a function is not a closed value, or a platform
32
+ * dependency has no providing package
33
+ */
34
+ export async function exportFunctionsFromModule(modulePath, options = {}) {
35
+ const path = resolve(modulePath);
36
+ const mod = await import(pathToFileURL(path).href);
37
+ const exported = mod.eastFunctions;
38
+ if (exported === null || typeof exported !== 'object') {
39
+ throw new Error(`${modulePath} exports no \`eastFunctions\` object (name -> East.function result)`);
40
+ }
41
+ let functions = exported;
42
+ if (options.only !== undefined) {
43
+ const missing = options.only.filter(name => !(name in functions));
44
+ if (missing.length > 0) {
45
+ throw new Error(`${modulePath} exports no function${missing.length === 1 ? '' : 's'} ${missing.map(n => JSON.stringify(n)).join(', ')} — ` +
46
+ `its eastFunctions are ${Object.keys(functions).join(', ') || '(none)'}`);
47
+ }
48
+ functions = Object.fromEntries(options.only.map(name => [name, exported[name]]));
49
+ }
50
+ const providers = {};
51
+ for (const pkg of options.packages ?? []) {
52
+ for (const fn of await loadPlatform(pkg)) {
53
+ if (!(fn.name in providers))
54
+ providers[fn.name] = pkg;
55
+ }
56
+ }
57
+ const missing = new Set();
58
+ for (const fn of Object.values(functions)) {
59
+ for (const dep of East.platformDependencies(fn)) {
60
+ if (!(dep.name in providers))
61
+ missing.add(dep.name);
62
+ }
63
+ }
64
+ if (missing.size > 0) {
65
+ throw new Error(`platform function(s) no -p package provides: ${[...missing].sort().join(', ')} — ` +
66
+ 'pass the implementing package with -p');
67
+ }
68
+ const name = options.name ?? basename(path, extname(path));
69
+ return East.exportFunctions(name, options.version ?? '0.0.0', functions, { providers });
70
+ }
71
+ //# sourceMappingURL=export-functions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-functions.js","sourceRoot":"","sources":["../src/export-functions.ts"],"names":[],"mappings":"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"}
@@ -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=export-functions.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-functions.spec.d.ts","sourceRoot":"","sources":["../src/export-functions.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,104 @@
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
+ * Tests for `east-node export-functions` (#628): a module's `eastFunctions`
7
+ * export becomes a manifest that links and runs; unprovided platform
8
+ * dependencies and a missing export are named.
9
+ */
10
+ import { describe, it } from 'node:test';
11
+ import assert from 'node:assert/strict';
12
+ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
13
+ import { tmpdir } from 'node:os';
14
+ import { join } from 'node:path';
15
+ import { East, EastIR, FunctionType, IntegerType } from '@elaraai/east';
16
+ import { exportFunctionsFromModule } from './export-functions.js';
17
+ const EAST = import.meta.resolve('@elaraai/east');
18
+ const MODULE = `
19
+ import { East, IntegerType, NullType, StringType } from ${JSON.stringify(EAST)};
20
+ const log = East.platform("log", [StringType], NullType);
21
+ export const double = East.function([IntegerType], IntegerType, ($, x) => x.multiply(2n));
22
+ export const shout = East.function([StringType], NullType, ($, s) => { $(log(s.upperCase())); });
23
+ export const eastFunctions = { double, shout };
24
+ `;
25
+ /**
26
+ * Plants the module under a fake project that also provides the `log`
27
+ * platform as its own `./platform` package (`acme-platform`), the way the
28
+ * loader resolves a project's platform from the cwd.
29
+ */
30
+ function plant(source) {
31
+ const dir = mkdtempSync(join(tmpdir(), 'enc-export-'));
32
+ const path = join(dir, 'pricing.mjs');
33
+ writeFileSync(path, source, 'utf-8');
34
+ const pkg = join(dir, 'node_modules', 'acme-platform');
35
+ mkdirSync(join(pkg, 'dist'), { recursive: true });
36
+ writeFileSync(join(pkg, 'package.json'), JSON.stringify({
37
+ name: 'acme-platform', version: '1.0.0', type: 'module',
38
+ exports: { './platform': './dist/platform.js', './package.json': './package.json' },
39
+ }));
40
+ writeFileSync(join(pkg, 'dist', 'platform.js'), 'export default [{ name: "log", inputs: [{ type: "String", value: null }], output: { type: "Null", value: null }, type: "sync", fn: () => null }];\n');
41
+ return { dir, path };
42
+ }
43
+ /** Runs `fn` with `process.cwd()` at `dir`, where the fake platform package resolves. */
44
+ async function withCwd(dir, fn) {
45
+ const prev = process.cwd();
46
+ process.chdir(dir);
47
+ try {
48
+ return await fn();
49
+ }
50
+ finally {
51
+ process.chdir(prev);
52
+ }
53
+ }
54
+ describe('east-node export-functions', () => {
55
+ it('writes a manifest that links and runs, recording each dependency\'s provider', async () => {
56
+ const { dir, path } = plant(MODULE);
57
+ try {
58
+ const manifest = await withCwd(dir, () => exportFunctionsFromModule(path, { version: '2.0.0', packages: ['acme-platform'] }));
59
+ assert.equal(manifest.package, 'pricing');
60
+ assert.equal(manifest.version, '2.0.0');
61
+ assert.deepEqual(manifest.functions.map(f => f.name), ['double', 'shout']);
62
+ assert.equal(manifest.functions[1].platforms[0].provider.value, 'acme-platform');
63
+ const back = East.decodeFunctionManifest(East.encodeFunctionManifest(manifest));
64
+ const imported = East.importFunction('pricing', 'double', FunctionType([IntegerType], IntegerType));
65
+ const user = East.function([IntegerType], IntegerType, ($, x) => imported(x).add(1n));
66
+ const { ir } = East.linkImports(user, [back]);
67
+ assert.equal(new EastIR(ir).compile([])(4n), 9n);
68
+ }
69
+ finally {
70
+ rmSync(dir, { recursive: true, force: true });
71
+ }
72
+ });
73
+ it('names a platform dependency no package provides', async () => {
74
+ const { dir, path } = plant(MODULE);
75
+ try {
76
+ await assert.rejects(exportFunctionsFromModule(path, {}), /no -p package provides: log/);
77
+ }
78
+ finally {
79
+ rmSync(dir, { recursive: true, force: true });
80
+ }
81
+ });
82
+ it('exports only the named functions — a sibling\'s unprovided platform call no longer matters — and names an unknown one', async () => {
83
+ const { dir, path } = plant(MODULE);
84
+ try {
85
+ // `shout` calls `log`, which no -p package provides here; exporting `double` alone is fine
86
+ const manifest = await exportFunctionsFromModule(path, { only: ['double'] });
87
+ assert.deepEqual(manifest.functions.map(f => f.name), ['double']);
88
+ await assert.rejects(exportFunctionsFromModule(path, { only: ['double', 'nope'] }), /exports no function "nope" — its eastFunctions are double, shout/);
89
+ }
90
+ finally {
91
+ rmSync(dir, { recursive: true, force: true });
92
+ }
93
+ });
94
+ it('needs the eastFunctions export', async () => {
95
+ const { dir, path } = plant('export const x = 1;\n');
96
+ try {
97
+ await assert.rejects(exportFunctionsFromModule(path, {}), /exports no `eastFunctions` object/);
98
+ }
99
+ finally {
100
+ rmSync(dir, { recursive: true, force: true });
101
+ }
102
+ });
103
+ });
104
+ //# sourceMappingURL=export-functions.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-functions.spec.js","sourceRoot":"","sources":["../src/export-functions.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
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
+ import type { EastIR, AsyncEastIR } from '@elaraai/east';
6
+ /** Options for {@link transpile}. */
7
+ export interface TranspileOptions {
8
+ /** The module-level export bound to the rebuilt function (default `main`). */
9
+ name?: string;
10
+ /** The module specifier the printed source imports from (default `@elaraai/east`). */
11
+ importFrom?: string;
12
+ /** Import the printed module and return the IR it builds. */
13
+ rebuild?: boolean;
14
+ }
15
+ /** The result of transpiling one IR file. */
16
+ export interface Transpiled {
17
+ /** The printed TypeScript module. */
18
+ source: string;
19
+ /** The IR the printed module builds — present when `rebuild` was requested. */
20
+ rebuilt?: EastIR<any, any> | AsyncEastIR<any, any>;
21
+ }
22
+ /**
23
+ * Prints an IR file as a TypeScript module, optionally rebuilding it.
24
+ *
25
+ * @param irPath - Path to the IR file (`.beast2`, `.beast`, `.east`, or `.json`)
26
+ * @param options - Export name, import specifier, and whether to rebuild
27
+ * @returns The module source, and the rebuilt IR when requested
28
+ * @throws When the file is not a function IR, or the IR has a shape the
29
+ * TypeScript surface cannot spell (`Unprintable`), or the printed module
30
+ * does not rebuild
31
+ */
32
+ export declare function transpile(irPath: string, options?: TranspileOptions): Promise<Transpiled>;
33
+ /**
34
+ * Encodes a rebuilt IR for a path: `.beast2` / `.beast` as the IR bundle
35
+ * (source map included), `.json` as the raw IR JSON `east-node run` reads.
36
+ *
37
+ * @param eastIR - The rebuilt IR bundle
38
+ * @param outPath - The path it will be written to; its extension picks the format
39
+ * @returns The encoded bytes
40
+ */
41
+ export declare function encodeRebuilt(eastIR: EastIR<any, any> | AsyncEastIR<any, any>, outPath: string): Uint8Array;
42
+ /**
43
+ * Transpiles every IR file in a directory: `<stem>.ts` under `outDir` for
44
+ * each `<stem>.<beast2|beast|east|json>`, and — when `rebuildDir` is given —
45
+ * `<stem>.beast2` there holding the IR each module builds.
46
+ *
47
+ * @param inDir - The directory of IR files (other files are ignored)
48
+ * @param outDir - Where the modules go (created)
49
+ * @param options - Export name, import specifier, and the rebuild directory
50
+ * @returns The stems transpiled, in order
51
+ * @throws On the first file that does not transpile, naming it
52
+ */
53
+ export declare function transpileDir(inDir: string, outDir: string, options?: TranspileOptions & {
54
+ rebuildDir?: string;
55
+ }): Promise<string[]>;
56
+ /** Whether a path is a directory. */
57
+ export declare function isDirectory(path: string): boolean;
58
+ //# sourceMappingURL=transpile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transpile.d.ts","sourceRoot":"","sources":["../src/transpile.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAoBH,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGzD,qCAAqC;AACrC,MAAM,WAAW,gBAAgB;IAC7B,8EAA8E;IAC9E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sFAAsF;IACtF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,6CAA6C;AAC7C,MAAM,WAAW,UAAU;IACvB,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,OAAO,CAAC,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;CACtD;AAID;;;;;;;;;GASG;AACH,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,UAAU,CAAC,CAOnG;AA4BD;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,CAK3G;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAgB,GAAG;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAqB7I;AAED,qCAAqC;AACrC,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAMjD"}
@@ -0,0 +1,129 @@
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
+ * `east-node transpile` (#628): an East IR file printed as the TypeScript
7
+ * `East.function` builder surface — `East.toSource` behind a CLI, the twin
8
+ * of `east-py transpile`.
9
+ *
10
+ * The printed module rebuilds the same IR (normalized) when imported, and a
11
+ * rebuild proves it here: the module is imported against this CLI's own
12
+ * `@elaraai/east` and the IR it builds is returned (and written, on the
13
+ * CLI) beside the source. That is the TypeScript leg of the cross-language
14
+ * round trip the east-py conformance suite drives: IR → python → IR →
15
+ * TypeScript → IR, every leg equal under `east-c ir normalize`.
16
+ */
17
+ import { mkdirSync, mkdtempSync, readdirSync, rmSync, statSync, writeFileSync } from 'node:fs';
18
+ import { tmpdir } from 'node:os';
19
+ import { basename, extname, join } from 'node:path';
20
+ import { pathToFileURL } from 'node:url';
21
+ import { encodeEastIR, encodeJSONFor, IRType, toSource } from '@elaraai/east';
22
+ import { loadIR } from './loader.js';
23
+ const IR_EXTENSIONS = new Set(['.beast2', '.beast', '.east', '.json']);
24
+ /**
25
+ * Prints an IR file as a TypeScript module, optionally rebuilding it.
26
+ *
27
+ * @param irPath - Path to the IR file (`.beast2`, `.beast`, `.east`, or `.json`)
28
+ * @param options - Export name, import specifier, and whether to rebuild
29
+ * @returns The module source, and the rebuilt IR when requested
30
+ * @throws When the file is not a function IR, or the IR has a shape the
31
+ * TypeScript surface cannot spell (`Unprintable`), or the printed module
32
+ * does not rebuild
33
+ */
34
+ export async function transpile(irPath, options = {}) {
35
+ const name = options.name ?? 'main';
36
+ const importFrom = options.importFrom ?? '@elaraai/east';
37
+ const ir = loadIR(irPath);
38
+ const source = toSource(ir, { name, importFrom });
39
+ if (!options.rebuild)
40
+ return { source };
41
+ return { source, rebuilt: await rebuild(source, name, importFrom) };
42
+ }
43
+ /**
44
+ * Imports a printed module against this CLI's own `@elaraai/east` and
45
+ * returns what its export builds.
46
+ *
47
+ * The module's import line is the printer's own (`from "<importFrom>"`);
48
+ * it is retargeted at the resolved package so the module loads from a
49
+ * temporary directory that has no `node_modules`.
50
+ */
51
+ async function rebuild(source, name, importFrom) {
52
+ const east = import.meta.resolve('@elaraai/east');
53
+ const retargeted = source.replace(`from ${JSON.stringify(importFrom)};`, `from ${JSON.stringify(east)};`);
54
+ const dir = mkdtempSync(join(tmpdir(), 'east-transpile-'));
55
+ try {
56
+ const path = join(dir, 'module.mjs');
57
+ writeFileSync(path, retargeted, 'utf-8');
58
+ const mod = await import(pathToFileURL(path).href);
59
+ const fn = mod[name];
60
+ if (fn === undefined || typeof fn.toIR !== 'function') {
61
+ throw new Error(`the printed module has no East function export named ${JSON.stringify(name)}`);
62
+ }
63
+ return fn.toIR();
64
+ }
65
+ finally {
66
+ rmSync(dir, { recursive: true, force: true });
67
+ }
68
+ }
69
+ /**
70
+ * Encodes a rebuilt IR for a path: `.beast2` / `.beast` as the IR bundle
71
+ * (source map included), `.json` as the raw IR JSON `east-node run` reads.
72
+ *
73
+ * @param eastIR - The rebuilt IR bundle
74
+ * @param outPath - The path it will be written to; its extension picks the format
75
+ * @returns The encoded bytes
76
+ */
77
+ export function encodeRebuilt(eastIR, outPath) {
78
+ const ext = extname(outPath).toLowerCase();
79
+ if (ext === '.beast2' || ext === '.beast')
80
+ return encodeEastIR(eastIR);
81
+ if (ext === '.json')
82
+ return encodeJSONFor(IRType)(eastIR.ir);
83
+ throw new Error(`Unsupported rebuild extension "${ext}". Supported extensions: .beast2, .beast, .json`);
84
+ }
85
+ /**
86
+ * Transpiles every IR file in a directory: `<stem>.ts` under `outDir` for
87
+ * each `<stem>.<beast2|beast|east|json>`, and — when `rebuildDir` is given —
88
+ * `<stem>.beast2` there holding the IR each module builds.
89
+ *
90
+ * @param inDir - The directory of IR files (other files are ignored)
91
+ * @param outDir - Where the modules go (created)
92
+ * @param options - Export name, import specifier, and the rebuild directory
93
+ * @returns The stems transpiled, in order
94
+ * @throws On the first file that does not transpile, naming it
95
+ */
96
+ export async function transpileDir(inDir, outDir, options = {}) {
97
+ const files = readdirSync(inDir).filter(f => IR_EXTENSIONS.has(extname(f).toLowerCase())).sort();
98
+ mkdirSync(outDir, { recursive: true });
99
+ if (options.rebuildDir !== undefined)
100
+ mkdirSync(options.rebuildDir, { recursive: true });
101
+ const stems = [];
102
+ for (const file of files) {
103
+ const stem = basename(file, extname(file));
104
+ let result;
105
+ try {
106
+ result = await transpile(join(inDir, file), { ...options, rebuild: options.rebuildDir !== undefined });
107
+ }
108
+ catch (err) {
109
+ throw new Error(`${file}: ${err.message}`);
110
+ }
111
+ writeFileSync(join(outDir, `${stem}.ts`), result.source, 'utf-8');
112
+ if (options.rebuildDir !== undefined) {
113
+ const out = join(options.rebuildDir, `${stem}.beast2`);
114
+ writeFileSync(out, encodeRebuilt(result.rebuilt, out));
115
+ }
116
+ stems.push(stem);
117
+ }
118
+ return stems;
119
+ }
120
+ /** Whether a path is a directory. */
121
+ export function isDirectory(path) {
122
+ try {
123
+ return statSync(path).isDirectory();
124
+ }
125
+ catch {
126
+ return false;
127
+ }
128
+ }
129
+ //# sourceMappingURL=transpile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transpile.js","sourceRoot":"","sources":["../src/transpile.ts"],"names":[],"mappings":"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"}
@@ -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=transpile.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transpile.spec.d.ts","sourceRoot":"","sources":["../src/transpile.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,110 @@
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
+ * Tests for `east-node transpile` (#628): an IR file prints as a TypeScript
7
+ * module that rebuilds the same IR, in file and directory mode, for every
8
+ * IR file format the loader reads.
9
+ */
10
+ import { describe, it } from 'node:test';
11
+ import assert from 'node:assert/strict';
12
+ import { mkdtempSync, readdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
13
+ import { tmpdir } from 'node:os';
14
+ import { join } from 'node:path';
15
+ import { East, IntegerType, StringType, ArrayType, IRType, encodeEastIR, encodeJSONFor, decodeEastIR, toSource, isTypeValueEqual, } from '@elaraai/east';
16
+ import { transpile, transpileDir, encodeRebuilt } from './transpile.js';
17
+ const double = East.function([IntegerType], IntegerType, ($, x) => x.multiply(2n));
18
+ const greet = East.function([StringType, ArrayType(IntegerType)], StringType, ($, name, xs) => {
19
+ const total = $.let(0n);
20
+ $.for(xs, ($, x) => { $.assign(total, total.add(x)); });
21
+ return East.str `${name}: ${total}`;
22
+ });
23
+ function scratch() {
24
+ return mkdtempSync(join(tmpdir(), 'enc-transpile-'));
25
+ }
26
+ describe('east-node transpile', () => {
27
+ it('prints a beast2 IR file as a module that rebuilds the same IR', async () => {
28
+ const dir = scratch();
29
+ try {
30
+ const ir = double.toIR();
31
+ const path = join(dir, 'double.beast2');
32
+ writeFileSync(path, encodeEastIR(ir));
33
+ const { source, rebuilt } = await transpile(path, { rebuild: true });
34
+ assert.match(source, /^import \{ East, .* \} from "@elaraai\/east";$/m);
35
+ assert.match(source, /export const main = East\.function\(\[IntegerType\], IntegerType, \(\$, x\) => x\.multiply\(2n\)\);/);
36
+ assert.ok(rebuilt !== undefined);
37
+ // The rebuild is a fixpoint: printing it gives the same module back.
38
+ assert.equal(toSource(rebuilt, {}), toSource(ir, {}));
39
+ assert.ok(isTypeValueEqual(rebuilt.ir.value.type, ir.ir.value.type));
40
+ }
41
+ finally {
42
+ rmSync(dir, { recursive: true, force: true });
43
+ }
44
+ });
45
+ it('honours the export name and import specifier, and still rebuilds', async () => {
46
+ const dir = scratch();
47
+ try {
48
+ const path = join(dir, 'greet.json');
49
+ writeFileSync(path, encodeJSONFor(IRType)(greet.toIR().ir));
50
+ const { source, rebuilt } = await transpile(path, { name: 'greet', importFrom: '../east/index.js', rebuild: true });
51
+ assert.match(source, /from "\.\.\/east\/index\.js";/);
52
+ assert.match(source, /export const greet = East\.function\(/);
53
+ assert.match(source, /\$\.for\(xs, \(\$, x, _4, label\) => \{/); // the slot the body did not name stays _N (#639)
54
+ assert.equal(toSource(rebuilt, { name: 'greet' }), toSource(greet, { name: 'greet' }));
55
+ }
56
+ finally {
57
+ rmSync(dir, { recursive: true, force: true });
58
+ }
59
+ });
60
+ it('encodes a rebuilt IR by extension', async () => {
61
+ const dir = scratch();
62
+ try {
63
+ const path = join(dir, 'double.beast2');
64
+ writeFileSync(path, encodeEastIR(double.toIR()));
65
+ const { rebuilt } = await transpile(path, { rebuild: true });
66
+ const bundle = decodeEastIR(encodeRebuilt(rebuilt, join(dir, 'out.beast2')));
67
+ assert.equal(bundle.ir.type, 'Function');
68
+ const json = JSON.parse(Buffer.from(encodeRebuilt(rebuilt, join(dir, 'out.json'))).toString('utf-8'));
69
+ assert.equal(json.type, 'Function');
70
+ assert.throws(() => encodeRebuilt(rebuilt, join(dir, 'out.txt')), /Unsupported rebuild extension/);
71
+ }
72
+ finally {
73
+ rmSync(dir, { recursive: true, force: true });
74
+ }
75
+ });
76
+ it('transpiles a directory, one module (and one rebuilt IR) per IR file', async () => {
77
+ const dir = scratch();
78
+ try {
79
+ const input = join(dir, 'in');
80
+ const out = join(dir, 'out');
81
+ const rebuilt = join(dir, 'rebuilt');
82
+ const { mkdirSync } = await import('node:fs');
83
+ mkdirSync(input);
84
+ writeFileSync(join(input, 'double.beast2'), encodeEastIR(double.toIR()));
85
+ writeFileSync(join(input, 'greet.json'), encodeJSONFor(IRType)(greet.toIR().ir));
86
+ writeFileSync(join(input, 'notes.txt'), 'not an IR file');
87
+ const stems = await transpileDir(input, out, { rebuildDir: rebuilt });
88
+ assert.deepEqual(stems, ['double', 'greet']);
89
+ assert.deepEqual(readdirSync(out).sort(), ['double.ts', 'greet.ts']);
90
+ assert.deepEqual(readdirSync(rebuilt).sort(), ['double.beast2', 'greet.beast2']);
91
+ assert.match(readFileSync(join(out, 'greet.ts'), 'utf-8'), /export const main = East\.function\(/);
92
+ assert.equal(toSource(decodeEastIR(readFileSync(join(rebuilt, 'greet.beast2'))), {}), toSource(greet, {}));
93
+ }
94
+ finally {
95
+ rmSync(dir, { recursive: true, force: true });
96
+ }
97
+ });
98
+ it('rejects an IR file whose root is not a function', async () => {
99
+ const dir = scratch();
100
+ try {
101
+ const path = join(dir, 'value.json');
102
+ writeFileSync(path, JSON.stringify({ type: 'Value', value: { type: { type: 'Integer', value: null }, loc_id: '0', value: { type: 'Integer', value: '1' } } }));
103
+ await assert.rejects(transpile(path), /must contain a function/);
104
+ }
105
+ finally {
106
+ rmSync(dir, { recursive: true, force: true });
107
+ }
108
+ });
109
+ });
110
+ //# sourceMappingURL=transpile.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transpile.spec.js","sourceRoot":"","sources":["../src/transpile.spec.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elaraai/east-node-cli",
3
- "version": "1.0.67",
3
+ "version": "1.0.69",
4
4
  "description": "Command-line interface for running East IR programs with Node.js",
5
5
  "bin": {
6
6
  "east-node": "./bin/east-node.mjs"
@@ -44,7 +44,7 @@
44
44
  "tar-stream": "^3.1.7"
45
45
  },
46
46
  "peerDependencies": {
47
- "@elaraai/east": "1.0.67"
47
+ "@elaraai/east": "1.0.69"
48
48
  },
49
49
  "devDependencies": {
50
50
  "@types/node": "^22.18.1",