@devaloop/devalang 0.0.1-beta.3 → 0.1.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 (346) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +251 -221
  3. package/out-tsc/api.d.ts +180 -0
  4. package/out-tsc/api.d.ts.map +1 -0
  5. package/out-tsc/api.js +286 -0
  6. package/out-tsc/api.js.map +1 -0
  7. package/out-tsc/bin/index.d.ts +12 -0
  8. package/out-tsc/bin/index.d.ts.map +1 -0
  9. package/out-tsc/bin/index.js +20 -54
  10. package/out-tsc/bin/index.js.map +1 -0
  11. package/out-tsc/examples/basic-usage.d.ts +8 -0
  12. package/out-tsc/examples/basic-usage.d.ts.map +1 -0
  13. package/out-tsc/examples/basic-usage.js +113 -0
  14. package/out-tsc/examples/basic-usage.js.map +1 -0
  15. package/out-tsc/index.d.ts +19 -5
  16. package/out-tsc/index.d.ts.map +1 -0
  17. package/out-tsc/index.js +24 -6
  18. package/out-tsc/index.js.map +1 -0
  19. package/out-tsc/scripts/copy-wasm-dts.d.ts +7 -0
  20. package/out-tsc/scripts/copy-wasm-dts.d.ts.map +1 -0
  21. package/out-tsc/scripts/copy-wasm-dts.js +36 -32
  22. package/out-tsc/scripts/copy-wasm-dts.js.map +1 -0
  23. package/out-tsc/scripts/postinstall.d.ts +1 -0
  24. package/out-tsc/scripts/postinstall.d.ts.map +1 -0
  25. package/out-tsc/scripts/postinstall.js +4 -1
  26. package/out-tsc/scripts/postinstall.js.map +1 -0
  27. package/out-tsc/scripts/version/bump.d.ts +5 -1
  28. package/out-tsc/scripts/version/bump.d.ts.map +1 -0
  29. package/out-tsc/scripts/version/bump.js +122 -44
  30. package/out-tsc/scripts/version/bump.js.map +1 -0
  31. package/out-tsc/scripts/version/fetch.d.ts +12 -1
  32. package/out-tsc/scripts/version/fetch.d.ts.map +1 -0
  33. package/out-tsc/scripts/version/fetch.js +68 -24
  34. package/out-tsc/scripts/version/fetch.js.map +1 -0
  35. package/out-tsc/scripts/version/index.d.ts +6 -0
  36. package/out-tsc/scripts/version/index.d.ts.map +1 -0
  37. package/out-tsc/scripts/version/index.js +44 -22
  38. package/out-tsc/scripts/version/index.js.map +1 -0
  39. package/out-tsc/scripts/version/sync.d.ts +5 -1
  40. package/out-tsc/scripts/version/sync.d.ts.map +1 -0
  41. package/out-tsc/scripts/version/sync.js +95 -29
  42. package/out-tsc/scripts/version/sync.js.map +1 -0
  43. package/out-tsc/types.d.ts +68 -0
  44. package/out-tsc/types.d.ts.map +1 -0
  45. package/out-tsc/{core/types/value.js → types.js} +4 -0
  46. package/out-tsc/types.js.map +1 -0
  47. package/out-tsc/wasm.d.ts +8 -0
  48. package/out-tsc/wasm.d.ts.map +1 -0
  49. package/out-tsc/{core/index.js → wasm.js} +9 -6
  50. package/out-tsc/wasm.js.map +1 -0
  51. package/package.json +42 -42
  52. package/.cargo/config.toml +0 -2
  53. package/.devalang +0 -9
  54. package/.github/workflows/ci.yml +0 -103
  55. package/Cargo.toml +0 -84
  56. package/docs/CHANGELOG.md +0 -622
  57. package/docs/CONTRIBUTING.md +0 -101
  58. package/docs/ROADMAP.md +0 -38
  59. package/docs/TODO.md +0 -71
  60. package/examples/automation.deva +0 -42
  61. package/examples/bank.deva +0 -7
  62. package/examples/bus.deva +0 -10
  63. package/examples/chain.deva +0 -19
  64. package/examples/condition.deva +0 -20
  65. package/examples/duration.deva +0 -9
  66. package/examples/effect.deva +0 -2
  67. package/examples/events.deva +0 -12
  68. package/examples/filter.deva +0 -11
  69. package/examples/function.deva +0 -15
  70. package/examples/group.deva +0 -12
  71. package/examples/index.deva +0 -63
  72. package/examples/lfo.deva +0 -9
  73. package/examples/loop.deva +0 -10
  74. package/examples/pattern.deva +0 -8
  75. package/examples/plugin.deva +0 -16
  76. package/examples/routing.deva +0 -23
  77. package/examples/samples/hat-808.wav +0 -0
  78. package/examples/samples/kick-808.wav +0 -0
  79. package/examples/synth.deva +0 -24
  80. package/examples/synth_types.deva +0 -17
  81. package/examples/variables.deva +0 -9
  82. package/out-tsc/bin/project-version.json +0 -6
  83. package/out-tsc/core/functions/index.d.ts +0 -42
  84. package/out-tsc/core/functions/index.js +0 -87
  85. package/out-tsc/core/index.d.ts +0 -6
  86. package/out-tsc/core/types/index.d.ts +0 -4
  87. package/out-tsc/core/types/index.js +0 -20
  88. package/out-tsc/core/types/plugin.d.ts +0 -18
  89. package/out-tsc/core/types/plugin.js +0 -2
  90. package/out-tsc/core/types/result.d.ts +0 -27
  91. package/out-tsc/core/types/result.js +0 -2
  92. package/out-tsc/core/types/statement.d.ts +0 -106
  93. package/out-tsc/core/types/statement.js +0 -2
  94. package/out-tsc/core/types/value.d.ts +0 -43
  95. package/out-tsc/pkg/devalang_core.d.ts +0 -15
  96. package/out-tsc/pkg/devalang_core.js +0 -65
  97. package/out-tsc/pkg/devalang_core_bg.wasm.d.ts +0 -34
  98. package/out-tsc/scripts/version/copy-to-binary.d.ts +0 -1
  99. package/out-tsc/scripts/version/copy-to-binary.js +0 -79
  100. package/project-version.json +0 -6
  101. package/rust/bindings/Cargo.toml +0 -9
  102. package/rust/bindings/src/lib.rs +0 -86
  103. package/rust/cli/addon/commands.rs +0 -35
  104. package/rust/cli/addon/download.rs +0 -234
  105. package/rust/cli/addon/install.rs +0 -33
  106. package/rust/cli/addon/list.rs +0 -224
  107. package/rust/cli/addon/metadata.rs +0 -124
  108. package/rust/cli/addon/mod.rs +0 -8
  109. package/rust/cli/addon/remove.rs +0 -271
  110. package/rust/cli/addon/update.rs +0 -305
  111. package/rust/cli/addon/utils.rs +0 -109
  112. package/rust/cli/build/commands.rs +0 -153
  113. package/rust/cli/build/mod.rs +0 -2
  114. package/rust/cli/build/process.rs +0 -165
  115. package/rust/cli/check/mod.rs +0 -208
  116. package/rust/cli/discover/commands.rs +0 -275
  117. package/rust/cli/discover/config.rs +0 -109
  118. package/rust/cli/discover/fs.rs +0 -19
  119. package/rust/cli/discover/install.rs +0 -214
  120. package/rust/cli/discover/metadata.rs +0 -48
  121. package/rust/cli/discover/mod.rs +0 -5
  122. package/rust/cli/init/commands.rs +0 -88
  123. package/rust/cli/init/mod.rs +0 -1
  124. package/rust/cli/login/commands.rs +0 -124
  125. package/rust/cli/login/mod.rs +0 -1
  126. package/rust/cli/me/commands.rs +0 -52
  127. package/rust/cli/me/mod.rs +0 -1
  128. package/rust/cli/mod.rs +0 -12
  129. package/rust/cli/parser.rs +0 -320
  130. package/rust/cli/play/commands.rs +0 -375
  131. package/rust/cli/play/io.rs +0 -17
  132. package/rust/cli/play/mod.rs +0 -5
  133. package/rust/cli/play/process.rs +0 -159
  134. package/rust/cli/play/realtime.rs +0 -91
  135. package/rust/cli/play/utils.rs +0 -23
  136. package/rust/cli/telemetry/commands.rs +0 -22
  137. package/rust/cli/telemetry/event_creator.rs +0 -80
  138. package/rust/cli/telemetry/mod.rs +0 -3
  139. package/rust/cli/telemetry/send.rs +0 -51
  140. package/rust/cli/template/commands.rs +0 -69
  141. package/rust/cli/template/mod.rs +0 -1
  142. package/rust/cli/update/commands.rs +0 -6
  143. package/rust/cli/update/mod.rs +0 -1
  144. package/rust/config/driver.rs +0 -112
  145. package/rust/config/mod.rs +0 -3
  146. package/rust/config/ops.rs +0 -26
  147. package/rust/config/settings.rs +0 -101
  148. package/rust/core/audio/engine/driver.rs +0 -237
  149. package/rust/core/audio/engine/export.rs +0 -169
  150. package/rust/core/audio/engine/helpers.rs +0 -178
  151. package/rust/core/audio/engine/mod.rs +0 -56
  152. package/rust/core/audio/engine/notes/dsp.rs +0 -88
  153. package/rust/core/audio/engine/notes/mod.rs +0 -53
  154. package/rust/core/audio/engine/notes/params.rs +0 -294
  155. package/rust/core/audio/engine/sample/insert.rs +0 -300
  156. package/rust/core/audio/engine/sample/mod.rs +0 -40
  157. package/rust/core/audio/engine/sample/padding.rs +0 -170
  158. package/rust/core/audio/evaluator/condition.rs +0 -61
  159. package/rust/core/audio/evaluator/mod.rs +0 -9
  160. package/rust/core/audio/evaluator/numeric.rs +0 -152
  161. package/rust/core/audio/evaluator/rhs.rs +0 -16
  162. package/rust/core/audio/evaluator/string_expr.rs +0 -94
  163. package/rust/core/audio/interpreter/driver.rs +0 -574
  164. package/rust/core/audio/interpreter/mod.rs +0 -2
  165. package/rust/core/audio/interpreter/statements/arrow_call/interprete.rs +0 -179
  166. package/rust/core/audio/interpreter/statements/arrow_call/methods/chord.rs +0 -398
  167. package/rust/core/audio/interpreter/statements/arrow_call/methods/effects.rs +0 -323
  168. package/rust/core/audio/interpreter/statements/arrow_call/methods/mod.rs +0 -3
  169. package/rust/core/audio/interpreter/statements/arrow_call/methods/note.rs +0 -371
  170. package/rust/core/audio/interpreter/statements/arrow_call/mod.rs +0 -3
  171. package/rust/core/audio/interpreter/statements/arrow_call/types/arp.rs +0 -192
  172. package/rust/core/audio/interpreter/statements/arrow_call/types/mod.rs +0 -24
  173. package/rust/core/audio/interpreter/statements/arrow_call/types/pad.rs +0 -116
  174. package/rust/core/audio/interpreter/statements/arrow_call/types/pluck.rs +0 -97
  175. package/rust/core/audio/interpreter/statements/arrow_call/types/sub.rs +0 -100
  176. package/rust/core/audio/interpreter/statements/automate.rs +0 -16
  177. package/rust/core/audio/interpreter/statements/call.rs +0 -325
  178. package/rust/core/audio/interpreter/statements/condition.rs +0 -72
  179. package/rust/core/audio/interpreter/statements/function.rs +0 -24
  180. package/rust/core/audio/interpreter/statements/let_.rs +0 -36
  181. package/rust/core/audio/interpreter/statements/load.rs +0 -17
  182. package/rust/core/audio/interpreter/statements/loop_.rs +0 -115
  183. package/rust/core/audio/interpreter/statements/mod.rs +0 -12
  184. package/rust/core/audio/interpreter/statements/sleep.rs +0 -28
  185. package/rust/core/audio/interpreter/statements/spawn.rs +0 -302
  186. package/rust/core/audio/interpreter/statements/tempo.rs +0 -40
  187. package/rust/core/audio/interpreter/statements/trigger.rs +0 -242
  188. package/rust/core/audio/loader/mod.rs +0 -1
  189. package/rust/core/audio/loader/trigger.rs +0 -98
  190. package/rust/core/audio/mod.rs +0 -6
  191. package/rust/core/audio/player.rs +0 -70
  192. package/rust/core/audio/special/easing.rs +0 -189
  193. package/rust/core/audio/special/env.rs +0 -45
  194. package/rust/core/audio/special/math.rs +0 -134
  195. package/rust/core/audio/special/mod.rs +0 -9
  196. package/rust/core/audio/special/modulator.rs +0 -143
  197. package/rust/core/builder/mod.rs +0 -129
  198. package/rust/core/debugger/lexer.rs +0 -27
  199. package/rust/core/debugger/logs.rs +0 -52
  200. package/rust/core/debugger/mod.rs +0 -30
  201. package/rust/core/debugger/preprocessor.rs +0 -27
  202. package/rust/core/debugger/store.rs +0 -38
  203. package/rust/core/error/mod.rs +0 -269
  204. package/rust/core/lexer/driver.rs +0 -59
  205. package/rust/core/lexer/handler/arrow.rs +0 -82
  206. package/rust/core/lexer/handler/at.rs +0 -21
  207. package/rust/core/lexer/handler/brace.rs +0 -41
  208. package/rust/core/lexer/handler/colon.rs +0 -21
  209. package/rust/core/lexer/handler/comment.rs +0 -30
  210. package/rust/core/lexer/handler/dot.rs +0 -21
  211. package/rust/core/lexer/handler/driver.rs +0 -337
  212. package/rust/core/lexer/handler/identifier.rs +0 -47
  213. package/rust/core/lexer/handler/indent.rs +0 -66
  214. package/rust/core/lexer/handler/mod.rs +0 -15
  215. package/rust/core/lexer/handler/newline.rs +0 -23
  216. package/rust/core/lexer/handler/number.rs +0 -31
  217. package/rust/core/lexer/handler/operator.rs +0 -46
  218. package/rust/core/lexer/handler/parenthesis.rs +0 -41
  219. package/rust/core/lexer/handler/slash.rs +0 -21
  220. package/rust/core/lexer/handler/string.rs +0 -63
  221. package/rust/core/lexer/mod.rs +0 -3
  222. package/rust/core/lexer/token.rs +0 -91
  223. package/rust/core/mod.rs +0 -9
  224. package/rust/core/parser/driver/block.rs +0 -111
  225. package/rust/core/parser/driver/cursor.rs +0 -82
  226. package/rust/core/parser/driver/driver_impl.rs +0 -159
  227. package/rust/core/parser/driver/mod.rs +0 -6
  228. package/rust/core/parser/driver/parse_array.rs +0 -120
  229. package/rust/core/parser/driver/parse_map.rs +0 -247
  230. package/rust/core/parser/driver/parser.rs +0 -160
  231. package/rust/core/parser/handler/arrow_call.rs +0 -328
  232. package/rust/core/parser/handler/at.rs +0 -279
  233. package/rust/core/parser/handler/bank.rs +0 -104
  234. package/rust/core/parser/handler/condition.rs +0 -83
  235. package/rust/core/parser/handler/dot.rs +0 -148
  236. package/rust/core/parser/handler/identifier/automate.rs +0 -254
  237. package/rust/core/parser/handler/identifier/call.rs +0 -91
  238. package/rust/core/parser/handler/identifier/emit.rs +0 -70
  239. package/rust/core/parser/handler/identifier/function.rs +0 -113
  240. package/rust/core/parser/handler/identifier/group.rs +0 -89
  241. package/rust/core/parser/handler/identifier/let_.rs +0 -173
  242. package/rust/core/parser/handler/identifier/mod.rs +0 -55
  243. package/rust/core/parser/handler/identifier/on.rs +0 -107
  244. package/rust/core/parser/handler/identifier/print.rs +0 -49
  245. package/rust/core/parser/handler/identifier/sleep.rs +0 -96
  246. package/rust/core/parser/handler/identifier/spawn.rs +0 -91
  247. package/rust/core/parser/handler/identifier/synth.rs +0 -171
  248. package/rust/core/parser/handler/loop_.rs +0 -194
  249. package/rust/core/parser/handler/mod.rs +0 -9
  250. package/rust/core/parser/handler/pattern.rs +0 -97
  251. package/rust/core/parser/handler/tempo.rs +0 -105
  252. package/rust/core/parser/mod.rs +0 -3
  253. package/rust/core/parser/statement.rs +0 -10
  254. package/rust/core/plugin/loader.rs +0 -137
  255. package/rust/core/plugin/mod.rs +0 -2
  256. package/rust/core/plugin/runner/mod.rs +0 -11
  257. package/rust/core/plugin/runner/non_wasm.rs +0 -481
  258. package/rust/core/plugin/runner/wasm32.rs +0 -44
  259. package/rust/core/preprocessor/loader/inject.rs +0 -313
  260. package/rust/core/preprocessor/loader/loader_helpers.rs +0 -110
  261. package/rust/core/preprocessor/loader/mod.rs +0 -235
  262. package/rust/core/preprocessor/mod.rs +0 -4
  263. package/rust/core/preprocessor/module.rs +0 -55
  264. package/rust/core/preprocessor/processor/handlers.rs +0 -107
  265. package/rust/core/preprocessor/processor/mod.rs +0 -1
  266. package/rust/core/preprocessor/resolver/bank.rs +0 -49
  267. package/rust/core/preprocessor/resolver/call.rs +0 -124
  268. package/rust/core/preprocessor/resolver/condition.rs +0 -95
  269. package/rust/core/preprocessor/resolver/driver.rs +0 -324
  270. package/rust/core/preprocessor/resolver/function.rs +0 -69
  271. package/rust/core/preprocessor/resolver/group.rs +0 -122
  272. package/rust/core/preprocessor/resolver/let_.rs +0 -32
  273. package/rust/core/preprocessor/resolver/loop_.rs +0 -318
  274. package/rust/core/preprocessor/resolver/mod.rs +0 -16
  275. package/rust/core/preprocessor/resolver/pattern.rs +0 -95
  276. package/rust/core/preprocessor/resolver/spawn.rs +0 -99
  277. package/rust/core/preprocessor/resolver/synth.rs +0 -54
  278. package/rust/core/preprocessor/resolver/tempo.rs +0 -48
  279. package/rust/core/preprocessor/resolver/trigger.rs +0 -116
  280. package/rust/core/preprocessor/resolver/value.rs +0 -176
  281. package/rust/core/store/global.rs +0 -57
  282. package/rust/core/store/mod.rs +0 -1
  283. package/rust/lib.rs +0 -323
  284. package/rust/macros/Cargo.toml +0 -14
  285. package/rust/macros/src/lib.rs +0 -52
  286. package/rust/main.rs +0 -557
  287. package/rust/types/Cargo.toml +0 -11
  288. package/rust/types/src/addons.rs +0 -57
  289. package/rust/types/src/ast.rs +0 -202
  290. package/rust/types/src/config.rs +0 -82
  291. package/rust/types/src/lib.rs +0 -15
  292. package/rust/types/src/plugin.rs +0 -20
  293. package/rust/types/src/store.rs +0 -139
  294. package/rust/types/src/telemetry.rs +0 -85
  295. package/rust/utils/Cargo.toml +0 -29
  296. package/rust/utils/src/error.rs +0 -186
  297. package/rust/utils/src/file.rs +0 -477
  298. package/rust/utils/src/first_usage.rs +0 -97
  299. package/rust/utils/src/lib.rs +0 -9
  300. package/rust/utils/src/logger.rs +0 -200
  301. package/rust/utils/src/path.rs +0 -158
  302. package/rust/utils/src/signature.rs +0 -41
  303. package/rust/utils/src/spinner.rs +0 -20
  304. package/rust/utils/src/version.rs +0 -58
  305. package/rust/utils/src/watcher.rs +0 -46
  306. package/rust/web/api.rs +0 -5
  307. package/rust/web/auth.rs +0 -5
  308. package/rust/web/cdn.rs +0 -34
  309. package/rust/web/forge.rs +0 -5
  310. package/rust/web/mod.rs +0 -5
  311. package/rust/web/sso.rs +0 -5
  312. package/templates/minimal/.devalang +0 -5
  313. package/templates/minimal/README.md +0 -218
  314. package/templates/minimal/src/index.deva +0 -2
  315. package/templates/welcome/.devalang +0 -5
  316. package/templates/welcome/README.md +0 -218
  317. package/templates/welcome/samples/kick-808.wav +0 -0
  318. package/templates/welcome/src/index.deva +0 -61
  319. package/templates/welcome/src/variables.deva +0 -3
  320. package/tests/integration.rs +0 -21
  321. package/tests/rust/cli_check_build.rs +0 -21
  322. package/tests/rust/cli_help.rs +0 -12
  323. package/tests/rust/cli_template_list.rs +0 -10
  324. package/tests/rust/cli_version.rs +0 -11
  325. package/tests/typescript/index.spec.ts +0 -136
  326. package/tests/typescript/playhead.spec.ts +0 -36
  327. package/tests/typescript/render_e2e.spec.ts +0 -77
  328. package/tsconfig.json +0 -115
  329. package/typescript/bin/index.ts +0 -28
  330. package/typescript/core/functions/index.ts +0 -94
  331. package/typescript/core/index.ts +0 -6
  332. package/typescript/core/types/index.ts +0 -4
  333. package/typescript/core/types/plugin.ts +0 -19
  334. package/typescript/core/types/result.ts +0 -29
  335. package/typescript/core/types/statement.ts +0 -47
  336. package/typescript/core/types/value.ts +0 -29
  337. package/typescript/index.ts +0 -8
  338. package/typescript/pkg/devalang_core.d.ts +0 -4
  339. package/typescript/pkg/devalang_core.ts +0 -65
  340. package/typescript/scripts/copy-wasm-dts.ts +0 -41
  341. package/typescript/scripts/postinstall.ts +0 -85
  342. package/typescript/scripts/version/bump.ts +0 -44
  343. package/typescript/scripts/version/copy-to-binary.ts +0 -82
  344. package/typescript/scripts/version/fetch.ts +0 -18
  345. package/typescript/scripts/version/index.ts +0 -25
  346. package/typescript/scripts/version/sync.ts +0 -24
@@ -1,186 +0,0 @@
1
- use super::logger::{LogLevel, Logger};
2
- use devalang_types::{ErrorResult, Severity, StackFrame, Statement, StatementKind, Value};
3
- use std::collections::HashMap;
4
-
5
- pub fn collect_errors_recursively(statements: &[Statement]) -> Vec<ErrorResult> {
6
- let mut errors: Vec<ErrorResult> = Vec::new();
7
-
8
- for stmt in statements {
9
- match &stmt.kind {
10
- StatementKind::Unknown => {
11
- errors.push(ErrorResult {
12
- message: format!("Unknown statement at line {}:{}", stmt.line, stmt.column),
13
- line: stmt.line,
14
- column: stmt.column,
15
- severity: Severity::Warning,
16
- stack: vec![StackFrame {
17
- module: None,
18
- context: Some("Unknown".to_string()),
19
- line: stmt.line,
20
- column: stmt.column,
21
- }],
22
- });
23
- }
24
- StatementKind::Error { message } => {
25
- errors.push(ErrorResult {
26
- message: message.clone(),
27
- line: stmt.line,
28
- column: stmt.column,
29
- severity: Severity::Critical,
30
- stack: vec![StackFrame {
31
- module: None,
32
- context: Some("Error".to_string()),
33
- line: stmt.line,
34
- column: stmt.column,
35
- }],
36
- });
37
- }
38
- StatementKind::Loop => {
39
- if let Some(body_statements) = extract_loop_body_statements(&stmt.value) {
40
- let nested = collect_errors_recursively(body_statements);
41
- errors.extend(nested.into_iter().map(|mut e| {
42
- e.stack.insert(
43
- 0,
44
- StackFrame {
45
- module: None,
46
- context: Some("loop".to_string()),
47
- line: stmt.line,
48
- column: stmt.column,
49
- },
50
- );
51
- e
52
- }));
53
- }
54
- }
55
- _ => {}
56
- }
57
- }
58
-
59
- errors
60
- }
61
-
62
- fn extract_loop_body_statements(value: &Value) -> Option<&[Statement]> {
63
- if let Value::Map(map) = value {
64
- if let Some(Value::Block(statements)) = map.get("body") {
65
- return Some(statements);
66
- }
67
- }
68
- None
69
- }
70
-
71
- pub fn partition_errors(errors: Vec<ErrorResult>) -> (Vec<ErrorResult>, Vec<ErrorResult>) {
72
- let mut warnings = Vec::new();
73
- let mut criticals = Vec::new();
74
- for e in errors {
75
- match e.severity {
76
- Severity::Warning => warnings.push(e),
77
- Severity::Critical => criticals.push(e),
78
- }
79
- }
80
- (warnings, criticals)
81
- }
82
-
83
- pub fn log_errors_with_stack(prefix: &str, warnings: &[ErrorResult], criticals: &[ErrorResult]) {
84
- let logger = Logger::new();
85
- if !warnings.is_empty() {
86
- logger.log_message(
87
- LogLevel::Warning,
88
- &format!("{}: {} warning(s)", prefix, warnings.len()),
89
- );
90
- for w in warnings {
91
- logger.log_message(LogLevel::Warning, &format!("- {}", w.message));
92
- if let Some(frame) = w.stack.first() {
93
- let module = frame.module.clone().unwrap_or_default();
94
- logger.log_message(
95
- LogLevel::Debug,
96
- &format!(
97
- " ↳ {}:{}:{} {}",
98
- module,
99
- frame.line,
100
- frame.column,
101
- frame.context.clone().unwrap_or_default()
102
- ),
103
- );
104
- }
105
- if w.stack.len() > 1 {
106
- for (i, f) in w.stack.iter().enumerate().skip(1) {
107
- let module = f.module.clone().unwrap_or_default();
108
- logger.log_message(
109
- LogLevel::Debug,
110
- &format!(
111
- " #{} {}:{}:{} {}",
112
- i,
113
- module,
114
- f.line,
115
- f.column,
116
- f.context.clone().unwrap_or_default()
117
- ),
118
- );
119
- }
120
- }
121
- }
122
- }
123
- if !criticals.is_empty() {
124
- logger.log_message(
125
- LogLevel::Error,
126
- &format!("{}: {} critical error(s)", prefix, criticals.len()),
127
- );
128
- for c in criticals {
129
- logger.log_message(LogLevel::Error, &format!("- {}", c.message));
130
- if let Some(frame) = c.stack.first() {
131
- let module = frame.module.clone().unwrap_or_default();
132
- logger.log_message(
133
- LogLevel::Error,
134
- &format!(
135
- " ↳ {}:{}:{} {}",
136
- module,
137
- frame.line,
138
- frame.column,
139
- frame.context.clone().unwrap_or_default()
140
- ),
141
- );
142
- }
143
- if c.stack.len() > 1 {
144
- for (i, f) in c.stack.iter().enumerate().skip(1) {
145
- let module = f.module.clone().unwrap_or_default();
146
- logger.log_message(
147
- LogLevel::Error,
148
- &format!(
149
- " #{} {}:{}:{} {}",
150
- i,
151
- module,
152
- f.line,
153
- f.column,
154
- f.context.clone().unwrap_or_default()
155
- ),
156
- );
157
- }
158
- }
159
- }
160
- }
161
- }
162
-
163
- pub fn collect_all_errors_with_modules(
164
- modules: &HashMap<String, Vec<Statement>>,
165
- ) -> Vec<ErrorResult> {
166
- let mut all = Vec::new();
167
- for (module_path, stmts) in modules {
168
- let mut errs = collect_errors_recursively(stmts);
169
- for e in errs.iter_mut() {
170
- if e.stack.is_empty() {
171
- e.stack.push(StackFrame {
172
- module: Some(module_path.clone()),
173
- context: None,
174
- line: e.line,
175
- column: e.column,
176
- });
177
- } else {
178
- if e.stack[0].module.is_none() {
179
- e.stack[0].module = Some(module_path.clone());
180
- }
181
- }
182
- }
183
- all.extend(errs);
184
- }
185
- all
186
- }
@@ -1,477 +0,0 @@
1
- use include_dir::{ Dir, DirEntry };
2
- use std::{ fs, path::Path, io::{ Read, Seek, SeekFrom } };
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
- // Compute the destination path relative to the provided base.
12
- let rel_path = match file.path().strip_prefix(base_path) {
13
- Ok(p) => p.to_owned(),
14
- Err(_) => {
15
- eprintln!(
16
- "Warning: failed to compute relative path for {:?}, skipping",
17
- file.path()
18
- );
19
- continue;
20
- }
21
- };
22
-
23
- let dest_path = target_root.join(rel_path);
24
-
25
- if let Some(parent) = dest_path.parent() {
26
- if let Err(e) = fs::create_dir_all(parent) {
27
- eprintln!(
28
- "Warning: failed to create directory {}: {}",
29
- parent.display(),
30
- e
31
- );
32
- continue;
33
- }
34
- }
35
-
36
- if let Err(e) = fs::write(&dest_path, file.contents()) {
37
- eprintln!("Warning: failed to write {}: {}", dest_path.display(), e);
38
- continue;
39
- }
40
- }
41
- }
42
- }
43
- }
44
-
45
- pub fn format_file_size(bytes: u64) -> String {
46
- const KB: u64 = 1024;
47
- const MB: u64 = 1024 * 1024;
48
-
49
- if bytes >= MB {
50
- format!("{:.2} Mb", (bytes as f64) / (MB as f64))
51
- } else if bytes >= KB {
52
- format!("{:.2} Kb", (bytes as f64) / (KB as f64))
53
- } else {
54
- format!("{} bytes", bytes)
55
- }
56
- }
57
-
58
- pub fn extract_zip_safely(archive_path: &Path, dest: &Path) -> Result<(), String> {
59
- // Open file and peek magic bytes to determine archive format
60
- let mut file = std::fs::File
61
- ::open(archive_path)
62
- .map_err(|e| format!("Failed to open archive {}: {}", archive_path.display(), e))?;
63
-
64
- let mut magic = [0u8; 4];
65
- let n = file
66
- .read(&mut magic)
67
- .map_err(|e| format!("Failed to read archive header {}: {}", archive_path.display(), e))?;
68
- file
69
- .seek(SeekFrom::Start(0))
70
- .map_err(|e| format!("Failed to seek archive {}: {}", archive_path.display(), e))?;
71
-
72
- let is_gzip = n >= 2 && magic[0] == 0x1f && magic[1] == 0x8b;
73
- let is_zip = n >= 2 && magic[0] == 0x50 && magic[1] == 0x4b;
74
-
75
- if is_gzip {
76
- // The gzip may contain a tar archive OR a gzipped zip (PK inside).
77
- // Decompress to a temporary file, inspect its magic bytes, then choose extractor.
78
- let mut gz = flate2::read::GzDecoder::new(file);
79
-
80
- let mut named = tempfile::NamedTempFile
81
- ::new()
82
- .map_err(|e| format!("Failed to create temp file: {}", e))?;
83
-
84
- std::io
85
- ::copy(&mut gz, &mut named)
86
- .map_err(|e| format!("Failed to decompress gzip to temp: {}", e))?;
87
- named
88
- .as_file_mut()
89
- .seek(SeekFrom::Start(0))
90
- .map_err(|e| format!("Failed to seek temp file: {}", e))?;
91
-
92
- // Read magic of decompressed content
93
- let mut head = [0u8; 4];
94
- let n = named
95
- .as_file_mut()
96
- .read(&mut head)
97
- .map_err(|e| format!("Failed to read temp archive header: {}", e))?;
98
- named
99
- .as_file_mut()
100
- .seek(SeekFrom::Start(0))
101
- .map_err(|e| format!("Failed to rewind temp file: {}", e))?;
102
-
103
- let inner_is_zip = n >= 2 && head[0] == 0x50 && head[1] == 0x4b;
104
-
105
- if inner_is_zip {
106
- let tmp_file = named
107
- .reopen()
108
- .map_err(|e| format!("Failed to reopen temp file for zip: {}", e))?;
109
-
110
- let mut archive = zip::ZipArchive
111
- ::new(tmp_file)
112
- .map_err(|e| format!("Failed to read zip archive inside gzip: {}", e))?;
113
-
114
- for i in 0..archive.len() {
115
- let mut file = archive
116
- .by_index(i)
117
- .map_err(|e| format!("Failed to access zip archive entry {}: {}", i, e))?;
118
- let enclosed = match file.enclosed_name() {
119
- Some(p) => p.to_owned(),
120
- None => {
121
- continue;
122
- }
123
- };
124
- if
125
- enclosed.is_absolute() ||
126
- enclosed.components().any(|c| matches!(c, std::path::Component::ParentDir))
127
- {
128
- continue;
129
- }
130
- let outpath = dest.join(enclosed);
131
- if file.name().ends_with('/') || file.is_dir() {
132
- std::fs
133
- ::create_dir_all(&outpath)
134
- .map_err(|e| format!("Failed to create dir {}: {}", outpath.display(), e))?;
135
- } else {
136
- if let Some(p) = outpath.parent() {
137
- std::fs
138
- ::create_dir_all(p)
139
- .map_err(|e|
140
- format!("Failed to create parent {}: {}", p.display(), e)
141
- )?;
142
- }
143
- let mut outfile = std::fs::File
144
- ::create(&outpath)
145
- .map_err(|e|
146
- format!("Failed to create file {}: {}", outpath.display(), e)
147
- )?;
148
- std::io
149
- ::copy(&mut file, &mut outfile)
150
- .map_err(|e| format!("Failed to write file {}: {}", outpath.display(), e))?;
151
- }
152
- }
153
-
154
- // NamedTempFile will be removed on drop
155
- return Ok(());
156
- }
157
-
158
- // otherwise treat as tar
159
- let tmp_file = named
160
- .reopen()
161
- .map_err(|e| format!("Failed to reopen temp file for tar: {}", e))?;
162
- let mut archive = tar::Archive::new(tmp_file);
163
-
164
- for entry in archive
165
- .entries()
166
- .map_err(|e| format!("Failed to read tar entries (from gzip): {}", e))? {
167
- let mut entry = entry.map_err(|e|
168
- format!("Failed to read tar archive entry (from gzip): {}", e)
169
- )?;
170
- let path = match entry.path() {
171
- Ok(p) => p.into_owned(),
172
- Err(_) => {
173
- continue;
174
- }
175
- };
176
- if
177
- path.is_absolute() ||
178
- path.components().any(|c| matches!(c, std::path::Component::ParentDir))
179
- {
180
- continue;
181
- }
182
- let outpath = dest.join(&path);
183
- if let Some(parent) = outpath.parent() {
184
- std::fs
185
- ::create_dir_all(parent)
186
- .map_err(|e| format!("Failed to create parent {}: {}", parent.display(), e))?;
187
- }
188
- entry
189
- .unpack(&outpath)
190
- .map_err(|e|
191
- format!("Failed to unpack tar entry to {}: {}", outpath.display(), e)
192
- )?;
193
- }
194
-
195
- return Ok(());
196
- }
197
-
198
- if is_zip {
199
- // Re-open file for zip
200
- let file = std::fs::File
201
- ::open(archive_path)
202
- .map_err(|e|
203
- format!("Failed to open archive for zip {}: {}", archive_path.display(), e)
204
- )?;
205
-
206
- let mut archive = zip::ZipArchive
207
- ::new(file)
208
- .map_err(|e| format!("Failed to read zip archive {}: {}", archive_path.display(), e))?;
209
-
210
- for i in 0..archive.len() {
211
- let mut file = archive
212
- .by_index(i)
213
- .map_err(|e| format!("Failed to access zip archive entry {}: {}", i, e))?;
214
-
215
- let enclosed = match file.enclosed_name() {
216
- Some(p) => p.to_owned(),
217
- None => {
218
- continue;
219
- }
220
- };
221
-
222
- if
223
- enclosed.is_absolute() ||
224
- enclosed.components().any(|c| matches!(c, std::path::Component::ParentDir))
225
- {
226
- continue;
227
- }
228
-
229
- let outpath = dest.join(enclosed);
230
- if file.name().ends_with('/') || file.is_dir() {
231
- std::fs
232
- ::create_dir_all(&outpath)
233
- .map_err(|e| format!("Failed to create dir {}: {}", outpath.display(), e))?;
234
- } else {
235
- if let Some(p) = outpath.parent() {
236
- std::fs
237
- ::create_dir_all(p)
238
- .map_err(|e| format!("Failed to create parent {}: {}", p.display(), e))?;
239
- }
240
- let mut outfile = std::fs::File
241
- ::create(&outpath)
242
- .map_err(|e| format!("Failed to create file {}: {}", outpath.display(), e))?;
243
- std::io
244
- ::copy(&mut file, &mut outfile)
245
- .map_err(|e| format!("Failed to write file {}: {}", outpath.display(), e))?;
246
- }
247
- }
248
-
249
- return Ok(());
250
- }
251
-
252
- // Unknown magic: try tar.gz first, then zip as fallback
253
- // Try tar.gz
254
- let file = std::fs::File
255
- ::open(archive_path)
256
- .map_err(|e| format!("Failed to open archive {}: {}", archive_path.display(), e))?;
257
- if
258
- let Ok(()) = (|| -> Result<(), String> {
259
- let gz = flate2::read::GzDecoder::new(&file);
260
- let mut archive = tar::Archive::new(gz);
261
- for entry in archive
262
- .entries()
263
- .map_err(|e| format!("Failed to read tar entries: {}", e))? {
264
- let mut entry = entry.map_err(|e|
265
- format!("Failed to read tar archive entry: {}", e)
266
- )?;
267
- let path = match entry.path() {
268
- Ok(p) => p.into_owned(),
269
- Err(_) => {
270
- continue;
271
- }
272
- };
273
- if
274
- path.is_absolute() ||
275
- path.components().any(|c| matches!(c, std::path::Component::ParentDir))
276
- {
277
- continue;
278
- }
279
- let outpath = dest.join(&path);
280
- if let Some(parent) = outpath.parent() {
281
- std::fs
282
- ::create_dir_all(parent)
283
- .map_err(|e|
284
- format!("Failed to create parent {}: {}", parent.display(), e)
285
- )?;
286
- }
287
- entry
288
- .unpack(&outpath)
289
- .map_err(|e|
290
- format!("Failed to unpack tar entry to {}: {}", outpath.display(), e)
291
- )?;
292
- }
293
- Ok(())
294
- })()
295
- {
296
- return Ok(());
297
- }
298
-
299
- // Fallback to zip
300
- let file = std::fs::File
301
- ::open(archive_path)
302
- .map_err(|e| format!("Failed to open archive for zip {}: {}", archive_path.display(), e))?;
303
- let mut archive = zip::ZipArchive
304
- ::new(file)
305
- .map_err(|e| format!("Failed to read zip archive {}: {}", archive_path.display(), e))?;
306
- for i in 0..archive.len() {
307
- let mut file = archive
308
- .by_index(i)
309
- .map_err(|e| format!("Failed to access zip archive entry {}: {}", i, e))?;
310
- let enclosed = match file.enclosed_name() {
311
- Some(p) => p.to_owned(),
312
- None => {
313
- continue;
314
- }
315
- };
316
- if
317
- enclosed.is_absolute() ||
318
- enclosed.components().any(|c| matches!(c, std::path::Component::ParentDir))
319
- {
320
- continue;
321
- }
322
- let outpath = dest.join(enclosed);
323
- if file.name().ends_with('/') || file.is_dir() {
324
- std::fs
325
- ::create_dir_all(&outpath)
326
- .map_err(|e| format!("Failed to create dir {}: {}", outpath.display(), e))?;
327
- } else {
328
- if let Some(p) = outpath.parent() {
329
- std::fs
330
- ::create_dir_all(p)
331
- .map_err(|e| format!("Failed to create parent {}: {}", p.display(), e))?;
332
- }
333
- let mut outfile = std::fs::File
334
- ::create(&outpath)
335
- .map_err(|e| format!("Failed to create file {}: {}", outpath.display(), e))?;
336
- std::io
337
- ::copy(&mut file, &mut outfile)
338
- .map_err(|e| format!("Failed to write file {}: {}", outpath.display(), e))?;
339
- }
340
- }
341
-
342
- Ok(())
343
- }
344
-
345
- /// Detects addon type by inspecting archive contents without extracting fully.
346
- /// Returns one of: "bank", "plugin", "preset", "template", or "unknown".
347
- pub fn detect_addon_type_in_archive(archive_path: &Path) -> Result<String, String> {
348
- use std::fs::File;
349
-
350
- let mut file = File::open(archive_path)
351
- .map_err(|e| format!("Failed to open archive {}: {}", archive_path.display(), e))?;
352
-
353
- let mut magic = [0u8; 4];
354
- let n = file
355
- .read(&mut magic)
356
- .map_err(|e| format!("Failed to read archive header {}: {}", archive_path.display(), e))?;
357
- file
358
- .seek(SeekFrom::Start(0))
359
- .map_err(|e| format!("Failed to seek archive {}: {}", archive_path.display(), e))?;
360
-
361
- let is_gzip = n >= 2 && magic[0] == 0x1f && magic[1] == 0x8b;
362
- let is_zip = n >= 2 && magic[0] == 0x50 && magic[1] == 0x4b;
363
-
364
- let check_name = |name: &str| {
365
- let lname = name.to_ascii_lowercase();
366
- if lname.ends_with("bank.toml") {
367
- return Some("bank".to_string());
368
- }
369
- if lname.ends_with("plugin.toml") {
370
- return Some("plugin".to_string());
371
- }
372
- if lname.ends_with("preset.toml") {
373
- return Some("preset".to_string());
374
- }
375
- if lname.ends_with("template.toml") {
376
- return Some("template".to_string());
377
- }
378
- None
379
- };
380
-
381
- if is_gzip {
382
- // Decompress to temp and inspect inner archive
383
- let mut gz = flate2::read::GzDecoder::new(file);
384
- let mut named = tempfile::NamedTempFile::new()
385
- .map_err(|e| format!("Failed to create temp file: {}", e))?;
386
- std::io::copy(&mut gz, &mut named)
387
- .map_err(|e| format!("Failed to decompress gzip to temp: {}", e))?;
388
- named.as_file_mut().seek(SeekFrom::Start(0)).map_err(|e| format!("Failed to seek temp file: {}", e))?;
389
-
390
- // Inspect inner magic
391
- let mut head = [0u8; 4];
392
- let m = named.as_file_mut().read(&mut head).map_err(|e| format!("Failed to read temp archive header: {}", e))?;
393
- named.as_file_mut().seek(SeekFrom::Start(0)).map_err(|e| format!("Failed to rewind temp file: {}", e))?;
394
-
395
- let inner_is_zip = m >= 2 && head[0] == 0x50 && head[1] == 0x4b;
396
- if inner_is_zip {
397
- let tmp_file = named.reopen().map_err(|e| format!("Failed to reopen temp file for zip: {}", e))?;
398
- let mut archive = zip::ZipArchive::new(tmp_file).map_err(|e| format!("Failed to read zip archive inside gzip: {}", e))?;
399
- for i in 0..archive.len() {
400
- if let Ok(file) = archive.by_index(i) {
401
- if let Some(enclosed) = file.enclosed_name() {
402
- let s = enclosed.to_string_lossy().to_string();
403
- if let Some(t) = check_name(&s) {
404
- return Ok(t);
405
- }
406
- }
407
- }
408
- }
409
- return Ok("unknown".to_string());
410
- }
411
-
412
- // treat as tar
413
- let tmp_file = named.reopen().map_err(|e| format!("Failed to reopen temp file for tar: {}", e))?;
414
- let mut archive = tar::Archive::new(tmp_file);
415
- if let Ok(entries) = archive.entries() {
416
- for entry in entries.filter_map(|e| e.ok()) {
417
- if let Ok(path) = entry.path() {
418
- let s = path.to_string_lossy().to_string();
419
- if let Some(t) = check_name(&s) {
420
- return Ok(t);
421
- }
422
- }
423
- }
424
- }
425
- return Ok("unknown".to_string());
426
- }
427
-
428
- if is_zip {
429
- let file = std::fs::File::open(archive_path).map_err(|e| format!("Failed to open archive for zip {}: {}", archive_path.display(), e))?;
430
- let mut archive = zip::ZipArchive::new(file).map_err(|e| format!("Failed to read zip archive {}: {}", archive_path.display(), e))?;
431
- for i in 0..archive.len() {
432
- if let Ok(file) = archive.by_index(i) {
433
- if let Some(enclosed) = file.enclosed_name() {
434
- let s = enclosed.to_string_lossy().to_string();
435
- if let Some(t) = check_name(&s) {
436
- return Ok(t);
437
- }
438
- }
439
- }
440
- }
441
- return Ok("unknown".to_string());
442
- }
443
-
444
- // fallback: try tar.gz read attempt
445
- if let Ok(f) = std::fs::File::open(archive_path) {
446
- let gz = flate2::read::GzDecoder::new(f);
447
- let mut archive = tar::Archive::new(gz);
448
- if let Ok(entries) = archive.entries() {
449
- for entry in entries.filter_map(|e| e.ok()) {
450
- if let Ok(path) = entry.path() {
451
- let s = path.to_string_lossy().to_string();
452
- if let Some(t) = check_name(&s) {
453
- return Ok(t);
454
- }
455
- }
456
- }
457
- }
458
- }
459
-
460
- Ok("unknown".to_string())
461
- }
462
-
463
- /// Removes the temporary folder located at `.deva/tmp` inside the project root if it exists.
464
- /// Returns Ok(()) even if the folder did not exist. Returns Err(String) on filesystem errors.
465
- pub fn clear_tmp_folder() -> Result<(), String> {
466
- match crate::path::ensure_deva_dir() {
467
- Ok(deva_dir) => {
468
- let tmp_dir = deva_dir.join("tmp");
469
- if tmp_dir.exists() {
470
- std::fs::remove_dir_all(&tmp_dir)
471
- .map_err(|e| format!("Failed to remove tmp dir '{}': {}", tmp_dir.display(), e))?;
472
- }
473
- Ok(())
474
- }
475
- Err(e) => Err(e),
476
- }
477
- }