@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,208 +0,0 @@
1
- use crate::{
2
- config::driver::ProjectConfig,
3
- core::{
4
- debugger::{
5
- lexer::write_lexer_log_file,
6
- logs::{write_module_function_log_file, write_module_variable_log_file},
7
- preprocessor::write_preprocessor_log_file,
8
- store::{write_function_log_file, write_variables_log_file},
9
- },
10
- preprocessor::loader::ModuleLoader,
11
- store::global::GlobalStore,
12
- },
13
- };
14
- use devalang_utils::path::{find_entry_file, normalize_path};
15
-
16
- use devalang_utils::{
17
- logger::{LogLevel, Logger},
18
- spinner::start_spinner,
19
- watcher::watch_directory,
20
- };
21
-
22
- #[cfg(feature = "cli")]
23
- pub fn handle_check_command(
24
- config: Option<ProjectConfig>,
25
- entry: Option<String>,
26
- output: Option<String>,
27
- watch: bool,
28
- debug: bool,
29
- ) -> Result<(), String> {
30
- let fetched_entry = if entry.is_none() {
31
- config
32
- .as_ref()
33
- .and_then(|c| c.defaults.entry.clone())
34
- .unwrap_or_default()
35
- } else {
36
- entry.clone().unwrap_or_default()
37
- };
38
-
39
- let fetched_output = if output.is_none() {
40
- config
41
- .as_ref()
42
- .and_then(|c| c.defaults.output.clone())
43
- .unwrap_or_default()
44
- } else {
45
- output.clone().unwrap_or_default()
46
- };
47
-
48
- let fetched_watch = if watch {
49
- watch
50
- } else {
51
- config
52
- .as_ref()
53
- .and_then(|c| c.defaults.watch)
54
- .unwrap_or(false)
55
- };
56
-
57
- let logger = Logger::new();
58
-
59
- if fetched_entry.is_empty() {
60
- logger.log_message(
61
- LogLevel::Error,
62
- "Entry path is not specified. Please provide a valid entry path.",
63
- );
64
- return Err("missing entry path".to_string());
65
- }
66
- if fetched_output.is_empty() {
67
- logger.log_message(
68
- LogLevel::Error,
69
- "Output directory is not specified. Please provide a valid output directory.",
70
- );
71
- return Err("missing output directory".to_string());
72
- }
73
-
74
- let entry_file = match find_entry_file(&fetched_entry) {
75
- Some(p) => p,
76
- None => {
77
- logger.log_message(
78
- LogLevel::Error,
79
- &format!("❌ index.deva not found in directory: {}", fetched_entry),
80
- );
81
- return Err("index.deva not found".to_string());
82
- }
83
- };
84
-
85
- // SECTION Begin check
86
- if fetched_watch {
87
- let _ = begin_check(
88
- entry_file.clone(),
89
- fetched_output.clone(),
90
- debug,
91
- config.clone(),
92
- );
93
-
94
- logger.log_message(
95
- LogLevel::Watcher,
96
- &format!("Watching for changes in '{}'...", fetched_entry),
97
- );
98
-
99
- let cfg_for_watch = config.clone();
100
- watch_directory(entry_file.clone(), move || {
101
- logger.log_message(LogLevel::Watcher, "Detected changes, re-checking...");
102
- if let Err(e) = begin_check(
103
- entry_file.clone(),
104
- fetched_output.clone(),
105
- debug,
106
- cfg_for_watch.clone(),
107
- ) {
108
- eprintln!("[check] failed: {}", e);
109
- }
110
- })
111
- .unwrap();
112
- } else {
113
- begin_check(
114
- entry_file.clone(),
115
- fetched_output.clone(),
116
- debug,
117
- config.clone(),
118
- )?;
119
- }
120
- Ok(())
121
- }
122
-
123
- fn begin_check(
124
- entry: String,
125
- output: String,
126
- debug: bool,
127
- _config: Option<ProjectConfig>,
128
- ) -> Result<(), String> {
129
- let spinner = start_spinner("Checking...");
130
-
131
- let duration = std::time::Instant::now();
132
-
133
- let normalized_entry_file = normalize_path(&entry);
134
- let normalized_output_dir = normalize_path(&output);
135
-
136
- let mut global_store = GlobalStore::new();
137
- let module_loader = ModuleLoader::new(&normalized_entry_file, &normalized_output_dir);
138
-
139
- // SECTION Load
140
- // NOTE: We don't use modules in the check command, but we still need to load them
141
- let modules = module_loader.load_all_modules(&mut global_store);
142
-
143
- // Debugging: Log loaded modules and errors
144
- let logger = Logger::new();
145
- logger.log_message(LogLevel::Info, "Loaded modules:");
146
- for module_name in modules.0.keys() {
147
- logger.log_message(LogLevel::Info, &format!("- {}", module_name));
148
- }
149
-
150
- if debug {
151
- for (module_path, module) in global_store.modules.clone() {
152
- write_module_variable_log_file(
153
- &normalized_output_dir,
154
- &module_path,
155
- &module.variable_table,
156
- );
157
- write_module_function_log_file(
158
- &normalized_output_dir,
159
- &module_path,
160
- &module.function_table,
161
- );
162
- }
163
-
164
- write_lexer_log_file(
165
- &normalized_output_dir,
166
- "lexer_tokens.log",
167
- modules.0.clone(),
168
- );
169
- write_preprocessor_log_file(
170
- &normalized_output_dir,
171
- "resolved_statements.log",
172
- modules.1.clone(),
173
- );
174
- write_variables_log_file(
175
- &normalized_output_dir,
176
- "global_variables.log",
177
- global_store.variables.clone(),
178
- );
179
- write_function_log_file(
180
- &normalized_output_dir,
181
- "global_functions.log",
182
- global_store.functions.clone(),
183
- );
184
- }
185
-
186
- let all_errors = crate::core::error::collect_all_errors_with_modules(&modules.1);
187
-
188
- let (warnings, criticals) = crate::core::error::partition_errors(all_errors);
189
- crate::core::error::log_errors_with_stack("Check", &warnings, &criticals);
190
-
191
- if !criticals.is_empty() {
192
- spinner.finish_and_clear();
193
- return Err("check failed with critical errors".to_string());
194
- } else {
195
- logger.log_message(LogLevel::Success, "No errors detected.");
196
-
197
- let success_message = format!(
198
- "Check completed successfully in {:.2?}. Output files written to: '{}'",
199
- duration.elapsed(),
200
- normalized_output_dir
201
- );
202
-
203
- spinner.finish_and_clear();
204
- logger.log_message(LogLevel::Success, &success_message);
205
- }
206
-
207
- Ok(())
208
- }
@@ -1,253 +0,0 @@
1
- use crate::cli::discover::config::add_addons_to_config;
2
- use crate::cli::discover::install::install_selected_addons;
3
- use devalang_types::DiscoveredAddon;
4
- use devalang_utils::{
5
- logger::{LogLevel, Logger},
6
- path as path_utils,
7
- spinner::start_spinner,
8
- };
9
-
10
- pub async fn handle_discover_command() -> Result<(), String> {
11
- let deva_dir = path_utils::ensure_deva_dir()?;
12
-
13
- // Search for addons (banks, plugins, presets, templates) in the .deva directory
14
- let valid_addons_extensions = ["devabank", "devaplugin", "devapreset", "devatemplate"];
15
-
16
- let mut addons_found = Vec::new();
17
-
18
- // Recursively walk the .deva directory and collect addon files matching
19
- // the known addon extensions. This allows discovery in nested folders.
20
- fn walk_dir_collect(base: &std::path::Path, exts: &[&str], out: &mut Vec<DiscoveredAddon>) {
21
- if let Ok(entries) = std::fs::read_dir(base) {
22
- for entry in entries.filter_map(|e| e.ok()) {
23
- let p = entry.path();
24
- if p.is_dir() {
25
- walk_dir_collect(&p, exts, out);
26
- } else if p.is_file() {
27
- if let Some(ext) = p.extension().and_then(|s| s.to_str()) {
28
- if exts.contains(&ext) {
29
- let name = p
30
- .file_stem()
31
- .map(|s| s.to_string_lossy().to_string())
32
- .unwrap_or_default();
33
- let addon_type = match ext {
34
- "devabank" => "bank",
35
- "devaplugin" => "plugin",
36
- "devapreset" => "preset",
37
- "devatemplate" => "template",
38
- _ => "unknown",
39
- };
40
-
41
- out.push(DiscoveredAddon {
42
- path: p.clone(),
43
- name,
44
- extension: ext.to_string(),
45
- addon_type: addon_type.to_string(),
46
- });
47
- }
48
- }
49
- }
50
- }
51
- }
52
- }
53
-
54
- walk_dir_collect(&deva_dir, &valid_addons_extensions, &mut addons_found);
55
-
56
- let logger = Logger::new();
57
-
58
- let banks_found = addons_found
59
- .iter()
60
- .filter(|addon| addon.addon_type == "bank")
61
- .cloned()
62
- .collect::<Vec<_>>();
63
-
64
- let plugins_found = addons_found
65
- .iter()
66
- .filter(|addon| addon.addon_type == "plugin")
67
- .cloned()
68
- .collect::<Vec<_>>();
69
-
70
- let presets_found = addons_found
71
- .iter()
72
- .filter(|addon| addon.addon_type == "preset")
73
- .cloned()
74
- .collect::<Vec<_>>();
75
-
76
- let templates_found = addons_found
77
- .iter()
78
- .filter(|addon| addon.addon_type == "template")
79
- .cloned()
80
- .collect::<Vec<_>>();
81
-
82
- let mut all_addons = Vec::with_capacity(
83
- banks_found.len() + plugins_found.len() + presets_found.len() + templates_found.len(),
84
- );
85
- all_addons.extend(banks_found.iter().cloned());
86
- all_addons.extend(plugins_found.iter().cloned());
87
- all_addons.extend(presets_found.iter().cloned());
88
- all_addons.extend(templates_found.iter().cloned());
89
-
90
- println!();
91
-
92
- if all_addons.is_empty() {
93
- logger.log_message(LogLevel::Error, "No addons found in the '.deva' folder");
94
- return Ok(());
95
- }
96
-
97
- if !banks_found.is_empty() {
98
- let mut bank_traces: Vec<String> = Vec::new();
99
-
100
- for addon in &banks_found {
101
- bank_traces.push(addon.name.to_string());
102
- }
103
-
104
- let trace_refs: Vec<&str> = bank_traces.iter().map(|s| s.as_str()).collect();
105
-
106
- logger.log_message_with_trace(
107
- LogLevel::Info,
108
- format!("Found {} compiled banks in workspace", banks_found.len()).as_str(),
109
- trace_refs,
110
- );
111
- }
112
-
113
- if !plugins_found.is_empty() {
114
- let mut plugin_traces: Vec<String> = Vec::new();
115
-
116
- for addon in &plugins_found {
117
- plugin_traces.push(addon.name.to_string());
118
- }
119
-
120
- let trace_refs: Vec<&str> = plugin_traces.iter().map(|s| s.as_str()).collect();
121
-
122
- logger.log_message_with_trace(
123
- LogLevel::Info,
124
- format!(
125
- "Found {} compiled plugins in workspace",
126
- plugins_found.len()
127
- )
128
- .as_str(),
129
- trace_refs,
130
- );
131
- }
132
-
133
- if !presets_found.is_empty() {
134
- let mut preset_traces: Vec<String> = Vec::new();
135
-
136
- for addon in &presets_found {
137
- preset_traces.push(addon.name.to_string());
138
- }
139
-
140
- let trace_refs: Vec<&str> = preset_traces.iter().map(|s| s.as_str()).collect();
141
-
142
- logger.log_message_with_trace(
143
- LogLevel::Info,
144
- format!(
145
- "Found {} compiled presets in workspace",
146
- presets_found.len()
147
- )
148
- .as_str(),
149
- trace_refs,
150
- );
151
- }
152
-
153
- if !templates_found.is_empty() {
154
- let mut template_traces: Vec<String> = Vec::new();
155
-
156
- for addon in &templates_found {
157
- template_traces.push(addon.name.to_string());
158
- }
159
-
160
- let trace_refs: Vec<&str> = template_traces.iter().map(|s| s.as_str()).collect();
161
-
162
- logger.log_message_with_trace(
163
- LogLevel::Info,
164
- format!(
165
- "Found {} compiled templates in workspace",
166
- templates_found.len()
167
- )
168
- .as_str(),
169
- trace_refs,
170
- );
171
- }
172
-
173
- println!();
174
-
175
- // Build user-friendly, unique labels tied to each addon by including the path
176
- let choice_labels: Vec<String> = all_addons
177
- .iter()
178
- .map(|addon| {
179
- format!(
180
- "{}: {} ({})",
181
- addon.addon_type,
182
- addon.name,
183
- addon.path.display()
184
- )
185
- })
186
- .collect();
187
-
188
- let selected_addons = match inquire::MultiSelect::new(
189
- "Select addons to install:",
190
- choice_labels.clone(),
191
- )
192
- .prompt()
193
- {
194
- Ok(selected_addons) => selected_addons,
195
- Err(err) => {
196
- logger.log_message(
197
- LogLevel::Error,
198
- format!("Error selecting addons: {}", err).as_str(),
199
- );
200
-
201
- return Err(format!("Error selecting addons: {}", err));
202
- }
203
- };
204
-
205
- let spinner = start_spinner("Installing addons...");
206
-
207
- let addons_to_install = selected_addons
208
- .iter()
209
- .filter_map(|label| {
210
- all_addons.iter().find(|addon| {
211
- let candidate = format!(
212
- "{}: {} ({})",
213
- addon.addon_type,
214
- addon.name,
215
- addon.path.display()
216
- );
217
- &candidate == label
218
- })
219
- })
220
- .cloned()
221
- .collect::<Vec<_>>();
222
-
223
- let install_selected_addons_result = install_selected_addons(addons_to_install).await;
224
- match install_selected_addons_result {
225
- Ok(addons_enriched) => {
226
- if let Err(e) = add_addons_to_config(addons_enriched).await {
227
- spinner.finish_and_clear();
228
- logger.log_message(
229
- LogLevel::Error,
230
- format!("Failed to add addons to config: {}", e).as_str(),
231
- );
232
- return Err(format!("Failed to add addons to config: {}", e));
233
- }
234
-
235
- spinner.finish_and_clear();
236
- println!();
237
- logger.log_message(
238
- LogLevel::Success,
239
- "Successfully installed addons !".to_string().as_str(),
240
- );
241
- }
242
- Err(e) => {
243
- spinner.finish_and_clear();
244
- logger.log_message(
245
- LogLevel::Error,
246
- format!("Failed to install addons: {}", e).as_str(),
247
- );
248
- return Err(format!("Failed to install addons: {}", e));
249
- }
250
- }
251
-
252
- Ok(())
253
- }
@@ -1,111 +0,0 @@
1
- use devalang_core::config::driver::ProjectConfigExt;
2
- use devalang_types::{AddonWithMetadata, ProjectConfigBankEntry, ProjectConfigPluginEntry};
3
- use devalang_utils::path as path_utils;
4
-
5
- pub async fn add_addons_to_config(addons: Vec<AddonWithMetadata>) -> Result<(), String> {
6
- let config_path = path_utils::get_devalang_config_path()?;
7
- let mut config = crate::config::ops::load_config(Some(&config_path))
8
- .ok_or_else(|| format!("Failed to load config from '{}'", config_path.display()))?;
9
-
10
- for addon in addons {
11
- let addon_path_as_devalang_protocol = format!(
12
- "devalang://{}/{}.{}",
13
- addon.addon_type, addon.metadata.author, addon.metadata.name
14
- );
15
-
16
- match addon.addon_type.as_str() {
17
- "bank" => {
18
- if config.banks.is_none() {
19
- config.banks = Some(Vec::new());
20
- }
21
-
22
- let banks = config.banks.as_mut().unwrap();
23
-
24
- let exists = banks
25
- .iter()
26
- .any(|b| b.path == addon_path_as_devalang_protocol);
27
- if exists {
28
- println!("Bank '{}' already in config", addon.name);
29
- continue;
30
- }
31
-
32
- banks.push(ProjectConfigBankEntry {
33
- path: addon_path_as_devalang_protocol,
34
- version: Some(addon.metadata.version.clone()),
35
- });
36
- }
37
-
38
- "plugin" => {
39
- if config.plugins.is_none() {
40
- config.plugins = Some(Vec::new());
41
- }
42
-
43
- let plugins = config.plugins.as_mut().unwrap();
44
-
45
- let exists = plugins
46
- .iter()
47
- .any(|p| p.path == addon_path_as_devalang_protocol);
48
- if exists {
49
- println!("Plugin '{}' already in config", addon.name);
50
- continue;
51
- }
52
-
53
- plugins.push(ProjectConfigPluginEntry {
54
- path: addon_path_as_devalang_protocol,
55
- version: Some(addon.metadata.version.clone()),
56
- });
57
- }
58
-
59
- // "preset" => {
60
- // if config.presets.is_none() {
61
- // config.presets = Some(Vec::new());
62
- // }
63
-
64
- // let presets = config.presets.as_mut().unwrap();
65
-
66
- // let exists = presets.iter().any(|p| p.path == addon_path_as_deva_protocol);
67
- // if exists {
68
- // println!("Preset '{}' already in config", addon.name);
69
- // continue;
70
- // }
71
-
72
- // presets.push(ProjectConfigPresetEntry {
73
- // path: addon_path_as_deva_protocol,
74
- // version: Some(addon.metadata.version.clone()),
75
- // });
76
- // }
77
-
78
- // "template" => {
79
- // if config.templates.is_none() {
80
- // config.templates = Some(Vec::new());
81
- // }
82
-
83
- // let templates = config.templates.as_mut().unwrap();
84
-
85
- // let exists = templates.iter().any(|t| t.path == addon_path_as_deva_protocol);
86
- // if exists {
87
- // println!("Template '{}' already in config", addon.name);
88
- // continue;
89
- // }
90
-
91
- // templates.push(ProjectConfigTemplateEntry {
92
- // path: addon_path_as_deva_protocol,
93
- // version: Some(addon.metadata.version.clone()),
94
- // });
95
- // }
96
- _ => {
97
- println!(
98
- "Unknown addon type '{}' for addon '{}'",
99
- addon.addon_type, addon.name
100
- );
101
- }
102
- }
103
- }
104
-
105
- // Update config with new addons
106
- if let Err(e) = config.write_config(&config) {
107
- return Err(format!("Failed to write config: {}", e));
108
- }
109
-
110
- Ok(())
111
- }
@@ -1,19 +0,0 @@
1
- use std::{fs, io, path::Path};
2
-
3
- pub fn copy_dir_all(src: &Path, dst: &Path) -> Result<(), io::Error> {
4
- if !dst.exists() {
5
- fs::create_dir_all(dst)?;
6
- }
7
- for entry in fs::read_dir(src)? {
8
- let entry = entry?;
9
- let ty = entry.file_type()?;
10
- let from = entry.path();
11
- let to = dst.join(entry.file_name());
12
- if ty.is_dir() {
13
- copy_dir_all(&from, &to)?;
14
- } else {
15
- fs::copy(&from, &to)?;
16
- }
17
- }
18
- Ok(())
19
- }
@@ -1,103 +0,0 @@
1
- use devalang_types::{AddonMetadata, AddonWithMetadata, DiscoveredAddon};
2
- use devalang_utils::path as path_utils;
3
-
4
- pub async fn install_selected_addons(
5
- addons: Vec<DiscoveredAddon>,
6
- ) -> Result<Vec<AddonWithMetadata>, String> {
7
- let mut addons_enriched = Vec::new();
8
-
9
- let tmp_dir = path_utils::ensure_deva_dir()?.join("tmp");
10
-
11
- for addon in addons {
12
- std::fs::create_dir_all(tmp_dir.join(&addon.name))
13
- .map_err(|e| format!("Failed to create directory for addon {}: {}", addon.name, e))?;
14
-
15
- let addon_path = tmp_dir.join(&addon.name);
16
- devalang_utils::file::extract_zip_safely(&addon.path, &addon_path)
17
- .map_err(|e| format!("Failed to extract addon {}: {}", addon.name, e))?;
18
-
19
- let base = path_utils::ensure_deva_dir()?;
20
- let target_addon_dir = match addon.addon_type.as_str() {
21
- "bank" => base.join("banks"),
22
- "plugin" => base.join("plugins"),
23
- "preset" => base.join("presets"),
24
- "template" => base.join("templates"),
25
- _ => {
26
- return Err(format!("Unknown addon type for addon {}", addon.name));
27
- }
28
- };
29
-
30
- std::fs::create_dir_all(&target_addon_dir).map_err(|e| {
31
- format!(
32
- "Failed to create target directory for addon {}: {}",
33
- addon.name, e
34
- )
35
- })?;
36
-
37
- let target_addon_path_dir = target_addon_dir.join(&addon.name);
38
- if target_addon_path_dir.exists() {
39
- println!(
40
- "Target addon directory {} already exists",
41
- target_addon_path_dir.display()
42
- );
43
- continue;
44
- }
45
-
46
- if let Err(e) = std::fs::rename(&addon_path, &target_addon_path_dir) {
47
- crate::cli::discover::fs::copy_dir_all(&addon_path, &target_addon_path_dir).map_err(
48
- |err| {
49
- format!(
50
- "Failed to move addon {}: {} (rename error: {})",
51
- addon.name, err, e
52
- )
53
- },
54
- )?;
55
- let _ = std::fs::remove_dir_all(&addon_path);
56
- }
57
-
58
- let addon_metadata_filename = match addon.addon_type.as_str() {
59
- "bank" => "bank.toml",
60
- "plugin" => "plugin.toml",
61
- "preset" => "preset.toml",
62
- "template" => "template.toml",
63
- _ => {
64
- return Err(format!("Unknown addon type for addon {}", addon.name));
65
- }
66
- };
67
-
68
- let addon_metadata_path = target_addon_path_dir.join(addon_metadata_filename);
69
- let addon_metadata_content = std::fs::read_to_string(&addon_metadata_path)
70
- .map_err(|e| format!("Failed to read metadata for addon {}: {}", addon.name, e))?;
71
-
72
- let parsed_meta = crate::cli::discover::metadata::parse_metadata_file(
73
- &addon.addon_type,
74
- &addon_metadata_content,
75
- )
76
- .unwrap_or(AddonMetadata {
77
- name: addon.name.clone(),
78
- author: "unknown".to_string(),
79
- version: "".to_string(),
80
- description: "".to_string(),
81
- access: "".to_string(),
82
- });
83
-
84
- addons_enriched.push(AddonWithMetadata {
85
- name: addon.name.clone(),
86
- path: addon.path.clone().to_string_lossy().to_string(),
87
- addon_type: addon.addon_type.clone(),
88
- metadata: parsed_meta,
89
- });
90
-
91
- if let Err(e) = std::fs::remove_file(&addon.path) {
92
- eprintln!(
93
- "Failed to remove zipped file for addon {}: {}",
94
- addon.name, e
95
- );
96
- }
97
- }
98
-
99
- // Best-effort cleanup of temporary extraction directory
100
- let _ = std::fs::remove_dir_all(&tmp_dir);
101
-
102
- Ok(addons_enriched)
103
- }