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

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 (271) hide show
  1. package/.cargo/config.toml +2 -0
  2. package/.devalang +10 -4
  3. package/.github/workflows/ci.yml +103 -0
  4. package/Cargo.toml +80 -48
  5. package/README.md +135 -154
  6. package/docs/CHANGELOG.md +386 -1
  7. package/docs/CONTRIBUTING.md +101 -0
  8. package/docs/ROADMAP.md +10 -7
  9. package/docs/TODO.md +21 -9
  10. package/examples/automation.deva +42 -0
  11. package/examples/bank.deva +7 -0
  12. package/examples/duration.deva +9 -0
  13. package/examples/events.deva +12 -0
  14. package/examples/function.deva +15 -0
  15. package/examples/index.deva +57 -12
  16. package/examples/loop.deva +5 -12
  17. package/examples/pattern.deva +8 -0
  18. package/examples/plugin.deva +16 -0
  19. package/examples/variables.deva +1 -1
  20. package/out-tsc/bin/index.d.ts +2 -0
  21. package/out-tsc/bin/index.js +51 -7
  22. package/out-tsc/core/functions/index.d.ts +37 -0
  23. package/out-tsc/core/functions/index.js +76 -0
  24. package/out-tsc/core/index.d.ts +6 -0
  25. package/out-tsc/core/index.js +22 -0
  26. package/out-tsc/core/types/index.d.ts +4 -0
  27. package/out-tsc/core/types/index.js +20 -0
  28. package/out-tsc/core/types/plugin.d.ts +18 -0
  29. package/out-tsc/core/types/plugin.js +2 -0
  30. package/out-tsc/core/types/result.d.ts +27 -0
  31. package/out-tsc/core/types/result.js +2 -0
  32. package/out-tsc/core/types/statement.d.ts +106 -0
  33. package/out-tsc/core/types/statement.js +2 -0
  34. package/out-tsc/core/types/value.d.ts +43 -0
  35. package/out-tsc/core/types/value.js +2 -0
  36. package/out-tsc/index.d.ts +7 -0
  37. package/out-tsc/index.js +42 -1
  38. package/out-tsc/pkg/devalang_core.d.ts +13 -0
  39. package/out-tsc/pkg/devalang_core.js +50 -0
  40. package/out-tsc/pkg/devalang_core_bg.wasm.d.ts +33 -0
  41. package/out-tsc/scripts/copy-wasm-dts.d.ts +1 -0
  42. package/out-tsc/scripts/copy-wasm-dts.js +73 -0
  43. package/out-tsc/scripts/postinstall.d.ts +1 -0
  44. package/out-tsc/scripts/postinstall.js +83 -0
  45. package/out-tsc/scripts/version/bump.d.ts +1 -0
  46. package/out-tsc/scripts/version/fetch.d.ts +1 -0
  47. package/out-tsc/scripts/version/index.d.ts +1 -0
  48. package/out-tsc/scripts/version/sync.d.ts +1 -0
  49. package/package.json +28 -7
  50. package/project-version.json +4 -4
  51. package/rust/cli/bank/api.rs +122 -0
  52. package/rust/cli/bank/commands.rs +275 -0
  53. package/rust/cli/bank/mod.rs +29 -0
  54. package/rust/cli/build/commands.rs +103 -0
  55. package/rust/cli/build/mod.rs +2 -0
  56. package/rust/cli/build/process.rs +146 -0
  57. package/rust/cli/check/mod.rs +208 -0
  58. package/rust/cli/discover/commands.rs +253 -0
  59. package/rust/cli/discover/config.rs +111 -0
  60. package/rust/cli/discover/fs.rs +19 -0
  61. package/rust/cli/discover/install.rs +103 -0
  62. package/rust/cli/discover/metadata.rs +48 -0
  63. package/rust/cli/discover/mod.rs +5 -0
  64. package/rust/cli/{init.rs → init/commands.rs} +32 -23
  65. package/rust/cli/init/mod.rs +1 -0
  66. package/rust/cli/install/addon.rs +118 -0
  67. package/rust/cli/install/bank.rs +53 -0
  68. package/rust/cli/install/commands.rs +35 -0
  69. package/rust/cli/install/mod.rs +4 -0
  70. package/rust/cli/install/plugin.rs +61 -0
  71. package/rust/cli/login/commands.rs +124 -0
  72. package/rust/cli/login/mod.rs +1 -0
  73. package/rust/cli/mod.rs +12 -205
  74. package/rust/cli/parser.rs +314 -0
  75. package/rust/cli/play/commands.rs +324 -0
  76. package/rust/cli/play/io.rs +17 -0
  77. package/rust/cli/play/mod.rs +5 -0
  78. package/rust/cli/play/process.rs +150 -0
  79. package/rust/cli/play/realtime.rs +91 -0
  80. package/rust/cli/play/utils.rs +23 -0
  81. package/rust/cli/telemetry/commands.rs +22 -0
  82. package/rust/cli/telemetry/event_creator.rs +80 -0
  83. package/rust/cli/telemetry/mod.rs +3 -0
  84. package/rust/cli/telemetry/send.rs +51 -0
  85. package/rust/cli/{template.rs → template/commands.rs} +69 -57
  86. package/rust/cli/template/mod.rs +1 -0
  87. package/rust/cli/update/commands.rs +6 -0
  88. package/rust/cli/update/mod.rs +1 -0
  89. package/rust/config/driver.rs +103 -0
  90. package/rust/config/mod.rs +3 -16
  91. package/rust/config/ops.rs +26 -0
  92. package/rust/config/settings.rs +101 -0
  93. package/rust/core/audio/engine/helpers.rs +170 -0
  94. package/rust/core/audio/engine/mod.rs +7 -0
  95. package/rust/core/audio/engine/sample.rs +366 -0
  96. package/rust/core/audio/engine/synth.rs +325 -0
  97. package/rust/core/audio/evaluator.rs +310 -31
  98. package/rust/core/audio/interpreter/arrow_call.rs +311 -129
  99. package/rust/core/audio/interpreter/automate.rs +18 -0
  100. package/rust/core/audio/interpreter/call.rs +294 -64
  101. package/rust/core/audio/interpreter/condition.rs +71 -69
  102. package/rust/core/audio/interpreter/driver.rs +542 -216
  103. package/rust/core/audio/interpreter/function.rs +26 -0
  104. package/rust/core/audio/interpreter/let_.rs +38 -19
  105. package/rust/core/audio/interpreter/load.rs +19 -18
  106. package/rust/core/audio/interpreter/loop_.rs +114 -67
  107. package/rust/core/audio/interpreter/mod.rs +14 -12
  108. package/rust/core/audio/interpreter/sleep.rs +28 -36
  109. package/rust/core/audio/interpreter/spawn.rs +252 -66
  110. package/rust/core/audio/interpreter/tempo.rs +40 -16
  111. package/rust/core/audio/interpreter/trigger.rs +239 -69
  112. package/rust/core/audio/loader/mod.rs +1 -1
  113. package/rust/core/audio/loader/trigger.rs +97 -52
  114. package/rust/core/audio/mod.rs +7 -6
  115. package/rust/core/audio/player.rs +70 -54
  116. package/rust/core/audio/renderer.rs +54 -54
  117. package/rust/core/audio/special/easing.rs +189 -0
  118. package/rust/core/audio/special/env.rs +45 -0
  119. package/rust/core/audio/special/math.rs +134 -0
  120. package/rust/core/audio/special/mod.rs +9 -0
  121. package/rust/core/audio/special/modulator.rs +143 -0
  122. package/rust/core/builder/mod.rs +86 -80
  123. package/rust/core/debugger/lexer.rs +27 -27
  124. package/rust/core/debugger/mod.rs +30 -21
  125. package/rust/core/debugger/module.rs +55 -0
  126. package/rust/core/debugger/preprocessor.rs +27 -27
  127. package/rust/core/debugger/store.rs +40 -25
  128. package/rust/core/error/mod.rs +269 -60
  129. package/rust/core/lexer/driver.rs +61 -0
  130. package/rust/core/lexer/handler/arrow.rs +82 -31
  131. package/rust/core/lexer/handler/at.rs +21 -21
  132. package/rust/core/lexer/handler/brace.rs +41 -41
  133. package/rust/core/lexer/handler/colon.rs +21 -21
  134. package/rust/core/lexer/handler/comment.rs +30 -30
  135. package/rust/core/lexer/handler/dot.rs +21 -21
  136. package/rust/core/lexer/handler/driver.rs +337 -226
  137. package/rust/core/lexer/handler/identifier.rs +47 -41
  138. package/rust/core/lexer/handler/indent.rs +66 -52
  139. package/rust/core/lexer/handler/mod.rs +15 -14
  140. package/rust/core/lexer/handler/newline.rs +23 -23
  141. package/rust/core/lexer/handler/number.rs +31 -31
  142. package/rust/core/lexer/handler/operator.rs +46 -44
  143. package/rust/core/lexer/handler/parenthesis.rs +41 -0
  144. package/rust/core/lexer/handler/slash.rs +21 -0
  145. package/rust/core/lexer/handler/string.rs +63 -63
  146. package/rust/core/lexer/mod.rs +3 -51
  147. package/rust/core/lexer/token.rs +17 -12
  148. package/rust/core/mod.rs +10 -10
  149. package/rust/core/parser/driver.rs +584 -331
  150. package/rust/core/parser/handler/arrow_call.rs +253 -126
  151. package/rust/core/parser/handler/at.rs +279 -162
  152. package/rust/core/parser/handler/bank.rs +104 -41
  153. package/rust/core/parser/handler/condition.rs +83 -74
  154. package/rust/core/parser/handler/dot.rs +148 -112
  155. package/rust/core/parser/handler/identifier/automate.rs +254 -0
  156. package/rust/core/parser/handler/identifier/call.rs +91 -41
  157. package/rust/core/parser/handler/identifier/emit.rs +70 -0
  158. package/rust/core/parser/handler/identifier/function.rs +113 -0
  159. package/rust/core/parser/handler/identifier/group.rs +89 -75
  160. package/rust/core/parser/handler/identifier/let_.rs +173 -133
  161. package/rust/core/parser/handler/identifier/mod.rs +55 -51
  162. package/rust/core/parser/handler/identifier/on.rs +107 -0
  163. package/rust/core/parser/handler/identifier/print.rs +49 -0
  164. package/rust/core/parser/handler/identifier/sleep.rs +43 -33
  165. package/rust/core/parser/handler/identifier/spawn.rs +91 -41
  166. package/rust/core/parser/handler/identifier/synth.rs +135 -65
  167. package/rust/core/parser/handler/loop_.rs +194 -72
  168. package/rust/core/parser/handler/mod.rs +9 -8
  169. package/rust/core/parser/handler/pattern.rs +74 -0
  170. package/rust/core/parser/handler/tempo.rs +57 -47
  171. package/rust/core/parser/mod.rs +3 -4
  172. package/rust/core/parser/statement.rs +11 -96
  173. package/rust/core/plugin/loader.rs +137 -0
  174. package/rust/core/plugin/mod.rs +2 -0
  175. package/rust/core/plugin/runner.rs +347 -0
  176. package/rust/core/preprocessor/loader.rs +637 -193
  177. package/rust/core/preprocessor/mod.rs +4 -4
  178. package/rust/core/preprocessor/module.rs +60 -50
  179. package/rust/core/preprocessor/processor.rs +114 -76
  180. package/rust/core/preprocessor/resolver/bank.rs +49 -47
  181. package/rust/core/preprocessor/resolver/call.rs +124 -123
  182. package/rust/core/preprocessor/resolver/condition.rs +95 -92
  183. package/rust/core/preprocessor/resolver/driver.rs +324 -227
  184. package/rust/core/preprocessor/resolver/function.rs +69 -0
  185. package/rust/core/preprocessor/resolver/group.rs +94 -61
  186. package/rust/core/preprocessor/resolver/let_.rs +32 -31
  187. package/rust/core/preprocessor/resolver/loop_.rs +318 -91
  188. package/rust/core/preprocessor/resolver/mod.rs +16 -14
  189. package/rust/core/preprocessor/resolver/pattern.rs +83 -0
  190. package/rust/core/preprocessor/resolver/spawn.rs +99 -58
  191. package/rust/core/preprocessor/resolver/synth.rs +54 -50
  192. package/rust/core/preprocessor/resolver/tempo.rs +48 -49
  193. package/rust/core/preprocessor/resolver/trigger.rs +116 -112
  194. package/rust/core/preprocessor/resolver/value.rs +176 -78
  195. package/rust/core/store/export.rs +28 -28
  196. package/rust/core/store/function.rs +40 -0
  197. package/rust/core/store/global.rs +61 -39
  198. package/rust/core/store/import.rs +28 -28
  199. package/rust/core/store/mod.rs +5 -4
  200. package/rust/core/store/variable.rs +51 -28
  201. package/rust/core/utils/mod.rs +1 -2
  202. package/rust/core/utils/path.rs +37 -31
  203. package/rust/lib.rs +308 -117
  204. package/rust/main.rs +364 -65
  205. package/rust/types/Cargo.toml +11 -0
  206. package/rust/types/src/addons.rs +55 -0
  207. package/rust/types/src/ast.rs +202 -0
  208. package/rust/types/src/config.rs +74 -0
  209. package/rust/types/src/lib.rs +12 -0
  210. package/rust/types/src/telemetry.rs +85 -0
  211. package/rust/utils/Cargo.toml +26 -0
  212. package/rust/utils/src/error.rs +186 -0
  213. package/rust/utils/src/file.rs +94 -0
  214. package/rust/utils/src/first_usage.rs +97 -0
  215. package/rust/utils/{mod.rs → src/lib.rs} +9 -6
  216. package/rust/utils/{logger.rs → src/logger.rs} +200 -123
  217. package/rust/utils/src/path.rs +88 -0
  218. package/rust/utils/src/signature.rs +41 -0
  219. package/rust/utils/{spinner.rs → src/spinner.rs} +20 -21
  220. package/rust/utils/src/version.rs +27 -0
  221. package/rust/utils/{watcher.rs → src/watcher.rs} +46 -33
  222. package/rust/web/api.rs +5 -0
  223. package/rust/web/cdn.rs +34 -0
  224. package/rust/web/mod.rs +3 -0
  225. package/rust/web/sso.rs +5 -0
  226. package/templates/minimal/README.md +143 -127
  227. package/templates/welcome/README.md +143 -127
  228. package/templates/welcome/src/index.deva +56 -8
  229. package/templates/welcome/src/variables.deva +2 -4
  230. package/tests/integration.rs +21 -0
  231. package/tests/rust/cli_check_build.rs +21 -0
  232. package/tests/rust/cli_help.rs +12 -0
  233. package/tests/rust/cli_template_list.rs +10 -0
  234. package/tests/rust/cli_version.rs +11 -0
  235. package/tests/typescript/index.spec.ts +136 -0
  236. package/tests/typescript/playhead.spec.ts +36 -0
  237. package/tests/typescript/render_e2e.spec.ts +77 -0
  238. package/tsconfig.json +12 -10
  239. package/typescript/bin/index.ts +19 -5
  240. package/typescript/core/functions/index.ts +83 -0
  241. package/typescript/core/index.ts +6 -0
  242. package/typescript/core/types/index.ts +4 -0
  243. package/typescript/core/types/plugin.ts +19 -0
  244. package/typescript/core/types/result.ts +29 -0
  245. package/typescript/core/types/statement.ts +47 -0
  246. package/typescript/core/types/value.ts +29 -0
  247. package/typescript/index.ts +8 -1
  248. package/typescript/pkg/devalang_core.d.ts +4 -0
  249. package/typescript/pkg/devalang_core.ts +49 -0
  250. package/typescript/scripts/copy-wasm-dts.ts +41 -0
  251. package/typescript/scripts/postinstall.ts +85 -0
  252. package/typescript/scripts/version/bump.ts +0 -1
  253. package/typescript/scripts/version/index.ts +0 -1
  254. package/docs/COMMANDS.md +0 -85
  255. package/docs/CONFIG.md +0 -30
  256. package/docs/SYNTAX.md +0 -210
  257. package/out-tsc/bin/devalang.exe +0 -0
  258. package/out-tsc/scripts/postbuild.js +0 -11
  259. package/rust/cli/build.rs +0 -137
  260. package/rust/cli/check.rs +0 -117
  261. package/rust/cli/play.rs +0 -193
  262. package/rust/config/loader.rs +0 -13
  263. package/rust/core/audio/engine.rs +0 -203
  264. package/rust/core/shared/duration.rs +0 -8
  265. package/rust/core/shared/mod.rs +0 -2
  266. package/rust/core/shared/value.rs +0 -18
  267. package/rust/core/utils/validation.rs +0 -37
  268. package/rust/utils/file.rs +0 -35
  269. package/rust/utils/signature.rs +0 -17
  270. package/rust/utils/version.rs +0 -15
  271. package/typescript/scripts/postbuild.ts +0 -8
@@ -0,0 +1,15 @@
1
+ # This file demonstrates the use of main features in Devalang.
2
+ bpm 135
3
+
4
+ bank devaloop.808 as myBank
5
+
6
+ let entityTest1 = .myBank.kick auto
7
+ let entityTest2 = .myBank.clap auto
8
+ let entityTest3 = .myBank.snare auto
9
+
10
+ fn myFirstGroup(entity1, entity2, entity3):
11
+ .entity1
12
+ .entity2
13
+ .entity3
14
+
15
+ call myFirstGroup(entityTest1, entityTest2, entityTest3)
@@ -1,18 +1,63 @@
1
- # This file demonstrates the use of main features in Devalang.
1
+ # This file demonstrates general use cases of Devalang.
2
2
 
3
- @import { duration, default_bank, params, loopCount, tempo } from "./variables.deva"
4
- @import { myLead } from "./synth.deva"
5
- @import { myLoop } from "./loop.deva"
3
+ # BPM definition
4
+ bpm 125
6
5
 
7
- @load "./samples/kick-808.wav" as kickCustom
8
- @load "./samples/hat-808.wav" as hatCustom
6
+ # Bank picking (make sure you've installed it)
7
+ bank devaloop.808 as my808Bank
9
8
 
10
- bpm tempo
9
+ # Pattern literal without options
10
+ pattern kickPattern with my808Bank.kick = "x--- x--- x--- x---"
11
11
 
12
- bank default_bank
12
+ group myGroup:
13
+ # Rhythmic (each beat playing a kick)
14
+ # on beat:
15
+ # .my808Bank.kick 1/4
13
16
 
14
- group myTrack:
15
- spawn myLoop
16
- spawn myLead
17
+ # Synth definition with ADSR
18
+ let myLead = synth sine {
19
+ attack: 0,
20
+ decay: 100,
21
+ sustain: 100,
22
+ release: 100
23
+ }
17
24
 
18
- call myTrack
25
+ # Global automation
26
+ automate myLead:
27
+ param volume {
28
+ 0% = 0.0
29
+ 100% = 0.5
30
+ }
31
+ param pitch {
32
+ 0% = -12.0
33
+ 100% = 12.0
34
+ }
35
+
36
+ # Notes in a loop with condition
37
+ for i in [1, 2, 3]:
38
+ if i == 3:
39
+ myLead -> note(C5, { duration: 200 })
40
+ print "Playing note C5 for " + i
41
+
42
+ # Pause runtime for 500ms
43
+ sleep 500
44
+
45
+ # Note with automation
46
+ myLead -> note(C4, {
47
+ duration: 400,
48
+ velocity: 0.8,
49
+ automate: {
50
+ pan: {
51
+ 0%: -1.0,
52
+ 100%: 0.0
53
+ }
54
+ }
55
+ })
56
+
57
+ # Notes with params
58
+ myLead -> note(G4, { duration: 600, glide: true, target_freq: 659.25 })
59
+ myLead -> note(B3, { duration: 400, slide: true, target_amp: 0.3 })
60
+
61
+ # Spawning the group & the pattern to play them in parallel
62
+ spawn myGroup
63
+ spawn kickPattern
@@ -1,17 +1,10 @@
1
- # This file demonstrates the use of a loop in Devalang.
2
-
3
- @import { duration, default_bank, params, loopCount, tempo } from "./variables.deva"
4
-
5
- @load "./samples/kick-808.wav" as kickCustom
6
- @load "./samples/hat-808.wav" as hatCustom
1
+ # This file demonstrates the use of loops in Devalang.
7
2
 
8
3
  group myLoop:
9
- loop loopCount:
10
- .kickCustom duration params
11
-
12
- # Uncomment the next line (.hat) while executing "play" command
13
- # with `--repeat` option to see magic happen !
4
+ for i in [1, 2, 3]:
5
+ print "looping with for" + i
14
6
 
15
- .hatCustom duration params
7
+ loop 3:
8
+ print "looping with loop"
16
9
 
17
10
  @export { myLoop }
@@ -0,0 +1,8 @@
1
+ # This file demonstrates the usage of patterns in Devaloop
2
+
3
+ bank devaloop.808 as my808
4
+
5
+ # Pattern literal without options
6
+ pattern kickPattern with my808.kick = "x--- x--- x--- x---"
7
+
8
+ call kickPattern
@@ -0,0 +1,16 @@
1
+ # This is an example of using a plugin in Devalang.
2
+ # Make sure you have the plugin installed in your Devaloop application. (devalang install plugin <author>.<plugin_name>)
3
+
4
+ @use devaloop.acid as acidPlugin
5
+
6
+ let acidSynth = synth acidPlugin.synth {
7
+ waveform: "saw",
8
+ accent: 0.1,
9
+ decay: 250
10
+ }
11
+
12
+ group mySynthGroup:
13
+ acidSynth -> note(C4, { duration: 600 })
14
+ acidSynth -> note(E4, { duration: 600 })
15
+
16
+ call mySynthGroup
@@ -1,7 +1,7 @@
1
1
  # This file only exports variables for use in other files.
2
2
 
3
3
  let duration = auto
4
- let default_bank = 808
4
+ let default_bank = devaloop.808
5
5
  let params = { decay: 10, delay: 30 }
6
6
  let loopCount = 5
7
7
  let tempo = 115
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -1,13 +1,57 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
- var __importDefault = (this && this.__importDefault) || function (mod) {
4
- return (mod && mod.__esModule) ? mod : { "default": mod };
5
- };
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
6
36
  Object.defineProperty(exports, "__esModule", { value: true });
7
37
  const child_process_1 = require("child_process");
8
- const path_1 = __importDefault(require("path"));
9
- const binaryPath = path_1.default.join(__dirname, "devalang.exe");
10
- const subCommand = process.argv[2] || "help";
38
+ const path = __importStar(require("path"));
39
+ let binaryName;
40
+ switch (process.platform) {
41
+ case "win32":
42
+ binaryName = "devalang-x86_64-pc-windows-msvc.exe";
43
+ break;
44
+ case "darwin":
45
+ binaryName = "devalang-x86_64-apple-darwin";
46
+ break;
47
+ case "linux":
48
+ binaryName = "devalang-x86_64-unknown-linux-gnu";
49
+ break;
50
+ default:
51
+ console.error(`Unsupported platform: ${process.platform}`);
52
+ process.exit(1);
53
+ }
54
+ const binaryPath = path.join(__dirname, binaryName);
11
55
  const args = process.argv.slice(2);
12
56
  const child = (0, child_process_1.spawn)(binaryPath, args, { stdio: "inherit" });
13
- child.on("exit", (code) => process.exit(code));
57
+ child.on("exit", (code) => process.exit(code !== null && code !== void 0 ? code : 1));
@@ -0,0 +1,37 @@
1
+ import { ParseResult } from "../types/result";
2
+ import { DebugResult } from "../types/result";
3
+ /**
4
+ * Parses the user code.
5
+ * @param entry_path The entry path for the code.
6
+ * @param source The source code to parse.
7
+ * @returns ParseResult | any
8
+ */
9
+ export declare function parse(entry_path: string, source: string): ParseResult | any;
10
+ /**
11
+ * Renders the debug information for the user code.
12
+ * @param user_code The user-provided code to render debug information for.
13
+ * @returns DebugResult | any
14
+ */
15
+ export declare function debug_render(user_code: string): DebugResult | any;
16
+ /**
17
+ * Renders audio from the user code.
18
+ * @param user_code The user-provided code to render audio from.
19
+ * @returns Float32Array
20
+ */
21
+ export declare function render_audio(user_code: string): Float32Array;
22
+ /**
23
+ * Register a JS callback to receive playhead events { time, line, column } during playback.
24
+ * The callback will be called with a single object argument.
25
+ * @param cb The callback function to register.
26
+ * @returns void
27
+ */
28
+ export declare function register_playhead_callback(cb: (ev: {
29
+ time: number;
30
+ line: number;
31
+ column: number;
32
+ }) => void): any;
33
+ /**
34
+ * Unregisters the JS callback for playhead events.
35
+ * @returns void
36
+ */
37
+ export declare function unregister_playhead_callback(): any;
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parse = parse;
4
+ exports.debug_render = debug_render;
5
+ exports.render_audio = render_audio;
6
+ exports.register_playhead_callback = register_playhead_callback;
7
+ exports.unregister_playhead_callback = unregister_playhead_callback;
8
+ let wasmPkg = undefined;
9
+ try {
10
+ // prefer runtime pkg generated by wasm-pack when available
11
+ // require at runtime so the package can be used even if wasm hasn't been built
12
+ // (this keeps tests and consumers robust).
13
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
14
+ wasmPkg = require("../../pkg/devalang_core");
15
+ }
16
+ catch (_e) {
17
+ wasmPkg = undefined;
18
+ }
19
+ /**
20
+ * Parses the user code.
21
+ * @param entry_path The entry path for the code.
22
+ * @param source The source code to parse.
23
+ * @returns ParseResult | any
24
+ */
25
+ function parse(entry_path, source) {
26
+ if (wasmPkg && typeof wasmPkg.parse === "function") {
27
+ return wasmPkg.parse(entry_path, source);
28
+ }
29
+ throw new Error("WASM binding 'parse' not available. Build the wasm package or use the JS runtime.");
30
+ }
31
+ /**
32
+ * Renders the debug information for the user code.
33
+ * @param user_code The user-provided code to render debug information for.
34
+ * @returns DebugResult | any
35
+ */
36
+ function debug_render(user_code) {
37
+ if (wasmPkg && typeof wasmPkg.debug_render === "function") {
38
+ return wasmPkg.debug_render(user_code);
39
+ }
40
+ throw new Error("WASM binding 'debug_render' not available. Build the wasm package or use the JS runtime.");
41
+ }
42
+ /**
43
+ * Renders audio from the user code.
44
+ * @param user_code The user-provided code to render audio from.
45
+ * @returns Float32Array
46
+ */
47
+ function render_audio(user_code) {
48
+ if (wasmPkg && typeof wasmPkg.render_audio === "function") {
49
+ return wasmPkg.render_audio(user_code);
50
+ }
51
+ // Fallback: indicate missing wasm with an empty buffer rather than breaking consumers.
52
+ return new Float32Array(0);
53
+ }
54
+ /**
55
+ * Register a JS callback to receive playhead events { time, line, column } during playback.
56
+ * The callback will be called with a single object argument.
57
+ * @param cb The callback function to register.
58
+ * @returns void
59
+ */
60
+ function register_playhead_callback(cb) {
61
+ if (wasmPkg && typeof wasmPkg.register_playhead_callback === "function") {
62
+ return wasmPkg.register_playhead_callback(cb);
63
+ }
64
+ // no-op fallback
65
+ return;
66
+ }
67
+ /**
68
+ * Unregisters the JS callback for playhead events.
69
+ * @returns void
70
+ */
71
+ function unregister_playhead_callback() {
72
+ if (wasmPkg && typeof wasmPkg.unregister_playhead_callback === "function") {
73
+ return wasmPkg.unregister_playhead_callback();
74
+ }
75
+ return;
76
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Core functionality for the Devalang language.
3
+ * This module exports all the core types and functions used in the language.
4
+ */
5
+ export * from "./types/index";
6
+ export * from "./functions/index";
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ /**
18
+ * Core functionality for the Devalang language.
19
+ * This module exports all the core types and functions used in the language.
20
+ */
21
+ __exportStar(require("./types/index"), exports);
22
+ __exportStar(require("./functions/index"), exports);
@@ -0,0 +1,4 @@
1
+ export * from "./result";
2
+ export * from "./statement";
3
+ export * from "./value";
4
+ export * from "./plugin";
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./result"), exports);
18
+ __exportStar(require("./statement"), exports);
19
+ __exportStar(require("./value"), exports);
20
+ __exportStar(require("./plugin"), exports);
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Represents a plugin export.
3
+ */
4
+ export interface PluginExport {
5
+ name: string;
6
+ kind: string;
7
+ default?: any;
8
+ }
9
+ /**
10
+ * Represents a plugin.
11
+ */
12
+ export interface PluginInfo {
13
+ author: string;
14
+ name: string;
15
+ version?: string;
16
+ description?: string;
17
+ exports: PluginExport[];
18
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Represents an error that occurred during parsing.
3
+ */
4
+ export interface ErrorResult {
5
+ message: string;
6
+ line: number;
7
+ column: number;
8
+ }
9
+ /**
10
+ * Represents the result of parsing user code.
11
+ */
12
+ export interface ParseResult {
13
+ ok: boolean;
14
+ ast: string;
15
+ errors: ErrorResult[];
16
+ }
17
+ /**
18
+ * Represents the result of debugging user code.
19
+ */
20
+ export interface DebugResult {
21
+ samples_len: number;
22
+ any_nonzero: boolean;
23
+ ast: string;
24
+ note_count: number;
25
+ global_vars: string[];
26
+ statements_count: number;
27
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,106 @@
1
+ import { Value, Duration } from "./value";
2
+ /**
3
+ * Represents a statement kind in the code.
4
+ */
5
+ export type StatementKind = {
6
+ kind: "Tempo";
7
+ } | {
8
+ kind: "Bank";
9
+ alias?: string;
10
+ } | {
11
+ kind: "Print";
12
+ } | {
13
+ kind: "Load";
14
+ source: string;
15
+ alias: string;
16
+ } | {
17
+ kind: "Use";
18
+ name: string;
19
+ alias?: string;
20
+ } | {
21
+ kind: "Let";
22
+ name: string;
23
+ } | {
24
+ kind: "Automate";
25
+ target: string;
26
+ } | {
27
+ kind: "ArrowCall";
28
+ target: string;
29
+ method: string;
30
+ args: Value[];
31
+ } | {
32
+ kind: "Function";
33
+ name: string;
34
+ parameters: string[];
35
+ body: Statement[];
36
+ } | {
37
+ kind: "Synth";
38
+ } | {
39
+ kind: "Trigger";
40
+ entity: string;
41
+ duration: Duration;
42
+ effects?: Value;
43
+ } | {
44
+ kind: "Sleep";
45
+ } | {
46
+ kind: "Call";
47
+ name: string;
48
+ args: Value[];
49
+ } | {
50
+ kind: "Spawn";
51
+ name: string;
52
+ args: Value[];
53
+ } | {
54
+ kind: "Loop";
55
+ } | {
56
+ kind: "Group";
57
+ } | {
58
+ kind: "Include";
59
+ path: string;
60
+ } | {
61
+ kind: "Export";
62
+ names: string[];
63
+ source: string;
64
+ } | {
65
+ kind: "Import";
66
+ names: string[];
67
+ source: string;
68
+ } | {
69
+ kind: "If";
70
+ } | {
71
+ kind: "Else";
72
+ } | {
73
+ kind: "ElseIf";
74
+ } | {
75
+ kind: "Comment";
76
+ } | {
77
+ kind: "Indent";
78
+ } | {
79
+ kind: "Dedent";
80
+ } | {
81
+ kind: "NewLine";
82
+ } | {
83
+ kind: "On";
84
+ event: string;
85
+ args?: Value[];
86
+ body: Statement[];
87
+ } | {
88
+ kind: "Emit";
89
+ event: string;
90
+ payload?: Value;
91
+ } | {
92
+ kind: "Unknown";
93
+ } | {
94
+ kind: "Error";
95
+ message: string;
96
+ };
97
+ /**
98
+ * Represents a statement in the code.
99
+ */
100
+ export interface Statement {
101
+ kind: StatementKind;
102
+ value: Value;
103
+ indent: number;
104
+ line: number;
105
+ column: number;
106
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,43 @@
1
+ import { Statement } from "./statement";
2
+ /**
3
+ * Represents a duration in the code.
4
+ */
5
+ export type Duration = {
6
+ Number: number;
7
+ } | {
8
+ Identifier: string;
9
+ } | {
10
+ Beat: string;
11
+ } | {
12
+ Auto: null;
13
+ };
14
+ /**
15
+ * Represents a value in the code.
16
+ */
17
+ export type Value = {
18
+ Boolean: boolean;
19
+ } | {
20
+ Number: number;
21
+ } | {
22
+ Duration: Duration;
23
+ } | {
24
+ Identifier: string;
25
+ } | {
26
+ String: string;
27
+ } | {
28
+ Array: Value[];
29
+ } | {
30
+ Map: Record<string, Value>;
31
+ } | {
32
+ Block: Statement[];
33
+ } | {
34
+ Sample: string;
35
+ } | {
36
+ Beat: string;
37
+ } | {
38
+ Statement: Statement;
39
+ } | {
40
+ StatementKind: any;
41
+ } | {
42
+ Unknown: null;
43
+ } | null;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Public TypeScript definitions for Devalang.
3
+ * ————————————————————————————————————————
4
+ * Used to provide TypeScript types for the Devalang WASM package.
5
+ */
6
+ export * as pkg from "./pkg/devalang_core";
7
+ export * as core from "./core/index";
package/out-tsc/index.js CHANGED
@@ -1,2 +1,43 @@
1
1
  "use strict";
2
- // This file is part of the Devalang project
2
+ /**
3
+ * Public TypeScript definitions for Devalang.
4
+ * ————————————————————————————————————————
5
+ * Used to provide TypeScript types for the Devalang WASM package.
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.core = exports.pkg = void 0;
42
+ exports.pkg = __importStar(require("./pkg/devalang_core"));
43
+ exports.core = __importStar(require("./core/index"));
@@ -0,0 +1,13 @@
1
+ export declare function parse(...args: any[]): any;
2
+ export declare function debug_render(...args: any[]): any;
3
+ export declare function render_audio(...args: any[]): any;
4
+ export declare function register_playhead_callback(cb?: any): any;
5
+ export declare function unregister_playhead_callback(): any;
6
+ declare const pkg: {
7
+ parse: typeof parse;
8
+ debug_render: typeof debug_render;
9
+ render_audio: typeof render_audio;
10
+ register_playhead_callback: typeof register_playhead_callback;
11
+ unregister_playhead_callback: typeof unregister_playhead_callback;
12
+ };
13
+ export default pkg;