redscript-mc 2.6.2 → 3.0.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 (636) hide show
  1. package/.github/workflows/ci.yml +11 -0
  2. package/CHANGELOG.md +18 -9
  3. package/README-benchmarks.md +48 -0
  4. package/README-vscode-test.md +251 -0
  5. package/RELEASE_NOTES.md +74 -0
  6. package/ROADMAP.md +131 -167
  7. package/benchmarks/_shared.ts +468 -0
  8. package/benchmarks/baseline.json +2816 -0
  9. package/benchmarks/baseline.md +13 -0
  10. package/benchmarks/compiler-perf.report.json +207 -0
  11. package/benchmarks/compiler-perf.ts +76 -0
  12. package/benchmarks/results.md +13 -0
  13. package/benchmarks/stdlib-complexity.report.json +2606 -0
  14. package/benchmarks/stdlib-complexity.ts +54 -0
  15. package/benchmarks/stdlib-size.md +57 -0
  16. package/benchmarks/stdlib-size.ts +91 -0
  17. package/coverage-report.md +177 -0
  18. package/dist/src/__tests__/budget.test.js +4 -0
  19. package/dist/src/__tests__/cache/cache-behavior.test.d.ts +10 -0
  20. package/dist/src/__tests__/cache/cache-behavior.test.js +425 -0
  21. package/dist/src/__tests__/cache-extra.test.d.ts +5 -0
  22. package/dist/src/__tests__/cache-extra.test.js +211 -0
  23. package/dist/src/__tests__/cli-init.test.d.ts +1 -0
  24. package/dist/src/__tests__/cli-init.test.js +97 -0
  25. package/dist/src/__tests__/cli-publish.test.d.ts +9 -0
  26. package/dist/src/__tests__/cli-publish.test.js +189 -0
  27. package/dist/src/__tests__/cli.test.js +76 -0
  28. package/dist/src/__tests__/compile-preprocess.test.d.ts +11 -0
  29. package/dist/src/__tests__/compile-preprocess.test.js +328 -0
  30. package/dist/src/__tests__/compiler/break-stmt.test.d.ts +1 -0
  31. package/dist/src/__tests__/compiler/break-stmt.test.js +58 -0
  32. package/dist/src/__tests__/compiler/const-decl.test.d.ts +1 -0
  33. package/dist/src/__tests__/compiler/const-decl.test.js +123 -0
  34. package/dist/src/__tests__/compiler/continue-stmt.test.d.ts +1 -0
  35. package/dist/src/__tests__/compiler/continue-stmt.test.js +67 -0
  36. package/dist/src/__tests__/compiler/coroutine-extended.test.d.ts +17 -0
  37. package/dist/src/__tests__/compiler/coroutine-extended.test.js +565 -0
  38. package/dist/src/__tests__/compiler/deprecated.test.d.ts +4 -0
  39. package/dist/src/__tests__/compiler/deprecated.test.js +285 -0
  40. package/dist/src/__tests__/compiler/do-while.test.d.ts +1 -0
  41. package/dist/src/__tests__/compiler/do-while.test.js +120 -0
  42. package/dist/src/__tests__/compiler/enum-payload.test.d.ts +9 -0
  43. package/dist/src/__tests__/compiler/enum-payload.test.js +272 -0
  44. package/dist/src/__tests__/compiler/interface.test.d.ts +10 -0
  45. package/dist/src/__tests__/compiler/interface.test.js +258 -0
  46. package/dist/src/__tests__/compiler/labeled-loops.test.d.ts +1 -0
  47. package/dist/src/__tests__/compiler/labeled-loops.test.js +263 -0
  48. package/dist/src/__tests__/compiler/match-string.test.d.ts +1 -0
  49. package/dist/src/__tests__/compiler/match-string.test.js +43 -0
  50. package/dist/src/__tests__/compiler/memoize.test.d.ts +1 -0
  51. package/dist/src/__tests__/compiler/memoize.test.js +113 -0
  52. package/dist/src/__tests__/compiler/method-chain.test.d.ts +5 -0
  53. package/dist/src/__tests__/compiler/method-chain.test.js +115 -0
  54. package/dist/src/__tests__/compiler/module-import.test.d.ts +12 -0
  55. package/dist/src/__tests__/compiler/module-import.test.js +261 -0
  56. package/dist/src/__tests__/compiler/option-extensions.test.d.ts +6 -0
  57. package/dist/src/__tests__/compiler/option-extensions.test.js +191 -0
  58. package/dist/src/__tests__/compiler/profile-decorator.test.d.ts +1 -0
  59. package/dist/src/__tests__/compiler/profile-decorator.test.js +69 -0
  60. package/dist/src/__tests__/compiler/string-advanced.test.d.ts +7 -0
  61. package/dist/src/__tests__/compiler/string-advanced.test.js +281 -0
  62. package/dist/src/__tests__/compiler/struct-extends.test.d.ts +1 -0
  63. package/dist/src/__tests__/compiler/struct-extends.test.js +95 -0
  64. package/dist/src/__tests__/compiler/throttle-retry.test.d.ts +1 -0
  65. package/dist/src/__tests__/compiler/throttle-retry.test.js +166 -0
  66. package/dist/src/__tests__/compiler/tuple-type.test.d.ts +10 -0
  67. package/dist/src/__tests__/compiler/tuple-type.test.js +229 -0
  68. package/dist/src/__tests__/compiler/watch-decorator.test.d.ts +1 -0
  69. package/dist/src/__tests__/compiler/watch-decorator.test.js +65 -0
  70. package/dist/src/__tests__/config/project-config.test.d.ts +1 -0
  71. package/dist/src/__tests__/config/project-config.test.js +199 -0
  72. package/dist/src/__tests__/config-decorator.test.d.ts +8 -0
  73. package/dist/src/__tests__/config-decorator.test.js +142 -0
  74. package/dist/src/__tests__/diagnostics-extra.test.d.ts +6 -0
  75. package/dist/src/__tests__/diagnostics-extra.test.js +132 -0
  76. package/dist/src/__tests__/emit/compile-branches.test.d.ts +1 -0
  77. package/dist/src/__tests__/emit/compile-branches.test.js +123 -0
  78. package/dist/src/__tests__/emit/compile-coverage.test.d.ts +25 -0
  79. package/dist/src/__tests__/emit/compile-coverage.test.js +617 -0
  80. package/dist/src/__tests__/emit/compile-extra-branches.test.d.ts +12 -0
  81. package/dist/src/__tests__/emit/compile-extra-branches.test.js +225 -0
  82. package/dist/src/__tests__/emit/compile-mocked-branches.test.d.ts +0 -0
  83. package/dist/src/__tests__/emit/compile-mocked-branches.test.js +238 -0
  84. package/dist/src/__tests__/emit/execute-chain.test.d.ts +10 -0
  85. package/dist/src/__tests__/emit/execute-chain.test.js +94 -0
  86. package/dist/src/__tests__/emit/index.test.js +2 -1
  87. package/dist/src/__tests__/emit/modules-branches.test.d.ts +1 -0
  88. package/dist/src/__tests__/emit/modules-branches.test.js +88 -0
  89. package/dist/src/__tests__/emit/modules-coverage.test.d.ts +15 -0
  90. package/dist/src/__tests__/emit/modules-coverage.test.js +221 -0
  91. package/dist/src/__tests__/emit/modules-errors.test.d.ts +12 -0
  92. package/dist/src/__tests__/emit/modules-errors.test.js +169 -0
  93. package/dist/src/__tests__/emit/modules-rewrite.test.d.ts +17 -0
  94. package/dist/src/__tests__/emit/modules-rewrite.test.js +204 -0
  95. package/dist/src/__tests__/emit/source-map.test.d.ts +1 -0
  96. package/dist/src/__tests__/emit/source-map.test.js +167 -0
  97. package/dist/src/__tests__/enum.test.js +9 -4
  98. package/dist/src/__tests__/error-recovery.test.d.ts +7 -0
  99. package/dist/src/__tests__/error-recovery.test.js +217 -0
  100. package/dist/src/__tests__/events-types-extra.test.d.ts +10 -0
  101. package/dist/src/__tests__/events-types-extra.test.js +91 -0
  102. package/dist/src/__tests__/events-types.test.d.ts +4 -0
  103. package/dist/src/__tests__/events-types.test.js +56 -0
  104. package/dist/src/__tests__/formatter.test.js +13 -5
  105. package/dist/src/__tests__/hir/lower-extra.test.d.ts +9 -0
  106. package/dist/src/__tests__/hir/lower-extra.test.js +140 -0
  107. package/dist/src/__tests__/hir/monomorphize-extra.test.d.ts +15 -0
  108. package/dist/src/__tests__/hir/monomorphize-extra.test.js +200 -0
  109. package/dist/src/__tests__/hir/monomorphize-extra2.test.d.ts +16 -0
  110. package/dist/src/__tests__/hir/monomorphize-extra2.test.js +316 -0
  111. package/dist/src/__tests__/incremental.test.js +10 -2
  112. package/dist/src/__tests__/index-extra.test.d.ts +10 -0
  113. package/dist/src/__tests__/index-extra.test.js +71 -0
  114. package/dist/src/__tests__/lexer.test.js +2 -2
  115. package/dist/src/__tests__/lint/rules.test.d.ts +5 -0
  116. package/dist/src/__tests__/lint/rules.test.js +208 -0
  117. package/dist/src/__tests__/lir/lower.test.js +29 -0
  118. package/dist/src/__tests__/lir/verify.test.js +30 -0
  119. package/dist/src/__tests__/lsp/completion.test.d.ts +7 -0
  120. package/dist/src/__tests__/lsp/completion.test.js +583 -0
  121. package/dist/src/__tests__/lsp/definition.test.d.ts +7 -0
  122. package/dist/src/__tests__/lsp/definition.test.js +454 -0
  123. package/dist/src/__tests__/lsp/diagnostics.test.d.ts +10 -0
  124. package/dist/src/__tests__/lsp/diagnostics.test.js +98 -0
  125. package/dist/src/__tests__/lsp/hover-docs.test.d.ts +10 -0
  126. package/dist/src/__tests__/lsp/hover-docs.test.js +210 -0
  127. package/dist/src/__tests__/lsp.test.js +4 -1
  128. package/dist/src/__tests__/mc-integration/item-entity-events.test.js +4 -0
  129. package/dist/src/__tests__/mc-integration/stdlib-coverage-2.test.js +4 -0
  130. package/dist/src/__tests__/mc-integration/stdlib-coverage-3.test.d.ts +13 -0
  131. package/dist/src/__tests__/mc-integration/stdlib-coverage-3.test.js +1227 -0
  132. package/dist/src/__tests__/mc-integration/stdlib-coverage-4.test.d.ts +13 -0
  133. package/dist/src/__tests__/mc-integration/stdlib-coverage-4.test.js +1509 -0
  134. package/dist/src/__tests__/mc-integration/stdlib-coverage-5.test.d.ts +14 -0
  135. package/dist/src/__tests__/mc-integration/stdlib-coverage-5.test.js +1374 -0
  136. package/dist/src/__tests__/mc-integration/stdlib-coverage-6.test.d.ts +10 -0
  137. package/dist/src/__tests__/mc-integration/stdlib-coverage-6.test.js +759 -0
  138. package/dist/src/__tests__/mc-integration/stdlib-coverage-7.test.d.ts +13 -0
  139. package/dist/src/__tests__/mc-integration/stdlib-coverage-7.test.js +855 -0
  140. package/dist/src/__tests__/mc-integration/stdlib-coverage.test.js +4 -0
  141. package/dist/src/__tests__/mc-integration/syntax-coverage.test.js +4 -0
  142. package/dist/src/__tests__/mc-validator-coverage.test.d.ts +13 -0
  143. package/dist/src/__tests__/mc-validator-coverage.test.js +296 -0
  144. package/dist/src/__tests__/mc-validator-extra.test.d.ts +13 -0
  145. package/dist/src/__tests__/mc-validator-extra.test.js +245 -0
  146. package/dist/src/__tests__/mir/lower-extra.test.d.ts +20 -0
  147. package/dist/src/__tests__/mir/lower-extra.test.js +361 -0
  148. package/dist/src/__tests__/mir/lower-extra2.test.d.ts +17 -0
  149. package/dist/src/__tests__/mir/lower-extra2.test.js +317 -0
  150. package/dist/src/__tests__/mir/lower-extra3.test.d.ts +19 -0
  151. package/dist/src/__tests__/mir/lower-extra3.test.js +249 -0
  152. package/dist/src/__tests__/mir/lower-extra4.test.d.ts +23 -0
  153. package/dist/src/__tests__/mir/lower-extra4.test.js +606 -0
  154. package/dist/src/__tests__/mir/lower-extra5.test.d.ts +25 -0
  155. package/dist/src/__tests__/mir/lower-extra5.test.js +543 -0
  156. package/dist/src/__tests__/mir/lower-extra6.test.d.ts +16 -0
  157. package/dist/src/__tests__/mir/lower-extra6.test.js +471 -0
  158. package/dist/src/__tests__/mir/lower-extra7.test.d.ts +35 -0
  159. package/dist/src/__tests__/mir/lower-extra7.test.js +921 -0
  160. package/dist/src/__tests__/mir/lower-extra8.test.d.ts +19 -0
  161. package/dist/src/__tests__/mir/lower-extra8.test.js +626 -0
  162. package/dist/src/__tests__/mir/lower-extra9.test.d.ts +14 -0
  163. package/dist/src/__tests__/mir/lower-extra9.test.js +717 -0
  164. package/dist/src/__tests__/optimizer/auto-inline.test.d.ts +1 -0
  165. package/dist/src/__tests__/optimizer/auto-inline.test.js +176 -0
  166. package/dist/src/__tests__/optimizer/cse.test.d.ts +4 -0
  167. package/dist/src/__tests__/optimizer/cse.test.js +178 -0
  168. package/dist/src/__tests__/optimizer/inline_fn.test.d.ts +1 -0
  169. package/dist/src/__tests__/optimizer/inline_fn.test.js +221 -0
  170. package/dist/src/__tests__/optimizer/licm.test.d.ts +1 -0
  171. package/dist/src/__tests__/optimizer/licm.test.js +244 -0
  172. package/dist/src/__tests__/optimizer/optimizer-extended.test.d.ts +12 -0
  173. package/dist/src/__tests__/optimizer/optimizer-extended.test.js +993 -0
  174. package/dist/src/__tests__/optimizer/strength-reduction.test.d.ts +1 -0
  175. package/dist/src/__tests__/optimizer/strength-reduction.test.js +86 -0
  176. package/dist/src/__tests__/optimizer/tco.test.d.ts +14 -0
  177. package/dist/src/__tests__/optimizer/tco.test.js +203 -0
  178. package/dist/src/__tests__/parser-coverage.test.d.ts +25 -0
  179. package/dist/src/__tests__/parser-coverage.test.js +491 -0
  180. package/dist/src/__tests__/parser-extra.test.d.ts +6 -0
  181. package/dist/src/__tests__/parser-extra.test.js +451 -0
  182. package/dist/src/__tests__/parser.test.js +12 -0
  183. package/dist/src/__tests__/repl-extra.test.d.ts +13 -0
  184. package/dist/src/__tests__/repl-extra.test.js +174 -0
  185. package/dist/src/__tests__/repl-server-extra.test.d.ts +10 -0
  186. package/dist/src/__tests__/repl-server-extra.test.js +161 -0
  187. package/dist/src/__tests__/repl-server.test.d.ts +6 -0
  188. package/dist/src/__tests__/repl-server.test.js +146 -0
  189. package/dist/src/__tests__/runtime-extra.test.d.ts +15 -0
  190. package/dist/src/__tests__/runtime-extra.test.js +732 -0
  191. package/dist/src/__tests__/singleton-decorator.test.d.ts +11 -0
  192. package/dist/src/__tests__/singleton-decorator.test.js +260 -0
  193. package/dist/src/__tests__/sourcemap.test.js +1 -1
  194. package/dist/src/__tests__/stdlib/advanced.test.d.ts +5 -0
  195. package/dist/src/__tests__/stdlib/advanced.test.js +301 -0
  196. package/dist/src/__tests__/stdlib/bigint.test.d.ts +4 -0
  197. package/dist/src/__tests__/stdlib/bigint.test.js +83 -0
  198. package/dist/src/__tests__/stdlib/bits.test.d.ts +4 -0
  199. package/dist/src/__tests__/stdlib/bits.test.js +96 -0
  200. package/dist/src/__tests__/stdlib/bossbar.test.d.ts +4 -0
  201. package/dist/src/__tests__/stdlib/bossbar.test.js +72 -0
  202. package/dist/src/__tests__/stdlib/color.test.d.ts +4 -0
  203. package/dist/src/__tests__/stdlib/color.test.js +84 -0
  204. package/dist/src/__tests__/stdlib/combat.test.d.ts +4 -0
  205. package/dist/src/__tests__/stdlib/combat.test.js +64 -0
  206. package/dist/src/__tests__/stdlib/cooldown.test.d.ts +4 -0
  207. package/dist/src/__tests__/stdlib/cooldown.test.js +64 -0
  208. package/dist/src/__tests__/stdlib/dialog.test.js +15 -7
  209. package/dist/src/__tests__/stdlib/ecs.test.d.ts +4 -0
  210. package/dist/src/__tests__/stdlib/ecs.test.js +81 -0
  211. package/dist/src/__tests__/stdlib/effects.test.d.ts +4 -0
  212. package/dist/src/__tests__/stdlib/effects.test.js +72 -0
  213. package/dist/src/__tests__/stdlib/events.test.d.ts +4 -0
  214. package/dist/src/__tests__/stdlib/events.test.js +55 -0
  215. package/dist/src/__tests__/stdlib/expr.test.d.ts +4 -0
  216. package/dist/src/__tests__/stdlib/expr.test.js +77 -0
  217. package/dist/src/__tests__/stdlib/fft.test.d.ts +4 -0
  218. package/dist/src/__tests__/stdlib/fft.test.js +82 -0
  219. package/dist/src/__tests__/stdlib/graph.test.d.ts +4 -0
  220. package/dist/src/__tests__/stdlib/graph.test.js +102 -0
  221. package/dist/src/__tests__/stdlib/interactions.test.d.ts +4 -0
  222. package/dist/src/__tests__/stdlib/interactions.test.js +60 -0
  223. package/dist/src/__tests__/stdlib/inventory.test.d.ts +4 -0
  224. package/dist/src/__tests__/stdlib/inventory.test.js +68 -0
  225. package/dist/src/__tests__/stdlib/linalg.test.d.ts +5 -0
  226. package/dist/src/__tests__/stdlib/linalg.test.js +78 -0
  227. package/dist/src/__tests__/stdlib/map.test.d.ts +1 -0
  228. package/dist/src/__tests__/stdlib/map.test.js +84 -0
  229. package/dist/src/__tests__/stdlib/math.test.js +19 -6
  230. package/dist/src/__tests__/stdlib/math_hp.test.d.ts +4 -0
  231. package/dist/src/__tests__/stdlib/math_hp.test.js +80 -0
  232. package/dist/src/__tests__/stdlib/mobs.test.d.ts +4 -0
  233. package/dist/src/__tests__/stdlib/mobs.test.js +61 -0
  234. package/dist/src/__tests__/stdlib/noise.test.d.ts +4 -0
  235. package/dist/src/__tests__/stdlib/noise.test.js +73 -0
  236. package/dist/src/__tests__/stdlib/ode.test.d.ts +4 -0
  237. package/dist/src/__tests__/stdlib/ode.test.js +68 -0
  238. package/dist/src/__tests__/stdlib/parabola.test.d.ts +4 -0
  239. package/dist/src/__tests__/stdlib/parabola.test.js +77 -0
  240. package/dist/src/__tests__/stdlib/particles.test.d.ts +4 -0
  241. package/dist/src/__tests__/stdlib/particles.test.js +68 -0
  242. package/dist/src/__tests__/stdlib/physics.test.d.ts +4 -0
  243. package/dist/src/__tests__/stdlib/physics.test.js +76 -0
  244. package/dist/src/__tests__/stdlib/player.test.d.ts +4 -0
  245. package/dist/src/__tests__/stdlib/player.test.js +64 -0
  246. package/dist/src/__tests__/stdlib/quaternion.test.d.ts +4 -0
  247. package/dist/src/__tests__/stdlib/quaternion.test.js +73 -0
  248. package/dist/src/__tests__/stdlib/queue.test.d.ts +1 -0
  249. package/dist/src/__tests__/stdlib/queue.test.js +97 -0
  250. package/dist/src/__tests__/stdlib/random.test.d.ts +4 -0
  251. package/dist/src/__tests__/stdlib/random.test.js +76 -0
  252. package/dist/src/__tests__/stdlib/result.test.d.ts +12 -0
  253. package/dist/src/__tests__/stdlib/result.test.js +329 -0
  254. package/dist/src/__tests__/stdlib/scheduler.test.js +19 -8
  255. package/dist/src/__tests__/stdlib/set_int.test.d.ts +1 -0
  256. package/dist/src/__tests__/stdlib/set_int.test.js +88 -0
  257. package/dist/src/__tests__/stdlib/sets.test.d.ts +6 -0
  258. package/dist/src/__tests__/stdlib/sets.test.js +60 -0
  259. package/dist/src/__tests__/stdlib/signal.test.d.ts +4 -0
  260. package/dist/src/__tests__/stdlib/signal.test.js +84 -0
  261. package/dist/src/__tests__/stdlib/spawn.test.d.ts +4 -0
  262. package/dist/src/__tests__/stdlib/spawn.test.js +68 -0
  263. package/dist/src/__tests__/stdlib/string.test.d.ts +12 -0
  264. package/dist/src/__tests__/stdlib/string.test.js +231 -0
  265. package/dist/src/__tests__/stdlib/strings.test.d.ts +4 -0
  266. package/dist/src/__tests__/stdlib/strings.test.js +83 -0
  267. package/dist/src/__tests__/stdlib/tags.test.d.ts +4 -0
  268. package/dist/src/__tests__/stdlib/tags.test.js +57 -0
  269. package/dist/src/__tests__/stdlib/teams.test.d.ts +4 -0
  270. package/dist/src/__tests__/stdlib/teams.test.js +72 -0
  271. package/dist/src/__tests__/stdlib/timer.test.d.ts +4 -0
  272. package/dist/src/__tests__/stdlib/timer.test.js +79 -0
  273. package/dist/src/__tests__/stdlib/vec.test.d.ts +5 -0
  274. package/dist/src/__tests__/stdlib/vec.test.js +94 -0
  275. package/dist/src/__tests__/stdlib/world.test.d.ts +4 -0
  276. package/dist/src/__tests__/stdlib/world.test.js +72 -0
  277. package/dist/src/__tests__/struct-display.test.d.ts +1 -0
  278. package/dist/src/__tests__/struct-display.test.js +64 -0
  279. package/dist/src/__tests__/test-framework/runner.test.d.ts +10 -0
  280. package/dist/src/__tests__/test-framework/runner.test.js +193 -0
  281. package/dist/src/__tests__/tuner/adapters.test.d.ts +14 -0
  282. package/dist/src/__tests__/tuner/adapters.test.js +194 -0
  283. package/dist/src/__tests__/tuner/simulator-extra.test.d.ts +4 -0
  284. package/dist/src/__tests__/tuner/simulator-extra.test.js +193 -0
  285. package/dist/src/__tests__/typechecker-coverage.test.d.ts +30 -0
  286. package/dist/src/__tests__/typechecker-coverage.test.js +627 -0
  287. package/dist/src/__tests__/typechecker.test.js +3 -3
  288. package/dist/src/__tests__/watch-decorator.test.d.ts +1 -0
  289. package/dist/src/__tests__/watch-decorator.test.js +54 -0
  290. package/dist/src/ast/types.d.ts +102 -3
  291. package/dist/src/cache/incremental.d.ts +13 -14
  292. package/dist/src/cache/incremental.js +106 -89
  293. package/dist/src/cache/index.d.ts +8 -2
  294. package/dist/src/cache/index.js +18 -6
  295. package/dist/src/cli.d.ts +1 -0
  296. package/dist/src/cli.js +466 -17
  297. package/dist/src/config/project-config.d.ts +29 -0
  298. package/dist/src/config/project-config.js +180 -0
  299. package/dist/src/diagnostics/index.d.ts +9 -0
  300. package/dist/src/diagnostics/index.js +18 -1
  301. package/dist/src/emit/compile.d.ts +10 -0
  302. package/dist/src/emit/compile.js +395 -50
  303. package/dist/src/emit/index.d.ts +40 -0
  304. package/dist/src/emit/index.js +307 -14
  305. package/dist/src/emit/modules.js +21 -3
  306. package/dist/src/emit/sourcemap.d.ts +23 -27
  307. package/dist/src/emit/sourcemap.js +52 -30
  308. package/dist/src/formatter/index.js +33 -8
  309. package/dist/src/hir/deprecated.d.ts +13 -0
  310. package/dist/src/hir/deprecated.js +218 -0
  311. package/dist/src/hir/lower.js +114 -8
  312. package/dist/src/hir/monomorphize.js +22 -2
  313. package/dist/src/hir/types.d.ts +65 -1
  314. package/dist/src/index.d.ts +6 -0
  315. package/dist/src/index.js +18 -3
  316. package/dist/src/lexer/index.d.ts +2 -1
  317. package/dist/src/lexer/index.js +39 -3
  318. package/dist/src/lint/index.d.ts +45 -0
  319. package/dist/src/lint/index.js +930 -0
  320. package/dist/src/lir/lower.js +29 -2
  321. package/dist/src/lir/types.d.ts +2 -0
  322. package/dist/src/lsp/server.js +92 -5
  323. package/dist/src/mir/lower.js +775 -34
  324. package/dist/src/mir/macro.js +36 -2
  325. package/dist/src/mir/types.d.ts +12 -0
  326. package/dist/src/mir/verify.js +9 -0
  327. package/dist/src/optimizer/auto-inline.d.ts +2 -0
  328. package/dist/src/optimizer/auto-inline.js +67 -0
  329. package/dist/src/optimizer/cse.d.ts +20 -0
  330. package/dist/src/optimizer/cse.js +234 -0
  331. package/dist/src/optimizer/inline.d.ts +26 -0
  332. package/dist/src/optimizer/inline.js +286 -0
  333. package/dist/src/optimizer/interprocedural.js +4 -0
  334. package/dist/src/optimizer/licm.d.ts +32 -0
  335. package/dist/src/optimizer/licm.js +371 -0
  336. package/dist/src/optimizer/pipeline.js +12 -2
  337. package/dist/src/optimizer/strength_reduction.d.ts +15 -0
  338. package/dist/src/optimizer/strength_reduction.js +90 -0
  339. package/dist/src/optimizer/tco.d.ts +53 -0
  340. package/dist/src/optimizer/tco.js +238 -0
  341. package/dist/src/parser/index.d.ts +32 -0
  342. package/dist/src/parser/index.js +421 -59
  343. package/dist/src/repl-server.d.ts +13 -0
  344. package/dist/src/repl-server.js +127 -0
  345. package/dist/src/structs/expand.d.ts +15 -0
  346. package/dist/src/structs/expand.js +46 -0
  347. package/dist/src/testing/runner.d.ts +40 -0
  348. package/dist/src/testing/runner.js +237 -0
  349. package/dist/src/typechecker/index.d.ts +3 -0
  350. package/dist/src/typechecker/index.js +254 -9
  351. package/dist/tsconfig.tsbuildinfo +1 -1
  352. package/doc-drafts/redscript-docs/docs/en/stdlib/graph.md +104 -0
  353. package/doc-drafts/redscript-docs/docs/en/stdlib/parabola.md +113 -0
  354. package/doc-drafts/redscript-docs/docs/en/stdlib/pathfind.md +104 -0
  355. package/doc-drafts/redscript-docs/docs/en/stdlib/physics.md +134 -0
  356. package/doc-drafts/redscript-docs/docs/en/stdlib/quaternion.md +135 -0
  357. package/doc-drafts/redscript-docs/docs/zh/stdlib/graph.md +104 -0
  358. package/doc-drafts/redscript-docs/docs/zh/stdlib/parabola.md +113 -0
  359. package/doc-drafts/redscript-docs/docs/zh/stdlib/pathfind.md +104 -0
  360. package/doc-drafts/redscript-docs/docs/zh/stdlib/physics.md +134 -0
  361. package/doc-drafts/redscript-docs/docs/zh/stdlib/quaternion.md +135 -0
  362. package/docs/stdlib/result.md +156 -0
  363. package/docs/stdlib/result.zh.md +156 -0
  364. package/editors/vscode/fixtures/test.mcrs +7 -0
  365. package/editors/vscode/out/extension.js +2095 -225
  366. package/editors/vscode/out/lsp-server.js +519 -51
  367. package/editors/vscode/package-lock.json +9 -4
  368. package/editors/vscode/package.json +1 -1
  369. package/examples/display-demo.mcrs +64 -0
  370. package/examples/game/racing.mcrs +301 -0
  371. package/examples/game/tower_defense.mcrs +311 -0
  372. package/examples/math/physics_sim.mcrs +322 -0
  373. package/examples/rpg/boss_fight.mcrs +313 -0
  374. package/examples/rpg/health_system.mcrs +237 -0
  375. package/examples/rpg/inventory.mcrs +265 -0
  376. package/examples/util/debug_hud.mcrs +279 -0
  377. package/jest.config.js +10 -0
  378. package/package.json +12 -3
  379. package/playground/index.html +823 -0
  380. package/scripts/gen-docs.ts +533 -0
  381. package/scripts/update-redscript-docs-stdlib.sh +770 -0
  382. package/src/__tests__/budget.test.ts +5 -0
  383. package/src/__tests__/cache/cache-behavior.test.ts +480 -0
  384. package/src/__tests__/cache-extra.test.ts +199 -0
  385. package/src/__tests__/cli-docs.test.ts +77 -0
  386. package/src/__tests__/cli-init.test.ts +91 -0
  387. package/src/__tests__/cli-publish.test.ts +190 -0
  388. package/src/__tests__/cli.test.ts +117 -1
  389. package/src/__tests__/compile-preprocess.test.ts +366 -0
  390. package/src/__tests__/compiler/break-stmt.test.ts +66 -0
  391. package/src/__tests__/compiler/const-decl.test.ts +141 -0
  392. package/src/__tests__/compiler/continue-stmt.test.ts +81 -0
  393. package/src/__tests__/compiler/coroutine-extended.test.ts +723 -0
  394. package/src/__tests__/compiler/deprecated.test.ts +305 -0
  395. package/src/__tests__/compiler/do-while.test.ts +130 -0
  396. package/src/__tests__/compiler/enum-payload.test.ts +299 -0
  397. package/src/__tests__/compiler/interface.test.ts +287 -0
  398. package/src/__tests__/compiler/labeled-loops.test.ts +279 -0
  399. package/src/__tests__/compiler/match-string.test.ts +45 -0
  400. package/src/__tests__/compiler/memoize.test.ts +126 -0
  401. package/src/__tests__/compiler/method-chain.test.ts +121 -0
  402. package/src/__tests__/compiler/module-import.test.ts +240 -0
  403. package/src/__tests__/compiler/option-extensions.test.ts +207 -0
  404. package/src/__tests__/compiler/profile-decorator.test.ts +79 -0
  405. package/src/__tests__/compiler/string-advanced.test.ts +310 -0
  406. package/src/__tests__/compiler/struct-extends.test.ts +109 -0
  407. package/src/__tests__/compiler/throttle-retry.test.ts +191 -0
  408. package/src/__tests__/compiler/tuple-type.test.ts +263 -0
  409. package/src/__tests__/compiler/watch-decorator.test.ts +72 -0
  410. package/src/__tests__/config/project-config.test.ts +181 -0
  411. package/src/__tests__/config-decorator.test.ts +157 -0
  412. package/src/__tests__/diagnostics-extra.test.ts +155 -0
  413. package/src/__tests__/emit/compile-branches.test.ts +135 -0
  414. package/src/__tests__/emit/compile-coverage.test.ts +696 -0
  415. package/src/__tests__/emit/compile-extra-branches.test.ts +228 -0
  416. package/src/__tests__/emit/compile-mocked-branches.test.ts +249 -0
  417. package/src/__tests__/emit/compile.test.ts +6 -1
  418. package/src/__tests__/emit/execute-chain.test.ts +114 -0
  419. package/src/__tests__/emit/index.test.ts +2 -1
  420. package/src/__tests__/emit/modules-branches.test.ts +90 -0
  421. package/src/__tests__/emit/modules-coverage.test.ts +241 -0
  422. package/src/__tests__/emit/modules-errors.test.ts +192 -0
  423. package/src/__tests__/emit/modules-rewrite.test.ts +232 -0
  424. package/src/__tests__/emit/source-map.test.ts +152 -0
  425. package/src/__tests__/enum.test.ts +9 -4
  426. package/src/__tests__/error-recovery.test.ts +226 -0
  427. package/src/__tests__/events-types-extra.test.ts +110 -0
  428. package/src/__tests__/events-types.test.ts +66 -0
  429. package/src/__tests__/formatter.test.ts +15 -5
  430. package/src/__tests__/generics.test.ts +16 -9
  431. package/src/__tests__/hir/lower-extra.test.ts +151 -0
  432. package/src/__tests__/hir/monomorphize-coverage.test.ts +432 -0
  433. package/src/__tests__/hir/monomorphize-extra.test.ts +220 -0
  434. package/src/__tests__/hir/monomorphize-extra2.test.ts +350 -0
  435. package/src/__tests__/impl.test.ts +12 -8
  436. package/src/__tests__/incremental.test.ts +10 -2
  437. package/src/__tests__/index-extra.test.ts +79 -0
  438. package/src/__tests__/lexer.test.ts +2 -2
  439. package/src/__tests__/lint/hir-coverage.test.ts +1716 -0
  440. package/src/__tests__/lint/rules-coverage.test.ts +598 -0
  441. package/src/__tests__/lint/rules.test.ts +230 -0
  442. package/src/__tests__/lir/lower.test.ts +33 -0
  443. package/src/__tests__/lir/verify.test.ts +33 -0
  444. package/src/__tests__/lsp/completion.test.ts +687 -0
  445. package/src/__tests__/lsp/definition.test.ts +499 -0
  446. package/src/__tests__/lsp/diagnostics.test.ts +108 -0
  447. package/src/__tests__/lsp/hover-docs.test.ts +222 -0
  448. package/src/__tests__/lsp.test.ts +4 -1
  449. package/src/__tests__/mc-integration/item-entity-events.test.ts +5 -0
  450. package/src/__tests__/mc-integration/stdlib-coverage-2.test.ts +5 -0
  451. package/src/__tests__/mc-integration/stdlib-coverage-3.test.ts +1105 -0
  452. package/src/__tests__/mc-integration/stdlib-coverage-4.test.ts +1366 -0
  453. package/src/__tests__/mc-integration/stdlib-coverage-5.test.ts +1245 -0
  454. package/src/__tests__/mc-integration/stdlib-coverage-6.test.ts +755 -0
  455. package/src/__tests__/mc-integration/stdlib-coverage-7.test.ts +771 -0
  456. package/src/__tests__/mc-integration/stdlib-coverage.test.ts +5 -0
  457. package/src/__tests__/mc-integration/syntax-coverage.test.ts +5 -0
  458. package/src/__tests__/mc-validator-coverage.test.ts +325 -0
  459. package/src/__tests__/mc-validator-extra.test.ts +252 -0
  460. package/src/__tests__/mir/lower-extra.test.ts +402 -0
  461. package/src/__tests__/mir/lower-extra2.test.ts +348 -0
  462. package/src/__tests__/mir/lower-extra3.test.ts +277 -0
  463. package/src/__tests__/mir/lower-extra4.test.ts +636 -0
  464. package/src/__tests__/mir/lower-extra5.test.ts +612 -0
  465. package/src/__tests__/mir/lower-extra6.test.ts +520 -0
  466. package/src/__tests__/mir/lower-extra7.test.ts +1045 -0
  467. package/src/__tests__/mir/lower-extra8.test.ts +704 -0
  468. package/src/__tests__/mir/lower-extra9.test.ts +821 -0
  469. package/src/__tests__/optimizer/auto-inline.test.ts +206 -0
  470. package/src/__tests__/optimizer/cse.test.ts +195 -0
  471. package/src/__tests__/optimizer/inline_fn.test.ts +263 -0
  472. package/src/__tests__/optimizer/licm.test.ts +358 -0
  473. package/src/__tests__/optimizer/nbt-coalesce.test.ts +147 -0
  474. package/src/__tests__/optimizer/optimizer-extended.test.ts +1081 -0
  475. package/src/__tests__/optimizer/scoreboard-batch.test.ts +141 -0
  476. package/src/__tests__/optimizer/strength-reduction.test.ts +111 -0
  477. package/src/__tests__/optimizer/tco-coverage.test.ts +309 -0
  478. package/src/__tests__/optimizer/tco.test.ts +238 -0
  479. package/src/__tests__/option.test.ts +14 -7
  480. package/src/__tests__/parser-coverage.test.ts +576 -0
  481. package/src/__tests__/parser-extra.test.ts +531 -0
  482. package/src/__tests__/parser.test.ts +14 -0
  483. package/src/__tests__/repl-extra.test.ts +195 -0
  484. package/src/__tests__/repl-server-extra.test.ts +150 -0
  485. package/src/__tests__/repl-server.test.ts +122 -0
  486. package/src/__tests__/runtime-extra.test.ts +862 -0
  487. package/src/__tests__/singleton-decorator.test.ts +285 -0
  488. package/src/__tests__/sourcemap.test.ts +1 -1
  489. package/src/__tests__/stdlib/advanced.test.ts +312 -0
  490. package/src/__tests__/stdlib/bigint.test.ts +57 -0
  491. package/src/__tests__/stdlib/bits.test.ts +75 -0
  492. package/src/__tests__/stdlib/bossbar.test.ts +45 -0
  493. package/src/__tests__/stdlib/color.test.ts +60 -0
  494. package/src/__tests__/stdlib/combat.test.ts +35 -0
  495. package/src/__tests__/stdlib/cooldown.test.ts +35 -0
  496. package/src/__tests__/stdlib/dialog.test.ts +14 -6
  497. package/src/__tests__/stdlib/ecs.test.ts +54 -0
  498. package/src/__tests__/stdlib/effects.test.ts +45 -0
  499. package/src/__tests__/stdlib/events.test.ts +23 -0
  500. package/src/__tests__/stdlib/expr.test.ts +48 -0
  501. package/src/__tests__/stdlib/fft.test.ts +54 -0
  502. package/src/__tests__/stdlib/graph.test.ts +77 -0
  503. package/src/__tests__/stdlib/interactions.test.ts +30 -0
  504. package/src/__tests__/stdlib/inventory.test.ts +40 -0
  505. package/src/__tests__/stdlib/linalg.test.ts +52 -0
  506. package/src/__tests__/stdlib/map.test.ts +55 -0
  507. package/src/__tests__/stdlib/math.test.ts +19 -5
  508. package/src/__tests__/stdlib/math_hp.test.ts +55 -0
  509. package/src/__tests__/stdlib/mobs.test.ts +40 -0
  510. package/src/__tests__/stdlib/noise.test.ts +46 -0
  511. package/src/__tests__/stdlib/ode.test.ts +40 -0
  512. package/src/__tests__/stdlib/parabola.test.ts +51 -0
  513. package/src/__tests__/stdlib/particles.test.ts +40 -0
  514. package/src/__tests__/stdlib/physics.test.ts +50 -0
  515. package/src/__tests__/stdlib/player.test.ts +35 -0
  516. package/src/__tests__/stdlib/quaternion.test.ts +46 -0
  517. package/src/__tests__/stdlib/queue.test.ts +73 -0
  518. package/src/__tests__/stdlib/random.test.ts +50 -0
  519. package/src/__tests__/stdlib/result.test.ts +326 -0
  520. package/src/__tests__/stdlib/scheduler.test.ts +18 -7
  521. package/src/__tests__/stdlib/set_int.test.ts +62 -0
  522. package/src/__tests__/stdlib/sets.test.ts +28 -0
  523. package/src/__tests__/stdlib/signal.test.ts +60 -0
  524. package/src/__tests__/stdlib/spawn.test.ts +40 -0
  525. package/src/__tests__/stdlib/string.test.ts +224 -0
  526. package/src/__tests__/stdlib/strings.test.ts +55 -0
  527. package/src/__tests__/stdlib/tags.test.ts +32 -0
  528. package/src/__tests__/stdlib/teams.test.ts +45 -0
  529. package/src/__tests__/stdlib/timer.test.ts +53 -0
  530. package/src/__tests__/stdlib/vec.test.ts +72 -0
  531. package/src/__tests__/stdlib/world.test.ts +45 -0
  532. package/src/__tests__/struct-display.test.ts +69 -0
  533. package/src/__tests__/test-framework/runner.test.ts +208 -0
  534. package/src/__tests__/tuner/adapters.test.ts +232 -0
  535. package/src/__tests__/tuner/simulator-extra.test.ts +222 -0
  536. package/src/__tests__/tuple.test.ts +11 -4
  537. package/src/__tests__/typechecker-coverage.test.ts +671 -0
  538. package/src/__tests__/typechecker.test.ts +4 -3
  539. package/src/__tests__/watch-decorator.test.ts +59 -0
  540. package/src/ast/types.ts +65 -3
  541. package/src/cache/incremental.ts +128 -99
  542. package/src/cache/index.ts +35 -8
  543. package/src/cli.ts +538 -29
  544. package/src/config/project-config.ts +176 -0
  545. package/src/diagnostics/index.ts +22 -0
  546. package/src/docs.ts +98 -0
  547. package/src/emit/compile.ts +408 -51
  548. package/src/emit/index.ts +366 -18
  549. package/src/emit/modules.ts +19 -3
  550. package/src/emit/sourcemap.ts +64 -43
  551. package/src/formatter/index.ts +35 -8
  552. package/src/hir/deprecated.ts +212 -0
  553. package/src/hir/lower.ts +128 -8
  554. package/src/hir/monomorphize.ts +24 -2
  555. package/src/hir/types.ts +26 -1
  556. package/src/index.ts +23 -3
  557. package/src/lexer/index.ts +45 -6
  558. package/src/lint/index.ts +922 -0
  559. package/src/lir/lower.ts +30 -2
  560. package/src/lir/types.ts +4 -0
  561. package/src/lsp/server.ts +100 -1
  562. package/src/mir/lower.ts +785 -40
  563. package/src/mir/macro.ts +30 -2
  564. package/src/mir/types.ts +13 -0
  565. package/src/mir/verify.ts +10 -2
  566. package/src/optimizer/auto-inline.ts +86 -0
  567. package/src/optimizer/copy_prop.ts +2 -2
  568. package/src/optimizer/coroutine.ts +3 -3
  569. package/src/optimizer/cse.ts +205 -0
  570. package/src/optimizer/dce.ts +2 -2
  571. package/src/optimizer/inline.ts +335 -0
  572. package/src/optimizer/interprocedural.ts +5 -1
  573. package/src/optimizer/licm.ts +454 -0
  574. package/src/optimizer/nbt-coalesce.ts +109 -0
  575. package/src/optimizer/pipeline.ts +16 -2
  576. package/src/optimizer/scoreboard-batch.ts +52 -0
  577. package/src/optimizer/strength_reduction.ts +95 -0
  578. package/src/optimizer/tco.ts +267 -0
  579. package/src/optimizer/unroll.ts +2 -2
  580. package/src/parser/index.ts +426 -53
  581. package/src/repl-server.ts +102 -0
  582. package/src/stdlib/advanced.mcrs +271 -101
  583. package/src/stdlib/bigint.mcrs +97 -11
  584. package/src/stdlib/bits.mcrs +75 -12
  585. package/src/stdlib/bossbar.mcrs +37 -8
  586. package/src/stdlib/calculus.mcrs +82 -26
  587. package/src/stdlib/color.mcrs +98 -16
  588. package/src/stdlib/combat.mcrs +23 -5
  589. package/src/stdlib/cooldown.mcrs +19 -0
  590. package/src/stdlib/dialog.mcrs +45 -7
  591. package/src/stdlib/easing.mcrs +132 -12
  592. package/src/stdlib/ecs.mcrs +142 -25
  593. package/src/stdlib/effects.mcrs +88 -12
  594. package/src/stdlib/events.mcrs +21 -2
  595. package/src/stdlib/expr.mcrs +18 -3
  596. package/src/stdlib/fft.mcrs +66 -56
  597. package/src/stdlib/geometry.mcrs +137 -39
  598. package/src/stdlib/graph.mcrs +73 -0
  599. package/src/stdlib/heap.mcrs +49 -8
  600. package/src/stdlib/i18n/zh.yaml +2891 -0
  601. package/src/stdlib/interactions.mcrs +43 -20
  602. package/src/stdlib/inventory.mcrs +14 -3
  603. package/src/stdlib/linalg.mcrs +185 -30
  604. package/src/stdlib/list.mcrs +168 -18
  605. package/src/stdlib/map.mcrs +112 -0
  606. package/src/stdlib/math.mcrs +68 -18
  607. package/src/stdlib/math_hp.mcrs +124 -33
  608. package/src/stdlib/matrix.mcrs +133 -20
  609. package/src/stdlib/mobs.mcrs +87 -0
  610. package/src/stdlib/noise.mcrs +65 -21
  611. package/src/stdlib/ode.mcrs +96 -0
  612. package/src/stdlib/parabola.mcrs +104 -29
  613. package/src/stdlib/particles.mcrs +78 -21
  614. package/src/stdlib/pathfind.mcrs +89 -35
  615. package/src/stdlib/physics.mcrs +134 -26
  616. package/src/stdlib/player.mcrs +18 -0
  617. package/src/stdlib/quaternion.mcrs +213 -9
  618. package/src/stdlib/queue.mcrs +123 -0
  619. package/src/stdlib/random.mcrs +63 -18
  620. package/src/stdlib/result.mcrs +111 -0
  621. package/src/stdlib/scheduler.mcrs +59 -10
  622. package/src/stdlib/set_int.mcrs +240 -0
  623. package/src/stdlib/sets.mcrs +49 -19
  624. package/src/stdlib/signal.mcrs +151 -79
  625. package/src/stdlib/sort.mcrs +44 -24
  626. package/src/stdlib/spawn.mcrs +30 -7
  627. package/src/stdlib/state.mcrs +40 -5
  628. package/src/stdlib/strings.mcrs +131 -3
  629. package/src/stdlib/tags.mcrs +2 -2
  630. package/src/stdlib/teams.mcrs +22 -10
  631. package/src/stdlib/timer.mcrs +36 -6
  632. package/src/stdlib/vec.mcrs +44 -9
  633. package/src/stdlib/world.mcrs +57 -25
  634. package/src/structs/expand.ts +64 -0
  635. package/src/testing/runner.ts +271 -0
  636. package/src/typechecker/index.ts +273 -9
package/dist/src/cli.js CHANGED
@@ -6,6 +6,7 @@
6
6
  * Usage:
7
7
  * redscript compile <file> [-o <out>] [--namespace <ns>]
8
8
  * redscript check <file>
9
+ * redscript init [project-name]
9
10
  * redscript repl
10
11
  * redscript version
11
12
  */
@@ -42,6 +43,9 @@ var __importStar = (this && this.__importStar) || (function () {
42
43
  return result;
43
44
  };
44
45
  })();
46
+ var __importDefault = (this && this.__importDefault) || function (mod) {
47
+ return (mod && mod.__esModule) ? mod : { "default": mod };
48
+ };
45
49
  Object.defineProperty(exports, "__esModule", { value: true });
46
50
  const index_1 = require("./index");
47
51
  const diagnostics_1 = require("./diagnostics");
@@ -51,10 +55,13 @@ const metadata_1 = require("./builtins/metadata");
51
55
  const index_2 = require("./cache/index");
52
56
  const deps_1 = require("./cache/deps");
53
57
  const incremental_1 = require("./cache/incremental");
58
+ const index_3 = require("./lint/index");
54
59
  const fs = __importStar(require("fs"));
55
60
  const path = __importStar(require("path"));
56
61
  const https = __importStar(require("https"));
57
62
  const child_process_1 = require("child_process");
63
+ const archiver_1 = __importDefault(require("archiver"));
64
+ const project_config_1 = require("./config/project-config");
58
65
  // Parse command line arguments
59
66
  const args = process.argv.slice(2);
60
67
  function printUsage() {
@@ -62,9 +69,13 @@ function printUsage() {
62
69
  RedScript Compiler v2
63
70
 
64
71
  Usage:
65
- redscript compile <file> [-o <out>] [--namespace <ns>]
72
+ redscript compile <file> [-o <out>] [--namespace <ns>] [--incremental]
73
+ redscript publish <file> [-o <out.zip>] [--namespace <ns>] [--mc-version <ver>]
66
74
  redscript watch <dir> [-o <outdir>] [--namespace <ns>] [--hot-reload <url>]
75
+ redscript test <file> [--dry-run] [--mc-url <url>]
67
76
  redscript check <file>
77
+ redscript lint <file> [--max-function-lines <n>]
78
+ redscript init [project-name]
68
79
  redscript fmt <file.mcrs> [file2.mcrs ...]
69
80
  redscript generate-dts [-o <file>]
70
81
  redscript repl
@@ -72,8 +83,12 @@ Usage:
72
83
 
73
84
  Commands:
74
85
  compile Compile a RedScript file to a Minecraft datapack
86
+ publish Compile and package the datapack as a .zip (ready to install in Minecraft)
75
87
  watch Watch a directory for .mcrs file changes, recompile, and hot reload
88
+ test Compile and run @test-annotated functions as tests
76
89
  check Check a RedScript file for errors without generating output
90
+ lint Statically analyze a RedScript file for potential issues (warnings)
91
+ init Scaffold a new RedScript datapack project
77
92
  fmt Auto-format RedScript source files
78
93
  generate-dts Generate builtin function declaration file (builtins.d.mcrs)
79
94
  repl Start an interactive RedScript REPL
@@ -90,6 +105,9 @@ Options:
90
105
  e.g. --mc-version 1.20.2, --mc-version 1.19
91
106
  --lenient Treat type errors as warnings instead of blocking compilation
92
107
  --include <dir> Add a directory to the import search path (repeatable)
108
+ --incremental Enable file-level incremental compilation cache
109
+ --dry-run (test) Verify compilation only — no MC server connection needed
110
+ --mc-url <url> (test) MC server HTTP API URL for running tests live
93
111
  -h, --help Show this help message
94
112
  `);
95
113
  }
@@ -217,6 +235,37 @@ function parseArgs(args) {
217
235
  result.includeDirs.push(args[++i]);
218
236
  i++;
219
237
  }
238
+ else if (arg === '--format') {
239
+ const format = args[++i];
240
+ if (format === 'json' || format === 'human') {
241
+ result.format = format;
242
+ }
243
+ i++;
244
+ }
245
+ else if (arg === '--check') {
246
+ result.fmtCheck = true;
247
+ i++;
248
+ }
249
+ else if (arg === '--incremental') {
250
+ result.incremental = true;
251
+ i++;
252
+ }
253
+ else if (arg === '--max-function-lines') {
254
+ result.maxFunctionLines = parseInt(args[++i], 10);
255
+ i++;
256
+ }
257
+ else if (arg === '--description') {
258
+ result.description = args[++i];
259
+ i++;
260
+ }
261
+ else if (arg === '--dry-run') {
262
+ result.dryRun = true;
263
+ i++;
264
+ }
265
+ else if (arg === '--mc-url') {
266
+ result.mcUrl = args[++i];
267
+ i++;
268
+ }
220
269
  else if (!result.command) {
221
270
  result.command = arg;
222
271
  i++;
@@ -236,7 +285,88 @@ function deriveNamespace(filePath) {
236
285
  // Convert to valid identifier: lowercase, replace non-alphanumeric with underscore
237
286
  return basename.toLowerCase().replace(/[^a-z0-9]/g, '_');
238
287
  }
239
- function compileCommand(file, output, namespace, sourceMap = false, mcVersionStr, lenient = false, includeDirs) {
288
+ function sanitizeProjectName(name) {
289
+ return name.trim().toLowerCase().replace(/[^a-z0-9]/g, '_');
290
+ }
291
+ function buildInitFiles(namespace) {
292
+ return {
293
+ 'src/main.mcrs': `@load
294
+ fn setup(): void {
295
+ say("Loaded ${namespace}");
296
+ }
297
+
298
+ @tick(rate=20)
299
+ fn heartbeat(): void {
300
+ say("Tick from ${namespace}");
301
+ }
302
+ `,
303
+ 'redscript.toml': (0, project_config_1.buildTomlTemplate)(namespace),
304
+ 'redscript.config.json': `${JSON.stringify({
305
+ namespace,
306
+ entry: 'src/main.mcrs',
307
+ outDir: 'dist/',
308
+ mcVersion: '1.21.4',
309
+ }, null, 2)}
310
+ `,
311
+ '.gitignore': `dist/
312
+ .redscript-cache/
313
+ `,
314
+ 'README.md': `# ${namespace}
315
+
316
+ Minimal RedScript datapack scaffold.
317
+
318
+ ## Quick Start
319
+
320
+ \`\`\`bash
321
+ redscript compile src/main.mcrs -o dist --namespace ${namespace}
322
+ \`\`\`
323
+
324
+ Then copy \`dist/\` into your world's datapacks folder and run \`/reload\`.
325
+
326
+ ## Files
327
+
328
+ - \`src/main.mcrs\` contains \`@load\` and \`@tick\` examples.
329
+ - \`redscript.toml\` stores the project configuration (replaces CLI flags).
330
+ - \`redscript.config.json\` stores legacy project settings.
331
+ `,
332
+ };
333
+ }
334
+ function initCommand(projectName) {
335
+ const explicitName = projectName?.trim();
336
+ const targetDir = explicitName
337
+ ? path.resolve(process.cwd(), explicitName)
338
+ : process.cwd();
339
+ const namespaceSource = explicitName ? path.basename(targetDir) : path.basename(targetDir);
340
+ const namespace = sanitizeProjectName(namespaceSource);
341
+ if (!namespace) {
342
+ console.error('Error: Project name must contain at least one letter or number');
343
+ process.exit(1);
344
+ }
345
+ if (fs.existsSync(targetDir)) {
346
+ const stat = fs.statSync(targetDir);
347
+ if (!stat.isDirectory()) {
348
+ console.error(`Error: Target path is not a directory: ${targetDir}`);
349
+ process.exit(1);
350
+ }
351
+ if (explicitName && fs.readdirSync(targetDir).length > 0) {
352
+ console.error(`Error: Target directory is not empty: ${targetDir}`);
353
+ process.exit(1);
354
+ }
355
+ }
356
+ else {
357
+ fs.mkdirSync(targetDir, { recursive: true });
358
+ }
359
+ const files = buildInitFiles(namespace);
360
+ for (const [relativePath, content] of Object.entries(files)) {
361
+ const fullPath = path.join(targetDir, relativePath);
362
+ fs.mkdirSync(path.dirname(fullPath), { recursive: true });
363
+ fs.writeFileSync(fullPath, content, 'utf-8');
364
+ }
365
+ console.log(`✓ Initialized RedScript project in ${targetDir}`);
366
+ console.log(` Namespace: ${namespace}`);
367
+ console.log(' Entry: src/main.mcrs');
368
+ }
369
+ function compileCommand(file, output, namespace, sourceMap = false, mcVersionStr, lenient = false, includeDirs, incremental = false) {
240
370
  // Read source file
241
371
  if (!fs.existsSync(file)) {
242
372
  console.error(`Error: File not found: ${file}`);
@@ -252,6 +382,38 @@ function compileCommand(file, output, namespace, sourceMap = false, mcVersionStr
252
382
  process.exit(1);
253
383
  }
254
384
  }
385
+ if (incremental) {
386
+ const cacheDir = path.join(path.dirname(file), '.redscript-cache');
387
+ const cache = new index_2.FileCache(cacheDir);
388
+ cache.load();
389
+ const depGraph = new deps_1.DependencyGraph();
390
+ const incResult = (0, incremental_1.compileIncremental)([file], cache, depGraph, {
391
+ namespace,
392
+ output,
393
+ generateSourceMap: sourceMap,
394
+ mcVersion,
395
+ lenient,
396
+ includeDirs,
397
+ });
398
+ if (incResult.errors.size > 0) {
399
+ const [failedFile, errorMessage] = incResult.errors.entries().next().value;
400
+ const source = fs.existsSync(failedFile) ? fs.readFileSync(failedFile, 'utf-8') : '';
401
+ console.error((0, diagnostics_1.formatError)(new Error(errorMessage), source, failedFile));
402
+ process.exit(1);
403
+ }
404
+ if (incResult.cached > 0) {
405
+ const entry = cache.get(path.resolve(file));
406
+ console.log(`✓ Reused cache for ${file}`);
407
+ console.log(` Namespace: ${namespace}`);
408
+ console.log(` Files: ${entry?.outputFiles?.length ?? 0}`);
409
+ return;
410
+ }
411
+ const compiled = incResult.results.get(path.resolve(file));
412
+ console.log(`✓ Compiled ${file} to ${output}/`);
413
+ console.log(` Namespace: ${namespace}`);
414
+ console.log(` Files: ${compiled?.files.length ?? 0}`);
415
+ return;
416
+ }
255
417
  const source = fs.readFileSync(file, 'utf-8');
256
418
  try {
257
419
  const result = (0, index_1.compile)(source, { namespace, filePath: file, generateSourceMap: sourceMap, mcVersion, lenient, includeDirs });
@@ -276,7 +438,54 @@ function compileCommand(file, output, namespace, sourceMap = false, mcVersionStr
276
438
  process.exit(1);
277
439
  }
278
440
  }
279
- function checkCommand(file, namespace) {
441
+ function warningToDiagnostic(warning, defaultFile) {
442
+ const located = warning.match(/^\[([^\]]+)\]\s+(?:(.*?):)?line (\d+), col (\d+): (.+)$/);
443
+ if (located) {
444
+ return {
445
+ severity: 'warning',
446
+ kind: located[1],
447
+ file: located[2] || defaultFile,
448
+ line: Number(located[3]),
449
+ col: Number(located[4]),
450
+ message: located[5],
451
+ };
452
+ }
453
+ const simple = warning.match(/^\[([^\]]+)\]\s+(.+)$/);
454
+ if (simple) {
455
+ return {
456
+ severity: 'warning',
457
+ kind: simple[1],
458
+ message: simple[2],
459
+ file: defaultFile,
460
+ };
461
+ }
462
+ return {
463
+ severity: 'warning',
464
+ kind: 'Warning',
465
+ message: warning,
466
+ file: defaultFile,
467
+ };
468
+ }
469
+ function errorToDiagnostic(error) {
470
+ return {
471
+ severity: 'error',
472
+ kind: error.kind,
473
+ message: error.message,
474
+ file: error.location.file,
475
+ line: error.location.line,
476
+ col: error.location.col,
477
+ };
478
+ }
479
+ function formatWarningHuman(diagnostic) {
480
+ if (diagnostic.file && diagnostic.line && diagnostic.col) {
481
+ return `${diagnostic.file}:${diagnostic.line}:${diagnostic.col}: warning: [${diagnostic.kind}] ${diagnostic.message}`;
482
+ }
483
+ if (diagnostic.file) {
484
+ return `${diagnostic.file}: warning: [${diagnostic.kind}] ${diagnostic.message}`;
485
+ }
486
+ return `warning: [${diagnostic.kind}] ${diagnostic.message}`;
487
+ }
488
+ function checkCommand(file, namespace, outputFormat = 'human') {
280
489
  // Read source file
281
490
  if (!fs.existsSync(file)) {
282
491
  console.error(`Error: File not found: ${file}`);
@@ -284,15 +493,34 @@ function checkCommand(file, namespace) {
284
493
  }
285
494
  const source = fs.readFileSync(file, 'utf-8');
286
495
  const ns = namespace ?? deriveNamespace(file);
287
- const result = (0, index_1.checkWithWarnings)(source, ns, file);
288
- for (const w of result.warnings) {
289
- console.error(`Warning: ${w}`);
496
+ const result = (0, index_1.checkDetailed)(source, ns, file);
497
+ const warnings = result.warnings.map(w => warningToDiagnostic(w, file));
498
+ const errors = result.errors.map(errorToDiagnostic);
499
+ const diagnostics = [...warnings, ...errors];
500
+ const exitCode = errors.length > 0 ? 2 : warnings.length > 0 ? 1 : 0;
501
+ if (outputFormat === 'json') {
502
+ console.log(JSON.stringify({
503
+ file,
504
+ namespace: ns,
505
+ diagnostics,
506
+ summary: {
507
+ warnings: warnings.length,
508
+ errors: errors.length,
509
+ },
510
+ }, null, 2));
290
511
  }
291
- if (result.error) {
292
- console.error((0, diagnostics_1.formatError)(result.error, source, file));
293
- process.exit(1);
512
+ else {
513
+ for (const warning of warnings) {
514
+ console.error(formatWarningHuman(warning));
515
+ }
516
+ for (const error of result.errors) {
517
+ console.error((0, diagnostics_1.formatError)(error, source, file));
518
+ }
519
+ if (exitCode === 0) {
520
+ console.log('✓ No issues found');
521
+ }
294
522
  }
295
- console.log(`✓ No errors found`);
523
+ process.exit(exitCode);
296
524
  }
297
525
  async function hotReload(url) {
298
526
  try {
@@ -342,6 +570,7 @@ function watchCommand(dir, output, namespace, hotReloadUrl) {
342
570
  const incResult = (0, incremental_1.compileIncremental)(files, cache, depGraph, {
343
571
  namespace,
344
572
  output,
573
+ includeDirs: undefined,
345
574
  });
346
575
  const timestamp = new Date().toLocaleTimeString();
347
576
  // Print warnings from recompiled files
@@ -395,6 +624,109 @@ function watchCommand(dir, output, namespace, hotReloadUrl) {
395
624
  }
396
625
  });
397
626
  }
627
+ /**
628
+ * Map a McVersion enum value to the corresponding pack_format integer.
629
+ * https://minecraft.wiki/w/Pack_format
630
+ */
631
+ function mcVersionToPackFormat(version) {
632
+ // Use a threshold-based mapping (≥ version → pack_format)
633
+ if (version >= mc_version_1.McVersion.v1_21_4)
634
+ return 48;
635
+ if (version >= mc_version_1.McVersion.v1_21)
636
+ return 45;
637
+ if (version >= mc_version_1.McVersion.v1_20_4)
638
+ return 26;
639
+ if (version >= mc_version_1.McVersion.v1_20_2)
640
+ return 22;
641
+ if (version >= mc_version_1.McVersion.v1_20)
642
+ return 18;
643
+ return 15; // 1.19 and below
644
+ }
645
+ /**
646
+ * Read redscript.config.json from the given directory (if it exists).
647
+ */
648
+ function readConfig(dir) {
649
+ const configPath = path.join(dir, 'redscript.config.json');
650
+ if (fs.existsSync(configPath)) {
651
+ try {
652
+ return JSON.parse(fs.readFileSync(configPath, 'utf-8'));
653
+ }
654
+ catch {
655
+ // ignore parse errors
656
+ }
657
+ }
658
+ return {};
659
+ }
660
+ /**
661
+ * publish command — compile then zip as a Minecraft datapack.
662
+ */
663
+ async function publishCommand(file, outputZip, namespace, description, mcVersionStr, lenient = false, includeDirs) {
664
+ if (!fs.existsSync(file)) {
665
+ console.error(`Error: File not found: ${file}`);
666
+ process.exit(1);
667
+ }
668
+ let mcVersion = mc_version_1.DEFAULT_MC_VERSION;
669
+ if (mcVersionStr) {
670
+ try {
671
+ mcVersion = (0, mc_version_1.parseMcVersion)(mcVersionStr);
672
+ }
673
+ catch (e) {
674
+ console.error(`Error: ${e.message}`);
675
+ process.exit(1);
676
+ }
677
+ }
678
+ const source = fs.readFileSync(file, 'utf-8');
679
+ let compileResult;
680
+ try {
681
+ compileResult = (0, index_1.compile)(source, {
682
+ namespace,
683
+ filePath: file,
684
+ generateSourceMap: false,
685
+ mcVersion,
686
+ lenient,
687
+ includeDirs,
688
+ });
689
+ }
690
+ catch (err) {
691
+ console.error((0, diagnostics_1.formatError)(err, source, file));
692
+ process.exit(1);
693
+ }
694
+ for (const w of compileResult.warnings) {
695
+ console.error(`Warning: ${w}`);
696
+ }
697
+ const packFormat = mcVersionToPackFormat(mcVersion);
698
+ const mcmeta = JSON.stringify({
699
+ pack: {
700
+ pack_format: packFormat,
701
+ description,
702
+ }
703
+ }, null, 2);
704
+ // Ensure output directory exists
705
+ fs.mkdirSync(path.dirname(path.resolve(outputZip)), { recursive: true });
706
+ await new Promise((resolve, reject) => {
707
+ const output = fs.createWriteStream(outputZip);
708
+ const archive = (0, archiver_1.default)('zip', { zlib: { level: 9 } });
709
+ output.on('close', resolve);
710
+ archive.on('error', reject);
711
+ archive.pipe(output);
712
+ // Add pack.mcmeta at root
713
+ archive.append(mcmeta, { name: 'pack.mcmeta' });
714
+ // Add compiled files — skip pack.mcmeta from compile result (we generate our own)
715
+ // The compile result already produces correct datapack paths, e.g.:
716
+ // data/<namespace>/function/setup.mcfunction
717
+ // data/minecraft/tags/function/load.json
718
+ for (const dataFile of compileResult.files) {
719
+ if (dataFile.path === 'pack.mcmeta')
720
+ continue;
721
+ archive.append(dataFile.content, { name: dataFile.path });
722
+ }
723
+ void archive.finalize();
724
+ });
725
+ console.log(`✓ Published ${file} → ${outputZip}`);
726
+ console.log(` Namespace: ${namespace}`);
727
+ console.log(` pack_format: ${packFormat}`);
728
+ console.log(` Files: ${compileResult.files.length}`);
729
+ }
398
730
  // Main
399
731
  const parsed = parseArgs(args);
400
732
  async function main() {
@@ -405,7 +737,7 @@ async function main() {
405
737
  // Background update check — non-blocking, only shows notice if newer version exists
406
738
  // Skip for repl/upgrade/version to avoid double-printing
407
739
  const noCheckCmds = new Set(['upgrade', 'update', 'version', 'repl']);
408
- if (!noCheckCmds.has(parsed.command ?? '')) {
740
+ if (!process.env.REDSCRIPT_NO_UPDATE_CHECK && !noCheckCmds.has(parsed.command ?? '')) {
409
741
  checkForUpdates().catch(() => { });
410
742
  }
411
743
  switch (parsed.command) {
@@ -416,11 +748,55 @@ async function main() {
416
748
  process.exit(1);
417
749
  }
418
750
  {
419
- const namespace = parsed.namespace ?? deriveNamespace(parsed.file);
420
- const output = parsed.output ?? './dist';
421
- compileCommand(parsed.file, output, namespace, parsed.sourceMap, parsed.mcVersionStr, parsed.lenient, parsed.includeDirs);
751
+ // Load redscript.toml (walk up from file's directory); CLI args take priority
752
+ const fileDir = path.dirname(path.resolve(parsed.file));
753
+ const tomlConfig = (0, project_config_1.loadProjectConfig)(fileDir);
754
+ const namespace = parsed.namespace
755
+ ?? tomlConfig?.project?.namespace
756
+ ?? deriveNamespace(parsed.file);
757
+ const output = parsed.output
758
+ ?? tomlConfig?.output?.dir
759
+ ?? './dist';
760
+ const mcVersionStr = parsed.mcVersionStr ?? tomlConfig?.project?.['mc-version'];
761
+ const includeDirs = parsed.includeDirs
762
+ ?? tomlConfig?.compiler?.['include-dirs'];
763
+ compileCommand(parsed.file, output, namespace, parsed.sourceMap, mcVersionStr, parsed.lenient, includeDirs, parsed.incremental);
422
764
  }
423
765
  break;
766
+ case 'publish': {
767
+ if (!parsed.file) {
768
+ console.error('Error: No input file specified');
769
+ printUsage();
770
+ process.exit(1);
771
+ }
772
+ {
773
+ // Determine project directory
774
+ const fileDir = path.dirname(path.resolve(parsed.file));
775
+ // Load redscript.toml first, fall back to legacy redscript.config.json
776
+ const tomlConfig = (0, project_config_1.loadProjectConfig)(fileDir);
777
+ const legacyConfig = readConfig(fileDir);
778
+ const namespace = parsed.namespace
779
+ ?? tomlConfig?.project?.namespace
780
+ ?? legacyConfig.namespace
781
+ ?? deriveNamespace(parsed.file);
782
+ const description = parsed.description
783
+ ?? tomlConfig?.project?.description
784
+ ?? legacyConfig.description
785
+ ?? `${namespace} datapack`;
786
+ const mcVersionStr = parsed.mcVersionStr
787
+ ?? tomlConfig?.project?.['mc-version']
788
+ ?? legacyConfig.mcVersion;
789
+ const includeDirs = parsed.includeDirs
790
+ ?? tomlConfig?.compiler?.['include-dirs'];
791
+ // Default output: <namespace>.zip in cwd
792
+ const defaultZip = path.join(process.cwd(), `${namespace}.zip`);
793
+ const outputZip = parsed.output ?? tomlConfig?.output?.dir
794
+ ? path.join(tomlConfig.output.dir, `${namespace}.zip`)
795
+ : defaultZip;
796
+ await publishCommand(parsed.file, outputZip, namespace, description, mcVersionStr, parsed.lenient, includeDirs);
797
+ }
798
+ break;
799
+ }
424
800
  case 'watch':
425
801
  if (!parsed.file) {
426
802
  console.error('Error: No directory specified');
@@ -429,13 +805,65 @@ async function main() {
429
805
  }
430
806
  watchCommand(parsed.file, parsed.output ?? './dist', parsed.namespace, parsed.hotReload);
431
807
  break;
808
+ case 'test': {
809
+ if (!parsed.file) {
810
+ console.error('Error: No input file specified\nUsage: redscript test <file> [--dry-run] [--mc-url <url>]');
811
+ process.exit(1);
812
+ }
813
+ {
814
+ const { runTests } = require('./testing/runner');
815
+ const namespace = parsed.namespace ?? deriveNamespace(parsed.file);
816
+ await runTests({
817
+ filePath: parsed.file,
818
+ outputDir: parsed.output,
819
+ dryRun: parsed.dryRun ?? !parsed.mcUrl,
820
+ mcUrl: parsed.mcUrl,
821
+ namespace,
822
+ });
823
+ }
824
+ break;
825
+ }
432
826
  case 'check':
433
827
  if (!parsed.file) {
434
828
  console.error('Error: No input file specified');
435
829
  printUsage();
436
830
  process.exit(1);
437
831
  }
438
- checkCommand(parsed.file, parsed.namespace);
832
+ {
833
+ const fileDir = path.dirname(path.resolve(parsed.file));
834
+ const tomlConfig = (0, project_config_1.loadProjectConfig)(fileDir);
835
+ const namespace = parsed.namespace ?? tomlConfig?.project?.namespace;
836
+ checkCommand(parsed.file, namespace, parsed.format ?? 'human');
837
+ }
838
+ break;
839
+ case 'lint':
840
+ if (!parsed.file) {
841
+ console.error('Error: No input file specified');
842
+ printUsage();
843
+ process.exit(1);
844
+ }
845
+ {
846
+ const namespace = parsed.namespace ?? deriveNamespace(parsed.file);
847
+ try {
848
+ const warnings = (0, index_3.lintFile)(parsed.file, namespace, {
849
+ maxFunctionLines: parsed.maxFunctionLines,
850
+ });
851
+ for (const w of warnings) {
852
+ console.log((0, index_3.formatLintWarning)(w));
853
+ }
854
+ if (warnings.length === 0) {
855
+ console.log('✓ No lint issues found');
856
+ }
857
+ else {
858
+ console.log(`\n${warnings.length} lint issue(s) found`);
859
+ }
860
+ process.exit(warnings.length > 0 ? 1 : 0);
861
+ }
862
+ catch (err) {
863
+ console.error(`Error: ${err.message}`);
864
+ process.exit(2);
865
+ }
866
+ }
439
867
  break;
440
868
  case 'fmt':
441
869
  case 'format': {
@@ -445,11 +873,29 @@ async function main() {
445
873
  process.exit(1);
446
874
  }
447
875
  const { format } = require('./formatter');
876
+ let changed = 0;
448
877
  for (const file of files) {
449
878
  const content = fs.readFileSync(file, 'utf8');
450
879
  const formatted = format(content);
451
- fs.writeFileSync(file, formatted);
452
- console.log(`Formatted: ${file}`);
880
+ if (content !== formatted) {
881
+ changed++;
882
+ if (!parsed.fmtCheck) {
883
+ fs.writeFileSync(file, formatted);
884
+ console.log(`Formatted: ${file}`);
885
+ }
886
+ else {
887
+ console.log(`Would format: ${file}`);
888
+ }
889
+ }
890
+ else if (!parsed.fmtCheck) {
891
+ console.log(`Already formatted: ${file}`);
892
+ }
893
+ }
894
+ if (parsed.fmtCheck) {
895
+ if (changed > 0) {
896
+ process.exit(1);
897
+ }
898
+ console.log('All files are formatted');
453
899
  }
454
900
  break;
455
901
  }
@@ -460,6 +906,9 @@ async function main() {
460
906
  console.log(`Generated ${output}`);
461
907
  break;
462
908
  }
909
+ case 'init':
910
+ initCommand(parsed.file);
911
+ break;
463
912
  case 'repl':
464
913
  await (0, repl_1.startRepl)(parsed.namespace ?? 'repl');
465
914
  break;
@@ -0,0 +1,29 @@
1
+ /**
2
+ * redscript.toml project configuration file support.
3
+ *
4
+ * Provides ProjectConfig interface and loadProjectConfig() which walks up the
5
+ * directory tree to find the nearest redscript.toml file.
6
+ */
7
+ export interface ProjectConfig {
8
+ project?: {
9
+ name?: string;
10
+ namespace?: string;
11
+ 'mc-version'?: string;
12
+ description?: string;
13
+ };
14
+ compiler?: {
15
+ optimization?: number;
16
+ 'include-dirs'?: string[];
17
+ 'no-dce'?: boolean;
18
+ };
19
+ output?: {
20
+ dir?: string;
21
+ };
22
+ }
23
+ /**
24
+ * Walk up the directory tree starting at `startDir` to find the nearest
25
+ * `redscript.toml`. Returns a parsed ProjectConfig or null if not found.
26
+ */
27
+ export declare function loadProjectConfig(startDir: string): ProjectConfig | null;
28
+ /** Default template content for a new redscript.toml file. */
29
+ export declare function buildTomlTemplate(namespace: string): string;