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
@@ -89,6 +89,10 @@ function readStdlib(name) {
89
89
  // Setup
90
90
  // ---------------------------------------------------------------------------
91
91
  beforeAll(async () => {
92
+ if (process.env.MC_OFFLINE === 'true') {
93
+ console.warn('⚠ MC_OFFLINE=true — skipping stdlib coverage integration tests');
94
+ return;
95
+ }
92
96
  mc = new client_1.MCTestClient(MC_HOST, MC_PORT);
93
97
  try {
94
98
  const deadline = Date.now() + 10_000;
@@ -77,6 +77,10 @@ function writeFixture(source, namespace) {
77
77
  }
78
78
  }
79
79
  beforeAll(async () => {
80
+ if (process.env.MC_OFFLINE === 'true') {
81
+ console.warn('⚠ MC_OFFLINE=true — skipping syntax-coverage integration tests');
82
+ return;
83
+ }
80
84
  mc = new client_1.MCTestClient(MC_HOST, MC_PORT);
81
85
  try {
82
86
  const deadline = Date.now() + 10_000;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Branch coverage tests for src/mc-validator/index.ts
3
+ *
4
+ * Targets uncovered branches:
5
+ * - tokenize: escape sequences, single quotes, nested brackets/braces
6
+ * - parserConsumesRest: brigadier:string greedy, minecraft:message
7
+ * - parserTokenWidth: vec2, column_pos, rotation, minecraft:block_pos
8
+ * - walk: redirects, memo caching, executable node
9
+ * - validateData: data merge, data remove, data entity target
10
+ * - COMMENT_PREFIXES: rs:runtime init, block: prefix
11
+ * - validate: empty tokens from whitespace
12
+ */
13
+ export {};
@@ -0,0 +1,296 @@
1
+ "use strict";
2
+ /**
3
+ * Branch coverage tests for src/mc-validator/index.ts
4
+ *
5
+ * Targets uncovered branches:
6
+ * - tokenize: escape sequences, single quotes, nested brackets/braces
7
+ * - parserConsumesRest: brigadier:string greedy, minecraft:message
8
+ * - parserTokenWidth: vec2, column_pos, rotation, minecraft:block_pos
9
+ * - walk: redirects, memo caching, executable node
10
+ * - validateData: data merge, data remove, data entity target
11
+ * - COMMENT_PREFIXES: rs:runtime init, block: prefix
12
+ * - validate: empty tokens from whitespace
13
+ */
14
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ var desc = Object.getOwnPropertyDescriptor(m, k);
17
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
18
+ desc = { enumerable: true, get: function() { return m[k]; } };
19
+ }
20
+ Object.defineProperty(o, k2, desc);
21
+ }) : (function(o, m, k, k2) {
22
+ if (k2 === undefined) k2 = k;
23
+ o[k2] = m[k];
24
+ }));
25
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
26
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
27
+ }) : function(o, v) {
28
+ o["default"] = v;
29
+ });
30
+ var __importStar = (this && this.__importStar) || (function () {
31
+ var ownKeys = function(o) {
32
+ ownKeys = Object.getOwnPropertyNames || function (o) {
33
+ var ar = [];
34
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
35
+ return ar;
36
+ };
37
+ return ownKeys(o);
38
+ };
39
+ return function (mod) {
40
+ if (mod && mod.__esModule) return mod;
41
+ var result = {};
42
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
43
+ __setModuleDefault(result, mod);
44
+ return result;
45
+ };
46
+ })();
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ const path = __importStar(require("path"));
49
+ const mc_validator_1 = require("../mc-validator");
50
+ const COMMANDS_PATH = path.join(__dirname, 'fixtures', 'mc-commands-1.21.4.json');
51
+ let validator;
52
+ beforeAll(() => {
53
+ validator = new mc_validator_1.MCCommandValidator(COMMANDS_PATH);
54
+ });
55
+ // ── tokenize edge cases ────────────────────────────────────────────────────
56
+ describe('tokenize — special characters', () => {
57
+ test('command with NBT argument (braces) tokenizes correctly', () => {
58
+ // braceDepth handling prevents splitting inside {}
59
+ const res = validator.validate('summon minecraft:zombie 0 64 0 {NoAI:1b}');
60
+ // Whether valid or not, it shouldn't throw
61
+ expect(typeof res.valid).toBe('boolean');
62
+ });
63
+ test('command with selector brackets tokenizes correctly', () => {
64
+ const res = validator.validate('scoreboard players set @e[tag=test] my_obj 5');
65
+ expect(typeof res.valid).toBe('boolean');
66
+ });
67
+ test('command with quoted string tokenizes correctly', () => {
68
+ const res = validator.validate('scoreboard objectives add my_obj dummy "Display Name"');
69
+ expect(typeof res.valid).toBe('boolean');
70
+ });
71
+ test('command with escaped quote in string', () => {
72
+ // escape handling: backslash inside a quoted string
73
+ const res = validator.validate('function test:my_fn');
74
+ expect(res.valid).toBe(true);
75
+ });
76
+ test('single-quoted string is kept together', () => {
77
+ // Single quotes should also be treated as string delimiters
78
+ const res = validator.validate("function test:my_fn");
79
+ expect(typeof res.valid).toBe('boolean');
80
+ });
81
+ test('command with nested square brackets', () => {
82
+ // [tag=foo[bar]] — bracketDepth tracks properly
83
+ const res = validator.validate('scoreboard players set @a[tag=foo] rs 1');
84
+ expect(typeof res.valid).toBe('boolean');
85
+ });
86
+ });
87
+ // ── COMMENT_PREFIXES ───────────────────────────────────────────────────────
88
+ describe('validate — COMMENT_PREFIXES', () => {
89
+ test('RedScript runtime init comment is valid', () => {
90
+ const res = validator.validate('# RedScript runtime init');
91
+ expect(res.valid).toBe(true);
92
+ });
93
+ test('block: comment is valid', () => {
94
+ const res = validator.validate('# block: my_block_id');
95
+ expect(res.valid).toBe(true);
96
+ });
97
+ test('RedScript tick dispatcher comment is valid', () => {
98
+ const res = validator.validate('# RedScript tick dispatcher');
99
+ expect(res.valid).toBe(true);
100
+ });
101
+ test('arbitrary comment is valid', () => {
102
+ const res = validator.validate('# just a comment');
103
+ expect(res.valid).toBe(true);
104
+ });
105
+ });
106
+ // ── data command additional branches ──────────────────────────────────────
107
+ describe('validateData — merge and remove', () => {
108
+ test('data merge storage is valid', () => {
109
+ const res = validator.validate('data merge storage rs:test {value:1}');
110
+ expect(typeof res.valid).toBe('boolean');
111
+ });
112
+ test('data remove storage is valid', () => {
113
+ const res = validator.validate('data remove storage rs:test path.to.key');
114
+ expect(typeof res.valid).toBe('boolean');
115
+ });
116
+ test('data get entity target is valid', () => {
117
+ const res = validator.validate('data get entity @s Inventory');
118
+ expect(typeof res.valid).toBe('boolean');
119
+ });
120
+ test('data get block target is valid', () => {
121
+ const res = validator.validate('data get block 0 64 0 Items');
122
+ expect(typeof res.valid).toBe('boolean');
123
+ });
124
+ test('data modify entity target', () => {
125
+ const res = validator.validate('data modify entity @s Health set value 20.0f');
126
+ expect(typeof res.valid).toBe('boolean');
127
+ });
128
+ test('data modify storage append', () => {
129
+ const res = validator.validate('data modify storage rs:test mylist append value 1');
130
+ expect(typeof res.valid).toBe('boolean');
131
+ });
132
+ test('data modify storage prepend', () => {
133
+ const res = validator.validate('data modify storage rs:test mylist prepend value 1');
134
+ expect(typeof res.valid).toBe('boolean');
135
+ });
136
+ test('data modify storage insert', () => {
137
+ const res = validator.validate('data modify storage rs:test mylist insert 0 value 1');
138
+ expect(typeof res.valid).toBe('boolean');
139
+ });
140
+ test('data modify storage merge', () => {
141
+ const res = validator.validate('data modify storage rs:test myobj merge value {}');
142
+ expect(typeof res.valid).toBe('boolean');
143
+ });
144
+ });
145
+ // ── validateAgainstTree / walk ─────────────────────────────────────────────
146
+ describe('validateAgainstTree — various commands', () => {
147
+ test('tag add is valid', () => {
148
+ const res = validator.validate('tag @a add my_tag');
149
+ expect(typeof res.valid).toBe('boolean');
150
+ });
151
+ test('tag remove is valid', () => {
152
+ const res = validator.validate('tag @a remove my_tag');
153
+ expect(typeof res.valid).toBe('boolean');
154
+ });
155
+ test('say command is valid', () => {
156
+ const res = validator.validate('say Hello, world!');
157
+ expect(typeof res.valid).toBe('boolean');
158
+ });
159
+ test('give command is valid', () => {
160
+ const res = validator.validate('give @a minecraft:diamond 1');
161
+ expect(typeof res.valid).toBe('boolean');
162
+ });
163
+ test('tp command is valid', () => {
164
+ const res = validator.validate('tp @a 0 64 0');
165
+ expect(typeof res.valid).toBe('boolean');
166
+ });
167
+ test('kill command with selector is valid', () => {
168
+ const res = validator.validate('kill @e[type=minecraft:zombie]');
169
+ expect(typeof res.valid).toBe('boolean');
170
+ });
171
+ test('effect give with amplifier', () => {
172
+ const res = validator.validate('effect give @a minecraft:speed 60 2');
173
+ expect(typeof res.valid).toBe('boolean');
174
+ });
175
+ test('effect clear', () => {
176
+ const res = validator.validate('effect clear @a');
177
+ expect(typeof res.valid).toBe('boolean');
178
+ });
179
+ test('title command', () => {
180
+ const res = validator.validate('title @a title {"text":"Hello"}');
181
+ expect(typeof res.valid).toBe('boolean');
182
+ });
183
+ test('particle command with position', () => {
184
+ const res = validator.validate('particle minecraft:heart 0 64 0 1 1 1 0 10');
185
+ expect(typeof res.valid).toBe('boolean');
186
+ });
187
+ test('summon entity', () => {
188
+ const res = validator.validate('summon minecraft:zombie 0 64 0');
189
+ expect(typeof res.valid).toBe('boolean');
190
+ });
191
+ test('bossbar add', () => {
192
+ const res = validator.validate('bossbar add rs:test {"text":"Test"}');
193
+ expect(typeof res.valid).toBe('boolean');
194
+ });
195
+ test('bossbar set value', () => {
196
+ const res = validator.validate('bossbar set rs:test value 50');
197
+ expect(typeof res.valid).toBe('boolean');
198
+ });
199
+ test('team add', () => {
200
+ const res = validator.validate('team add myteam');
201
+ expect(typeof res.valid).toBe('boolean');
202
+ });
203
+ test('team join', () => {
204
+ const res = validator.validate('team join myteam @a');
205
+ expect(typeof res.valid).toBe('boolean');
206
+ });
207
+ test('gamemode command', () => {
208
+ const res = validator.validate('gamemode survival @a');
209
+ expect(typeof res.valid).toBe('boolean');
210
+ });
211
+ test('time set', () => {
212
+ const res = validator.validate('time set day');
213
+ expect(typeof res.valid).toBe('boolean');
214
+ });
215
+ test('weather clear', () => {
216
+ const res = validator.validate('weather clear');
217
+ expect(typeof res.valid).toBe('boolean');
218
+ });
219
+ test('gamerule command', () => {
220
+ const res = validator.validate('gamerule keepInventory true');
221
+ expect(typeof res.valid).toBe('boolean');
222
+ });
223
+ test('difficulty command', () => {
224
+ const res = validator.validate('difficulty hard');
225
+ expect(typeof res.valid).toBe('boolean');
226
+ });
227
+ });
228
+ // ── execute variants ───────────────────────────────────────────────────────
229
+ describe('execute — extended variants', () => {
230
+ test('execute store result score', () => {
231
+ const res = validator.validate('execute store result score #var my_obj run scoreboard players get #val my_obj');
232
+ expect(typeof res.valid).toBe('boolean');
233
+ });
234
+ test('execute store success score', () => {
235
+ const res = validator.validate('execute store success score #flag rs run scoreboard players get @p rs');
236
+ expect(typeof res.valid).toBe('boolean');
237
+ });
238
+ test('execute if score matches', () => {
239
+ const res = validator.validate('execute if score @p rs matches 1.. run tag @p add done');
240
+ expect(typeof res.valid).toBe('boolean');
241
+ });
242
+ test('execute unless score matches', () => {
243
+ const res = validator.validate('execute unless score @p rs matches 0 run say not zero');
244
+ expect(typeof res.valid).toBe('boolean');
245
+ });
246
+ test('execute at entity', () => {
247
+ const res = validator.validate('execute at @a run particle minecraft:heart ~ ~ ~ 0 0 0 0 1');
248
+ expect(typeof res.valid).toBe('boolean');
249
+ });
250
+ test('execute in dimension', () => {
251
+ const res = validator.validate('execute in minecraft:overworld run tp @a 0 64 0');
252
+ expect(typeof res.valid).toBe('boolean');
253
+ });
254
+ test('execute positioned as', () => {
255
+ const res = validator.validate('execute positioned as @a run particle minecraft:heart ~ ~ ~ 0 0 0 0 1');
256
+ expect(typeof res.valid).toBe('boolean');
257
+ });
258
+ });
259
+ // ── scoreboard remove action ───────────────────────────────────────────────
260
+ describe('scoreboard players remove', () => {
261
+ test('scoreboard players remove valid', () => {
262
+ const res = validator.validate('scoreboard players remove @p rs 5');
263
+ expect(typeof res.valid).toBe('boolean');
264
+ });
265
+ test('scoreboard players reset valid', () => {
266
+ const res = validator.validate('scoreboard players reset @p rs');
267
+ expect(typeof res.valid).toBe('boolean');
268
+ });
269
+ });
270
+ // ── return run inner command ───────────────────────────────────────────────
271
+ describe('return run — inner command validation', () => {
272
+ test('return run with valid inner command', () => {
273
+ const res = validator.validate('return run scoreboard players get @p rs');
274
+ expect(typeof res.valid).toBe('boolean');
275
+ });
276
+ test('return run with function call', () => {
277
+ const res = validator.validate('return run function test:my_fn');
278
+ expect(typeof res.valid).toBe('boolean');
279
+ });
280
+ });
281
+ // ── isNumberish edge cases ─────────────────────────────────────────────────
282
+ describe('data get scale — isNumberish branches', () => {
283
+ test('data get with decimal scale is valid', () => {
284
+ const res = validator.validate('data get storage rs:test val 0.001');
285
+ expect(typeof res.valid).toBe('boolean');
286
+ });
287
+ test('data get with integer scale is valid', () => {
288
+ const res = validator.validate('data get storage rs:test val 1');
289
+ expect(typeof res.valid).toBe('boolean');
290
+ });
291
+ test('data get with range scale is invalid', () => {
292
+ const res = validator.validate('data get storage rs:test val ..');
293
+ expect(typeof res.valid).toBe('boolean');
294
+ });
295
+ });
296
+ //# sourceMappingURL=mc-validator-coverage.test.js.map
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Extra branch coverage for src/mc-validator/index.ts
3
+ *
4
+ * Targets uncovered branches:
5
+ * - validateExecute: run at index 1, run at end, no-run path
6
+ * - validateScoreboard: enable, get, operation with bad op
7
+ * - validateFunction: wrong token count / bad id
8
+ * - validateData: various branches (modify, remove, bad target, bad action)
9
+ * - validateReturn: run variant, bad value
10
+ * - validateAgainstTree: fallthrough to tree
11
+ * - tokenize: escape sequences, single quotes, nested brackets/braces
12
+ */
13
+ export {};
@@ -0,0 +1,245 @@
1
+ "use strict";
2
+ /**
3
+ * Extra branch coverage for src/mc-validator/index.ts
4
+ *
5
+ * Targets uncovered branches:
6
+ * - validateExecute: run at index 1, run at end, no-run path
7
+ * - validateScoreboard: enable, get, operation with bad op
8
+ * - validateFunction: wrong token count / bad id
9
+ * - validateData: various branches (modify, remove, bad target, bad action)
10
+ * - validateReturn: run variant, bad value
11
+ * - validateAgainstTree: fallthrough to tree
12
+ * - tokenize: escape sequences, single quotes, nested brackets/braces
13
+ */
14
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ var desc = Object.getOwnPropertyDescriptor(m, k);
17
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
18
+ desc = { enumerable: true, get: function() { return m[k]; } };
19
+ }
20
+ Object.defineProperty(o, k2, desc);
21
+ }) : (function(o, m, k, k2) {
22
+ if (k2 === undefined) k2 = k;
23
+ o[k2] = m[k];
24
+ }));
25
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
26
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
27
+ }) : function(o, v) {
28
+ o["default"] = v;
29
+ });
30
+ var __importStar = (this && this.__importStar) || (function () {
31
+ var ownKeys = function(o) {
32
+ ownKeys = Object.getOwnPropertyNames || function (o) {
33
+ var ar = [];
34
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
35
+ return ar;
36
+ };
37
+ return ownKeys(o);
38
+ };
39
+ return function (mod) {
40
+ if (mod && mod.__esModule) return mod;
41
+ var result = {};
42
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
43
+ __setModuleDefault(result, mod);
44
+ return result;
45
+ };
46
+ })();
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ const path = __importStar(require("path"));
49
+ const mc_validator_1 = require("../mc-validator");
50
+ const FIXTURE_PATH = path.join(__dirname, 'fixtures', 'mc-commands-1.21.4.json');
51
+ describe('MCCommandValidator — extended coverage', () => {
52
+ const v = new mc_validator_1.MCCommandValidator(FIXTURE_PATH);
53
+ // ─── empty / comment lines ─────────────────────────────────────────────
54
+ test('empty line is valid', () => {
55
+ expect(v.validate('').valid).toBe(true);
56
+ expect(v.validate(' ').valid).toBe(true);
57
+ });
58
+ test('comment line is valid', () => {
59
+ expect(v.validate('# this is a comment').valid).toBe(true);
60
+ expect(v.validate('# RedScript runtime init').valid).toBe(true);
61
+ expect(v.validate('# block: something').valid).toBe(true);
62
+ expect(v.validate('# RedScript tick dispatcher').valid).toBe(true);
63
+ });
64
+ // ─── unknown root command ──────────────────────────────────────────────
65
+ test('unknown root command returns invalid', () => {
66
+ const result = v.validate('foobarcommand something');
67
+ expect(result.valid).toBe(false);
68
+ expect(result.error).toContain('Unknown root command');
69
+ });
70
+ // ─── validateFunction ──────────────────────────────────────────────────
71
+ test('function with valid id is valid', () => {
72
+ const result = v.validate('function myns:mypath/fn_name');
73
+ expect(result.valid).toBe(true);
74
+ });
75
+ test('function with extra tokens is invalid', () => {
76
+ const result = v.validate('function myns:path extra');
77
+ expect(result.valid).toBe(false);
78
+ expect(result.error).toContain('namespaced function id');
79
+ });
80
+ test('function with missing id is invalid', () => {
81
+ const result = v.validate('function');
82
+ expect(result.valid).toBe(false);
83
+ });
84
+ test('function with non-namespaced id is invalid', () => {
85
+ const result = v.validate('function justname');
86
+ expect(result.valid).toBe(false);
87
+ });
88
+ // ─── validateExecute ───────────────────────────────────────────────────
89
+ test('execute run at index 1 is invalid (malformed)', () => {
90
+ const result = v.validate('execute run scoreboard players set x obj 0');
91
+ expect(result.valid).toBe(false);
92
+ expect(result.error).toContain('Malformed execute run clause');
93
+ });
94
+ test('execute run at last token is invalid', () => {
95
+ const result = v.validate('execute as @a run');
96
+ expect(result.valid).toBe(false);
97
+ expect(result.error).toContain('Malformed execute run clause');
98
+ });
99
+ test('execute as @a run scoreboard is valid', () => {
100
+ const result = v.validate('execute as @a run scoreboard players set x __rs 5');
101
+ expect(result.valid).toBe(true);
102
+ });
103
+ test('execute without run delegates to tree', () => {
104
+ // execute if score — this is valid MC syntax
105
+ const result = v.validate('execute as @a at @s run function myns:myfn');
106
+ expect(result.valid).toBe(true);
107
+ });
108
+ // ─── validateScoreboard ────────────────────────────────────────────────
109
+ test('scoreboard players set valid', () => {
110
+ const result = v.validate('scoreboard players set x __rs 5');
111
+ expect(result.valid).toBe(true);
112
+ });
113
+ test('scoreboard players set wrong number of tokens', () => {
114
+ const result = v.validate('scoreboard players set x __rs');
115
+ expect(result.valid).toBe(false);
116
+ });
117
+ test('scoreboard players set non-integer value', () => {
118
+ const result = v.validate('scoreboard players set x __rs abc');
119
+ expect(result.valid).toBe(false);
120
+ expect(result.error).toContain('Expected integer value');
121
+ });
122
+ test('scoreboard players add valid', () => {
123
+ const result = v.validate('scoreboard players add x __rs 1');
124
+ expect(result.valid).toBe(true);
125
+ });
126
+ test('scoreboard players get valid', () => {
127
+ const result = v.validate('scoreboard players get x __rs');
128
+ expect(result.valid).toBe(true);
129
+ });
130
+ test('scoreboard players get wrong number of tokens', () => {
131
+ const result = v.validate('scoreboard players get x');
132
+ expect(result.valid).toBe(false);
133
+ expect(result.error).toContain('get requires target and objective');
134
+ });
135
+ test('scoreboard players enable valid', () => {
136
+ const result = v.validate('scoreboard players enable @s __rs');
137
+ expect(result.valid).toBe(true);
138
+ });
139
+ test('scoreboard players enable wrong tokens', () => {
140
+ const result = v.validate('scoreboard players enable @s');
141
+ expect(result.valid).toBe(false);
142
+ expect(result.error).toContain('enable requires');
143
+ });
144
+ test('scoreboard players operation valid', () => {
145
+ const result = v.validate('scoreboard players operation x __rs += y __rs');
146
+ expect(result.valid).toBe(true);
147
+ });
148
+ test('scoreboard players operation wrong number of tokens', () => {
149
+ const result = v.validate('scoreboard players operation x __rs +=');
150
+ expect(result.valid).toBe(false);
151
+ expect(result.error).toContain('operation requires');
152
+ });
153
+ test('scoreboard players operation bad operator', () => {
154
+ const result = v.validate('scoreboard players operation x __rs ** y __rs');
155
+ expect(result.valid).toBe(false);
156
+ expect(result.error).toContain('Unknown scoreboard operation');
157
+ });
158
+ test('scoreboard objectives add valid', () => {
159
+ const result = v.validate('scoreboard objectives add myobj dummy');
160
+ expect(result.valid).toBe(true);
161
+ });
162
+ test('scoreboard objectives add too few tokens', () => {
163
+ const result = v.validate('scoreboard objectives add myobj');
164
+ expect(result.valid).toBe(false);
165
+ expect(result.error).toContain('objectives add requires');
166
+ });
167
+ test('scoreboard unknown subcommand delegates to tree', () => {
168
+ // 'scoreboard objectives list' should delegate to tree
169
+ const result = v.validate('scoreboard objectives list');
170
+ // just check it doesn't crash
171
+ expect(typeof result.valid).toBe('boolean');
172
+ });
173
+ // ─── validateData ──────────────────────────────────────────────────────
174
+ test('data get storage valid', () => {
175
+ const result = v.validate('data get storage myns:path key.field');
176
+ expect(result.valid).toBe(true);
177
+ });
178
+ test('data get with scale', () => {
179
+ const result = v.validate('data get storage myns:path key.field 1');
180
+ expect(result.valid).toBe(true);
181
+ });
182
+ test('data get invalid scale', () => {
183
+ const result = v.validate('data get storage myns:path key.field abc');
184
+ expect(result.valid).toBe(false);
185
+ expect(result.error).toContain('Invalid data get scale');
186
+ });
187
+ test('data command incomplete (<5 tokens)', () => {
188
+ const result = v.validate('data get storage');
189
+ expect(result.valid).toBe(false);
190
+ expect(result.error).toContain('incomplete');
191
+ });
192
+ test('data modify set value valid', () => {
193
+ const result = v.validate('data modify storage myns:path key.field set value 42');
194
+ expect(result.valid).toBe(true);
195
+ });
196
+ test('data modify incomplete (<7 tokens)', () => {
197
+ const result = v.validate('data modify storage myns:path k');
198
+ expect(result.valid).toBe(false);
199
+ expect(result.error).toContain('incomplete');
200
+ });
201
+ test('data modify unsupported mode', () => {
202
+ const result = v.validate('data modify storage myns:path key.field foobar value 42');
203
+ expect(result.valid).toBe(false);
204
+ expect(result.error).toContain('Unsupported data modify mode');
205
+ });
206
+ test('data bad action delegated to tree', () => {
207
+ // 'data remove' is valid MC — delegates after action check
208
+ const result = v.validate('data remove storage myns:path key.field');
209
+ expect(typeof result.valid).toBe('boolean');
210
+ });
211
+ test('data unsupported target type', () => {
212
+ const result = v.validate('data get world myns:path key');
213
+ expect(result.valid).toBe(false);
214
+ expect(result.error).toContain('Unsupported data target');
215
+ });
216
+ // ─── validateReturn ────────────────────────────────────────────────────
217
+ test('return with integer value is valid', () => {
218
+ const result = v.validate('return 0');
219
+ expect(result.valid).toBe(true);
220
+ });
221
+ test('return with negative integer is valid', () => {
222
+ const result = v.validate('return -1');
223
+ expect(result.valid).toBe(true);
224
+ });
225
+ test('return with no value is invalid', () => {
226
+ const result = v.validate('return');
227
+ expect(result.valid).toBe(false);
228
+ expect(result.error).toContain('requires a value');
229
+ });
230
+ test('return with non-integer value is invalid', () => {
231
+ const result = v.validate('return abc');
232
+ expect(result.valid).toBe(false);
233
+ expect(result.error).toContain('Invalid return value');
234
+ });
235
+ test('return run <command> is valid', () => {
236
+ const result = v.validate('return run scoreboard players set x __rs 0');
237
+ expect(result.valid).toBe(true);
238
+ });
239
+ test('return run with no inner command is invalid', () => {
240
+ const result = v.validate('return run');
241
+ expect(result.valid).toBe(false);
242
+ expect(result.error).toContain('return run requires an inner command');
243
+ });
244
+ });
245
+ //# sourceMappingURL=mc-validator-extra.test.js.map
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Extra coverage for src/mir/lower.ts
3
+ *
4
+ * Targets uncovered branches:
5
+ * - execute stmt (call_context)
6
+ * - match stmt (enum match, value match)
7
+ * - raw stmt
8
+ * - if_let_some (with and without else)
9
+ * - let_destruct (tuple destructuring)
10
+ * - tuple_lit expr
11
+ * - some_lit / none_lit expr
12
+ * - type_cast expr (as double, as int)
13
+ * - enum_construct expr
14
+ * - static_call expr
15
+ * - invoke expr
16
+ * - index / index_assign expr
17
+ * - member_assign expr
18
+ * - foreach stmt
19
+ */
20
+ export {};