@devaloop/devalang 0.0.1-alpha.16-hotfix.1 → 0.0.1-alpha.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (235) hide show
  1. package/.cargo/config.toml +2 -0
  2. package/.devalang +6 -10
  3. package/.github/workflows/ci.yml +19 -8
  4. package/Cargo.toml +18 -2
  5. package/README.md +80 -33
  6. package/docs/CHANGELOG.md +56 -0
  7. package/docs/ROADMAP.md +6 -3
  8. package/examples/index.deva +52 -35
  9. package/out-tsc/bin/index.d.ts +2 -0
  10. package/out-tsc/core/functions/index.d.ts +37 -0
  11. package/out-tsc/core/functions/index.js +76 -0
  12. package/out-tsc/core/index.d.ts +6 -0
  13. package/out-tsc/core/index.js +22 -0
  14. package/out-tsc/core/types/index.d.ts +4 -0
  15. package/out-tsc/core/types/index.js +20 -0
  16. package/out-tsc/core/types/plugin.d.ts +18 -0
  17. package/out-tsc/core/types/plugin.js +2 -0
  18. package/out-tsc/core/types/result.d.ts +27 -0
  19. package/out-tsc/core/types/result.js +2 -0
  20. package/out-tsc/core/types/statement.d.ts +106 -0
  21. package/out-tsc/core/types/statement.js +2 -0
  22. package/out-tsc/core/types/value.d.ts +43 -0
  23. package/out-tsc/core/types/value.js +2 -0
  24. package/out-tsc/index.d.ts +7 -0
  25. package/out-tsc/index.js +41 -2
  26. package/out-tsc/pkg/devalang_core.d.ts +7 -0
  27. package/out-tsc/pkg/devalang_core_bg.wasm.d.ts +33 -0
  28. package/out-tsc/scripts/copy-wasm-dts.d.ts +1 -0
  29. package/out-tsc/scripts/copy-wasm-dts.js +73 -0
  30. package/out-tsc/scripts/postinstall.d.ts +1 -0
  31. package/out-tsc/scripts/postinstall.js +33 -23
  32. package/out-tsc/scripts/version/bump.d.ts +1 -0
  33. package/out-tsc/scripts/version/fetch.d.ts +1 -0
  34. package/out-tsc/scripts/version/index.d.ts +1 -0
  35. package/out-tsc/scripts/version/sync.d.ts +1 -0
  36. package/package.json +16 -4
  37. package/project-version.json +3 -3
  38. package/rust/cli/bank/api.rs +122 -0
  39. package/rust/cli/bank/commands.rs +275 -0
  40. package/rust/cli/bank/mod.rs +29 -0
  41. package/rust/cli/build/commands.rs +97 -0
  42. package/rust/cli/build/mod.rs +2 -0
  43. package/rust/cli/build/process.rs +146 -0
  44. package/rust/cli/{check.rs → check/mod.rs} +18 -31
  45. package/rust/cli/discover/commands.rs +253 -0
  46. package/rust/cli/discover/config.rs +111 -0
  47. package/rust/cli/discover/fs.rs +19 -0
  48. package/rust/cli/discover/install.rs +103 -0
  49. package/rust/cli/discover/metadata.rs +48 -0
  50. package/rust/cli/discover/mod.rs +5 -0
  51. package/rust/cli/{init.rs → init/commands.rs} +88 -87
  52. package/rust/cli/init/mod.rs +1 -0
  53. package/rust/{installer → cli/install}/addon.rs +5 -9
  54. package/rust/cli/install/bank.rs +53 -0
  55. package/rust/cli/{install.rs → install/commands.rs} +9 -9
  56. package/rust/{installer → cli/install}/mod.rs +2 -3
  57. package/rust/cli/install/plugin.rs +61 -0
  58. package/rust/cli/{login.rs → login/commands.rs} +8 -11
  59. package/rust/cli/login/mod.rs +1 -0
  60. package/rust/cli/mod.rs +2 -3
  61. package/rust/cli/{driver.rs → parser.rs} +19 -2
  62. package/rust/cli/play/commands.rs +324 -0
  63. package/rust/cli/play/io.rs +17 -0
  64. package/rust/cli/play/mod.rs +5 -0
  65. package/rust/cli/play/process.rs +150 -0
  66. package/rust/cli/play/realtime.rs +91 -0
  67. package/rust/cli/play/utils.rs +23 -0
  68. package/rust/cli/telemetry/commands.rs +22 -0
  69. package/rust/cli/telemetry/event_creator.rs +80 -0
  70. package/rust/cli/telemetry/mod.rs +3 -0
  71. package/rust/cli/telemetry/send.rs +51 -0
  72. package/rust/cli/{template.rs → template/commands.rs} +1 -1
  73. package/rust/cli/template/mod.rs +1 -0
  74. package/rust/cli/{update.rs → update/commands.rs} +6 -6
  75. package/rust/cli/update/mod.rs +1 -0
  76. package/rust/config/driver.rs +57 -72
  77. package/rust/config/mod.rs +1 -2
  78. package/rust/config/ops.rs +26 -0
  79. package/rust/config/settings.rs +60 -50
  80. package/rust/core/audio/engine/helpers.rs +146 -0
  81. package/rust/core/audio/engine/mod.rs +7 -0
  82. package/rust/core/audio/engine/sample.rs +298 -0
  83. package/rust/core/audio/engine/synth.rs +310 -0
  84. package/rust/core/audio/evaluator.rs +15 -12
  85. package/rust/core/audio/interpreter/arrow_call.rs +99 -24
  86. package/rust/core/audio/interpreter/call.rs +81 -60
  87. package/rust/core/audio/interpreter/condition.rs +3 -2
  88. package/rust/core/audio/interpreter/driver.rs +206 -151
  89. package/rust/core/audio/interpreter/let_.rs +1 -1
  90. package/rust/core/audio/interpreter/load.rs +2 -1
  91. package/rust/core/audio/interpreter/loop_.rs +7 -6
  92. package/rust/core/audio/interpreter/sleep.rs +2 -1
  93. package/rust/core/audio/interpreter/spawn.rs +45 -57
  94. package/rust/core/audio/interpreter/tempo.rs +31 -10
  95. package/rust/core/audio/interpreter/trigger.rs +2 -2
  96. package/rust/core/audio/loader/trigger.rs +4 -7
  97. package/rust/core/audio/player.rs +6 -0
  98. package/rust/core/audio/renderer.rs +5 -7
  99. package/rust/core/audio/special/env.rs +3 -1
  100. package/rust/core/audio/special/math.rs +4 -4
  101. package/rust/core/audio/special/modulator.rs +2 -2
  102. package/rust/core/builder/mod.rs +9 -3
  103. package/rust/core/debugger/lexer.rs +1 -1
  104. package/rust/core/debugger/mod.rs +6 -0
  105. package/rust/core/debugger/module.rs +4 -4
  106. package/rust/core/debugger/preprocessor.rs +1 -1
  107. package/rust/core/debugger/store.rs +2 -2
  108. package/rust/core/error/mod.rs +189 -0
  109. package/rust/core/lexer/handler/arrow.rs +1 -1
  110. package/rust/core/lexer/handler/at.rs +1 -1
  111. package/rust/core/lexer/handler/brace.rs +2 -2
  112. package/rust/core/lexer/handler/colon.rs +1 -1
  113. package/rust/core/lexer/handler/comment.rs +1 -1
  114. package/rust/core/lexer/handler/dot.rs +1 -1
  115. package/rust/core/lexer/handler/driver.rs +1 -1
  116. package/rust/core/lexer/handler/identifier.rs +1 -1
  117. package/rust/core/lexer/handler/mod.rs +1 -2
  118. package/rust/core/lexer/handler/number.rs +1 -1
  119. package/rust/core/lexer/handler/operator.rs +1 -1
  120. package/rust/core/lexer/handler/parenthesis.rs +2 -2
  121. package/rust/core/lexer/handler/slash.rs +1 -1
  122. package/rust/core/lexer/handler/string.rs +1 -1
  123. package/rust/core/lexer/mod.rs +22 -12
  124. package/rust/core/lexer/token.rs +90 -97
  125. package/rust/core/mod.rs +0 -1
  126. package/rust/core/parser/driver.rs +66 -13
  127. package/rust/core/parser/handler/arrow_call.rs +28 -8
  128. package/rust/core/parser/handler/at.rs +55 -21
  129. package/rust/core/parser/handler/bank.rs +14 -4
  130. package/rust/core/parser/handler/condition.rs +6 -3
  131. package/rust/core/parser/handler/dot.rs +2 -1
  132. package/rust/core/parser/handler/identifier/automate.rs +13 -16
  133. package/rust/core/parser/handler/identifier/call.rs +4 -4
  134. package/rust/core/parser/handler/identifier/emit.rs +9 -5
  135. package/rust/core/parser/handler/identifier/function.rs +20 -7
  136. package/rust/core/parser/handler/identifier/group.rs +11 -7
  137. package/rust/core/parser/handler/identifier/let_.rs +24 -9
  138. package/rust/core/parser/handler/identifier/mod.rs +6 -5
  139. package/rust/core/parser/handler/identifier/on.rs +16 -7
  140. package/rust/core/parser/handler/identifier/print.rs +6 -9
  141. package/rust/core/parser/handler/identifier/sleep.rs +12 -5
  142. package/rust/core/parser/handler/identifier/spawn.rs +4 -4
  143. package/rust/core/parser/handler/identifier/synth.rs +79 -9
  144. package/rust/core/parser/handler/loop_.rs +39 -14
  145. package/rust/core/parser/handler/tempo.rs +9 -5
  146. package/rust/core/parser/mod.rs +0 -1
  147. package/rust/core/parser/statement.rs +6 -137
  148. package/rust/core/plugin/loader.rs +41 -27
  149. package/rust/core/plugin/runner.rs +68 -17
  150. package/rust/core/preprocessor/loader.rs +155 -33
  151. package/rust/core/preprocessor/processor.rs +2 -2
  152. package/rust/core/preprocessor/resolver/bank.rs +6 -8
  153. package/rust/core/preprocessor/resolver/call.rs +20 -24
  154. package/rust/core/preprocessor/resolver/condition.rs +6 -8
  155. package/rust/core/preprocessor/resolver/driver.rs +14 -16
  156. package/rust/core/preprocessor/resolver/function.rs +6 -6
  157. package/rust/core/preprocessor/resolver/group.rs +6 -8
  158. package/rust/core/preprocessor/resolver/loop_.rs +8 -10
  159. package/rust/core/preprocessor/resolver/spawn.rs +19 -23
  160. package/rust/core/preprocessor/resolver/synth.rs +6 -8
  161. package/rust/core/preprocessor/resolver/tempo.rs +6 -8
  162. package/rust/core/preprocessor/resolver/trigger.rs +22 -19
  163. package/rust/core/preprocessor/resolver/value.rs +99 -4
  164. package/rust/core/store/export.rs +28 -28
  165. package/rust/core/store/function.rs +6 -0
  166. package/rust/core/store/global.rs +7 -1
  167. package/rust/core/store/import.rs +28 -28
  168. package/rust/core/store/variable.rs +1 -1
  169. package/rust/core/utils/mod.rs +0 -1
  170. package/rust/lib.rs +102 -9
  171. package/rust/main.rs +156 -45
  172. package/rust/types/Cargo.toml +8 -0
  173. package/rust/types/src/addons.rs +55 -0
  174. package/rust/types/src/ast.rs +198 -0
  175. package/rust/types/src/config.rs +74 -0
  176. package/rust/types/src/lib.rs +12 -0
  177. package/rust/types/src/telemetry.rs +85 -0
  178. package/rust/utils/Cargo.toml +23 -0
  179. package/rust/utils/{error.rs → src/error.rs} +186 -200
  180. package/rust/utils/src/file.rs +94 -0
  181. package/rust/utils/src/first_usage.rs +97 -0
  182. package/rust/utils/{mod.rs → src/lib.rs} +1 -1
  183. package/rust/utils/{logger.rs → src/logger.rs} +17 -12
  184. package/rust/utils/src/path.rs +88 -0
  185. package/rust/utils/src/signature.rs +41 -0
  186. package/rust/utils/{spinner.rs → src/spinner.rs} +3 -5
  187. package/rust/utils/src/version.rs +27 -0
  188. package/rust/utils/{watcher.rs → src/watcher.rs} +13 -1
  189. package/rust/web/api.rs +5 -0
  190. package/rust/web/cdn.rs +34 -0
  191. package/templates/minimal/README.md +98 -54
  192. package/templates/welcome/README.md +98 -54
  193. package/templates/welcome/src/index.deva +56 -8
  194. package/templates/welcome/src/variables.deva +2 -4
  195. package/tests/rust/TODO.md +0 -0
  196. package/tests/typescript/index.spec.ts +136 -0
  197. package/tests/typescript/playhead.spec.ts +36 -0
  198. package/tests/typescript/render_e2e.spec.ts +77 -0
  199. package/tsconfig.json +1 -1
  200. package/typescript/core/functions/index.ts +83 -0
  201. package/typescript/core/index.ts +6 -0
  202. package/typescript/core/types/index.ts +4 -0
  203. package/typescript/core/types/plugin.ts +19 -0
  204. package/typescript/core/types/result.ts +29 -0
  205. package/typescript/core/types/statement.ts +47 -0
  206. package/typescript/core/types/value.ts +29 -0
  207. package/typescript/index.ts +7 -2
  208. package/typescript/pkg/devalang_core.d.ts +4 -0
  209. package/typescript/scripts/copy-wasm-dts.ts +41 -0
  210. package/typescript/scripts/postinstall.ts +45 -32
  211. package/rust/cli/bank.rs +0 -462
  212. package/rust/cli/build.rs +0 -252
  213. package/rust/cli/generator.rs +0 -1
  214. package/rust/cli/play.rs +0 -1123
  215. package/rust/cli/telemetry.rs +0 -19
  216. package/rust/common/api.rs +0 -5
  217. package/rust/common/cdn.rs +0 -5
  218. package/rust/config/loader.rs +0 -165
  219. package/rust/config/stats.rs +0 -257
  220. package/rust/core/audio/engine.rs +0 -696
  221. package/rust/core/shared/bank.rs +0 -21
  222. package/rust/core/shared/duration.rs +0 -9
  223. package/rust/core/shared/mod.rs +0 -3
  224. package/rust/core/shared/value.rs +0 -35
  225. package/rust/core/utils/validation.rs +0 -35
  226. package/rust/installer/bank.rs +0 -62
  227. package/rust/installer/plugin.rs +0 -54
  228. package/rust/installer/utils.rs +0 -56
  229. package/rust/utils/file.rs +0 -38
  230. package/rust/utils/first_usage.rs +0 -76
  231. package/rust/utils/signature.rs +0 -19
  232. package/rust/utils/telemetry.rs +0 -292
  233. package/rust/utils/version.rs +0 -15
  234. /package/rust/{common → web}/mod.rs +0 -0
  235. /package/rust/{common → web}/sso.rs +0 -0
@@ -0,0 +1,4 @@
1
+ export * from "./result";
2
+ export * from "./statement";
3
+ export * from "./value";
4
+ export * from "./plugin";
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Represents a plugin export.
3
+ */
4
+ export interface PluginExport {
5
+ name: string;
6
+ kind: string;
7
+ default?: any;
8
+ }
9
+
10
+ /**
11
+ * Represents a plugin.
12
+ */
13
+ export interface PluginInfo {
14
+ author: string;
15
+ name: string;
16
+ version?: string;
17
+ description?: string;
18
+ exports: PluginExport[];
19
+ }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Represents an error that occurred during parsing.
3
+ */
4
+ export interface ErrorResult {
5
+ message: string;
6
+ line: number;
7
+ column: number;
8
+ }
9
+
10
+ /**
11
+ * Represents the result of parsing user code.
12
+ */
13
+ export interface ParseResult {
14
+ ok: boolean;
15
+ ast: string;
16
+ errors: ErrorResult[];
17
+ }
18
+
19
+ /**
20
+ * Represents the result of debugging user code.
21
+ */
22
+ export interface DebugResult {
23
+ samples_len: number;
24
+ any_nonzero: boolean;
25
+ ast: string;
26
+ note_count: number;
27
+ global_vars: string[];
28
+ statements_count: number;
29
+ }
@@ -0,0 +1,47 @@
1
+ import { Value, Duration } from "./value";
2
+
3
+ /**
4
+ * Represents a statement kind in the code.
5
+ */
6
+ export type StatementKind =
7
+ | { kind: "Tempo" }
8
+ | { kind: "Bank"; alias?: string }
9
+ | { kind: "Print" }
10
+ | { kind: "Load"; source: string; alias: string }
11
+ | { kind: "Use"; name: string; alias?: string }
12
+ | { kind: "Let"; name: string }
13
+ | { kind: "Automate"; target: string }
14
+ | { kind: "ArrowCall"; target: string; method: string; args: Value[] }
15
+ | { kind: "Function"; name: string; parameters: string[]; body: Statement[] }
16
+ | { kind: "Synth" }
17
+ | { kind: "Trigger"; entity: string; duration: Duration; effects?: Value }
18
+ | { kind: "Sleep" }
19
+ | { kind: "Call"; name: string; args: Value[] }
20
+ | { kind: "Spawn"; name: string; args: Value[] }
21
+ | { kind: "Loop" }
22
+ | { kind: "Group" }
23
+ | { kind: "Include"; path: string }
24
+ | { kind: "Export"; names: string[]; source: string }
25
+ | { kind: "Import"; names: string[]; source: string }
26
+ | { kind: "If" }
27
+ | { kind: "Else" }
28
+ | { kind: "ElseIf" }
29
+ | { kind: "Comment" }
30
+ | { kind: "Indent" }
31
+ | { kind: "Dedent" }
32
+ | { kind: "NewLine" }
33
+ | { kind: "On"; event: string; args?: Value[]; body: Statement[] }
34
+ | { kind: "Emit"; event: string; payload?: Value }
35
+ | { kind: "Unknown" }
36
+ | { kind: "Error"; message: string };
37
+
38
+ /**
39
+ * Represents a statement in the code.
40
+ */
41
+ export interface Statement {
42
+ kind: StatementKind;
43
+ value: Value;
44
+ indent: number;
45
+ line: number;
46
+ column: number;
47
+ }
@@ -0,0 +1,29 @@
1
+ import { Statement } from "./statement";
2
+
3
+ /**
4
+ * Represents a duration in the code.
5
+ */
6
+ export type Duration =
7
+ | { Number: number }
8
+ | { Identifier: string }
9
+ | { Beat: string }
10
+ | { Auto: null };
11
+
12
+ /**
13
+ * Represents a value in the code.
14
+ */
15
+ export type Value =
16
+ | { Boolean: boolean }
17
+ | { Number: number }
18
+ | { Duration: Duration }
19
+ | { Identifier: string }
20
+ | { String: string }
21
+ | { Array: Value[] }
22
+ | { Map: Record<string, Value> }
23
+ | { Block: Statement[] }
24
+ | { Sample: string }
25
+ | { Beat: string }
26
+ | { Statement: Statement }
27
+ | { StatementKind: any }
28
+ | { Unknown: null }
29
+ | null;
@@ -1,3 +1,8 @@
1
1
  /**
2
- * TypeScript wrapper for Devalang.
3
- */
2
+ * Public TypeScript definitions for Devalang.
3
+ * ————————————————————————————————————————
4
+ * Used to provide TypeScript types for the Devalang WASM package.
5
+ */
6
+
7
+ export * as pkg from "./pkg/devalang_core";
8
+ export * as core from "./core/index";
@@ -0,0 +1,4 @@
1
+ /**
2
+ * This module exports all the core types and functions used in the WASM package.
3
+ */
4
+ export * from "../../pkg/devalang_core";
@@ -0,0 +1,41 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+
4
+ // Copies .d.ts files from pkg/ (wasm-pack output) into out-tsc/pkg/
5
+ const ROOT = path.resolve(__dirname, '..', '..');
6
+ const PKG_DIR = path.join(ROOT, 'pkg');
7
+ const OUT_DIR = path.join(ROOT, 'out-tsc', 'pkg');
8
+
9
+ function ensureDir(p: string): void {
10
+ if (!fs.existsSync(p)) fs.mkdirSync(p, { recursive: true });
11
+ }
12
+
13
+ function copyDir(src: string, dest: string): void {
14
+ ensureDir(dest);
15
+ const items = fs.readdirSync(src, { withFileTypes: true });
16
+ for (const item of items) {
17
+ const srcPath = path.join(src, item.name);
18
+ const destPath = path.join(dest, item.name);
19
+ if (item.isDirectory()) {
20
+ copyDir(srcPath, destPath);
21
+ } else if (item.isFile() && item.name.endsWith('.d.ts')) {
22
+ fs.copyFileSync(srcPath, destPath);
23
+ console.log('copied', srcPath, '->', destPath);
24
+ }
25
+ }
26
+ }
27
+
28
+ function main(): number {
29
+ if (!fs.existsSync(PKG_DIR)) {
30
+ console.error('pkg directory not found at', PKG_DIR);
31
+ return 1;
32
+ }
33
+
34
+ ensureDir(OUT_DIR);
35
+ copyDir(PKG_DIR, OUT_DIR);
36
+ console.log('done');
37
+ return 0;
38
+ }
39
+
40
+ const exitCode = main();
41
+ if (exitCode !== 0) process.exit(exitCode);
@@ -4,17 +4,15 @@ import { https } from "follow-redirects";
4
4
  import fs from "fs";
5
5
  import path from "path";
6
6
 
7
- const projectVersionPath = path.join(
8
- __dirname,
9
- "../../project-version.json"
10
- );
7
+ const projectVersionPath = path.join(__dirname, "../../project-version.json");
11
8
 
12
9
  const version = fs.readFileSync(projectVersionPath, "utf-8").trim();
13
10
  const versionString = JSON.parse(version).version;
14
11
 
15
12
  const platform = process.platform;
16
13
 
17
- let binaryName: string;
14
+ let binaryName: string = "";
15
+
18
16
  switch (platform) {
19
17
  case "win32":
20
18
  binaryName = "devalang-x86_64-pc-windows-msvc.exe";
@@ -25,32 +23,47 @@ switch (platform) {
25
23
  case "linux":
26
24
  binaryName = "devalang-x86_64-unknown-linux-gnu";
27
25
  break;
28
- default:
29
- console.error(`❌ Unsupported platform: ${platform}`);
30
- process.exit(1);
31
26
  }
32
27
 
33
- const destDir = join(__dirname, "..", "..", "out-tsc", "bin");
34
- const dest = join(destDir, binaryName);
35
-
36
- const url = `https://github.com/devaloop-labs/devalang/releases/download/v${versionString}/${binaryName}`;
37
-
38
- mkdirSync(destDir, { recursive: true });
39
-
40
- console.log(`⬇️ Downloading ${binaryName} from ${url}`);
41
-
42
- https.get(url, (res: any) => {
43
- if (res.statusCode !== 200) {
44
- console.error(`❌ Failed (HTTP ${res.statusCode})`);
45
- process.exit(1);
46
- }
47
- const file = createWriteStream(dest, { mode: 0o755 });
48
- res.pipe(file);
49
- file.on("finish", () => {
50
- file.close();
51
- console.log(`✅ Downloaded ${binaryName} to ${dest}`);
52
- });
53
- }).on("error", (err) => {
54
- console.error(`❌ Error: ${err.message}`);
55
- process.exit(1);
56
- });
28
+ if (binaryName !== "") {
29
+ const destDir = join(__dirname, "..", "..", "out-tsc", "bin");
30
+ const dest = join(destDir, binaryName);
31
+
32
+ const url = `https://github.com/devaloop-labs/devalang/releases/download/v${versionString}/${binaryName}`;
33
+
34
+ mkdirSync(destDir, { recursive: true });
35
+
36
+ console.log(`⬇️ Downloading ${binaryName} from ${url}`);
37
+
38
+ https
39
+ .get(url, (res: any) => {
40
+ if (res.statusCode === 404) {
41
+ console.warn(
42
+ `⚠️ Asset not found (HTTP 404). Skipping binary download.`
43
+ );
44
+ res.resume();
45
+ return;
46
+ }
47
+
48
+ if (res.statusCode !== 200) {
49
+ console.error(
50
+ `❌ Failed (HTTP ${res.statusCode}). Skipping binary download.`
51
+ );
52
+ res.resume();
53
+ return;
54
+ }
55
+
56
+ const file = createWriteStream(dest, { mode: 0o755 });
57
+ res.pipe(file);
58
+ file.on("finish", () => {
59
+ file.close();
60
+ console.log(`✅ Downloaded ${binaryName} to ${dest}`);
61
+ });
62
+ })
63
+ .on("error", (err) => {
64
+ // Network or other errors should not fail CI; log and continue
65
+ console.error(`❌ Error: ${err.message}. Skipping binary download.`);
66
+ });
67
+ } else {
68
+ console.error(`❌ Unsupported platform: ${platform}`);
69
+ }