redscript-mc 2.6.2 → 3.0.0

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