tsc-ts 0.0.9 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (373) hide show
  1. package/README.md +2 -2
  2. package/bin/tsc-ts.js +70 -1
  3. package/dist/api/compiler/ast-utilities.d.ts +19 -1
  4. package/dist/api/compiler/ast-utilities.js +180 -95
  5. package/dist/api/compiler/ast.d.ts +22 -15
  6. package/dist/api/compiler/ast.js +1026 -995
  7. package/dist/api/compiler/astnav.js +15 -15
  8. package/dist/api/compiler/binder-utilities.js +186 -186
  9. package/dist/api/compiler/binder.js +290 -263
  10. package/dist/api/compiler/character-codes.js +2 -2
  11. package/dist/api/compiler/checker-calls.js +178 -124
  12. package/dist/api/compiler/checker-classes.d.ts +14 -3
  13. package/dist/api/compiler/checker-classes.js +134 -90
  14. package/dist/api/compiler/checker-contextual.js +64 -61
  15. package/dist/api/compiler/checker-declaration-order.js +79 -79
  16. package/dist/api/compiler/checker-declarations.d.ts +1 -0
  17. package/dist/api/compiler/checker-declarations.js +160 -136
  18. package/dist/api/compiler/checker-declared-types.js +67 -65
  19. package/dist/api/compiler/checker-decorators.js +77 -77
  20. package/dist/api/compiler/checker-deprecation.d.ts +8 -3
  21. package/dist/api/compiler/checker-deprecation.js +76 -55
  22. package/dist/api/compiler/checker-destructuring.js +47 -45
  23. package/dist/api/compiler/checker-elaboration.js +24 -24
  24. package/dist/api/compiler/checker-emit-helpers.js +4 -4
  25. package/dist/api/compiler/checker-emit-resolver.d.ts +4 -2
  26. package/dist/api/compiler/checker-emit-resolver.js +25 -13
  27. package/dist/api/compiler/checker-evaluator.js +9 -9
  28. package/dist/api/compiler/checker-expressions.js +244 -211
  29. package/dist/api/compiler/checker-functions.js +113 -107
  30. package/dist/api/compiler/checker-generated-code.d.ts +0 -11
  31. package/dist/api/compiler/checker-generated-code.js +28 -52
  32. package/dist/api/compiler/checker-grammar.d.ts +1 -0
  33. package/dist/api/compiler/checker-grammar.js +472 -440
  34. package/dist/api/compiler/checker-heritage.js +91 -93
  35. package/dist/api/compiler/checker-inference.d.ts +77 -5
  36. package/dist/api/compiler/checker-inference.js +487 -107
  37. package/dist/api/compiler/checker-iteration.d.ts +0 -10
  38. package/dist/api/compiler/checker-iteration.js +35 -52
  39. package/dist/api/compiler/checker-javascript.js +14 -14
  40. package/dist/api/compiler/checker-jsdoc.d.ts +8 -10
  41. package/dist/api/compiler/checker-jsdoc.js +67 -58
  42. package/dist/api/compiler/checker-jsx.js +105 -88
  43. package/dist/api/compiler/checker-members.d.ts +9 -2
  44. package/dist/api/compiler/checker-members.js +212 -75
  45. package/dist/api/compiler/checker-modules.d.ts +15 -6
  46. package/dist/api/compiler/checker-modules.js +469 -309
  47. package/dist/api/compiler/checker-narrowing.js +273 -189
  48. package/dist/api/compiler/checker-object-literals.js +25 -22
  49. package/dist/api/compiler/checker-operators.js +126 -118
  50. package/dist/api/compiler/checker-overloads.js +27 -27
  51. package/dist/api/compiler/checker-property-access.js +59 -55
  52. package/dist/api/compiler/checker-services.d.ts +1 -0
  53. package/dist/api/compiler/checker-services.js +222 -210
  54. package/dist/api/compiler/checker-signatures.js +65 -49
  55. package/dist/api/compiler/checker-source-file.d.ts +5 -0
  56. package/dist/api/compiler/checker-source-file.js +154 -130
  57. package/dist/api/compiler/checker-statements.js +33 -32
  58. package/dist/api/compiler/checker-super.js +50 -50
  59. package/dist/api/compiler/checker-symbol-types.js +109 -93
  60. package/dist/api/compiler/checker-symbols.d.ts +13 -1
  61. package/dist/api/compiler/checker-symbols.js +264 -149
  62. package/dist/api/compiler/checker-type-factory.d.ts +5 -0
  63. package/dist/api/compiler/checker-type-factory.js +145 -36
  64. package/dist/api/compiler/checker-type-nodes.d.ts +1 -0
  65. package/dist/api/compiler/checker-type-nodes.js +179 -141
  66. package/dist/api/compiler/checker-type-operators.d.ts +2 -0
  67. package/dist/api/compiler/checker-type-operators.js +110 -63
  68. package/dist/api/compiler/checker-types.d.ts +80 -3
  69. package/dist/api/compiler/checker-types.js +121 -2
  70. package/dist/api/compiler/checker-unused.js +114 -118
  71. package/dist/api/compiler/checker-utilities.js +11 -11
  72. package/dist/api/compiler/checker.d.ts +104 -31
  73. package/dist/api/compiler/checker.js +181 -33
  74. package/dist/api/compiler/command-line.d.ts +1 -3
  75. package/dist/api/compiler/command-line.js +47 -44
  76. package/dist/api/compiler/compile-program.d.ts +42 -3
  77. package/dist/api/compiler/compile-program.js +139 -27
  78. package/dist/api/compiler/diagnostic-messages.d.ts +1849 -1774
  79. package/dist/api/compiler/diagnostic-messages.js +128 -122
  80. package/dist/api/compiler/diagnostics.d.ts +22 -0
  81. package/dist/api/compiler/diagnostics.js +93 -11
  82. package/dist/api/compiler/emitter.d.ts +7 -1
  83. package/dist/api/compiler/emitter.js +53 -11
  84. package/dist/api/compiler/file-include.d.ts +2 -1
  85. package/dist/api/compiler/file-include.js +11 -7
  86. package/dist/api/compiler/file-loader.d.ts +21 -1
  87. package/dist/api/compiler/file-loader.js +201 -48
  88. package/dist/api/compiler/instantiation.d.ts +7 -0
  89. package/dist/api/compiler/instantiation.js +101 -49
  90. package/dist/api/compiler/jsdoc.js +23 -23
  91. package/dist/api/compiler/link-tables.d.ts +48 -18
  92. package/dist/api/compiler/link-tables.js +80 -37
  93. package/dist/api/compiler/locales/cs-CZ.d.ts +1 -1
  94. package/dist/api/compiler/locales/cs-CZ.js +1 -1
  95. package/dist/api/compiler/locales/de-DE.d.ts +1 -1
  96. package/dist/api/compiler/locales/de-DE.js +1 -1
  97. package/dist/api/compiler/locales/es-ES.d.ts +1 -1
  98. package/dist/api/compiler/locales/es-ES.js +1 -1
  99. package/dist/api/compiler/locales/fr-FR.d.ts +1 -1
  100. package/dist/api/compiler/locales/fr-FR.js +1 -1
  101. package/dist/api/compiler/locales/it-IT.d.ts +1 -1
  102. package/dist/api/compiler/locales/it-IT.js +1 -1
  103. package/dist/api/compiler/locales/ja-JP.d.ts +1 -1
  104. package/dist/api/compiler/locales/ja-JP.js +1 -1
  105. package/dist/api/compiler/locales/ko-KR.d.ts +1 -1
  106. package/dist/api/compiler/locales/ko-KR.js +1 -1
  107. package/dist/api/compiler/locales/pl-PL.d.ts +1 -1
  108. package/dist/api/compiler/locales/pl-PL.js +1 -1
  109. package/dist/api/compiler/locales/pt-BR.d.ts +1 -1
  110. package/dist/api/compiler/locales/pt-BR.js +1 -1
  111. package/dist/api/compiler/locales/ru-RU.d.ts +1 -1
  112. package/dist/api/compiler/locales/ru-RU.js +1 -1
  113. package/dist/api/compiler/locales/tr-TR.d.ts +1 -1
  114. package/dist/api/compiler/locales/tr-TR.js +1 -1
  115. package/dist/api/compiler/locales/zh-CN.d.ts +1 -1
  116. package/dist/api/compiler/locales/zh-CN.js +1 -1
  117. package/dist/api/compiler/locales/zh-TW.d.ts +1 -1
  118. package/dist/api/compiler/locales/zh-TW.js +1 -1
  119. package/dist/api/compiler/module-resolution-types.js +6 -6
  120. package/dist/api/compiler/module-resolution.d.ts +10 -1
  121. package/dist/api/compiler/module-resolution.js +115 -84
  122. package/dist/api/compiler/module-specifiers.d.ts +15 -0
  123. package/dist/api/compiler/module-specifiers.js +24 -18
  124. package/dist/api/compiler/name-resolver.js +74 -65
  125. package/dist/api/compiler/node-builder-names.d.ts +11 -3
  126. package/dist/api/compiler/node-builder-names.js +210 -90
  127. package/dist/api/compiler/node-builder-pseudo.js +29 -31
  128. package/dist/api/compiler/node-builder-reuse.js +23 -22
  129. package/dist/api/compiler/node-builder.d.ts +18 -1
  130. package/dist/api/compiler/node-builder.js +191 -102
  131. package/dist/api/compiler/option-declarations.d.ts +2 -6
  132. package/dist/api/compiler/option-declarations.js +315 -375
  133. package/dist/api/compiler/options.d.ts +15 -33
  134. package/dist/api/compiler/options.js +21 -54
  135. package/dist/api/compiler/output-paths.d.ts +4 -1
  136. package/dist/api/compiler/output-paths.js +6 -11
  137. package/dist/api/compiler/package-json.d.ts +3 -3
  138. package/dist/api/compiler/package-json.js +11 -10
  139. package/dist/api/compiler/parallel-parse.d.ts +3 -2
  140. package/dist/api/compiler/parallel-parse.js +17 -5
  141. package/dist/api/compiler/parser.d.ts +40 -19
  142. package/dist/api/compiler/parser.js +308 -216
  143. package/dist/api/compiler/path.d.ts +9 -0
  144. package/dist/api/compiler/path.js +20 -3
  145. package/dist/api/compiler/printer/emit-context.d.ts +5 -1
  146. package/dist/api/compiler/printer/emit-context.js +20 -1
  147. package/dist/api/compiler/printer/factory-base.d.ts +2 -2
  148. package/dist/api/compiler/printer/factory-base.js +7 -3
  149. package/dist/api/compiler/printer/factory.js +3 -1
  150. package/dist/api/compiler/printer/helpers.js +10 -1
  151. package/dist/api/compiler/printer/name-generator.d.ts +1 -1
  152. package/dist/api/compiler/printer/name-generator.js +35 -16
  153. package/dist/api/compiler/printer/printer.d.ts +49 -2
  154. package/dist/api/compiler/printer/printer.js +539 -293
  155. package/dist/api/compiler/printer/utilities.js +149 -147
  156. package/dist/api/compiler/program-checker.d.ts +12 -2
  157. package/dist/api/compiler/program-checker.js +88 -34
  158. package/dist/api/compiler/program-utilities.d.ts +3 -1
  159. package/dist/api/compiler/program-utilities.js +28 -15
  160. package/dist/api/compiler/program.d.ts +4 -6
  161. package/dist/api/compiler/program.js +74 -87
  162. package/dist/api/compiler/pseudo-bigint.d.ts +2 -0
  163. package/dist/api/compiler/pseudo-bigint.js +18 -0
  164. package/dist/api/compiler/regexp-checker.d.ts +1 -1
  165. package/dist/api/compiler/regexp-checker.js +93 -76
  166. package/dist/api/compiler/relations.d.ts +27 -4
  167. package/dist/api/compiler/relations.js +347 -180
  168. package/dist/api/compiler/reparser.js +60 -56
  169. package/dist/api/compiler/scanner.d.ts +19 -2
  170. package/dist/api/compiler/scanner.js +123 -108
  171. package/dist/api/compiler/shared-results.d.ts +463 -0
  172. package/dist/api/compiler/shared-results.js +2128 -0
  173. package/dist/api/compiler/sourcemap.js +2 -2
  174. package/dist/api/compiler/symbol-accessibility.js +87 -74
  175. package/dist/api/compiler/symbol.d.ts +23 -14
  176. package/dist/api/compiler/symbol.js +23 -11
  177. package/dist/api/compiler/syntax-kind.d.ts +198 -197
  178. package/dist/api/compiler/transformers/alias-references.js +247 -139
  179. package/dist/api/compiler/transformers/async-utilities.js +25 -25
  180. package/dist/api/compiler/transformers/async.d.ts +0 -1
  181. package/dist/api/compiler/transformers/async.js +64 -77
  182. package/dist/api/compiler/transformers/class-fields.d.ts +1 -0
  183. package/dist/api/compiler/transformers/class-fields.js +81 -78
  184. package/dist/api/compiler/transformers/commonjs-module.js +18 -15
  185. package/dist/api/compiler/transformers/const-enum-inliner.js +1 -1
  186. package/dist/api/compiler/transformers/declarations-diagnostics.js +247 -244
  187. package/dist/api/compiler/transformers/declarations-pseudo.js +100 -100
  188. package/dist/api/compiler/transformers/declarations-resolver.d.ts +0 -3
  189. package/dist/api/compiler/transformers/declarations-syntactic.d.ts +1 -2
  190. package/dist/api/compiler/transformers/declarations-syntactic.js +134 -156
  191. package/dist/api/compiler/transformers/declarations-tracker.js +18 -18
  192. package/dist/api/compiler/transformers/declarations.d.ts +4 -1
  193. package/dist/api/compiler/transformers/declarations.js +305 -238
  194. package/dist/api/compiler/transformers/decorator-metadata.d.ts +1 -1
  195. package/dist/api/compiler/transformers/decorator-metadata.js +53 -45
  196. package/dist/api/compiler/transformers/decorator-utilities.js +24 -24
  197. package/dist/api/compiler/transformers/destructuring.js +19 -18
  198. package/dist/api/compiler/transformers/emit-resolver.js +1 -1
  199. package/dist/api/compiler/transformers/es-decorators.js +55 -55
  200. package/dist/api/compiler/transformers/external-module-info.js +3 -3
  201. package/dist/api/compiler/transformers/for-await.js +25 -25
  202. package/dist/api/compiler/transformers/import-elision.js +14 -14
  203. package/dist/api/compiler/transformers/jsx.js +12 -12
  204. package/dist/api/compiler/transformers/legacy-decorators.js +17 -17
  205. package/dist/api/compiler/transformers/module.js +8 -8
  206. package/dist/api/compiler/transformers/named-evaluation.js +4 -4
  207. package/dist/api/compiler/transformers/object-rest-spread.js +20 -20
  208. package/dist/api/compiler/transformers/optional-chain.js +10 -10
  209. package/dist/api/compiler/transformers/reference-resolver.d.ts +12 -1
  210. package/dist/api/compiler/transformers/reference-resolver.js +131 -69
  211. package/dist/api/compiler/transformers/runtime-syntax.js +35 -31
  212. package/dist/api/compiler/transformers/subtree-facts.js +47 -47
  213. package/dist/api/compiler/transformers/syntax-facts.js +56 -58
  214. package/dist/api/compiler/transformers/type-eraser.js +73 -66
  215. package/dist/api/compiler/transformers/type-serialization.js +24 -24
  216. package/dist/api/compiler/transformers/using.js +12 -12
  217. package/dist/api/compiler/transformers/utilities.js +77 -77
  218. package/dist/api/compiler/transformers/visitor-base.js +172 -172
  219. package/dist/api/compiler/transformers/visitor-hooks.js +6 -2
  220. package/dist/api/compiler/tsconfig.d.ts +10 -2
  221. package/dist/api/compiler/tsconfig.js +136 -48
  222. package/dist/api/compiler/type-printer.js +40 -3
  223. package/dist/api/compiler/types.d.ts +2 -1
  224. package/dist/api/library/ast.generated.d.ts +42 -39
  225. package/dist/api/library/ast.generated.js +1 -1
  226. package/dist/api/library/compiler-options.generated.d.ts +111 -100
  227. package/dist/api/library/compiler-options.generated.js +1 -1
  228. package/dist/api/library/disk.js +12 -1
  229. package/dist/api/library/enums.generated.d.ts +206 -206
  230. package/dist/api/library/enums.generated.js +206 -206
  231. package/dist/api/library/nodes.js +26 -26
  232. package/package.json +9 -9
  233. package/src/compiler/ast-utilities.ts +99 -7
  234. package/src/compiler/ast.ts +58 -26
  235. package/src/compiler/binder.ts +39 -4
  236. package/src/compiler/character-codes.ts +2 -2
  237. package/src/compiler/checker-calls.ts +79 -9
  238. package/src/compiler/checker-classes.ts +78 -24
  239. package/src/compiler/checker-contextual.ts +6 -1
  240. package/src/compiler/checker-declarations.ts +31 -4
  241. package/src/compiler/checker-declared-types.ts +8 -5
  242. package/src/compiler/checker-decorators.ts +1 -1
  243. package/src/compiler/checker-deprecation.ts +29 -8
  244. package/src/compiler/checker-destructuring.ts +10 -3
  245. package/src/compiler/checker-emit-helpers.ts +1 -0
  246. package/src/compiler/checker-emit-resolver.ts +16 -6
  247. package/src/compiler/checker-expressions.ts +79 -46
  248. package/src/compiler/checker-functions.ts +21 -6
  249. package/src/compiler/checker-generated-code.ts +2 -22
  250. package/src/compiler/checker-grammar.ts +136 -62
  251. package/src/compiler/checker-heritage.ts +22 -21
  252. package/src/compiler/checker-inference.ts +514 -82
  253. package/src/compiler/checker-iteration.ts +18 -31
  254. package/src/compiler/checker-javascript.ts +1 -1
  255. package/src/compiler/checker-jsdoc.ts +50 -27
  256. package/src/compiler/checker-jsx.ts +26 -4
  257. package/src/compiler/checker-members.ts +200 -56
  258. package/src/compiler/checker-modules.ts +332 -65
  259. package/src/compiler/checker-narrowing.ts +98 -19
  260. package/src/compiler/checker-object-literals.ts +3 -0
  261. package/src/compiler/checker-operators.ts +11 -4
  262. package/src/compiler/checker-property-access.ts +7 -2
  263. package/src/compiler/checker-services.ts +39 -12
  264. package/src/compiler/checker-signatures.ts +15 -1
  265. package/src/compiler/checker-source-file.ts +39 -13
  266. package/src/compiler/checker-statements.ts +3 -2
  267. package/src/compiler/checker-symbol-types.ts +29 -6
  268. package/src/compiler/checker-symbols.ts +158 -15
  269. package/src/compiler/checker-type-factory.ts +124 -23
  270. package/src/compiler/checker-type-nodes.ts +46 -3
  271. package/src/compiler/checker-type-operators.ts +83 -26
  272. package/src/compiler/checker-types.ts +147 -4
  273. package/src/compiler/checker-unused.ts +9 -14
  274. package/src/compiler/checker.ts +203 -39
  275. package/src/compiler/command-line.ts +28 -28
  276. package/src/compiler/compile-program.ts +167 -27
  277. package/src/compiler/decoder.ts +13 -4
  278. package/src/compiler/diagnostic-messages.ts +1973 -1892
  279. package/src/compiler/diagnostics.ts +84 -3
  280. package/src/compiler/emitter.ts +57 -8
  281. package/src/compiler/encoder.ts +23 -8
  282. package/src/compiler/file-include.ts +9 -3
  283. package/src/compiler/file-loader.ts +197 -38
  284. package/src/compiler/help.ts +10 -14
  285. package/src/compiler/incremental.ts +165 -30
  286. package/src/compiler/init.ts +2 -7
  287. package/src/compiler/instantiation.ts +77 -22
  288. package/src/compiler/jsdoc.ts +3 -1
  289. package/src/compiler/link-tables.ts +82 -37
  290. package/src/compiler/locales/cs-CZ.ts +1 -1
  291. package/src/compiler/locales/de-DE.ts +1 -1
  292. package/src/compiler/locales/es-ES.ts +1 -1
  293. package/src/compiler/locales/fr-FR.ts +1 -1
  294. package/src/compiler/locales/it-IT.ts +1 -1
  295. package/src/compiler/locales/ja-JP.ts +1 -1
  296. package/src/compiler/locales/ko-KR.ts +1 -1
  297. package/src/compiler/locales/pl-PL.ts +1 -1
  298. package/src/compiler/locales/pt-BR.ts +1 -1
  299. package/src/compiler/locales/ru-RU.ts +1 -1
  300. package/src/compiler/locales/tr-TR.ts +1 -1
  301. package/src/compiler/locales/zh-CN.ts +1 -1
  302. package/src/compiler/locales/zh-TW.ts +1 -1
  303. package/src/compiler/module-resolution.ts +44 -8
  304. package/src/compiler/module-specifiers.ts +62 -20
  305. package/src/compiler/name-resolver.ts +9 -1
  306. package/src/compiler/node-builder-names.ts +236 -54
  307. package/src/compiler/node-builder-pseudo.ts +4 -7
  308. package/src/compiler/node-builder-reuse.ts +5 -4
  309. package/src/compiler/node-builder.ts +130 -31
  310. package/src/compiler/option-declarations.ts +33 -103
  311. package/src/compiler/options.ts +23 -62
  312. package/src/compiler/output-paths.ts +5 -18
  313. package/src/compiler/package-entrypoints.ts +345 -0
  314. package/src/compiler/package-json.ts +4 -4
  315. package/src/compiler/parallel-check.ts +326 -52
  316. package/src/compiler/parallel-emit.ts +320 -0
  317. package/src/compiler/parallel-parse.ts +16 -5
  318. package/src/compiler/parse-thread.ts +3 -0
  319. package/src/compiler/parser.ts +156 -39
  320. package/src/compiler/path.ts +22 -2
  321. package/src/compiler/printer/emit-context.ts +21 -0
  322. package/src/compiler/printer/factory-base.ts +10 -3
  323. package/src/compiler/printer/factory.ts +4 -1
  324. package/src/compiler/printer/helpers.ts +10 -1
  325. package/src/compiler/printer/name-generator.ts +24 -2
  326. package/src/compiler/printer/printer.ts +266 -30
  327. package/src/compiler/printer/utilities.ts +8 -2
  328. package/src/compiler/program-checker.ts +57 -5
  329. package/src/compiler/program-utilities.ts +23 -10
  330. package/src/compiler/program.ts +18 -26
  331. package/src/compiler/pseudo-bigint.ts +17 -0
  332. package/src/compiler/regexp-checker.ts +63 -30
  333. package/src/compiler/relations.ts +240 -77
  334. package/src/compiler/reparser.ts +7 -2
  335. package/src/compiler/scanner.ts +109 -79
  336. package/src/compiler/shared-results.ts +2414 -0
  337. package/src/compiler/show-config.ts +18 -1
  338. package/src/compiler/sourcemap.ts +2 -2
  339. package/src/compiler/symbol-accessibility.ts +26 -3
  340. package/src/compiler/symbol.ts +46 -24
  341. package/src/compiler/syntax-kind.ts +188 -187
  342. package/src/compiler/thread-entry.ts +64 -4
  343. package/src/compiler/transformers/alias-references.ts +123 -4
  344. package/src/compiler/transformers/async.ts +2 -17
  345. package/src/compiler/transformers/class-fields.ts +13 -12
  346. package/src/compiler/transformers/commonjs-module.ts +11 -7
  347. package/src/compiler/transformers/declarations-diagnostics.ts +5 -3
  348. package/src/compiler/transformers/declarations-pseudo.ts +2 -4
  349. package/src/compiler/transformers/declarations-resolver.ts +0 -3
  350. package/src/compiler/transformers/declarations-syntactic.ts +1 -21
  351. package/src/compiler/transformers/declarations.ts +134 -48
  352. package/src/compiler/transformers/decorator-metadata.ts +9 -1
  353. package/src/compiler/transformers/destructuring.ts +4 -3
  354. package/src/compiler/transformers/external-module-info.ts +1 -1
  355. package/src/compiler/transformers/jsx.ts +2 -1
  356. package/src/compiler/transformers/reference-resolver.ts +83 -19
  357. package/src/compiler/transformers/runtime-syntax.ts +6 -1
  358. package/src/compiler/transformers/syntax-facts.ts +2 -7
  359. package/src/compiler/transformers/type-eraser.ts +10 -1
  360. package/src/compiler/transformers/type-serialization.ts +3 -2
  361. package/src/compiler/transformers/visitor-base.ts +2 -1
  362. package/src/compiler/transformers/visitor-hooks.ts +9 -4
  363. package/src/compiler/tsc-build.ts +66 -9
  364. package/src/compiler/tsc-cli.ts +7 -0
  365. package/src/compiler/tsc-compile.ts +284 -4
  366. package/src/compiler/tsc-watch.ts +74 -45
  367. package/src/compiler/tsconfig.ts +176 -19
  368. package/src/compiler/type-printer.ts +36 -2
  369. package/src/compiler/types.ts +2 -1
  370. package/src/library/ast.generated.ts +57 -41
  371. package/src/library/compiler-options.generated.ts +117 -103
  372. package/src/library/disk.ts +10 -1
  373. package/src/library/enums.generated.ts +196 -196
@@ -13,7 +13,7 @@ import {
13
13
  type Node,
14
14
  type SourceFile,
15
15
  } from './ast.js';
16
- import { Diagnostics, type DiagnosticMessage, type MessageWithArgs } from './diagnostics.js';
16
+ import { Diagnostics, type DiagnosticMessage, type MessageWithArgs, messageWithArgs } from './diagnostics.js';
17
17
  import { FileIncludeKind, FileIncludeReason, IncludeProcessor, ProcessingDiagnostic } from './file-include.js';
18
18
  import type { FileSystem } from './file-system.js';
19
19
  import { ModuleResolutionHost, Resolver, getAutomaticTypeDirectiveNames } from './module-resolution.js';
@@ -42,7 +42,7 @@ import {
42
42
  takePreparedFile,
43
43
  } from './parallel-parse.js';
44
44
  import type { PackageJsonLookup } from './package-json.js';
45
- import { parseSourceFile } from './parser.js';
45
+ import { parseSourceFile, getScriptKindFromFileName } from './parser.js';
46
46
  import { mark } from './timeline.js';
47
47
  import {
48
48
  combinePaths,
@@ -59,6 +59,7 @@ import {
59
59
  supportedTSExtensionsWithJsonFlat,
60
60
  toFileNameLowerCase,
61
61
  toPath,
62
+ isNetworkPath,
62
63
  } from './path.js';
63
64
  import {
64
65
  getDefaultLibFileName,
@@ -76,6 +77,7 @@ import {
76
77
  SourceFileMetadata,
77
78
  } from './program-utilities.js';
78
79
  import { SyntaxKind } from './syntax-kind.js';
80
+ import { isSourcePhaseImport } from './ast-utilities.js';
79
81
  import { hasExtension } from './vfs-match.js';
80
82
  import { TokenFlags } from './types.js';
81
83
  import {
@@ -140,7 +142,10 @@ export class CompilerHost extends ModuleResolutionHost {
140
142
  if (prepared !== undefined) return prepared;
141
143
  const text = this.fs.readFile(fileName);
142
144
  if (text === undefined) return undefined;
143
- return parseSourceFile(fileName, text, new ParseOptions(path, ScriptKind.Unknown, externalModuleIndicatorOptions));
145
+ // A file without a known extension (with allowNonTsExtensions) parses as TypeScript.
146
+ const kind = getScriptKindFromFileName(fileName);
147
+ const scriptKind = kind === ScriptKind.Unknown ? ScriptKind.TS : kind;
148
+ return parseSourceFile(fileName, text, new ParseOptions(path, scriptKind, externalModuleIndicatorOptions));
144
149
  }
145
150
 
146
151
  /** The config of a referenced project, or `undefined` if it can't be read. */
@@ -246,6 +251,8 @@ class ParseTask {
246
251
  subTasks: ParseTask[] | undefined = undefined;
247
252
  loaded = false;
248
253
  startedSubTasks = false;
254
+ /** A root file name that resolved to no supported file: the task only carries its processing diagnostic. */
255
+ failedLookup = false;
249
256
  metadata: SourceFileMetadata = libFileMetadata;
250
257
  resolutionsInFile: ModeAwareCache<ResolvedModule> | undefined = undefined;
251
258
  resolutionsTrace: MessageWithArgs[] | undefined = undefined;
@@ -256,6 +263,10 @@ class ParseTask {
256
263
  jsxRuntimeImport: JsxRuntimeImport | undefined = undefined;
257
264
  /** The task of the same file name that was loaded instead of this one. */
258
265
  loadedTask: ParseTask | undefined = undefined;
266
+ /** The index in `FileLoader.taskData` of the tasks of this task's path, once known; -1 before. */
267
+ dataIndex = -1;
268
+ /** Whether an import or a type reference directive adds the file (`ProcessedFiles.addedFiles`). */
269
+ readonly byImport: boolean;
259
270
 
260
271
  constructor(
261
272
  readonly normalizedFilePath: string,
@@ -266,7 +277,10 @@ class ParseTask {
266
277
  /** A JavaScript file found in `node_modules`, loaded only within `maxNodeModuleJsDepth`. */
267
278
  readonly elideOnDepth: boolean,
268
279
  readonly packageId: PackageId | undefined,
269
- ) {}
280
+ ) {
281
+ const kind = includeReason !== undefined ? includeReason.kind : -1;
282
+ this.byImport = kind === FileIncludeKind.Import || kind === FileIncludeKind.TypeReferenceDirective;
283
+ }
270
284
 
271
285
  addSubTask(
272
286
  fileName: string,
@@ -296,16 +310,45 @@ class ParseTask {
296
310
  }
297
311
  }
298
312
 
313
+ const noData: readonly ParseTaskData[] = [];
314
+
315
+ /** The resolution of a module the importing file declares itself: none. */
316
+ const locallyDeclaredModule: ResolvedModule = {
317
+ resolvedFileName: '',
318
+ originalPath: '',
319
+ extension: '',
320
+ resolvedUsingTsExtension: false,
321
+ packageId: undefined,
322
+ isExternalLibraryImport: false,
323
+ alternateResult: '',
324
+ resolutionDiagnostics: [],
325
+ };
326
+
299
327
  /** The tasks of one path, by file name casing. */
300
328
  class ParseTaskData {
301
329
  readonly tasks = new Map<string, ParseTask>();
330
+ /** Whether a task of the path is queued (`start`). */
331
+ queued = false;
332
+ /** The path's first queued task, the first of `tasks`. */
333
+ first: ParseTask | undefined = undefined;
334
+ /**
335
+ * Whether every task of `tasks` is loaded (`run`): then more work of the path does nothing unless it
336
+ * reaches the path at a lower depth.
337
+ */
338
+ settled = false;
302
339
  lowestDepth = Number.MAX_SAFE_INTEGER;
303
340
  startedSubTasks = false;
304
341
  packageId: PackageId | undefined = undefined;
305
-
306
- constructor(task: ParseTask) {
307
- this.tasks.set(task.normalizedFilePath, task);
308
- }
342
+ /** The index of this path's file in the program's files, once collected; -1 for none. */
343
+ index = -1;
344
+ /** For a deduplicated package's path, the tasks of the copy kept (`collect`). */
345
+ keptCopy: ParseTaskData | undefined = undefined;
346
+ /** The paths the file's imports and type reference directives add, once collected. */
347
+ added: readonly ParseTaskData[] = noData;
348
+ /** The file name `collect` reached the path by first, once it did. */
349
+ collectedName: string | undefined = undefined;
350
+ /** The path's include reasons, once `collect` found one: the list in `IncludeProcessor.fileIncludeReasons`. */
351
+ reasons: FileIncludeReason[] | undefined = undefined;
309
352
  }
310
353
 
311
354
  /** Pending processing of `tasks[index]`. */
@@ -419,6 +462,11 @@ export class ProcessedFiles {
419
462
  * threads (`preparedPackageJsonLookups`); `undefined` where they may miss some.
420
463
  */
421
464
  readonly preparedPackageJsons: readonly PackageJsonLookup[] | undefined,
465
+ /**
466
+ * The files each file's imports and type reference directives added to the program, by index into
467
+ * `files`, without the file itself.
468
+ */
469
+ readonly addedFiles: readonly (readonly number[])[],
422
470
  ) {}
423
471
  }
424
472
 
@@ -446,6 +494,8 @@ export function withReplacedFile(processed: ProcessedFiles, file: SourceFile): P
446
494
  processed.redirectFilesByPath,
447
495
  processed.projectReferenceMapper,
448
496
  processed.preparedPackageJsons,
497
+ // The file has the same references (`canReplaceFile`), and keeps its index.
498
+ processed.addedFiles,
449
499
  );
450
500
  }
451
501
 
@@ -457,7 +507,7 @@ export function needsImportHelpersImportSpecifier(file: SourceFile, options: Com
457
507
 
458
508
  /** The module `file` imports the JSX runtime from under `options`, or '' if it imports none. */
459
509
  export function jsxRuntimeImportOf(file: SourceFile, options: CompilerOptions): string {
460
- if (file.scriptKind !== ScriptKind.JSX && file.scriptKind !== ScriptKind.TSX) return '';
510
+ if (!isSourceFileJS(file) && file.scriptKind !== ScriptKind.TSX) return '';
461
511
  return getJSXRuntimeImport(getJSXImplicitImportBase(options, file), options);
462
512
  }
463
513
 
@@ -537,7 +587,10 @@ export class FileLoader {
537
587
  private readonly supportedExtensionsWithJson: readonly (readonly string[])[];
538
588
  private readonly maxNodeModuleJsDepth: number;
539
589
  private readonly rootTasks: ParseTask[] = [];
540
- private readonly taskDataByPath = new Map<string, ParseTaskData>();
590
+ /** The tasks of each path, created when a task of the path is first queued or built ahead. */
591
+ private readonly taskData: ParseTaskData[] = [];
592
+ /** The index in `taskData` of each path's tasks. */
593
+ private readonly taskDataByPath = new Map<string, number>();
541
594
  /** Work queued by `start`, run last-in first-out like tsgo's single-threaded work group. */
542
595
  private readonly work: ParseWork[] = [];
543
596
  private readonly libFileCache = new Map<string, LibFile>();
@@ -607,7 +660,11 @@ export class FileLoader {
607
660
  const loaded = prepared.loaded;
608
661
  if (loaded === undefined) continue;
609
662
  const subTasks = this.subTasksOf(loaded);
610
- for (const task of subTasks) task.path = this.toPath(task.normalizedFilePath);
663
+ // Their paths and tasks, found here while threads parse rather than when the walk reaches them.
664
+ for (const task of subTasks) {
665
+ task.path = this.toPath(task.normalizedFilePath);
666
+ task.dataIndex = this.dataIndexOf(task.path);
667
+ }
611
668
  this.subTasksAhead.set(prepared.fileName, new SubTasksAhead(loaded, subTasks));
612
669
  }
613
670
  }
@@ -685,7 +742,7 @@ export class FileLoader {
685
742
 
686
743
  private walk(): void {
687
744
  for (let work = this.work.pop(); work !== undefined; work = this.work.pop()) {
688
- if (this.walkingAhead && this.parsesUnprepared(work.tasks[work.index], work.data)) {
745
+ if (this.walkingAhead && !this.elides(work) && this.parsesUnprepared(work.tasks[work.index], work.data)) {
689
746
  this.work.push(work);
690
747
  return;
691
748
  }
@@ -701,6 +758,7 @@ export class FileLoader {
701
758
  */
702
759
  release(): void {
703
760
  this.rootTasks.length = 0;
761
+ this.taskData.length = 0;
704
762
  this.taskDataByPath.clear();
705
763
  this.work.length = 0;
706
764
  this.subTasksAhead.clear();
@@ -880,6 +938,7 @@ export class FileLoader {
880
938
  return;
881
939
  }
882
940
  const task = new ParseTask(absolute, undefined, reason, false, false, false, undefined);
941
+ task.failedLookup = true;
883
942
  task.addProcessingDiagnostic(
884
943
  ProcessingDiagnostic.explainingFileInclude('', reason, resolved.message, resolved.args),
885
944
  );
@@ -906,6 +965,8 @@ export class FileLoader {
906
965
  ): string | ReferenceDiagnostic {
907
966
  const allowNonTsExtensions = this.options.allowNonTsExtensions === true;
908
967
  const diagnosticFileName = normalizeSlashes(referenceText);
968
+ if (isNetworkPath(fileName))
969
+ return new ReferenceDiagnostic(Diagnostics.Network_path_0_is_not_supported, [diagnosticFileName]);
909
970
  const fs = this.host.fs;
910
971
  if (hasExtension(fileName)) {
911
972
  const canonicalFileName = getCanonicalFileName(fileName, fs.useCaseSensitiveFileNames);
@@ -1006,43 +1067,67 @@ export class FileLoader {
1006
1067
  // ---- Loading
1007
1068
 
1008
1069
  private start(tasks: ParseTask[], depth: number): void {
1070
+ const taskData = this.taskData;
1009
1071
  for (let i = 0; i < tasks.length; i++) {
1010
1072
  const task = tasks[i];
1011
- // Sub-tasks built ahead have their paths.
1012
- if (task.path === '') task.path = this.toPath(task.normalizedFilePath);
1013
- let data = this.taskDataByPath.get(task.path);
1014
- const loaded = data !== undefined;
1015
- if (data === undefined) {
1016
- data = new ParseTaskData(task);
1017
- this.taskDataByPath.set(task.path, data);
1073
+ // Sub-tasks built ahead have their paths and tasks.
1074
+ let k = task.dataIndex;
1075
+ if (k < 0) {
1076
+ if (task.path === '') task.path = this.toPath(task.normalizedFilePath);
1077
+ k = this.dataIndexOf(task.path);
1078
+ task.dataIndex = k;
1079
+ }
1080
+ const data = taskData[k];
1081
+ const loaded = data.queued;
1082
+ if (!loaded) {
1083
+ data.queued = true;
1084
+ data.first = task;
1085
+ data.tasks.set(task.normalizedFilePath, task);
1018
1086
  }
1019
1087
  this.work.push(new ParseWork(tasks, i, data, loaded, depth));
1020
1088
  }
1021
1089
  }
1022
1090
 
1091
+ /** The index in `taskData` of the tasks of `path`, created if needed. */
1092
+ private dataIndexOf(path: string): number {
1093
+ let k = this.taskDataByPath.get(path);
1094
+ if (k === undefined) {
1095
+ k = this.taskData.length;
1096
+ this.taskData.push(new ParseTaskData());
1097
+ this.taskDataByPath.set(path, k);
1098
+ }
1099
+ return k;
1100
+ }
1101
+
1023
1102
  private run(work: ParseWork): void {
1024
1103
  const task = work.tasks[work.index];
1025
1104
  const data = work.data;
1026
1105
  let startSubTasks = false;
1027
1106
  if (work.loaded) {
1028
- const existing = data.tasks.get(task.normalizedFilePath);
1107
+ const name = task.normalizedFilePath;
1108
+ const first = data.first;
1109
+ const existing = first !== undefined && first.normalizedFilePath === name ? first : data.tasks.get(name);
1029
1110
  if (existing !== undefined) {
1030
1111
  task.loadedTask = existing;
1031
1112
  } else {
1032
- data.tasks.set(task.normalizedFilePath, task);
1113
+ data.tasks.set(name, task);
1114
+ data.settled = false;
1033
1115
  // A new casing of a file: load its references if another casing's were.
1034
1116
  startSubTasks = data.startedSubTasks;
1035
1117
  }
1036
1118
  }
1037
1119
  if (data.packageId === undefined && task.packageId !== undefined) data.packageId = task.packageId;
1038
1120
  const depth = task.increaseDepth ? work.depth + 1 : work.depth;
1039
- if (depth < data.lowestDepth) {
1121
+ const lowered = depth < data.lowestDepth;
1122
+ if (lowered) {
1040
1123
  // Reached at a lower depth than before: load references again.
1041
1124
  data.lowestDepth = depth;
1042
1125
  startSubTasks = true;
1043
1126
  data.startedSubTasks = true;
1044
1127
  }
1045
1128
  if (task.elideOnDepth && depth > this.maxNodeModuleJsDepth) return;
1129
+ // Most work reaches a path already loaded, at no lower depth.
1130
+ if (data.settled && !startSubTasks) return;
1046
1131
  for (const taskByFileName of data.tasks.values()) {
1047
1132
  let loadSubTasks = startSubTasks;
1048
1133
  if (!taskByFileName.loaded) {
@@ -1052,11 +1137,23 @@ export class FileLoader {
1052
1137
  data.startedSubTasks = true;
1053
1138
  }
1054
1139
  }
1055
- if (!taskByFileName.startedSubTasks && loadSubTasks) {
1140
+ // A lower depth restarts references already started, which may now be loaded past `maxNodeModuleJsDepth`.
1141
+ // Every file reached from them is at least as deep, so a depth past it changes nothing they load.
1142
+ if (loadSubTasks && ((lowered && depth <= this.maxNodeModuleJsDepth) || !taskByFileName.startedSubTasks)) {
1056
1143
  taskByFileName.startedSubTasks = true;
1057
1144
  if (taskByFileName.subTasks !== undefined) this.start(taskByFileName.subTasks, data.lowestDepth);
1058
1145
  }
1059
1146
  }
1147
+ data.settled = true;
1148
+ }
1149
+
1150
+ /**
1151
+ * Whether `run` drops `work` without loading its file: a JavaScript file past `maxNodeModuleJsDepth`,
1152
+ * which no parse thread prepares, so the walk ahead does not wait for it.
1153
+ */
1154
+ private elides(work: ParseWork): boolean {
1155
+ const task = work.tasks[work.index];
1156
+ return task.elideOnDepth && (task.increaseDepth ? work.depth + 1 : work.depth) > this.maxNodeModuleJsDepth;
1060
1157
  }
1061
1158
 
1062
1159
  /**
@@ -1076,6 +1173,7 @@ export class FileLoader {
1076
1173
  this.loadAutomaticTypeDirectives(task);
1077
1174
  return;
1078
1175
  }
1176
+ if (task.failedLookup) return;
1079
1177
  const redirect = this.mapper.getParseFileRedirect(task.path);
1080
1178
  if (redirect !== '') {
1081
1179
  const redirected = new ParseTask(
@@ -1324,8 +1422,24 @@ export class FileLoader {
1324
1422
  for (let index = 0; index < moduleNames.length; index++) {
1325
1423
  const entry = moduleNames[index];
1326
1424
  const moduleName = getText(entry);
1327
- if (moduleName === '') continue;
1425
+ // A source phase import loads no module declarations.
1426
+ if (moduleName === '' || isSourcePhaseImport(entry.parent!)) continue;
1328
1427
  const mode = getModeForUsageLocation(file.fileName, task.metadata, entry, options);
1428
+ // A module the file declares itself (`declare module "m"`) isn't resolved.
1429
+ if (file.ambientModuleNames.includes(moduleName)) {
1430
+ if (options.traceResolution === true)
1431
+ task
1432
+ .moduleTraces(true)!
1433
+ .push(
1434
+ messageWithArgs(
1435
+ Diagnostics.Module_0_was_resolved_as_locally_declared_ambient_module_in_file_1,
1436
+ moduleName,
1437
+ file.fileName,
1438
+ ),
1439
+ );
1440
+ resolutions.set(modeAwareKey(moduleName, mode), locallyDeclaredModule);
1441
+ continue;
1442
+ }
1329
1443
  const resolved = this.resolver.resolveModuleName(
1330
1444
  moduleName,
1331
1445
  containingFile,
@@ -1392,20 +1506,28 @@ export class FileLoader {
1392
1506
  const redirectFilesByPath = new Map<string, RedirectFile>();
1393
1507
  const packageIdToSourceFile = new Map<string, SourceFile>();
1394
1508
  const checkCasing = this.options.forceConsistentCasingInFileNames !== false;
1395
- const seen = new Map<ParseTaskData, string>();
1396
-
1397
- const collectFiles = (tasks: readonly ParseTask[]): void => {
1509
+ const taskData = this.taskData;
1510
+ // The paths each file's imports and type reference directives add (the tasks of each path), for
1511
+ // `ProcessedFiles.addedFiles`: recorded while collecting visits them, as their files are only known
1512
+ // once every file is collected.
1513
+ const fileData: ParseTaskData[] = [];
1514
+ const libData = new Map<SourceFile, ParseTaskData>();
1515
+ const packageIdToData = new Map<string, ParseTaskData>();
1516
+
1517
+ const collectFiles = (tasks: readonly ParseTask[], added: ParseTaskData[] | undefined): void => {
1398
1518
  for (let task of tasks) {
1399
1519
  const includeReason = task.includeReason;
1520
+ const byImport = task.byImport;
1400
1521
  // Automatic type directive tasks are an implementation detail, not a reason.
1401
1522
  if (task.redirectedParseTask === undefined && !task.isForAutomaticTypeDirective) {
1402
1523
  if (task.loadedTask !== undefined) task = task.loadedTask;
1403
- if (includeReason !== undefined) addIncludeReason(includeProcessor, task, includeReason);
1524
+ if (includeReason !== undefined) addIncludeReason(includeProcessor, taskData, task, includeReason);
1404
1525
  }
1405
- const data = this.taskDataByPath.get(task.path);
1526
+ const data = task.dataIndex >= 0 ? taskData[task.dataIndex] : undefined;
1527
+ if (added !== undefined && data !== undefined && byImport) added.push(data);
1406
1528
  if (!task.loaded || data === undefined) continue;
1407
1529
 
1408
- const checkedName = seen.get(data);
1530
+ const checkedName = data.collectedName;
1409
1531
  if (checkedName !== undefined) {
1410
1532
  // The same name normalizes the same: only another spelling needs comparing.
1411
1533
  if (
@@ -1418,7 +1540,7 @@ export class FileLoader {
1418
1540
  }
1419
1541
  continue;
1420
1542
  }
1421
- seen.set(data, task.normalizedFilePath);
1543
+ data.collectedName = task.normalizedFilePath;
1422
1544
 
1423
1545
  if (tasksSeenByNameIgnoreCase !== undefined) {
1424
1546
  const lowerCasePath = toFileNameLowerCase(task.path);
@@ -1457,13 +1579,18 @@ export class FileLoader {
1457
1579
  ),
1458
1580
  );
1459
1581
  filesByPath.set(task.path, packageIdFile);
1582
+ data.keptCopy = packageIdToData.get(key);
1460
1583
  if (data.lowestDepth > 0) sourceFilesFoundSearchingNodeModules.add(task.path);
1461
1584
  continue;
1462
1585
  }
1463
- if (file !== undefined) packageIdToSourceFile.set(key, file);
1586
+ if (file !== undefined) {
1587
+ packageIdToSourceFile.set(key, file);
1588
+ packageIdToData.set(key, data);
1589
+ }
1464
1590
  }
1465
1591
 
1466
- if (task.subTasks !== undefined && task.subTasks.length > 0) collectFiles(task.subTasks);
1592
+ let own: ParseTaskData[] | undefined = undefined;
1593
+ if (task.subTasks !== undefined && task.subTasks.length > 0) collectFiles(task.subTasks, (own = []));
1467
1594
 
1468
1595
  const redirected = task.redirectedParseTask;
1469
1596
  if (redirected !== undefined) {
@@ -1476,19 +1603,24 @@ export class FileLoader {
1476
1603
  includeProcessor.addProcessingDiagnostic(diagnostic);
1477
1604
  continue;
1478
1605
  }
1479
- const path = task.path;
1480
1606
  for (const diagnostic of task.processingDiagnostics ?? noProcessingDiagnostics)
1481
1607
  includeProcessor.addProcessingDiagnostic(diagnostic);
1482
1608
  if (file === undefined) {
1483
1609
  missingFiles.push(task.normalizedFilePath);
1484
1610
  continue;
1485
1611
  }
1612
+ // The program's maps of the file are keyed by the file's own path: lookups by `file.path` then find
1613
+ // the same string, also for a file a parse thread created, whose path is another string than the task's.
1614
+ const path = file.path === task.path ? file.path : task.path;
1486
1615
  if (task.libFile !== undefined) {
1487
1616
  libFiles.push(file);
1617
+ libData.set(file, data);
1488
1618
  libFilesByPath.set(path, task.libFile);
1489
1619
  } else {
1490
1620
  files.push(file);
1621
+ fileData.push(data);
1491
1622
  }
1623
+ if (own !== undefined) data.added = own;
1492
1624
  filesByPath.set(path, file);
1493
1625
  resolvedModules.set(path, task.resolutionsInFile);
1494
1626
  typeResolutionsInFile.set(path, task.typeResolutionsInFile);
@@ -1500,13 +1632,28 @@ export class FileLoader {
1500
1632
  if (data.lowestDepth > 0) sourceFilesFoundSearchingNodeModules.add(path);
1501
1633
  }
1502
1634
  };
1503
- collectFiles(this.rootTasks);
1635
+ collectFiles(this.rootTasks, undefined);
1504
1636
 
1505
1637
  const priorities = new Map<SourceFile, number>();
1506
1638
  for (const file of libFiles) priorities.set(file, this.libFilePriority(file));
1507
1639
  libFiles.sort((a, b) => (priorities.get(a) ?? 0) - (priorities.get(b) ?? 0));
1508
1640
  const allFiles = [...libFiles, ...files];
1509
1641
  for (const redirect of redirectFilesByPath.values()) redirect.index += libFiles.length;
1642
+ // The files a file adds, without reading its resolutions again or looking up their paths.
1643
+ const dataOfFiles: ParseTaskData[] = [];
1644
+ for (const file of libFiles) dataOfFiles.push(libData.get(file)!);
1645
+ for (const data of fileData) dataOfFiles.push(data);
1646
+ for (let i = 0; i < dataOfFiles.length; i++) dataOfFiles[i]!.index = i;
1647
+ const addedFiles: number[][] = [];
1648
+ for (let i = 0; i < dataOfFiles.length; i++) {
1649
+ const added: number[] = [];
1650
+ for (const data of dataOfFiles[i]!.added) {
1651
+ const kept = data.keptCopy;
1652
+ const k = kept !== undefined ? kept.index : data.index;
1653
+ if (k >= 0 && k !== i) added.push(k);
1654
+ }
1655
+ addedFiles.push(added);
1656
+ }
1510
1657
 
1511
1658
  const keys = [...this.libResolutions.keys()].sort();
1512
1659
  for (const key of keys) {
@@ -1536,6 +1683,7 @@ export class FileLoader {
1536
1683
  redirectFilesByPath,
1537
1684
  this.mapper,
1538
1685
  this.tookPreparedResolutions ? preparedPackageJsonLookups() : noPackageJsonLookups,
1686
+ addedFiles,
1539
1687
  );
1540
1688
  }
1541
1689
  }
@@ -1547,10 +1695,21 @@ export function releaseLater(loader: FileLoader): void {
1547
1695
  setImmediate(() => loader.release());
1548
1696
  }
1549
1697
 
1550
- function addIncludeReason(processor: IncludeProcessor, task: ParseTask, reason: FileIncludeReason): void {
1698
+ function addIncludeReason(
1699
+ processor: IncludeProcessor,
1700
+ taskData: readonly ParseTaskData[],
1701
+ task: ParseTask,
1702
+ reason: FileIncludeReason,
1703
+ ): void {
1551
1704
  const redirected = task.redirectedParseTask;
1552
- if (redirected !== undefined) addIncludeReason(processor, redirected, reason);
1553
- else if (task.loaded) processor.addReason(task.path, reason);
1705
+ if (redirected !== undefined) addIncludeReason(processor, taskData, redirected, reason);
1706
+ else if (task.loaded) {
1707
+ // The path's list, without looking the path up for each reference to the file.
1708
+ const data = task.dataIndex >= 0 ? taskData[task.dataIndex] : undefined;
1709
+ if (data === undefined) processor.addReason(task.path, reason);
1710
+ else if (data.reasons !== undefined) data.reasons.push(reason);
1711
+ else data.reasons = processor.addReason(task.path, reason);
1712
+ }
1554
1713
  }
1555
1714
 
1556
1715
  function createProjectReferenceTasks(paths: readonly string[]): ProjectReferenceTask[] {
@@ -8,18 +8,24 @@ import {
8
8
  buildOptionDeclarations,
9
9
  optionDeclarations,
10
10
  optionsForBuild,
11
- optionsForWatch,
12
11
  sameEnumValue,
13
12
  type OptionDeclaration,
14
13
  } from './option-declarations.js';
15
14
  import type { System } from './tsc-cli.js';
16
15
 
17
- export const version = '7.0.2';
16
+ export const version = '7.1.0-beta';
18
17
 
19
- /** Whether output gets colors: `NO_COLOR` and `FORCE_COLOR` override the TTY check. */
18
+ /**
19
+ * Whether output gets colors. As in Node, a set `FORCE_COLOR` decides: on when empty, `1`, `2`, `3` or `true`, off
20
+ * otherwise. Then `NO_COLOR` or `TERM=dumb` turn colors off, else they follow the TTY check.
21
+ */
20
22
  export function defaultIsPretty(sys: System): boolean {
23
+ if (sys.hasEnvironmentVariable('FORCE_COLOR')) {
24
+ const forceColor = sys.getEnvironmentVariable('FORCE_COLOR');
25
+ return forceColor === '' || forceColor === '1' || forceColor === '2' || forceColor === '3' || forceColor === 'true';
26
+ }
21
27
  if (sys.getEnvironmentVariable('NO_COLOR') !== '') return false;
22
- if (sys.getEnvironmentVariable('FORCE_COLOR') !== '') return true;
28
+ if (sys.getEnvironmentVariable('TERM') === 'dumb') return false;
23
29
  return sys.writeOutputIsTTY;
24
30
  }
25
31
 
@@ -262,16 +268,6 @@ function printAllHelp(writer: HelpWriter, options: readonly OptionDeclaration[])
262
268
  undefined,
263
269
  learnMore(writer),
264
270
  );
265
- out += sectionOutput(
266
- writer,
267
- writer.text(Diagnostics.WATCH_OPTIONS),
268
- optionsForWatch,
269
- false,
270
- writer.text(
271
- Diagnostics.Including_watch_w_will_start_watching_the_current_project_for_the_file_changes_Once_set_you_can_config_watch_mode_with_Colon,
272
- ),
273
- undefined,
274
- );
275
271
  out += sectionOutput(
276
272
  writer,
277
273
  writer.text(Diagnostics.BUILD_OPTIONS),