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
@@ -0,0 +1,59 @@
1
+ import { compile } from '../emit/compile'
2
+ import { Lexer } from '../lexer'
3
+ import { Parser } from '../parser'
4
+ import { TypeChecker } from '../typechecker'
5
+ import type { DiagnosticError } from '../diagnostics'
6
+
7
+ function getFile(files: Array<{ path: string; content: string }>, path: string): string {
8
+ const file = files.find(entry => entry.path === path)
9
+ if (!file) {
10
+ throw new Error(`Missing file: ${path}\nFiles:\n${files.map(entry => entry.path).join('\n')}`)
11
+ }
12
+ return file.content
13
+ }
14
+
15
+ function typeCheck(source: string): DiagnosticError[] {
16
+ const tokens = new Lexer(source).tokenize()
17
+ const ast = new Parser(tokens).parse('test')
18
+ return new TypeChecker(source).check(ast)
19
+ }
20
+
21
+ describe('@watch decorator', () => {
22
+ test('typechecker accepts parameterless handlers and rejects parameters', () => {
23
+ expect(typeCheck(`
24
+ @watch("rs.kills")
25
+ fn on_kill() {
26
+ say("kill");
27
+ }
28
+ `)).toHaveLength(0)
29
+
30
+ const errors = typeCheck(`
31
+ @watch("rs.kills")
32
+ fn on_kill(player: Player) {}
33
+ `)
34
+ expect(errors.length).toBeGreaterThan(0)
35
+ expect(errors[0].message).toContain('cannot declare parameters')
36
+ })
37
+
38
+ test('emits watcher objective, dispatcher, and tick registration', () => {
39
+ const result = compile(`
40
+ @watch("rs.kills")
41
+ fn on_kill() {
42
+ let k: int = scoreboard_get("@s", "rs.kills");
43
+ if (k >= 10) {
44
+ title("@s", "Achievement Unlocked!");
45
+ }
46
+ }
47
+ `, { namespace: 'watch_test' })
48
+
49
+ const load = getFile(result.files, 'data/watch_test/function/load.mcfunction')
50
+ const tick = JSON.parse(getFile(result.files, 'data/minecraft/tags/function/tick.json'))
51
+ const watch = getFile(result.files, 'data/watch_test/function/__watch_on_kill.mcfunction')
52
+
53
+ expect(load).toContain('scoreboard objectives add __watch_on_kill_prev dummy')
54
+ expect(tick.values).toContain('watch_test:__watch_on_kill')
55
+ expect(watch).toContain('execute as @a unless score @s __watch_on_kill_prev = @s __watch_on_kill_prev run scoreboard players operation @s __watch_on_kill_prev = @s rs.kills')
56
+ expect(watch).toContain('execute as @a unless score @s rs.kills = @s __watch_on_kill_prev run function watch_test:on_kill')
57
+ expect(watch).toContain('execute as @a unless score @s rs.kills = @s __watch_on_kill_prev run scoreboard players operation @s __watch_on_kill_prev = @s rs.kills')
58
+ })
59
+ })
package/src/ast/types.ts CHANGED
@@ -175,10 +175,12 @@ export type Expr =
175
175
  | { kind: 'array_lit'; elements: Expr[]; span?: Span }
176
176
  | { kind: 'static_call'; type: string; method: string; args: Expr[]; span?: Span }
177
177
  | { kind: 'path_expr'; enumName: string; variant: string; span?: Span }
178
+ | { kind: 'enum_construct'; enumName: string; variant: string; args: { name: string; value: Expr }[]; span?: Span }
178
179
  | (LambdaExpr & { span?: Span })
179
180
  | { kind: 'tuple_lit'; elements: Expr[]; span?: Span }
180
181
  | { kind: 'some_lit'; value: Expr; span?: Span } // Some(expr)
181
182
  | { kind: 'none_lit'; span?: Span } // None
183
+ | { kind: 'unwrap_or'; opt: Expr; default_: Expr; span?: Span } // opt.unwrap_or(default)
182
184
  | { kind: 'type_cast'; expr: Expr; targetType: TypeNode; span?: Span } // expr as Type
183
185
 
184
186
  export type LiteralExpr =
@@ -233,16 +235,23 @@ export type MatchPattern =
233
235
  | { kind: 'PatInt'; value: number } // 1, 2, 3
234
236
  | { kind: 'PatWild' } // _
235
237
  | { kind: 'PatExpr'; expr: Expr } // legacy: range_lit or other expr
238
+ | { kind: 'PatEnum'; enumName: string; variant: string; bindings: string[] } // Color::RGB(r, g, b)
236
239
 
237
240
  export type Stmt =
238
241
  | { kind: 'let'; name: string; type?: TypeNode; init: Expr; span?: Span }
239
242
  | { kind: 'let_destruct'; names: string[]; type?: TypeNode; init: Expr; span?: Span }
243
+ | { kind: 'const_decl'; name: string; type: TypeNode; value: Expr; span?: Span }
240
244
  | { kind: 'expr'; expr: Expr; span?: Span }
241
245
  | { kind: 'return'; value?: Expr; span?: Span }
242
246
  | { kind: 'break'; span?: Span }
243
247
  | { kind: 'continue'; span?: Span }
248
+ | { kind: 'break_label'; label: string; span?: Span }
249
+ | { kind: 'continue_label'; label: string; span?: Span }
250
+ | { kind: 'labeled_loop'; label: string; body: Stmt; span?: Span }
244
251
  | { kind: 'if'; cond: Expr; then: Block; else_?: Block; span?: Span }
245
252
  | { kind: 'while'; cond: Expr; body: Block; span?: Span }
253
+ | { kind: 'do_while'; cond: Expr; body: Block; span?: Span }
254
+ | { kind: 'repeat'; count: number; body: Block; span?: Span }
246
255
  | { kind: 'for'; init?: Stmt; cond: Expr; step: Expr; body: Block; span?: Span }
247
256
  | { kind: 'foreach'; binding: string; iterable: Expr; body: Block; executeContext?: string; span?: Span }
248
257
  | { kind: 'for_range'; varName: string; start: Expr; end: Expr; inclusive?: boolean; body: Block; span?: Span }
@@ -250,6 +259,7 @@ export type Stmt =
250
259
  | { kind: 'for_each'; binding: string; array: Expr; body: Block; span?: Span }
251
260
  | { kind: 'match'; expr: Expr; arms: { pattern: MatchPattern; body: Block }[]; span?: Span }
252
261
  | { kind: 'if_let_some'; binding: string; init: Expr; then: Block; else_?: Block; span?: Span }
262
+ | { kind: 'while_let_some'; binding: string; init: Expr; body: Block; span?: Span }
253
263
  | { kind: 'as_block'; selector: EntitySelector; body: Block; span?: Span }
254
264
  | { kind: 'at_block'; selector: EntitySelector; body: Block; span?: Span }
255
265
  | { kind: 'as_at'; as_sel: EntitySelector; at_sel: EntitySelector; body: Block; span?: Span }
@@ -263,9 +273,10 @@ export type Block = Stmt[]
263
273
  // ---------------------------------------------------------------------------
264
274
 
265
275
  export interface Decorator {
266
- name: 'tick' | 'load' | 'on' | 'on_trigger' | 'on_advancement' | 'on_craft' | 'on_death' | 'on_login' | 'on_join_team' | 'keep' | 'require_on_load' | 'coroutine' | 'schedule'
276
+ name: 'tick' | 'load' | 'watch' | 'on' | 'on_trigger' | 'on_advancement' | 'on_craft' | 'on_death' | 'on_login' | 'on_join_team' | 'keep' | 'require_on_load' | 'coroutine' | 'schedule' | 'deprecated' | 'inline' | 'no-inline' | 'config' | 'singleton' | 'profile' | 'throttle' | 'retry' | 'memoize' | 'test'
267
277
  args?: {
268
278
  rate?: number
279
+ objective?: string
269
280
  eventType?: string
270
281
  trigger?: string
271
282
  advancement?: string
@@ -274,6 +285,16 @@ export interface Decorator {
274
285
  batch?: number
275
286
  onDone?: string
276
287
  ticks?: number
288
+ /** @deprecated decorator message */
289
+ message?: string
290
+ /** @config decorator: config key name */
291
+ configKey?: string
292
+ /** @config decorator: default value */
293
+ configDefault?: number
294
+ /** @retry decorator: max retry count */
295
+ max?: number
296
+ /** @test decorator: human-readable test label */
297
+ testLabel?: string
277
298
  }
278
299
  /** Raw positional arguments (used by @requires and future generic decorators). */
279
300
  rawArgs?: Array<{ kind: 'string'; value: string } | { kind: 'number'; value: number }>
@@ -296,6 +317,8 @@ export interface FnDecl {
296
317
  isLibraryFn?: boolean
297
318
  /** True when declared with `export fn` or `@keep fn` — survives DCE. */
298
319
  isExported?: boolean
320
+ /** Scoreboard objective watched by @watch("..."), if present. */
321
+ watchObjective?: string
299
322
  name: string
300
323
  /** Generic type parameter names, e.g. ['T'] for fn foo<T>(...) */
301
324
  typeParams?: string[]
@@ -304,6 +327,7 @@ export interface FnDecl {
304
327
  decorators: Decorator[]
305
328
  body: Block
306
329
  span?: Span
330
+ sourceFile?: string
307
331
  }
308
332
 
309
333
  // ---------------------------------------------------------------------------
@@ -317,20 +341,51 @@ export interface StructField {
317
341
 
318
342
  export interface StructDecl {
319
343
  name: string
344
+ extends?: string
320
345
  fields: StructField[]
346
+ /** True when the struct was declared with `@singleton` */
347
+ isSingleton?: boolean
321
348
  span?: Span
322
349
  }
323
350
 
324
351
  export interface ImplBlock {
325
352
  kind: 'impl_block'
326
353
  typeName: string
354
+ /** Trait name when declared as `impl TraitName for TypeName` (e.g. "Display") */
355
+ traitName?: string
327
356
  methods: FnDecl[]
328
357
  span?: Span
329
358
  }
330
359
 
360
+ // ---------------------------------------------------------------------------
361
+ // Interface / Trait Declarations
362
+ // ---------------------------------------------------------------------------
363
+
364
+ /** A method signature in an interface body (no body) */
365
+ export interface InterfaceMethod {
366
+ name: string
367
+ params: Param[]
368
+ returnType?: TypeNode
369
+ span?: Span
370
+ }
371
+
372
+ /** `interface Drawable { fn draw(self, x: int, y: int) ... }` */
373
+ export interface InterfaceDecl {
374
+ name: string
375
+ methods: InterfaceMethod[]
376
+ span?: Span
377
+ }
378
+
379
+ export interface EnumPayloadField {
380
+ name: string
381
+ type: TypeNode
382
+ }
383
+
331
384
  export interface EnumVariant {
332
385
  name: string
333
386
  value?: number
387
+ /** Payload fields for tuple-like variants, e.g. RGB(r: int, g: int, b: int) */
388
+ fields?: EnumPayloadField[]
334
389
  }
335
390
 
336
391
  export interface EnumDecl {
@@ -352,6 +407,10 @@ export interface GlobalDecl {
352
407
  type: TypeNode
353
408
  init: Expr
354
409
  mutable: boolean // let = true, const = false
410
+ /** Present when the global was declared with @config("key", default: value) */
411
+ configKey?: string
412
+ /** Default value for @config globals */
413
+ configDefault?: number
355
414
  span?: Span
356
415
  }
357
416
 
@@ -362,8 +421,9 @@ export interface GlobalDecl {
362
421
  export interface ImportDecl {
363
422
  /** The module being imported from, e.g. "math" in `import math::sin` */
364
423
  moduleName: string
365
- /** The symbol being imported, or '*' for wildcard */
366
- symbol: string // '*' | identifier
424
+ /** The symbol being imported, or '*' for wildcard.
425
+ * Undefined when this is a whole-module file import (`import player_utils`). */
426
+ symbol?: string // '*' | identifier | undefined (whole-module import)
367
427
  span?: Span
368
428
  }
369
429
 
@@ -383,6 +443,8 @@ export interface Program {
383
443
  consts: ConstDecl[]
384
444
  /** Phase 5b: module imports (`import math::sin;`) */
385
445
  imports: ImportDecl[]
446
+ /** Interface / trait declarations */
447
+ interfaces: InterfaceDecl[]
386
448
  /** True when the source file declares `module library;`.
387
449
  * Library-mode: all functions are DCE-eligible by default — none are treated
388
450
  * as MC entry points unless they carry @tick / @load / @on / @keep etc. */
@@ -1,18 +1,23 @@
1
1
  /**
2
- * Incremental compilation — only recompile files whose content (or
3
- * dependencies) has changed since the last build.
2
+ * Incremental compilation — only recompile files whose content, imports,
3
+ * or reverse dependents changed since the last build.
4
4
  */
5
5
 
6
+ import * as fs from 'fs'
6
7
  import * as path from 'path'
7
8
  import { compile, type CompileOptions, type CompileResult } from '../emit/compile'
8
- import * as fs from 'fs'
9
+ import type { DatapackFile } from '../emit'
9
10
  import { FileCache } from './index'
10
- import { DependencyGraph } from './deps'
11
+ import { DependencyGraph, parseImports } from './deps'
11
12
 
12
13
  export interface IncrementalOptions {
13
14
  namespace?: string
14
15
  /** Output directory for compiled files. */
15
16
  output: string
17
+ generateSourceMap?: boolean
18
+ mcVersion?: CompileOptions['mcVersion']
19
+ lenient?: boolean
20
+ includeDirs?: string[]
16
21
  }
17
22
 
18
23
  export interface IncrementalResult {
@@ -24,135 +29,149 @@ export interface IncrementalResult {
24
29
  errors: Map<string, string>
25
30
  /** Per-file compile results (only for recompiled files). */
26
31
  results: Map<string, CompileResult>
32
+ /** Files skipped due to cache hit. */
33
+ skippedFiles: string[]
34
+ /** Files rebuilt in this run. */
35
+ rebuiltFiles: string[]
36
+ /** Elapsed wall time for this run. */
37
+ elapsedMs: number
27
38
  }
28
39
 
29
- /** Cached compilation output per entry file. */
30
- interface CompileCacheEntry {
31
- result: CompileResult
32
- /** Content hashes of entry file + all its transitive deps at compile time. */
33
- depHashes: Map<string, string>
34
- }
35
-
36
- const compiledCache = new Map<string, CompileCacheEntry>()
37
-
38
- /**
39
- * Compile a set of entry files incrementally.
40
- *
41
- * For each file:
42
- * - Compute content hash of the file and all its transitive imports
43
- * - If all hashes match the previous build → skip (cache hit)
44
- * - If any hash changed → recompile from scratch
45
- */
46
40
  export function compileIncremental(
47
41
  files: string[],
48
42
  cache: FileCache,
49
43
  depGraph: DependencyGraph,
50
44
  options: IncrementalOptions,
51
45
  ): IncrementalResult {
46
+ const start = Date.now()
47
+ const normalizedEntries = [...new Set(files.map(file => path.resolve(file)))]
52
48
  const result: IncrementalResult = {
53
49
  recompiled: 0,
54
50
  cached: 0,
55
51
  errors: new Map(),
56
52
  results: new Map(),
53
+ skippedFiles: [],
54
+ rebuiltFiles: [],
55
+ elapsedMs: 0,
57
56
  }
58
57
 
59
- // Phase 1: Update dependency graph for all files
60
- for (const file of files) {
61
- const absFile = path.resolve(file)
62
- try {
63
- const source = fs.readFileSync(absFile, 'utf-8')
64
- depGraph.addFile(absFile, source)
65
- } catch {
66
- // File might have been deleted
67
- depGraph.removeFile(absFile)
68
- }
58
+ if (normalizedEntries.length === 0) {
59
+ result.elapsedMs = Date.now() - start
60
+ return result
69
61
  }
70
62
 
71
- // Phase 2: Detect all changed source files BEFORE recompiling anything.
72
- // This prevents cache.update() during one file's recompile from hiding
73
- // changes needed by another file that shares the same dependency.
74
- const changedSourceFiles = new Set<string>()
75
- const allSourceFiles = new Set<string>()
76
-
77
- for (const file of files) {
78
- const absFile = path.resolve(file)
79
- const allDeps = depGraph.getTransitiveDeps(absFile)
80
- allSourceFiles.add(absFile)
81
- for (const dep of allDeps) allSourceFiles.add(dep)
63
+ depGraph.clear()
64
+ const discoveredFiles = discoverDependencyGraph(normalizedEntries, depGraph)
65
+ const changedFiles = new Set<string>()
66
+
67
+ for (const file of discoveredFiles) {
68
+ if (cache.hasChanged(file)) changedFiles.add(file)
82
69
  }
83
70
 
84
- for (const sourceFile of allSourceFiles) {
85
- if (cache.hasChanged(sourceFile)) {
86
- changedSourceFiles.add(sourceFile)
87
- }
71
+ const dirtyFiles = depGraph.computeDirtySet(changedFiles)
72
+ for (const entry of normalizedEntries) {
73
+ if (!discoveredFiles.has(entry)) dirtyFiles.add(entry)
88
74
  }
89
75
 
90
- // Phase 3: For each entry file, check if it or any dep changed → recompile
91
- for (const file of files) {
92
- const absFile = path.resolve(file)
93
-
94
- // Collect all files in this compilation unit (entry + transitive deps)
95
- const allDeps = depGraph.getTransitiveDeps(absFile)
96
- const unitFiles = [absFile, ...allDeps]
97
-
98
- // Check if any file in the unit has changed
99
- let needsRecompile = false
100
- const prevEntry = compiledCache.get(absFile)
101
-
102
- if (!prevEntry) {
103
- needsRecompile = true
104
- } else {
105
- for (const unitFile of unitFiles) {
106
- if (changedSourceFiles.has(unitFile)) {
107
- needsRecompile = true
108
- break
109
- }
110
- }
111
- // Also check if the set of dependencies changed
112
- if (!needsRecompile && prevEntry.depHashes.size !== unitFiles.length) {
113
- needsRecompile = true
114
- }
115
- }
76
+ for (const entryFile of normalizedEntries) {
77
+ const entryDeps = depGraph.getTransitiveDeps(entryFile)
78
+ const entryUnit = new Set([entryFile, ...entryDeps])
79
+ const cachedEntry = cache.get(entryFile)
80
+ const cachedDepList = new Set(cachedEntry?.dependencies ?? [])
116
81
 
117
- if (!needsRecompile) {
118
- // Cache hit — write cached result to output
119
- const cached = compiledCache.get(absFile)!
120
- writeBuildOutput(cached.result, options.output)
82
+ const hasDependencyDrift =
83
+ cachedDepList.size !== entryUnit.size ||
84
+ [...entryUnit].some(file => !cachedDepList.has(file))
85
+
86
+ const canUseCache =
87
+ !dirtyFiles.has(entryFile) &&
88
+ !hasDependencyDrift &&
89
+ !!cachedEntry?.outputFiles &&
90
+ cachedEntry.outputFiles.length > 0
91
+
92
+ if (canUseCache) {
93
+ writeBuildOutput(cachedEntry.outputFiles!, options.output)
121
94
  result.cached++
95
+ result.skippedFiles.push(entryFile)
122
96
  continue
123
97
  }
124
98
 
125
- // Cache miss — recompile
126
99
  try {
127
- const source = fs.readFileSync(absFile, 'utf-8')
128
- const ns = options.namespace ?? deriveNamespace(absFile)
129
- const compileResult = compile(source, { namespace: ns, filePath: absFile })
130
-
131
- // Update caches
132
- const depHashes = new Map<string, string>()
133
- for (const unitFile of unitFiles) {
134
- cache.update(unitFile)
135
- const entry = cache.get(unitFile)
136
- if (entry) depHashes.set(unitFile, entry.hash)
100
+ const source = fs.readFileSync(entryFile, 'utf-8')
101
+ const ns = options.namespace ?? deriveNamespace(entryFile)
102
+ const compileResult = compile(source, {
103
+ namespace: ns,
104
+ filePath: entryFile,
105
+ generateSourceMap: options.generateSourceMap,
106
+ mcVersion: options.mcVersion,
107
+ lenient: options.lenient,
108
+ includeDirs: options.includeDirs,
109
+ })
110
+ const outputFiles = cloneFiles(compileResult.files)
111
+ const compiledFunctions = outputFiles
112
+ .filter(file => file.path.endsWith('.mcfunction'))
113
+ .map(file => file.path)
114
+
115
+ removeStaleOutputs(cachedEntry?.outputFiles ?? [], outputFiles, options.output)
116
+
117
+ for (const file of entryUnit) {
118
+ cache.update(file)
119
+ }
120
+
121
+ const entryRecord = cache.get(entryFile)
122
+ if (entryRecord) {
123
+ entryRecord.compiledFunctions = compiledFunctions
124
+ entryRecord.outputFiles = outputFiles
125
+ entryRecord.dependencies = [...entryUnit].sort()
137
126
  }
138
127
 
139
- compiledCache.set(absFile, { result: compileResult, depHashes })
140
- writeBuildOutput(compileResult, options.output)
128
+ writeBuildOutput(outputFiles, options.output)
141
129
 
142
130
  result.recompiled++
143
- result.results.set(absFile, compileResult)
131
+ result.results.set(entryFile, compileResult)
132
+ result.rebuiltFiles.push(entryFile)
144
133
  } catch (err) {
145
- result.errors.set(absFile, (err as Error).message)
134
+ result.errors.set(entryFile, (err as Error).message)
146
135
  }
147
136
  }
148
137
 
138
+ cache.save()
139
+ result.elapsedMs = Date.now() - start
149
140
  return result
150
141
  }
151
142
 
143
+ function discoverDependencyGraph(entries: string[], depGraph: DependencyGraph): Set<string> {
144
+ const visited = new Set<string>()
145
+ const queue = [...entries]
146
+
147
+ while (queue.length > 0) {
148
+ const current = path.resolve(queue.shift()!)
149
+ if (visited.has(current)) continue
150
+ visited.add(current)
151
+
152
+ try {
153
+ const source = fs.readFileSync(current, 'utf-8')
154
+ depGraph.addFile(current, source)
155
+ const imports = parseImports(current, source)
156
+ for (const imported of imports) {
157
+ if (!visited.has(imported)) queue.push(imported)
158
+ }
159
+ } catch {
160
+ depGraph.removeFile(current)
161
+ }
162
+ }
163
+
164
+ return visited
165
+ }
166
+
167
+ function cloneFiles(files: DatapackFile[]): DatapackFile[] {
168
+ return files.map(file => ({ path: file.path, content: file.content }))
169
+ }
170
+
152
171
  /** Write compile output files to the output directory. */
153
- function writeBuildOutput(compileResult: CompileResult, output: string): void {
172
+ function writeBuildOutput(files: DatapackFile[], output: string): void {
154
173
  fs.mkdirSync(output, { recursive: true })
155
- for (const dataFile of compileResult.files) {
174
+ for (const dataFile of files) {
156
175
  const filePath = path.join(output, dataFile.path)
157
176
  const dir = path.dirname(filePath)
158
177
  fs.mkdirSync(dir, { recursive: true })
@@ -160,14 +179,24 @@ function writeBuildOutput(compileResult: CompileResult, output: string): void {
160
179
  }
161
180
  }
162
181
 
182
+ function removeStaleOutputs(
183
+ previousFiles: DatapackFile[],
184
+ nextFiles: DatapackFile[],
185
+ output: string,
186
+ ): void {
187
+ if (previousFiles.length === 0) return
188
+ const nextPaths = new Set(nextFiles.map(file => file.path))
189
+
190
+ for (const oldFile of previousFiles) {
191
+ if (nextPaths.has(oldFile.path)) continue
192
+ const targetPath = path.join(output, oldFile.path)
193
+ if (fs.existsSync(targetPath)) fs.rmSync(targetPath, { force: true })
194
+ }
195
+ }
196
+
163
197
  function deriveNamespace(filePath: string): string {
164
198
  const basename = path.basename(filePath, path.extname(filePath))
165
199
  return basename.toLowerCase().replace(/[^a-z0-9]/g, '_')
166
200
  }
167
201
 
168
- /**
169
- * Reset the in-memory compile cache. Useful for testing.
170
- */
171
- export function resetCompileCache(): void {
172
- compiledCache.clear()
173
- }
202
+ export function resetCompileCache(): void {}
@@ -1,24 +1,39 @@
1
1
  /**
2
2
  * FileCache — content-hash-based compilation cache for incremental builds.
3
3
  *
4
- * Stores per-file content hashes and optional cached HIR modules.
5
- * Persists to `.redscript-cache/` as JSON.
4
+ * Stores per-file content hashes and optional cached output payloads.
5
+ * Persists to `.redscript-cache/cache.json`.
6
6
  */
7
7
 
8
8
  import * as fs from 'fs'
9
9
  import * as path from 'path'
10
10
  import * as crypto from 'crypto'
11
11
  import type { HIRModule } from '../hir/types'
12
+ import type { DatapackFile } from '../emit'
13
+
14
+ export interface CachedOutputFile extends DatapackFile {}
12
15
 
13
16
  export interface CacheEntry {
14
17
  hash: string
15
18
  mtime: number
16
19
  hir?: HIRModule
20
+ compiledFunctions?: string[]
21
+ outputFiles?: CachedOutputFile[]
22
+ dependencies?: string[]
17
23
  }
18
24
 
19
25
  interface SerializedCache {
20
- version: 1
21
- entries: Record<string, { hash: string; mtime: number }>
26
+ version: 2
27
+ entries: Record<
28
+ string,
29
+ {
30
+ hash: string
31
+ mtime: number
32
+ compiledFunctions?: string[]
33
+ outputFiles?: CachedOutputFile[]
34
+ dependencies?: string[]
35
+ }
36
+ >
22
37
  }
23
38
 
24
39
  export class FileCache {
@@ -102,12 +117,18 @@ export class FileCache {
102
117
  save(): void {
103
118
  fs.mkdirSync(this.cacheDir, { recursive: true })
104
119
  const serialized: SerializedCache = {
105
- version: 1,
120
+ version: 2,
106
121
  entries: {},
107
122
  }
108
123
  for (const [filePath, entry] of this.entries) {
109
124
  // Don't persist HIR — it contains non-serializable references
110
- serialized.entries[filePath] = { hash: entry.hash, mtime: entry.mtime }
125
+ serialized.entries[filePath] = {
126
+ hash: entry.hash,
127
+ mtime: entry.mtime,
128
+ compiledFunctions: entry.compiledFunctions,
129
+ outputFiles: entry.outputFiles,
130
+ dependencies: entry.dependencies,
131
+ }
111
132
  }
112
133
  const cachePath = path.join(this.cacheDir, 'cache.json')
113
134
  fs.writeFileSync(cachePath, JSON.stringify(serialized, null, 2))
@@ -118,9 +139,15 @@ export class FileCache {
118
139
  const cachePath = path.join(this.cacheDir, 'cache.json')
119
140
  try {
120
141
  const data = JSON.parse(fs.readFileSync(cachePath, 'utf-8')) as SerializedCache
121
- if (data.version !== 1) return
142
+ if (data.version !== 2) return
122
143
  for (const [filePath, entry] of Object.entries(data.entries)) {
123
- this.entries.set(filePath, { hash: entry.hash, mtime: entry.mtime })
144
+ this.entries.set(filePath, {
145
+ hash: entry.hash,
146
+ mtime: entry.mtime,
147
+ compiledFunctions: entry.compiledFunctions,
148
+ outputFiles: entry.outputFiles,
149
+ dependencies: entry.dependencies,
150
+ })
124
151
  }
125
152
  } catch {
126
153
  // No cache or corrupt — start fresh