@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
@@ -0,0 +1,80 @@
1
+ use crate::{
2
+ config::ops::load_config,
3
+ web::cdn::{download_from_cdn, get_cdn_url},
4
+ };
5
+ use devalang_core::config::driver::ProjectConfigExt;
6
+ use devalang_types::ProjectConfigPluginEntry;
7
+ use devalang_utils::path as path_utils;
8
+ use std::{fs, path::Path};
9
+
10
+ pub async fn install_plugin(name: &str, target_dir: &Path) -> Result<(), String> {
11
+ let cdn_url = get_cdn_url();
12
+ let url = format!("{}/plugin/{}/download", cdn_url, name);
13
+
14
+ let plugin_dir = target_dir.join("plugins");
15
+
16
+ // Ensure .deva/tmp exists and build archive path
17
+ let deva_dir = path_utils::ensure_deva_dir()?;
18
+ let tmp_dir = deva_dir.join("tmp");
19
+ if !tmp_dir.exists() {
20
+ fs::create_dir_all(&tmp_dir)
21
+ .map_err(|e| format!("Failed to create tmp dir '{}': {}", tmp_dir.display(), e))?;
22
+ }
23
+
24
+ let archive_path = tmp_dir.join(format!("{}.devaplugin", name));
25
+ let extract_path = plugin_dir.join(name);
26
+
27
+ if extract_path.exists() {
28
+ println!(
29
+ "Plugin '{}' already exists at '{}'. Skipping install.",
30
+ name,
31
+ extract_path.display()
32
+ );
33
+ return Ok(());
34
+ }
35
+
36
+ download_from_cdn(&url, &archive_path)
37
+ .await
38
+ .map_err(|e| format!("Failed to download: {}", e))?;
39
+
40
+ // Add the plugin to the config: locate project root from target_dir
41
+ let project_root = path_utils::find_project_root_from(target_dir)
42
+ .ok_or_else(|| "Failed to determine project root from target_dir".to_string())?;
43
+
44
+ let config_path = project_root.join(path_utils::DEVALANG_CONFIG);
45
+ if !config_path.exists() {
46
+ return Err(format!(
47
+ "Config file not found at '{}'. Please run 'devalang init' before adding an addon",
48
+ config_path.display()
49
+ ));
50
+ }
51
+
52
+ let mut config = load_config(Some(&config_path))
53
+ .ok_or_else(|| format!("Failed to load config from '{}'", config_path.display()))?;
54
+
55
+ let dependency_path = format!("devalang://plugin/{}", name);
56
+
57
+ devalang_utils::file::extract_zip_safely(&archive_path, &extract_path)
58
+ .map_err(|e| format!("Failed to extract: {}", e))?;
59
+
60
+ // Add the plugin to the config if not already present
61
+ if config.plugins.is_none() {
62
+ config.plugins = Some(Vec::new());
63
+ }
64
+
65
+ if let Some(plugins) = config.plugins.as_mut() {
66
+ let exists = plugins.iter().any(|p| p.path == dependency_path);
67
+ if !exists {
68
+ plugins.push(ProjectConfigPluginEntry {
69
+ path: dependency_path.clone(),
70
+ version: None,
71
+ });
72
+
73
+ if let Err(e) = config.write_config(&config) {
74
+ eprintln!("Warning: failed to write config: {}", e);
75
+ }
76
+ }
77
+ }
78
+
79
+ Ok(())
80
+ }
@@ -0,0 +1,124 @@
1
+ use crate::config::settings::set_user_config_value;
2
+ use crate::web::sso::get_sso_url;
3
+ use std::str::FromStr;
4
+ use tiny_http::Header;
5
+ use tiny_http::{Response, Server};
6
+ use webbrowser;
7
+
8
+ /// Handle the login command
9
+ /// This function initiates the login process by opening the browser and waiting for the callback.
10
+ #[cfg(feature = "cli")]
11
+ pub async fn handle_login_command() -> Result<(), String> {
12
+ use devalang_utils::logger::LogLevel;
13
+ use devalang_utils::logger::Logger;
14
+ use devalang_utils::spinner::start_spinner;
15
+
16
+ let logger = Logger::new();
17
+
18
+ let mut listener_port = 7878;
19
+
20
+ let test_port_already_in_use = format!("127.0.0.1:{}", listener_port);
21
+ while std::net::TcpListener::bind(&test_port_already_in_use).is_err() {
22
+ listener_port += 1;
23
+ }
24
+
25
+ let redirect_uri = format!("http://127.0.0.1:{}/callback", listener_port);
26
+ let login_url = format!(
27
+ "{}/?response_type=code&referer=cli&redirect_uri={}",
28
+ get_sso_url(),
29
+ redirect_uri
30
+ );
31
+
32
+ if webbrowser::open(&login_url).is_ok() {
33
+ logger.log_message(LogLevel::Info, "Opening browser for login...");
34
+ logger.log_message(
35
+ LogLevel::Info,
36
+ &format!(
37
+ "If the browser does not open, please visit the following URL: {}",
38
+ login_url
39
+ ),
40
+ );
41
+ } else {
42
+ logger.log_message(
43
+ LogLevel::Info,
44
+ "Please open the following URL in your browser to login:",
45
+ );
46
+ logger.log_message(LogLevel::Info, &login_url);
47
+ }
48
+
49
+ let server = Server::http(format!("127.0.0.1:{}", listener_port)).unwrap();
50
+
51
+ let spinner = start_spinner("Waiting for authentication...");
52
+
53
+ for request in server.incoming_requests() {
54
+ let query = request.url().to_string();
55
+ if request.url().starts_with("/callback") {
56
+ if query.contains("session=") || query.contains("error=") {
57
+ let token = query.split("session=").nth(1).unwrap_or("").to_string();
58
+
59
+ if !token.is_empty() {
60
+ let response_html = r#"
61
+ <html>
62
+ <body>
63
+ <h1>Authentication Successful</h1>
64
+ <h2>You can now close this window.</h2>
65
+ </body>
66
+ </html>
67
+ "#;
68
+
69
+ let response = Response::from_string(response_html)
70
+ .with_status_code(200)
71
+ .with_header(Header::from_str("Content-Type: text/html").unwrap());
72
+
73
+ request.respond(response).unwrap();
74
+
75
+ save_token(&token);
76
+
77
+ spinner.finish_and_clear();
78
+
79
+ logger.log_message(
80
+ LogLevel::Success,
81
+ "Authentication successful. Token saved to ~/.devalang/config.json",
82
+ );
83
+
84
+ break;
85
+ } else {
86
+ spinner.finish_and_clear();
87
+ logger.log_message(LogLevel::Error, "Invalid session token.");
88
+ request
89
+ .respond(Response::from_string("Invalid session token."))
90
+ .unwrap();
91
+
92
+ break;
93
+ }
94
+ } else {
95
+ println!("Invalid callback: {}", request.url());
96
+
97
+ spinner.finish_and_clear();
98
+ logger.log_message(LogLevel::Error, "Invalid callback.");
99
+ request
100
+ .respond(Response::from_string("Invalid callback."))
101
+ .unwrap();
102
+
103
+ break;
104
+ }
105
+ } else if request.url().starts_with("/favicon.ico") {
106
+ // Ignore favicon requests
107
+ } else {
108
+ spinner.finish_and_clear();
109
+ logger.log_message(LogLevel::Error, "Invalid request.");
110
+ request
111
+ .respond(Response::from_string("Invalid request."))
112
+ .unwrap();
113
+
114
+ break;
115
+ }
116
+ }
117
+
118
+ Ok(())
119
+ }
120
+
121
+ /// Save the session token to a file in the user's home directory
122
+ fn save_token(token: &str) {
123
+ set_user_config_value("session", serde_json::Value::String(token.to_string()));
124
+ }
@@ -0,0 +1 @@
1
+ pub mod commands;
package/rust/cli/mod.rs CHANGED
@@ -1,205 +1,12 @@
1
- pub mod check;
1
+ pub mod bank;
2
2
  pub mod build;
3
+ pub mod check;
4
+ pub mod discover;
3
5
  pub mod init;
4
- pub mod template;
6
+ pub mod install;
7
+ pub mod login;
8
+ pub mod parser;
5
9
  pub mod play;
6
-
7
- use clap::{ Parser, Subcommand };
8
- use crate::utils::version::get_version;
9
-
10
- #[derive(Parser)]
11
- #[command(name = "devalang")]
12
- #[command(author = "Devaloop")]
13
- #[command(version = get_version())]
14
- #[command(about = "🦊 Devalang – A programming language for music and sound.")]
15
- pub struct Cli {
16
- #[arg(long, global = true)]
17
- /// Skips loading the configuration file.
18
- pub no_config: bool,
19
-
20
- #[command(subcommand)]
21
- pub command: Commands,
22
- }
23
-
24
- #[derive(Subcommand)]
25
- pub enum TemplateCommand {
26
- /// Lists all available templates for Devalang projects.
27
- List,
28
- /// Displays information about a specific template.
29
- Info {
30
- name: String,
31
- },
32
- }
33
-
34
- #[derive(Subcommand)]
35
- pub enum Commands {
36
- /// Create a new Devalang project.
37
- ///
38
- /// ### Arguments
39
- /// - `name` - The name of the project to create.
40
- /// - `template` - The template to use for the project. Defaults to "default".
41
- ///
42
- /// ### Example
43
- /// ```bash
44
- /// devalang init --name my_project --template default
45
- ///
46
- Init {
47
- #[arg(short, long)]
48
- /// The optional name (directory) of the project to create.
49
- name: Option<String>,
50
-
51
- #[arg(short, long)]
52
- /// The template to use for the project.
53
- ///
54
- /// ### Default value
55
- /// - `default`
56
- ///
57
- template: Option<String>,
58
- },
59
-
60
- Template {
61
- #[command(subcommand)]
62
- /// The template command to execute.
63
- command: TemplateCommand,
64
- },
65
-
66
- /// Build the program and generate output files.
67
- ///
68
- /// ### Arguments
69
- /// - `entry` - The entry point of the program to build. Defaults to "./src".
70
- /// - `output` - The directory where the output files will be generated. Defaults to "./output".
71
- /// - `watch` - Whether to watch for changes and rebuild. Defaults to "true".
72
- ///
73
- /// ### Example
74
- /// ```bash
75
- /// devalang build --entry ./src --output ./output --watch true
76
- /// ```
77
- ///
78
- Build {
79
- #[arg(short, long)]
80
- /// The entry point of the program to build.
81
- ///
82
- entry: Option<String>,
83
-
84
- #[arg(short, long)]
85
- /// The directory where the output files will be generated.
86
- ///
87
- output: Option<String>,
88
-
89
- #[arg(long, default_value_t = false)]
90
- /// Whether to watch for changes and rebuild.
91
- ///
92
- /// ### Default value
93
- /// - `false`
94
- ///
95
- watch: bool,
96
-
97
- #[arg(long, default_value = "real-time")]
98
- /// The mode of compilation.
99
- ///
100
- /// ### Default value
101
- /// - `real-time`
102
- ///
103
- /// ### Possible values
104
- /// - `real-time` - Compiles files as soon as possible.
105
- /// - `batch` - Compiles files one by one.
106
- /// - `check` - Analyzes the code without compiling it.
107
- ///
108
- compilation_mode: String,
109
-
110
- #[arg(short, long, default_value_t = false)]
111
- /// Whether to print debug information.
112
- ///
113
- /// ### Default value
114
- /// - `false`
115
- ///
116
- debug: bool,
117
-
118
- #[arg(short, long, default_value_t = false)]
119
- /// Whether to compress the output files.
120
- ///
121
- /// ### Default value
122
- /// - `false`
123
- ///
124
- compress: bool,
125
- },
126
-
127
- /// Analyze the program for errors and warnings.
128
- ///
129
- /// ### Arguments
130
- /// - `entry` - The entry point of the program to analyze. Defaults to "./src".
131
- /// - `watch` - Whether to watch for changes and re-analyze. Defaults to "true".
132
- ///
133
- /// ### Example
134
- /// ```bash
135
- /// devalang check --entry ./src --watch true --compilation-mode real-time
136
- /// ```
137
- Check {
138
- #[arg(short, long)]
139
- /// The entry point of the program to analyze.
140
- ///
141
- entry: Option<String>,
142
-
143
- #[arg(short, long)]
144
- /// The directory where the output files will be generated.
145
- ///
146
- output: Option<String>,
147
-
148
- #[arg(long, default_value_t = false)]
149
- /// Whether to watch for changes and re-analyze.
150
- ///
151
- /// ### Default value
152
- /// - `false`
153
- ///
154
- watch: bool,
155
-
156
- #[arg(short, long, default_value = "real-time")]
157
- /// The mode of compilation.
158
- ///
159
- /// ### Default value
160
- /// - `real-time`
161
- ///
162
- /// ### Possible values
163
- /// - `real-time` - Analyzes files as soon as possible.
164
- /// - `batch` - Analyzes files one by one.
165
- /// - `check` - Analyzes the code without compiling it.
166
- ///
167
- compilation_mode: String,
168
-
169
- #[arg(short, long, default_value_t = false)]
170
- /// Whether to print debug information.
171
- ///
172
- /// ### Default value
173
- /// - `false`
174
- ///
175
- debug: bool,
176
- },
177
-
178
- Play {
179
- #[arg(short, long)]
180
- /// The entry point of the program to play.
181
- ///
182
- entry: Option<String>,
183
-
184
- #[arg(short, long)]
185
- /// The directory where the output files will be generated.
186
- ///
187
- output: Option<String>,
188
-
189
- #[arg(long, default_value_t = false)]
190
- /// Whether to watch for changes and re-play.
191
- ///
192
- /// ### Default value
193
- /// - `false`
194
- ///
195
- watch: bool,
196
-
197
- #[arg(long, default_value_t = false)]
198
- /// Whether to replay the program after it finishes.
199
- ///
200
- /// ### Default value
201
- /// - `false`
202
- ///
203
- repeat: bool,
204
- },
205
- }
10
+ pub mod telemetry;
11
+ pub mod template;
12
+ pub mod update;