tsc-ts 0.0.10 → 0.1.1

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 (379) hide show
  1. package/README.md +1 -1
  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 +29 -18
  6. package/dist/api/compiler/ast.js +1040 -1007
  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 +173 -123
  12. package/dist/api/compiler/checker-classes.d.ts +14 -3
  13. package/dist/api/compiler/checker-classes.js +136 -91
  14. package/dist/api/compiler/checker-contextual.d.ts +20 -0
  15. package/dist/api/compiler/checker-contextual.js +175 -62
  16. package/dist/api/compiler/checker-declaration-order.js +79 -79
  17. package/dist/api/compiler/checker-declarations.d.ts +1 -0
  18. package/dist/api/compiler/checker-declarations.js +160 -136
  19. package/dist/api/compiler/checker-declared-types.js +67 -65
  20. package/dist/api/compiler/checker-decorators.js +77 -77
  21. package/dist/api/compiler/checker-deprecation.d.ts +8 -3
  22. package/dist/api/compiler/checker-deprecation.js +76 -55
  23. package/dist/api/compiler/checker-destructuring.js +47 -45
  24. package/dist/api/compiler/checker-elaboration.js +24 -24
  25. package/dist/api/compiler/checker-emit-helpers.js +4 -4
  26. package/dist/api/compiler/checker-emit-resolver.d.ts +4 -2
  27. package/dist/api/compiler/checker-emit-resolver.js +25 -13
  28. package/dist/api/compiler/checker-evaluator.js +9 -9
  29. package/dist/api/compiler/checker-expressions.js +258 -212
  30. package/dist/api/compiler/checker-functions.js +113 -107
  31. package/dist/api/compiler/checker-generated-code.d.ts +0 -11
  32. package/dist/api/compiler/checker-generated-code.js +28 -52
  33. package/dist/api/compiler/checker-grammar.d.ts +1 -0
  34. package/dist/api/compiler/checker-grammar.js +469 -438
  35. package/dist/api/compiler/checker-heritage.js +91 -93
  36. package/dist/api/compiler/checker-inference.d.ts +77 -5
  37. package/dist/api/compiler/checker-inference.js +487 -113
  38. package/dist/api/compiler/checker-iteration.d.ts +0 -10
  39. package/dist/api/compiler/checker-iteration.js +35 -52
  40. package/dist/api/compiler/checker-javascript.js +14 -14
  41. package/dist/api/compiler/checker-jsdoc.d.ts +8 -10
  42. package/dist/api/compiler/checker-jsdoc.js +67 -58
  43. package/dist/api/compiler/checker-jsx.js +107 -89
  44. package/dist/api/compiler/checker-members.d.ts +9 -2
  45. package/dist/api/compiler/checker-members.js +210 -74
  46. package/dist/api/compiler/checker-modules.d.ts +15 -6
  47. package/dist/api/compiler/checker-modules.js +469 -309
  48. package/dist/api/compiler/checker-narrowing.js +273 -189
  49. package/dist/api/compiler/checker-object-literals.js +25 -22
  50. package/dist/api/compiler/checker-operators.js +126 -118
  51. package/dist/api/compiler/checker-overloads.js +27 -27
  52. package/dist/api/compiler/checker-property-access.js +59 -55
  53. package/dist/api/compiler/checker-services.d.ts +1 -0
  54. package/dist/api/compiler/checker-services.js +222 -210
  55. package/dist/api/compiler/checker-signatures.js +65 -49
  56. package/dist/api/compiler/checker-source-file.d.ts +5 -0
  57. package/dist/api/compiler/checker-source-file.js +154 -130
  58. package/dist/api/compiler/checker-statements.js +33 -32
  59. package/dist/api/compiler/checker-super.js +50 -50
  60. package/dist/api/compiler/checker-symbol-types.js +109 -93
  61. package/dist/api/compiler/checker-symbols.d.ts +13 -1
  62. package/dist/api/compiler/checker-symbols.js +264 -149
  63. package/dist/api/compiler/checker-type-factory.d.ts +5 -0
  64. package/dist/api/compiler/checker-type-factory.js +190 -46
  65. package/dist/api/compiler/checker-type-nodes.d.ts +1 -0
  66. package/dist/api/compiler/checker-type-nodes.js +179 -141
  67. package/dist/api/compiler/checker-type-operators.d.ts +2 -0
  68. package/dist/api/compiler/checker-type-operators.js +110 -63
  69. package/dist/api/compiler/checker-types.d.ts +80 -3
  70. package/dist/api/compiler/checker-types.js +121 -2
  71. package/dist/api/compiler/checker-unused.js +114 -118
  72. package/dist/api/compiler/checker-utilities.js +11 -11
  73. package/dist/api/compiler/checker.d.ts +97 -31
  74. package/dist/api/compiler/checker.js +149 -35
  75. package/dist/api/compiler/command-line.d.ts +1 -3
  76. package/dist/api/compiler/command-line.js +47 -44
  77. package/dist/api/compiler/compile-program.d.ts +24 -4
  78. package/dist/api/compiler/compile-program.js +53 -26
  79. package/dist/api/compiler/diagnostic-messages.d.ts +1849 -1774
  80. package/dist/api/compiler/diagnostic-messages.js +128 -122
  81. package/dist/api/compiler/diagnostics.js +7 -7
  82. package/dist/api/compiler/emitter.d.ts +7 -1
  83. package/dist/api/compiler/emitter.js +53 -11
  84. package/dist/api/compiler/expr-record.d.ts +11 -0
  85. package/dist/api/compiler/expr-record.js +53 -0
  86. package/dist/api/compiler/file-include.d.ts +2 -1
  87. package/dist/api/compiler/file-include.js +11 -7
  88. package/dist/api/compiler/file-loader.d.ts +10 -0
  89. package/dist/api/compiler/file-loader.js +138 -41
  90. package/dist/api/compiler/identifier-name.d.ts +9 -0
  91. package/dist/api/compiler/identifier-name.js +10 -0
  92. package/dist/api/compiler/instantiation.d.ts +7 -0
  93. package/dist/api/compiler/instantiation.js +101 -49
  94. package/dist/api/compiler/jsdoc.js +27 -25
  95. package/dist/api/compiler/link-tables.d.ts +48 -18
  96. package/dist/api/compiler/link-tables.js +80 -37
  97. package/dist/api/compiler/locales/cs-CZ.d.ts +1 -1
  98. package/dist/api/compiler/locales/cs-CZ.js +1 -1
  99. package/dist/api/compiler/locales/de-DE.d.ts +1 -1
  100. package/dist/api/compiler/locales/de-DE.js +1 -1
  101. package/dist/api/compiler/locales/es-ES.d.ts +1 -1
  102. package/dist/api/compiler/locales/es-ES.js +1 -1
  103. package/dist/api/compiler/locales/fr-FR.d.ts +1 -1
  104. package/dist/api/compiler/locales/fr-FR.js +1 -1
  105. package/dist/api/compiler/locales/it-IT.d.ts +1 -1
  106. package/dist/api/compiler/locales/it-IT.js +1 -1
  107. package/dist/api/compiler/locales/ja-JP.d.ts +1 -1
  108. package/dist/api/compiler/locales/ja-JP.js +1 -1
  109. package/dist/api/compiler/locales/ko-KR.d.ts +1 -1
  110. package/dist/api/compiler/locales/ko-KR.js +1 -1
  111. package/dist/api/compiler/locales/pl-PL.d.ts +1 -1
  112. package/dist/api/compiler/locales/pl-PL.js +1 -1
  113. package/dist/api/compiler/locales/pt-BR.d.ts +1 -1
  114. package/dist/api/compiler/locales/pt-BR.js +1 -1
  115. package/dist/api/compiler/locales/ru-RU.d.ts +1 -1
  116. package/dist/api/compiler/locales/ru-RU.js +1 -1
  117. package/dist/api/compiler/locales/tr-TR.d.ts +1 -1
  118. package/dist/api/compiler/locales/tr-TR.js +1 -1
  119. package/dist/api/compiler/locales/zh-CN.d.ts +1 -1
  120. package/dist/api/compiler/locales/zh-CN.js +1 -1
  121. package/dist/api/compiler/locales/zh-TW.d.ts +1 -1
  122. package/dist/api/compiler/locales/zh-TW.js +1 -1
  123. package/dist/api/compiler/module-resolution-types.js +6 -6
  124. package/dist/api/compiler/module-resolution.d.ts +10 -1
  125. package/dist/api/compiler/module-resolution.js +115 -84
  126. package/dist/api/compiler/module-specifiers.d.ts +15 -0
  127. package/dist/api/compiler/module-specifiers.js +24 -18
  128. package/dist/api/compiler/name-resolver.js +74 -65
  129. package/dist/api/compiler/node-builder-names.d.ts +11 -3
  130. package/dist/api/compiler/node-builder-names.js +210 -90
  131. package/dist/api/compiler/node-builder-pseudo.js +29 -31
  132. package/dist/api/compiler/node-builder-reuse.js +23 -22
  133. package/dist/api/compiler/node-builder.d.ts +18 -1
  134. package/dist/api/compiler/node-builder.js +191 -102
  135. package/dist/api/compiler/option-declarations.d.ts +2 -6
  136. package/dist/api/compiler/option-declarations.js +315 -375
  137. package/dist/api/compiler/options.d.ts +15 -33
  138. package/dist/api/compiler/options.js +21 -54
  139. package/dist/api/compiler/output-paths.d.ts +4 -1
  140. package/dist/api/compiler/output-paths.js +6 -11
  141. package/dist/api/compiler/package-json.d.ts +3 -3
  142. package/dist/api/compiler/package-json.js +11 -10
  143. package/dist/api/compiler/parser.d.ts +42 -20
  144. package/dist/api/compiler/parser.js +318 -224
  145. package/dist/api/compiler/path.d.ts +9 -0
  146. package/dist/api/compiler/path.js +20 -3
  147. package/dist/api/compiler/printer/emit-context.d.ts +3 -1
  148. package/dist/api/compiler/printer/emit-context.js +16 -1
  149. package/dist/api/compiler/printer/factory-base.d.ts +2 -2
  150. package/dist/api/compiler/printer/factory-base.js +7 -3
  151. package/dist/api/compiler/printer/factory.js +6 -3
  152. package/dist/api/compiler/printer/helpers.js +10 -1
  153. package/dist/api/compiler/printer/name-generator.d.ts +1 -1
  154. package/dist/api/compiler/printer/name-generator.js +35 -16
  155. package/dist/api/compiler/printer/printer.d.ts +1 -0
  156. package/dist/api/compiler/printer/printer.js +306 -283
  157. package/dist/api/compiler/printer/utilities.js +149 -147
  158. package/dist/api/compiler/program-checker.d.ts +8 -2
  159. package/dist/api/compiler/program-checker.js +84 -34
  160. package/dist/api/compiler/program-utilities.d.ts +3 -1
  161. package/dist/api/compiler/program-utilities.js +28 -15
  162. package/dist/api/compiler/program.d.ts +2 -0
  163. package/dist/api/compiler/program.js +69 -57
  164. package/dist/api/compiler/pseudo-bigint.d.ts +2 -0
  165. package/dist/api/compiler/pseudo-bigint.js +18 -0
  166. package/dist/api/compiler/regexp-checker.d.ts +1 -1
  167. package/dist/api/compiler/regexp-checker.js +93 -76
  168. package/dist/api/compiler/relations.d.ts +27 -4
  169. package/dist/api/compiler/relations.js +337 -180
  170. package/dist/api/compiler/reparser.js +64 -59
  171. package/dist/api/compiler/scanner.d.ts +27 -2
  172. package/dist/api/compiler/scanner.js +181 -150
  173. package/dist/api/compiler/shared-results.d.ts +696 -0
  174. package/dist/api/compiler/shared-results.js +2905 -0
  175. package/dist/api/compiler/sourcemap.js +2 -2
  176. package/dist/api/compiler/symbol-accessibility.js +87 -74
  177. package/dist/api/compiler/symbol.d.ts +22 -13
  178. package/dist/api/compiler/symbol.js +15 -1
  179. package/dist/api/compiler/syntax-kind.d.ts +198 -197
  180. package/dist/api/compiler/transformers/alias-references.js +247 -139
  181. package/dist/api/compiler/transformers/async-utilities.js +25 -25
  182. package/dist/api/compiler/transformers/async.d.ts +0 -1
  183. package/dist/api/compiler/transformers/async.js +64 -77
  184. package/dist/api/compiler/transformers/class-fields.d.ts +1 -0
  185. package/dist/api/compiler/transformers/class-fields.js +81 -78
  186. package/dist/api/compiler/transformers/commonjs-module.js +18 -15
  187. package/dist/api/compiler/transformers/const-enum-inliner.js +1 -1
  188. package/dist/api/compiler/transformers/declarations-diagnostics.js +247 -244
  189. package/dist/api/compiler/transformers/declarations-pseudo.js +100 -100
  190. package/dist/api/compiler/transformers/declarations-resolver.d.ts +0 -3
  191. package/dist/api/compiler/transformers/declarations-syntactic.d.ts +1 -2
  192. package/dist/api/compiler/transformers/declarations-syntactic.js +134 -156
  193. package/dist/api/compiler/transformers/declarations-tracker.js +18 -18
  194. package/dist/api/compiler/transformers/declarations.d.ts +4 -1
  195. package/dist/api/compiler/transformers/declarations.js +307 -239
  196. package/dist/api/compiler/transformers/decorator-metadata.d.ts +1 -1
  197. package/dist/api/compiler/transformers/decorator-metadata.js +53 -45
  198. package/dist/api/compiler/transformers/decorator-utilities.js +24 -24
  199. package/dist/api/compiler/transformers/destructuring.js +19 -18
  200. package/dist/api/compiler/transformers/emit-resolver.js +1 -1
  201. package/dist/api/compiler/transformers/es-decorators.js +55 -55
  202. package/dist/api/compiler/transformers/external-module-info.js +3 -3
  203. package/dist/api/compiler/transformers/for-await.js +25 -25
  204. package/dist/api/compiler/transformers/import-elision.js +14 -14
  205. package/dist/api/compiler/transformers/jsx.js +12 -12
  206. package/dist/api/compiler/transformers/legacy-decorators.js +17 -17
  207. package/dist/api/compiler/transformers/module.js +8 -8
  208. package/dist/api/compiler/transformers/named-evaluation.js +4 -4
  209. package/dist/api/compiler/transformers/object-rest-spread.js +20 -20
  210. package/dist/api/compiler/transformers/optional-chain.js +10 -10
  211. package/dist/api/compiler/transformers/reference-resolver.d.ts +12 -1
  212. package/dist/api/compiler/transformers/reference-resolver.js +131 -69
  213. package/dist/api/compiler/transformers/runtime-syntax.js +35 -31
  214. package/dist/api/compiler/transformers/subtree-facts.js +47 -47
  215. package/dist/api/compiler/transformers/syntax-facts.js +56 -58
  216. package/dist/api/compiler/transformers/type-eraser.js +73 -66
  217. package/dist/api/compiler/transformers/type-serialization.js +24 -24
  218. package/dist/api/compiler/transformers/using.js +12 -12
  219. package/dist/api/compiler/transformers/utilities.js +77 -77
  220. package/dist/api/compiler/transformers/visitor-base.js +172 -172
  221. package/dist/api/compiler/transformers/visitor-hooks.js +6 -2
  222. package/dist/api/compiler/tsconfig.d.ts +10 -2
  223. package/dist/api/compiler/tsconfig.js +136 -48
  224. package/dist/api/compiler/type-printer.js +40 -3
  225. package/dist/api/compiler/types.d.ts +2 -1
  226. package/dist/api/library/ast.generated.d.ts +42 -39
  227. package/dist/api/library/ast.generated.js +1 -1
  228. package/dist/api/library/compiler-options.generated.d.ts +111 -100
  229. package/dist/api/library/compiler-options.generated.js +1 -1
  230. package/dist/api/library/disk.js +12 -1
  231. package/dist/api/library/enums.generated.d.ts +206 -206
  232. package/dist/api/library/enums.generated.js +206 -206
  233. package/dist/api/library/nodes.js +26 -26
  234. package/package.json +9 -9
  235. package/src/compiler/ast-utilities.ts +99 -7
  236. package/src/compiler/ast.ts +74 -38
  237. package/src/compiler/binder.ts +39 -4
  238. package/src/compiler/cgroup.ts +157 -0
  239. package/src/compiler/character-codes.ts +2 -2
  240. package/src/compiler/checker-calls.ts +76 -8
  241. package/src/compiler/checker-classes.ts +80 -25
  242. package/src/compiler/checker-contextual.ts +110 -1
  243. package/src/compiler/checker-declarations.ts +31 -4
  244. package/src/compiler/checker-declared-types.ts +8 -5
  245. package/src/compiler/checker-decorators.ts +1 -1
  246. package/src/compiler/checker-deprecation.ts +29 -8
  247. package/src/compiler/checker-destructuring.ts +10 -3
  248. package/src/compiler/checker-emit-helpers.ts +1 -0
  249. package/src/compiler/checker-emit-resolver.ts +16 -6
  250. package/src/compiler/checker-expressions.ts +95 -47
  251. package/src/compiler/checker-functions.ts +21 -6
  252. package/src/compiler/checker-generated-code.ts +2 -22
  253. package/src/compiler/checker-grammar.ts +133 -60
  254. package/src/compiler/checker-heritage.ts +22 -21
  255. package/src/compiler/checker-inference.ts +514 -87
  256. package/src/compiler/checker-iteration.ts +18 -31
  257. package/src/compiler/checker-javascript.ts +1 -1
  258. package/src/compiler/checker-jsdoc.ts +50 -27
  259. package/src/compiler/checker-jsx.ts +28 -5
  260. package/src/compiler/checker-members.ts +197 -55
  261. package/src/compiler/checker-modules.ts +332 -65
  262. package/src/compiler/checker-narrowing.ts +98 -19
  263. package/src/compiler/checker-object-literals.ts +3 -0
  264. package/src/compiler/checker-operators.ts +11 -4
  265. package/src/compiler/checker-property-access.ts +7 -2
  266. package/src/compiler/checker-services.ts +39 -12
  267. package/src/compiler/checker-signatures.ts +15 -1
  268. package/src/compiler/checker-source-file.ts +39 -13
  269. package/src/compiler/checker-statements.ts +3 -2
  270. package/src/compiler/checker-symbol-types.ts +29 -6
  271. package/src/compiler/checker-symbols.ts +158 -15
  272. package/src/compiler/checker-type-factory.ts +173 -35
  273. package/src/compiler/checker-type-nodes.ts +46 -3
  274. package/src/compiler/checker-type-operators.ts +83 -26
  275. package/src/compiler/checker-types.ts +147 -4
  276. package/src/compiler/checker-unused.ts +9 -14
  277. package/src/compiler/checker.ts +175 -41
  278. package/src/compiler/command-line.ts +28 -28
  279. package/src/compiler/compile-program.ts +59 -25
  280. package/src/compiler/decoder.ts +15 -5
  281. package/src/compiler/diagnostic-messages.ts +1973 -1892
  282. package/src/compiler/doctor-report.ts +133 -0
  283. package/src/compiler/emitter.ts +57 -8
  284. package/src/compiler/encoder.ts +23 -8
  285. package/src/compiler/expr-record.ts +59 -0
  286. package/src/compiler/file-include.ts +9 -3
  287. package/src/compiler/file-loader.ts +139 -32
  288. package/src/compiler/help.ts +10 -14
  289. package/src/compiler/identifier-name.ts +13 -0
  290. package/src/compiler/incremental.ts +86 -18
  291. package/src/compiler/init.ts +2 -7
  292. package/src/compiler/instantiation.ts +77 -22
  293. package/src/compiler/jsdoc.ts +7 -3
  294. package/src/compiler/link-tables.ts +82 -37
  295. package/src/compiler/locales/cs-CZ.ts +1 -1
  296. package/src/compiler/locales/de-DE.ts +1 -1
  297. package/src/compiler/locales/es-ES.ts +1 -1
  298. package/src/compiler/locales/fr-FR.ts +1 -1
  299. package/src/compiler/locales/it-IT.ts +1 -1
  300. package/src/compiler/locales/ja-JP.ts +1 -1
  301. package/src/compiler/locales/ko-KR.ts +1 -1
  302. package/src/compiler/locales/pl-PL.ts +1 -1
  303. package/src/compiler/locales/pt-BR.ts +1 -1
  304. package/src/compiler/locales/ru-RU.ts +1 -1
  305. package/src/compiler/locales/tr-TR.ts +1 -1
  306. package/src/compiler/locales/zh-CN.ts +1 -1
  307. package/src/compiler/locales/zh-TW.ts +1 -1
  308. package/src/compiler/module-resolution.ts +44 -8
  309. package/src/compiler/module-specifiers.ts +62 -20
  310. package/src/compiler/name-resolver.ts +9 -1
  311. package/src/compiler/node-builder-names.ts +236 -54
  312. package/src/compiler/node-builder-pseudo.ts +4 -7
  313. package/src/compiler/node-builder-reuse.ts +5 -4
  314. package/src/compiler/node-builder.ts +130 -31
  315. package/src/compiler/option-declarations.ts +33 -103
  316. package/src/compiler/options.ts +23 -62
  317. package/src/compiler/output-paths.ts +5 -18
  318. package/src/compiler/package-entrypoints.ts +345 -0
  319. package/src/compiler/package-json.ts +4 -4
  320. package/src/compiler/parallel-check.ts +543 -147
  321. package/src/compiler/parallel-emit.ts +4 -4
  322. package/src/compiler/parser.ts +166 -47
  323. package/src/compiler/path.ts +22 -2
  324. package/src/compiler/printer/emit-context.ts +16 -0
  325. package/src/compiler/printer/factory-base.ts +10 -3
  326. package/src/compiler/printer/factory.ts +7 -3
  327. package/src/compiler/printer/helpers.ts +10 -1
  328. package/src/compiler/printer/name-generator.ts +24 -2
  329. package/src/compiler/printer/printer.ts +39 -16
  330. package/src/compiler/printer/utilities.ts +8 -2
  331. package/src/compiler/program-checker.ts +53 -5
  332. package/src/compiler/program-utilities.ts +23 -10
  333. package/src/compiler/program.ts +13 -1
  334. package/src/compiler/pseudo-bigint.ts +17 -0
  335. package/src/compiler/regexp-checker.ts +63 -30
  336. package/src/compiler/relations.ts +233 -77
  337. package/src/compiler/reparser.ts +14 -5
  338. package/src/compiler/run-config.ts +1383 -0
  339. package/src/compiler/run-record-read.ts +87 -0
  340. package/src/compiler/run-records.ts +575 -0
  341. package/src/compiler/scanner.ts +166 -120
  342. package/src/compiler/shared-results.ts +3144 -0
  343. package/src/compiler/show-config.ts +18 -1
  344. package/src/compiler/sourcemap.ts +2 -2
  345. package/src/compiler/symbol-accessibility.ts +26 -3
  346. package/src/compiler/symbol.ts +31 -14
  347. package/src/compiler/syntax-kind.ts +188 -187
  348. package/src/compiler/thread-entry.ts +22 -3
  349. package/src/compiler/transformers/alias-references.ts +123 -4
  350. package/src/compiler/transformers/async.ts +2 -17
  351. package/src/compiler/transformers/class-fields.ts +13 -12
  352. package/src/compiler/transformers/commonjs-module.ts +11 -7
  353. package/src/compiler/transformers/declarations-diagnostics.ts +5 -3
  354. package/src/compiler/transformers/declarations-pseudo.ts +2 -4
  355. package/src/compiler/transformers/declarations-resolver.ts +0 -3
  356. package/src/compiler/transformers/declarations-syntactic.ts +1 -21
  357. package/src/compiler/transformers/declarations.ts +136 -49
  358. package/src/compiler/transformers/decorator-metadata.ts +9 -1
  359. package/src/compiler/transformers/destructuring.ts +4 -3
  360. package/src/compiler/transformers/external-module-info.ts +1 -1
  361. package/src/compiler/transformers/jsx.ts +2 -1
  362. package/src/compiler/transformers/reference-resolver.ts +83 -19
  363. package/src/compiler/transformers/runtime-syntax.ts +6 -1
  364. package/src/compiler/transformers/syntax-facts.ts +2 -7
  365. package/src/compiler/transformers/type-eraser.ts +10 -1
  366. package/src/compiler/transformers/type-serialization.ts +3 -2
  367. package/src/compiler/transformers/visitor-base.ts +2 -1
  368. package/src/compiler/transformers/visitor-hooks.ts +9 -4
  369. package/src/compiler/tsc-build.ts +67 -6
  370. package/src/compiler/tsc-cli.ts +35 -4
  371. package/src/compiler/tsc-compile.ts +220 -10
  372. package/src/compiler/tsc-watch.ts +97 -47
  373. package/src/compiler/tsconfig.ts +176 -19
  374. package/src/compiler/type-printer.ts +36 -2
  375. package/src/compiler/types.ts +2 -1
  376. package/src/library/ast.generated.ts +57 -41
  377. package/src/library/compiler-options.generated.ts +117 -103
  378. package/src/library/disk.ts +10 -1
  379. 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,8 @@ 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;
259
268
  /** Whether an import or a type reference directive adds the file (`ProcessedFiles.addedFiles`). */
260
269
  readonly byImport: boolean;
261
270
 
@@ -303,9 +312,30 @@ class ParseTask {
303
312
 
304
313
  const noData: readonly ParseTaskData[] = [];
305
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
+
306
327
  /** The tasks of one path, by file name casing. */
307
328
  class ParseTaskData {
308
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;
309
339
  lowestDepth = Number.MAX_SAFE_INTEGER;
310
340
  startedSubTasks = false;
311
341
  packageId: PackageId | undefined = undefined;
@@ -315,10 +345,10 @@ class ParseTaskData {
315
345
  keptCopy: ParseTaskData | undefined = undefined;
316
346
  /** The paths the file's imports and type reference directives add, once collected. */
317
347
  added: readonly ParseTaskData[] = noData;
318
-
319
- constructor(task: ParseTask) {
320
- this.tasks.set(task.normalizedFilePath, task);
321
- }
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;
322
352
  }
323
353
 
324
354
  /** Pending processing of `tasks[index]`. */
@@ -477,7 +507,7 @@ export function needsImportHelpersImportSpecifier(file: SourceFile, options: Com
477
507
 
478
508
  /** The module `file` imports the JSX runtime from under `options`, or '' if it imports none. */
479
509
  export function jsxRuntimeImportOf(file: SourceFile, options: CompilerOptions): string {
480
- if (file.scriptKind !== ScriptKind.JSX && file.scriptKind !== ScriptKind.TSX) return '';
510
+ if (!isSourceFileJS(file) && file.scriptKind !== ScriptKind.TSX) return '';
481
511
  return getJSXRuntimeImport(getJSXImplicitImportBase(options, file), options);
482
512
  }
483
513
 
@@ -557,7 +587,10 @@ export class FileLoader {
557
587
  private readonly supportedExtensionsWithJson: readonly (readonly string[])[];
558
588
  private readonly maxNodeModuleJsDepth: number;
559
589
  private readonly rootTasks: ParseTask[] = [];
560
- 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>();
561
594
  /** Work queued by `start`, run last-in first-out like tsgo's single-threaded work group. */
562
595
  private readonly work: ParseWork[] = [];
563
596
  private readonly libFileCache = new Map<string, LibFile>();
@@ -627,7 +660,11 @@ export class FileLoader {
627
660
  const loaded = prepared.loaded;
628
661
  if (loaded === undefined) continue;
629
662
  const subTasks = this.subTasksOf(loaded);
630
- 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
+ }
631
668
  this.subTasksAhead.set(prepared.fileName, new SubTasksAhead(loaded, subTasks));
632
669
  }
633
670
  }
@@ -705,7 +742,7 @@ export class FileLoader {
705
742
 
706
743
  private walk(): void {
707
744
  for (let work = this.work.pop(); work !== undefined; work = this.work.pop()) {
708
- 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)) {
709
746
  this.work.push(work);
710
747
  return;
711
748
  }
@@ -721,6 +758,7 @@ export class FileLoader {
721
758
  */
722
759
  release(): void {
723
760
  this.rootTasks.length = 0;
761
+ this.taskData.length = 0;
724
762
  this.taskDataByPath.clear();
725
763
  this.work.length = 0;
726
764
  this.subTasksAhead.clear();
@@ -900,6 +938,7 @@ export class FileLoader {
900
938
  return;
901
939
  }
902
940
  const task = new ParseTask(absolute, undefined, reason, false, false, false, undefined);
941
+ task.failedLookup = true;
903
942
  task.addProcessingDiagnostic(
904
943
  ProcessingDiagnostic.explainingFileInclude('', reason, resolved.message, resolved.args),
905
944
  );
@@ -926,6 +965,8 @@ export class FileLoader {
926
965
  ): string | ReferenceDiagnostic {
927
966
  const allowNonTsExtensions = this.options.allowNonTsExtensions === true;
928
967
  const diagnosticFileName = normalizeSlashes(referenceText);
968
+ if (isNetworkPath(fileName))
969
+ return new ReferenceDiagnostic(Diagnostics.Network_path_0_is_not_supported, [diagnosticFileName]);
929
970
  const fs = this.host.fs;
930
971
  if (hasExtension(fileName)) {
931
972
  const canonicalFileName = getCanonicalFileName(fileName, fs.useCaseSensitiveFileNames);
@@ -1026,43 +1067,67 @@ export class FileLoader {
1026
1067
  // ---- Loading
1027
1068
 
1028
1069
  private start(tasks: ParseTask[], depth: number): void {
1070
+ const taskData = this.taskData;
1029
1071
  for (let i = 0; i < tasks.length; i++) {
1030
1072
  const task = tasks[i];
1031
- // Sub-tasks built ahead have their paths.
1032
- if (task.path === '') task.path = this.toPath(task.normalizedFilePath);
1033
- let data = this.taskDataByPath.get(task.path);
1034
- const loaded = data !== undefined;
1035
- if (data === undefined) {
1036
- data = new ParseTaskData(task);
1037
- 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);
1038
1086
  }
1039
1087
  this.work.push(new ParseWork(tasks, i, data, loaded, depth));
1040
1088
  }
1041
1089
  }
1042
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
+
1043
1102
  private run(work: ParseWork): void {
1044
1103
  const task = work.tasks[work.index];
1045
1104
  const data = work.data;
1046
1105
  let startSubTasks = false;
1047
1106
  if (work.loaded) {
1048
- 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);
1049
1110
  if (existing !== undefined) {
1050
1111
  task.loadedTask = existing;
1051
1112
  } else {
1052
- data.tasks.set(task.normalizedFilePath, task);
1113
+ data.tasks.set(name, task);
1114
+ data.settled = false;
1053
1115
  // A new casing of a file: load its references if another casing's were.
1054
1116
  startSubTasks = data.startedSubTasks;
1055
1117
  }
1056
1118
  }
1057
1119
  if (data.packageId === undefined && task.packageId !== undefined) data.packageId = task.packageId;
1058
1120
  const depth = task.increaseDepth ? work.depth + 1 : work.depth;
1059
- if (depth < data.lowestDepth) {
1121
+ const lowered = depth < data.lowestDepth;
1122
+ if (lowered) {
1060
1123
  // Reached at a lower depth than before: load references again.
1061
1124
  data.lowestDepth = depth;
1062
1125
  startSubTasks = true;
1063
1126
  data.startedSubTasks = true;
1064
1127
  }
1065
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;
1066
1131
  for (const taskByFileName of data.tasks.values()) {
1067
1132
  let loadSubTasks = startSubTasks;
1068
1133
  if (!taskByFileName.loaded) {
@@ -1072,11 +1137,23 @@ export class FileLoader {
1072
1137
  data.startedSubTasks = true;
1073
1138
  }
1074
1139
  }
1075
- 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)) {
1076
1143
  taskByFileName.startedSubTasks = true;
1077
1144
  if (taskByFileName.subTasks !== undefined) this.start(taskByFileName.subTasks, data.lowestDepth);
1078
1145
  }
1079
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;
1080
1157
  }
1081
1158
 
1082
1159
  /**
@@ -1096,6 +1173,7 @@ export class FileLoader {
1096
1173
  this.loadAutomaticTypeDirectives(task);
1097
1174
  return;
1098
1175
  }
1176
+ if (task.failedLookup) return;
1099
1177
  const redirect = this.mapper.getParseFileRedirect(task.path);
1100
1178
  if (redirect !== '') {
1101
1179
  const redirected = new ParseTask(
@@ -1344,8 +1422,24 @@ export class FileLoader {
1344
1422
  for (let index = 0; index < moduleNames.length; index++) {
1345
1423
  const entry = moduleNames[index];
1346
1424
  const moduleName = getText(entry);
1347
- if (moduleName === '') continue;
1425
+ // A source phase import loads no module declarations.
1426
+ if (moduleName === '' || isSourcePhaseImport(entry.parent!)) continue;
1348
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
+ }
1349
1443
  const resolved = this.resolver.resolveModuleName(
1350
1444
  moduleName,
1351
1445
  containingFile,
@@ -1412,7 +1506,7 @@ export class FileLoader {
1412
1506
  const redirectFilesByPath = new Map<string, RedirectFile>();
1413
1507
  const packageIdToSourceFile = new Map<string, SourceFile>();
1414
1508
  const checkCasing = this.options.forceConsistentCasingInFileNames !== false;
1415
- const seen = new Map<ParseTaskData, string>();
1509
+ const taskData = this.taskData;
1416
1510
  // The paths each file's imports and type reference directives add (the tasks of each path), for
1417
1511
  // `ProcessedFiles.addedFiles`: recorded while collecting visits them, as their files are only known
1418
1512
  // once every file is collected.
@@ -1427,13 +1521,13 @@ export class FileLoader {
1427
1521
  // Automatic type directive tasks are an implementation detail, not a reason.
1428
1522
  if (task.redirectedParseTask === undefined && !task.isForAutomaticTypeDirective) {
1429
1523
  if (task.loadedTask !== undefined) task = task.loadedTask;
1430
- if (includeReason !== undefined) addIncludeReason(includeProcessor, task, includeReason);
1524
+ if (includeReason !== undefined) addIncludeReason(includeProcessor, taskData, task, includeReason);
1431
1525
  }
1432
- const data = this.taskDataByPath.get(task.path);
1526
+ const data = task.dataIndex >= 0 ? taskData[task.dataIndex] : undefined;
1433
1527
  if (added !== undefined && data !== undefined && byImport) added.push(data);
1434
1528
  if (!task.loaded || data === undefined) continue;
1435
1529
 
1436
- const checkedName = seen.get(data);
1530
+ const checkedName = data.collectedName;
1437
1531
  if (checkedName !== undefined) {
1438
1532
  // The same name normalizes the same: only another spelling needs comparing.
1439
1533
  if (
@@ -1446,7 +1540,7 @@ export class FileLoader {
1446
1540
  }
1447
1541
  continue;
1448
1542
  }
1449
- seen.set(data, task.normalizedFilePath);
1543
+ data.collectedName = task.normalizedFilePath;
1450
1544
 
1451
1545
  if (tasksSeenByNameIgnoreCase !== undefined) {
1452
1546
  const lowerCasePath = toFileNameLowerCase(task.path);
@@ -1509,13 +1603,15 @@ export class FileLoader {
1509
1603
  includeProcessor.addProcessingDiagnostic(diagnostic);
1510
1604
  continue;
1511
1605
  }
1512
- const path = task.path;
1513
1606
  for (const diagnostic of task.processingDiagnostics ?? noProcessingDiagnostics)
1514
1607
  includeProcessor.addProcessingDiagnostic(diagnostic);
1515
1608
  if (file === undefined) {
1516
1609
  missingFiles.push(task.normalizedFilePath);
1517
1610
  continue;
1518
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;
1519
1615
  if (task.libFile !== undefined) {
1520
1616
  libFiles.push(file);
1521
1617
  libData.set(file, data);
@@ -1599,10 +1695,21 @@ export function releaseLater(loader: FileLoader): void {
1599
1695
  setImmediate(() => loader.release());
1600
1696
  }
1601
1697
 
1602
- 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 {
1603
1704
  const redirected = task.redirectedParseTask;
1604
- if (redirected !== undefined) addIncludeReason(processor, redirected, reason);
1605
- 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
+ }
1606
1713
  }
1607
1714
 
1608
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),
@@ -0,0 +1,13 @@
1
+ import type { ProgramLifetime } from '@scriptc/types';
2
+
3
+ /**
4
+ * The text of an identifier. The identifiers a parser's scanner interns with the same text share one
5
+ * (scanner.ts `IdentifierTable`), and natively an identifier refers to it in 4 bytes.
6
+ */
7
+ export class IdentifierName implements ProgramLifetime {
8
+ readonly text: string;
9
+
10
+ constructor(text: string) {
11
+ this.text = text;
12
+ }
13
+ }
@@ -41,6 +41,7 @@ import {
41
41
  modeMismatchDetails,
42
42
  moduleNotFoundDetails,
43
43
  resolveExternalModuleName,
44
+ getImportAttributesTypeForModuleSpecifier,
44
45
  } from './checker-modules.js';
45
46
  import { getSymbolAtLocation } from './checker-services.js';
46
47
  import { resolveAlias } from './checker-symbols.js';
@@ -1231,7 +1232,17 @@ function addOwnReferencedFiles(checked: CheckedProgram, file: SourceFile, refere
1231
1232
  // call that does not initialize a variable (`exports.a = require("./a").a`), so its build info leaves out that
1232
1233
  // module and its incremental builds keep outputs that depend on it.
1233
1234
  for (const importName of file.imports) {
1234
- addReferencedFilesFromSymbol(file, referenced, resolveExternalModuleName(checker, importName, importName, true));
1235
+ addReferencedFilesFromSymbol(
1236
+ file,
1237
+ referenced,
1238
+ resolveExternalModuleName(
1239
+ checker,
1240
+ importName,
1241
+ importName,
1242
+ true,
1243
+ getImportAttributesTypeForModuleSpecifier(checker, importName),
1244
+ ),
1245
+ );
1235
1246
  }
1236
1247
  const sourceFileDirectory = getDirectoryPath(file.fileName);
1237
1248
  for (const reference of file.referencedFiles) {
@@ -1275,9 +1286,16 @@ function programToSnapshot(checked: CheckedProgram, oldSnapshot: Snapshot | unde
1275
1286
  // Reuse from the old state.
1276
1287
  if (oldSnapshot !== undefined) {
1277
1288
  if (options.composite === true) snapshot.latestChangedDtsFile = oldSnapshot.latestChangedDtsFile;
1278
- for (const path of oldSnapshot.changedFilesSet) snapshot.changedFilesSet.add(path);
1279
- for (const [path, kind] of oldSnapshot.affectedFilesPendingEmit) snapshot.affectedFilesPendingEmit.set(path, kind);
1280
1289
  snapshot.buildInfoEmitPending = oldSnapshot.buildInfoEmitPending;
1290
+ // Changes and pending emit of files no longer in the program are dropped, which changes the build info.
1291
+ for (const path of oldSnapshot.changedFilesSet) {
1292
+ if (program.getSourceFileByPath(path) !== undefined) snapshot.changedFilesSet.add(path);
1293
+ else snapshot.buildInfoEmitPending = true;
1294
+ }
1295
+ for (const [path, kind] of oldSnapshot.affectedFilesPendingEmit) {
1296
+ if (program.getSourceFileByPath(path) !== undefined) snapshot.affectedFilesPendingEmit.set(path, kind);
1297
+ else snapshot.buildInfoEmitPending = true;
1298
+ }
1281
1299
  snapshot.hasErrorsFromOldState = oldSnapshot.hasErrors;
1282
1300
  snapshot.hasSemanticErrorsFromOldState = oldSnapshot.hasSemanticErrors;
1283
1301
  const oldPackageJsons = oldSnapshot.packageJsons;
@@ -1425,13 +1443,23 @@ function programToSnapshot(checked: CheckedProgram, oldSnapshot: Snapshot | unde
1425
1443
  if (oldSnapshot !== undefined) {
1426
1444
  for (const [path, oldInfo] of oldSnapshot.fileInfos) {
1427
1445
  if (snapshot.fileInfos.has(path)) continue;
1428
- if (oldInfo.affectsGlobalScope) {
1429
- for (const file of snapshot.getAllFilesExcludingDefaultLibraryFile(program, undefined)) {
1430
- snapshot.addFileToChangeSet(file.path);
1431
- }
1432
- globalFileRemoved = true;
1433
- } else snapshot.buildInfoEmitPending = true;
1434
- break;
1446
+ snapshot.buildInfoEmitPending = true;
1447
+ snapshot.changedFilesSet.delete(path);
1448
+ snapshot.affectedFilesPendingEmit.delete(path);
1449
+ if (oldInfo.affectsGlobalScope) globalFileRemoved = true;
1450
+ }
1451
+ if (globalFileRemoved) invalidateGlobalScope(checked, snapshot);
1452
+ }
1453
+
1454
+ // A file that no longer affects the global scope changes it as its removal would.
1455
+ if (oldSnapshot !== undefined && !globalFileRemoved) {
1456
+ for (const [path, oldInfo] of oldSnapshot.fileInfos) {
1457
+ if (!oldInfo.affectsGlobalScope) continue;
1458
+ const info = snapshot.fileInfos.get(path);
1459
+ if (info !== undefined && !info.affectsGlobalScope) {
1460
+ invalidateGlobalScope(checked, snapshot);
1461
+ break;
1462
+ }
1435
1463
  }
1436
1464
  }
1437
1465
 
@@ -1460,6 +1488,19 @@ function programToSnapshot(checked: CheckedProgram, oldSnapshot: Snapshot | unde
1460
1488
  return snapshot;
1461
1489
  }
1462
1490
 
1491
+ /**
1492
+ * After a change to the global scope, every file but the default libraries is changed, and the default
1493
+ * libraries that are checked are checked again.
1494
+ */
1495
+ function invalidateGlobalScope(checked: CheckedProgram, snapshot: Snapshot): void {
1496
+ const program = checked.program;
1497
+ snapshot.buildInfoEmitPending = true;
1498
+ for (const file of program.getSourceFiles()) {
1499
+ if (!program.isSourceFileDefaultLibrary(file.path)) snapshot.addFileToChangeSet(file.path);
1500
+ else if (!checked.skipTypeChecking(file, true)) snapshot.semanticDiagnosticsPerFile.delete(file.path);
1501
+ }
1502
+ }
1503
+
1463
1504
  // ---- Affected files
1464
1505
 
1465
1506
  class AffectedFilesHandler {
@@ -1510,7 +1551,12 @@ class AffectedFilesHandler {
1510
1551
  private computeDtsSignature(file: SourceFile): string {
1511
1552
  const known = this.incremental.signatures.get(file.path);
1512
1553
  if (known !== undefined) return known;
1513
- return declarationSignature(this.incremental.emitter, file, this.snapshot.options);
1554
+ const done = this.incremental.beginNestedEmit();
1555
+ try {
1556
+ return declarationSignature(this.incremental.emitter, file, this.snapshot.options);
1557
+ } finally {
1558
+ done();
1559
+ }
1514
1560
  }
1515
1561
 
1516
1562
  updateShapeSignature(file: SourceFile, useFileVersionAsSignature: boolean): boolean {
@@ -1519,7 +1565,10 @@ class AffectedFilesHandler {
1519
1565
  if (info === undefined) return false;
1520
1566
  const previous = info.signature;
1521
1567
  let signature = '';
1522
- if (!file.isDeclarationFile && !useFileVersionAsSignature) signature = this.computeDtsSignature(file);
1568
+ // A JSON file has no declaration output, so its version is its signature, which invalidates its importers.
1569
+ if (!file.isDeclarationFile && !isJsonSourceFile(file) && !useFileVersionAsSignature) {
1570
+ signature = this.computeDtsSignature(file);
1571
+ }
1523
1572
  if (signature === '') signature = info.version;
1524
1573
  this.updatedSignatures.set(file.path, signature);
1525
1574
  return signature !== previous;
@@ -1549,7 +1598,7 @@ class AffectedFilesHandler {
1549
1598
  const info = this.snapshot.fileInfos.get(file.path);
1550
1599
  if (info !== undefined && info.affectsGlobalScope) {
1551
1600
  this.hasAllFilesExcludingDefaultLibraryFile = true;
1552
- this.snapshot.getAllFilesExcludingDefaultLibraryFile(this.program, file);
1601
+ return this.snapshot.getAllFilesExcludingDefaultLibraryFile(this.program, file);
1553
1602
  }
1554
1603
  if (this.snapshot.options.isolatedModules === true) return [file];
1555
1604
  const seen = this.forEachFileReferencedBy(file, (currentFile) => {
@@ -1966,7 +2015,7 @@ class EmitFilesHandler {
1966
2015
  results.push(
1967
2016
  declarations !== undefined
1968
2017
  ? this.writeThreadOutputs(file, declarations, writer)
1969
- : program.emitter.emit([file], EmitOnly.Dts, wrapped),
2018
+ : program.emitter.emit([file], emitOnly === EmitOnly.Dts ? EmitOnly.Dts : EmitOnly.DtsAfterJs, wrapped),
1970
2019
  );
1971
2020
  return combineEmitResults(results);
1972
2021
  }
@@ -2558,6 +2607,7 @@ export class IncrementalProgram extends CompilerProgram {
2558
2607
  readonly signatures: ReadonlyMap<string, string> = new Map(),
2559
2608
  ) {
2560
2609
  super(checked, times);
2610
+ checked.globalsInFileDiagnostics = true;
2561
2611
  this.snapshot = programToSnapshot(checked, oldSnapshot);
2562
2612
  }
2563
2613
 
@@ -2565,6 +2615,25 @@ export class IncrementalProgram extends CompilerProgram {
2565
2615
  return this.snapshot.hasChangedDtsFile;
2566
2616
  }
2567
2617
 
2618
+ /** Time spent in declaration emit for signatures while checking (`computeDtsSignature`), not yet taken. */
2619
+ private nestedEmitTime = 0;
2620
+ private nestedEmitDepth = 0;
2621
+ private nestedEmitStart = 0;
2622
+
2623
+ /** Starts timing a nested declaration emit; returns the function that ends it. */
2624
+ beginNestedEmit(): () => void {
2625
+ if (this.nestedEmitDepth++ === 0) this.nestedEmitStart = performance.now();
2626
+ return () => {
2627
+ if (--this.nestedEmitDepth === 0) this.nestedEmitTime += performance.now() - this.nestedEmitStart;
2628
+ };
2629
+ }
2630
+
2631
+ override takeNestedEmitTime(): number {
2632
+ const time = this.nestedEmitTime;
2633
+ this.nestedEmitTime = 0;
2634
+ return time;
2635
+ }
2636
+
2568
2637
  /**
2569
2638
  * The global diagnostics found before `filesToCheck` computed the affected files, which the program
2570
2639
  * reports before its semantic diagnostics (`getGlobalDiagnostics(false)`), as when they are computed
@@ -2697,10 +2766,9 @@ export class IncrementalProgram extends CompilerProgram {
2697
2766
  emit(writer: OutputWriter): EmitResult {
2698
2767
  const options = this.snapshot.options;
2699
2768
  let result: EmitResult | undefined;
2700
- if (options.noEmit === true) {
2701
- result = new EmitResult();
2702
- result.emitSkipped = true;
2703
- } else result = handleNoEmitOnError(this);
2769
+ // A `noEmit` program emits only its build info, and its emit is not skipped (tsgo's `HandleNoEmitOptions`).
2770
+ if (options.noEmit === true) result = new EmitResult();
2771
+ else result = handleNoEmitOnError(this);
2704
2772
  if (result !== undefined) {
2705
2773
  const buildInfoResult = this.emitBuildInfo(writer);
2706
2774
  if (buildInfoResult !== undefined) {
@@ -2,12 +2,7 @@
2
2
  * The tsconfig.json written by `tsc --init`.
3
3
  */
4
4
  import { Diagnostics, localizeMessage, type DiagnosticMessage, type Locale } from './diagnostics.js';
5
- import {
6
- compilerOptionsByName,
7
- sameEnumValue,
8
- watchOptionsByName,
9
- type OptionDeclaration,
10
- } from './option-declarations.js';
5
+ import { compilerOptionsByName, sameEnumValue, type OptionDeclaration } from './option-declarations.js';
11
6
  import { JsxEmit, ModuleDetectionKind, ModuleKind, ScriptTarget, type OptionValue } from './options.js';
12
7
 
13
8
  const enum Commented {
@@ -124,7 +119,7 @@ class ConfigWriter {
124
119
  }
125
120
 
126
121
  function formatValue(name: string, value: OptionValue): string {
127
- const option = compilerOptionsByName.get(name) ?? watchOptionsByName.get(name);
122
+ const option = compilerOptionsByName.get(name);
128
123
  if (value === null) return 'null';
129
124
  if (typeof value === 'boolean') return value ? 'true' : 'false';
130
125
  if (typeof value === 'number' || typeof value === 'string') return formatScalar(value, option);