tsc-ts 0.0.4 → 0.0.5

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 (584) hide show
  1. package/README.md +33 -1
  2. package/dist/api/compiler/ast-utilities.d.ts +82 -0
  3. package/dist/api/compiler/ast-utilities.js +462 -0
  4. package/dist/api/compiler/ast.d.ts +2350 -0
  5. package/dist/api/compiler/ast.js +11206 -0
  6. package/dist/api/compiler/astnav.d.ts +37 -0
  7. package/dist/api/compiler/astnav.js +767 -0
  8. package/dist/api/compiler/binder-utilities.d.ts +182 -0
  9. package/dist/api/compiler/binder-utilities.js +1240 -0
  10. package/dist/api/compiler/binder.d.ts +33 -0
  11. package/dist/api/compiler/binder.js +2358 -0
  12. package/dist/api/compiler/character-codes.d.ts +161 -0
  13. package/dist/api/compiler/character-codes.js +160 -0
  14. package/dist/api/compiler/checker-calls.d.ts +46 -0
  15. package/dist/api/compiler/checker-calls.js +1640 -0
  16. package/dist/api/compiler/checker-classes.d.ts +30 -0
  17. package/dist/api/compiler/checker-classes.js +582 -0
  18. package/dist/api/compiler/checker-contextual.d.ts +77 -0
  19. package/dist/api/compiler/checker-contextual.js +1136 -0
  20. package/dist/api/compiler/checker-declaration-order.d.ts +12 -0
  21. package/dist/api/compiler/checker-declaration-order.js +356 -0
  22. package/dist/api/compiler/checker-declarations.d.ts +33 -0
  23. package/dist/api/compiler/checker-declarations.js +888 -0
  24. package/dist/api/compiler/checker-declared-types.d.ts +48 -0
  25. package/dist/api/compiler/checker-declared-types.js +787 -0
  26. package/dist/api/compiler/checker-decorators.d.ts +26 -0
  27. package/dist/api/compiler/checker-decorators.js +562 -0
  28. package/dist/api/compiler/checker-deprecation.d.ts +33 -0
  29. package/dist/api/compiler/checker-deprecation.js +315 -0
  30. package/dist/api/compiler/checker-destructuring.d.ts +34 -0
  31. package/dist/api/compiler/checker-destructuring.js +584 -0
  32. package/dist/api/compiler/checker-elaboration.d.ts +15 -0
  33. package/dist/api/compiler/checker-elaboration.js +290 -0
  34. package/dist/api/compiler/checker-emit-helpers.d.ts +58 -0
  35. package/dist/api/compiler/checker-emit-helpers.js +154 -0
  36. package/dist/api/compiler/checker-emit-resolver.d.ts +75 -0
  37. package/dist/api/compiler/checker-emit-resolver.js +579 -0
  38. package/dist/api/compiler/checker-evaluator.d.ts +27 -0
  39. package/dist/api/compiler/checker-evaluator.js +188 -0
  40. package/dist/api/compiler/checker-expressions.d.ts +67 -0
  41. package/dist/api/compiler/checker-expressions.js +1351 -0
  42. package/dist/api/compiler/checker-features.d.ts +6 -0
  43. package/dist/api/compiler/checker-features.js +354 -0
  44. package/dist/api/compiler/checker-flow.d.ts +86 -0
  45. package/dist/api/compiler/checker-flow.js +169 -0
  46. package/dist/api/compiler/checker-functions.d.ts +43 -0
  47. package/dist/api/compiler/checker-functions.js +1002 -0
  48. package/dist/api/compiler/checker-generated-code.d.ts +25 -0
  49. package/dist/api/compiler/checker-generated-code.js +168 -0
  50. package/dist/api/compiler/checker-globals.d.ts +14 -0
  51. package/dist/api/compiler/checker-globals.js +37 -0
  52. package/dist/api/compiler/checker-grammar.d.ts +35 -0
  53. package/dist/api/compiler/checker-grammar.js +2573 -0
  54. package/dist/api/compiler/checker-heritage.d.ts +28 -0
  55. package/dist/api/compiler/checker-heritage.js +900 -0
  56. package/dist/api/compiler/checker-inference.d.ts +179 -0
  57. package/dist/api/compiler/checker-inference.js +2105 -0
  58. package/dist/api/compiler/checker-iteration.d.ts +115 -0
  59. package/dist/api/compiler/checker-iteration.js +857 -0
  60. package/dist/api/compiler/checker-javascript.d.ts +42 -0
  61. package/dist/api/compiler/checker-javascript.js +441 -0
  62. package/dist/api/compiler/checker-jsdoc.d.ts +30 -0
  63. package/dist/api/compiler/checker-jsdoc.js +320 -0
  64. package/dist/api/compiler/checker-jsx.d.ts +94 -0
  65. package/dist/api/compiler/checker-jsx.js +1433 -0
  66. package/dist/api/compiler/checker-literals.d.ts +6 -0
  67. package/dist/api/compiler/checker-literals.js +43 -0
  68. package/dist/api/compiler/checker-members.d.ts +198 -0
  69. package/dist/api/compiler/checker-members.js +2126 -0
  70. package/dist/api/compiler/checker-modules.d.ts +85 -0
  71. package/dist/api/compiler/checker-modules.js +2141 -0
  72. package/dist/api/compiler/checker-narrowing.d.ts +120 -0
  73. package/dist/api/compiler/checker-narrowing.js +2797 -0
  74. package/dist/api/compiler/checker-object-literals.d.ts +14 -0
  75. package/dist/api/compiler/checker-object-literals.js +479 -0
  76. package/dist/api/compiler/checker-operators.d.ts +33 -0
  77. package/dist/api/compiler/checker-operators.js +1040 -0
  78. package/dist/api/compiler/checker-overloads.d.ts +7 -0
  79. package/dist/api/compiler/checker-overloads.js +270 -0
  80. package/dist/api/compiler/checker-property-access.d.ts +34 -0
  81. package/dist/api/compiler/checker-property-access.js +672 -0
  82. package/dist/api/compiler/checker-services.d.ts +49 -0
  83. package/dist/api/compiler/checker-services.js +995 -0
  84. package/dist/api/compiler/checker-signatures.d.ts +55 -0
  85. package/dist/api/compiler/checker-signatures.js +788 -0
  86. package/dist/api/compiler/checker-source-file.d.ts +27 -0
  87. package/dist/api/compiler/checker-source-file.js +619 -0
  88. package/dist/api/compiler/checker-statements.d.ts +18 -0
  89. package/dist/api/compiler/checker-statements.js +226 -0
  90. package/dist/api/compiler/checker-super.d.ts +13 -0
  91. package/dist/api/compiler/checker-super.js +241 -0
  92. package/dist/api/compiler/checker-symbol-types.d.ts +67 -0
  93. package/dist/api/compiler/checker-symbol-types.js +1885 -0
  94. package/dist/api/compiler/checker-symbols.d.ts +181 -0
  95. package/dist/api/compiler/checker-symbols.js +1782 -0
  96. package/dist/api/compiler/checker-type-factory.d.ts +142 -0
  97. package/dist/api/compiler/checker-type-factory.js +2501 -0
  98. package/dist/api/compiler/checker-type-nodes.d.ts +26 -0
  99. package/dist/api/compiler/checker-type-nodes.js +828 -0
  100. package/dist/api/compiler/checker-type-operators.d.ts +109 -0
  101. package/dist/api/compiler/checker-type-operators.js +1842 -0
  102. package/dist/api/compiler/checker-types.d.ts +1027 -0
  103. package/dist/api/compiler/checker-types.js +1697 -0
  104. package/dist/api/compiler/checker-unused.d.ts +19 -0
  105. package/dist/api/compiler/checker-unused.js +524 -0
  106. package/dist/api/compiler/checker-utilities.d.ts +33 -0
  107. package/dist/api/compiler/checker-utilities.js +141 -0
  108. package/dist/api/compiler/checker.d.ts +491 -0
  109. package/dist/api/compiler/checker.js +912 -0
  110. package/dist/api/compiler/command-line.d.ts +32 -0
  111. package/dist/api/compiler/command-line.js +383 -0
  112. package/dist/api/compiler/compile-program.d.ts +118 -0
  113. package/dist/api/compiler/compile-program.js +384 -0
  114. package/dist/api/compiler/diagnostic-locales.d.ts +22 -0
  115. package/dist/api/compiler/diagnostic-locales.js +64 -0
  116. package/dist/api/compiler/diagnostic-messages.d.ts +2166 -0
  117. package/dist/api/compiler/diagnostic-messages.js +184 -0
  118. package/dist/api/compiler/diagnostics.d.ts +167 -0
  119. package/dist/api/compiler/diagnostics.js +820 -0
  120. package/dist/api/compiler/emitter.d.ts +71 -0
  121. package/dist/api/compiler/emitter.js +327 -0
  122. package/dist/api/compiler/file-include.d.ts +117 -0
  123. package/dist/api/compiler/file-include.js +536 -0
  124. package/dist/api/compiler/file-loader.d.ts +261 -0
  125. package/dist/api/compiler/file-loader.js +1257 -0
  126. package/dist/api/compiler/file-system.d.ts +51 -0
  127. package/dist/api/compiler/file-system.js +132 -0
  128. package/dist/api/compiler/flow.d.ts +60 -0
  129. package/dist/api/compiler/flow.js +45 -0
  130. package/dist/api/compiler/instantiation.d.ts +74 -0
  131. package/dist/api/compiler/instantiation.js +799 -0
  132. package/dist/api/compiler/jsdoc.d.ts +75 -0
  133. package/dist/api/compiler/jsdoc.js +1229 -0
  134. package/dist/api/compiler/link-tables.d.ts +36 -0
  135. package/dist/api/compiler/link-tables.js +83 -0
  136. package/dist/api/compiler/locale-data.d.ts +24 -0
  137. package/dist/api/compiler/locale-data.js +183 -0
  138. package/dist/api/compiler/locale.d.ts +4 -0
  139. package/dist/api/compiler/locale.js +317 -0
  140. package/dist/api/compiler/locales/cs-CZ.d.ts +2 -0
  141. package/dist/api/compiler/locales/cs-CZ.js +3 -0
  142. package/dist/api/compiler/locales/de-DE.d.ts +2 -0
  143. package/dist/api/compiler/locales/de-DE.js +3 -0
  144. package/dist/api/compiler/locales/es-ES.d.ts +2 -0
  145. package/dist/api/compiler/locales/es-ES.js +3 -0
  146. package/dist/api/compiler/locales/fr-FR.d.ts +2 -0
  147. package/dist/api/compiler/locales/fr-FR.js +3 -0
  148. package/dist/api/compiler/locales/it-IT.d.ts +2 -0
  149. package/dist/api/compiler/locales/it-IT.js +3 -0
  150. package/dist/api/compiler/locales/ja-JP.d.ts +2 -0
  151. package/dist/api/compiler/locales/ja-JP.js +3 -0
  152. package/dist/api/compiler/locales/ko-KR.d.ts +2 -0
  153. package/dist/api/compiler/locales/ko-KR.js +3 -0
  154. package/dist/api/compiler/locales/pl-PL.d.ts +2 -0
  155. package/dist/api/compiler/locales/pl-PL.js +3 -0
  156. package/dist/api/compiler/locales/pt-BR.d.ts +2 -0
  157. package/dist/api/compiler/locales/pt-BR.js +3 -0
  158. package/dist/api/compiler/locales/ru-RU.d.ts +2 -0
  159. package/dist/api/compiler/locales/ru-RU.js +3 -0
  160. package/dist/api/compiler/locales/tr-TR.d.ts +2 -0
  161. package/dist/api/compiler/locales/tr-TR.js +3 -0
  162. package/dist/api/compiler/locales/zh-CN.d.ts +2 -0
  163. package/dist/api/compiler/locales/zh-CN.js +3 -0
  164. package/dist/api/compiler/locales/zh-TW.d.ts +2 -0
  165. package/dist/api/compiler/locales/zh-TW.js +3 -0
  166. package/dist/api/compiler/module-resolution-types.d.ts +83 -0
  167. package/dist/api/compiler/module-resolution-types.js +176 -0
  168. package/dist/api/compiler/module-resolution.d.ts +71 -0
  169. package/dist/api/compiler/module-resolution.js +1598 -0
  170. package/dist/api/compiler/module-specifiers.d.ts +64 -0
  171. package/dist/api/compiler/module-specifiers.js +1101 -0
  172. package/dist/api/compiler/name-resolver.d.ts +43 -0
  173. package/dist/api/compiler/name-resolver.js +509 -0
  174. package/dist/api/compiler/node-builder-names.d.ts +32 -0
  175. package/dist/api/compiler/node-builder-names.js +854 -0
  176. package/dist/api/compiler/node-builder-pseudo.d.ts +36 -0
  177. package/dist/api/compiler/node-builder-pseudo.js +744 -0
  178. package/dist/api/compiler/node-builder-reuse.d.ts +4 -0
  179. package/dist/api/compiler/node-builder-reuse.js +647 -0
  180. package/dist/api/compiler/node-builder.d.ts +270 -0
  181. package/dist/api/compiler/node-builder.js +2645 -0
  182. package/dist/api/compiler/option-declarations.d.ts +90 -0
  183. package/dist/api/compiler/option-declarations.js +1460 -0
  184. package/dist/api/compiler/options.d.ts +289 -0
  185. package/dist/api/compiler/options.js +1197 -0
  186. package/dist/api/compiler/output-paths.d.ts +42 -0
  187. package/dist/api/compiler/output-paths.js +195 -0
  188. package/dist/api/compiler/package-json.d.ts +175 -0
  189. package/dist/api/compiler/package-json.js +1015 -0
  190. package/dist/api/compiler/parallel-parse.d.ts +219 -0
  191. package/dist/api/compiler/parallel-parse.js +537 -0
  192. package/dist/api/compiler/parser.d.ts +587 -0
  193. package/dist/api/compiler/parser.js +6407 -0
  194. package/dist/api/compiler/path.d.ts +91 -0
  195. package/dist/api/compiler/path.js +705 -0
  196. package/dist/api/compiler/printer/async-helpers.d.ts +22 -0
  197. package/dist/api/compiler/printer/async-helpers.js +91 -0
  198. package/dist/api/compiler/printer/auto-generate.d.ts +13 -0
  199. package/dist/api/compiler/printer/auto-generate.js +20 -0
  200. package/dist/api/compiler/printer/decorator-helpers.d.ts +24 -0
  201. package/dist/api/compiler/printer/decorator-helpers.js +118 -0
  202. package/dist/api/compiler/printer/emit-context.d.ts +154 -0
  203. package/dist/api/compiler/printer/emit-context.js +576 -0
  204. package/dist/api/compiler/printer/emit-flags.d.ts +60 -0
  205. package/dist/api/compiler/printer/emit-flags.js +2 -0
  206. package/dist/api/compiler/printer/factory-base.d.ts +171 -0
  207. package/dist/api/compiler/printer/factory-base.js +1505 -0
  208. package/dist/api/compiler/printer/factory.d.ts +147 -0
  209. package/dist/api/compiler/printer/factory.js +542 -0
  210. package/dist/api/compiler/printer/helpers.d.ts +27 -0
  211. package/dist/api/compiler/printer/helpers.js +164 -0
  212. package/dist/api/compiler/printer/name-generator.d.ts +41 -0
  213. package/dist/api/compiler/printer/name-generator.js +283 -0
  214. package/dist/api/compiler/printer/printer.d.ts +411 -0
  215. package/dist/api/compiler/printer/printer.js +4517 -0
  216. package/dist/api/compiler/printer/text-writer.d.ts +46 -0
  217. package/dist/api/compiler/printer/text-writer.js +172 -0
  218. package/dist/api/compiler/printer/utilities.d.ts +82 -0
  219. package/dist/api/compiler/printer/utilities.js +817 -0
  220. package/dist/api/compiler/program-checker.d.ts +156 -0
  221. package/dist/api/compiler/program-checker.js +526 -0
  222. package/dist/api/compiler/program-utilities.d.ts +52 -0
  223. package/dist/api/compiler/program-utilities.js +365 -0
  224. package/dist/api/compiler/program.d.ts +180 -0
  225. package/dist/api/compiler/program.js +1011 -0
  226. package/dist/api/compiler/pseudo-bigint.d.ts +5 -0
  227. package/dist/api/compiler/pseudo-bigint.js +61 -0
  228. package/dist/api/compiler/regexp-checker.d.ts +38 -0
  229. package/dist/api/compiler/regexp-checker.js +942 -0
  230. package/dist/api/compiler/relations.d.ts +263 -0
  231. package/dist/api/compiler/relations.js +4002 -0
  232. package/dist/api/compiler/reparser.d.ts +48 -0
  233. package/dist/api/compiler/reparser.js +1323 -0
  234. package/dist/api/compiler/scanner.d.ts +256 -0
  235. package/dist/api/compiler/scanner.js +2853 -0
  236. package/dist/api/compiler/side-state.d.ts +16 -0
  237. package/dist/api/compiler/side-state.js +89 -0
  238. package/dist/api/compiler/sourcemap.d.ts +55 -0
  239. package/dist/api/compiler/sourcemap.js +340 -0
  240. package/dist/api/compiler/spelling.d.ts +14 -0
  241. package/dist/api/compiler/spelling.js +128 -0
  242. package/dist/api/compiler/symbol-accessibility.d.ts +57 -0
  243. package/dist/api/compiler/symbol-accessibility.js +894 -0
  244. package/dist/api/compiler/symbol.d.ts +240 -0
  245. package/dist/api/compiler/symbol.js +228 -0
  246. package/dist/api/compiler/symlinks.d.ts +32 -0
  247. package/dist/api/compiler/symlinks.js +114 -0
  248. package/dist/api/compiler/syntax-kind.d.ts +389 -0
  249. package/dist/api/compiler/syntax-kind.js +2 -0
  250. package/dist/api/compiler/timeline.d.ts +9 -0
  251. package/dist/api/compiler/timeline.js +54 -0
  252. package/dist/api/compiler/transformers/alias-references.d.ts +39 -0
  253. package/dist/api/compiler/transformers/alias-references.js +676 -0
  254. package/dist/api/compiler/transformers/async-utilities.d.ts +51 -0
  255. package/dist/api/compiler/transformers/async-utilities.js +260 -0
  256. package/dist/api/compiler/transformers/async.d.ts +53 -0
  257. package/dist/api/compiler/transformers/async.js +645 -0
  258. package/dist/api/compiler/transformers/class-fields.d.ts +206 -0
  259. package/dist/api/compiler/transformers/class-fields.js +2418 -0
  260. package/dist/api/compiler/transformers/class-utilities.d.ts +46 -0
  261. package/dist/api/compiler/transformers/class-utilities.js +261 -0
  262. package/dist/api/compiler/transformers/commonjs-module.d.ts +103 -0
  263. package/dist/api/compiler/transformers/commonjs-module.js +1180 -0
  264. package/dist/api/compiler/transformers/const-enum-inliner.d.ts +11 -0
  265. package/dist/api/compiler/transformers/const-enum-inliner.js +36 -0
  266. package/dist/api/compiler/transformers/declarations-diagnostics.d.ts +52 -0
  267. package/dist/api/compiler/transformers/declarations-diagnostics.js +538 -0
  268. package/dist/api/compiler/transformers/declarations-pseudo.d.ts +160 -0
  269. package/dist/api/compiler/transformers/declarations-pseudo.js +797 -0
  270. package/dist/api/compiler/transformers/declarations-resolver.d.ts +152 -0
  271. package/dist/api/compiler/transformers/declarations-resolver.js +35 -0
  272. package/dist/api/compiler/transformers/declarations-syntactic.d.ts +119 -0
  273. package/dist/api/compiler/transformers/declarations-syntactic.js +1582 -0
  274. package/dist/api/compiler/transformers/declarations-tracker.d.ts +46 -0
  275. package/dist/api/compiler/transformers/declarations-tracker.js +197 -0
  276. package/dist/api/compiler/transformers/declarations.d.ts +175 -0
  277. package/dist/api/compiler/transformers/declarations.js +2380 -0
  278. package/dist/api/compiler/transformers/decorator-metadata.d.ts +54 -0
  279. package/dist/api/compiler/transformers/decorator-metadata.js +554 -0
  280. package/dist/api/compiler/transformers/decorator-utilities.d.ts +38 -0
  281. package/dist/api/compiler/transformers/decorator-utilities.js +238 -0
  282. package/dist/api/compiler/transformers/destructuring.d.ts +25 -0
  283. package/dist/api/compiler/transformers/destructuring.js +626 -0
  284. package/dist/api/compiler/transformers/downlevel.d.ts +6 -0
  285. package/dist/api/compiler/transformers/downlevel.js +45 -0
  286. package/dist/api/compiler/transformers/emit-resolver.d.ts +61 -0
  287. package/dist/api/compiler/transformers/emit-resolver.js +197 -0
  288. package/dist/api/compiler/transformers/es-decorators.d.ts +118 -0
  289. package/dist/api/compiler/transformers/es-decorators.js +1901 -0
  290. package/dist/api/compiler/transformers/exponentiation.d.ts +11 -0
  291. package/dist/api/compiler/transformers/exponentiation.js +76 -0
  292. package/dist/api/compiler/transformers/external-module-info.d.ts +35 -0
  293. package/dist/api/compiler/transformers/external-module-info.js +351 -0
  294. package/dist/api/compiler/transformers/for-await.d.ts +43 -0
  295. package/dist/api/compiler/transformers/for-await.js +469 -0
  296. package/dist/api/compiler/transformers/import-elision.d.ts +16 -0
  297. package/dist/api/compiler/transformers/import-elision.js +124 -0
  298. package/dist/api/compiler/transformers/jsx-entities.d.ts +1 -0
  299. package/dist/api/compiler/transformers/jsx-entities.js +256 -0
  300. package/dist/api/compiler/transformers/jsx.d.ts +71 -0
  301. package/dist/api/compiler/transformers/jsx.js +700 -0
  302. package/dist/api/compiler/transformers/legacy-decorators.d.ts +56 -0
  303. package/dist/api/compiler/transformers/legacy-decorators.js +564 -0
  304. package/dist/api/compiler/transformers/logical-assignment.d.ts +14 -0
  305. package/dist/api/compiler/transformers/logical-assignment.js +62 -0
  306. package/dist/api/compiler/transformers/module-utilities.d.ts +9 -0
  307. package/dist/api/compiler/transformers/module-utilities.js +36 -0
  308. package/dist/api/compiler/transformers/module.d.ts +49 -0
  309. package/dist/api/compiler/transformers/module.js +296 -0
  310. package/dist/api/compiler/transformers/named-evaluation.d.ts +26 -0
  311. package/dist/api/compiler/transformers/named-evaluation.js +266 -0
  312. package/dist/api/compiler/transformers/nullish-coalescing.d.ts +9 -0
  313. package/dist/api/compiler/transformers/nullish-coalescing.js +26 -0
  314. package/dist/api/compiler/transformers/object-rest-spread.d.ts +34 -0
  315. package/dist/api/compiler/transformers/object-rest-spread.js +411 -0
  316. package/dist/api/compiler/transformers/optional-catch.d.ts +9 -0
  317. package/dist/api/compiler/transformers/optional-catch.js +20 -0
  318. package/dist/api/compiler/transformers/optional-chain.d.ts +14 -0
  319. package/dist/api/compiler/transformers/optional-chain.js +188 -0
  320. package/dist/api/compiler/transformers/reference-resolver.d.ts +128 -0
  321. package/dist/api/compiler/transformers/reference-resolver.js +1155 -0
  322. package/dist/api/compiler/transformers/runtime-syntax.d.ts +71 -0
  323. package/dist/api/compiler/transformers/runtime-syntax.js +753 -0
  324. package/dist/api/compiler/transformers/subtree-facts.d.ts +9 -0
  325. package/dist/api/compiler/transformers/subtree-facts.js +203 -0
  326. package/dist/api/compiler/transformers/syntax-facts.d.ts +51 -0
  327. package/dist/api/compiler/transformers/syntax-facts.js +254 -0
  328. package/dist/api/compiler/transformers/tagged-template.d.ts +17 -0
  329. package/dist/api/compiler/transformers/tagged-template.js +148 -0
  330. package/dist/api/compiler/transformers/transformer.d.ts +17 -0
  331. package/dist/api/compiler/transformers/transformer.js +54 -0
  332. package/dist/api/compiler/transformers/type-eraser.d.ts +21 -0
  333. package/dist/api/compiler/transformers/type-eraser.js +346 -0
  334. package/dist/api/compiler/transformers/type-serialization.d.ts +20 -0
  335. package/dist/api/compiler/transformers/type-serialization.js +347 -0
  336. package/dist/api/compiler/transformers/using.d.ts +56 -0
  337. package/dist/api/compiler/transformers/using.js +453 -0
  338. package/dist/api/compiler/transformers/utilities.d.ts +50 -0
  339. package/dist/api/compiler/transformers/utilities.js +347 -0
  340. package/dist/api/compiler/transformers/visitor-base.d.ts +6 -0
  341. package/dist/api/compiler/transformers/visitor-base.js +817 -0
  342. package/dist/api/compiler/transformers/visitor-hooks.d.ts +29 -0
  343. package/dist/api/compiler/transformers/visitor-hooks.js +189 -0
  344. package/dist/api/compiler/tsconfig.d.ts +177 -0
  345. package/dist/api/compiler/tsconfig.js +1311 -0
  346. package/dist/api/compiler/type-printer.d.ts +15 -0
  347. package/dist/api/compiler/type-printer.js +74 -0
  348. package/dist/api/compiler/types.d.ts +87 -0
  349. package/dist/api/compiler/types.js +23 -0
  350. package/dist/api/compiler/unicode-identifiers.d.ts +2 -0
  351. package/dist/api/compiler/unicode-identifiers.js +209 -0
  352. package/dist/api/compiler/unicode-properties.d.ts +8 -0
  353. package/dist/api/compiler/unicode-properties.js +531 -0
  354. package/dist/api/compiler/vfs-match.d.ts +24 -0
  355. package/dist/api/compiler/vfs-match.js +587 -0
  356. package/dist/api/library/ast.d.ts +3 -2
  357. package/dist/api/library/ast.generated.d.ts +127 -139
  358. package/dist/api/library/checker.d.ts +51 -0
  359. package/dist/api/library/checker.js +318 -0
  360. package/dist/api/library/diagnostics.d.ts +13 -0
  361. package/dist/api/library/diagnostics.js +50 -0
  362. package/dist/api/library/disk.d.ts +13 -0
  363. package/dist/api/library/disk.js +66 -0
  364. package/dist/api/library/errors.d.ts +13 -0
  365. package/dist/api/library/errors.js +24 -0
  366. package/dist/api/library/host.d.ts +24 -0
  367. package/dist/api/library/host.js +52 -0
  368. package/dist/api/library/index.d.ts +5 -1
  369. package/dist/api/library/index.js +4 -0
  370. package/dist/api/library/nodes.d.ts +51 -0
  371. package/dist/api/library/nodes.js +196 -0
  372. package/dist/api/library/options.d.ts +144 -0
  373. package/dist/api/library/options.js +308 -0
  374. package/dist/api/library/parse.d.ts +19 -0
  375. package/dist/api/library/parse.js +41 -0
  376. package/dist/api/library/program.d.ts +21 -0
  377. package/dist/api/library/program.js +234 -0
  378. package/dist/api/library/types.d.ts +14 -1
  379. package/package.json +12 -8
  380. package/src/compiler/ast-utilities.ts +548 -0
  381. package/src/compiler/ast.ts +12862 -0
  382. package/src/compiler/astnav.ts +799 -0
  383. package/src/compiler/binder-utilities.ts +1392 -0
  384. package/src/compiler/binder.ts +2703 -0
  385. package/src/compiler/build-info.ts +1197 -0
  386. package/src/compiler/character-codes.ts +323 -0
  387. package/src/compiler/checker-calls.ts +2155 -0
  388. package/src/compiler/checker-classes.ts +706 -0
  389. package/src/compiler/checker-contextual.ts +1457 -0
  390. package/src/compiler/checker-declaration-order.ts +438 -0
  391. package/src/compiler/checker-declarations.ts +1194 -0
  392. package/src/compiler/checker-declared-types.ts +919 -0
  393. package/src/compiler/checker-decorators.ts +694 -0
  394. package/src/compiler/checker-deprecation.ts +359 -0
  395. package/src/compiler/checker-destructuring.ts +805 -0
  396. package/src/compiler/checker-elaboration.ts +477 -0
  397. package/src/compiler/checker-emit-helpers.ts +224 -0
  398. package/src/compiler/checker-emit-resolver.ts +769 -0
  399. package/src/compiler/checker-evaluator.ts +243 -0
  400. package/src/compiler/checker-expressions.ts +1831 -0
  401. package/src/compiler/checker-features.ts +361 -0
  402. package/src/compiler/checker-flow.ts +394 -0
  403. package/src/compiler/checker-functions.ts +1296 -0
  404. package/src/compiler/checker-generated-code.ts +227 -0
  405. package/src/compiler/checker-globals.ts +52 -0
  406. package/src/compiler/checker-grammar.ts +3584 -0
  407. package/src/compiler/checker-heritage.ts +1233 -0
  408. package/src/compiler/checker-inference.ts +2576 -0
  409. package/src/compiler/checker-iteration.ts +1206 -0
  410. package/src/compiler/checker-javascript.ts +502 -0
  411. package/src/compiler/checker-jsdoc.ts +360 -0
  412. package/src/compiler/checker-jsx.ts +1924 -0
  413. package/src/compiler/checker-literals.ts +61 -0
  414. package/src/compiler/checker-members.ts +2436 -0
  415. package/src/compiler/checker-modules.ts +2886 -0
  416. package/src/compiler/checker-narrowing.ts +3230 -0
  417. package/src/compiler/checker-object-literals.ts +575 -0
  418. package/src/compiler/checker-operators.ts +1422 -0
  419. package/src/compiler/checker-overloads.ts +328 -0
  420. package/src/compiler/checker-property-access.ts +906 -0
  421. package/src/compiler/checker-services.ts +1149 -0
  422. package/src/compiler/checker-signatures.ts +1032 -0
  423. package/src/compiler/checker-source-file.ts +732 -0
  424. package/src/compiler/checker-statements.ts +292 -0
  425. package/src/compiler/checker-super.ts +261 -0
  426. package/src/compiler/checker-symbol-types.ts +2107 -0
  427. package/src/compiler/checker-symbols.ts +2150 -0
  428. package/src/compiler/checker-type-factory.ts +2579 -0
  429. package/src/compiler/checker-type-nodes.ts +1033 -0
  430. package/src/compiler/checker-type-operators.ts +2502 -0
  431. package/src/compiler/checker-types.ts +2340 -0
  432. package/src/compiler/checker-unused.ts +642 -0
  433. package/src/compiler/checker-utilities.ts +161 -0
  434. package/src/compiler/checker.ts +1116 -0
  435. package/src/compiler/command-line.ts +436 -0
  436. package/src/compiler/compile-program.ts +439 -0
  437. package/src/compiler/decoder.ts +1209 -0
  438. package/src/compiler/diagnostic-locales.ts +86 -0
  439. package/src/compiler/diagnostic-messages.ts +2349 -0
  440. package/src/compiler/diagnostics.ts +897 -0
  441. package/src/compiler/emitter.ts +434 -0
  442. package/src/compiler/encoder.ts +1945 -0
  443. package/src/compiler/file-include.ts +673 -0
  444. package/src/compiler/file-loader.ts +1528 -0
  445. package/src/compiler/file-system.ts +143 -0
  446. package/src/compiler/flow.ts +89 -0
  447. package/src/compiler/help.ts +473 -0
  448. package/src/compiler/incremental.ts +2784 -0
  449. package/src/compiler/init.ts +141 -0
  450. package/src/compiler/instantiation.ts +894 -0
  451. package/src/compiler/jsdoc.ts +1386 -0
  452. package/src/compiler/link-tables.ts +98 -0
  453. package/src/compiler/locale-data.ts +203 -0
  454. package/src/compiler/locale.ts +307 -0
  455. package/src/compiler/locales/cs-CZ.ts +5 -0
  456. package/src/compiler/locales/de-DE.ts +5 -0
  457. package/src/compiler/locales/es-ES.ts +5 -0
  458. package/src/compiler/locales/fr-FR.ts +5 -0
  459. package/src/compiler/locales/it-IT.ts +5 -0
  460. package/src/compiler/locales/ja-JP.ts +5 -0
  461. package/src/compiler/locales/ko-KR.ts +5 -0
  462. package/src/compiler/locales/pl-PL.ts +5 -0
  463. package/src/compiler/locales/pt-BR.ts +5 -0
  464. package/src/compiler/locales/ru-RU.ts +5 -0
  465. package/src/compiler/locales/tr-TR.ts +5 -0
  466. package/src/compiler/locales/zh-CN.ts +5 -0
  467. package/src/compiler/locales/zh-TW.ts +5 -0
  468. package/src/compiler/module-resolution-types.ts +243 -0
  469. package/src/compiler/module-resolution.ts +2072 -0
  470. package/src/compiler/module-specifiers.ts +1491 -0
  471. package/src/compiler/name-resolver.ts +646 -0
  472. package/src/compiler/node-builder-names.ts +1069 -0
  473. package/src/compiler/node-builder-pseudo.ts +892 -0
  474. package/src/compiler/node-builder-reuse.ts +764 -0
  475. package/src/compiler/node-builder.ts +3425 -0
  476. package/src/compiler/option-declarations.ts +1560 -0
  477. package/src/compiler/options.ts +1576 -0
  478. package/src/compiler/output-paths.ts +334 -0
  479. package/src/compiler/package-json.ts +1083 -0
  480. package/src/compiler/parallel-check.ts +1951 -0
  481. package/src/compiler/parallel-parse.ts +590 -0
  482. package/src/compiler/parse-thread.ts +140 -0
  483. package/src/compiler/parser.ts +7716 -0
  484. package/src/compiler/path.ts +717 -0
  485. package/src/compiler/printer/async-helpers.ts +183 -0
  486. package/src/compiler/printer/auto-generate.ts +27 -0
  487. package/src/compiler/printer/decorator-helpers.ts +218 -0
  488. package/src/compiler/printer/emit-context.ts +679 -0
  489. package/src/compiler/printer/emit-flags.ts +64 -0
  490. package/src/compiler/printer/factory-base.ts +2577 -0
  491. package/src/compiler/printer/factory.ts +764 -0
  492. package/src/compiler/printer/helpers.ts +291 -0
  493. package/src/compiler/printer/name-generator.ts +372 -0
  494. package/src/compiler/printer/printer.ts +5072 -0
  495. package/src/compiler/printer/text-writer.ts +183 -0
  496. package/src/compiler/printer/utilities.ts +884 -0
  497. package/src/compiler/program-checker.ts +592 -0
  498. package/src/compiler/program-utilities.ts +435 -0
  499. package/src/compiler/program.ts +1419 -0
  500. package/src/compiler/pseudo-bigint.ts +62 -0
  501. package/src/compiler/regexp-checker.ts +1142 -0
  502. package/src/compiler/relations.ts +5149 -0
  503. package/src/compiler/reparser.ts +1566 -0
  504. package/src/compiler/scanner.ts +2951 -0
  505. package/src/compiler/show-config.ts +239 -0
  506. package/src/compiler/side-state.ts +125 -0
  507. package/src/compiler/sourcemap.ts +366 -0
  508. package/src/compiler/spelling.ts +122 -0
  509. package/src/compiler/symbol-accessibility.ts +1071 -0
  510. package/src/compiler/symbol.ts +439 -0
  511. package/src/compiler/symlinks.ts +137 -0
  512. package/src/compiler/syntax-kind.ts +391 -0
  513. package/src/compiler/thread-entry.ts +191 -0
  514. package/src/compiler/timeline.ts +53 -0
  515. package/src/compiler/transformers/alias-references.ts +757 -0
  516. package/src/compiler/transformers/async-utilities.ts +335 -0
  517. package/src/compiler/transformers/async.ts +838 -0
  518. package/src/compiler/transformers/class-fields.ts +2967 -0
  519. package/src/compiler/transformers/class-utilities.ts +324 -0
  520. package/src/compiler/transformers/commonjs-module.ts +1621 -0
  521. package/src/compiler/transformers/const-enum-inliner.ts +50 -0
  522. package/src/compiler/transformers/declarations-diagnostics.ts +832 -0
  523. package/src/compiler/transformers/declarations-pseudo.ts +966 -0
  524. package/src/compiler/transformers/declarations-resolver.ts +249 -0
  525. package/src/compiler/transformers/declarations-syntactic.ts +1859 -0
  526. package/src/compiler/transformers/declarations-tracker.ts +269 -0
  527. package/src/compiler/transformers/declarations.ts +3120 -0
  528. package/src/compiler/transformers/decorator-metadata.ts +697 -0
  529. package/src/compiler/transformers/decorator-utilities.ts +283 -0
  530. package/src/compiler/transformers/destructuring.ts +708 -0
  531. package/src/compiler/transformers/downlevel.ts +50 -0
  532. package/src/compiler/transformers/emit-resolver.ts +258 -0
  533. package/src/compiler/transformers/es-decorators.ts +2682 -0
  534. package/src/compiler/transformers/exponentiation.ts +80 -0
  535. package/src/compiler/transformers/external-module-info.ts +412 -0
  536. package/src/compiler/transformers/for-await.ts +687 -0
  537. package/src/compiler/transformers/import-elision.ts +152 -0
  538. package/src/compiler/transformers/jsx-entities.ts +256 -0
  539. package/src/compiler/transformers/jsx.ts +824 -0
  540. package/src/compiler/transformers/legacy-decorators.ts +726 -0
  541. package/src/compiler/transformers/logical-assignment.ts +75 -0
  542. package/src/compiler/transformers/module-utilities.ts +42 -0
  543. package/src/compiler/transformers/module.ts +474 -0
  544. package/src/compiler/transformers/named-evaluation.ts +389 -0
  545. package/src/compiler/transformers/nullish-coalescing.ts +35 -0
  546. package/src/compiler/transformers/object-rest-spread.ts +577 -0
  547. package/src/compiler/transformers/optional-catch.ts +29 -0
  548. package/src/compiler/transformers/optional-chain.ts +246 -0
  549. package/src/compiler/transformers/reference-resolver.ts +1201 -0
  550. package/src/compiler/transformers/runtime-syntax.ts +942 -0
  551. package/src/compiler/transformers/subtree-facts.ts +245 -0
  552. package/src/compiler/transformers/syntax-facts.ts +353 -0
  553. package/src/compiler/transformers/tagged-template.ts +167 -0
  554. package/src/compiler/transformers/transformer.ts +56 -0
  555. package/src/compiler/transformers/type-eraser.ts +520 -0
  556. package/src/compiler/transformers/type-serialization.ts +374 -0
  557. package/src/compiler/transformers/using.ts +613 -0
  558. package/src/compiler/transformers/utilities.ts +419 -0
  559. package/src/compiler/transformers/visitor-base.ts +1601 -0
  560. package/src/compiler/transformers/visitor-hooks.ts +252 -0
  561. package/src/compiler/tsc-build.ts +1418 -0
  562. package/src/compiler/tsc-cli.ts +666 -0
  563. package/src/compiler/tsc-compile.ts +437 -0
  564. package/src/compiler/tsc-watch.ts +854 -0
  565. package/src/compiler/tsconfig.ts +1574 -0
  566. package/src/compiler/type-printer.ts +110 -0
  567. package/src/compiler/types.ts +115 -0
  568. package/src/compiler/unicode-identifiers.ts +212 -0
  569. package/src/compiler/unicode-properties.ts +537 -0
  570. package/src/compiler/vfs-match.ts +597 -0
  571. package/src/compiler/xxh3.ts +650 -0
  572. package/src/library/ast.generated.ts +141 -167
  573. package/src/library/ast.ts +4 -1
  574. package/src/library/checker.ts +384 -0
  575. package/src/library/diagnostics.ts +72 -0
  576. package/src/library/disk.ts +73 -0
  577. package/src/library/errors.ts +26 -0
  578. package/src/library/host.ts +63 -0
  579. package/src/library/index.ts +21 -0
  580. package/src/library/nodes.ts +232 -0
  581. package/src/library/options.ts +449 -0
  582. package/src/library/parse.ts +63 -0
  583. package/src/library/program.ts +293 -0
  584. package/src/library/types.ts +14 -1
@@ -0,0 +1,590 @@
1
+ /**
2
+ * Parsing and binding on several threads, before checking on several threads (`--checkers N` in
3
+ * scriptc builds).
4
+ *
5
+ * Before the main thread creates the Program, N parse threads load the program's files ahead of it,
6
+ * the way tsgo's loader does: the main thread queues the root files, the default libraries and the
7
+ * automatic type directives, and hands the queue out to the threads in small chunks. Each thread
8
+ * parses and binds the files of a chunk through a FileLoader of its own (parse-thread.ts), which
9
+ * resolves their references, imports and type directives exactly as the program's FileLoader will,
10
+ * and sends back the bound source files, published with `@scriptc/threads` so that they reach the
11
+ * main thread by reference, together with the files they add. The main thread queues the files it
12
+ * has not seen yet, and loading ends when the queue is empty and every thread is idle. Node and
13
+ * symbol ids come in chunks from one shared counter, so they stay unique in the program.
14
+ *
15
+ * The FileLoader then takes a prepared file instead of parsing when the file name, canonical path and
16
+ * module-indicator options match; anything else (a file that was not loaded ahead, or that is parsed
17
+ * with other options) is parsed as usual, so the program does not depend on what was loaded ahead.
18
+ */
19
+ import { statSync } from 'node:fs';
20
+ import type { Worker } from 'node:worker_threads';
21
+ import { publish } from '@scriptc/threads';
22
+ import { type SourceFile, type ExternalModuleIndicatorOptions, lastNodeIdValue, shareNodeIds } from './ast.js';
23
+ import type { LoadedFile } from './file-loader.js';
24
+ import type { CompilerOptions } from './options.js';
25
+ import { useThreadTextCaches } from './diagnostics.js';
26
+ import { useLazyJSDocTable } from './parser.js';
27
+ import { getNormalizedAbsolutePath } from './path.js';
28
+ import { PackageJsonLookup } from './package-json.js';
29
+ import { getDefaultLibFileName, getLibFileName } from './program-utilities.js';
30
+ import { lastSymbolIdValue, shareSymbolIds } from './symbol.js';
31
+ import { mark, timeline } from './timeline.js';
32
+
33
+ /** What a queued file is. */
34
+ export const enum LoadKind {
35
+ /** A root file of the config, as the config names it. */
36
+ Root = 0,
37
+ /** A file another file adds, by normalized file name. */
38
+ File = 1,
39
+ /** A library file, by its name (`lib.es2020.d.ts`). */
40
+ Library = 2,
41
+ /** The automatic type directives (`types`, or every package in `node_modules/@types`). */
42
+ AutomaticTypes = 3,
43
+ }
44
+
45
+ /**
46
+ * Files to load: kind, name and `maxNodeModuleJsDepth` depth of each, and the size in bytes of the
47
+ * files a parse thread adds (0 where unknown).
48
+ */
49
+ export class LoadJobs {
50
+ readonly kinds: number[] = [];
51
+ readonly names: string[] = [];
52
+ readonly depths: number[] = [];
53
+ readonly sizes: number[] = [];
54
+
55
+ push(kind: LoadKind, name: string, depth: number, size = 0): void {
56
+ this.kinds.push(kind);
57
+ this.names.push(name);
58
+ this.depths.push(depth);
59
+ this.sizes.push(size);
60
+ }
61
+ }
62
+
63
+ /**
64
+ * A parsed and bound source file, with the inputs it was parsed from and what the parse thread's
65
+ * FileLoader found loading it (its references and their resolutions), which the program's
66
+ * FileLoader takes instead of resolving them again.
67
+ */
68
+ export class PreparedFile {
69
+ loaded: LoadedFile | undefined = undefined;
70
+
71
+ constructor(
72
+ readonly fileName: string,
73
+ readonly path: string,
74
+ readonly jsx: boolean,
75
+ readonly force: boolean,
76
+ readonly file: SourceFile,
77
+ /** The build info version of `file` (`computeHash` of its text) for an incremental program, or `''`. */
78
+ readonly version: string,
79
+ ) {}
80
+ }
81
+
82
+ /** The version a parse thread computed for `file` (`PreparedFile.version`), or `''`. */
83
+ export function preparedVersion(file: SourceFile): string {
84
+ if (parallelParse.files.size === 0) return '';
85
+ const prepared = parallelParse.files.get(file.fileName);
86
+ return prepared !== undefined && prepared.file === file ? prepared.version : '';
87
+ }
88
+
89
+ /** What a parse thread's FileLoader found loading `fileName`, if the thread prepared it. */
90
+ export function preparedLoad(fileName: string): LoadedFile | undefined {
91
+ if (parallelParse.files.size === 0) return undefined;
92
+ return parallelParse.files.get(fileName)?.loaded;
93
+ }
94
+
95
+ /** What a parse thread sends back for a chunk: its bound files and the files they add. */
96
+ export class PreparedBatch {
97
+ constructor(
98
+ readonly files: PreparedFile[],
99
+ readonly added: LoadJobs,
100
+ readonly parseMs: number,
101
+ /** The `package.json` lookups the thread's module resolution made loading the chunk. */
102
+ readonly packageJsons: PackageJsonLookups,
103
+ ) {}
104
+ }
105
+
106
+ /**
107
+ * `package.json` lookups: per lookup, the directory searched and whether the file exists
108
+ * (`PackageJsonLookup`).
109
+ */
110
+ export class PackageJsonLookups {
111
+ readonly directories: string[] = [];
112
+ readonly exists: boolean[] = [];
113
+ readonly directoryExists: boolean[] = [];
114
+ }
115
+
116
+ /**
117
+ * What the main thread posts a parse thread: a chunk of files to load, or `stop`. A plain object:
118
+ * posting copies it.
119
+ */
120
+ export type LoadMessage = {
121
+ readonly stop: boolean;
122
+ readonly kinds: number[];
123
+ readonly names: string[];
124
+ readonly depths: number[];
125
+ };
126
+
127
+ /**
128
+ * Starts a parse thread (main.ts owns the worker entry point). It reads the config `configFileName`
129
+ * (`''` for none) with the command line of this run, takes ids from `counter`, and loads the chunks
130
+ * posted to it (`LoadMessage`) until it is told to stop.
131
+ */
132
+ export type ParserSpawn = (configFileName: string, counter: SharedArrayBuffer, index: number) => Worker;
133
+
134
+ export class ParallelParse {
135
+ /** Set where parse threads can be started and share what they parse (scriptc builds). */
136
+ spawn: ParserSpawn | undefined = undefined;
137
+ /** Prepared files by file name, taken by the FileLoader. */
138
+ readonly files = new Map<string, PreparedFile>();
139
+ /** Files the FileLoader took, found with other parse inputs, and did not find. */
140
+ used = 0;
141
+ missed = 0;
142
+ unprepared = 0;
143
+ /** The names of the prepared files the FileLoader took. */
144
+ readonly taken = new Set<string>();
145
+ /** The `package.json` lookups of the parse threads' module resolution, of all prepared files. */
146
+ packageJsons: PackageJsonLookup[] = [];
147
+ }
148
+
149
+ export const parallelParse = new ParallelParse();
150
+
151
+ /**
152
+ * Drops the prepared files once a program took what it needed. In a build, the next project's
153
+ * program must not take another project's files, which were loaded with that project's options.
154
+ */
155
+ export function clearPreparedFiles(): void {
156
+ parallelParse.files.clear();
157
+ parallelParse.used = 0;
158
+ parallelParse.missed = 0;
159
+ parallelParse.unprepared = 0;
160
+ parallelParse.taken.clear();
161
+ // A new list: a program shared with checker threads holds the old one (`preparedPackageJsonLookups`).
162
+ parallelParse.packageJsons = [];
163
+ }
164
+
165
+ /**
166
+ * The parse threads' `package.json` lookups, where they are the lookups the program's own module
167
+ * resolution would make: the program's FileLoader took every prepared file and the resolutions found
168
+ * loading it, also of files it then makes redirects to another copy of the same package version,
169
+ * whose imports its own load resolves all the same. A thread's resolution caches lookups, so the
170
+ * lookups of a file another file's resolution made first are among that file's: without every
171
+ * prepared file, some may be missing.
172
+ */
173
+ export function preparedPackageJsonLookups(): PackageJsonLookup[] | undefined {
174
+ if (parallelParse.missed > 0) return undefined;
175
+ for (const fileName of parallelParse.files.keys()) if (!parallelParse.taken.has(fileName)) return undefined;
176
+ return parallelParse.packageJsons;
177
+ }
178
+
179
+ /**
180
+ * The FileLoader's lookup: the prepared file for these parse inputs, or `undefined`. With `text`, the text the
181
+ * program reads for the file, a prepared file of other text is not taken (a host that serves the file itself).
182
+ */
183
+ export function takePreparedFile(
184
+ fileName: string,
185
+ path: string,
186
+ options: ExternalModuleIndicatorOptions,
187
+ text?: string,
188
+ ): SourceFile | undefined {
189
+ if (parallelParse.files.size === 0) return undefined;
190
+ const prepared = parallelParse.files.get(fileName);
191
+ if (prepared === undefined) {
192
+ parallelParse.unprepared++;
193
+ return undefined;
194
+ }
195
+ if (
196
+ prepared.path !== path ||
197
+ prepared.jsx !== options.jsx ||
198
+ prepared.force !== options.force ||
199
+ (text !== undefined && prepared.file.text !== text)
200
+ ) {
201
+ parallelParse.missed++;
202
+ return undefined;
203
+ }
204
+ parallelParse.used++;
205
+ parallelParse.taken.add(fileName);
206
+ return prepared.file;
207
+ }
208
+
209
+ /** The size of the file `fileName` in bytes, or 0. */
210
+ export function fileSize(fileName: string): number {
211
+ try {
212
+ return statSync(fileName).size;
213
+ } catch {
214
+ return 0;
215
+ }
216
+ }
217
+
218
+ /** Files per chunk at most: small enough that the files a chunk adds are queued again soon. */
219
+ const maxChunk = 16;
220
+
221
+ /** Files from this size (bytes) on take a parse thread 25 ms or more, and go out ahead of others. */
222
+ const largeFile = 256 * 1024;
223
+
224
+ /**
225
+ * The files to hand out to parse threads, each queued once. Library files go out first, one per
226
+ * chunk, also those found later through `/// <reference lib>`: a large one (`lib.dom.d.ts`) takes a
227
+ * thread 100–150 ms, and queued behind other files it would be the last file the program waits for.
228
+ * Then, for the same reason, large files, one per chunk: root files (TypeScript's 3 MB `checker.ts`,
229
+ * which in a chunk of root files kept one thread busy after the others were done) and the files the
230
+ * parse threads found (`csstype`'s 0.9 MB of declarations, found through React's). The other files go
231
+ * out in program order, in chunks of up to `maxChunk`.
232
+ */
233
+ export class ParseQueue {
234
+ private readonly libraries = new LoadJobs();
235
+ private readonly large = new LoadJobs();
236
+ private readonly others = new LoadJobs();
237
+ private libraryHead = 0;
238
+ private largeHead = 0;
239
+ private head = 0;
240
+ private readonly seen = new Set<string>();
241
+ /** Files not to load ahead: the program has them already (`ParseSession`'s `skip`). */
242
+ skip: ((kind: LoadKind, name: string) => boolean) | undefined = undefined;
243
+
244
+ /** Queues a file; the size of a root file, which the threads haven't seen, is read here. */
245
+ push(kind: LoadKind, name: string, depth: number, size = 0): void {
246
+ const key = kind === LoadKind.Library ? 'lib:' + name : kind === LoadKind.AutomaticTypes ? 'types:' : name;
247
+ if (this.seen.has(key)) return;
248
+ this.seen.add(key);
249
+ if (this.skip !== undefined && this.skip(kind, name)) return;
250
+ if (kind === LoadKind.Root) size = fileSize(name);
251
+ const jobs =
252
+ kind === LoadKind.Library
253
+ ? this.libraries
254
+ : (kind === LoadKind.File || kind === LoadKind.Root) && size >= largeFile
255
+ ? this.large
256
+ : this.others;
257
+ jobs.push(kind, name, depth, size);
258
+ }
259
+
260
+ /** Files queued so far. */
261
+ queued(): number {
262
+ return this.seen.size;
263
+ }
264
+
265
+ /** Files not handed out yet. */
266
+ left(): number {
267
+ return (
268
+ this.libraries.names.length -
269
+ this.libraryHead +
270
+ this.large.names.length -
271
+ this.largeHead +
272
+ this.others.names.length -
273
+ this.head
274
+ );
275
+ }
276
+
277
+ /**
278
+ * The next chunk for one of `threads` parse threads, or `undefined` when nothing is left. With
279
+ * `full`, other files only go out `maxChunk` at a time, and stay queued until there are as many.
280
+ */
281
+ next(threads: number, full = false): LoadMessage | undefined {
282
+ const libraries = this.libraries;
283
+ if (this.libraryHead < libraries.names.length) {
284
+ const k = this.libraryHead++;
285
+ return {
286
+ stop: false,
287
+ kinds: [libraries.kinds[k]!],
288
+ names: [libraries.names[k]!],
289
+ depths: [libraries.depths[k]!],
290
+ };
291
+ }
292
+ const large = this.large;
293
+ if (this.largeHead < large.names.length) {
294
+ const k = this.largeHead++;
295
+ return {
296
+ stop: false,
297
+ kinds: [large.kinds[k]!],
298
+ names: [large.names[k]!],
299
+ depths: [large.depths[k]!],
300
+ };
301
+ }
302
+ const queue = this.others;
303
+ const left = queue.names.length - this.head;
304
+ if (left <= 0 || (full && left < maxChunk)) return undefined;
305
+ const size = full ? maxChunk : Math.min(maxChunk, Math.max(1, Math.floor(left / threads)));
306
+ const start = this.head;
307
+ const end = start + size;
308
+ this.head = end;
309
+ return {
310
+ stop: false,
311
+ kinds: queue.kinds.slice(start, end),
312
+ names: queue.names.slice(start, end),
313
+ depths: queue.depths.slice(start, end),
314
+ };
315
+ }
316
+ }
317
+
318
+ /**
319
+ * Chunks a parse thread may have queued while the main thread matches the config's `include`
320
+ * patterns: the main thread cannot hand out chunks as threads finish them then, so it queues them on
321
+ * the threads ahead, up to about 80 ms of parsing per thread at 16 files per chunk (TypeORM's 3,276
322
+ * root files take the main thread 35-45 ms to match).
323
+ */
324
+ const maxQueuedWhileMatching = 12;
325
+
326
+ /**
327
+ * Chunks a parse thread may have queued while the main thread reads an incremental program's build
328
+ * info (`queueAhead`), which takes it about 20 ms per MB (270 ms for VS Code's 13.7 MB).
329
+ */
330
+ const maxQueuedAhead = 48;
331
+
332
+ /** Libraries that take a parse thread 50 ms or more: nothing is queued behind them. */
333
+ export const largeLibraries = new Set(['lib.dom.d.ts', 'lib.webworker.d.ts']);
334
+
335
+ /**
336
+ * Main thread: loads the program's files ahead of it on parse threads. Started with the compiler
337
+ * options, before the config's root files are known (`ParseSession.start` takes them), so that the
338
+ * threads load the libraries, the automatic type directives and the root files the `include`
339
+ * patterns match (`hint`) while the main thread is still matching them.
340
+ */
341
+ export class ParseSession {
342
+ private readonly startTime = performance.now();
343
+ private readonly trace = process.env.TSC_TS_CHECKERS_TRACE !== undefined;
344
+ private readonly verbose = process.env.TSC_TS_CHECKERS_TRACE === '3';
345
+ private readonly queue = new ParseQueue();
346
+ private readonly workers: Worker[] = [];
347
+ /** Chunks posted to each thread and not yet returned. */
348
+ private readonly outstanding: number[] = [];
349
+ /** Whether a thread has a large library to load (`largeLibraries`). */
350
+ private readonly blocked: boolean[] = [];
351
+ private readonly alive: boolean[] = [];
352
+ /** Parse threads with no chunk; `busy` counts the chunks out on threads. */
353
+ private readonly idle: number[] = [];
354
+ private busy = 0;
355
+ private chunks = 0;
356
+ private finished = false;
357
+ /** Until `start`: root files are still being matched, and more may come. */
358
+ private matching = true;
359
+ private done: (() => void) | undefined = undefined;
360
+ /**
361
+ * Main-thread work done a little at a time while the threads load files: called with each batch
362
+ * a thread returns, once its files are available and the next chunk is out.
363
+ */
364
+ onIdle: ((batch: PreparedBatch) => void) | undefined = undefined;
365
+
366
+ /**
367
+ * Starts `count` parse threads for a program with `options`, with or without root files
368
+ * (`hasRootFiles`; `true` when not known yet). They read the config `configFileName` (`''` for none).
369
+ * They don't load the files `skip` names (a library's name, or another file's normalized name),
370
+ * which the program gets elsewhere; nor the files only those add.
371
+ */
372
+ constructor(
373
+ private readonly count: number,
374
+ options: CompilerOptions,
375
+ private readonly currentDirectory: string,
376
+ configFileName: string,
377
+ hasRootFiles: boolean,
378
+ skip?: (kind: LoadKind, name: string) => boolean,
379
+ ) {
380
+ mark(`parse start, ${count} threads`);
381
+ // Prepared files are published (immutable): this thread keeps lazily parsed JSDoc, and the text
382
+ // caches of declaration files, in tables.
383
+ useLazyJSDocTable();
384
+ useThreadTextCaches();
385
+ const queue = this.queue;
386
+ queue.skip = skip;
387
+ if (hasRootFiles) {
388
+ if (options.noLib !== true) {
389
+ const lib = options.lib;
390
+ const libraries: string[] = [];
391
+ if (lib === undefined) {
392
+ const fileName = getDefaultLibFileName(options);
393
+ // The default libraries of the targets reference `dom` (`lib.d.ts`, `lib.es2022.full.d.ts`):
394
+ // it goes out with them rather than once they are parsed. Unless a library references it,
395
+ // the program leaves it out.
396
+ if (options.libReplacement !== true && (fileName === 'lib.d.ts' || fileName.endsWith('.full.d.ts')))
397
+ libraries.push('lib.dom.d.ts');
398
+ libraries.push(fileName);
399
+ } else
400
+ for (const name of lib) {
401
+ const fileName = getLibFileName(name);
402
+ if (fileName !== '') libraries.push(fileName);
403
+ }
404
+ // Large libraries first: the program waits for them.
405
+ for (const fileName of libraries) if (largeLibraries.has(fileName)) queue.push(LoadKind.Library, fileName, 0);
406
+ for (const fileName of libraries) if (!largeLibraries.has(fileName)) queue.push(LoadKind.Library, fileName, 0);
407
+ }
408
+ queue.push(LoadKind.AutomaticTypes, '', 0);
409
+ }
410
+
411
+ const counter = new SharedArrayBuffer(8);
412
+ const ids = new Int32Array(counter);
413
+ ids[0] = lastNodeIdValue();
414
+ ids[1] = lastSymbolIdValue();
415
+ shareNodeIds(new Int32Array(counter, 0, 1));
416
+ shareSymbolIds(new Int32Array(counter, 4, 1));
417
+
418
+ for (let i = 0; i < count; i++) {
419
+ const worker = parallelParse.spawn!(configFileName, counter, i);
420
+ this.workers.push(worker);
421
+ this.alive.push(true);
422
+ this.outstanding.push(0);
423
+ this.blocked.push(false);
424
+ this.idle.push(i);
425
+ worker.on('message', (message: unknown) =>
426
+ this.received(i, publish((message as { batch: PreparedBatch }).batch)),
427
+ );
428
+ worker.on('error', (error: unknown) => {
429
+ // The files of its chunks are parsed by the program's FileLoader.
430
+ if (this.trace) process.stderr.write(`parsers: thread ${i} failed: ${String(error)}\n`);
431
+ this.alive[i] = false;
432
+ const waiting = this.idle.indexOf(i);
433
+ if (waiting >= 0) this.idle.splice(waiting, 1);
434
+ this.busy -= this.outstanding[i]!;
435
+ this.outstanding[i] = 0;
436
+ if (!this.finished) this.dispatch();
437
+ });
438
+ // The first threads to start get the first chunks: the libraries, largest first.
439
+ const chunk = queue.next(count, true);
440
+ if (chunk !== undefined) this.post(this.idle.pop()!, chunk);
441
+ }
442
+ mark('parse threads spawned');
443
+ this.dispatch();
444
+ }
445
+
446
+ /** A root file the config's `include` patterns matched, while they are still being matched. */
447
+ hint(fileName: string): void {
448
+ this.queue.push(LoadKind.Root, getNormalizedAbsolutePath(fileName, this.currentDirectory), 0);
449
+ this.dispatch();
450
+ }
451
+
452
+ /** Queues the program's root files, and calls `done` once every prepared file is available. */
453
+ start(rootNames: readonly string[], done: () => void): void {
454
+ for (const name of rootNames)
455
+ this.queue.push(LoadKind.Root, getNormalizedAbsolutePath(name, this.currentDirectory), 0);
456
+ this.matching = false;
457
+ this.done = done;
458
+ if (this.trace && this.chunks > 0)
459
+ process.stderr.write(`parsers: ${this.chunks} chunks out while the config was read\n`);
460
+ mark(`root files queued, ${this.chunks} chunks out`);
461
+ this.dispatch();
462
+ }
463
+
464
+ private received(i: number, batch: PreparedBatch): void {
465
+ const queue = this.queue;
466
+ if (timeline) mark(`chunk from p${i}: ${batch.files.length} files, ${queue.left()} left, ${this.busy - 1} busy`);
467
+ for (const prepared of batch.files) parallelParse.files.set(prepared.fileName, prepared);
468
+ const lookups = batch.packageJsons;
469
+ for (let k = 0; k < lookups.directories.length; k++)
470
+ parallelParse.packageJsons.push(
471
+ new PackageJsonLookup(lookups.directories[k]!, lookups.exists[k]!, lookups.directoryExists[k]!),
472
+ );
473
+ const added = batch.added;
474
+ for (let k = 0; k < added.names.length; k++)
475
+ queue.push(added.kinds[k]!, added.names[k]!, added.depths[k]!, added.sizes[k]!);
476
+ if (this.verbose)
477
+ process.stderr.write(
478
+ `parsers: thread ${i} loaded ${batch.files.length} files in ${batch.parseMs.toFixed(1)}ms, at ${(performance.now() - this.startTime).toFixed(1)}ms\n`,
479
+ );
480
+ this.busy--;
481
+ const outstanding = this.outstanding[i]! - 1;
482
+ this.outstanding[i] = outstanding;
483
+ if (outstanding === 0) {
484
+ this.blocked[i] = false;
485
+ this.idle.push(i);
486
+ }
487
+ this.dispatch();
488
+ if (!this.finished && this.onIdle !== undefined) this.onIdle(batch);
489
+ }
490
+
491
+ private post(i: number, chunk: LoadMessage): void {
492
+ this.workers[i]!.postMessage(chunk);
493
+ this.outstanding[i] = this.outstanding[i]! + 1;
494
+ if (chunk.kinds[0] === LoadKind.Library && largeLibraries.has(chunk.names[0]!)) this.blocked[i] = true;
495
+ this.busy++;
496
+ this.chunks++;
497
+ }
498
+
499
+ private dispatch(): void {
500
+ const queue = this.queue;
501
+ // While root files are matched, only full chunks of other files go out, so that a few matched
502
+ // files do not go out alone.
503
+ const full = this.matching;
504
+ while (this.idle.length > 0) {
505
+ const chunk = queue.next(this.count, full);
506
+ if (chunk === undefined) break;
507
+ this.post(this.idle.pop()!, chunk);
508
+ }
509
+ if (this.matching) {
510
+ // Queue more on threads, except behind a large library: none of them returns a chunk before the
511
+ // config is read.
512
+ this.queueOnThreads(maxQueuedWhileMatching);
513
+ return;
514
+ }
515
+ // Every thread is idle (or failed) and nothing is left to hand out: what is not prepared now is
516
+ // parsed by the program's FileLoader.
517
+ if (this.busy === 0 && !this.finished) this.finish();
518
+ }
519
+
520
+ /**
521
+ * Queues the full chunks left on the threads, up to `max` chunks each, the least loaded first. A thread
522
+ * with chunks queued doesn't wait for the main thread to hand it the next one.
523
+ */
524
+ private queueOnThreads(max: number): void {
525
+ for (;;) {
526
+ let target = -1;
527
+ for (let i = 0; i < this.count; i++) {
528
+ if (!this.alive[i]! || this.blocked[i]! || this.outstanding[i]! >= max) continue;
529
+ if (target < 0 || this.outstanding[i]! < this.outstanding[target]!) target = i;
530
+ }
531
+ if (target < 0) break;
532
+ const chunk = this.queue.next(this.count, true);
533
+ if (chunk === undefined) break;
534
+ this.post(target, chunk);
535
+ }
536
+ }
537
+
538
+ /**
539
+ * Queues chunks on the threads before the main thread reads an incremental program's build info:
540
+ * it hands out no chunks while it reads, and the threads would wait once they finish the one each has.
541
+ */
542
+ queueAhead(): void {
543
+ if (!this.finished) this.queueOnThreads(maxQueuedAhead);
544
+ }
545
+
546
+ private finish(): void {
547
+ this.finished = true;
548
+ const stop: LoadMessage = { stop: true, kinds: [], names: [], depths: [] };
549
+ for (let i = 0; i < this.workers.length; i++) if (this.alive[i]!) this.workers[i]!.postMessage(stop);
550
+ // Each thread's listeners hold this session. Without its references to the threads, the session
551
+ // and the loader its `onIdle` holds are freed when the threads exit, instead of staying as a
552
+ // cycle until a full cycle collection on the main thread finds it.
553
+ this.workers.length = 0;
554
+ shareNodeIds(undefined);
555
+ shareSymbolIds(undefined);
556
+ mark(`parse done, ${parallelParse.files.size} files, ${this.chunks} chunks`);
557
+ if (this.trace)
558
+ process.stderr.write(
559
+ `parsers: ${parallelParse.files.size} files prepared in ${(performance.now() - this.startTime).toFixed(1)}ms (${this.chunks} chunks, ${this.queue.queued()} queued, ${this.queue.left()} left)\n`,
560
+ );
561
+ this.done!();
562
+ }
563
+ }
564
+
565
+ /**
566
+ * Main thread: loads the program's files ahead of it on `count` parse threads, and calls `done` once
567
+ * every prepared file is available to the FileLoader.
568
+ */
569
+ export function startParallelParse(
570
+ count: number,
571
+ rootNames: readonly string[],
572
+ options: CompilerOptions,
573
+ currentDirectory: string,
574
+ configFileName: string,
575
+ done: () => void,
576
+ ): void {
577
+ new ParseSession(count, options, currentDirectory, configFileName, rootNames.length > 0).start(rootNames, done);
578
+ }
579
+
580
+ /** With TSC_TS_CHECKERS_TRACE: how many prepared files the program took, and how many it parsed. */
581
+ export function reportPreparedFiles(fileNames: readonly string[]): void {
582
+ const trace = process.env.TSC_TS_CHECKERS_TRACE;
583
+ if (trace === undefined || parallelParse.files.size === 0) return;
584
+ process.stderr.write(
585
+ `parsers: program took ${parallelParse.used} prepared files, ${parallelParse.missed} mismatched, ${parallelParse.missed + parallelParse.unprepared} parsed on the main thread, ${parallelParse.files.size - parallelParse.taken.size} prepared but not taken (${fileNames.length} files)\n`,
586
+ );
587
+ if (trace === '2')
588
+ for (const fileName of fileNames)
589
+ if (!parallelParse.files.has(fileName)) process.stderr.write(` not prepared: ${fileName}\n`);
590
+ }