@devaloop/devalang 0.0.1-alpha.9 → 0.0.1-beta.2

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 (322) hide show
  1. package/.cargo/config.toml +2 -0
  2. package/.devalang +6 -1
  3. package/.github/workflows/ci.yml +103 -0
  4. package/Cargo.toml +81 -48
  5. package/README.md +137 -154
  6. package/docs/CHANGELOG.md +428 -1
  7. package/docs/CONTRIBUTING.md +101 -0
  8. package/docs/ROADMAP.md +14 -7
  9. package/docs/TODO.md +16 -15
  10. package/examples/automation.deva +42 -0
  11. package/examples/bank.deva +7 -0
  12. package/examples/bus.deva +10 -0
  13. package/examples/duration.deva +9 -0
  14. package/examples/effect.deva +2 -0
  15. package/examples/events.deva +12 -0
  16. package/examples/filter.deva +11 -0
  17. package/examples/function.deva +15 -0
  18. package/examples/index.deva +57 -12
  19. package/examples/lfo.deva +9 -0
  20. package/examples/loop.deva +5 -12
  21. package/examples/pattern.deva +8 -0
  22. package/examples/plugin.deva +16 -0
  23. package/examples/synth.deva +11 -1
  24. package/examples/synth_types.deva +17 -0
  25. package/examples/variables.deva +1 -1
  26. package/out-tsc/bin/index.d.ts +2 -0
  27. package/out-tsc/bin/index.js +51 -7
  28. package/out-tsc/core/functions/index.d.ts +42 -0
  29. package/out-tsc/core/functions/index.js +87 -0
  30. package/out-tsc/core/index.d.ts +6 -0
  31. package/out-tsc/core/index.js +22 -0
  32. package/out-tsc/core/types/index.d.ts +4 -0
  33. package/out-tsc/core/types/index.js +20 -0
  34. package/out-tsc/core/types/plugin.d.ts +18 -0
  35. package/out-tsc/core/types/plugin.js +2 -0
  36. package/out-tsc/core/types/result.d.ts +27 -0
  37. package/out-tsc/core/types/result.js +2 -0
  38. package/out-tsc/core/types/statement.d.ts +106 -0
  39. package/out-tsc/core/types/statement.js +2 -0
  40. package/out-tsc/core/types/value.d.ts +43 -0
  41. package/out-tsc/core/types/value.js +2 -0
  42. package/out-tsc/index.d.ts +7 -0
  43. package/out-tsc/index.js +42 -1
  44. package/out-tsc/pkg/devalang_core.d.ts +15 -0
  45. package/out-tsc/pkg/devalang_core.js +65 -0
  46. package/out-tsc/pkg/devalang_core_bg.wasm.d.ts +34 -0
  47. package/out-tsc/scripts/copy-wasm-dts.d.ts +1 -0
  48. package/out-tsc/scripts/copy-wasm-dts.js +73 -0
  49. package/out-tsc/scripts/postinstall.d.ts +1 -0
  50. package/out-tsc/scripts/postinstall.js +83 -0
  51. package/out-tsc/scripts/version/bump.d.ts +1 -0
  52. package/out-tsc/scripts/version/fetch.d.ts +1 -0
  53. package/out-tsc/scripts/version/index.d.ts +1 -0
  54. package/out-tsc/scripts/version/sync.d.ts +1 -0
  55. package/package.json +28 -7
  56. package/project-version.json +4 -4
  57. package/rust/cli/bank/api.rs +122 -0
  58. package/rust/cli/bank/commands.rs +306 -0
  59. package/rust/cli/bank/mod.rs +29 -0
  60. package/rust/cli/build/commands.rs +153 -0
  61. package/rust/cli/build/mod.rs +2 -0
  62. package/rust/cli/build/process.rs +165 -0
  63. package/rust/cli/check/mod.rs +208 -0
  64. package/rust/cli/discover/commands.rs +253 -0
  65. package/rust/cli/discover/config.rs +111 -0
  66. package/rust/cli/discover/fs.rs +19 -0
  67. package/rust/cli/discover/install.rs +103 -0
  68. package/rust/cli/discover/metadata.rs +48 -0
  69. package/rust/cli/discover/mod.rs +5 -0
  70. package/rust/cli/{init.rs → init/commands.rs} +32 -23
  71. package/rust/cli/init/mod.rs +1 -0
  72. package/rust/cli/install/addon.rs +118 -0
  73. package/rust/cli/install/bank.rs +72 -0
  74. package/rust/cli/install/commands.rs +35 -0
  75. package/rust/cli/install/mod.rs +4 -0
  76. package/rust/cli/install/plugin.rs +80 -0
  77. package/rust/cli/login/commands.rs +124 -0
  78. package/rust/cli/login/mod.rs +1 -0
  79. package/rust/cli/mod.rs +9 -202
  80. package/rust/cli/parser.rs +359 -0
  81. package/rust/cli/play/commands.rs +375 -0
  82. package/rust/cli/play/io.rs +17 -0
  83. package/rust/cli/play/mod.rs +5 -0
  84. package/rust/cli/play/process.rs +159 -0
  85. package/rust/cli/play/realtime.rs +91 -0
  86. package/rust/cli/play/utils.rs +23 -0
  87. package/rust/cli/telemetry/commands.rs +22 -0
  88. package/rust/cli/telemetry/event_creator.rs +80 -0
  89. package/rust/cli/telemetry/mod.rs +3 -0
  90. package/rust/cli/telemetry/send.rs +51 -0
  91. package/rust/cli/{template.rs → template/commands.rs} +17 -5
  92. package/rust/cli/template/mod.rs +1 -0
  93. package/rust/cli/update/commands.rs +6 -0
  94. package/rust/cli/update/mod.rs +1 -0
  95. package/rust/config/driver.rs +112 -0
  96. package/rust/config/mod.rs +3 -16
  97. package/rust/config/ops.rs +26 -0
  98. package/rust/config/settings.rs +101 -0
  99. package/rust/core/audio/engine/driver.rs +220 -0
  100. package/rust/core/audio/engine/export.rs +169 -0
  101. package/rust/core/audio/engine/helpers.rs +178 -0
  102. package/rust/core/audio/engine/mod.rs +56 -0
  103. package/rust/core/audio/engine/notes/dsp.rs +85 -0
  104. package/rust/core/audio/engine/notes/mod.rs +44 -0
  105. package/rust/core/audio/engine/notes/params.rs +294 -0
  106. package/rust/core/audio/engine/sample/insert.rs +199 -0
  107. package/rust/core/audio/engine/sample/mod.rs +40 -0
  108. package/rust/core/audio/engine/sample/padding.rs +170 -0
  109. package/rust/core/audio/evaluator/condition.rs +61 -0
  110. package/rust/core/audio/evaluator/mod.rs +9 -0
  111. package/rust/core/audio/evaluator/numeric.rs +152 -0
  112. package/rust/core/audio/evaluator/rhs.rs +16 -0
  113. package/rust/core/audio/evaluator/string_expr.rs +94 -0
  114. package/rust/core/audio/interpreter/driver.rs +574 -216
  115. package/rust/core/audio/interpreter/mod.rs +2 -12
  116. package/rust/core/audio/interpreter/statements/arrow_call/interprete.rs +175 -0
  117. package/rust/core/audio/interpreter/statements/arrow_call/methods/chord.rs +384 -0
  118. package/rust/core/audio/interpreter/statements/arrow_call/methods/mod.rs +2 -0
  119. package/rust/core/audio/interpreter/statements/arrow_call/methods/note.rs +316 -0
  120. package/rust/core/audio/interpreter/statements/arrow_call/mod.rs +3 -0
  121. package/rust/core/audio/interpreter/statements/arrow_call/types/arp.rs +192 -0
  122. package/rust/core/audio/interpreter/statements/arrow_call/types/mod.rs +24 -0
  123. package/rust/core/audio/interpreter/statements/arrow_call/types/pad.rs +116 -0
  124. package/rust/core/audio/interpreter/statements/arrow_call/types/pluck.rs +97 -0
  125. package/rust/core/audio/interpreter/statements/arrow_call/types/sub.rs +100 -0
  126. package/rust/core/audio/interpreter/statements/automate.rs +16 -0
  127. package/rust/core/audio/interpreter/statements/call.rs +295 -0
  128. package/rust/core/audio/interpreter/{condition.rs → statements/condition.rs} +72 -69
  129. package/rust/core/audio/interpreter/statements/function.rs +24 -0
  130. package/rust/core/audio/interpreter/statements/let_.rs +36 -0
  131. package/rust/core/audio/interpreter/statements/load.rs +17 -0
  132. package/rust/core/audio/interpreter/statements/loop_.rs +115 -0
  133. package/rust/core/audio/interpreter/statements/mod.rs +12 -0
  134. package/rust/core/audio/interpreter/statements/sleep.rs +28 -0
  135. package/rust/core/audio/interpreter/statements/spawn.rs +253 -0
  136. package/rust/core/audio/interpreter/statements/tempo.rs +40 -0
  137. package/rust/core/audio/interpreter/statements/trigger.rs +239 -0
  138. package/rust/core/audio/loader/mod.rs +1 -1
  139. package/rust/core/audio/loader/trigger.rs +98 -52
  140. package/rust/core/audio/mod.rs +2 -2
  141. package/rust/core/audio/player.rs +28 -12
  142. package/rust/core/audio/special/easing.rs +189 -0
  143. package/rust/core/audio/special/env.rs +45 -0
  144. package/rust/core/audio/special/math.rs +134 -0
  145. package/rust/core/audio/special/mod.rs +9 -0
  146. package/rust/core/audio/special/modulator.rs +143 -0
  147. package/rust/core/builder/mod.rs +129 -80
  148. package/rust/core/debugger/lexer.rs +4 -4
  149. package/rust/core/debugger/logs.rs +52 -0
  150. package/rust/core/debugger/mod.rs +11 -2
  151. package/rust/core/debugger/preprocessor.rs +4 -4
  152. package/rust/core/debugger/store.rs +38 -25
  153. package/rust/core/error/mod.rs +221 -12
  154. package/rust/core/lexer/driver.rs +59 -0
  155. package/rust/core/lexer/handler/arrow.rs +62 -11
  156. package/rust/core/lexer/handler/at.rs +5 -5
  157. package/rust/core/lexer/handler/brace.rs +11 -11
  158. package/rust/core/lexer/handler/colon.rs +5 -5
  159. package/rust/core/lexer/handler/comment.rs +3 -3
  160. package/rust/core/lexer/handler/dot.rs +6 -6
  161. package/rust/core/lexer/handler/driver.rs +143 -32
  162. package/rust/core/lexer/handler/identifier.rs +11 -5
  163. package/rust/core/lexer/handler/indent.rs +18 -4
  164. package/rust/core/lexer/handler/mod.rs +6 -5
  165. package/rust/core/lexer/handler/newline.rs +3 -3
  166. package/rust/core/lexer/handler/number.rs +5 -5
  167. package/rust/core/lexer/handler/operator.rs +5 -3
  168. package/rust/core/lexer/handler/parenthesis.rs +41 -0
  169. package/rust/core/lexer/handler/slash.rs +21 -0
  170. package/rust/core/lexer/handler/string.rs +3 -3
  171. package/rust/core/lexer/mod.rs +1 -49
  172. package/rust/core/lexer/token.rs +17 -12
  173. package/rust/core/mod.rs +9 -10
  174. package/rust/core/parser/driver/block.rs +111 -0
  175. package/rust/core/parser/driver/cursor.rs +82 -0
  176. package/rust/core/parser/driver/driver_impl.rs +139 -0
  177. package/rust/core/parser/driver/mod.rs +6 -0
  178. package/rust/core/parser/driver/parse_array.rs +120 -0
  179. package/rust/core/parser/driver/parse_map.rs +223 -0
  180. package/rust/core/parser/driver/parser.rs +160 -0
  181. package/rust/core/parser/handler/arrow_call.rs +277 -126
  182. package/rust/core/parser/handler/at.rs +142 -25
  183. package/rust/core/parser/handler/bank.rs +83 -20
  184. package/rust/core/parser/handler/condition.rs +14 -5
  185. package/rust/core/parser/handler/dot.rs +111 -75
  186. package/rust/core/parser/handler/identifier/automate.rs +254 -0
  187. package/rust/core/parser/handler/identifier/call.rs +74 -24
  188. package/rust/core/parser/handler/identifier/emit.rs +70 -0
  189. package/rust/core/parser/handler/identifier/function.rs +113 -0
  190. package/rust/core/parser/handler/identifier/group.rs +28 -14
  191. package/rust/core/parser/handler/identifier/let_.rs +61 -21
  192. package/rust/core/parser/handler/identifier/mod.rs +24 -20
  193. package/rust/core/parser/handler/identifier/on.rs +107 -0
  194. package/rust/core/parser/handler/identifier/print.rs +49 -0
  195. package/rust/core/parser/handler/identifier/sleep.rs +77 -14
  196. package/rust/core/parser/handler/identifier/spawn.rs +81 -31
  197. package/rust/core/parser/handler/identifier/synth.rs +102 -32
  198. package/rust/core/parser/handler/loop_.rs +144 -22
  199. package/rust/core/parser/handler/mod.rs +6 -5
  200. package/rust/core/parser/handler/pattern.rs +74 -0
  201. package/rust/core/parser/handler/tempo.rs +67 -9
  202. package/rust/core/parser/mod.rs +3 -4
  203. package/rust/core/parser/statement.rs +6 -92
  204. package/rust/core/plugin/loader.rs +137 -0
  205. package/rust/core/plugin/mod.rs +2 -0
  206. package/rust/core/plugin/runner/mod.rs +11 -0
  207. package/rust/core/plugin/runner/non_wasm.rs +297 -0
  208. package/rust/core/plugin/runner/wasm32.rs +43 -0
  209. package/rust/core/preprocessor/loader/inject.rs +278 -0
  210. package/rust/core/preprocessor/loader/loader_helpers.rs +110 -0
  211. package/rust/core/preprocessor/loader/mod.rs +235 -0
  212. package/rust/core/preprocessor/mod.rs +4 -4
  213. package/rust/core/preprocessor/module.rs +55 -50
  214. package/rust/core/preprocessor/processor/handlers.rs +107 -0
  215. package/rust/core/preprocessor/processor/mod.rs +1 -0
  216. package/rust/core/preprocessor/resolver/bank.rs +14 -12
  217. package/rust/core/preprocessor/resolver/call.rs +106 -105
  218. package/rust/core/preprocessor/resolver/condition.rs +13 -10
  219. package/rust/core/preprocessor/resolver/driver.rs +145 -48
  220. package/rust/core/preprocessor/resolver/function.rs +69 -0
  221. package/rust/core/preprocessor/resolver/group.rs +122 -61
  222. package/rust/core/preprocessor/resolver/let_.rs +13 -12
  223. package/rust/core/preprocessor/resolver/loop_.rs +240 -13
  224. package/rust/core/preprocessor/resolver/mod.rs +8 -6
  225. package/rust/core/preprocessor/resolver/pattern.rs +83 -0
  226. package/rust/core/preprocessor/resolver/spawn.rs +83 -42
  227. package/rust/core/preprocessor/resolver/synth.rs +15 -11
  228. package/rust/core/preprocessor/resolver/tempo.rs +13 -14
  229. package/rust/core/preprocessor/resolver/trigger.rs +32 -28
  230. package/rust/core/preprocessor/resolver/value.rs +111 -13
  231. package/rust/core/store/global.rs +57 -39
  232. package/rust/core/store/mod.rs +0 -3
  233. package/rust/lib.rs +323 -117
  234. package/rust/main.rs +388 -65
  235. package/rust/types/Cargo.toml +11 -0
  236. package/rust/types/src/addons.rs +55 -0
  237. package/rust/types/src/ast.rs +202 -0
  238. package/rust/types/src/config.rs +84 -0
  239. package/rust/types/src/lib.rs +15 -0
  240. package/rust/types/src/plugin.rs +20 -0
  241. package/rust/types/src/store.rs +139 -0
  242. package/rust/types/src/telemetry.rs +85 -0
  243. package/rust/utils/Cargo.toml +26 -0
  244. package/rust/utils/src/error.rs +186 -0
  245. package/rust/utils/src/file.rs +94 -0
  246. package/rust/utils/src/first_usage.rs +97 -0
  247. package/rust/utils/{mod.rs → src/lib.rs} +6 -3
  248. package/rust/utils/{logger.rs → src/logger.rs} +94 -17
  249. package/rust/utils/src/path.rs +129 -0
  250. package/rust/utils/src/signature.rs +41 -0
  251. package/rust/utils/{spinner.rs → src/spinner.rs} +7 -8
  252. package/rust/utils/src/version.rs +27 -0
  253. package/rust/utils/{watcher.rs → src/watcher.rs} +17 -4
  254. package/rust/web/api.rs +5 -0
  255. package/rust/web/cdn.rs +34 -0
  256. package/rust/web/mod.rs +3 -0
  257. package/rust/web/sso.rs +5 -0
  258. package/templates/minimal/README.md +143 -127
  259. package/templates/welcome/README.md +143 -127
  260. package/templates/welcome/src/index.deva +56 -8
  261. package/templates/welcome/src/variables.deva +2 -4
  262. package/tests/integration.rs +21 -0
  263. package/tests/rust/cli_check_build.rs +21 -0
  264. package/tests/rust/cli_help.rs +12 -0
  265. package/tests/rust/cli_template_list.rs +10 -0
  266. package/tests/rust/cli_version.rs +11 -0
  267. package/tests/typescript/index.spec.ts +136 -0
  268. package/tests/typescript/playhead.spec.ts +36 -0
  269. package/tests/typescript/render_e2e.spec.ts +77 -0
  270. package/tsconfig.json +12 -10
  271. package/typescript/bin/index.ts +19 -5
  272. package/typescript/core/functions/index.ts +94 -0
  273. package/typescript/core/index.ts +6 -0
  274. package/typescript/core/types/index.ts +4 -0
  275. package/typescript/core/types/plugin.ts +19 -0
  276. package/typescript/core/types/result.ts +29 -0
  277. package/typescript/core/types/statement.ts +47 -0
  278. package/typescript/core/types/value.ts +29 -0
  279. package/typescript/index.ts +8 -1
  280. package/typescript/pkg/devalang_core.d.ts +4 -0
  281. package/typescript/pkg/devalang_core.ts +65 -0
  282. package/typescript/scripts/copy-wasm-dts.ts +41 -0
  283. package/typescript/scripts/postinstall.ts +85 -0
  284. package/typescript/scripts/version/bump.ts +0 -1
  285. package/typescript/scripts/version/index.ts +0 -1
  286. package/docs/COMMANDS.md +0 -85
  287. package/docs/CONFIG.md +0 -30
  288. package/docs/SYNTAX.md +0 -210
  289. package/out-tsc/bin/devalang.exe +0 -0
  290. package/out-tsc/scripts/postbuild.js +0 -11
  291. package/rust/cli/build.rs +0 -137
  292. package/rust/cli/check.rs +0 -117
  293. package/rust/cli/play.rs +0 -193
  294. package/rust/config/loader.rs +0 -13
  295. package/rust/core/audio/engine.rs +0 -203
  296. package/rust/core/audio/evaluator.rs +0 -31
  297. package/rust/core/audio/interpreter/arrow_call.rs +0 -129
  298. package/rust/core/audio/interpreter/call.rs +0 -64
  299. package/rust/core/audio/interpreter/let_.rs +0 -19
  300. package/rust/core/audio/interpreter/load.rs +0 -18
  301. package/rust/core/audio/interpreter/loop_.rs +0 -67
  302. package/rust/core/audio/interpreter/sleep.rs +0 -36
  303. package/rust/core/audio/interpreter/spawn.rs +0 -66
  304. package/rust/core/audio/interpreter/tempo.rs +0 -16
  305. package/rust/core/audio/interpreter/trigger.rs +0 -69
  306. package/rust/core/audio/renderer.rs +0 -54
  307. package/rust/core/parser/driver.rs +0 -331
  308. package/rust/core/preprocessor/loader.rs +0 -193
  309. package/rust/core/preprocessor/processor.rs +0 -76
  310. package/rust/core/shared/duration.rs +0 -8
  311. package/rust/core/shared/mod.rs +0 -2
  312. package/rust/core/shared/value.rs +0 -18
  313. package/rust/core/store/export.rs +0 -28
  314. package/rust/core/store/import.rs +0 -28
  315. package/rust/core/store/variable.rs +0 -28
  316. package/rust/core/utils/mod.rs +0 -2
  317. package/rust/core/utils/path.rs +0 -31
  318. package/rust/core/utils/validation.rs +0 -37
  319. package/rust/utils/file.rs +0 -35
  320. package/rust/utils/signature.rs +0 -17
  321. package/rust/utils/version.rs +0 -15
  322. package/typescript/scripts/postbuild.ts +0 -8
@@ -1,193 +0,0 @@
1
- use std::{ collections::HashMap, path::Path };
2
- use crate::{
3
- core::{
4
- error::ErrorHandler,
5
- lexer::{ token::Token, Lexer },
6
- parser::{ statement::{ Statement, StatementKind }, driver::Parser },
7
- preprocessor::{ module::Module, processor::process_modules },
8
- store::global::GlobalStore,
9
- utils::path::normalize_path,
10
- },
11
- utils::logger::Logger,
12
- };
13
- use crate::core::preprocessor::resolver::driver::{
14
- resolve_all_modules,
15
- resolve_and_flatten_all_modules,
16
- };
17
- use crate::core::utils::path::resolve_relative_path;
18
-
19
- pub struct ModuleLoader {
20
- pub entry: String,
21
- pub output: String,
22
- pub base_dir: String,
23
- }
24
-
25
- impl ModuleLoader {
26
- pub fn new(entry: &str, output: &str) -> Self {
27
- let base_dir = Path::new(entry)
28
- .parent()
29
- .unwrap_or(Path::new(""))
30
- .to_string_lossy()
31
- .replace('\\', "/");
32
-
33
- Self {
34
- entry: entry.to_string(),
35
- output: output.to_string(),
36
- base_dir: base_dir,
37
- }
38
- }
39
-
40
- pub fn from_raw_source(
41
- entry_path: &str,
42
- output_path: &str,
43
- content: &str,
44
- global_store: &mut GlobalStore
45
- ) -> Self {
46
- let normalized_entry_path = normalize_path(entry_path);
47
-
48
- let mut module = Module::new(&entry_path);
49
- module.content = content.to_string();
50
-
51
- global_store.insert_module(normalized_entry_path.to_string(), module);
52
-
53
- Self {
54
- entry: normalized_entry_path.to_string(),
55
- output: output_path.to_string(),
56
- base_dir: "".to_string(),
57
- }
58
- }
59
-
60
- pub fn extract_statements_map(
61
- &self,
62
- global_store: &GlobalStore
63
- ) -> HashMap<String, Vec<Statement>> {
64
- global_store.modules
65
- .iter()
66
- .map(|(path, module)| (path.clone(), module.statements.clone()))
67
- .collect()
68
- }
69
-
70
- pub fn load_single_module(&self, global_store: &mut GlobalStore) -> Result<Module, String> {
71
- let mut module = global_store.modules
72
- .remove(&self.entry)
73
- .ok_or_else(|| format!("Module not found in store for path: {}", self.entry))?;
74
-
75
- // SECTION Lexing the module content
76
- let lexer = Lexer::new();
77
- let tokens = lexer
78
- .lex_from_source(&module.content)
79
- .map_err(|e| format!("Lexer failed: {}", e))?;
80
-
81
- module.tokens = tokens.clone();
82
-
83
- // SECTION Parsing tokens into statements
84
- let mut parser = Parser::new();
85
- parser.set_current_module(self.entry.clone());
86
- let statements = parser.parse_tokens(tokens, global_store);
87
- module.statements = statements;
88
-
89
- // SECTION Error handling
90
- let mut error_handler = ErrorHandler::new();
91
- error_handler.detect_from_statements(&mut parser, &module.statements);
92
-
93
- global_store.modules.insert(self.entry.clone(), module.clone());
94
-
95
- Ok(module)
96
- }
97
-
98
- #[cfg(feature = "cli")]
99
- pub fn load_all_modules(
100
- &self,
101
- global_store: &mut GlobalStore
102
- ) -> (HashMap<String, Vec<Token>>, HashMap<String, Vec<Statement>>) {
103
- // SECTION Load the entry module and its dependencies
104
-
105
- let tokens_by_module = self.load_module_recursively(&self.entry, global_store);
106
-
107
- // SECTION Process and resolve modules
108
- process_modules(self, global_store);
109
- resolve_all_modules(self, global_store);
110
-
111
- let statemnts_by_module = resolve_and_flatten_all_modules(global_store);
112
-
113
- (tokens_by_module, statemnts_by_module)
114
- }
115
-
116
- #[cfg(feature = "cli")]
117
- fn load_module_recursively(
118
- &self,
119
- raw_path: &str,
120
- global_store: &mut GlobalStore
121
- ) -> HashMap<String, Vec<Token>> {
122
- let path = normalize_path(raw_path);
123
-
124
- // Check if already loaded
125
- if global_store.modules.contains_key(&path) {
126
- return HashMap::new();
127
- }
128
-
129
- let lexer = Lexer::new();
130
- let tokens = lexer.lex_tokens(&path);
131
-
132
- let mut parser = Parser::new();
133
- parser.set_current_module(path.clone());
134
-
135
- let statements = parser.parse_tokens(tokens.clone(), global_store);
136
-
137
- // Error handling
138
- let mut error_handler = ErrorHandler::new();
139
- error_handler.detect_from_statements(&mut parser, &statements);
140
-
141
- if error_handler.has_errors() {
142
- let logger = Logger::new();
143
- for error in error_handler.get_errors() {
144
- let trace = format!("{}:{}:{}", path, error.line, error.column);
145
- logger.log_error_with_stacktrace(&error.message, &trace);
146
- }
147
- }
148
-
149
- // Insert module into store
150
- let mut module = Module::new(&path);
151
- module.tokens = tokens.clone();
152
- module.statements = statements.clone();
153
- global_store.insert_module(path.clone(), module);
154
-
155
- // Load dependencies
156
- self.load_module_imports(&path, global_store);
157
-
158
- // Return tokens per module
159
- global_store.modules
160
- .iter()
161
- .map(|(p, m)| (p.clone(), m.tokens.clone()))
162
- .collect()
163
- }
164
-
165
- #[cfg(feature = "cli")]
166
- fn load_module_imports(&self, path: &String, global_store: &mut GlobalStore) {
167
- let import_paths: Vec<String> = {
168
- let current_module = match global_store.modules.get(path) {
169
- Some(module) => module,
170
- None => {
171
- eprintln!("[warn] Cannot resolve imports: module '{}' not found in store", path);
172
- return;
173
- }
174
- };
175
-
176
- current_module.statements
177
- .iter()
178
- .filter_map(|stmt| {
179
- if let StatementKind::Import { source, .. } = &stmt.kind {
180
- Some(source.clone())
181
- } else {
182
- None
183
- }
184
- })
185
- .collect()
186
- };
187
-
188
- for import_path in import_paths {
189
- let resolved = resolve_relative_path(path, &import_path);
190
- self.load_module_recursively(&resolved, global_store);
191
- }
192
- }
193
- }
@@ -1,76 +0,0 @@
1
- use std::{ collections::HashMap, path::Path };
2
-
3
- use crate::core::{
4
- parser::{ driver::Parser, statement::StatementKind },
5
- preprocessor::{ loader::ModuleLoader, resolver::group },
6
- shared::value::Value,
7
- store::global::GlobalStore,
8
- utils::path::{normalize_path, resolve_relative_path},
9
- };
10
-
11
- pub fn process_modules(module_loader: &ModuleLoader, global_store: &mut GlobalStore) {
12
- for module in global_store.modules.values_mut() {
13
- for stmt in &module.statements {
14
- match &stmt.kind {
15
- StatementKind::Let { name } => {
16
- module.variable_table.variables.insert(name.clone(), stmt.value.clone());
17
- }
18
-
19
- StatementKind::Load { source, alias } => {
20
- let module_dir = Path::new(&module.path).parent().unwrap_or(Path::new(""));
21
-
22
- let resolved_path = normalize_path(&module_dir.join(source));
23
-
24
- module.variable_table.variables.insert(
25
- alias.clone(),
26
- Value::Sample(resolved_path)
27
- );
28
- }
29
-
30
- StatementKind::Export { names, source } => {
31
- for name in names {
32
- if let Some(val) = module.variable_table.get(name) {
33
- module.export_table.add_export(name.clone(), val.clone());
34
- }
35
- }
36
- }
37
-
38
- StatementKind::Import { names, source } => {
39
- let resolved = resolve_relative_path(&module.path, source);
40
- for name in names {
41
- module.import_table.add_import(
42
- name.clone(),
43
- Value::String(resolved.clone())
44
- );
45
- }
46
- }
47
-
48
- StatementKind::Group => {
49
- if let Value::Map(map) = &stmt.value {
50
- if
51
- let (Some(Value::String(name)), Some(Value::Block(body))) = (
52
- map.get("identifier"),
53
- map.get("body"),
54
- )
55
- {
56
- let mut stored_map = HashMap::new();
57
-
58
- stored_map.insert(
59
- "identifier".to_string(),
60
- Value::String(name.clone())
61
- );
62
-
63
- stored_map.insert("body".to_string(), Value::Block(body.clone()));
64
-
65
- module.variable_table.set(name.to_string(), Value::Map(stored_map));
66
- } else {
67
- eprintln!("❌ Invalid group definition: {:?}", stmt.value);
68
- }
69
- }
70
- }
71
-
72
- _ => {}
73
- }
74
- }
75
- }
76
- }
@@ -1,8 +0,0 @@
1
- use serde::{ Deserialize, Serialize };
2
-
3
- #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
4
- pub enum Duration {
5
- Number(f32),
6
- Identifier(String),
7
- Auto,
8
- }
@@ -1,2 +0,0 @@
1
- pub mod value;
2
- pub mod duration;
@@ -1,18 +0,0 @@
1
- use std::collections::HashMap;
2
- use serde::{ Deserialize, Serialize };
3
-
4
- use crate::core::parser::statement::Statement;
5
-
6
- #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
7
- pub enum Value {
8
- Boolean(bool),
9
- Number(f32),
10
- Identifier(String),
11
- String(String),
12
- Array(Vec<Value>),
13
- Map(HashMap<String, Value>),
14
- Block(Vec<Statement>),
15
- Sample(String),
16
- Unknown,
17
- Null,
18
- }
@@ -1,28 +0,0 @@
1
- use std::collections::HashMap;
2
-
3
- use crate::core::shared::value::Value;
4
-
5
- #[derive(Debug, Default, Clone, PartialEq)]
6
- pub struct ExportTable {
7
- pub exports: HashMap<String, Value>,
8
- }
9
-
10
- impl ExportTable {
11
- pub fn new() -> Self {
12
- ExportTable {
13
- exports: HashMap::new(),
14
- }
15
- }
16
-
17
- pub fn add_export(&mut self, name: String, value: Value) {
18
- self.exports.insert(name, value);
19
- }
20
-
21
- pub fn get_export(&self, name: &str) -> Option<&Value> {
22
- self.exports.get(name)
23
- }
24
-
25
- pub fn remove_export(&mut self, name: &str) -> Option<Value> {
26
- self.exports.remove(name)
27
- }
28
- }
@@ -1,28 +0,0 @@
1
- use std::collections::HashMap;
2
-
3
- use crate::core::shared::value::Value;
4
-
5
- #[derive(Debug, Default, Clone, PartialEq)]
6
- pub struct ImportTable {
7
- pub imports: HashMap<String, Value>,
8
- }
9
-
10
- impl ImportTable {
11
- pub fn new() -> Self {
12
- ImportTable {
13
- imports: HashMap::new(),
14
- }
15
- }
16
-
17
- pub fn add_import(&mut self, name: String, value: Value) {
18
- self.imports.insert(name, value);
19
- }
20
-
21
- pub fn get_import(&self, name: &str) -> Option<&Value> {
22
- self.imports.get(name)
23
- }
24
-
25
- pub fn remove_import(&mut self, name: &str) -> Option<Value> {
26
- self.imports.remove(name)
27
- }
28
- }
@@ -1,28 +0,0 @@
1
- use std::collections::HashMap;
2
-
3
- use crate::core::shared::value::Value;
4
-
5
- #[derive(Debug, Default, Clone, PartialEq)]
6
- pub struct VariableTable {
7
- pub variables: HashMap<String, Value>,
8
- }
9
-
10
- impl VariableTable {
11
- pub fn new() -> Self {
12
- VariableTable {
13
- variables: HashMap::new(),
14
- }
15
- }
16
-
17
- pub fn set(&mut self, name: String, value: Value) {
18
- self.variables.insert(name, value);
19
- }
20
-
21
- pub fn get(&self, name: &str) -> Option<&Value> {
22
- self.variables.get(name)
23
- }
24
-
25
- pub fn remove(&mut self, name: &str) -> Option<Value> {
26
- self.variables.remove(name)
27
- }
28
- }
@@ -1,2 +0,0 @@
1
- pub mod path;
2
- pub mod validation;
@@ -1,31 +0,0 @@
1
- use std::path::{ Component, Path, PathBuf };
2
-
3
- pub fn find_entry_file(entry: &str) -> Option<String> {
4
- let path = Path::new(entry);
5
-
6
- if path.is_file() {
7
- return Some(normalize_path(entry));
8
- }
9
-
10
- if path.is_dir() {
11
- let candidate = path.join("index.deva");
12
- if candidate.exists() {
13
- return Some(normalize_path(&candidate));
14
- }
15
- }
16
-
17
- None
18
- }
19
-
20
- pub fn normalize_path<P: AsRef<Path>>(path: P) -> String {
21
- let path_buf = PathBuf::from(path.as_ref());
22
- path_buf.components().collect::<PathBuf>().to_string_lossy().replace('\\', "/")
23
- }
24
-
25
- pub fn resolve_relative_path(base: &str, import: &str) -> String {
26
- let base_path = Path::new(base)
27
- .parent()
28
- .unwrap_or_else(|| Path::new(""));
29
- let full_path = base_path.join(import);
30
- full_path.components().collect::<PathBuf>().to_string_lossy().replace("\\", "/")
31
- }
@@ -1,37 +0,0 @@
1
- use crate::core::{ preprocessor::module::Module, shared::value::Value, store::global::GlobalStore };
2
-
3
- // NOTE: Deprecated functions, kept for reference
4
-
5
- // pub fn is_valid_entity(entity: &str, module: &Module, global_store: &GlobalStore) -> bool {
6
- // let built_ins = ["kick", "snare", "hat", "clap"];
7
-
8
- // if built_ins.contains(&entity) {
9
- // return true;
10
- // }
11
-
12
- // if let Some(val) = module.variable_table.get(entity) {
13
- // match val {
14
- // Value::Sample(_) => true,
15
- // _ => false,
16
- // }
17
- // } else {
18
- // false
19
- // }
20
- // }
21
-
22
- // pub fn is_valid_identifier(ident: &str, module: &Module) -> bool {
23
- // let built_ins = ["auto"];
24
-
25
- // if built_ins.contains(&ident) {
26
- // return true;
27
- // }
28
-
29
- // if let Some(val) = module.variable_table.get(ident) {
30
- // match val {
31
- // Value::Identifier(_) => true,
32
- // _ => false,
33
- // }
34
- // } else {
35
- // false
36
- // }
37
- // }
@@ -1,35 +0,0 @@
1
- use std::{ fs::{ self }, path::Path };
2
- use include_dir::{ Dir, DirEntry };
3
-
4
- pub fn copy_dir_recursive(dir: &Dir, target_root: &Path, base_path: &Path) {
5
- for entry in dir.entries() {
6
- match entry {
7
- DirEntry::Dir(subdir) => {
8
- copy_dir_recursive(subdir, target_root, base_path);
9
- }
10
- DirEntry::File(file) => {
11
- let rel_path = file.path().strip_prefix(base_path).unwrap();
12
- let dest_path = target_root.join(rel_path);
13
-
14
- if let Some(parent) = dest_path.parent() {
15
- fs::create_dir_all(parent).unwrap();
16
- }
17
-
18
- fs::write(&dest_path, file.contents()).expect("Error writing file");
19
- }
20
- }
21
- }
22
- }
23
-
24
- pub fn format_file_size(bytes: u64) -> String {
25
- const KB: u64 = 1024;
26
- const MB: u64 = 1024 * 1024;
27
-
28
- if bytes >= MB {
29
- format!("{:.2} Mb", (bytes as f64) / (MB as f64))
30
- } else if bytes >= KB {
31
- format!("{:.2} Kb", (bytes as f64) / (KB as f64))
32
- } else {
33
- format!("{} bytes", bytes)
34
- }
35
- }
@@ -1,17 +0,0 @@
1
- pub fn get_signature(version: &str) -> String {
2
- let signature =
3
- format!(r#"
4
- /|_/|
5
- / ^ ^(_o 🦊 Devalang
6
- / __.'
7
- / \ A programming language for music and sound.
8
- / _ \_ Part of Devaloop project.
9
- (_) (_) '._
10
- '.__ '. .-''-'. https://devaloop.com
11
- ( '. ('.____.''
12
- _) )'_, ) v{}
13
- (__/ (__/
14
- "#, version);
15
-
16
- signature
17
- }
@@ -1,15 +0,0 @@
1
- use crate::utils::signature::get_signature;
2
-
3
- pub fn get_version() -> &'static str {
4
- let version: &str = env!("CARGO_PKG_VERSION");
5
- version
6
- }
7
-
8
- pub fn get_version_with_signature() -> &'static str {
9
- let version = get_version();
10
- let signature = get_signature(version);
11
-
12
- println!("{}", signature);
13
-
14
- "(c) 2025 Devaloop. All rights reserved."
15
- }
@@ -1,8 +0,0 @@
1
- import fs from "fs";
2
- import path from "path";
3
-
4
- const source = path.join(__dirname, "..", "..", "target", "release", "devalang.exe");
5
- const destination = path.join(__dirname, "..", "bin", "devalang.exe");
6
-
7
- fs.copyFileSync(source, destination);
8
- fs.chmodSync(destination, 0o755);