redscript-mc 1.2.30 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (593) hide show
  1. package/.claudeignore +21 -0
  2. package/.github/workflows/ci.yml +1 -0
  3. package/README.md +12 -16
  4. package/README.zh.md +2 -2
  5. package/demo.gif +0 -0
  6. package/dist/cli.js +2 -554
  7. package/dist/compile.js +2 -266
  8. package/dist/index.js +2 -159
  9. package/dist/src/__tests__/budget.test.js +261 -0
  10. package/dist/src/__tests__/cli.test.js +104 -0
  11. package/dist/{__tests__ → src/__tests__}/dce.test.js +11 -47
  12. package/dist/{__tests__ → src/__tests__}/diagnostics.test.js +67 -40
  13. package/dist/src/__tests__/e2e/basic.test.d.ts +8 -0
  14. package/dist/src/__tests__/e2e/basic.test.js +140 -0
  15. package/dist/src/__tests__/e2e/coroutine.test.d.ts +7 -0
  16. package/dist/src/__tests__/e2e/coroutine.test.js +132 -0
  17. package/dist/src/__tests__/e2e/macros.test.d.ts +9 -0
  18. package/dist/src/__tests__/e2e/macros.test.js +182 -0
  19. package/dist/src/__tests__/e2e/migrate.test.d.ts +13 -0
  20. package/dist/src/__tests__/e2e/migrate.test.js +2739 -0
  21. package/dist/src/__tests__/e2e/stdlib-e2e.test.d.ts +10 -0
  22. package/dist/src/__tests__/e2e/stdlib-e2e.test.js +324 -0
  23. package/dist/src/__tests__/enum.test.d.ts +10 -0
  24. package/dist/src/__tests__/enum.test.js +389 -0
  25. package/dist/src/__tests__/generics.test.d.ts +14 -0
  26. package/dist/src/__tests__/generics.test.js +367 -0
  27. package/dist/src/__tests__/hir/desugar.test.js +234 -0
  28. package/dist/src/__tests__/incremental.test.d.ts +5 -0
  29. package/dist/src/__tests__/incremental.test.js +308 -0
  30. package/dist/src/__tests__/lir/lower.test.js +559 -0
  31. package/dist/src/__tests__/lir/types.test.js +185 -0
  32. package/dist/src/__tests__/lir/verify.test.js +221 -0
  33. package/dist/src/__tests__/lsp.test.d.ts +7 -0
  34. package/dist/src/__tests__/lsp.test.js +245 -0
  35. package/dist/{__tests__ → src/__tests__}/mc-integration.test.js +1 -3
  36. package/dist/src/__tests__/mc-version.test.d.ts +10 -0
  37. package/dist/src/__tests__/mc-version.test.js +154 -0
  38. package/dist/src/__tests__/mir/arithmetic.test.js +130 -0
  39. package/dist/src/__tests__/mir/control-flow.test.js +205 -0
  40. package/dist/src/__tests__/mir/verify.test.js +223 -0
  41. package/dist/src/__tests__/modules.test.d.ts +7 -0
  42. package/dist/src/__tests__/modules.test.js +333 -0
  43. package/dist/src/__tests__/optimizer/block_merge.test.js +78 -0
  44. package/dist/src/__tests__/optimizer/branch_simplify.test.js +58 -0
  45. package/dist/src/__tests__/optimizer/constant_fold.test.js +131 -0
  46. package/dist/src/__tests__/optimizer/copy_prop.test.js +91 -0
  47. package/dist/src/__tests__/optimizer/coroutine.test.d.ts +12 -0
  48. package/dist/src/__tests__/optimizer/coroutine.test.js +251 -0
  49. package/dist/src/__tests__/optimizer/dce.test.d.ts +1 -0
  50. package/dist/src/__tests__/optimizer/dce.test.js +76 -0
  51. package/dist/src/__tests__/optimizer/interprocedural.test.d.ts +1 -0
  52. package/dist/src/__tests__/optimizer/interprocedural.test.js +145 -0
  53. package/dist/src/__tests__/optimizer/lir/const_imm.test.d.ts +1 -0
  54. package/dist/src/__tests__/optimizer/lir/const_imm.test.js +138 -0
  55. package/dist/src/__tests__/optimizer/lir/dead_slot.test.d.ts +1 -0
  56. package/dist/src/__tests__/optimizer/lir/dead_slot.test.js +141 -0
  57. package/dist/src/__tests__/optimizer/lir/peephole.test.d.ts +1 -0
  58. package/dist/src/__tests__/optimizer/lir/peephole.test.js +126 -0
  59. package/dist/src/__tests__/optimizer/lir/pipeline.test.d.ts +1 -0
  60. package/dist/src/__tests__/optimizer/lir/pipeline.test.js +84 -0
  61. package/dist/src/__tests__/optimizer/nbt-batch.test.d.ts +1 -0
  62. package/dist/src/__tests__/optimizer/nbt-batch.test.js +110 -0
  63. package/dist/src/__tests__/optimizer/pipeline.test.d.ts +1 -0
  64. package/dist/src/__tests__/optimizer/pipeline.test.js +102 -0
  65. package/dist/src/__tests__/optimizer/selector-cache.test.d.ts +1 -0
  66. package/dist/src/__tests__/optimizer/selector-cache.test.js +103 -0
  67. package/dist/src/__tests__/optimizer/unroll.test.d.ts +1 -0
  68. package/dist/src/__tests__/optimizer/unroll.test.js +206 -0
  69. package/dist/src/__tests__/option.test.d.ts +14 -0
  70. package/dist/src/__tests__/option.test.js +275 -0
  71. package/dist/src/__tests__/parser.test.d.ts +1 -0
  72. package/dist/src/__tests__/repl.test.d.ts +1 -0
  73. package/dist/src/__tests__/schedule.test.d.ts +7 -0
  74. package/dist/src/__tests__/schedule.test.js +98 -0
  75. package/dist/src/__tests__/sourcemap.test.d.ts +7 -0
  76. package/dist/src/__tests__/sourcemap.test.js +227 -0
  77. package/dist/src/__tests__/tuple.test.d.ts +11 -0
  78. package/dist/src/__tests__/tuple.test.js +202 -0
  79. package/dist/src/__tests__/typechecker-strict.test.d.ts +10 -0
  80. package/dist/src/__tests__/typechecker-strict.test.js +197 -0
  81. package/dist/src/__tests__/typechecker.test.d.ts +1 -0
  82. package/dist/{ast → src/ast}/types.d.ts +58 -3
  83. package/dist/src/cache/deps.d.ts +41 -0
  84. package/dist/src/cache/deps.js +158 -0
  85. package/dist/src/cache/incremental.d.ts +35 -0
  86. package/dist/src/cache/incremental.js +165 -0
  87. package/dist/src/cache/index.d.ts +37 -0
  88. package/dist/src/cache/index.js +152 -0
  89. package/dist/{cli.d.ts → src/cli.d.ts} +1 -1
  90. package/dist/src/cli.js +474 -0
  91. package/dist/src/compile.d.ts +37 -0
  92. package/dist/src/compile.js +165 -0
  93. package/dist/{diagnostics → src/diagnostics}/index.d.ts +1 -1
  94. package/dist/{diagnostics → src/diagnostics}/index.js +8 -11
  95. package/dist/src/emit/compile.d.ts +29 -0
  96. package/dist/src/emit/compile.js +143 -0
  97. package/dist/src/emit/index.d.ts +26 -0
  98. package/dist/src/emit/index.js +223 -0
  99. package/dist/src/emit/modules.d.ts +29 -0
  100. package/dist/src/emit/modules.js +492 -0
  101. package/dist/src/emit/sourcemap.d.ts +53 -0
  102. package/dist/src/emit/sourcemap.js +73 -0
  103. package/dist/src/hir/lower.d.ts +15 -0
  104. package/dist/src/hir/lower.js +399 -0
  105. package/dist/src/hir/monomorphize.d.ts +22 -0
  106. package/dist/src/hir/monomorphize.js +379 -0
  107. package/dist/src/hir/types.d.ts +406 -0
  108. package/dist/src/hir/types.js +16 -0
  109. package/dist/src/index.d.ts +39 -0
  110. package/dist/src/index.js +67 -0
  111. package/dist/{lexer → src/lexer}/index.d.ts +1 -1
  112. package/dist/{lexer → src/lexer}/index.js +1 -0
  113. package/dist/src/lir/budget.d.ts +37 -0
  114. package/dist/src/lir/budget.js +280 -0
  115. package/dist/src/lir/lower.d.ts +15 -0
  116. package/dist/src/lir/lower.js +472 -0
  117. package/dist/src/lir/types.d.ts +139 -0
  118. package/dist/src/lir/types.js +11 -0
  119. package/dist/src/lir/verify.d.ts +14 -0
  120. package/dist/src/lir/verify.js +113 -0
  121. package/dist/src/lsp/main.d.ts +8 -0
  122. package/dist/src/lsp/main.js +11 -0
  123. package/dist/src/lsp/server.d.ts +11 -0
  124. package/dist/src/lsp/server.js +352 -0
  125. package/dist/{mc-test → src/mc-test}/runner.js +4 -3
  126. package/dist/src/mir/lower.d.ts +9 -0
  127. package/dist/src/mir/lower.js +1264 -0
  128. package/dist/src/mir/macro.d.ts +22 -0
  129. package/dist/src/mir/macro.js +168 -0
  130. package/dist/src/mir/types.d.ts +191 -0
  131. package/dist/src/mir/types.js +11 -0
  132. package/dist/src/mir/verify.d.ts +16 -0
  133. package/dist/src/mir/verify.js +216 -0
  134. package/dist/src/optimizer/block_merge.d.ts +12 -0
  135. package/dist/src/optimizer/block_merge.js +84 -0
  136. package/dist/src/optimizer/branch_simplify.d.ts +9 -0
  137. package/dist/src/optimizer/branch_simplify.js +28 -0
  138. package/dist/src/optimizer/constant_fold.d.ts +10 -0
  139. package/dist/src/optimizer/constant_fold.js +85 -0
  140. package/dist/src/optimizer/copy_prop.d.ts +9 -0
  141. package/dist/src/optimizer/copy_prop.js +113 -0
  142. package/dist/src/optimizer/coroutine.d.ts +34 -0
  143. package/dist/src/optimizer/coroutine.js +789 -0
  144. package/dist/src/optimizer/dce.d.ts +8 -0
  145. package/dist/src/optimizer/dce.js +156 -0
  146. package/dist/src/optimizer/interprocedural.d.ts +14 -0
  147. package/dist/src/optimizer/interprocedural.js +186 -0
  148. package/dist/src/optimizer/lir/const_imm.d.ts +12 -0
  149. package/dist/src/optimizer/lir/const_imm.js +139 -0
  150. package/dist/src/optimizer/lir/dead_slot.d.ts +14 -0
  151. package/dist/src/optimizer/lir/dead_slot.js +130 -0
  152. package/dist/src/optimizer/lir/peephole.d.ts +21 -0
  153. package/dist/src/optimizer/lir/peephole.js +52 -0
  154. package/dist/src/optimizer/lir/pipeline.d.ts +10 -0
  155. package/dist/src/optimizer/lir/pipeline.js +34 -0
  156. package/dist/src/optimizer/nbt-batch.d.ts +11 -0
  157. package/dist/src/optimizer/nbt-batch.js +51 -0
  158. package/dist/src/optimizer/pipeline.d.ts +14 -0
  159. package/dist/src/optimizer/pipeline.js +58 -0
  160. package/dist/src/optimizer/selector-cache.d.ts +22 -0
  161. package/dist/src/optimizer/selector-cache.js +100 -0
  162. package/dist/src/optimizer/unroll.d.ts +32 -0
  163. package/dist/src/optimizer/unroll.js +348 -0
  164. package/dist/{parser → src/parser}/index.d.ts +8 -0
  165. package/dist/{parser → src/parser}/index.js +204 -14
  166. package/dist/{repl.d.ts → src/repl.d.ts} +1 -1
  167. package/dist/{runtime → src/runtime}/index.js +1 -1
  168. package/dist/{typechecker → src/typechecker}/index.d.ts +4 -0
  169. package/dist/{typechecker → src/typechecker}/index.js +198 -13
  170. package/dist/src/types/mc-version.d.ts +24 -0
  171. package/dist/src/types/mc-version.js +49 -0
  172. package/docs/ROADMAP.md +395 -0
  173. package/docs/compiler-pipeline-redesign.md +2260 -0
  174. package/docs/optimization-ideas.md +1076 -0
  175. package/editors/vscode/out/extension.js +25176 -8000
  176. package/editors/vscode/package-lock.json +90 -6
  177. package/editors/vscode/package.json +3 -2
  178. package/editors/vscode/src/extension.ts +97 -67
  179. package/examples/showcase.mcrs +3 -3
  180. package/package.json +13 -6
  181. package/scripts/postbuild.js +15 -0
  182. package/src/__tests__/budget.test.ts +297 -0
  183. package/src/__tests__/cli.test.ts +8 -220
  184. package/src/__tests__/dce.test.ts +11 -56
  185. package/src/__tests__/diagnostics.test.ts +61 -41
  186. package/src/__tests__/e2e/basic.test.ts +154 -0
  187. package/src/__tests__/e2e/coroutine.test.ts +142 -0
  188. package/src/__tests__/e2e/macros.test.ts +199 -0
  189. package/src/__tests__/e2e/migrate.test.ts +3008 -0
  190. package/src/__tests__/e2e/stdlib-e2e.test.ts +348 -0
  191. package/src/__tests__/enum.test.ts +425 -0
  192. package/src/__tests__/generics.test.ts +390 -0
  193. package/src/__tests__/hir/desugar.test.ts +263 -0
  194. package/src/__tests__/incremental.test.ts +337 -0
  195. package/src/__tests__/lir/lower.test.ts +619 -0
  196. package/src/__tests__/lir/types.test.ts +207 -0
  197. package/src/__tests__/lir/verify.test.ts +249 -0
  198. package/src/__tests__/lsp.test.ts +270 -0
  199. package/src/__tests__/mc-integration.test.ts +1 -2
  200. package/src/__tests__/mc-version.test.ts +178 -0
  201. package/src/__tests__/mir/arithmetic.test.ts +156 -0
  202. package/src/__tests__/mir/control-flow.test.ts +242 -0
  203. package/src/__tests__/mir/verify.test.ts +254 -0
  204. package/src/__tests__/modules.test.ts +365 -0
  205. package/src/__tests__/optimizer/block_merge.test.ts +84 -0
  206. package/src/__tests__/optimizer/branch_simplify.test.ts +64 -0
  207. package/src/__tests__/optimizer/constant_fold.test.ts +145 -0
  208. package/src/__tests__/optimizer/copy_prop.test.ts +99 -0
  209. package/src/__tests__/optimizer/coroutine.test.ts +312 -0
  210. package/src/__tests__/optimizer/dce.test.ts +83 -0
  211. package/src/__tests__/optimizer/interprocedural.test.ts +174 -0
  212. package/src/__tests__/optimizer/lir/const_imm.test.ts +151 -0
  213. package/src/__tests__/optimizer/lir/dead_slot.test.ts +156 -0
  214. package/src/__tests__/optimizer/lir/peephole.test.ts +136 -0
  215. package/src/__tests__/optimizer/lir/pipeline.test.ts +113 -0
  216. package/src/__tests__/optimizer/nbt-batch.test.ts +119 -0
  217. package/src/__tests__/optimizer/pipeline.test.ts +116 -0
  218. package/src/__tests__/optimizer/selector-cache.test.ts +112 -0
  219. package/src/__tests__/optimizer/unroll.test.ts +231 -0
  220. package/src/__tests__/option.test.ts +299 -0
  221. package/src/__tests__/schedule.test.ts +105 -0
  222. package/src/__tests__/sourcemap.test.ts +254 -0
  223. package/src/__tests__/tuple.test.ts +220 -0
  224. package/src/__tests__/typechecker-strict.test.ts +216 -0
  225. package/src/ast/types.ts +39 -3
  226. package/src/cache/deps.ts +132 -0
  227. package/src/cache/incremental.ts +173 -0
  228. package/src/cache/index.ts +135 -0
  229. package/src/cli.ts +111 -195
  230. package/src/compile.ts +6 -162
  231. package/src/diagnostics/index.ts +8 -11
  232. package/src/emit/compile.ts +177 -0
  233. package/src/emit/index.ts +286 -0
  234. package/src/emit/modules.ts +581 -0
  235. package/src/emit/sourcemap.ts +101 -0
  236. package/src/hir/lower.ts +455 -0
  237. package/src/hir/monomorphize.ts +416 -0
  238. package/src/hir/types.ts +228 -0
  239. package/src/index.ts +37 -182
  240. package/src/lexer/index.ts +2 -1
  241. package/src/lir/budget.ts +321 -0
  242. package/src/lir/lower.ts +587 -0
  243. package/src/lir/types.ts +113 -0
  244. package/src/lir/verify.ts +129 -0
  245. package/src/lsp/main.ts +9 -0
  246. package/src/lsp/server.ts +414 -0
  247. package/src/mc-test/runner.ts +4 -3
  248. package/src/mir/lower.ts +1403 -0
  249. package/src/mir/macro.ts +167 -0
  250. package/src/mir/types.ts +117 -0
  251. package/src/mir/verify.ts +218 -0
  252. package/src/optimizer/block_merge.ts +93 -0
  253. package/src/optimizer/branch_simplify.ts +27 -0
  254. package/src/optimizer/constant_fold.ts +88 -0
  255. package/src/optimizer/copy_prop.ts +106 -0
  256. package/src/optimizer/coroutine.ts +996 -0
  257. package/src/optimizer/dce.ts +108 -653
  258. package/src/optimizer/interprocedural.ts +177 -0
  259. package/src/optimizer/lir/const_imm.ts +143 -0
  260. package/src/optimizer/lir/dead_slot.ts +123 -0
  261. package/src/optimizer/lir/peephole.ts +57 -0
  262. package/src/optimizer/lir/pipeline.ts +37 -0
  263. package/src/optimizer/nbt-batch.ts +50 -0
  264. package/src/optimizer/pipeline.ts +59 -0
  265. package/src/optimizer/selector-cache.ts +103 -0
  266. package/src/optimizer/unroll.ts +386 -0
  267. package/src/parser/index.ts +213 -16
  268. package/src/repl.ts +1 -1
  269. package/src/runtime/index.ts +1 -1
  270. package/src/stdlib/math.mcrs +4 -4
  271. package/src/templates/quest.mcrs +4 -4
  272. package/src/typechecker/index.ts +215 -15
  273. package/src/types/mc-version.ts +46 -0
  274. package/tsconfig.json +1 -1
  275. package/dist/__tests__/cli.test.js +0 -278
  276. package/dist/__tests__/codegen.test.js +0 -152
  277. package/dist/__tests__/e2e.test.d.ts +0 -6
  278. package/dist/__tests__/e2e.test.js +0 -1847
  279. package/dist/__tests__/entity-types.test.js +0 -203
  280. package/dist/__tests__/lowering.test.js +0 -1015
  281. package/dist/__tests__/macro.test.d.ts +0 -8
  282. package/dist/__tests__/macro.test.js +0 -305
  283. package/dist/__tests__/nbt.test.js +0 -82
  284. package/dist/__tests__/optimizer-advanced.test.js +0 -124
  285. package/dist/__tests__/optimizer.test.js +0 -149
  286. package/dist/__tests__/runtime.test.js +0 -289
  287. package/dist/__tests__/stdlib-advanced.test.d.ts +0 -4
  288. package/dist/__tests__/stdlib-advanced.test.js +0 -378
  289. package/dist/__tests__/stdlib-bigint.test.d.ts +0 -7
  290. package/dist/__tests__/stdlib-bigint.test.js +0 -428
  291. package/dist/__tests__/stdlib-math.test.d.ts +0 -7
  292. package/dist/__tests__/stdlib-math.test.js +0 -352
  293. package/dist/__tests__/stdlib-vec.test.d.ts +0 -4
  294. package/dist/__tests__/stdlib-vec.test.js +0 -264
  295. package/dist/__tests__/structure-optimizer.test.js +0 -33
  296. package/dist/__tests__/var-allocator.test.js +0 -69
  297. package/dist/codegen/cmdblock/index.d.ts +0 -26
  298. package/dist/codegen/cmdblock/index.js +0 -45
  299. package/dist/codegen/mcfunction/index.d.ts +0 -40
  300. package/dist/codegen/mcfunction/index.js +0 -606
  301. package/dist/codegen/structure/index.d.ts +0 -24
  302. package/dist/codegen/structure/index.js +0 -279
  303. package/dist/codegen/var-allocator.d.ts +0 -45
  304. package/dist/codegen/var-allocator.js +0 -104
  305. package/dist/compile.d.ts +0 -68
  306. package/dist/data/arena/function/__load.mcfunction +0 -6
  307. package/dist/data/arena/function/__tick.mcfunction +0 -2
  308. package/dist/data/arena/function/announce_leaders/else_1.mcfunction +0 -3
  309. package/dist/data/arena/function/announce_leaders/foreach_0/merge_2.mcfunction +0 -1
  310. package/dist/data/arena/function/announce_leaders/foreach_0/then_0.mcfunction +0 -3
  311. package/dist/data/arena/function/announce_leaders/foreach_0.mcfunction +0 -7
  312. package/dist/data/arena/function/announce_leaders/foreach_1/merge_2.mcfunction +0 -1
  313. package/dist/data/arena/function/announce_leaders/foreach_1/then_0.mcfunction +0 -4
  314. package/dist/data/arena/function/announce_leaders/foreach_1.mcfunction +0 -6
  315. package/dist/data/arena/function/announce_leaders/merge_2.mcfunction +0 -1
  316. package/dist/data/arena/function/announce_leaders/then_0.mcfunction +0 -4
  317. package/dist/data/arena/function/announce_leaders.mcfunction +0 -6
  318. package/dist/data/arena/function/arena_tick/merge_2.mcfunction +0 -1
  319. package/dist/data/arena/function/arena_tick/then_0.mcfunction +0 -4
  320. package/dist/data/arena/function/arena_tick.mcfunction +0 -11
  321. package/dist/data/counter/function/__load.mcfunction +0 -5
  322. package/dist/data/counter/function/__tick.mcfunction +0 -2
  323. package/dist/data/counter/function/counter_tick/merge_2.mcfunction +0 -1
  324. package/dist/data/counter/function/counter_tick/then_0.mcfunction +0 -3
  325. package/dist/data/counter/function/counter_tick.mcfunction +0 -11
  326. package/dist/data/gcd2/function/__load.mcfunction +0 -3
  327. package/dist/data/gcd2/function/abs/merge_2.mcfunction +0 -3
  328. package/dist/data/gcd2/function/abs/then_0.mcfunction +0 -5
  329. package/dist/data/gcd2/function/abs.mcfunction +0 -7
  330. package/dist/data/gcd2/function/gcd/loop_body_1.mcfunction +0 -7
  331. package/dist/data/gcd2/function/gcd/loop_check_0.mcfunction +0 -5
  332. package/dist/data/gcd2/function/gcd/loop_exit_2.mcfunction +0 -3
  333. package/dist/data/gcd2/function/gcd.mcfunction +0 -14
  334. package/dist/data/gcd3/function/__load.mcfunction +0 -3
  335. package/dist/data/gcd3/function/abs/merge_2.mcfunction +0 -3
  336. package/dist/data/gcd3/function/abs/then_0.mcfunction +0 -5
  337. package/dist/data/gcd3/function/abs.mcfunction +0 -7
  338. package/dist/data/gcd3/function/gcd/loop_body_1.mcfunction +0 -7
  339. package/dist/data/gcd3/function/gcd/loop_check_0.mcfunction +0 -5
  340. package/dist/data/gcd3/function/gcd/loop_exit_2.mcfunction +0 -3
  341. package/dist/data/gcd3/function/gcd.mcfunction +0 -14
  342. package/dist/data/gcd3/function/test.mcfunction +0 -7
  343. package/dist/data/gcd3nm/function/__load.mcfunction +0 -3
  344. package/dist/data/gcd3nm/function/abs/merge_2.mcfunction +0 -3
  345. package/dist/data/gcd3nm/function/abs/then_0.mcfunction +0 -5
  346. package/dist/data/gcd3nm/function/abs.mcfunction +0 -7
  347. package/dist/data/gcd3nm/function/gcd/loop_body_1.mcfunction +0 -7
  348. package/dist/data/gcd3nm/function/gcd/loop_check_0.mcfunction +0 -5
  349. package/dist/data/gcd3nm/function/gcd/loop_exit_2.mcfunction +0 -3
  350. package/dist/data/gcd3nm/function/gcd.mcfunction +0 -14
  351. package/dist/data/gcd3nm/function/test.mcfunction +0 -7
  352. package/dist/data/gcd_test/function/__load.mcfunction +0 -3
  353. package/dist/data/gcd_test/function/abs/merge_2.mcfunction +0 -3
  354. package/dist/data/gcd_test/function/abs/then_0.mcfunction +0 -5
  355. package/dist/data/gcd_test/function/abs.mcfunction +0 -7
  356. package/dist/data/gcd_test/function/gcd/loop_body_1.mcfunction +0 -7
  357. package/dist/data/gcd_test/function/gcd/loop_check_0.mcfunction +0 -5
  358. package/dist/data/gcd_test/function/gcd/loop_exit_2.mcfunction +0 -3
  359. package/dist/data/gcd_test/function/gcd.mcfunction +0 -14
  360. package/dist/data/isqrttest/function/__load.mcfunction +0 -6
  361. package/dist/data/isqrttest/function/isqrt/loop_body_4.mcfunction +0 -12
  362. package/dist/data/isqrttest/function/isqrt/loop_check_3.mcfunction +0 -5
  363. package/dist/data/isqrttest/function/isqrt/loop_exit_5.mcfunction +0 -3
  364. package/dist/data/isqrttest/function/isqrt/merge_2.mcfunction +0 -4
  365. package/dist/data/isqrttest/function/isqrt/merge_8.mcfunction +0 -6
  366. package/dist/data/isqrttest/function/isqrt/then_0.mcfunction +0 -3
  367. package/dist/data/isqrttest/function/isqrt/then_6.mcfunction +0 -3
  368. package/dist/data/isqrttest/function/isqrt.mcfunction +0 -7
  369. package/dist/data/isqrttest/function/test.mcfunction +0 -6
  370. package/dist/data/mathtest/function/__load.mcfunction +0 -3
  371. package/dist/data/mathtest/function/abs/merge_2.mcfunction +0 -3
  372. package/dist/data/mathtest/function/abs/then_0.mcfunction +0 -5
  373. package/dist/data/mathtest/function/abs.mcfunction +0 -6
  374. package/dist/data/mathtest/function/test.mcfunction +0 -5
  375. package/dist/data/minecraft/tags/function/load.json +0 -5
  376. package/dist/data/minecraft/tags/function/tick.json +0 -5
  377. package/dist/data/mypack/function/__load.mcfunction +0 -13
  378. package/dist/data/mypack/function/_atan_init.mcfunction +0 -2
  379. package/dist/data/mypack/function/abs/merge_2.mcfunction +0 -3
  380. package/dist/data/mypack/function/abs/then_0.mcfunction +0 -5
  381. package/dist/data/mypack/function/abs.mcfunction +0 -6
  382. package/dist/data/mypack/function/atan2_fixed/__sgi_1.mcfunction +0 -2
  383. package/dist/data/mypack/function/atan2_fixed/else_34.mcfunction +0 -3
  384. package/dist/data/mypack/function/atan2_fixed/loop_body_31.mcfunction +0 -19
  385. package/dist/data/mypack/function/atan2_fixed/loop_check_30.mcfunction +0 -5
  386. package/dist/data/mypack/function/atan2_fixed/loop_exit_32.mcfunction +0 -6
  387. package/dist/data/mypack/function/atan2_fixed/merge_11.mcfunction +0 -6
  388. package/dist/data/mypack/function/atan2_fixed/merge_14.mcfunction +0 -3
  389. package/dist/data/mypack/function/atan2_fixed/merge_17.mcfunction +0 -6
  390. package/dist/data/mypack/function/atan2_fixed/merge_2.mcfunction +0 -5
  391. package/dist/data/mypack/function/atan2_fixed/merge_20.mcfunction +0 -5
  392. package/dist/data/mypack/function/atan2_fixed/merge_23.mcfunction +0 -5
  393. package/dist/data/mypack/function/atan2_fixed/merge_26.mcfunction +0 -6
  394. package/dist/data/mypack/function/atan2_fixed/merge_29.mcfunction +0 -4
  395. package/dist/data/mypack/function/atan2_fixed/merge_38.mcfunction +0 -5
  396. package/dist/data/mypack/function/atan2_fixed/merge_41.mcfunction +0 -5
  397. package/dist/data/mypack/function/atan2_fixed/merge_44.mcfunction +0 -5
  398. package/dist/data/mypack/function/atan2_fixed/merge_47.mcfunction +0 -5
  399. package/dist/data/mypack/function/atan2_fixed/merge_5.mcfunction +0 -5
  400. package/dist/data/mypack/function/atan2_fixed/merge_8.mcfunction +0 -3
  401. package/dist/data/mypack/function/atan2_fixed/then_0.mcfunction +0 -5
  402. package/dist/data/mypack/function/atan2_fixed/then_12.mcfunction +0 -3
  403. package/dist/data/mypack/function/atan2_fixed/then_15.mcfunction +0 -5
  404. package/dist/data/mypack/function/atan2_fixed/then_18.mcfunction +0 -5
  405. package/dist/data/mypack/function/atan2_fixed/then_21.mcfunction +0 -3
  406. package/dist/data/mypack/function/atan2_fixed/then_24.mcfunction +0 -3
  407. package/dist/data/mypack/function/atan2_fixed/then_27.mcfunction +0 -6
  408. package/dist/data/mypack/function/atan2_fixed/then_3.mcfunction +0 -3
  409. package/dist/data/mypack/function/atan2_fixed/then_33.mcfunction +0 -5
  410. package/dist/data/mypack/function/atan2_fixed/then_36.mcfunction +0 -5
  411. package/dist/data/mypack/function/atan2_fixed/then_39.mcfunction +0 -5
  412. package/dist/data/mypack/function/atan2_fixed/then_42.mcfunction +0 -3
  413. package/dist/data/mypack/function/atan2_fixed/then_45.mcfunction +0 -5
  414. package/dist/data/mypack/function/atan2_fixed/then_6.mcfunction +0 -3
  415. package/dist/data/mypack/function/atan2_fixed/then_9.mcfunction +0 -5
  416. package/dist/data/mypack/function/atan2_fixed.mcfunction +0 -7
  417. package/dist/data/mypack/function/my_game.mcfunction +0 -10
  418. package/dist/data/quiz/function/__load.mcfunction +0 -16
  419. package/dist/data/quiz/function/__tick.mcfunction +0 -6
  420. package/dist/data/quiz/function/__trigger_quiz_a_dispatch.mcfunction +0 -4
  421. package/dist/data/quiz/function/__trigger_quiz_b_dispatch.mcfunction +0 -4
  422. package/dist/data/quiz/function/__trigger_quiz_c_dispatch.mcfunction +0 -4
  423. package/dist/data/quiz/function/__trigger_quiz_start_dispatch.mcfunction +0 -4
  424. package/dist/data/quiz/function/answer_a.mcfunction +0 -4
  425. package/dist/data/quiz/function/answer_b.mcfunction +0 -4
  426. package/dist/data/quiz/function/answer_c.mcfunction +0 -4
  427. package/dist/data/quiz/function/ask_question/else_1.mcfunction +0 -5
  428. package/dist/data/quiz/function/ask_question/else_4.mcfunction +0 -5
  429. package/dist/data/quiz/function/ask_question/else_7.mcfunction +0 -4
  430. package/dist/data/quiz/function/ask_question/merge_2.mcfunction +0 -1
  431. package/dist/data/quiz/function/ask_question/merge_5.mcfunction +0 -2
  432. package/dist/data/quiz/function/ask_question/merge_8.mcfunction +0 -2
  433. package/dist/data/quiz/function/ask_question/then_0.mcfunction +0 -4
  434. package/dist/data/quiz/function/ask_question/then_3.mcfunction +0 -4
  435. package/dist/data/quiz/function/ask_question/then_6.mcfunction +0 -4
  436. package/dist/data/quiz/function/ask_question.mcfunction +0 -7
  437. package/dist/data/quiz/function/finish_quiz.mcfunction +0 -6
  438. package/dist/data/quiz/function/handle_answer/else_1.mcfunction +0 -5
  439. package/dist/data/quiz/function/handle_answer/else_10.mcfunction +0 -3
  440. package/dist/data/quiz/function/handle_answer/else_16.mcfunction +0 -3
  441. package/dist/data/quiz/function/handle_answer/else_4.mcfunction +0 -3
  442. package/dist/data/quiz/function/handle_answer/else_7.mcfunction +0 -5
  443. package/dist/data/quiz/function/handle_answer/merge_11.mcfunction +0 -2
  444. package/dist/data/quiz/function/handle_answer/merge_14.mcfunction +0 -2
  445. package/dist/data/quiz/function/handle_answer/merge_17.mcfunction +0 -2
  446. package/dist/data/quiz/function/handle_answer/merge_2.mcfunction +0 -8
  447. package/dist/data/quiz/function/handle_answer/merge_5.mcfunction +0 -2
  448. package/dist/data/quiz/function/handle_answer/merge_8.mcfunction +0 -2
  449. package/dist/data/quiz/function/handle_answer/then_0.mcfunction +0 -5
  450. package/dist/data/quiz/function/handle_answer/then_12.mcfunction +0 -5
  451. package/dist/data/quiz/function/handle_answer/then_15.mcfunction +0 -6
  452. package/dist/data/quiz/function/handle_answer/then_3.mcfunction +0 -6
  453. package/dist/data/quiz/function/handle_answer/then_6.mcfunction +0 -5
  454. package/dist/data/quiz/function/handle_answer/then_9.mcfunction +0 -6
  455. package/dist/data/quiz/function/handle_answer.mcfunction +0 -11
  456. package/dist/data/quiz/function/start_quiz.mcfunction +0 -5
  457. package/dist/data/reqtest/function/__load.mcfunction +0 -4
  458. package/dist/data/reqtest/function/_table_init.mcfunction +0 -2
  459. package/dist/data/reqtest/function/no_trig.mcfunction +0 -3
  460. package/dist/data/reqtest/function/use_table.mcfunction +0 -4
  461. package/dist/data/reqtest2/function/__load.mcfunction +0 -3
  462. package/dist/data/reqtest2/function/no_trig.mcfunction +0 -3
  463. package/dist/data/runtime/function/__load.mcfunction +0 -5
  464. package/dist/data/runtime/function/__tick.mcfunction +0 -2
  465. package/dist/data/runtime/function/counter_tick/then_0.mcfunction +0 -3
  466. package/dist/data/runtime/function/counter_tick.mcfunction +0 -13
  467. package/dist/data/shop/function/__load.mcfunction +0 -7
  468. package/dist/data/shop/function/__tick.mcfunction +0 -3
  469. package/dist/data/shop/function/__trigger_shop_buy_dispatch.mcfunction +0 -4
  470. package/dist/data/shop/function/complete_purchase/else_1.mcfunction +0 -5
  471. package/dist/data/shop/function/complete_purchase/else_4.mcfunction +0 -5
  472. package/dist/data/shop/function/complete_purchase/else_7.mcfunction +0 -3
  473. package/dist/data/shop/function/complete_purchase/merge_2.mcfunction +0 -2
  474. package/dist/data/shop/function/complete_purchase/merge_5.mcfunction +0 -2
  475. package/dist/data/shop/function/complete_purchase/merge_8.mcfunction +0 -2
  476. package/dist/data/shop/function/complete_purchase/then_0.mcfunction +0 -4
  477. package/dist/data/shop/function/complete_purchase/then_3.mcfunction +0 -4
  478. package/dist/data/shop/function/complete_purchase/then_6.mcfunction +0 -4
  479. package/dist/data/shop/function/complete_purchase.mcfunction +0 -7
  480. package/dist/data/shop/function/handle_shop_trigger.mcfunction +0 -3
  481. package/dist/data/swap_test/function/__load.mcfunction +0 -3
  482. package/dist/data/swap_test/function/gcd_old/loop_body_1.mcfunction +0 -7
  483. package/dist/data/swap_test/function/gcd_old/loop_check_0.mcfunction +0 -5
  484. package/dist/data/swap_test/function/gcd_old/loop_exit_2.mcfunction +0 -3
  485. package/dist/data/swap_test/function/gcd_old.mcfunction +0 -8
  486. package/dist/data/turret/function/__load.mcfunction +0 -5
  487. package/dist/data/turret/function/__tick.mcfunction +0 -4
  488. package/dist/data/turret/function/__trigger_deploy_turret_dispatch.mcfunction +0 -4
  489. package/dist/data/turret/function/deploy_turret.mcfunction +0 -8
  490. package/dist/data/turret/function/turret_tick/at_1.mcfunction +0 -2
  491. package/dist/data/turret/function/turret_tick/foreach_0.mcfunction +0 -2
  492. package/dist/data/turret/function/turret_tick/foreach_2.mcfunction +0 -2
  493. package/dist/data/turret/function/turret_tick/tick_body.mcfunction +0 -3
  494. package/dist/data/turret/function/turret_tick/tick_skip.mcfunction +0 -1
  495. package/dist/data/turret/function/turret_tick.mcfunction +0 -5
  496. package/dist/gcd2.map.json +0 -15
  497. package/dist/gcd3.map.json +0 -17
  498. package/dist/gcd_test.map.json +0 -15
  499. package/dist/index.d.ts +0 -62
  500. package/dist/ir/builder.d.ts +0 -33
  501. package/dist/ir/builder.js +0 -99
  502. package/dist/ir/types.d.ts +0 -132
  503. package/dist/ir/types.js +0 -15
  504. package/dist/isqrttest.map.json +0 -15
  505. package/dist/lowering/index.d.ts +0 -188
  506. package/dist/lowering/index.js +0 -3403
  507. package/dist/mathtest.map.json +0 -6
  508. package/dist/mypack.map.json +0 -27
  509. package/dist/optimizer/commands.d.ts +0 -38
  510. package/dist/optimizer/commands.js +0 -451
  511. package/dist/optimizer/dce.d.ts +0 -34
  512. package/dist/optimizer/dce.js +0 -639
  513. package/dist/optimizer/passes.d.ts +0 -34
  514. package/dist/optimizer/passes.js +0 -243
  515. package/dist/optimizer/structure.d.ts +0 -9
  516. package/dist/optimizer/structure.js +0 -356
  517. package/dist/pack.mcmeta +0 -6
  518. package/dist/reqtest.map.json +0 -4
  519. package/dist/reqtest2.map.json +0 -4
  520. package/dist/runtime.map.json +0 -7
  521. package/dist/swap_test.map.json +0 -14
  522. package/src/__tests__/codegen.test.ts +0 -161
  523. package/src/__tests__/e2e.test.ts +0 -2039
  524. package/src/__tests__/entity-types.test.ts +0 -236
  525. package/src/__tests__/lowering.test.ts +0 -1185
  526. package/src/__tests__/macro.test.ts +0 -343
  527. package/src/__tests__/nbt.test.ts +0 -58
  528. package/src/__tests__/optimizer-advanced.test.ts +0 -144
  529. package/src/__tests__/optimizer.test.ts +0 -162
  530. package/src/__tests__/runtime.test.ts +0 -305
  531. package/src/__tests__/stdlib-advanced.test.ts +0 -379
  532. package/src/__tests__/stdlib-bigint.test.ts +0 -427
  533. package/src/__tests__/stdlib-math.test.ts +0 -374
  534. package/src/__tests__/stdlib-vec.test.ts +0 -259
  535. package/src/__tests__/structure-optimizer.test.ts +0 -38
  536. package/src/__tests__/var-allocator.test.ts +0 -75
  537. package/src/codegen/cmdblock/index.ts +0 -63
  538. package/src/codegen/mcfunction/index.ts +0 -662
  539. package/src/codegen/structure/index.ts +0 -346
  540. package/src/codegen/var-allocator.ts +0 -104
  541. package/src/ir/builder.ts +0 -116
  542. package/src/ir/types.ts +0 -134
  543. package/src/lowering/index.ts +0 -3876
  544. package/src/optimizer/commands.ts +0 -534
  545. package/src/optimizer/passes.ts +0 -250
  546. package/src/optimizer/structure.ts +0 -450
  547. /package/dist/{__tests__/cli.test.d.ts → src/__tests__/budget.test.d.ts} +0 -0
  548. /package/dist/{__tests__/codegen.test.d.ts → src/__tests__/cli.test.d.ts} +0 -0
  549. /package/dist/{__tests__ → src/__tests__}/compile-all.test.d.ts +0 -0
  550. /package/dist/{__tests__ → src/__tests__}/compile-all.test.js +0 -0
  551. /package/dist/{__tests__ → src/__tests__}/dce.test.d.ts +0 -0
  552. /package/dist/{__tests__ → src/__tests__}/diagnostics.test.d.ts +0 -0
  553. /package/dist/{__tests__ → src/__tests__}/formatter.test.d.ts +0 -0
  554. /package/dist/{__tests__ → src/__tests__}/formatter.test.js +0 -0
  555. /package/dist/{__tests__/entity-types.test.d.ts → src/__tests__/hir/desugar.test.d.ts} +0 -0
  556. /package/dist/{__tests__ → src/__tests__}/lexer.test.d.ts +0 -0
  557. /package/dist/{__tests__ → src/__tests__}/lexer.test.js +0 -0
  558. /package/dist/{__tests__/lowering.test.d.ts → src/__tests__/lir/lower.test.d.ts} +0 -0
  559. /package/dist/{__tests__/mc-syntax.test.d.ts → src/__tests__/lir/types.test.d.ts} +0 -0
  560. /package/dist/{__tests__/nbt.test.d.ts → src/__tests__/lir/verify.test.d.ts} +0 -0
  561. /package/dist/{__tests__ → src/__tests__}/mc-integration.test.d.ts +0 -0
  562. /package/dist/{__tests__/optimizer-advanced.test.d.ts → src/__tests__/mc-syntax.test.d.ts} +0 -0
  563. /package/dist/{__tests__ → src/__tests__}/mc-syntax.test.js +0 -0
  564. /package/dist/{__tests__/optimizer.test.d.ts → src/__tests__/mir/arithmetic.test.d.ts} +0 -0
  565. /package/dist/{__tests__/parser.test.d.ts → src/__tests__/mir/control-flow.test.d.ts} +0 -0
  566. /package/dist/{__tests__/repl.test.d.ts → src/__tests__/mir/verify.test.d.ts} +0 -0
  567. /package/dist/{__tests__/runtime.test.d.ts → src/__tests__/optimizer/block_merge.test.d.ts} +0 -0
  568. /package/dist/{__tests__/structure-optimizer.test.d.ts → src/__tests__/optimizer/branch_simplify.test.d.ts} +0 -0
  569. /package/dist/{__tests__/typechecker.test.d.ts → src/__tests__/optimizer/constant_fold.test.d.ts} +0 -0
  570. /package/dist/{__tests__/var-allocator.test.d.ts → src/__tests__/optimizer/copy_prop.test.d.ts} +0 -0
  571. /package/dist/{__tests__ → src/__tests__}/parser.test.js +0 -0
  572. /package/dist/{__tests__ → src/__tests__}/repl.test.js +0 -0
  573. /package/dist/{__tests__ → src/__tests__}/typechecker.test.js +0 -0
  574. /package/dist/{ast → src/ast}/types.js +0 -0
  575. /package/dist/{builtins → src/builtins}/metadata.d.ts +0 -0
  576. /package/dist/{builtins → src/builtins}/metadata.js +0 -0
  577. /package/dist/{events → src/events}/types.d.ts +0 -0
  578. /package/dist/{events → src/events}/types.js +0 -0
  579. /package/dist/{formatter → src/formatter}/index.d.ts +0 -0
  580. /package/dist/{formatter → src/formatter}/index.js +0 -0
  581. /package/dist/{mc-test → src/mc-test}/client.d.ts +0 -0
  582. /package/dist/{mc-test → src/mc-test}/client.js +0 -0
  583. /package/dist/{mc-test → src/mc-test}/runner.d.ts +0 -0
  584. /package/dist/{mc-test → src/mc-test}/setup.d.ts +0 -0
  585. /package/dist/{mc-test → src/mc-test}/setup.js +0 -0
  586. /package/dist/{mc-validator → src/mc-validator}/index.d.ts +0 -0
  587. /package/dist/{mc-validator → src/mc-validator}/index.js +0 -0
  588. /package/dist/{nbt → src/nbt}/index.d.ts +0 -0
  589. /package/dist/{nbt → src/nbt}/index.js +0 -0
  590. /package/dist/{repl.js → src/repl.js} +0 -0
  591. /package/dist/{runtime → src/runtime}/index.d.ts +0 -0
  592. /package/dist/{types → src/types}/entity-hierarchy.d.ts +0 -0
  593. /package/dist/{types → src/types}/entity-hierarchy.js +0 -0
@@ -0,0 +1,474 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * RedScript CLI
5
+ *
6
+ * Usage:
7
+ * redscript compile <file> [-o <out>] [--namespace <ns>]
8
+ * redscript check <file>
9
+ * redscript repl
10
+ * redscript version
11
+ */
12
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ var desc = Object.getOwnPropertyDescriptor(m, k);
15
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
16
+ desc = { enumerable: true, get: function() { return m[k]; } };
17
+ }
18
+ Object.defineProperty(o, k2, desc);
19
+ }) : (function(o, m, k, k2) {
20
+ if (k2 === undefined) k2 = k;
21
+ o[k2] = m[k];
22
+ }));
23
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
24
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
25
+ }) : function(o, v) {
26
+ o["default"] = v;
27
+ });
28
+ var __importStar = (this && this.__importStar) || (function () {
29
+ var ownKeys = function(o) {
30
+ ownKeys = Object.getOwnPropertyNames || function (o) {
31
+ var ar = [];
32
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
33
+ return ar;
34
+ };
35
+ return ownKeys(o);
36
+ };
37
+ return function (mod) {
38
+ if (mod && mod.__esModule) return mod;
39
+ var result = {};
40
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
41
+ __setModuleDefault(result, mod);
42
+ return result;
43
+ };
44
+ })();
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ const index_1 = require("./index");
47
+ const diagnostics_1 = require("./diagnostics");
48
+ const mc_version_1 = require("./types/mc-version");
49
+ const repl_1 = require("./repl");
50
+ const metadata_1 = require("./builtins/metadata");
51
+ const index_2 = require("./cache/index");
52
+ const deps_1 = require("./cache/deps");
53
+ const incremental_1 = require("./cache/incremental");
54
+ const fs = __importStar(require("fs"));
55
+ const path = __importStar(require("path"));
56
+ const https = __importStar(require("https"));
57
+ const child_process_1 = require("child_process");
58
+ // Parse command line arguments
59
+ const args = process.argv.slice(2);
60
+ function printUsage() {
61
+ console.log(`
62
+ RedScript Compiler v2
63
+
64
+ Usage:
65
+ redscript compile <file> [-o <out>] [--namespace <ns>]
66
+ redscript watch <dir> [-o <outdir>] [--namespace <ns>] [--hot-reload <url>]
67
+ redscript check <file>
68
+ redscript fmt <file.mcrs> [file2.mcrs ...]
69
+ redscript generate-dts [-o <file>]
70
+ redscript repl
71
+ redscript version
72
+
73
+ Commands:
74
+ compile Compile a RedScript file to a Minecraft datapack
75
+ watch Watch a directory for .mcrs file changes, recompile, and hot reload
76
+ check Check a RedScript file for errors without generating output
77
+ fmt Auto-format RedScript source files
78
+ generate-dts Generate builtin function declaration file (builtins.d.mcrs)
79
+ repl Start an interactive RedScript REPL
80
+ version Print the RedScript version
81
+ upgrade Upgrade to the latest version (npm install -g redscript-mc@latest)
82
+
83
+ Options:
84
+ -o, --output <path> Output directory or file path
85
+ --namespace <ns> Datapack namespace (default: derived from filename)
86
+ --hot-reload <url> After each successful compile, POST to <url>/reload
87
+ (use with redscript-testharness; e.g. http://localhost:25561)
88
+ --source-map Generate .sourcemap.json files alongside .mcfunction output
89
+ --mc-version <ver> Target Minecraft version (default: 1.21). Affects codegen features.
90
+ e.g. --mc-version 1.20.2, --mc-version 1.19
91
+ --lenient Treat type errors as warnings instead of blocking compilation
92
+ -h, --help Show this help message
93
+ `);
94
+ }
95
+ function getLocalVersion() {
96
+ const packagePath = path.join(__dirname, '..', 'package.json');
97
+ try {
98
+ const pkg = JSON.parse(fs.readFileSync(packagePath, 'utf-8'));
99
+ return pkg.version ?? '0.0.0';
100
+ }
101
+ catch {
102
+ return '0.0.0';
103
+ }
104
+ }
105
+ function printVersion() {
106
+ console.log(`RedScript v${getLocalVersion()}`);
107
+ }
108
+ /** Fetch latest version from npm registry (non-blocking, best-effort). */
109
+ function fetchLatestVersion() {
110
+ return new Promise(resolve => {
111
+ const req = https.get('https://registry.npmjs.org/redscript-mc/latest', { timeout: 3000 }, res => {
112
+ let data = '';
113
+ res.on('data', chunk => { data += chunk; });
114
+ res.on('end', () => {
115
+ try {
116
+ const json = JSON.parse(data);
117
+ resolve(json.version ?? null);
118
+ }
119
+ catch {
120
+ resolve(null);
121
+ }
122
+ });
123
+ });
124
+ req.on('error', () => resolve(null));
125
+ req.on('timeout', () => { req.destroy(); resolve(null); });
126
+ });
127
+ }
128
+ /** Compare semver strings. Returns true if b > a. */
129
+ function isNewer(current, latest) {
130
+ const parse = (v) => v.replace(/^v/, '').split('.').map(Number);
131
+ const [ca, cb, cc] = parse(current);
132
+ const [la, lb, lc] = parse(latest);
133
+ if (la !== ca)
134
+ return la > ca;
135
+ if (lb !== cb)
136
+ return lb > cb;
137
+ return lc > cc;
138
+ }
139
+ /**
140
+ * Check for a newer version and print a notice if one exists.
141
+ * Runs in background — does NOT block normal CLI operation.
142
+ */
143
+ async function checkForUpdates(silent = false) {
144
+ const current = getLocalVersion();
145
+ const latest = await fetchLatestVersion();
146
+ if (latest && isNewer(current, latest)) {
147
+ console.log(`\n💡 New version available: v${current} → v${latest}`);
148
+ console.log(` Run: redscript upgrade\n`);
149
+ }
150
+ else if (!silent && latest) {
151
+ // Only print when explicitly running 'version' or 'upgrade'
152
+ // No output for normal commands — keep startup noise-free
153
+ }
154
+ }
155
+ /** Run npm install -g to upgrade to latest. */
156
+ function upgradeCommand() {
157
+ const current = getLocalVersion();
158
+ console.log(`Current version: v${current}`);
159
+ console.log('Checking latest version...');
160
+ fetchLatestVersion().then(latest => {
161
+ if (!latest) {
162
+ console.error('Could not fetch latest version from npm.');
163
+ process.exit(1);
164
+ }
165
+ if (!isNewer(current, latest)) {
166
+ console.log(`✅ Already up to date (v${current})`);
167
+ return;
168
+ }
169
+ console.log(`Upgrading v${current} → v${latest}...`);
170
+ try {
171
+ (0, child_process_1.execSync)('npm install -g redscript-mc@latest', { stdio: 'inherit' });
172
+ console.log(`✅ Upgraded to v${latest}`);
173
+ }
174
+ catch {
175
+ console.error('Upgrade failed. Try manually: npm install -g redscript-mc@latest');
176
+ process.exit(1);
177
+ }
178
+ });
179
+ }
180
+ function parseArgs(args) {
181
+ const result = {};
182
+ let i = 0;
183
+ while (i < args.length) {
184
+ const arg = args[i];
185
+ if (arg === '-h' || arg === '--help') {
186
+ result.help = true;
187
+ i++;
188
+ }
189
+ else if (arg === '-o' || arg === '--output') {
190
+ result.output = args[++i];
191
+ i++;
192
+ }
193
+ else if (arg === '--namespace') {
194
+ result.namespace = args[++i];
195
+ i++;
196
+ }
197
+ else if (arg === '--hot-reload') {
198
+ result.hotReload = args[++i];
199
+ i++;
200
+ }
201
+ else if (arg === '--source-map') {
202
+ result.sourceMap = true;
203
+ i++;
204
+ }
205
+ else if (arg === '--mc-version') {
206
+ result.mcVersionStr = args[++i];
207
+ i++;
208
+ }
209
+ else if (arg === '--lenient') {
210
+ result.lenient = true;
211
+ i++;
212
+ }
213
+ else if (!result.command) {
214
+ result.command = arg;
215
+ i++;
216
+ }
217
+ else if (!result.file) {
218
+ result.file = arg;
219
+ i++;
220
+ }
221
+ else {
222
+ i++;
223
+ }
224
+ }
225
+ return result;
226
+ }
227
+ function deriveNamespace(filePath) {
228
+ const basename = path.basename(filePath, path.extname(filePath));
229
+ // Convert to valid identifier: lowercase, replace non-alphanumeric with underscore
230
+ return basename.toLowerCase().replace(/[^a-z0-9]/g, '_');
231
+ }
232
+ function compileCommand(file, output, namespace, sourceMap = false, mcVersionStr, lenient = false) {
233
+ // Read source file
234
+ if (!fs.existsSync(file)) {
235
+ console.error(`Error: File not found: ${file}`);
236
+ process.exit(1);
237
+ }
238
+ let mcVersion = mc_version_1.DEFAULT_MC_VERSION;
239
+ if (mcVersionStr) {
240
+ try {
241
+ mcVersion = (0, mc_version_1.parseMcVersion)(mcVersionStr);
242
+ }
243
+ catch (e) {
244
+ console.error(`Error: ${e.message}`);
245
+ process.exit(1);
246
+ }
247
+ }
248
+ const source = fs.readFileSync(file, 'utf-8');
249
+ try {
250
+ const result = (0, index_1.compile)(source, { namespace, filePath: file, generateSourceMap: sourceMap, mcVersion, lenient });
251
+ for (const w of result.warnings) {
252
+ console.error(`Warning: ${w}`);
253
+ }
254
+ // Create output directory
255
+ fs.mkdirSync(output, { recursive: true });
256
+ // Write all files
257
+ for (const dataFile of result.files) {
258
+ const filePath = path.join(output, dataFile.path);
259
+ const dir = path.dirname(filePath);
260
+ fs.mkdirSync(dir, { recursive: true });
261
+ fs.writeFileSync(filePath, dataFile.content);
262
+ }
263
+ console.log(`✓ Compiled ${file} to ${output}/`);
264
+ console.log(` Namespace: ${namespace}`);
265
+ console.log(` Files: ${result.files.length}`);
266
+ }
267
+ catch (err) {
268
+ console.error((0, diagnostics_1.formatError)(err, source, file));
269
+ process.exit(1);
270
+ }
271
+ }
272
+ function checkCommand(file, namespace) {
273
+ // Read source file
274
+ if (!fs.existsSync(file)) {
275
+ console.error(`Error: File not found: ${file}`);
276
+ process.exit(1);
277
+ }
278
+ const source = fs.readFileSync(file, 'utf-8');
279
+ const ns = namespace ?? deriveNamespace(file);
280
+ const result = (0, index_1.checkWithWarnings)(source, ns, file);
281
+ for (const w of result.warnings) {
282
+ console.error(`Warning: ${w}`);
283
+ }
284
+ if (result.error) {
285
+ console.error((0, diagnostics_1.formatError)(result.error, source, file));
286
+ process.exit(1);
287
+ }
288
+ console.log(`✓ No errors found`);
289
+ }
290
+ async function hotReload(url) {
291
+ try {
292
+ const res = await fetch(`${url}/reload`, { method: 'POST' });
293
+ if (res.ok) {
294
+ console.log(`🔄 Hot reload sent → ${url}`);
295
+ }
296
+ else {
297
+ console.warn(`⚠ Hot reload failed: HTTP ${res.status}`);
298
+ }
299
+ }
300
+ catch (e) {
301
+ console.warn(`⚠ Hot reload failed (is the server running?): ${e.message}`);
302
+ }
303
+ }
304
+ function watchCommand(dir, output, namespace, hotReloadUrl) {
305
+ // Check if directory exists
306
+ if (!fs.existsSync(dir)) {
307
+ console.error(`Error: Directory not found: ${dir}`);
308
+ process.exit(1);
309
+ }
310
+ const stat = fs.statSync(dir);
311
+ if (!stat.isDirectory()) {
312
+ console.error(`Error: ${dir} is not a directory`);
313
+ process.exit(1);
314
+ }
315
+ console.log(`👁 Watching ${dir} for .mcrs file changes...`);
316
+ console.log(` Output: ${output}`);
317
+ if (hotReloadUrl)
318
+ console.log(` Hot reload: ${hotReloadUrl}`);
319
+ console.log(` Incremental compilation enabled`);
320
+ console.log(` Press Ctrl+C to stop\n`);
321
+ // Set up incremental compilation infrastructure
322
+ const cacheDir = path.join(dir, '.redscript-cache');
323
+ const cache = new index_2.FileCache(cacheDir);
324
+ cache.load();
325
+ const depGraph = new deps_1.DependencyGraph();
326
+ // Debounce timer
327
+ let debounceTimer = null;
328
+ // Compile all .mcrs files in directory (incrementally)
329
+ async function compileAllIncremental() {
330
+ const files = findRsFiles(dir);
331
+ if (files.length === 0) {
332
+ console.log(`⚠ No .mcrs files found in ${dir}`);
333
+ return;
334
+ }
335
+ const incResult = (0, incremental_1.compileIncremental)(files, cache, depGraph, {
336
+ namespace,
337
+ output,
338
+ });
339
+ const timestamp = new Date().toLocaleTimeString();
340
+ // Print warnings from recompiled files
341
+ for (const [file, compileResult] of incResult.results) {
342
+ for (const w of compileResult.warnings) {
343
+ console.error(`Warning: ${w}`);
344
+ }
345
+ console.log(`✓ [${timestamp}] Compiled ${path.relative(dir, file)} (${compileResult.files.length} files)`);
346
+ }
347
+ if (incResult.cached > 0) {
348
+ console.log(` [${timestamp}] ${incResult.cached} file(s) unchanged (cached)`);
349
+ }
350
+ // Print errors
351
+ for (const [file, errMsg] of incResult.errors) {
352
+ console.error(`✗ [${timestamp}] ${path.relative(dir, file)}: ${errMsg}`);
353
+ }
354
+ // Persist cache
355
+ cache.save();
356
+ if (incResult.errors.size === 0 && hotReloadUrl)
357
+ await hotReload(hotReloadUrl);
358
+ console.log('');
359
+ }
360
+ // Find all .mcrs files recursively
361
+ function findRsFiles(directory) {
362
+ const results = [];
363
+ const entries = fs.readdirSync(directory, { withFileTypes: true });
364
+ for (const entry of entries) {
365
+ const fullPath = path.join(directory, entry.name);
366
+ if (entry.isDirectory() && entry.name !== '.redscript-cache') {
367
+ results.push(...findRsFiles(fullPath));
368
+ }
369
+ else if (entry.isFile() && entry.name.endsWith('.mcrs')) {
370
+ results.push(fullPath);
371
+ }
372
+ }
373
+ return results;
374
+ }
375
+ // Initial compile
376
+ void compileAllIncremental();
377
+ // Watch for changes
378
+ fs.watch(dir, { recursive: true }, (eventType, filename) => {
379
+ if (filename && filename.endsWith('.mcrs')) {
380
+ // Debounce rapid changes
381
+ if (debounceTimer) {
382
+ clearTimeout(debounceTimer);
383
+ }
384
+ debounceTimer = setTimeout(() => {
385
+ console.log(`📝 Change detected: ${filename}`);
386
+ void compileAllIncremental();
387
+ }, 100);
388
+ }
389
+ });
390
+ }
391
+ // Main
392
+ const parsed = parseArgs(args);
393
+ async function main() {
394
+ if (parsed.help || !parsed.command) {
395
+ printUsage();
396
+ process.exit(parsed.help ? 0 : 1);
397
+ }
398
+ // Background update check — non-blocking, only shows notice if newer version exists
399
+ // Skip for repl/upgrade/version to avoid double-printing
400
+ const noCheckCmds = new Set(['upgrade', 'update', 'version', 'repl']);
401
+ if (!noCheckCmds.has(parsed.command ?? '')) {
402
+ checkForUpdates().catch(() => { });
403
+ }
404
+ switch (parsed.command) {
405
+ case 'compile':
406
+ if (!parsed.file) {
407
+ console.error('Error: No input file specified');
408
+ printUsage();
409
+ process.exit(1);
410
+ }
411
+ {
412
+ const namespace = parsed.namespace ?? deriveNamespace(parsed.file);
413
+ const output = parsed.output ?? './dist';
414
+ compileCommand(parsed.file, output, namespace, parsed.sourceMap, parsed.mcVersionStr, parsed.lenient);
415
+ }
416
+ break;
417
+ case 'watch':
418
+ if (!parsed.file) {
419
+ console.error('Error: No directory specified');
420
+ printUsage();
421
+ process.exit(1);
422
+ }
423
+ watchCommand(parsed.file, parsed.output ?? './dist', parsed.namespace, parsed.hotReload);
424
+ break;
425
+ case 'check':
426
+ if (!parsed.file) {
427
+ console.error('Error: No input file specified');
428
+ printUsage();
429
+ process.exit(1);
430
+ }
431
+ checkCommand(parsed.file, parsed.namespace);
432
+ break;
433
+ case 'fmt':
434
+ case 'format': {
435
+ const files = args.filter(a => a.endsWith('.mcrs'));
436
+ if (files.length === 0) {
437
+ console.error('Usage: redscript fmt <file.mcrs> [file2.mcrs ...]');
438
+ process.exit(1);
439
+ }
440
+ const { format } = require('./formatter');
441
+ for (const file of files) {
442
+ const content = fs.readFileSync(file, 'utf8');
443
+ const formatted = format(content);
444
+ fs.writeFileSync(file, formatted);
445
+ console.log(`Formatted: ${file}`);
446
+ }
447
+ break;
448
+ }
449
+ case 'generate-dts': {
450
+ const output = parsed.output ?? 'builtins.d.mcrs';
451
+ const dtsContent = (0, metadata_1.generateDts)();
452
+ fs.writeFileSync(output, dtsContent, 'utf-8');
453
+ console.log(`Generated ${output}`);
454
+ break;
455
+ }
456
+ case 'repl':
457
+ await (0, repl_1.startRepl)(parsed.namespace ?? 'repl');
458
+ break;
459
+ case 'version':
460
+ printVersion();
461
+ await checkForUpdates();
462
+ break;
463
+ case 'upgrade':
464
+ case 'update':
465
+ upgradeCommand();
466
+ break;
467
+ default:
468
+ console.error(`Error: Unknown command '${parsed.command}'`);
469
+ printUsage();
470
+ process.exit(1);
471
+ }
472
+ }
473
+ void main();
474
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1,37 @@
1
+ /**
2
+ * RedScript Compile API
3
+ *
4
+ * Preprocessing utilities and v2 compile re-export.
5
+ */
6
+ export { compile, CompileOptions, CompileResult } from './emit/compile';
7
+ export type { DatapackFile } from './emit/index';
8
+ export interface SourceRange {
9
+ startLine: number;
10
+ endLine: number;
11
+ filePath: string;
12
+ }
13
+ export interface PreprocessedSource {
14
+ source: string;
15
+ ranges: SourceRange[];
16
+ /** Imported files that declared `module library;` — parsed separately
17
+ * in library mode so their functions are DCE-eligible. Never concatenated
18
+ * into `source`. */
19
+ libraryImports?: Array<{
20
+ source: string;
21
+ filePath: string;
22
+ }>;
23
+ }
24
+ /**
25
+ * Resolve a combined-source line number back to the original file and line.
26
+ * Returns { filePath, line } if a mapping is found, otherwise returns the input unchanged.
27
+ */
28
+ export declare function resolveSourceLine(combinedLine: number, ranges: SourceRange[], fallbackFile?: string): {
29
+ filePath?: string;
30
+ line: number;
31
+ };
32
+ interface PreprocessOptions {
33
+ filePath?: string;
34
+ seen?: Set<string>;
35
+ }
36
+ export declare function preprocessSourceWithMetadata(source: string, options?: PreprocessOptions): PreprocessedSource;
37
+ export declare function preprocessSource(source: string, options?: PreprocessOptions): string;
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+ /**
3
+ * RedScript Compile API
4
+ *
5
+ * Preprocessing utilities and v2 compile re-export.
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.compile = void 0;
42
+ exports.resolveSourceLine = resolveSourceLine;
43
+ exports.preprocessSourceWithMetadata = preprocessSourceWithMetadata;
44
+ exports.preprocessSource = preprocessSource;
45
+ const fs = __importStar(require("fs"));
46
+ const path = __importStar(require("path"));
47
+ const diagnostics_1 = require("./diagnostics");
48
+ // ---------------------------------------------------------------------------
49
+ // Re-export v2 compile
50
+ // ---------------------------------------------------------------------------
51
+ var compile_1 = require("./emit/compile");
52
+ Object.defineProperty(exports, "compile", { enumerable: true, get: function () { return compile_1.compile; } });
53
+ /**
54
+ * Resolve a combined-source line number back to the original file and line.
55
+ * Returns { filePath, line } if a mapping is found, otherwise returns the input unchanged.
56
+ */
57
+ function resolveSourceLine(combinedLine, ranges, fallbackFile) {
58
+ for (const range of ranges) {
59
+ if (combinedLine >= range.startLine && combinedLine <= range.endLine) {
60
+ const localLine = combinedLine - range.startLine + 1;
61
+ return { filePath: range.filePath, line: localLine };
62
+ }
63
+ }
64
+ return { filePath: fallbackFile, line: combinedLine };
65
+ }
66
+ const IMPORT_RE = /^\s*import\s+"([^"]+)"\s*;?\s*$/;
67
+ /** Returns true if the source file declares `module library;` at its top
68
+ * (before any non-comment/non-blank lines). */
69
+ function isLibrarySource(source) {
70
+ for (const line of source.split('\n')) {
71
+ const trimmed = line.trim();
72
+ if (!trimmed || trimmed.startsWith('//'))
73
+ continue;
74
+ return /^module\s+library\s*;/.test(trimmed);
75
+ }
76
+ return false;
77
+ }
78
+ function countLines(source) {
79
+ return source === '' ? 0 : source.split('\n').length;
80
+ }
81
+ function offsetRanges(ranges, lineOffset) {
82
+ return ranges.map(range => ({
83
+ startLine: range.startLine + lineOffset,
84
+ endLine: range.endLine + lineOffset,
85
+ filePath: range.filePath,
86
+ }));
87
+ }
88
+ function preprocessSourceWithMetadata(source, options = {}) {
89
+ const { filePath } = options;
90
+ const seen = options.seen ?? new Set();
91
+ if (filePath) {
92
+ seen.add(path.resolve(filePath));
93
+ }
94
+ const lines = source.split('\n');
95
+ const imports = [];
96
+ /** Library imports: `module library;` files routed here instead of concatenated. */
97
+ const libraryImports = [];
98
+ const bodyLines = [];
99
+ let parsingHeader = true;
100
+ for (let i = 0; i < lines.length; i++) {
101
+ const line = lines[i];
102
+ const trimmed = line.trim();
103
+ const match = line.match(IMPORT_RE);
104
+ if (parsingHeader && match) {
105
+ if (!filePath) {
106
+ throw new diagnostics_1.DiagnosticError('ParseError', 'Import statements require a file path', { line: i + 1, col: 1 }, lines);
107
+ }
108
+ const importPath = path.resolve(path.dirname(filePath), match[1]);
109
+ if (!seen.has(importPath)) {
110
+ seen.add(importPath);
111
+ let importedSource;
112
+ try {
113
+ importedSource = fs.readFileSync(importPath, 'utf-8');
114
+ }
115
+ catch {
116
+ throw new diagnostics_1.DiagnosticError('ParseError', `Cannot import '${match[1]}'`, { file: filePath, line: i + 1, col: 1 }, lines);
117
+ }
118
+ if (isLibrarySource(importedSource)) {
119
+ // Library file: parse separately so its functions are DCE-eligible.
120
+ // Also collect any transitive library imports inside it.
121
+ const nested = preprocessSourceWithMetadata(importedSource, { filePath: importPath, seen });
122
+ libraryImports.push({ source: importedSource, filePath: importPath });
123
+ // Propagate transitive library imports (e.g. math.mcrs imports vec.mcrs)
124
+ if (nested.libraryImports)
125
+ libraryImports.push(...nested.libraryImports);
126
+ }
127
+ else {
128
+ imports.push(preprocessSourceWithMetadata(importedSource, { filePath: importPath, seen }));
129
+ }
130
+ }
131
+ continue;
132
+ }
133
+ if (parsingHeader && (trimmed === '' || trimmed.startsWith('//'))) {
134
+ bodyLines.push(line);
135
+ continue;
136
+ }
137
+ parsingHeader = false;
138
+ bodyLines.push(line);
139
+ }
140
+ const body = bodyLines.join('\n');
141
+ const parts = [...imports.map(entry => entry.source), body].filter(Boolean);
142
+ const combined = parts.join('\n');
143
+ const ranges = [];
144
+ let lineOffset = 0;
145
+ for (const entry of imports) {
146
+ ranges.push(...offsetRanges(entry.ranges, lineOffset));
147
+ lineOffset += countLines(entry.source);
148
+ }
149
+ if (filePath && body) {
150
+ ranges.push({
151
+ startLine: lineOffset + 1,
152
+ endLine: lineOffset + countLines(body),
153
+ filePath: path.resolve(filePath),
154
+ });
155
+ }
156
+ return {
157
+ source: combined,
158
+ ranges,
159
+ libraryImports: libraryImports.length > 0 ? libraryImports : undefined,
160
+ };
161
+ }
162
+ function preprocessSource(source, options = {}) {
163
+ return preprocessSourceWithMetadata(source, options).source;
164
+ }
165
+ //# sourceMappingURL=compile.js.map
@@ -41,4 +41,4 @@ export declare class DiagnosticCollector {
41
41
  * e.g., "Expected ';' at line 5, col 12"
42
42
  */
43
43
  export declare function parseErrorMessage(kind: DiagnosticKind, rawMessage: string, sourceLines?: string[], filePath?: string): DiagnosticError;
44
- export declare function formatError(error: Error | DiagnosticError, source?: string): string;
44
+ export declare function formatError(error: Error | DiagnosticError, source?: string, filePath?: string): string;