@devaloop/devalang 0.0.1-beta.2 → 0.1.1

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 (329) hide show
  1. package/README.md +177 -146
  2. package/out-tsc/api.d.ts +180 -0
  3. package/out-tsc/api.d.ts.map +1 -0
  4. package/out-tsc/api.js +286 -0
  5. package/out-tsc/api.js.map +1 -0
  6. package/out-tsc/bin/index.d.ts +12 -0
  7. package/out-tsc/bin/index.d.ts.map +1 -0
  8. package/out-tsc/bin/index.js +20 -54
  9. package/out-tsc/bin/index.js.map +1 -0
  10. package/out-tsc/examples/basic-usage.d.ts +8 -0
  11. package/out-tsc/examples/basic-usage.d.ts.map +1 -0
  12. package/out-tsc/examples/basic-usage.js +113 -0
  13. package/out-tsc/examples/basic-usage.js.map +1 -0
  14. package/out-tsc/index.d.ts +19 -5
  15. package/out-tsc/index.d.ts.map +1 -0
  16. package/out-tsc/index.js +24 -6
  17. package/out-tsc/index.js.map +1 -0
  18. package/out-tsc/scripts/copy-wasm-dts.d.ts +7 -0
  19. package/out-tsc/scripts/copy-wasm-dts.d.ts.map +1 -0
  20. package/out-tsc/scripts/copy-wasm-dts.js +36 -32
  21. package/out-tsc/scripts/copy-wasm-dts.js.map +1 -0
  22. package/out-tsc/scripts/postinstall.d.ts +1 -0
  23. package/out-tsc/scripts/postinstall.d.ts.map +1 -0
  24. package/out-tsc/scripts/postinstall.js +4 -1
  25. package/out-tsc/scripts/postinstall.js.map +1 -0
  26. package/out-tsc/scripts/version/bump.d.ts +5 -1
  27. package/out-tsc/scripts/version/bump.d.ts.map +1 -0
  28. package/out-tsc/scripts/version/bump.js +114 -44
  29. package/out-tsc/scripts/version/bump.js.map +1 -0
  30. package/out-tsc/scripts/version/fetch.d.ts +12 -1
  31. package/out-tsc/scripts/version/fetch.d.ts.map +1 -0
  32. package/out-tsc/scripts/version/fetch.js +68 -24
  33. package/out-tsc/scripts/version/fetch.js.map +1 -0
  34. package/out-tsc/scripts/version/index.d.ts +6 -0
  35. package/out-tsc/scripts/version/index.d.ts.map +1 -0
  36. package/out-tsc/scripts/version/index.js +44 -22
  37. package/out-tsc/scripts/version/index.js.map +1 -0
  38. package/out-tsc/scripts/version/sync.d.ts +5 -1
  39. package/out-tsc/scripts/version/sync.d.ts.map +1 -0
  40. package/out-tsc/scripts/version/sync.js +78 -29
  41. package/out-tsc/scripts/version/sync.js.map +1 -0
  42. package/out-tsc/types.d.ts +68 -0
  43. package/out-tsc/types.d.ts.map +1 -0
  44. package/out-tsc/{core/types/value.js → types.js} +4 -0
  45. package/out-tsc/types.js.map +1 -0
  46. package/out-tsc/wasm.d.ts +8 -0
  47. package/out-tsc/wasm.d.ts.map +1 -0
  48. package/out-tsc/{core/index.js → wasm.js} +9 -6
  49. package/out-tsc/wasm.js.map +1 -0
  50. package/package.json +50 -37
  51. package/.cargo/config.toml +0 -2
  52. package/.devalang +0 -9
  53. package/.github/workflows/ci.yml +0 -103
  54. package/Cargo.toml +0 -81
  55. package/docs/CHANGELOG.md +0 -581
  56. package/docs/CONTRIBUTING.md +0 -101
  57. package/docs/ROADMAP.md +0 -38
  58. package/docs/TODO.md +0 -71
  59. package/examples/automation.deva +0 -42
  60. package/examples/bank.deva +0 -7
  61. package/examples/bus.deva +0 -10
  62. package/examples/condition.deva +0 -20
  63. package/examples/duration.deva +0 -9
  64. package/examples/effect.deva +0 -2
  65. package/examples/events.deva +0 -12
  66. package/examples/filter.deva +0 -11
  67. package/examples/function.deva +0 -15
  68. package/examples/group.deva +0 -12
  69. package/examples/index.deva +0 -63
  70. package/examples/lfo.deva +0 -9
  71. package/examples/loop.deva +0 -10
  72. package/examples/pattern.deva +0 -8
  73. package/examples/plugin.deva +0 -16
  74. package/examples/samples/hat-808.wav +0 -0
  75. package/examples/samples/kick-808.wav +0 -0
  76. package/examples/synth.deva +0 -24
  77. package/examples/synth_types.deva +0 -17
  78. package/examples/variables.deva +0 -9
  79. package/out-tsc/core/functions/index.d.ts +0 -42
  80. package/out-tsc/core/functions/index.js +0 -87
  81. package/out-tsc/core/index.d.ts +0 -6
  82. package/out-tsc/core/types/index.d.ts +0 -4
  83. package/out-tsc/core/types/index.js +0 -20
  84. package/out-tsc/core/types/plugin.d.ts +0 -18
  85. package/out-tsc/core/types/plugin.js +0 -2
  86. package/out-tsc/core/types/result.d.ts +0 -27
  87. package/out-tsc/core/types/result.js +0 -2
  88. package/out-tsc/core/types/statement.d.ts +0 -106
  89. package/out-tsc/core/types/statement.js +0 -2
  90. package/out-tsc/core/types/value.d.ts +0 -43
  91. package/out-tsc/pkg/devalang_core.d.ts +0 -15
  92. package/out-tsc/pkg/devalang_core.js +0 -65
  93. package/out-tsc/pkg/devalang_core_bg.wasm.d.ts +0 -34
  94. package/project-version.json +0 -6
  95. package/rust/cli/bank/api.rs +0 -122
  96. package/rust/cli/bank/commands.rs +0 -306
  97. package/rust/cli/bank/mod.rs +0 -29
  98. package/rust/cli/build/commands.rs +0 -153
  99. package/rust/cli/build/mod.rs +0 -2
  100. package/rust/cli/build/process.rs +0 -165
  101. package/rust/cli/check/mod.rs +0 -208
  102. package/rust/cli/discover/commands.rs +0 -253
  103. package/rust/cli/discover/config.rs +0 -111
  104. package/rust/cli/discover/fs.rs +0 -19
  105. package/rust/cli/discover/install.rs +0 -103
  106. package/rust/cli/discover/metadata.rs +0 -48
  107. package/rust/cli/discover/mod.rs +0 -5
  108. package/rust/cli/init/commands.rs +0 -88
  109. package/rust/cli/init/mod.rs +0 -1
  110. package/rust/cli/install/addon.rs +0 -118
  111. package/rust/cli/install/bank.rs +0 -72
  112. package/rust/cli/install/commands.rs +0 -35
  113. package/rust/cli/install/mod.rs +0 -4
  114. package/rust/cli/install/plugin.rs +0 -80
  115. package/rust/cli/login/commands.rs +0 -124
  116. package/rust/cli/login/mod.rs +0 -1
  117. package/rust/cli/mod.rs +0 -12
  118. package/rust/cli/parser.rs +0 -359
  119. package/rust/cli/play/commands.rs +0 -375
  120. package/rust/cli/play/io.rs +0 -17
  121. package/rust/cli/play/mod.rs +0 -5
  122. package/rust/cli/play/process.rs +0 -159
  123. package/rust/cli/play/realtime.rs +0 -91
  124. package/rust/cli/play/utils.rs +0 -23
  125. package/rust/cli/telemetry/commands.rs +0 -22
  126. package/rust/cli/telemetry/event_creator.rs +0 -80
  127. package/rust/cli/telemetry/mod.rs +0 -3
  128. package/rust/cli/telemetry/send.rs +0 -51
  129. package/rust/cli/template/commands.rs +0 -69
  130. package/rust/cli/template/mod.rs +0 -1
  131. package/rust/cli/update/commands.rs +0 -6
  132. package/rust/cli/update/mod.rs +0 -1
  133. package/rust/config/driver.rs +0 -112
  134. package/rust/config/mod.rs +0 -3
  135. package/rust/config/ops.rs +0 -26
  136. package/rust/config/settings.rs +0 -101
  137. package/rust/core/audio/engine/driver.rs +0 -220
  138. package/rust/core/audio/engine/export.rs +0 -169
  139. package/rust/core/audio/engine/helpers.rs +0 -178
  140. package/rust/core/audio/engine/mod.rs +0 -56
  141. package/rust/core/audio/engine/notes/dsp.rs +0 -85
  142. package/rust/core/audio/engine/notes/mod.rs +0 -44
  143. package/rust/core/audio/engine/notes/params.rs +0 -294
  144. package/rust/core/audio/engine/sample/insert.rs +0 -199
  145. package/rust/core/audio/engine/sample/mod.rs +0 -40
  146. package/rust/core/audio/engine/sample/padding.rs +0 -170
  147. package/rust/core/audio/evaluator/condition.rs +0 -61
  148. package/rust/core/audio/evaluator/mod.rs +0 -9
  149. package/rust/core/audio/evaluator/numeric.rs +0 -152
  150. package/rust/core/audio/evaluator/rhs.rs +0 -16
  151. package/rust/core/audio/evaluator/string_expr.rs +0 -94
  152. package/rust/core/audio/interpreter/driver.rs +0 -574
  153. package/rust/core/audio/interpreter/mod.rs +0 -2
  154. package/rust/core/audio/interpreter/statements/arrow_call/interprete.rs +0 -175
  155. package/rust/core/audio/interpreter/statements/arrow_call/methods/chord.rs +0 -384
  156. package/rust/core/audio/interpreter/statements/arrow_call/methods/mod.rs +0 -2
  157. package/rust/core/audio/interpreter/statements/arrow_call/methods/note.rs +0 -316
  158. package/rust/core/audio/interpreter/statements/arrow_call/mod.rs +0 -3
  159. package/rust/core/audio/interpreter/statements/arrow_call/types/arp.rs +0 -192
  160. package/rust/core/audio/interpreter/statements/arrow_call/types/mod.rs +0 -24
  161. package/rust/core/audio/interpreter/statements/arrow_call/types/pad.rs +0 -116
  162. package/rust/core/audio/interpreter/statements/arrow_call/types/pluck.rs +0 -97
  163. package/rust/core/audio/interpreter/statements/arrow_call/types/sub.rs +0 -100
  164. package/rust/core/audio/interpreter/statements/automate.rs +0 -16
  165. package/rust/core/audio/interpreter/statements/call.rs +0 -295
  166. package/rust/core/audio/interpreter/statements/condition.rs +0 -72
  167. package/rust/core/audio/interpreter/statements/function.rs +0 -24
  168. package/rust/core/audio/interpreter/statements/let_.rs +0 -36
  169. package/rust/core/audio/interpreter/statements/load.rs +0 -17
  170. package/rust/core/audio/interpreter/statements/loop_.rs +0 -115
  171. package/rust/core/audio/interpreter/statements/mod.rs +0 -12
  172. package/rust/core/audio/interpreter/statements/sleep.rs +0 -28
  173. package/rust/core/audio/interpreter/statements/spawn.rs +0 -253
  174. package/rust/core/audio/interpreter/statements/tempo.rs +0 -40
  175. package/rust/core/audio/interpreter/statements/trigger.rs +0 -239
  176. package/rust/core/audio/loader/mod.rs +0 -1
  177. package/rust/core/audio/loader/trigger.rs +0 -98
  178. package/rust/core/audio/mod.rs +0 -6
  179. package/rust/core/audio/player.rs +0 -70
  180. package/rust/core/audio/special/easing.rs +0 -189
  181. package/rust/core/audio/special/env.rs +0 -45
  182. package/rust/core/audio/special/math.rs +0 -134
  183. package/rust/core/audio/special/mod.rs +0 -9
  184. package/rust/core/audio/special/modulator.rs +0 -143
  185. package/rust/core/builder/mod.rs +0 -129
  186. package/rust/core/debugger/lexer.rs +0 -27
  187. package/rust/core/debugger/logs.rs +0 -52
  188. package/rust/core/debugger/mod.rs +0 -30
  189. package/rust/core/debugger/preprocessor.rs +0 -27
  190. package/rust/core/debugger/store.rs +0 -38
  191. package/rust/core/error/mod.rs +0 -269
  192. package/rust/core/lexer/driver.rs +0 -59
  193. package/rust/core/lexer/handler/arrow.rs +0 -82
  194. package/rust/core/lexer/handler/at.rs +0 -21
  195. package/rust/core/lexer/handler/brace.rs +0 -41
  196. package/rust/core/lexer/handler/colon.rs +0 -21
  197. package/rust/core/lexer/handler/comment.rs +0 -30
  198. package/rust/core/lexer/handler/dot.rs +0 -21
  199. package/rust/core/lexer/handler/driver.rs +0 -337
  200. package/rust/core/lexer/handler/identifier.rs +0 -47
  201. package/rust/core/lexer/handler/indent.rs +0 -66
  202. package/rust/core/lexer/handler/mod.rs +0 -15
  203. package/rust/core/lexer/handler/newline.rs +0 -23
  204. package/rust/core/lexer/handler/number.rs +0 -31
  205. package/rust/core/lexer/handler/operator.rs +0 -46
  206. package/rust/core/lexer/handler/parenthesis.rs +0 -41
  207. package/rust/core/lexer/handler/slash.rs +0 -21
  208. package/rust/core/lexer/handler/string.rs +0 -63
  209. package/rust/core/lexer/mod.rs +0 -3
  210. package/rust/core/lexer/token.rs +0 -91
  211. package/rust/core/mod.rs +0 -9
  212. package/rust/core/parser/driver/block.rs +0 -111
  213. package/rust/core/parser/driver/cursor.rs +0 -82
  214. package/rust/core/parser/driver/driver_impl.rs +0 -139
  215. package/rust/core/parser/driver/mod.rs +0 -6
  216. package/rust/core/parser/driver/parse_array.rs +0 -120
  217. package/rust/core/parser/driver/parse_map.rs +0 -223
  218. package/rust/core/parser/driver/parser.rs +0 -160
  219. package/rust/core/parser/handler/arrow_call.rs +0 -277
  220. package/rust/core/parser/handler/at.rs +0 -279
  221. package/rust/core/parser/handler/bank.rs +0 -104
  222. package/rust/core/parser/handler/condition.rs +0 -83
  223. package/rust/core/parser/handler/dot.rs +0 -148
  224. package/rust/core/parser/handler/identifier/automate.rs +0 -254
  225. package/rust/core/parser/handler/identifier/call.rs +0 -91
  226. package/rust/core/parser/handler/identifier/emit.rs +0 -70
  227. package/rust/core/parser/handler/identifier/function.rs +0 -113
  228. package/rust/core/parser/handler/identifier/group.rs +0 -89
  229. package/rust/core/parser/handler/identifier/let_.rs +0 -173
  230. package/rust/core/parser/handler/identifier/mod.rs +0 -55
  231. package/rust/core/parser/handler/identifier/on.rs +0 -107
  232. package/rust/core/parser/handler/identifier/print.rs +0 -49
  233. package/rust/core/parser/handler/identifier/sleep.rs +0 -96
  234. package/rust/core/parser/handler/identifier/spawn.rs +0 -91
  235. package/rust/core/parser/handler/identifier/synth.rs +0 -135
  236. package/rust/core/parser/handler/loop_.rs +0 -194
  237. package/rust/core/parser/handler/mod.rs +0 -9
  238. package/rust/core/parser/handler/pattern.rs +0 -74
  239. package/rust/core/parser/handler/tempo.rs +0 -105
  240. package/rust/core/parser/mod.rs +0 -3
  241. package/rust/core/parser/statement.rs +0 -10
  242. package/rust/core/plugin/loader.rs +0 -137
  243. package/rust/core/plugin/mod.rs +0 -2
  244. package/rust/core/plugin/runner/mod.rs +0 -11
  245. package/rust/core/plugin/runner/non_wasm.rs +0 -297
  246. package/rust/core/plugin/runner/wasm32.rs +0 -43
  247. package/rust/core/preprocessor/loader/inject.rs +0 -278
  248. package/rust/core/preprocessor/loader/loader_helpers.rs +0 -110
  249. package/rust/core/preprocessor/loader/mod.rs +0 -235
  250. package/rust/core/preprocessor/mod.rs +0 -4
  251. package/rust/core/preprocessor/module.rs +0 -55
  252. package/rust/core/preprocessor/processor/handlers.rs +0 -107
  253. package/rust/core/preprocessor/processor/mod.rs +0 -1
  254. package/rust/core/preprocessor/resolver/bank.rs +0 -49
  255. package/rust/core/preprocessor/resolver/call.rs +0 -124
  256. package/rust/core/preprocessor/resolver/condition.rs +0 -95
  257. package/rust/core/preprocessor/resolver/driver.rs +0 -324
  258. package/rust/core/preprocessor/resolver/function.rs +0 -69
  259. package/rust/core/preprocessor/resolver/group.rs +0 -122
  260. package/rust/core/preprocessor/resolver/let_.rs +0 -32
  261. package/rust/core/preprocessor/resolver/loop_.rs +0 -318
  262. package/rust/core/preprocessor/resolver/mod.rs +0 -16
  263. package/rust/core/preprocessor/resolver/pattern.rs +0 -83
  264. package/rust/core/preprocessor/resolver/spawn.rs +0 -99
  265. package/rust/core/preprocessor/resolver/synth.rs +0 -54
  266. package/rust/core/preprocessor/resolver/tempo.rs +0 -48
  267. package/rust/core/preprocessor/resolver/trigger.rs +0 -116
  268. package/rust/core/preprocessor/resolver/value.rs +0 -176
  269. package/rust/core/store/global.rs +0 -57
  270. package/rust/core/store/mod.rs +0 -1
  271. package/rust/lib.rs +0 -323
  272. package/rust/main.rs +0 -388
  273. package/rust/types/Cargo.toml +0 -11
  274. package/rust/types/src/addons.rs +0 -55
  275. package/rust/types/src/ast.rs +0 -202
  276. package/rust/types/src/config.rs +0 -84
  277. package/rust/types/src/lib.rs +0 -15
  278. package/rust/types/src/plugin.rs +0 -20
  279. package/rust/types/src/store.rs +0 -139
  280. package/rust/types/src/telemetry.rs +0 -85
  281. package/rust/utils/Cargo.toml +0 -26
  282. package/rust/utils/src/error.rs +0 -186
  283. package/rust/utils/src/file.rs +0 -94
  284. package/rust/utils/src/first_usage.rs +0 -97
  285. package/rust/utils/src/lib.rs +0 -9
  286. package/rust/utils/src/logger.rs +0 -200
  287. package/rust/utils/src/path.rs +0 -129
  288. package/rust/utils/src/signature.rs +0 -41
  289. package/rust/utils/src/spinner.rs +0 -20
  290. package/rust/utils/src/version.rs +0 -27
  291. package/rust/utils/src/watcher.rs +0 -46
  292. package/rust/web/api.rs +0 -5
  293. package/rust/web/cdn.rs +0 -34
  294. package/rust/web/mod.rs +0 -3
  295. package/rust/web/sso.rs +0 -5
  296. package/templates/minimal/.devalang +0 -5
  297. package/templates/minimal/README.md +0 -218
  298. package/templates/minimal/src/index.deva +0 -2
  299. package/templates/welcome/.devalang +0 -5
  300. package/templates/welcome/README.md +0 -218
  301. package/templates/welcome/samples/kick-808.wav +0 -0
  302. package/templates/welcome/src/index.deva +0 -61
  303. package/templates/welcome/src/variables.deva +0 -3
  304. package/tests/integration.rs +0 -21
  305. package/tests/rust/cli_check_build.rs +0 -21
  306. package/tests/rust/cli_help.rs +0 -12
  307. package/tests/rust/cli_template_list.rs +0 -10
  308. package/tests/rust/cli_version.rs +0 -11
  309. package/tests/typescript/index.spec.ts +0 -136
  310. package/tests/typescript/playhead.spec.ts +0 -36
  311. package/tests/typescript/render_e2e.spec.ts +0 -77
  312. package/tsconfig.json +0 -115
  313. package/typescript/bin/index.ts +0 -28
  314. package/typescript/core/functions/index.ts +0 -94
  315. package/typescript/core/index.ts +0 -6
  316. package/typescript/core/types/index.ts +0 -4
  317. package/typescript/core/types/plugin.ts +0 -19
  318. package/typescript/core/types/result.ts +0 -29
  319. package/typescript/core/types/statement.ts +0 -47
  320. package/typescript/core/types/value.ts +0 -29
  321. package/typescript/index.ts +0 -8
  322. package/typescript/pkg/devalang_core.d.ts +0 -4
  323. package/typescript/pkg/devalang_core.ts +0 -65
  324. package/typescript/scripts/copy-wasm-dts.ts +0 -41
  325. package/typescript/scripts/postinstall.ts +0 -85
  326. package/typescript/scripts/version/bump.ts +0 -44
  327. package/typescript/scripts/version/fetch.ts +0 -18
  328. package/typescript/scripts/version/index.ts +0 -25
  329. package/typescript/scripts/version/sync.ts +0 -24
@@ -1,306 +0,0 @@
1
- use crate::cli::install::bank::install_bank;
2
- use crate::config::ops::load_config;
3
- use devalang_core::config::driver::ProjectConfigExt;
4
- use devalang_types::{BankFile, BankInfo};
5
- use devalang_utils::path as path_utils;
6
- use std::fs;
7
-
8
- pub async fn handle_update_bank_command(name: Option<String>) -> Result<(), String> {
9
- let deva_dir = path_utils::ensure_deva_dir()?;
10
- let bank_dir = deva_dir.join("banks");
11
-
12
- if !bank_dir.exists() {
13
- fs::create_dir_all(bank_dir.clone())
14
- .map_err(|e| format!("Failed to create bank directory: {}", e))?;
15
- }
16
-
17
- if let Some(name) = name {
18
- let bank_path = bank_dir.join(&name);
19
- if !bank_path.exists() {
20
- return Err(format!("Bank '{}' is not installed", name));
21
- }
22
-
23
- // Update specific bank
24
- let latest_version = match crate::cli::bank::api::fetch_latest_version(name.clone()).await {
25
- Ok(version) => version,
26
- Err(err) => {
27
- eprintln!("❌ Error fetching latest version for '{}': {}", name, err);
28
- return Err(format!("Failed to fetch latest version for '{}'", name));
29
- }
30
- };
31
-
32
- let local_bank_info_path = bank_path.join("bank.toml");
33
- let local_version = match fs::read_to_string(&local_bank_info_path)
34
- .ok()
35
- .and_then(|content| toml::from_str::<BankFile>(&content).ok())
36
- .map(|bf| bf.bank.version)
37
- {
38
- Some(version) => version,
39
- None => {
40
- eprintln!(
41
- "⚠️ Unable to read local version for '{}', forcing reinstall...",
42
- name
43
- );
44
- "".to_string() // Force update
45
- }
46
- };
47
-
48
- if local_version != latest_version.version {
49
- if let Err(e) = update_bank(&name, &latest_version.version).await {
50
- eprintln!("❌ Error updating bank '{}': {}", name, e);
51
- } else {
52
- println!(
53
- "✅ Bank '{}' updated to version '{}'",
54
- name, latest_version.version
55
- );
56
- }
57
- } else {
58
- println!(
59
- "Bank '{}' is already up-to-date (version {})",
60
- name, latest_version.version
61
- );
62
-
63
- // Verify if the bank directory exists
64
- if !bank_path.exists() {
65
- eprintln!(
66
- "❌ Bank directory for '{}' does not exist, reinstalling...",
67
- name
68
- );
69
- if let Err(e) = install_bank(&name, &deva_dir).await {
70
- eprintln!("❌ Error reinstalling bank '{}': {}", name, e);
71
- } else {
72
- println!("✅ Bank '{}' reinstalled successfully!", name);
73
- }
74
- }
75
- }
76
- } else {
77
- // Update all banks
78
- let config_path = path_utils::get_devalang_config_path()?;
79
- let config = load_config(Some(&config_path))
80
- .ok_or_else(|| format!("Failed to load config from '{}'", config_path.display()))?;
81
-
82
- let config_banks = config.banks.clone();
83
-
84
- if let Some(banks) = config_banks {
85
- for bank in banks {
86
- let bank_name = bank
87
- .path
88
- .strip_prefix("devalang://bank/")
89
- .unwrap_or(&bank.path)
90
- .to_string();
91
-
92
- let latest_version =
93
- match crate::cli::bank::api::fetch_latest_version(bank_name.clone()).await {
94
- Ok(version) => version,
95
- Err(err) => {
96
- eprintln!(
97
- "❌ Error fetching latest version for '{}': {}",
98
- bank_name, err
99
- );
100
- continue;
101
- }
102
- };
103
-
104
- if let Some(local_bank_version) = bank.version {
105
- if latest_version.version != local_bank_version {
106
- if let Err(e) = update_bank(&bank_name, &latest_version.version).await {
107
- eprintln!("❌ Error updating bank '{}': {}", bank_name, e);
108
- } else {
109
- println!(
110
- "✅ Bank '{}' updated to version '{}'",
111
- bank_name, latest_version.version
112
- );
113
- }
114
- } else {
115
- println!(
116
- "Bank '{}' is already up-to-date (version {})",
117
- bank_name, local_bank_version
118
- );
119
-
120
- // Verify if the bank directory exists
121
- let bank_path = bank_dir.join(&bank_name);
122
-
123
- if !bank_path.exists() {
124
- eprintln!(
125
- "❌ Bank directory for '{}' does not exist, reinstalling...",
126
- bank_name
127
- );
128
- if let Err(e) = install_bank(&bank_name, &deva_dir).await {
129
- eprintln!("❌ Error reinstalling bank '{}': {}", bank_name, e);
130
- } else {
131
- println!("✅ Bank '{}' reinstalled successfully!", bank_name);
132
- }
133
- }
134
- }
135
- } else {
136
- // If the bank version is not specified in the config, install it
137
- if let Err(e) = install_bank(&bank_name, &deva_dir).await {
138
- eprintln!("❌ Error installing bank '{}': {}", bank_name, e);
139
- } else {
140
- println!("✅ Bank '{}' installed successfully!", bank_name);
141
- }
142
- }
143
- }
144
- }
145
- }
146
-
147
- Ok(())
148
- }
149
-
150
- async fn update_bank(bank_name: &str, _latest_version: &str) -> Result<(), String> {
151
- let deva_dir = path_utils::ensure_deva_dir()?;
152
-
153
- // First, delete the existing bank directory
154
- let bank_dir = deva_dir.join("banks").join(bank_name);
155
-
156
- if bank_dir.exists() {
157
- std::fs::remove_dir_all(&bank_dir).unwrap_or_else(|_| {
158
- eprintln!(
159
- "⚠️ Failed to remove old bank directory for '{}', aborting !",
160
- bank_name
161
- );
162
- std::process::exit(1);
163
- });
164
- }
165
-
166
- // Now, install the new version
167
- if let Err(e) = install_bank(bank_name, &deva_dir).await {
168
- eprintln!("❌ Error installing bank '{}': {}", bank_name, e);
169
- } else {
170
- println!("✅ Bank '{}' installed successfully!", bank_name);
171
- }
172
-
173
- let config_path = path_utils::get_devalang_config_path()?;
174
- let _config = load_config(Some(&config_path))
175
- .ok_or_else(|| format!("Failed to load config from '{}'", config_path.display()))?;
176
-
177
- // Update the bank version in the config
178
- if let Some(mut config) = crate::config::ops::load_config(Some(&config_path)) {
179
- if let Some(banks) = config.banks.as_mut() {
180
- for bank in banks.iter_mut() {
181
- if bank
182
- .path
183
- .strip_prefix("devalang://bank/")
184
- .unwrap_or(&bank.path)
185
- == bank_name
186
- {
187
- bank.version = Some(_latest_version.to_string());
188
- }
189
- }
190
-
191
- if let Err(e) = config.write_config(&config) {
192
- eprintln!("Warning: failed to write updated config: {}", e);
193
- }
194
- }
195
- }
196
-
197
- Ok(())
198
- }
199
-
200
- pub async fn handle_remove_bank_command(name: String) -> Result<(), String> {
201
- let deva_dir = path_utils::ensure_deva_dir()?;
202
- let bank_dir = deva_dir.join("banks");
203
-
204
- let bank_path = bank_dir.join(&name);
205
-
206
- if !bank_path.exists() {
207
- return Err(format!("Bank '{}' is not installed", name));
208
- }
209
-
210
- std::fs::remove_dir_all(&bank_path).map_err(|e| format!("Failed to remove bank: {}", e))?;
211
-
212
- // Remove the bank from the config
213
- let config_path = path_utils::get_devalang_config_path()?;
214
- let _config = load_config(Some(&config_path))
215
- .ok_or_else(|| format!("Failed to load config from '{}'", config_path.display()))?;
216
-
217
- // Remove the bank from the config
218
- if let Some(mut config) = crate::config::ops::load_config(Some(&config_path)) {
219
- if let Some(banks) = config.banks.as_mut() {
220
- banks.retain(|b| {
221
- let name_in_path = b.path.strip_prefix("devalang://bank/").unwrap_or(&b.path);
222
- name_in_path != name
223
- });
224
-
225
- if let Err(e) = config.write_config(&config) {
226
- eprintln!("Warning: failed to write updated config: {}", e);
227
- }
228
- }
229
- }
230
-
231
- println!("✅ Bank '{}' removed successfully", name);
232
-
233
- Ok(())
234
- }
235
-
236
- pub async fn handle_bank_available_command() -> Result<(), String> {
237
- let bank_list = match crate::cli::bank::api::list_external_banks().await {
238
- Ok(list) => list,
239
- Err(_err) => {
240
- eprintln!("❌ Error fetching bank list");
241
- return Err("Failed to fetch bank list".into());
242
- }
243
- };
244
-
245
- println!("Available banks for current project :");
246
- println!(" ");
247
-
248
- for bank in bank_list {
249
- println!("📦 {}", bank.name);
250
- println!(" - Version: {}", bank.version);
251
- println!(" - Description: {}", bank.description);
252
- println!(" - Author: {}", bank.author);
253
- println!(" ");
254
- }
255
-
256
- Ok(())
257
- }
258
-
259
- pub async fn handle_bank_info_command(
260
- name: String,
261
- ) -> Result<BankInfo, Box<dyn std::error::Error>> {
262
- crate::cli::bank::api::handle_bank_info_command(name).await
263
- }
264
-
265
- pub async fn handle_bank_list_command() -> Result<(), String> {
266
- let bank_list = match crate::cli::bank::api::list_installed_banks().await {
267
- Ok(list) => list,
268
- Err(_err) => {
269
- eprintln!("❌ Error fetching bank list");
270
- return Err("Failed to fetch bank list".into());
271
- }
272
- };
273
-
274
- println!("Installed banks for current project :");
275
-
276
- for bank_toml in bank_list {
277
- let latest_version =
278
- match crate::cli::bank::api::fetch_latest_version(bank_toml.bank.name.clone()).await {
279
- Ok(version) => version,
280
- Err(_err) => {
281
- eprintln!(
282
- "❌ Error fetching latest version for '{}'",
283
- bank_toml.bank.name
284
- );
285
- continue;
286
- }
287
- };
288
-
289
- let is_latest = if latest_version.version == bank_toml.bank.version {
290
- "✅"
291
- } else {
292
- "❗"
293
- };
294
-
295
- println!(" ");
296
- println!("📦 {}", bank_toml.bank.name);
297
- println!(
298
- " - Version: v{} {} (latest: v{})",
299
- bank_toml.bank.version, is_latest, latest_version.version
300
- );
301
- println!(" - Description: {}", bank_toml.bank.description);
302
- println!(" - Author: {}", bank_toml.bank.author);
303
- }
304
-
305
- Ok(())
306
- }
@@ -1,29 +0,0 @@
1
- use devalang_types::BankInfo;
2
- use serde::Deserialize;
3
-
4
- pub mod api;
5
- pub mod commands;
6
-
7
- #[derive(Debug, Deserialize)]
8
- pub struct BankList {
9
- pub bank: Vec<BankInfo>,
10
- }
11
-
12
- #[derive(Debug, Deserialize)]
13
- pub struct BankInfoFetched {
14
- pub name: String,
15
- pub version: String,
16
- pub description: String,
17
- pub author: String,
18
- pub latest_version: String,
19
- }
20
-
21
- #[derive(Debug, Deserialize)]
22
- pub struct BankVersion {
23
- pub version: String,
24
- }
25
-
26
- pub use commands::{
27
- handle_bank_available_command, handle_bank_info_command, handle_bank_list_command,
28
- handle_remove_bank_command, handle_update_bank_command,
29
- };
@@ -1,153 +0,0 @@
1
- use crate::config::driver::ProjectConfig;
2
- use devalang_utils::logger::{LogLevel, Logger};
3
- use devalang_utils::path::find_entry_file;
4
- use devalang_utils::watcher::watch_directory;
5
-
6
- #[cfg(feature = "cli")]
7
- pub fn handle_build_command(
8
- config: Option<ProjectConfig>,
9
- entry: Option<String>,
10
- output: Option<String>,
11
- output_format: Vec<crate::cli::parser::OutputFormat>,
12
- audio_format: crate::cli::parser::AudioFormat,
13
- sample_rate: u32,
14
- watch: bool,
15
- debug: bool,
16
- compress: bool,
17
- ) -> Result<(), String> {
18
- // determine fetched values from config or CLI
19
- let fetched_entry = if entry.is_none() {
20
- config
21
- .as_ref()
22
- .and_then(|c| c.defaults.entry.clone())
23
- .unwrap_or_default()
24
- } else {
25
- entry.clone().unwrap_or_default()
26
- };
27
-
28
- let fetched_output = if output.is_none() {
29
- config
30
- .as_ref()
31
- .and_then(|c| c.defaults.output.clone())
32
- .unwrap_or_default()
33
- } else {
34
- output.clone().unwrap_or_default()
35
- };
36
-
37
- let fetched_watch = if watch {
38
- watch
39
- } else {
40
- config
41
- .as_ref()
42
- .and_then(|c| c.defaults.watch)
43
- .unwrap_or(false)
44
- };
45
-
46
- let logger = Logger::new();
47
-
48
- // Determine final audio_format: prefer CLI, else config default if present
49
- let mut final_audio_format = audio_format;
50
- if let Some(cfg) = config.as_ref() {
51
- if let Some(af) = cfg.defaults.audio_format.as_ref() {
52
- // Only override if CLI provided an empty/placeholder — clap provides a default, so we only override when CLI wasn't explicit (rare).
53
- // We'll accept values: "wav16", "wav24", "wav32" (case-insensitive)
54
- let af_low = af.to_lowercase();
55
- final_audio_format = match af_low.as_str() {
56
- "wav24" => crate::cli::parser::AudioFormat::Wav24,
57
- "wav32" => crate::cli::parser::AudioFormat::Wav32,
58
- _ => crate::cli::parser::AudioFormat::Wav16,
59
- };
60
- }
61
- }
62
-
63
- // Determine final output_format: prefer CLI vector, else config default list
64
- let mut final_output_format: Vec<crate::cli::parser::OutputFormat> = output_format.clone();
65
- if final_output_format.is_empty() {
66
- if let Some(cfg) = config.as_ref() {
67
- if let Some(ofs) = cfg.defaults.output_format.as_ref() {
68
- for s in ofs {
69
- match s.to_lowercase().as_str() {
70
- "mid" | "midi" => {
71
- final_output_format.push(crate::cli::parser::OutputFormat::Mid);
72
- }
73
- _ => final_output_format.push(crate::cli::parser::OutputFormat::Wav),
74
- }
75
- }
76
- }
77
- }
78
- }
79
-
80
- if fetched_entry.is_empty() {
81
- logger.log_message(
82
- LogLevel::Error,
83
- "Entry path is not specified. Please provide a valid entry path.",
84
- );
85
- return Err("missing entry path".to_string());
86
- }
87
- if fetched_output.is_empty() {
88
- logger.log_message(
89
- LogLevel::Error,
90
- "Output directory is not specified. Please provide a valid output directory.",
91
- );
92
- return Err("missing output directory".to_string());
93
- }
94
-
95
- let entry_file = match find_entry_file(&fetched_entry) {
96
- Some(p) => p,
97
- None => {
98
- logger.log_message(
99
- LogLevel::Error,
100
- &format!("❌ index.deva not found in directory: {}", fetched_entry),
101
- );
102
- return Err("index.deva not found".to_string());
103
- }
104
- };
105
-
106
- // SECTION Begin build
107
- if fetched_watch {
108
- let _ = crate::cli::build::process::process_build(
109
- entry_file.clone(),
110
- fetched_output.clone(),
111
- final_output_format.clone(),
112
- final_audio_format,
113
- sample_rate,
114
- debug,
115
- compress,
116
- );
117
-
118
- logger.log_message(
119
- LogLevel::Watcher,
120
- &format!("Watching for changes in '{}'...", fetched_entry),
121
- );
122
-
123
- watch_directory(entry_file.clone(), move || {
124
- logger.log_message(LogLevel::Watcher, "Detected changes, re-building...");
125
-
126
- let _ = crate::cli::build::process::process_build(
127
- entry_file.clone(),
128
- fetched_output.clone(),
129
- final_output_format.clone(),
130
- final_audio_format,
131
- sample_rate,
132
- debug,
133
- compress,
134
- );
135
- })
136
- .unwrap();
137
- } else {
138
- let res = crate::cli::build::process::process_build(
139
- entry_file,
140
- fetched_output,
141
- final_output_format,
142
- final_audio_format,
143
- sample_rate,
144
- debug,
145
- compress,
146
- );
147
- if let Err(e) = res {
148
- return Err(e);
149
- }
150
- }
151
-
152
- Ok(())
153
- }
@@ -1,2 +0,0 @@
1
- pub mod commands;
2
- pub mod process;
@@ -1,165 +0,0 @@
1
- use crate::core::{
2
- builder::Builder,
3
- debugger::{
4
- lexer::write_lexer_log_file,
5
- logs::{write_module_function_log_file, write_module_variable_log_file},
6
- preprocessor::write_preprocessor_log_file,
7
- store::{write_function_log_file, write_variables_log_file},
8
- },
9
- preprocessor::loader::ModuleLoader,
10
- store::global::GlobalStore,
11
- };
12
- use devalang_utils::path::normalize_path;
13
- use devalang_utils::{
14
- logger::{LogLevel, Logger},
15
- spinner::start_spinner,
16
- };
17
-
18
- pub struct BuildStatsInput {
19
- pub statements_by_module:
20
- std::collections::HashMap<String, Vec<crate::core::parser::statement::Statement>>,
21
- pub global_store: crate::core::store::global::GlobalStore,
22
- }
23
-
24
- pub fn process_build(
25
- entry: String,
26
- output: String,
27
- output_format: Vec<crate::cli::parser::OutputFormat>,
28
- audio_format: crate::cli::parser::AudioFormat,
29
- sample_rate: u32,
30
- debug: bool,
31
- compress: bool,
32
- ) -> Result<BuildStatsInput, String> {
33
- let spinner = start_spinner("Building...");
34
-
35
- let duration = std::time::Instant::now();
36
-
37
- let normalized_entry_file = normalize_path(&entry);
38
- let normalized_output_dir = normalize_path(&output);
39
-
40
- let mut global_store = GlobalStore::new();
41
- let module_loader = ModuleLoader::new(&normalized_entry_file, &normalized_output_dir);
42
-
43
- // SECTION Load
44
- // NOTE: We use modules in the build command, so we need to load them
45
- let (modules_tokens, modules_statements) = module_loader.load_all_modules(&mut global_store);
46
-
47
- // SECTION Write logs
48
- if debug {
49
- for (module_path, module) in global_store.modules.clone() {
50
- write_module_variable_log_file(
51
- &normalized_output_dir,
52
- &module_path,
53
- &module.variable_table,
54
- );
55
- write_module_function_log_file(
56
- &normalized_output_dir,
57
- &module_path,
58
- &module.function_table,
59
- );
60
- }
61
-
62
- write_lexer_log_file(
63
- &normalized_output_dir,
64
- "lexer_tokens.log",
65
- modules_tokens.clone(),
66
- );
67
- write_preprocessor_log_file(
68
- &normalized_output_dir,
69
- "resolved_statements.log",
70
- modules_statements.clone(),
71
- );
72
- write_variables_log_file(
73
- &normalized_output_dir,
74
- "global_variables.log",
75
- global_store.variables.clone(),
76
- );
77
- write_function_log_file(
78
- &normalized_output_dir,
79
- "global_functions.log",
80
- global_store.functions.clone(),
81
- );
82
- }
83
-
84
- // SECTION Detect build-time errors prior to building
85
- let all_errors = crate::core::error::collect_all_errors_with_modules(&modules_statements);
86
- let (warnings, criticals) = crate::core::error::partition_errors(all_errors);
87
- crate::core::error::log_errors_with_stack("Build", &warnings, &criticals);
88
- if !criticals.is_empty() {
89
- spinner.finish_and_clear();
90
- return Err(format!(
91
- "build failed with {} critical error(s): {}",
92
- criticals.len(),
93
- criticals[0].message
94
- ));
95
- }
96
-
97
- // SECTION Building AST and Audio
98
- let builder = Builder::new();
99
- builder.build_ast(&modules_statements, &normalized_output_dir, compress);
100
-
101
- // generate audio output if requested
102
- if output_format.contains(&crate::cli::parser::OutputFormat::Wav) {
103
- let audio_format_str = format!("{:?}", audio_format);
104
- builder.build_audio(
105
- &modules_statements,
106
- &normalized_output_dir,
107
- &mut global_store,
108
- Some(audio_format_str),
109
- Some(sample_rate),
110
- );
111
- }
112
-
113
- // generate midi output if requested
114
- if output_format.contains(&crate::cli::parser::OutputFormat::Mid) {
115
- builder.build_midi(
116
- &modules_statements,
117
- &normalized_output_dir,
118
- &mut global_store,
119
- );
120
- }
121
-
122
- // SECTION Logging
123
- let logger = Logger::new();
124
-
125
- if debug {
126
- let modules_loaded = global_store.modules.keys().collect::<Vec<_>>();
127
- let global_variables_loaded = global_store.variables.variables.keys().collect::<Vec<_>>();
128
- let global_functions_loaded = global_store.functions.functions.keys().collect::<Vec<_>>();
129
-
130
- logger.log_message_with_trace(
131
- LogLevel::Debug,
132
- &format!("Modules loaded: {}", global_store.modules.len()),
133
- modules_loaded.iter().map(|s| s.as_str()).collect(),
134
- );
135
- logger.log_message_with_trace(
136
- LogLevel::Debug,
137
- &format!(
138
- "Global variables: {}",
139
- global_store.variables.variables.len()
140
- ),
141
- global_variables_loaded.iter().map(|s| s.as_str()).collect(),
142
- );
143
- logger.log_message_with_trace(
144
- LogLevel::Debug,
145
- &format!(
146
- "Global functions: {}",
147
- global_store.functions.functions.len()
148
- ),
149
- global_functions_loaded.iter().map(|s| s.as_str()).collect(),
150
- );
151
- }
152
-
153
- let success_message = format!(
154
- "Build completed successfully in {:.2?}. Output files written to: '{}'",
155
- duration.elapsed(),
156
- normalized_output_dir
157
- );
158
-
159
- spinner.finish_and_clear();
160
- logger.log_message(LogLevel::Success, &success_message);
161
- Ok(BuildStatsInput {
162
- statements_by_module: modules_statements,
163
- global_store,
164
- })
165
- }