@devaloop/devalang 0.0.1-alpha.15 → 0.0.1-alpha.16-hotfix.0

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 (173) hide show
  1. package/.devalang +2 -0
  2. package/.github/workflows/ci.yml +92 -0
  3. package/Cargo.toml +60 -58
  4. package/README.md +1 -1
  5. package/docs/CHANGELOG.md +34 -1
  6. package/docs/CONTRIBUTING.md +101 -1
  7. package/docs/ROADMAP.md +1 -1
  8. package/docs/TODO.md +1 -1
  9. package/examples/automation.deva +1 -3
  10. package/examples/bank.deva +4 -4
  11. package/examples/events.deva +12 -0
  12. package/examples/function.deva +4 -4
  13. package/examples/index.deva +3 -5
  14. package/examples/loop.deva +5 -11
  15. package/examples/pattern.deva +8 -0
  16. package/examples/plugin.deva +12 -11
  17. package/examples/variables.deva +1 -1
  18. package/out-tsc/bin/index.js +51 -7
  19. package/out-tsc/index.js +3 -1
  20. package/out-tsc/scripts/postbuild.js +9 -10
  21. package/out-tsc/scripts/postinstall.js +49 -0
  22. package/package.json +12 -4
  23. package/project-version.json +3 -3
  24. package/rust/cli/bank.rs +462 -455
  25. package/rust/cli/build.rs +252 -199
  26. package/rust/cli/check.rs +221 -180
  27. package/rust/cli/driver.rs +297 -292
  28. package/rust/cli/generator.rs +1 -0
  29. package/rust/cli/init.rs +87 -79
  30. package/rust/cli/install.rs +35 -32
  31. package/rust/cli/login.rs +127 -134
  32. package/rust/cli/mod.rs +13 -11
  33. package/rust/cli/play.rs +1123 -218
  34. package/rust/cli/telemetry.rs +19 -0
  35. package/rust/cli/template.rs +69 -57
  36. package/rust/cli/update.rs +6 -4
  37. package/rust/common/api.rs +5 -5
  38. package/rust/common/mod.rs +3 -3
  39. package/rust/config/driver.rs +118 -94
  40. package/rust/config/loader.rs +165 -156
  41. package/rust/config/mod.rs +4 -2
  42. package/rust/config/settings.rs +91 -0
  43. package/rust/config/stats.rs +257 -0
  44. package/rust/core/audio/engine.rs +696 -659
  45. package/rust/core/audio/evaluator.rs +263 -132
  46. package/rust/core/audio/interpreter/arrow_call.rs +198 -187
  47. package/rust/core/audio/interpreter/call.rs +98 -95
  48. package/rust/core/audio/interpreter/condition.rs +70 -71
  49. package/rust/core/audio/interpreter/driver.rs +487 -231
  50. package/rust/core/audio/interpreter/function.rs +26 -21
  51. package/rust/core/audio/interpreter/let_.rs +38 -26
  52. package/rust/core/audio/interpreter/load.rs +18 -18
  53. package/rust/core/audio/interpreter/loop_.rs +113 -106
  54. package/rust/core/audio/interpreter/mod.rs +14 -14
  55. package/rust/core/audio/interpreter/sleep.rs +27 -28
  56. package/rust/core/audio/interpreter/spawn.rs +105 -102
  57. package/rust/core/audio/interpreter/tempo.rs +19 -16
  58. package/rust/core/audio/interpreter/trigger.rs +239 -210
  59. package/rust/core/audio/loader/mod.rs +1 -1
  60. package/rust/core/audio/loader/trigger.rs +100 -94
  61. package/rust/core/audio/mod.rs +7 -7
  62. package/rust/core/audio/player.rs +64 -64
  63. package/rust/core/audio/renderer.rs +56 -53
  64. package/rust/core/audio/special/easing.rs +189 -120
  65. package/rust/core/audio/special/env.rs +43 -41
  66. package/rust/core/audio/special/math.rs +102 -92
  67. package/rust/core/audio/special/mod.rs +9 -9
  68. package/rust/core/audio/special/modulator.rs +143 -120
  69. package/rust/core/builder/mod.rs +80 -85
  70. package/rust/core/debugger/lexer.rs +27 -27
  71. package/rust/core/debugger/mod.rs +24 -23
  72. package/rust/core/debugger/module.rs +55 -47
  73. package/rust/core/debugger/preprocessor.rs +27 -27
  74. package/rust/core/debugger/store.rs +40 -39
  75. package/rust/core/error/mod.rs +80 -69
  76. package/rust/core/lexer/handler/arrow.rs +82 -82
  77. package/rust/core/lexer/handler/at.rs +21 -21
  78. package/rust/core/lexer/handler/brace.rs +41 -41
  79. package/rust/core/lexer/handler/colon.rs +21 -21
  80. package/rust/core/lexer/handler/comment.rs +30 -30
  81. package/rust/core/lexer/handler/dot.rs +21 -21
  82. package/rust/core/lexer/handler/driver.rs +337 -292
  83. package/rust/core/lexer/handler/identifier.rs +46 -43
  84. package/rust/core/lexer/handler/indent.rs +66 -66
  85. package/rust/core/lexer/handler/mod.rs +16 -16
  86. package/rust/core/lexer/handler/newline.rs +23 -23
  87. package/rust/core/lexer/handler/number.rs +31 -31
  88. package/rust/core/lexer/handler/operator.rs +46 -46
  89. package/rust/core/lexer/handler/parenthesis.rs +41 -41
  90. package/rust/core/lexer/handler/slash.rs +21 -21
  91. package/rust/core/lexer/handler/string.rs +63 -63
  92. package/rust/core/lexer/mod.rs +54 -51
  93. package/rust/core/lexer/token.rs +97 -94
  94. package/rust/core/mod.rs +11 -11
  95. package/rust/core/parser/driver.rs +513 -490
  96. package/rust/core/parser/handler/arrow_call.rs +233 -227
  97. package/rust/core/parser/handler/at.rs +245 -162
  98. package/rust/core/parser/handler/bank.rs +94 -69
  99. package/rust/core/parser/handler/condition.rs +80 -74
  100. package/rust/core/parser/handler/dot.rs +143 -135
  101. package/rust/core/parser/handler/identifier/automate.rs +257 -194
  102. package/rust/core/parser/handler/identifier/call.rs +91 -88
  103. package/rust/core/parser/handler/identifier/emit.rs +66 -0
  104. package/rust/core/parser/handler/identifier/function.rs +100 -91
  105. package/rust/core/parser/handler/identifier/group.rs +85 -75
  106. package/rust/core/parser/handler/identifier/let_.rs +158 -143
  107. package/rust/core/parser/handler/identifier/mod.rs +54 -56
  108. package/rust/core/parser/handler/identifier/on.rs +98 -0
  109. package/rust/core/parser/handler/identifier/print.rs +52 -29
  110. package/rust/core/parser/handler/identifier/sleep.rs +36 -33
  111. package/rust/core/parser/handler/identifier/spawn.rs +91 -88
  112. package/rust/core/parser/handler/identifier/synth.rs +65 -63
  113. package/rust/core/parser/handler/loop_.rs +170 -89
  114. package/rust/core/parser/handler/mod.rs +8 -8
  115. package/rust/core/parser/handler/tempo.rs +53 -47
  116. package/rust/core/parser/mod.rs +4 -4
  117. package/rust/core/parser/statement.rs +142 -113
  118. package/rust/core/plugin/loader.rs +123 -48
  119. package/rust/core/plugin/mod.rs +2 -1
  120. package/rust/core/plugin/runner.rs +296 -0
  121. package/rust/core/preprocessor/loader.rs +515 -326
  122. package/rust/core/preprocessor/mod.rs +4 -4
  123. package/rust/core/preprocessor/module.rs +60 -58
  124. package/rust/core/preprocessor/processor.rs +99 -101
  125. package/rust/core/preprocessor/resolver/bank.rs +51 -48
  126. package/rust/core/preprocessor/resolver/call.rs +100 -101
  127. package/rust/core/preprocessor/resolver/condition.rs +97 -97
  128. package/rust/core/preprocessor/resolver/driver.rs +310 -280
  129. package/rust/core/preprocessor/resolver/function.rs +69 -68
  130. package/rust/core/preprocessor/resolver/group.rs +96 -91
  131. package/rust/core/preprocessor/resolver/let_.rs +32 -28
  132. package/rust/core/preprocessor/resolver/loop_.rs +320 -121
  133. package/rust/core/preprocessor/resolver/mod.rs +15 -15
  134. package/rust/core/preprocessor/resolver/spawn.rs +76 -73
  135. package/rust/core/preprocessor/resolver/synth.rs +56 -50
  136. package/rust/core/preprocessor/resolver/tempo.rs +50 -49
  137. package/rust/core/preprocessor/resolver/trigger.rs +113 -115
  138. package/rust/core/preprocessor/resolver/value.rs +81 -81
  139. package/rust/core/shared/duration.rs +9 -9
  140. package/rust/core/shared/mod.rs +3 -3
  141. package/rust/core/shared/value.rs +35 -32
  142. package/rust/core/store/function.rs +34 -34
  143. package/rust/core/store/global.rs +55 -38
  144. package/rust/core/store/mod.rs +5 -5
  145. package/rust/core/store/variable.rs +37 -34
  146. package/rust/core/utils/mod.rs +2 -2
  147. package/rust/core/utils/path.rs +37 -31
  148. package/rust/core/utils/validation.rs +35 -36
  149. package/rust/installer/addon.rs +84 -80
  150. package/rust/installer/bank.rs +62 -65
  151. package/rust/installer/mod.rs +5 -5
  152. package/rust/installer/plugin.rs +54 -55
  153. package/rust/installer/utils.rs +56 -56
  154. package/rust/lib.rs +156 -164
  155. package/rust/main.rs +250 -144
  156. package/rust/utils/error.rs +200 -51
  157. package/rust/utils/file.rs +38 -35
  158. package/rust/utils/first_usage.rs +76 -0
  159. package/rust/utils/logger.rs +195 -143
  160. package/rust/utils/mod.rs +9 -7
  161. package/rust/utils/signature.rs +19 -17
  162. package/rust/utils/spinner.rs +22 -19
  163. package/rust/utils/telemetry.rs +292 -0
  164. package/rust/utils/watcher.rs +34 -33
  165. package/templates/minimal/README.md +97 -121
  166. package/templates/welcome/README.md +97 -121
  167. package/typescript/bin/index.ts +19 -5
  168. package/typescript/index.ts +3 -1
  169. package/typescript/scripts/postbuild.ts +10 -6
  170. package/typescript/scripts/postinstall.ts +56 -0
  171. package/typescript/scripts/version/bump.ts +0 -1
  172. package/typescript/scripts/version/index.ts +0 -1
  173. package/out-tsc/bin/devalang.exe +0 -0
package/rust/lib.rs CHANGED
@@ -1,164 +1,156 @@
1
- pub mod core;
2
- pub mod utils;
3
- pub mod config;
4
-
5
- use serde::{ Deserialize, Serialize };
6
- use wasm_bindgen::prelude::*;
7
- use serde_wasm_bindgen::to_value;
8
-
9
- use crate::core::{
10
- audio::{ engine::AudioEngine, interpreter::driver::run_audio_program },
11
- parser::statement::{ Statement, StatementKind },
12
- preprocessor::loader::ModuleLoader,
13
- shared::value::Value,
14
- store::{ function::FunctionTable, global::GlobalStore, variable::VariableTable },
15
- utils::path::normalize_path,
16
- };
17
-
18
- #[derive(Serialize, Deserialize)]
19
- struct ParseResult {
20
- ok: bool,
21
- ast: String,
22
- errors: Vec<ErrorResult>,
23
- }
24
-
25
- #[derive(Serialize, Deserialize)]
26
- struct ErrorResult {
27
- message: String,
28
- line: usize,
29
- column: usize,
30
- }
31
-
32
- #[wasm_bindgen]
33
- pub fn parse(entry_path: &str, source: &str) -> Result<JsValue, JsValue> {
34
- let statements = parse_internal_from_string(entry_path, source);
35
-
36
- match statements {
37
- Ok(value) => {
38
- let ast_string = value;
39
- to_value(&ast_string).map_err(|e|
40
- JsValue::from_str(&format!("Error converting AST to JS value: {}", e))
41
- )
42
- }
43
- Err(e) => { Err(JsValue::from_str(&format!("Error: {}", e))) }
44
- }
45
- }
46
-
47
- #[wasm_bindgen]
48
- pub fn render_audio(user_code: &str) -> Result<js_sys::Float32Array, JsValue> {
49
- let entry_path = normalize_path("playground.deva");
50
- let output_path = normalize_path("./temp");
51
-
52
- let mut global_store = GlobalStore::new();
53
-
54
- let loader = ModuleLoader::from_raw_source(
55
- &entry_path,
56
- &output_path,
57
- user_code,
58
- &mut global_store
59
- );
60
-
61
- loader
62
- .load_wasm_module(&mut global_store)
63
- .map_err(|e| JsValue::from_str(&format!("Module loading error: {}", e)))?;
64
-
65
- let all_statements_map = loader.extract_statements_map(&global_store);
66
-
67
- let main_statements = all_statements_map
68
- .get(&entry_path)
69
- .ok_or(JsValue::from_str("❌ No statements found for entry module"))?
70
- .clone();
71
-
72
- let mut audio_engine = AudioEngine::new("wasm_output".to_string());
73
-
74
- let _ = run_audio_program(
75
- &main_statements,
76
- &mut audio_engine,
77
- "playground".to_string(),
78
- "wasm_output".to_string(),
79
- VariableTable::new(),
80
- FunctionTable::new(),
81
- &mut global_store
82
- );
83
-
84
- let samples = audio_engine.get_normalized_buffer();
85
-
86
- if samples.is_empty() {
87
- return Err(JsValue::from_str("❌ Audio buffer is empty"));
88
- }
89
-
90
- Ok(js_sys::Float32Array::from(samples.as_slice()))
91
- }
92
-
93
- fn parse_internal_from_string(virtual_path: &str, source: &str) -> Result<ParseResult, String> {
94
- let entry_path = normalize_path(virtual_path);
95
- let output_path = normalize_path("./temp");
96
-
97
- let mut global_store = GlobalStore::new();
98
- let loader = ModuleLoader::from_raw_source(
99
- &entry_path,
100
- &output_path,
101
- source,
102
- &mut global_store
103
- );
104
-
105
- let module = loader
106
- .load_single_module(&mut global_store)
107
- .map_err(|e| format!("Error loading module: {}", e))?;
108
-
109
- let raw_ast = ast_to_string(module.statements.clone());
110
-
111
- let found_errors = collect_errors_recursively(&module.statements);
112
-
113
- let result = ParseResult {
114
- ok: true,
115
- ast: raw_ast,
116
- errors: found_errors,
117
- };
118
-
119
- Ok(result)
120
- }
121
-
122
- fn collect_errors_recursively(statements: &[Statement]) -> Vec<ErrorResult> {
123
- let mut errors: Vec<ErrorResult> = Vec::new();
124
-
125
- for stmt in statements {
126
- match &stmt.kind {
127
- StatementKind::Unknown => {
128
- errors.push(ErrorResult {
129
- message: format!("Unknown statement at line {}:{}", stmt.line, stmt.column),
130
- line: stmt.line,
131
- column: stmt.column,
132
- });
133
- }
134
- StatementKind::Error { message } => {
135
- errors.push(ErrorResult {
136
- message: message.clone(),
137
- line: stmt.line,
138
- column: stmt.column,
139
- });
140
- }
141
- StatementKind::Loop => {
142
- if let Some(body_statements) = extract_loop_body_statements(&stmt.value) {
143
- errors.extend(collect_errors_recursively(body_statements));
144
- }
145
- }
146
- _ => {}
147
- }
148
- }
149
-
150
- errors
151
- }
152
-
153
- fn extract_loop_body_statements(value: &Value) -> Option<&[Statement]> {
154
- if let Value::Map(map) = value {
155
- if let Some(Value::Block(statements)) = map.get("body") {
156
- return Some(statements);
157
- }
158
- }
159
- None
160
- }
161
-
162
- fn ast_to_string(statements: Vec<Statement>) -> String {
163
- serde_json::to_string_pretty(&statements).expect("Failed to serialize AST")
164
- }
1
+ pub mod common;
2
+ pub mod config;
3
+ pub mod core;
4
+ pub mod utils;
5
+
6
+ use serde::{Deserialize, Serialize};
7
+ use serde_wasm_bindgen::to_value;
8
+ use wasm_bindgen::prelude::*;
9
+
10
+ use crate::core::{
11
+ audio::{engine::AudioEngine, interpreter::driver::run_audio_program},
12
+ parser::statement::{Statement, StatementKind},
13
+ preprocessor::loader::ModuleLoader,
14
+ shared::value::Value,
15
+ store::{function::FunctionTable, global::GlobalStore, variable::VariableTable},
16
+ utils::path::normalize_path,
17
+ };
18
+
19
+ #[derive(Serialize, Deserialize)]
20
+ struct ParseResult {
21
+ ok: bool,
22
+ ast: String,
23
+ errors: Vec<ErrorResult>,
24
+ }
25
+
26
+ #[derive(Serialize, Deserialize)]
27
+ struct ErrorResult {
28
+ message: String,
29
+ line: usize,
30
+ column: usize,
31
+ }
32
+
33
+ #[wasm_bindgen]
34
+ pub fn parse(entry_path: &str, source: &str) -> Result<JsValue, JsValue> {
35
+ let statements = parse_internal_from_string(entry_path, source);
36
+
37
+ match statements {
38
+ Ok(value) => {
39
+ let ast_string = value;
40
+ to_value(&ast_string)
41
+ .map_err(|e| JsValue::from_str(&format!("Error converting AST to JS value: {}", e)))
42
+ }
43
+ Err(e) => Err(JsValue::from_str(&format!("Error: {}", e))),
44
+ }
45
+ }
46
+
47
+ #[wasm_bindgen]
48
+ pub fn render_audio(user_code: &str) -> Result<js_sys::Float32Array, JsValue> {
49
+ let entry_path = normalize_path("playground.deva");
50
+ let output_path = normalize_path("./temp");
51
+
52
+ let mut global_store = GlobalStore::new();
53
+
54
+ let loader =
55
+ ModuleLoader::from_raw_source(&entry_path, &output_path, user_code, &mut global_store);
56
+
57
+ loader
58
+ .load_wasm_module(&mut global_store)
59
+ .map_err(|e| JsValue::from_str(&format!("Module loading error: {}", e)))?;
60
+
61
+ let all_statements_map = loader.extract_statements_map(&global_store);
62
+
63
+ let main_statements = all_statements_map
64
+ .get(&entry_path)
65
+ .ok_or(JsValue::from_str("❌ No statements found for entry module"))?
66
+ .clone();
67
+
68
+ let mut audio_engine = AudioEngine::new("wasm_output".to_string());
69
+
70
+ let _ = run_audio_program(
71
+ &main_statements,
72
+ &mut audio_engine,
73
+ "playground".to_string(),
74
+ "wasm_output".to_string(),
75
+ VariableTable::new(),
76
+ FunctionTable::new(),
77
+ &mut global_store,
78
+ );
79
+
80
+ let samples = audio_engine.get_normalized_buffer();
81
+
82
+ if samples.is_empty() {
83
+ return Err(JsValue::from_str("❌ Audio buffer is empty"));
84
+ }
85
+
86
+ Ok(js_sys::Float32Array::from(samples.as_slice()))
87
+ }
88
+
89
+ fn parse_internal_from_string(virtual_path: &str, source: &str) -> Result<ParseResult, String> {
90
+ let entry_path = normalize_path(virtual_path);
91
+ let output_path = normalize_path("./temp");
92
+
93
+ let mut global_store = GlobalStore::new();
94
+ let loader =
95
+ ModuleLoader::from_raw_source(&entry_path, &output_path, source, &mut global_store);
96
+
97
+ let module = loader
98
+ .load_single_module(&mut global_store)
99
+ .map_err(|e| format!("Error loading module: {}", e))?;
100
+
101
+ let raw_ast = ast_to_string(module.statements.clone());
102
+
103
+ let found_errors = collect_errors_recursively(&module.statements);
104
+
105
+ let result = ParseResult {
106
+ ok: true,
107
+ ast: raw_ast,
108
+ errors: found_errors,
109
+ };
110
+
111
+ Ok(result)
112
+ }
113
+
114
+ fn collect_errors_recursively(statements: &[Statement]) -> Vec<ErrorResult> {
115
+ let mut errors: Vec<ErrorResult> = Vec::new();
116
+
117
+ for stmt in statements {
118
+ match &stmt.kind {
119
+ StatementKind::Unknown => {
120
+ errors.push(ErrorResult {
121
+ message: format!("Unknown statement at line {}:{}", stmt.line, stmt.column),
122
+ line: stmt.line,
123
+ column: stmt.column,
124
+ });
125
+ }
126
+ StatementKind::Error { message } => {
127
+ errors.push(ErrorResult {
128
+ message: message.clone(),
129
+ line: stmt.line,
130
+ column: stmt.column,
131
+ });
132
+ }
133
+ StatementKind::Loop => {
134
+ if let Some(body_statements) = extract_loop_body_statements(&stmt.value) {
135
+ errors.extend(collect_errors_recursively(body_statements));
136
+ }
137
+ }
138
+ _ => {}
139
+ }
140
+ }
141
+
142
+ errors
143
+ }
144
+
145
+ fn extract_loop_body_statements(value: &Value) -> Option<&[Statement]> {
146
+ if let Value::Map(map) = value {
147
+ if let Some(Value::Block(statements)) = map.get("body") {
148
+ return Some(statements);
149
+ }
150
+ }
151
+ None
152
+ }
153
+
154
+ fn ast_to_string(statements: Vec<Statement>) -> String {
155
+ serde_json::to_string_pretty(&statements).expect("Failed to serialize AST")
156
+ }