tsc-ts 0.0.4 → 0.0.6

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 +34 -2
  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 +2351 -0
  5. package/dist/api/compiler/ast.js +11212 -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 +1241 -0
  10. package/dist/api/compiler/binder.d.ts +33 -0
  11. package/dist/api/compiler/binder.js +2359 -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 +1641 -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 +357 -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 +788 -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 +314 -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 +291 -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 +580 -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 +2587 -0
  54. package/dist/api/compiler/checker-heritage.d.ts +28 -0
  55. package/dist/api/compiler/checker-heritage.js +901 -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 +442 -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 +200 -0
  69. package/dist/api/compiler/checker-members.js +2148 -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 +483 -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 +271 -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 +789 -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 +51 -0
  93. package/dist/api/compiler/checker-symbol-types.js +955 -0
  94. package/dist/api/compiler/checker-symbols.d.ts +181 -0
  95. package/dist/api/compiler/checker-symbols.js +1784 -0
  96. package/dist/api/compiler/checker-type-factory.d.ts +142 -0
  97. package/dist/api/compiler/checker-type-factory.js +2542 -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 +1093 -0
  103. package/dist/api/compiler/checker-types.js +1874 -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 +512 -0
  109. package/dist/api/compiler/checker.js +932 -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 +161 -0
  119. package/dist/api/compiler/diagnostics.js +784 -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 +144 -0
  123. package/dist/api/compiler/file-include.js +599 -0
  124. package/dist/api/compiler/file-loader.d.ts +290 -0
  125. package/dist/api/compiler/file-loader.js +1323 -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 +835 -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 +105 -0
  135. package/dist/api/compiler/link-tables.js +319 -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 +745 -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 +221 -0
  191. package/dist/api/compiler/parallel-parse.js +541 -0
  192. package/dist/api/compiler/parser.d.ts +604 -0
  193. package/dist/api/compiler/parser.js +6426 -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 +157 -0
  203. package/dist/api/compiler/printer/emit-context.js +582 -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 +529 -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 +1019 -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 +991 -0
  244. package/dist/api/compiler/symbol.d.ts +282 -0
  245. package/dist/api/compiler/symbol.js +339 -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 +677 -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 +539 -0
  268. package/dist/api/compiler/transformers/declarations-pseudo.d.ts +160 -0
  269. package/dist/api/compiler/transformers/declarations-pseudo.js +799 -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 +198 -0
  276. package/dist/api/compiler/transformers/declarations.d.ts +175 -0
  277. package/dist/api/compiler/transformers/declarations.js +2381 -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 +129 -0
  321. package/dist/api/compiler/transformers/reference-resolver.js +1157 -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 +10 -0
  325. package/dist/api/compiler/transformers/subtree-facts.js +205 -0
  326. package/dist/api/compiler/transformers/syntax-facts.d.ts +52 -0
  327. package/dist/api/compiler/transformers/syntax-facts.js +258 -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 +12870 -0
  382. package/src/compiler/astnav.ts +799 -0
  383. package/src/compiler/binder-utilities.ts +1392 -0
  384. package/src/compiler/binder.ts +2707 -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 +1201 -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 +355 -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 +3596 -0
  407. package/src/compiler/checker-heritage.ts +1240 -0
  408. package/src/compiler/checker-inference.ts +2584 -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 +1928 -0
  413. package/src/compiler/checker-literals.ts +61 -0
  414. package/src/compiler/checker-members.ts +2480 -0
  415. package/src/compiler/checker-modules.ts +2896 -0
  416. package/src/compiler/checker-narrowing.ts +3230 -0
  417. package/src/compiler/checker-object-literals.ts +591 -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 +1187 -0
  427. package/src/compiler/checker-symbols.ts +2157 -0
  428. package/src/compiler/checker-type-factory.ts +2616 -0
  429. package/src/compiler/checker-type-nodes.ts +1033 -0
  430. package/src/compiler/checker-type-operators.ts +2510 -0
  431. package/src/compiler/checker-types.ts +2520 -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 +1138 -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 +858 -0
  441. package/src/compiler/emitter.ts +434 -0
  442. package/src/compiler/encoder.ts +1945 -0
  443. package/src/compiler/file-include.ts +741 -0
  444. package/src/compiler/file-loader.ts +1597 -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 +2818 -0
  449. package/src/compiler/init.ts +141 -0
  450. package/src/compiler/instantiation.ts +938 -0
  451. package/src/compiler/jsdoc.ts +1386 -0
  452. package/src/compiler/link-tables.ts +343 -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 +1071 -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 +3433 -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 +1954 -0
  481. package/src/compiler/parallel-parse.ts +595 -0
  482. package/src/compiler/parse-thread.ts +136 -0
  483. package/src/compiler/parser.ts +7766 -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 +684 -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 +594 -0
  498. package/src/compiler/program-utilities.ts +435 -0
  499. package/src/compiler/program.ts +1426 -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 +1166 -0
  510. package/src/compiler/symbol.ts +557 -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 +833 -0
  523. package/src/compiler/transformers/declarations-pseudo.ts +969 -0
  524. package/src/compiler/transformers/declarations-resolver.ts +249 -0
  525. package/src/compiler/transformers/declarations-syntactic.ts +1867 -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 +1213 -0
  550. package/src/compiler/transformers/runtime-syntax.ts +942 -0
  551. package/src/compiler/transformers/subtree-facts.ts +253 -0
  552. package/src/compiler/transformers/syntax-facts.ts +358 -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 +1422 -0
  562. package/src/compiler/tsc-cli.ts +669 -0
  563. package/src/compiler/tsc-compile.ts +446 -0
  564. package/src/compiler/tsc-watch.ts +922 -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,922 @@
1
+ /**
2
+ * `tsc --watch` and `tsc --build --watch`: rebuild when inputs change. Changes are found by comparing
3
+ * the time stamps of the files a build read and of the directories that may gain files, when their
4
+ * directories report an event, or by polling where directories can't be watched.
5
+ */
6
+ import type { ParsedBuildCommandLine, ParsedCommandLine as CommandLine } from './command-line.js';
7
+ import { CheckedProgram, CompileTimes, ProgramEmitter } from './compile-program.js';
8
+ import {
9
+ type Diagnostic,
10
+ type DiagnosticMessage,
11
+ Diagnostics,
12
+ type Locale,
13
+ localizeMessage,
14
+ type MessageWithArgs,
15
+ } from './diagnostics.js';
16
+ import { type ExternalModuleIndicatorOptions, ParseOptions, ScriptKind, type SourceFile } from './ast.js';
17
+ import { CompilerHost, FileLoader, releaseLater } from './file-loader.js';
18
+ import { CachedFileSystem } from './file-system.js';
19
+ import { clearLibGlobalsCache } from './checker-symbols.js';
20
+ import { forgetLazyJSDocFile, parseSourceFile } from './parser.js';
21
+ import { forgetNavigationFile } from './astnav.js';
22
+ import { forgetRangeScannerFile } from './binder-utilities.js';
23
+ import { forgetIdentifierSets } from './printer/name-generator.js';
24
+ import {
25
+ computeLastSignatures,
26
+ declarationSignature,
27
+ FileBuildInfoReader,
28
+ IncrementalProgram,
29
+ readBuildInfoProgram,
30
+ type Snapshot,
31
+ } from './incremental.js';
32
+ import { combinePaths, getDirectoryPath, getNormalizedAbsolutePath, toPath } from './path.js';
33
+ import { Program } from './program.js';
34
+ import { ConfigParser, ParsedCommandLine } from './tsconfig.js';
35
+ import {
36
+ DiagnosticReporter,
37
+ type DirectoryWatch,
38
+ ErrorSummaryReporter,
39
+ outputLocale,
40
+ rootFilesPerChunk,
41
+ type System,
42
+ SystemFileSystem,
43
+ } from './tsc-cli.js';
44
+ import { isIncremental } from './options.js';
45
+ import { ParseSession, clearPreparedFiles, parallelParse, takePreparedFile } from './parallel-parse.js';
46
+ import { checkerThreads, parseThreads, shareWithCheckers, startParallelCheck } from './parallel-check.js';
47
+ import { assignSymbolIdsAtCreation, symbolIdsAtCreation } from './symbol.js';
48
+ import { Orchestrator, StatusReporter, startWatchRebuild } from './tsc-build.js';
49
+ import { mark } from './timeline.js';
50
+ import { emitFilesAndReportErrors, rechecksOnThreads, SystemTimeStamps, SystemWriter } from './tsc-compile.js';
51
+
52
+ /** How often inputs are polled, in milliseconds, where their directories can't be watched. */
53
+ const pollInterval = 250;
54
+
55
+ /**
56
+ * Directory events are batched as tsgo's file watching batches them: the first event after
57
+ * `quietTime` milliseconds without a check is checked at once, and later ones once no other event came
58
+ * for `settleTime` milliseconds.
59
+ */
60
+ const settleTime = 50;
61
+ const quietTime = 500;
62
+
63
+ /**
64
+ * Natively, ProgramLifetime objects (syntax trees, symbols, types, signatures, links) are never freed,
65
+ * so each rebuild keeps what its checkers allocated. The driver runs watch mode in a child process and
66
+ * sets `restart` (node-system.ts): a rebuild that would start with more resident memory than `limit`
67
+ * calls it instead of building, and the driver starts a new process, which builds with the changed
68
+ * files and reports the change as this process would have.
69
+ */
70
+ export class WatchRestart {
71
+ /** Whether this process continues the watch of one that restarted: its first build reports a change. */
72
+ resumed = false;
73
+ /** The resident bytes above which a rebuild restarts; 0 to take `firstBuildFactor` times the first build's. */
74
+ limit = 0;
75
+ restart: (() => void) | undefined = undefined;
76
+
77
+ /** Sets `limit` from the resident memory after the first build, unless it is set. */
78
+ firstBuildDone(): void {
79
+ if (this.restart !== undefined && this.limit === 0) this.limit = residentMemory() * firstBuildFactor;
80
+ }
81
+
82
+ /** Restarts the process if a rebuild would start above `limit`; returns whether it did. */
83
+ restartsBeforeRebuild(): boolean {
84
+ const restart = this.restart;
85
+ if (restart === undefined || this.limit <= 0 || residentMemory() <= this.limit) return false;
86
+ restart();
87
+ return true;
88
+ }
89
+ }
90
+
91
+ /** The process's resident memory in bytes, as Node.js reads it on each platform; 0 if it can't be read. */
92
+ function residentMemory(): number {
93
+ try {
94
+ return process.memoryUsage.rss();
95
+ } catch {
96
+ return 0;
97
+ }
98
+ }
99
+
100
+ /** The default restart limit, as a multiple of the resident memory after the first build. */
101
+ const firstBuildFactor = 2.5;
102
+
103
+ export const watchRestart = new WatchRestart();
104
+
105
+ /** Writes watch status lines, clearing the screen where tsc does. */
106
+ class WatchStatusReporter {
107
+ private readonly status: StatusReporter;
108
+
109
+ constructor(
110
+ private readonly sys: System,
111
+ private readonly clearScreen: boolean,
112
+ pretty: boolean | undefined,
113
+ locale: Locale,
114
+ ) {
115
+ this.status = new StatusReporter(sys, pretty, false, locale);
116
+ }
117
+
118
+ report(message: DiagnosticMessage, ...args: string[]): void {
119
+ if (
120
+ this.clearScreen &&
121
+ (message === Diagnostics.Starting_compilation_in_watch_mode ||
122
+ message === Diagnostics.File_change_detected_Starting_incremental_compilation)
123
+ ) {
124
+ this.sys.write('\x1B[2J\x1B[3J\x1B[H');
125
+ }
126
+ this.status.report(message, ...args);
127
+ }
128
+
129
+ reportErrorCount(count: number): void {
130
+ if (count === 1) this.report(Diagnostics.Found_1_error_Watching_for_file_changes);
131
+ else this.report(Diagnostics.Found_0_errors_Watching_for_file_changes, String(count));
132
+ }
133
+ }
134
+
135
+ /** Time stamps of files and directories, to tell when any changed. */
136
+ class Stamps {
137
+ private readonly times = new Map<string, number | undefined>();
138
+ private readonly directories = new Set<string>();
139
+
140
+ constructor(private readonly sys: System) {}
141
+
142
+ add(path: string): void {
143
+ if (!this.times.has(path)) this.times.set(path, this.sys.getMTime(path));
144
+ }
145
+
146
+ /** A directory and, if `recursive`, the directories below it except `node_modules` and hidden ones. */
147
+ addDirectory(path: string, recursive: boolean, depth = 0): void {
148
+ if (this.times.has(path) || !this.sys.directoryExists(path)) return;
149
+ this.add(path);
150
+ this.directories.add(path);
151
+ if (!recursive || depth > 32) return;
152
+ for (const name of this.sys.getAccessibleEntries(path).directories) {
153
+ if (name === 'node_modules' || name.startsWith('.')) continue;
154
+ this.addDirectory(combinePaths(path, name), true, depth + 1);
155
+ }
156
+ }
157
+
158
+ changed(): boolean {
159
+ for (const [path, time] of this.times) {
160
+ if (this.sys.getMTime(path) !== time) return true;
161
+ }
162
+ return false;
163
+ }
164
+
165
+ /**
166
+ * The files whose time stamps changed, or `undefined` when a watched directory's did: a file was added,
167
+ * removed or renamed there.
168
+ */
169
+ changedFiles(): string[] | undefined {
170
+ const files: string[] = [];
171
+ for (const [path, time] of this.times) {
172
+ if (this.sys.getMTime(path) === time) continue;
173
+ if (this.directories.has(path)) return undefined;
174
+ files.push(path);
175
+ }
176
+ return files;
177
+ }
178
+
179
+ /** Takes the current time stamps of `paths`. */
180
+ refresh(paths: readonly string[]): void {
181
+ for (const path of paths) if (this.times.has(path)) this.times.set(path, this.sys.getMTime(path));
182
+ }
183
+
184
+ /**
185
+ * Adds the directories whose events report changes of these paths: each directory, and each file's,
186
+ * and for a file that is a symbolic link, its target's.
187
+ */
188
+ addWatchedDirectories(directories: Set<string>, links: LinkTargets): void {
189
+ for (const [path, time] of this.times) {
190
+ if (this.directories.has(path)) {
191
+ directories.add(path);
192
+ continue;
193
+ }
194
+ const directory = getDirectoryPath(path);
195
+ directories.add(directory);
196
+ const directoryTime = this.times.has(directory) ? this.times.get(directory) : this.sys.getMTime(directory);
197
+ const target = links.directoryOf(path, time, directoryTime);
198
+ if (target !== undefined) directories.add(target);
199
+ }
200
+ }
201
+ }
202
+
203
+ class LinkTarget {
204
+ constructor(
205
+ readonly time: number | undefined,
206
+ readonly directoryTime: number | undefined,
207
+ readonly directory: string | undefined,
208
+ ) {}
209
+ }
210
+
211
+ /**
212
+ * The directories of the targets of files that are symbolic links, kept while the time stamps of the
213
+ * file and of its directory are the same. Pointing a link elsewhere replaces it, which changes its
214
+ * directory's time stamp even when the new target has the old one's.
215
+ */
216
+ class LinkTargets {
217
+ private readonly targets = new Map<string, LinkTarget>();
218
+
219
+ constructor(private readonly sys: System) {}
220
+
221
+ /** The directory of the target of the file, or undefined if the file isn't a link. */
222
+ directoryOf(path: string, time: number | undefined, directoryTime: number | undefined): string | undefined {
223
+ let target = this.targets.get(path);
224
+ if (target === undefined || target.time !== time || target.directoryTime !== directoryTime) {
225
+ const real = this.sys.realpath(path);
226
+ target = new LinkTarget(time, directoryTime, real !== path ? getDirectoryPath(real) : undefined);
227
+ this.targets.set(path, target);
228
+ }
229
+ return target.directory;
230
+ }
231
+ }
232
+
233
+ /** The directories a config's `include` specs can add files to, and whether recursively. */
234
+ function includeDirectories(config: ParsedCommandLine): { path: string; recursive: boolean }[] {
235
+ const result: { path: string; recursive: boolean }[] = [];
236
+ const specs = config.configFile?.configFileSpecs;
237
+ if (specs === undefined) return result;
238
+ for (const spec of specs.validatedIncludeSpecs) {
239
+ const absolute = getNormalizedAbsolutePath(spec, config.currentDirectory);
240
+ const components = absolute.split('/');
241
+ let base = '';
242
+ let wildcard = false;
243
+ for (let i = 0; i < components.length; i++) {
244
+ const component = components[i];
245
+ if (component.includes('*') || component.includes('?')) {
246
+ wildcard = true;
247
+ break;
248
+ }
249
+ base = i === 0 ? (component === '' ? '/' : component) : combinePaths(base, component);
250
+ }
251
+ result.push({ path: wildcard ? base : getDirectoryPath(absolute), recursive: wildcard });
252
+ }
253
+ return result;
254
+ }
255
+
256
+ /** A copy of `config` with its own lazily computed parts and errors, for a program shared with checker threads. */
257
+ function copyCommandLine(config: ParsedCommandLine): ParsedCommandLine {
258
+ return new ParsedCommandLine(
259
+ config.options,
260
+ config.typeAcquisition,
261
+ config.fileNames,
262
+ config.projectReferences,
263
+ config.configFile,
264
+ config.errors.slice(),
265
+ config.currentDirectory,
266
+ config.useCaseSensitiveFileNames,
267
+ config.literalFileNamesLength,
268
+ );
269
+ }
270
+
271
+ /** The key of a source file in `WatchSourceFiles`: a file parses the same for the same name, path and options. */
272
+ function watchFileKey(fileName: string, path: string, options: ExternalModuleIndicatorOptions): string {
273
+ return fileName + '\u0000' + path + (options.jsx ? '\u0000j' : '\u0000') + (options.force ? 'f' : '');
274
+ }
275
+
276
+ /**
277
+ * The source files of the last build, by name, path and module detection options, for the next build
278
+ * to take where their text is unchanged (`WatchCompilerHost`).
279
+ */
280
+ class WatchSourceFiles {
281
+ readonly current = new Map<string, SourceFile>();
282
+ /** The paths of the files this build parsed rather than took from the last one. */
283
+ readonly parsed: string[] = [];
284
+
285
+ constructor(readonly previous: ReadonlyMap<string, SourceFile> = new Map<string, SourceFile>()) {}
286
+
287
+ /**
288
+ * The files of the next build, which can take these. A new object: a program shared with checker
289
+ * threads holds its host's.
290
+ */
291
+ next(): WatchSourceFiles {
292
+ return new WatchSourceFiles(this.current);
293
+ }
294
+ }
295
+
296
+ /**
297
+ * A compiler host writing `--traceResolution` output to the system, which takes the parsed and bound
298
+ * source file of the last build when a file's text is unchanged, as tsgo's watch reuses the files of
299
+ * its old program. A file parses the same for the same text, name, path and module detection options,
300
+ * and binding a bound file does nothing. Natively, syntax trees and symbols are never freed
301
+ * (ProgramLifetime), so parsing every file again made each rebuild keep another copy of the program.
302
+ */
303
+ class WatchCompilerHost extends CompilerHost {
304
+ constructor(
305
+ private readonly sys: System,
306
+ fs: CachedFileSystem,
307
+ private readonly locale: Locale,
308
+ private readonly files: WatchSourceFiles,
309
+ ) {
310
+ super(fs, sys.currentDirectory, sys.defaultLibraryPath);
311
+ }
312
+
313
+ getSourceFile(
314
+ fileName: string,
315
+ path: string,
316
+ externalModuleIndicatorOptions: ExternalModuleIndicatorOptions,
317
+ ): SourceFile | undefined {
318
+ // A file that parse threads prepared for a first build on threads (`Watcher.buildOnThreads`).
319
+ const prepared = takePreparedFile(fileName, path, externalModuleIndicatorOptions);
320
+ if (prepared !== undefined) return prepared;
321
+ const text = this.fs.readFile(fileName);
322
+ if (text === undefined) return undefined;
323
+ const key = watchFileKey(fileName, path, externalModuleIndicatorOptions);
324
+ let file = this.files.current.get(key);
325
+ if (file !== undefined && file.text === text) return file;
326
+ file = this.files.previous.get(key);
327
+ if (file === undefined || file.text !== text) {
328
+ file = parseSourceFile(
329
+ fileName,
330
+ text,
331
+ new ParseOptions(path, ScriptKind.Unknown, externalModuleIndicatorOptions),
332
+ );
333
+ this.files.parsed.push(path);
334
+ }
335
+ this.files.current.set(key, file);
336
+ return file;
337
+ }
338
+
339
+ trace(message: MessageWithArgs): void {
340
+ this.sys.write(localizeMessage(this.locale, message.message, message.args) + '\n');
341
+ }
342
+ }
343
+
344
+ /** A watched directory, with its time stamp when the watch started. */
345
+ class WatchedDirectory {
346
+ constructor(
347
+ readonly watch: DirectoryWatch,
348
+ readonly time: number,
349
+ ) {}
350
+ }
351
+
352
+ /**
353
+ * Calls `check` when inputs may have changed: on events of the directories of the stamped paths, or
354
+ * every `pollInterval` milliseconds once a directory can't be watched.
355
+ */
356
+ class ChangeWatcher {
357
+ private readonly watches = new Map<string, WatchedDirectory>();
358
+ private readonly links: LinkTargets;
359
+ private polling = false;
360
+ private timer: ReturnType<typeof setTimeout> | undefined = undefined;
361
+ private lastCheck = -quietTime;
362
+
363
+ constructor(
364
+ private readonly sys: System,
365
+ private readonly check: () => void,
366
+ ) {
367
+ this.links = new LinkTargets(sys);
368
+ }
369
+
370
+ /**
371
+ * Watches the directories of the paths of `stamps`, keeping the watches of unchanged directories.
372
+ * A change between the stamps and a new watch has no event, so new watches are followed by a check.
373
+ */
374
+ watch(stamps: Stamps[]): void {
375
+ if (this.polling) return;
376
+ let created = false;
377
+ const directories = new Set<string>();
378
+ for (const s of stamps) s.addWatchedDirectories(directories, this.links);
379
+ // A missing directory is watched through its closest existing ancestor, which reports its creation.
380
+ const existing = new Map<string, number>();
381
+ for (const directory of directories) {
382
+ let path = directory;
383
+ let time = this.sys.getMTime(path);
384
+ while (time === undefined && getDirectoryPath(path) !== path) {
385
+ path = getDirectoryPath(path);
386
+ time = this.sys.getMTime(path);
387
+ }
388
+ if (time !== undefined) existing.set(path, time);
389
+ }
390
+ for (const [path, watched] of this.watches) {
391
+ if (existing.has(path)) continue;
392
+ watched.watch.close();
393
+ this.watches.delete(path);
394
+ }
395
+ for (const [path, time] of existing) {
396
+ const watched = this.watches.get(path);
397
+ if (watched !== undefined) {
398
+ if (watched.time === time) continue;
399
+ // A changed directory may have been removed and created again, which ends the old watch.
400
+ watched.watch.close();
401
+ this.watches.delete(path);
402
+ }
403
+ const watch = this.sys.watchDirectory(path, () => this.changed());
404
+ if (watch === undefined) {
405
+ this.startPolling();
406
+ return;
407
+ }
408
+ this.watches.set(path, new WatchedDirectory(watch, time));
409
+ created = true;
410
+ }
411
+ // Without a watch nothing would keep the process running.
412
+ if (this.watches.size === 0) this.startPolling();
413
+ else if (created) this.changed();
414
+ }
415
+
416
+ private changed(): void {
417
+ if (this.timer !== undefined) clearTimeout(this.timer);
418
+ const wait = performance.now() - this.lastCheck > quietTime ? 0 : settleTime;
419
+ this.timer = setTimeout(() => {
420
+ this.timer = undefined;
421
+ this.lastCheck = performance.now();
422
+ this.check();
423
+ }, wait);
424
+ }
425
+
426
+ private startPolling(): void {
427
+ this.polling = true;
428
+ for (const watched of this.watches.values()) watched.watch.close();
429
+ this.watches.clear();
430
+ setInterval(this.check, pollInterval);
431
+ }
432
+ }
433
+
434
+ class Watcher {
435
+ private snapshot: Snapshot | undefined = undefined;
436
+ private stamps: Stamps;
437
+ private configStamps: Stamps;
438
+ /** Whether the last read of the config file after a change succeeded (`reloadConfig`). */
439
+ private configRead = true;
440
+ private readonly locale: Locale;
441
+ private readonly reporter: DiagnosticReporter;
442
+ private readonly status: WatchStatusReporter;
443
+ private files = new WatchSourceFiles();
444
+ private readonly changes: ChangeWatcher;
445
+ /**
446
+ * The checked program of the last build, until the next build computes the signatures it left as versions
447
+ * (`computeLastSignatures`).
448
+ */
449
+ private lastChecked: CheckedProgram | undefined = undefined;
450
+ /** The program of the last build, which a rebuild updates when only the text of its files changed. */
451
+ private lastProgram: Program | undefined = undefined;
452
+ /** Whether a rebuild is running (`poll`), and whether a check came during it. */
453
+ private building = false;
454
+ private checkPending = false;
455
+
456
+ constructor(
457
+ private readonly sys: System,
458
+ private config: ParsedCommandLine,
459
+ private readonly commandLine: CommandLine,
460
+ ) {
461
+ const options = config.options;
462
+ this.locale = outputLocale(commandLine.options);
463
+ this.reporter = new DiagnosticReporter(sys, commandLine.options, this.locale);
464
+ this.status = new WatchStatusReporter(
465
+ sys,
466
+ options.preserveWatchOutput !== true && options.extendedDiagnostics !== true && options.diagnostics !== true,
467
+ options.pretty,
468
+ this.locale,
469
+ );
470
+ this.stamps = new Stamps(sys);
471
+ this.configStamps = new Stamps(sys);
472
+ this.changes = new ChangeWatcher(sys, () => this.poll());
473
+ }
474
+
475
+ start(): void {
476
+ const sys = this.sys;
477
+ if (this.config.options.incremental === true || this.config.options.composite === true) {
478
+ this.snapshot = readBuildInfoProgram(
479
+ this.config,
480
+ new FileBuildInfoReader(new SystemFileSystem(sys)),
481
+ sys.defaultLibraryPath,
482
+ sys.currentDirectory,
483
+ );
484
+ }
485
+ this.status.report(
486
+ watchRestart.resumed
487
+ ? Diagnostics.File_change_detected_Starting_incremental_compilation
488
+ : Diagnostics.Starting_compilation_in_watch_mode,
489
+ );
490
+ const watchChanges = (): void => {
491
+ watchRestart.firstBuildDone();
492
+ this.changes.watch([this.stamps, this.configStamps]);
493
+ };
494
+ // A program shared with checker threads is never written: symbols get their ids when created.
495
+ const options = this.config.options;
496
+ if (parallelParse.spawn !== undefined && checkerThreads(options.checkers, options.singleThreaded) > 1)
497
+ assignSymbolIdsAtCreation();
498
+ const threads = this.firstBuildThreads();
499
+ if (threads > 1) this.buildOnThreads(threads, watchChanges);
500
+ else this.build(watchChanges);
501
+ }
502
+
503
+ /**
504
+ * The checker threads of the first build: those of a compile (`compileThreads`), or 1 to build on this
505
+ * thread. A first build without old state checks every file, as a compile does; rebuilds check what a
506
+ * change affects (`rebuildThreads`). With build info (`--incremental`), the first build stays here.
507
+ */
508
+ private firstBuildThreads(): number {
509
+ const options = this.config.options;
510
+ if (this.snapshot !== undefined || isIncremental(options) || parallelParse.spawn === undefined) return 1;
511
+ return checkerThreads(options.checkers, options.singleThreaded);
512
+ }
513
+
514
+ /**
515
+ * Builds the first program as a compile does: parse threads load its files, and checker threads check
516
+ * it (parallel-check.ts) unless it checks little. The program is shared with them, so it gets its own
517
+ * copy of the config and a host of its own. Its files go to the watch's file maps for rebuilds to take,
518
+ * and are never written again: rebuilds check them with the checker's side tables. Calls `done` once
519
+ * the build is reported.
520
+ */
521
+ private buildOnThreads(threads: number, done: () => void): void {
522
+ releaseProgramCaches();
523
+ const sys = this.sys;
524
+ const config = copyCommandLine(this.config);
525
+ const options = config.options;
526
+ const session = new ParseSession(
527
+ parseThreads(threads),
528
+ options,
529
+ sys.currentDirectory,
530
+ config.configName,
531
+ config.fileNames.length > 0,
532
+ );
533
+ const host = new WatchCompilerHost(
534
+ sys,
535
+ new CachedFileSystem(new SystemFileSystem(sys)),
536
+ this.locale,
537
+ new WatchSourceFiles(),
538
+ );
539
+ const loader = new FileLoader(host, config);
540
+ let rootFilesAdded = false;
541
+ session.onIdle = (batch) => {
542
+ if (!rootFilesAdded) rootFilesAdded = loader.addRootFiles(rootFilesPerChunk);
543
+ loader.walkAhead(batch.files);
544
+ };
545
+ session.start(config.fileNames, () => {
546
+ const program = new Program(config, host, loader);
547
+ // The session's callbacks keep the loader: its tasks go once checking has started.
548
+ releaseLater(loader);
549
+ this.files = this.files.next();
550
+ for (const file of program.getSourceFiles()) {
551
+ const indicator = file.externalModuleIndicatorOptions;
552
+ this.files.current.set(watchFileKey(file.fileName, file.path, indicator), file);
553
+ }
554
+ const checked = new CheckedProgram(program);
555
+ const finish = (): void => {
556
+ this.finishBuild(checked);
557
+ // Rebuilds parse what changed themselves.
558
+ clearPreparedFiles();
559
+ done();
560
+ };
561
+ const count = checkerThreads(options.checkers, options.singleThreaded, program);
562
+ if (count > 1) startParallelCheck(checked, count, finish);
563
+ else finish();
564
+ });
565
+ }
566
+
567
+ private configFiles(): string[] {
568
+ const configFile = this.config.configFile;
569
+ if (configFile === undefined) return [];
570
+ return [configFile.sourceFile.fileName, ...configFile.extendedSourceFiles];
571
+ }
572
+
573
+ private poll(): void {
574
+ // A build on checker threads lets events through; a check during it runs once the build is reported.
575
+ if (this.building) {
576
+ this.checkPending = true;
577
+ return;
578
+ }
579
+ this.building = true;
580
+ this.rebuildIfChanged(() => {
581
+ this.building = false;
582
+ this.changes.watch([this.stamps, this.configStamps]);
583
+ if (this.checkPending) {
584
+ this.checkPending = false;
585
+ this.poll();
586
+ }
587
+ });
588
+ }
589
+
590
+ /** Rebuilds if inputs changed, then calls `done`. */
591
+ private rebuildIfChanged(done: () => void): void {
592
+ const configChanged = this.configStamps.changed();
593
+ if (!configChanged && !this.stamps.changed()) return done();
594
+ // A changed config is read here, where errors in it keep the last one. A new process would read the
595
+ // config again, so a process whose last read of it failed builds on with the config it has; after a
596
+ // read that succeeded, a config change restarts the process like any other change.
597
+ if (configChanged && !this.reloadConfig()) return done();
598
+ if (this.configRead && watchRestart.restartsBeforeRebuild()) return done();
599
+ this.status.report(Diagnostics.File_change_detected_Starting_incremental_compilation);
600
+ this.build(done, configChanged ? undefined : this.stamps.changedFiles());
601
+ }
602
+
603
+ /** Rereads the config file; false (after reporting) if it can't be used. */
604
+ private reloadConfig(): boolean {
605
+ const configName = this.config.configName;
606
+ if (configName === '') return true;
607
+ const sys = this.sys;
608
+ const errors: Diagnostic[] = [];
609
+ const parser = new ConfigParser(new CachedFileSystem(new SystemFileSystem(sys)), sys.currentDirectory);
610
+ const parsed = parser.parseConfigFile(configName, this.commandLine.options, this.commandLine.raw, errors);
611
+ this.configRead = parsed !== undefined;
612
+ if (parsed === undefined) {
613
+ this.reporter.reportAll(errors);
614
+ this.status.reportErrorCount(errors.length);
615
+ this.configStamps = new Stamps(sys);
616
+ for (const file of this.configFiles()) this.configStamps.add(file);
617
+ return false;
618
+ }
619
+ this.config = parsed;
620
+ return true;
621
+ }
622
+
623
+ /**
624
+ * Builds, on checker threads when the change affects many files, then calls `done`. `changedFiles` are
625
+ * the files whose time stamps changed, when no watched directory's and no config file's did.
626
+ */
627
+ private build(done: () => void, changedFiles?: readonly string[]): void {
628
+ releaseProgramCaches();
629
+ const sys = this.sys;
630
+ const fs = new CachedFileSystem(new SystemFileSystem(sys));
631
+ let program = changedFiles !== undefined ? this.updatedProgram(changedFiles, fs) : undefined;
632
+ if (program === undefined) {
633
+ changedFiles = undefined;
634
+ if (this.config.configName !== '') {
635
+ // Pick up files added to or removed from included directories.
636
+ const parsed = new ConfigParser(fs, sys.currentDirectory).parseConfigFile(
637
+ this.config.configName,
638
+ this.commandLine.options,
639
+ this.commandLine.raw,
640
+ [],
641
+ );
642
+ if (parsed !== undefined) this.config = parsed;
643
+ }
644
+ this.files = this.files.next();
645
+ // A copy: a program shared with checker threads holds its config's errors (`copyCommandLine`).
646
+ program = new Program(copyCommandLine(this.config), new WatchCompilerHost(sys, fs, this.locale, this.files));
647
+ }
648
+ // The signatures the last build left as versions, for the files this one parsed.
649
+ if (this.lastChecked !== undefined && this.snapshot !== undefined)
650
+ computeLastSignatures(this.snapshot, this.lastChecked, this.files.parsed);
651
+ this.lastChecked = undefined;
652
+ const checked = new CheckedProgram(program);
653
+ const signatures = new Map<string, string>();
654
+ const threads = this.rebuildThreads(checked, signatures);
655
+ // A new checker for checker threads: `rebuildThreads` may have emitted declarations with this one.
656
+ if (threads > 1) return this.recheckOnThreads(new CheckedProgram(program), threads, signatures, done, changedFiles);
657
+ this.finishBuild(checked, signatures, changedFiles);
658
+ done();
659
+ }
660
+
661
+ /**
662
+ * The last build's program with `changedFiles` read again (`Program.updateFile`, as tsgo's watch swaps a
663
+ * changed file into its program), or `undefined` when one of them cannot be swapped in and the program
664
+ * must be loaded again. No directory and no config file changed, so the root files are the same. The
665
+ * source files of the updated program are those of the next build (`WatchSourceFiles`), which takes the
666
+ * unchanged ones without reading them.
667
+ */
668
+ private updatedProgram(changedFiles: readonly string[], fs: CachedFileSystem): Program | undefined {
669
+ let program = this.lastProgram;
670
+ if (program === undefined) return undefined;
671
+ const files = this.files.next();
672
+ const host = new WatchCompilerHost(this.sys, fs, this.locale, files);
673
+ for (const fileName of changedFiles) {
674
+ const file = program.getSourceFile(fileName);
675
+ if (file === undefined) return undefined;
676
+ program = program.updateFile(file.path, host);
677
+ if (program === undefined) return undefined;
678
+ }
679
+ for (const file of program.getSourceFiles())
680
+ files.current.set(watchFileKey(file.fileName, file.path, file.externalModuleIndicatorOptions), file);
681
+ this.files = files;
682
+ mark(`program updated, ${changedFiles.length} files`);
683
+ return program;
684
+ }
685
+
686
+ /**
687
+ * The checker threads for a rebuild of `checked`, or 1 to check it on this thread: threads where the
688
+ * change may affect enough files for them (`rechecksOnThreads`), counting each changed file and every
689
+ * file that references it, transitively, in the last build, or every file for a change to a file that
690
+ * affects the global scope. A changed file whose declaration file keeps the signature of the last
691
+ * build affects only itself (`getFilesAffectedBy`); its signature is computed with `checked`'s checker
692
+ * and added to `signatures`. That is what the change affects at most; `recheckOnThreads` then takes
693
+ * what it does affect. A watch whose first config kept it on one thread gave its symbols no ids at
694
+ * creation (`start`), so its rebuilds, which take the unchanged files of earlier builds, stay on this
695
+ * thread after a config edit turns checker threads on.
696
+ */
697
+ private rebuildThreads(checked: CheckedProgram, signatures: Map<string, string>): number {
698
+ const program = checked.program;
699
+ const snapshot = this.snapshot;
700
+ const options = program.options;
701
+ if (snapshot === undefined || parallelParse.spawn === undefined || options.composite === true) return 1;
702
+ if (!symbolIdsAtCreation()) return 1;
703
+ const threads = checkerThreads(options.checkers, options.singleThreaded, program);
704
+ if (threads <= 1) return 1;
705
+ const affected = new Set<string>();
706
+ const queue: string[] = [];
707
+ let emitter: ProgramEmitter | undefined = undefined;
708
+ for (const path of this.files.parsed) {
709
+ const info = snapshot.fileInfos.get(path);
710
+ if (info === undefined || info.affectsGlobalScope) return threads;
711
+ if (affected.has(path)) continue;
712
+ affected.add(path);
713
+ // A signature that is the file's version was never computed from a declaration file.
714
+ const file = program.getSourceFileByPath(path);
715
+ if (file !== undefined && !file.isDeclarationFile && info.signature !== info.version) {
716
+ if (emitter === undefined) {
717
+ // Emit computes the common source directory, which reports files outside `rootDir` unless the
718
+ // file inclusion diagnostics are fixed first, as a report fixes them before it emits.
719
+ program.getProgramDiagnostics();
720
+ emitter = new ProgramEmitter(checked);
721
+ }
722
+ const signature = declarationSignature(emitter, file, options);
723
+ signatures.set(path, signature);
724
+ if (signature === info.signature) continue;
725
+ }
726
+ queue.push(path);
727
+ }
728
+ while (queue.length > 0)
729
+ for (const importer of snapshot.referencedMap.getReferencedBy(queue.pop()!))
730
+ if (!affected.has(importer)) {
731
+ affected.add(importer);
732
+ queue.push(importer);
733
+ }
734
+ const files: SourceFile[] = [];
735
+ for (const path of affected) {
736
+ const file = program.getSourceFileByPath(path);
737
+ if (file !== undefined) files.push(file);
738
+ }
739
+ mark(`${files.length} files the change may affect`);
740
+ return rechecksOnThreads(files, threads, options.checkers !== undefined) ? threads : 1;
741
+ }
742
+
743
+ /**
744
+ * Rechecks `checked` as a compile with build info does (`recheckInParallel`, tsc-compile.ts): its
745
+ * program is shared with checker threads before its checker does more than merge the globals, and the
746
+ * threads check the files the change affects when they are many enough, emitting what the incremental
747
+ * program would; otherwise this thread checks them. `signatures` are those `rebuildThreads` computed.
748
+ */
749
+ private recheckOnThreads(
750
+ checked: CheckedProgram,
751
+ threads: number,
752
+ signatures: ReadonlyMap<string, string>,
753
+ done: () => void,
754
+ changedFiles?: readonly string[],
755
+ ): void {
756
+ const sys = this.sys;
757
+ const program = checked.program;
758
+ shareWithCheckers(checked);
759
+ const times = new CompileTimes();
760
+ const incremental = new IncrementalProgram(checked, times, this.snapshot, new SystemTimeStamps(sys), signatures);
761
+ const options = program.options;
762
+ if (
763
+ options.listFilesOnly !== true &&
764
+ incremental.getSyntacticDiagnostics().length === 0 &&
765
+ incremental.getProgramDiagnostics().length === 0 &&
766
+ incremental.getGlobalDiagnostics(false).length === 0
767
+ ) {
768
+ const files = incremental.filesToCheck();
769
+ mark(`${files.length} files to check`);
770
+ if (rechecksOnThreads(files, threads, options.checkers !== undefined)) {
771
+ checked.checkOnly = new Set(files);
772
+ const finish = (): void => {
773
+ this.report(incremental, changedFiles);
774
+ done();
775
+ };
776
+ startParallelCheck(checked, threads, finish, true, incremental.emitKindsOnCheckers(files));
777
+ return;
778
+ }
779
+ }
780
+ this.report(incremental, changedFiles);
781
+ done();
782
+ }
783
+
784
+ /**
785
+ * Checks (where checker threads didn't), emits and reports `checked`, and watches its inputs. `signatures`
786
+ * are the shape signatures computed for `checked`'s files before (`rebuildThreads`).
787
+ */
788
+ private finishBuild(
789
+ checked: CheckedProgram,
790
+ signatures?: ReadonlyMap<string, string>,
791
+ changedFiles?: readonly string[],
792
+ ): void {
793
+ const times = new CompileTimes();
794
+ this.report(
795
+ new IncrementalProgram(checked, times, this.snapshot, new SystemTimeStamps(this.sys), signatures),
796
+ changedFiles,
797
+ );
798
+ }
799
+
800
+ /**
801
+ * Checks (where checker threads didn't), emits and reports `incremental`, and watches its inputs: those of a
802
+ * program `updatedProgram` made are the last build's, with new time stamps for `changedFiles`.
803
+ */
804
+ private report(incremental: IncrementalProgram, changedFiles?: readonly string[]): void {
805
+ const sys = this.sys;
806
+ const program = incremental.program;
807
+ const result = emitFilesAndReportErrors(
808
+ sys,
809
+ incremental,
810
+ this.reporter,
811
+ new ErrorSummaryReporter(sys, program.options, this.locale),
812
+ new SystemWriter(sys),
813
+ this.locale,
814
+ );
815
+ this.snapshot = incremental.snapshot;
816
+ this.lastChecked = incremental.checked;
817
+ this.lastProgram = program;
818
+ if (changedFiles !== undefined) this.stamps.refresh(changedFiles);
819
+ else this.watchInputs(program);
820
+ this.status.reportErrorCount(result.diagnostics.length);
821
+ }
822
+
823
+ private watchInputs(program: Program): void {
824
+ const sys = this.sys;
825
+ const stamps = new Stamps(sys);
826
+ const configStamps = new Stamps(sys);
827
+ for (const file of this.configFiles()) configStamps.add(file);
828
+ for (const file of program.getSourceFiles()) {
829
+ if (program.isSourceFileDefaultLibrary(file.path)) continue;
830
+ stamps.add(file.fileName);
831
+ stamps.addDirectory(getDirectoryPath(file.fileName), false);
832
+ }
833
+ for (const fileName of this.config.fileNames) stamps.addDirectory(getDirectoryPath(fileName), false);
834
+ for (const directory of includeDirectories(this.config)) stamps.addDirectory(directory.path, directory.recursive);
835
+ if (this.config.configName === '') stamps.addDirectory(sys.currentDirectory, false);
836
+ this.stamps = stamps;
837
+ this.configStamps = configStamps;
838
+ }
839
+ }
840
+
841
+ /** Starts `tsc --watch`; the process keeps running. */
842
+ export function watch(sys: System, config: ParsedCommandLine, commandLine: CommandLine): void {
843
+ new Watcher(sys, config, commandLine).start();
844
+ }
845
+
846
+ /** The inputs of every project of a build, from their configs and build infos. */
847
+ function buildInputs(sys: System, command: ParsedBuildCommandLine): Stamps {
848
+ const stamps = new Stamps(sys);
849
+ const fs = new CachedFileSystem(new SystemFileSystem(sys));
850
+ const parser = new ConfigParser(fs, sys.currentDirectory);
851
+ const seen = new Set<string>();
852
+ const visit = (configName: string): void => {
853
+ const path = toPath(configName, sys.currentDirectory, sys.useCaseSensitiveFileNames);
854
+ if (seen.has(path)) return;
855
+ seen.add(path);
856
+ stamps.add(configName);
857
+ stamps.addDirectory(getDirectoryPath(configName), false);
858
+ const config = parser.parseConfigFile(configName, command.compilerOptions, command.raw, []);
859
+ if (config === undefined) return;
860
+ const configFile = config.configFile;
861
+ if (configFile !== undefined) for (const extended of configFile.extendedSourceFiles) stamps.add(extended);
862
+ for (const fileName of config.fileNames) {
863
+ stamps.add(fileName);
864
+ stamps.addDirectory(getDirectoryPath(fileName), false);
865
+ }
866
+ for (const directory of includeDirectories(config)) stamps.addDirectory(directory.path, directory.recursive);
867
+ for (const reference of config.resolvedProjectReferencePaths()) visit(reference);
868
+ };
869
+ for (const project of command.projects) {
870
+ const absolute = getNormalizedAbsolutePath(project, sys.currentDirectory);
871
+ visit(absolute.endsWith('.json') ? absolute : combinePaths(absolute, 'tsconfig.json'));
872
+ }
873
+ return stamps;
874
+ }
875
+
876
+ /** Starts `tsc --build --watch`; the process keeps running. */
877
+ export function watchBuild(sys: System, command: ParsedBuildCommandLine): void {
878
+ const options = command.compilerOptions;
879
+ const locale = outputLocale(options);
880
+ const status = new WatchStatusReporter(
881
+ sys,
882
+ options.preserveWatchOutput !== true && options.extendedDiagnostics !== true && options.diagnostics !== true,
883
+ options.pretty,
884
+ locale,
885
+ );
886
+ status.report(
887
+ watchRestart.resumed
888
+ ? Diagnostics.File_change_detected_Starting_incremental_compilation
889
+ : Diagnostics.Starting_compilation_in_watch_mode,
890
+ );
891
+ const run = (): Stamps => {
892
+ releaseProgramCaches();
893
+ startWatchRebuild();
894
+ const orchestrator = new Orchestrator(sys, command);
895
+ orchestrator.watching = true;
896
+ orchestrator.start();
897
+ status.reportErrorCount(orchestrator.errorCount);
898
+ return buildInputs(sys, command);
899
+ };
900
+ let stamps = run();
901
+ watchRestart.firstBuildDone();
902
+ const changes = new ChangeWatcher(sys, () => {
903
+ if (stamps.changed() && !watchRestart.restartsBeforeRebuild()) {
904
+ status.report(Diagnostics.File_change_detected_Starting_incremental_compilation);
905
+ stamps = run();
906
+ }
907
+ changes.watch([stamps]);
908
+ });
909
+ changes.watch([stamps]);
910
+ }
911
+
912
+ /**
913
+ * A rebuild parses every file again, so drop the module-level caches that still point at the
914
+ * previous build's files and library globals.
915
+ */
916
+ function releaseProgramCaches(): void {
917
+ clearLibGlobalsCache();
918
+ forgetLazyJSDocFile();
919
+ forgetNavigationFile();
920
+ forgetRangeScannerFile();
921
+ forgetIdentifierSets();
922
+ }