@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.
- package/.cargo/config.toml +2 -0
- package/.devalang +6 -1
- package/.github/workflows/ci.yml +103 -0
- package/Cargo.toml +81 -48
- package/README.md +137 -154
- package/docs/CHANGELOG.md +428 -1
- package/docs/CONTRIBUTING.md +101 -0
- package/docs/ROADMAP.md +14 -7
- package/docs/TODO.md +16 -15
- package/examples/automation.deva +42 -0
- package/examples/bank.deva +7 -0
- package/examples/bus.deva +10 -0
- package/examples/duration.deva +9 -0
- package/examples/effect.deva +2 -0
- package/examples/events.deva +12 -0
- package/examples/filter.deva +11 -0
- package/examples/function.deva +15 -0
- package/examples/index.deva +57 -12
- package/examples/lfo.deva +9 -0
- package/examples/loop.deva +5 -12
- package/examples/pattern.deva +8 -0
- package/examples/plugin.deva +16 -0
- package/examples/synth.deva +11 -1
- package/examples/synth_types.deva +17 -0
- package/examples/variables.deva +1 -1
- package/out-tsc/bin/index.d.ts +2 -0
- package/out-tsc/bin/index.js +51 -7
- package/out-tsc/core/functions/index.d.ts +42 -0
- package/out-tsc/core/functions/index.js +87 -0
- package/out-tsc/core/index.d.ts +6 -0
- package/out-tsc/core/index.js +22 -0
- package/out-tsc/core/types/index.d.ts +4 -0
- package/out-tsc/core/types/index.js +20 -0
- package/out-tsc/core/types/plugin.d.ts +18 -0
- package/out-tsc/core/types/plugin.js +2 -0
- package/out-tsc/core/types/result.d.ts +27 -0
- package/out-tsc/core/types/result.js +2 -0
- package/out-tsc/core/types/statement.d.ts +106 -0
- package/out-tsc/core/types/statement.js +2 -0
- package/out-tsc/core/types/value.d.ts +43 -0
- package/out-tsc/core/types/value.js +2 -0
- package/out-tsc/index.d.ts +7 -0
- package/out-tsc/index.js +42 -1
- package/out-tsc/pkg/devalang_core.d.ts +15 -0
- package/out-tsc/pkg/devalang_core.js +65 -0
- package/out-tsc/pkg/devalang_core_bg.wasm.d.ts +34 -0
- package/out-tsc/scripts/copy-wasm-dts.d.ts +1 -0
- package/out-tsc/scripts/copy-wasm-dts.js +73 -0
- package/out-tsc/scripts/postinstall.d.ts +1 -0
- package/out-tsc/scripts/postinstall.js +83 -0
- package/out-tsc/scripts/version/bump.d.ts +1 -0
- package/out-tsc/scripts/version/fetch.d.ts +1 -0
- package/out-tsc/scripts/version/index.d.ts +1 -0
- package/out-tsc/scripts/version/sync.d.ts +1 -0
- package/package.json +28 -7
- package/project-version.json +4 -4
- package/rust/cli/bank/api.rs +122 -0
- package/rust/cli/bank/commands.rs +306 -0
- package/rust/cli/bank/mod.rs +29 -0
- package/rust/cli/build/commands.rs +153 -0
- package/rust/cli/build/mod.rs +2 -0
- package/rust/cli/build/process.rs +165 -0
- package/rust/cli/check/mod.rs +208 -0
- package/rust/cli/discover/commands.rs +253 -0
- package/rust/cli/discover/config.rs +111 -0
- package/rust/cli/discover/fs.rs +19 -0
- package/rust/cli/discover/install.rs +103 -0
- package/rust/cli/discover/metadata.rs +48 -0
- package/rust/cli/discover/mod.rs +5 -0
- package/rust/cli/{init.rs → init/commands.rs} +32 -23
- package/rust/cli/init/mod.rs +1 -0
- package/rust/cli/install/addon.rs +118 -0
- package/rust/cli/install/bank.rs +72 -0
- package/rust/cli/install/commands.rs +35 -0
- package/rust/cli/install/mod.rs +4 -0
- package/rust/cli/install/plugin.rs +80 -0
- package/rust/cli/login/commands.rs +124 -0
- package/rust/cli/login/mod.rs +1 -0
- package/rust/cli/mod.rs +9 -202
- package/rust/cli/parser.rs +359 -0
- package/rust/cli/play/commands.rs +375 -0
- package/rust/cli/play/io.rs +17 -0
- package/rust/cli/play/mod.rs +5 -0
- package/rust/cli/play/process.rs +159 -0
- package/rust/cli/play/realtime.rs +91 -0
- package/rust/cli/play/utils.rs +23 -0
- package/rust/cli/telemetry/commands.rs +22 -0
- package/rust/cli/telemetry/event_creator.rs +80 -0
- package/rust/cli/telemetry/mod.rs +3 -0
- package/rust/cli/telemetry/send.rs +51 -0
- package/rust/cli/{template.rs → template/commands.rs} +17 -5
- package/rust/cli/template/mod.rs +1 -0
- package/rust/cli/update/commands.rs +6 -0
- package/rust/cli/update/mod.rs +1 -0
- package/rust/config/driver.rs +112 -0
- package/rust/config/mod.rs +3 -16
- package/rust/config/ops.rs +26 -0
- package/rust/config/settings.rs +101 -0
- package/rust/core/audio/engine/driver.rs +220 -0
- package/rust/core/audio/engine/export.rs +169 -0
- package/rust/core/audio/engine/helpers.rs +178 -0
- package/rust/core/audio/engine/mod.rs +56 -0
- package/rust/core/audio/engine/notes/dsp.rs +85 -0
- package/rust/core/audio/engine/notes/mod.rs +44 -0
- package/rust/core/audio/engine/notes/params.rs +294 -0
- package/rust/core/audio/engine/sample/insert.rs +199 -0
- package/rust/core/audio/engine/sample/mod.rs +40 -0
- package/rust/core/audio/engine/sample/padding.rs +170 -0
- package/rust/core/audio/evaluator/condition.rs +61 -0
- package/rust/core/audio/evaluator/mod.rs +9 -0
- package/rust/core/audio/evaluator/numeric.rs +152 -0
- package/rust/core/audio/evaluator/rhs.rs +16 -0
- package/rust/core/audio/evaluator/string_expr.rs +94 -0
- package/rust/core/audio/interpreter/driver.rs +574 -216
- package/rust/core/audio/interpreter/mod.rs +2 -12
- package/rust/core/audio/interpreter/statements/arrow_call/interprete.rs +175 -0
- package/rust/core/audio/interpreter/statements/arrow_call/methods/chord.rs +384 -0
- package/rust/core/audio/interpreter/statements/arrow_call/methods/mod.rs +2 -0
- package/rust/core/audio/interpreter/statements/arrow_call/methods/note.rs +316 -0
- package/rust/core/audio/interpreter/statements/arrow_call/mod.rs +3 -0
- package/rust/core/audio/interpreter/statements/arrow_call/types/arp.rs +192 -0
- package/rust/core/audio/interpreter/statements/arrow_call/types/mod.rs +24 -0
- package/rust/core/audio/interpreter/statements/arrow_call/types/pad.rs +116 -0
- package/rust/core/audio/interpreter/statements/arrow_call/types/pluck.rs +97 -0
- package/rust/core/audio/interpreter/statements/arrow_call/types/sub.rs +100 -0
- package/rust/core/audio/interpreter/statements/automate.rs +16 -0
- package/rust/core/audio/interpreter/statements/call.rs +295 -0
- package/rust/core/audio/interpreter/{condition.rs → statements/condition.rs} +72 -69
- package/rust/core/audio/interpreter/statements/function.rs +24 -0
- package/rust/core/audio/interpreter/statements/let_.rs +36 -0
- package/rust/core/audio/interpreter/statements/load.rs +17 -0
- package/rust/core/audio/interpreter/statements/loop_.rs +115 -0
- package/rust/core/audio/interpreter/statements/mod.rs +12 -0
- package/rust/core/audio/interpreter/statements/sleep.rs +28 -0
- package/rust/core/audio/interpreter/statements/spawn.rs +253 -0
- package/rust/core/audio/interpreter/statements/tempo.rs +40 -0
- package/rust/core/audio/interpreter/statements/trigger.rs +239 -0
- package/rust/core/audio/loader/mod.rs +1 -1
- package/rust/core/audio/loader/trigger.rs +98 -52
- package/rust/core/audio/mod.rs +2 -2
- package/rust/core/audio/player.rs +28 -12
- package/rust/core/audio/special/easing.rs +189 -0
- package/rust/core/audio/special/env.rs +45 -0
- package/rust/core/audio/special/math.rs +134 -0
- package/rust/core/audio/special/mod.rs +9 -0
- package/rust/core/audio/special/modulator.rs +143 -0
- package/rust/core/builder/mod.rs +129 -80
- package/rust/core/debugger/lexer.rs +4 -4
- package/rust/core/debugger/logs.rs +52 -0
- package/rust/core/debugger/mod.rs +11 -2
- package/rust/core/debugger/preprocessor.rs +4 -4
- package/rust/core/debugger/store.rs +38 -25
- package/rust/core/error/mod.rs +221 -12
- package/rust/core/lexer/driver.rs +59 -0
- package/rust/core/lexer/handler/arrow.rs +62 -11
- package/rust/core/lexer/handler/at.rs +5 -5
- package/rust/core/lexer/handler/brace.rs +11 -11
- package/rust/core/lexer/handler/colon.rs +5 -5
- package/rust/core/lexer/handler/comment.rs +3 -3
- package/rust/core/lexer/handler/dot.rs +6 -6
- package/rust/core/lexer/handler/driver.rs +143 -32
- package/rust/core/lexer/handler/identifier.rs +11 -5
- package/rust/core/lexer/handler/indent.rs +18 -4
- package/rust/core/lexer/handler/mod.rs +6 -5
- package/rust/core/lexer/handler/newline.rs +3 -3
- package/rust/core/lexer/handler/number.rs +5 -5
- package/rust/core/lexer/handler/operator.rs +5 -3
- package/rust/core/lexer/handler/parenthesis.rs +41 -0
- package/rust/core/lexer/handler/slash.rs +21 -0
- package/rust/core/lexer/handler/string.rs +3 -3
- package/rust/core/lexer/mod.rs +1 -49
- package/rust/core/lexer/token.rs +17 -12
- package/rust/core/mod.rs +9 -10
- package/rust/core/parser/driver/block.rs +111 -0
- package/rust/core/parser/driver/cursor.rs +82 -0
- package/rust/core/parser/driver/driver_impl.rs +139 -0
- package/rust/core/parser/driver/mod.rs +6 -0
- package/rust/core/parser/driver/parse_array.rs +120 -0
- package/rust/core/parser/driver/parse_map.rs +223 -0
- package/rust/core/parser/driver/parser.rs +160 -0
- package/rust/core/parser/handler/arrow_call.rs +277 -126
- package/rust/core/parser/handler/at.rs +142 -25
- package/rust/core/parser/handler/bank.rs +83 -20
- package/rust/core/parser/handler/condition.rs +14 -5
- package/rust/core/parser/handler/dot.rs +111 -75
- package/rust/core/parser/handler/identifier/automate.rs +254 -0
- package/rust/core/parser/handler/identifier/call.rs +74 -24
- package/rust/core/parser/handler/identifier/emit.rs +70 -0
- package/rust/core/parser/handler/identifier/function.rs +113 -0
- package/rust/core/parser/handler/identifier/group.rs +28 -14
- package/rust/core/parser/handler/identifier/let_.rs +61 -21
- package/rust/core/parser/handler/identifier/mod.rs +24 -20
- package/rust/core/parser/handler/identifier/on.rs +107 -0
- package/rust/core/parser/handler/identifier/print.rs +49 -0
- package/rust/core/parser/handler/identifier/sleep.rs +77 -14
- package/rust/core/parser/handler/identifier/spawn.rs +81 -31
- package/rust/core/parser/handler/identifier/synth.rs +102 -32
- package/rust/core/parser/handler/loop_.rs +144 -22
- package/rust/core/parser/handler/mod.rs +6 -5
- package/rust/core/parser/handler/pattern.rs +74 -0
- package/rust/core/parser/handler/tempo.rs +67 -9
- package/rust/core/parser/mod.rs +3 -4
- package/rust/core/parser/statement.rs +6 -92
- package/rust/core/plugin/loader.rs +137 -0
- package/rust/core/plugin/mod.rs +2 -0
- package/rust/core/plugin/runner/mod.rs +11 -0
- package/rust/core/plugin/runner/non_wasm.rs +297 -0
- package/rust/core/plugin/runner/wasm32.rs +43 -0
- package/rust/core/preprocessor/loader/inject.rs +278 -0
- package/rust/core/preprocessor/loader/loader_helpers.rs +110 -0
- package/rust/core/preprocessor/loader/mod.rs +235 -0
- package/rust/core/preprocessor/mod.rs +4 -4
- package/rust/core/preprocessor/module.rs +55 -50
- package/rust/core/preprocessor/processor/handlers.rs +107 -0
- package/rust/core/preprocessor/processor/mod.rs +1 -0
- package/rust/core/preprocessor/resolver/bank.rs +14 -12
- package/rust/core/preprocessor/resolver/call.rs +106 -105
- package/rust/core/preprocessor/resolver/condition.rs +13 -10
- package/rust/core/preprocessor/resolver/driver.rs +145 -48
- package/rust/core/preprocessor/resolver/function.rs +69 -0
- package/rust/core/preprocessor/resolver/group.rs +122 -61
- package/rust/core/preprocessor/resolver/let_.rs +13 -12
- package/rust/core/preprocessor/resolver/loop_.rs +240 -13
- package/rust/core/preprocessor/resolver/mod.rs +8 -6
- package/rust/core/preprocessor/resolver/pattern.rs +83 -0
- package/rust/core/preprocessor/resolver/spawn.rs +83 -42
- package/rust/core/preprocessor/resolver/synth.rs +15 -11
- package/rust/core/preprocessor/resolver/tempo.rs +13 -14
- package/rust/core/preprocessor/resolver/trigger.rs +32 -28
- package/rust/core/preprocessor/resolver/value.rs +111 -13
- package/rust/core/store/global.rs +57 -39
- package/rust/core/store/mod.rs +0 -3
- package/rust/lib.rs +323 -117
- package/rust/main.rs +388 -65
- package/rust/types/Cargo.toml +11 -0
- package/rust/types/src/addons.rs +55 -0
- package/rust/types/src/ast.rs +202 -0
- package/rust/types/src/config.rs +84 -0
- package/rust/types/src/lib.rs +15 -0
- package/rust/types/src/plugin.rs +20 -0
- package/rust/types/src/store.rs +139 -0
- package/rust/types/src/telemetry.rs +85 -0
- package/rust/utils/Cargo.toml +26 -0
- package/rust/utils/src/error.rs +186 -0
- package/rust/utils/src/file.rs +94 -0
- package/rust/utils/src/first_usage.rs +97 -0
- package/rust/utils/{mod.rs → src/lib.rs} +6 -3
- package/rust/utils/{logger.rs → src/logger.rs} +94 -17
- package/rust/utils/src/path.rs +129 -0
- package/rust/utils/src/signature.rs +41 -0
- package/rust/utils/{spinner.rs → src/spinner.rs} +7 -8
- package/rust/utils/src/version.rs +27 -0
- package/rust/utils/{watcher.rs → src/watcher.rs} +17 -4
- package/rust/web/api.rs +5 -0
- package/rust/web/cdn.rs +34 -0
- package/rust/web/mod.rs +3 -0
- package/rust/web/sso.rs +5 -0
- package/templates/minimal/README.md +143 -127
- package/templates/welcome/README.md +143 -127
- package/templates/welcome/src/index.deva +56 -8
- package/templates/welcome/src/variables.deva +2 -4
- package/tests/integration.rs +21 -0
- package/tests/rust/cli_check_build.rs +21 -0
- package/tests/rust/cli_help.rs +12 -0
- package/tests/rust/cli_template_list.rs +10 -0
- package/tests/rust/cli_version.rs +11 -0
- package/tests/typescript/index.spec.ts +136 -0
- package/tests/typescript/playhead.spec.ts +36 -0
- package/tests/typescript/render_e2e.spec.ts +77 -0
- package/tsconfig.json +12 -10
- package/typescript/bin/index.ts +19 -5
- package/typescript/core/functions/index.ts +94 -0
- package/typescript/core/index.ts +6 -0
- package/typescript/core/types/index.ts +4 -0
- package/typescript/core/types/plugin.ts +19 -0
- package/typescript/core/types/result.ts +29 -0
- package/typescript/core/types/statement.ts +47 -0
- package/typescript/core/types/value.ts +29 -0
- package/typescript/index.ts +8 -1
- package/typescript/pkg/devalang_core.d.ts +4 -0
- package/typescript/pkg/devalang_core.ts +65 -0
- package/typescript/scripts/copy-wasm-dts.ts +41 -0
- package/typescript/scripts/postinstall.ts +85 -0
- package/typescript/scripts/version/bump.ts +0 -1
- package/typescript/scripts/version/index.ts +0 -1
- package/docs/COMMANDS.md +0 -85
- package/docs/CONFIG.md +0 -30
- package/docs/SYNTAX.md +0 -210
- package/out-tsc/bin/devalang.exe +0 -0
- package/out-tsc/scripts/postbuild.js +0 -11
- package/rust/cli/build.rs +0 -137
- package/rust/cli/check.rs +0 -117
- package/rust/cli/play.rs +0 -193
- package/rust/config/loader.rs +0 -13
- package/rust/core/audio/engine.rs +0 -203
- package/rust/core/audio/evaluator.rs +0 -31
- package/rust/core/audio/interpreter/arrow_call.rs +0 -129
- package/rust/core/audio/interpreter/call.rs +0 -64
- package/rust/core/audio/interpreter/let_.rs +0 -19
- package/rust/core/audio/interpreter/load.rs +0 -18
- package/rust/core/audio/interpreter/loop_.rs +0 -67
- package/rust/core/audio/interpreter/sleep.rs +0 -36
- package/rust/core/audio/interpreter/spawn.rs +0 -66
- package/rust/core/audio/interpreter/tempo.rs +0 -16
- package/rust/core/audio/interpreter/trigger.rs +0 -69
- package/rust/core/audio/renderer.rs +0 -54
- package/rust/core/parser/driver.rs +0 -331
- package/rust/core/preprocessor/loader.rs +0 -193
- package/rust/core/preprocessor/processor.rs +0 -76
- package/rust/core/shared/duration.rs +0 -8
- package/rust/core/shared/mod.rs +0 -2
- package/rust/core/shared/value.rs +0 -18
- package/rust/core/store/export.rs +0 -28
- package/rust/core/store/import.rs +0 -28
- package/rust/core/store/variable.rs +0 -28
- package/rust/core/utils/mod.rs +0 -2
- package/rust/core/utils/path.rs +0 -31
- package/rust/core/utils/validation.rs +0 -37
- package/rust/utils/file.rs +0 -35
- package/rust/utils/signature.rs +0 -17
- package/rust/utils/version.rs +0 -15
- 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
|
|
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
|
|
6
|
+
pub mod install;
|
|
7
|
+
pub mod login;
|
|
8
|
+
pub mod parser;
|
|
5
9
|
pub mod play;
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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;
|