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
@@ -15,12 +15,12 @@
15
15
  * thread's checker finds every diagnostic but those of declaration emit.
16
16
  */
17
17
  import type { Worker } from 'node:worker_threads';
18
- import { availableParallelism } from 'node:os';
19
18
  import { publish } from '@scriptc/threads';
20
19
  import { lastNodeIdValue, type SourceFile } from './ast.js';
21
20
  import { JavaScriptEmitter, type OutputWriter } from './compile-program.js';
22
21
  import type { Diagnostic, DiagnosticFile } from './diagnostics.js';
23
22
  import { EmitOnly, EmitResult, sourceFileMayBeEmitted } from './emitter.js';
23
+ import { availableCpus } from './cgroup.js';
24
24
  import {
25
25
  CheckerResult,
26
26
  packResult,
@@ -78,7 +78,7 @@ export function emitThreads(
78
78
  emitKinds: readonly number[] | undefined = undefined,
79
79
  ): number {
80
80
  if (parallelEmit.spawn === undefined || singleThreaded === true) return 0;
81
- const cpus = availableParallelism();
81
+ const cpus = availableCpus();
82
82
  if (cpus < 2) return 0;
83
83
  const files = program.getSourceFiles();
84
84
  let text = 0;
@@ -220,7 +220,7 @@ const maxDeclarationThreadCheckers = 8;
220
220
  * from 1 to 8 checkers, about even at 12, and 32-38% slower at 16. It also needs a CPU of its own.
221
221
  */
222
222
  export function declarationThreadPays(checkers: number): boolean {
223
- return checkers <= maxDeclarationThreadCheckers && checkers < availableParallelism();
223
+ return checkers <= maxDeclarationThreadCheckers && checkers < availableCpus();
224
224
  }
225
225
 
226
226
  /**
@@ -247,7 +247,7 @@ export function startDeclarationThread(
247
247
  let declarations: boolean;
248
248
  if (emitKinds === undefined) declarations = sourceFileMayBeEmitted(files[i]!, options);
249
249
  else declarations = emitKinds[i] === EmitOnly.All || emitKinds[i] === EmitOnly.Dts;
250
- kinds.push(declarations ? EmitOnly.Dts : -1);
250
+ kinds.push(declarations ? (emitsJavaScript(program, emitKinds, i) ? EmitOnly.DtsAfterJs : EmitOnly.Dts) : -1);
251
251
  results.push(undefined);
252
252
  }
253
253
  for (const i of metadata) kinds[i] = emitKinds === undefined ? EmitOnly.All : emitKinds[i]!;
@@ -1,4 +1,4 @@
1
- // The TypeScript/JavaScript/JSX/JSON parser, a port of TypeScript 7.0.2's (tsgo) parser with its
1
+ // The TypeScript/JavaScript/JSX/JSON parser, a port of TypeScript 7.1's (tsgo) parser with its
2
2
  // error recovery, parse diagnostics and JavaScript-specific reparsing.
3
3
  //
4
4
  // ```ts
@@ -202,6 +202,7 @@ import {
202
202
  newCallExpression,
203
203
  newPropertyAssignment,
204
204
  } from './ast.js';
205
+ import { IdentifierName } from './identifier-name.js';
205
206
  import {
206
207
  OperatorPrecedence,
207
208
  canHaveDecorators,
@@ -218,6 +219,7 @@ import {
218
219
  isFunctionLike,
219
220
  isImportCall,
220
221
  isImportMeta,
222
+ isImportPhaseMetaProperty,
221
223
  isInJSFile,
222
224
  isKeyword,
223
225
  isKeywordOrPunctuation,
@@ -293,7 +295,11 @@ const enum ListElement {
293
295
  ObjectBindingElement,
294
296
  ClassElement,
295
297
  HeritageClause,
298
+ /** A heritage clause of an interface declaration. */
299
+ InterfaceHeritageClause,
296
300
  ExpressionWithTypeArguments,
301
+ /** An element of a type heritage clause: `implements` of a class, `extends` of an interface. */
302
+ TypeHeritageClauseElement,
297
303
  EnumMember,
298
304
  ImportSpecifier,
299
305
  ExportSpecifier,
@@ -340,6 +346,18 @@ export const enum JSDocScannerInfo {
340
346
 
341
347
  const noArgs: readonly string[] = [];
342
348
 
349
+ /** Whether `operator` binds before an operator of `currentPrecedence`: at equal precedence, only the right-associative `**`. */
350
+ function shouldConsumeBinaryOperator(
351
+ operator: SyntaxKind,
352
+ operatorPrecedence: OperatorPrecedence,
353
+ currentPrecedence: OperatorPrecedence,
354
+ ): boolean {
355
+ return (
356
+ operatorPrecedence > currentPrecedence ||
357
+ (operatorPrecedence === currentPrecedence && operator === SyntaxKind.AsteriskAsteriskToken)
358
+ );
359
+ }
360
+
343
361
  /** Parser state saved by `mark` for speculative parsing. */
344
362
  export class ParserState extends ScannerState {
345
363
  contextFlags: NodeFlags;
@@ -430,7 +448,7 @@ export function parseSourceFile(fileName: string, text: string, options?: ParseO
430
448
  export function parseIsolatedEntityName(text: string): EntityName | undefined {
431
449
  const p = new Parser('/', '/', text, ScriptKind.JS, new ExternalModuleIndicatorOptions(false, false));
432
450
  p.nextToken();
433
- const entityName = p.parseEntityName(true, undefined);
451
+ const entityName = p.parseEntityName(true, false, undefined);
434
452
  return p.token() === SyntaxKind.EndOfFile && p.diagnostics.length === 0 ? entityName : undefined;
435
453
  }
436
454
 
@@ -981,9 +999,13 @@ export class Parser extends ScannerErrorReporter {
981
999
  case ListElement.ClassElement:
982
1000
  return this.parseClassElement();
983
1001
  case ListElement.HeritageClause:
984
- return this.parseHeritageClause();
1002
+ return this.parseHeritageClause(false);
1003
+ case ListElement.InterfaceHeritageClause:
1004
+ return this.parseHeritageClause(true);
985
1005
  case ListElement.ExpressionWithTypeArguments:
986
1006
  return this.parseExpressionWithTypeArguments();
1007
+ case ListElement.TypeHeritageClauseElement:
1008
+ return this.parseTypeHeritageClauseElement();
987
1009
  case ListElement.EnumMember:
988
1010
  return this.parseEnumMember();
989
1011
  case ListElement.ImportSpecifier:
@@ -2204,9 +2226,18 @@ export class Parser extends ScannerErrorReporter {
2204
2226
  // The name isn't parsed in an await context; the checker reports `await` names.
2205
2227
  const name = this.parseNameOfClassDeclarationOrExpression();
2206
2228
  const typeParameters = this.parseTypeParameters();
2207
- if (modifiers !== undefined && hasModifierOfKind(modifiers, SyntaxKind.ExportKeyword))
2229
+ // An exported class at the top level of a module, not one nested in a block or a namespace, has its
2230
+ // heritage clauses and members parsed in an await context.
2231
+ if (
2232
+ modifiers !== undefined &&
2233
+ (this.parsingContexts & (1 << ParsingContext.SourceElements)) !== 0 &&
2234
+ (this.parsingContexts &
2235
+ ((1 << ParsingContext.BlockStatements) | (1 << ParsingContext.SwitchClauseStatements))) ===
2236
+ 0 &&
2237
+ hasModifierOfKind(modifiers, SyntaxKind.ExportKeyword)
2238
+ )
2208
2239
  this.setContextFlags(NodeFlags.AwaitContext, true);
2209
- const heritageClauses = this.parseHeritageClauses();
2240
+ const heritageClauses = this.parseHeritageClauses(false);
2210
2241
  let members: NodeList;
2211
2242
  if (this.parseExpected(SyntaxKind.OpenBraceToken)) {
2212
2243
  members = this.parseList(ParsingContext.ClassMembers, ListElement.ClassElement);
@@ -2248,23 +2279,47 @@ export class Parser extends ScannerErrorReporter {
2248
2279
  return this.token() === SyntaxKind.ImplementsKeyword && this.lookAhead(nextTokenIsIdentifierOrKeyword);
2249
2280
  }
2250
2281
 
2251
- parseHeritageClauses(): NodeList | undefined {
2282
+ parseHeritageClauses(isInterface: boolean): NodeList | undefined {
2252
2283
  return this.isHeritageClause()
2253
- ? this.parseList(ParsingContext.HeritageClauses, ListElement.HeritageClause)
2284
+ ? this.parseList(
2285
+ ParsingContext.HeritageClauses,
2286
+ isInterface ? ListElement.InterfaceHeritageClause : ListElement.HeritageClause,
2287
+ )
2254
2288
  : undefined;
2255
2289
  }
2256
2290
 
2257
- parseHeritageClause(): Node {
2291
+ parseHeritageClause(isInterface: boolean): Node {
2258
2292
  const pos = this.nodePos();
2259
2293
  const kind = this.token();
2260
2294
  this.nextToken();
2295
+ // A class's `implements` and an interface's `extends` name types: their elements are type references.
2296
+ const isTypeClause = isInterface ? kind === SyntaxKind.ExtendsKeyword : kind === SyntaxKind.ImplementsKeyword;
2261
2297
  const types = this.parseDelimitedList(
2262
2298
  ParsingContext.HeritageClauseElement,
2263
- ListElement.ExpressionWithTypeArguments,
2299
+ isTypeClause ? ListElement.TypeHeritageClauseElement : ListElement.ExpressionWithTypeArguments,
2264
2300
  )!;
2265
2301
  return this.checkJSSyntax(this.finishNode(new HeritageClause(kind, types), pos));
2266
2302
  }
2267
2303
 
2304
+ /** A type reference when the element is an entity name with optional type arguments, otherwise the
2305
+ * `ExpressionWithTypeArguments`, which the checker reports. */
2306
+ parseTypeHeritageClauseElement(): Node {
2307
+ const pos = this.nodePos();
2308
+ const element = this.parseExpressionWithTypeArguments() as ExpressionWithTypeArguments;
2309
+ if (!isValidHeritageTypeReferenceExpression(element.expression)) return element;
2310
+ const typeName = this.convertEntityNameExpressionToEntityName(element.expression);
2311
+ return this.finishNode(new TypeReferenceNode(typeName, element.typeArguments), pos);
2312
+ }
2313
+
2314
+ /** The `QualifiedName` chain for an identifier or a chain of property accesses, spanning the same text. */
2315
+ convertEntityNameExpressionToEntityName(node: Node): Node {
2316
+ if (node instanceof Identifier) return node;
2317
+ const access = node as PropertyAccessExpression;
2318
+ // The name can be a private name, as upstream's.
2319
+ const result = new QualifiedName(this.convertEntityNameExpressionToEntityName(access.expression), access.name);
2320
+ return this.finishNodeWithEnd(result, node.pos, node.end);
2321
+ }
2322
+
2268
2323
  parseExpressionWithTypeArguments(): Node {
2269
2324
  const pos = this.nodePos();
2270
2325
  const expression = this.parseLeftHandSideExpressionOrHigher();
@@ -2556,7 +2611,7 @@ export class Parser extends ScannerErrorReporter {
2556
2611
  this.parseExpected(SyntaxKind.InterfaceKeyword);
2557
2612
  const name = this.parseIdentifier(IdentifierUse.Name);
2558
2613
  const typeParameters = this.parseTypeParameters();
2559
- const heritageClauses = this.parseHeritageClauses();
2614
+ const heritageClauses = this.parseHeritageClauses(true);
2560
2615
  const members = this.parseObjectTypeMembers();
2561
2616
  const result = this.finishWithJSDoc(
2562
2617
  new InterfaceDeclaration(modifiers, name, typeParameters, heritageClauses, members),
@@ -2650,10 +2705,15 @@ export class Parser extends ScannerErrorReporter {
2650
2705
  } else {
2651
2706
  name = this.parseLiteralExpression(true);
2652
2707
  }
2708
+ // `declare module "*.ext" with { type: "..." }`: the import attributes the module matches.
2709
+ const attributes =
2710
+ keyword === SyntaxKind.ModuleKeyword && this.parseOptional(SyntaxKind.WithKeyword)
2711
+ ? (this.parseTypeLiteral() as TypeLiteralNode)
2712
+ : undefined;
2653
2713
  let body: Node | undefined;
2654
2714
  if (this.token() === SyntaxKind.OpenBraceToken) body = this.parseModuleBlock();
2655
2715
  else this.parseSemicolon();
2656
- const result = this.finishWithJSDoc(new ModuleDeclaration(modifiers, keyword, name, body), pos, jsdoc);
2716
+ const result = this.finishWithJSDoc(new ModuleDeclaration(modifiers, keyword, name, attributes, body), pos, jsdoc);
2657
2717
  this.statementHasAwaitIdentifier = saveHasAwaitIdentifier;
2658
2718
  return result;
2659
2719
  }
@@ -2696,7 +2756,7 @@ export class Parser extends ScannerErrorReporter {
2696
2756
  } else {
2697
2757
  body = this.parseModuleBlock();
2698
2758
  }
2699
- const result = this.finishWithJSDoc(new ModuleDeclaration(modifiers, keyword, name, body), pos, jsdoc);
2759
+ const result = this.finishWithJSDoc(new ModuleDeclaration(modifiers, keyword, name, undefined, body), pos, jsdoc);
2700
2760
  this.checkJSSyntax(result);
2701
2761
  this.statementHasAwaitIdentifier = saveHasAwaitIdentifier;
2702
2762
  return result;
@@ -2711,6 +2771,7 @@ export class Parser extends ScannerErrorReporter {
2711
2771
  const afterImportPos = this.nodePos();
2712
2772
  // The identifier isn't parsed in an await context; the checker reports `await`.
2713
2773
  const saveHasAwaitIdentifier = this.statementHasAwaitIdentifier;
2774
+ const phaseModifierCandidate = this.currentImportPhaseModifier();
2714
2775
  let identifier = this.isIdentifier() ? this.parseIdentifier(IdentifierUse.Name) : undefined;
2715
2776
  let phaseModifier = SyntaxKind.Unknown;
2716
2777
  if (
@@ -2722,20 +2783,19 @@ export class Parser extends ScannerErrorReporter {
2722
2783
  ) {
2723
2784
  phaseModifier = SyntaxKind.TypeKeyword;
2724
2785
  identifier = this.isIdentifier() ? this.parseIdentifier(IdentifierUse.Name) : undefined;
2725
- } else if (identifier !== undefined && identifier.text === 'defer') {
2726
- const shouldParseAsDeferModifier =
2727
- this.token() === SyntaxKind.FromKeyword
2728
- ? !this.lookAhead(nextTokenIsTokenStringLiteral)
2729
- : this.token() !== SyntaxKind.CommaToken && this.token() !== SyntaxKind.EqualsToken;
2730
- if (shouldParseAsDeferModifier) {
2731
- phaseModifier = SyntaxKind.DeferKeyword;
2732
- identifier = this.isIdentifier() ? this.parseIdentifier(IdentifierUse.Name) : undefined;
2733
- }
2786
+ } else if (
2787
+ identifier !== undefined &&
2788
+ phaseModifierCandidate !== SyntaxKind.Unknown &&
2789
+ this.shouldParseImportPhaseModifier()
2790
+ ) {
2791
+ phaseModifier = phaseModifierCandidate;
2792
+ identifier = this.isIdentifier() ? this.parseIdentifier(IdentifierUse.Name) : undefined;
2734
2793
  }
2735
2794
  if (
2736
2795
  identifier !== undefined &&
2737
2796
  !this.tokenAfterImportedIdentifierDefinitelyProducesImportDeclaration() &&
2738
- phaseModifier !== SyntaxKind.DeferKeyword
2797
+ phaseModifier !== SyntaxKind.DeferKeyword &&
2798
+ phaseModifier !== SyntaxKind.SourceKeyword
2739
2799
  ) {
2740
2800
  const importEquals = this.checkJSSyntax(
2741
2801
  this.parseImportEqualsDeclaration(pos, jsdoc, modifiers, identifier, phaseModifier === SyntaxKind.TypeKeyword),
@@ -2763,6 +2823,30 @@ export class Parser extends ScannerErrorReporter {
2763
2823
  return this.token() === SyntaxKind.AsteriskToken || this.token() === SyntaxKind.OpenBraceToken;
2764
2824
  }
2765
2825
 
2826
+ /** In `import defer ___` or `import source ___`, whether `defer` or `source` is a phase modifier rather than the
2827
+ * default import's name. */
2828
+ shouldParseImportPhaseModifier(): boolean {
2829
+ switch (this.token()) {
2830
+ case SyntaxKind.CommaToken:
2831
+ case SyntaxKind.EqualsToken:
2832
+ return false;
2833
+ case SyntaxKind.FromKeyword:
2834
+ return !this.lookAhead(nextTokenIsTokenStringLiteral);
2835
+ }
2836
+ return true;
2837
+ }
2838
+
2839
+ /** The phase modifier the current token's text spells, written without escapes, or `Unknown`. */
2840
+ currentImportPhaseModifier(): SyntaxKind {
2841
+ switch (this.scanner.getTokenText()) {
2842
+ case 'defer':
2843
+ return SyntaxKind.DeferKeyword;
2844
+ case 'source':
2845
+ return SyntaxKind.SourceKeyword;
2846
+ }
2847
+ return SyntaxKind.Unknown;
2848
+ }
2849
+
2766
2850
  /** In `import id ___`, whether the token makes this an ImportDeclaration rather than ImportEqualsDeclaration. */
2767
2851
  tokenAfterImportedIdentifierDefinitelyProducesImportDeclaration(): boolean {
2768
2852
  return this.token() === SyntaxKind.CommaToken || this.token() === SyntaxKind.FromKeyword;
@@ -2788,7 +2872,7 @@ export class Parser extends ScannerErrorReporter {
2788
2872
  parseModuleReference(): Node {
2789
2873
  if (this.token() === SyntaxKind.RequireKeyword && this.lookAhead(nextTokenIsOpenParen))
2790
2874
  return this.parseExternalModuleReference();
2791
- return this.parseEntityName(false, undefined);
2875
+ return this.parseEntityName(false, false, undefined);
2792
2876
  }
2793
2877
 
2794
2878
  parseExternalModuleReference(): Node {
@@ -2826,6 +2910,9 @@ export class Parser extends ScannerErrorReporter {
2826
2910
  this.parseExpected(SyntaxKind.FromKeyword);
2827
2911
  return importClause;
2828
2912
  }
2913
+ // A phase modifier without bindings still makes an import clause; the checker reports it.
2914
+ if (phaseModifier === SyntaxKind.DeferKeyword || phaseModifier === SyntaxKind.SourceKeyword)
2915
+ return this.finishNode(new ImportClause(phaseModifier, undefined, undefined), pos) as ImportClause;
2829
2916
  return undefined;
2830
2917
  }
2831
2918
 
@@ -2952,7 +3039,7 @@ export class Parser extends ScannerErrorReporter {
2952
3039
  identifierName = name;
2953
3040
  } else {
2954
3041
  this.parseErrorAt(skipTrivia(this.sourceText, name.pos), name.end, Diagnostics.Identifier_expected);
2955
- identifierName = this.newIdentifier('');
3042
+ identifierName = this.newIdentifier(new IdentifierName(''));
2956
3043
  this.finishNode(identifierName, name.pos);
2957
3044
  }
2958
3045
  return this.checkJSSyntax(this.finishNode(new ImportSpecifier(isTypeOnly, propertyName, identifierName), pos));
@@ -3391,12 +3478,16 @@ export class Parser extends ScannerErrorReporter {
3391
3478
  }
3392
3479
 
3393
3480
  parseEntityNameOfTypeReference(): EntityName {
3394
- return this.parseEntityName(true, Diagnostics.Type_expected);
3481
+ return this.parseEntityName(true, false, Diagnostics.Type_expected);
3395
3482
  }
3396
3483
 
3397
- /** An entity name; `use` is for its first identifier, the qualified names' right sides are names. */
3484
+ /**
3485
+ * An entity name; `use` is for its first identifier, the qualified names' right sides are names.
3486
+ * Only a type query allows private names on the right (`typeof this.#x`).
3487
+ */
3398
3488
  parseEntityName(
3399
3489
  allowReservedWords: boolean,
3490
+ allowPrivateName: boolean,
3400
3491
  diagnosticMessage: DiagnosticMessage | undefined,
3401
3492
  use: IdentifierUse = IdentifierUse.Name,
3402
3493
  ): EntityName {
@@ -3408,7 +3499,7 @@ export class Parser extends ScannerErrorReporter {
3408
3499
  // A JSDoc-style generic; the checker reports the gap between the name and the type arguments.
3409
3500
  if (this.token() === SyntaxKind.LessThanToken) break;
3410
3501
  entity = this.finishNode(
3411
- new QualifiedName(entity, this.parseRightSideOfDotIdentifier(allowReservedWords, true)),
3502
+ new QualifiedName(entity, this.parseRightSideOfDot(allowReservedWords, allowPrivateName, true)),
3412
3503
  pos,
3413
3504
  );
3414
3505
  }
@@ -3469,12 +3560,12 @@ export class Parser extends ScannerErrorReporter {
3469
3560
  * A new identifier of the class `use` calls for. Callers create it after the identifier's token, so
3470
3561
  * for an element name the current token tells a shorthand property from an assignment or a method.
3471
3562
  */
3472
- newIdentifier(text: string, use: IdentifierUse = IdentifierUse.Reference): Identifier {
3563
+ newIdentifier(name: IdentifierName, use: IdentifierUse = IdentifierUse.Reference): Identifier {
3473
3564
  this.identifierCount++;
3474
- if (text === 'await') this.statementHasAwaitIdentifier = true;
3565
+ if (name.text === 'await') this.statementHasAwaitIdentifier = true;
3475
3566
  if (use === IdentifierUse.Name || (use === IdentifierUse.ElementName && this.isElementNameEnd()))
3476
- return new Identifier(text);
3477
- return new ReferenceIdentifier(text);
3567
+ return new Identifier(name);
3568
+ return new ReferenceIdentifier(name);
3478
3569
  }
3479
3570
 
3480
3571
  /** Whether the current token ends an object literal element name that is not a shorthand property. */
@@ -3484,7 +3575,7 @@ export class Parser extends ScannerErrorReporter {
3484
3575
  }
3485
3576
 
3486
3577
  createMissingIdentifier(use: IdentifierUse = IdentifierUse.Reference): Identifier {
3487
- const result = this.newIdentifier('', use);
3578
+ const result = this.newIdentifier(new IdentifierName(''), use);
3488
3579
  this.finishNode(result, this.nodePos());
3489
3580
  return result;
3490
3581
  }
@@ -3614,7 +3705,7 @@ export class Parser extends ScannerErrorReporter {
3614
3705
  parseTypeQuery(): TypeNode {
3615
3706
  const pos = this.nodePos();
3616
3707
  this.parseExpected(SyntaxKind.TypeOfKeyword);
3617
- const entityName = this.parseEntityName(true, undefined, IdentifierUse.Reference);
3708
+ const entityName = this.parseEntityName(true, true, undefined, IdentifierUse.Reference);
3618
3709
  // ASI: don't parse the next line's type arguments as part of an instantiation expression.
3619
3710
  const typeArguments = this.hasPrecedingLineBreak() ? undefined : this.parseTypeArguments();
3620
3711
  return this.finishNode(new TypeQueryNode(entityName, typeArguments), pos);
@@ -4736,15 +4827,13 @@ export class Parser extends ScannerErrorReporter {
4736
4827
  // Take a left-associative operator when its precedence is higher than the current one (so
4737
4828
  // `a - b - c` returns `b` as the right operand of the first `-`), and `**` (right
4738
4829
  // associative) when it is at least as high.
4739
- const consumeCurrentOperator =
4740
- operator === SyntaxKind.AsteriskAsteriskToken ? newPrecedence >= precedence : newPrecedence > precedence;
4741
- if (!consumeCurrentOperator) break;
4830
+ if (!shouldConsumeBinaryOperator(operator, newPrecedence, precedence)) break;
4742
4831
  if (operator === SyntaxKind.InKeyword && this.inDisallowInContext()) break;
4743
4832
  if (operator === SyntaxKind.AsKeyword || operator === SyntaxKind.SatisfiesKeyword) {
4744
4833
  // ASI applies before `as`: `var x = foo \n as (Bar)` is a declaration and a call to `as`.
4745
4834
  if (this.hasPrecedingLineBreak()) break;
4746
4835
  this.nextToken();
4747
- // In `a ## b as T`, stop at a following operator with a higher precedence than `##`: the
4836
+ // In `a ## b as T $$ c`, stop when `$$` would bind before `##` once the `as` is erased: the
4748
4837
  // `as` couldn't be erased without changing the meaning (TypeScript#63527).
4749
4838
  const lastPrecedence =
4750
4839
  lastOperand instanceof BinaryExpression
@@ -4754,7 +4843,8 @@ export class Parser extends ScannerErrorReporter {
4754
4843
  operator === SyntaxKind.SatisfiesKeyword
4755
4844
  ? this.makeSatisfiesExpression(leftOperand, this.parseType())
4756
4845
  : this.makeAsExpression(leftOperand, this.parseType());
4757
- if (getBinaryOperatorPrecedence(this.reScanGreaterThanToken()) > lastPrecedence) break;
4846
+ const nextOperator = this.reScanGreaterThanToken();
4847
+ if (shouldConsumeBinaryOperator(nextOperator, getBinaryOperatorPrecedence(nextOperator), lastPrecedence)) break;
4758
4848
  } else {
4759
4849
  leftOperand = this.makeBinaryExpression(
4760
4850
  leftOperand,
@@ -4882,7 +4972,7 @@ export class Parser extends ScannerErrorReporter {
4882
4972
  // An unclosed opening element took its parent's closing element: restructure
4883
4973
  // (<div>(...<span>...</div>)) into (<div>(...<span>...</>)</div>). The parent reports it.
4884
4974
  const end = (lastChild as JsxElement).children.end;
4885
- const missingIdentifier = this.finishNodeWithEnd(this.newIdentifier(''), end, end);
4975
+ const missingIdentifier = this.finishNodeWithEnd(this.newIdentifier(new IdentifierName('')), end, end);
4886
4976
  const newClosingElement = new JsxClosingElement(missingIdentifier);
4887
4977
  this.finishNodeWithEnd(newClosingElement, end, end);
4888
4978
  const newLast = new JsxElement(
@@ -5170,8 +5260,9 @@ export class Parser extends ScannerErrorReporter {
5170
5260
  if (this.token() === SyntaxKind.EqualsToken) {
5171
5261
  if (this.scanJsxAttributeValue() === SyntaxKind.StringLiteral) return this.parseLiteralExpression(false);
5172
5262
  if (this.token() === SyntaxKind.OpenBraceToken) return this.parseJsxExpression(true);
5263
+ // An attribute value is a single element: sibling-element recovery must not wrap it in a binary expression.
5173
5264
  if (this.token() === SyntaxKind.LessThanToken)
5174
- return this.parseJsxElementOrSelfClosingElementOrFragment(true, -1, undefined, false);
5265
+ return this.parseJsxElementOrSelfClosingElementOrFragment(true, -1, undefined, true);
5175
5266
  this.parseErrorAtCurrentToken(Diagnostics.X_or_JSX_element_expected);
5176
5267
  }
5177
5268
  return undefined;
@@ -5290,9 +5381,9 @@ export class Parser extends ScannerErrorReporter {
5290
5381
  // An `import.*` meta property, such as `import.meta`.
5291
5382
  this.nextToken();
5292
5383
  this.nextToken();
5293
- const name = this.parseIdentifierName(IdentifierUse.Name);
5384
+ const name = this.parseImportMetaPropertyName();
5294
5385
  expression = this.finishNode(new MetaProperty(SyntaxKind.ImportKeyword, name), pos);
5295
- if (name.text === 'defer') {
5386
+ if (isImportPhaseMetaProperty(expression)) {
5296
5387
  if (this.token() === SyntaxKind.OpenParenToken || this.token() === SyntaxKind.LessThanToken)
5297
5388
  this.sourceFlags |= NodeFlags.PossiblyContainsDynamicImport;
5298
5389
  } else {
@@ -5310,6 +5401,16 @@ export class Parser extends ScannerErrorReporter {
5310
5401
  return this.parseCallExpressionRest(pos, expression);
5311
5402
  }
5312
5403
 
5404
+ /** The name after `import.`; `defer` and `source` written with escapes are reported. */
5405
+ parseImportMetaPropertyName(): Identifier {
5406
+ if (
5407
+ (this.token() === SyntaxKind.DeferKeyword || this.token() === SyntaxKind.SourceKeyword) &&
5408
+ this.currentImportPhaseModifier() === SyntaxKind.Unknown
5409
+ )
5410
+ this.parseErrorAtCurrentToken(Diagnostics.Keywords_cannot_contain_escape_characters);
5411
+ return this.parseIdentifierName(IdentifierUse.Name);
5412
+ }
5413
+
5313
5414
  parseSuperExpression(): Expression {
5314
5415
  const pos = this.nodePos();
5315
5416
  let expression = this.parseKeywordExpression();
@@ -5504,13 +5605,18 @@ export class Parser extends ScannerErrorReporter {
5504
5605
  ): Expression {
5505
5606
  let argumentExpression: Expression;
5506
5607
  if (this.token() === SyntaxKind.CloseBracketToken) {
5608
+ // The missing argument is created before the error, so the error marks the element access.
5609
+ argumentExpression = this.createMissingIdentifier();
5507
5610
  this.parseErrorAt(
5508
5611
  this.nodePos(),
5509
5612
  this.nodePos(),
5510
5613
  Diagnostics.An_element_access_expression_should_take_an_argument,
5511
5614
  );
5512
- argumentExpression = this.createMissingIdentifier();
5513
5615
  } else {
5616
+ // tsgo creates the missing argument first and drops it when there is one. Finishing that node takes the
5617
+ // error flag of an error before the argument (`i[01]`), so the argument doesn't get it.
5618
+ this.identifierCount++;
5619
+ this.hasParseError = false;
5514
5620
  const argument = this.parseExpressionAllowIn();
5515
5621
  if (
5516
5622
  argument.kind === SyntaxKind.StringLiteral ||
@@ -5986,10 +6092,11 @@ export class Parser extends ScannerErrorReporter {
5986
6092
  if (isIdentifier) {
5987
6093
  const pos = this.scanner.hasPrecedingJSDocLeadingAsterisks() ? this.scanner.getTokenStart() : this.nodePos();
5988
6094
  const text = this.scanner.getIdentifierValue();
6095
+ const name = this.scanner.getIdentifierName();
5989
6096
  const record = this.scanner.recordIdentifierValue(text);
5990
6097
  this.nextTokenWithoutCheck();
5991
6098
  if (record) this.identifierTexts.push(text);
5992
- const result = this.newIdentifier(text, use);
6099
+ const result = this.newIdentifier(name, use);
5993
6100
  this.finishNode(result, pos);
5994
6101
  return result;
5995
6102
  }
@@ -6794,7 +6901,9 @@ export class Parser extends ScannerErrorReporter {
6794
6901
  }
6795
6902
 
6796
6903
  jsonError(node: Node, message: DiagnosticMessage): void {
6797
- this.diagnostics.push(new Diagnostic(undefined, skipTrivia(this.sourceText, node.pos), node.end, message, noArgs));
6904
+ // A missing node (a property without a value) keeps its position: trivia after it isn't its own.
6905
+ const pos = nodeIsMissing(node) ? node.pos : skipTrivia(this.sourceText, node.pos);
6906
+ this.diagnostics.push(new Diagnostic(undefined, pos, node.end, message, noArgs));
6798
6907
  }
6799
6908
 
6800
6909
  validateJsonValue(sourceFile: SourceFile, value: Node): void {
@@ -7168,6 +7277,16 @@ function nextTokenIsOpenParen(p: Parser): boolean {
7168
7277
  return p.nextToken() === SyntaxKind.OpenParenToken;
7169
7278
  }
7170
7279
 
7280
+ /** An identifier or a chain of property accesses without optional chaining, each name present. */
7281
+ function isValidHeritageTypeReferenceExpression(node: Node): boolean {
7282
+ if (node instanceof Identifier) return nodeIsPresent(node);
7283
+ if (!(node instanceof PropertyAccessExpression) || (node.flags & NodeFlags.OptionalChain) !== 0) return false;
7284
+ return (
7285
+ nodeIsPresent((node as PropertyAccessExpression).name) &&
7286
+ isValidHeritageTypeReferenceExpression((node as PropertyAccessExpression).expression)
7287
+ );
7288
+ }
7289
+
7171
7290
  function nextTokenIsOpenBrace(p: Parser): boolean {
7172
7291
  return p.nextToken() === SyntaxKind.OpenBraceToken;
7173
7292
  }
@@ -7753,7 +7872,7 @@ export function isNodeCoreModule(moduleName: string): boolean {
7753
7872
  }
7754
7873
 
7755
7874
  // `require('module').builtinModules`, without and with only the `node:` prefix.
7756
- const unprefixedNodeCoreModules = new Set<string>([
7875
+ export const unprefixedNodeCoreModules = new Set<string>([
7757
7876
  'assert',
7758
7877
  'assert/strict',
7759
7878
  'async_hooks',
@@ -7810,7 +7929,7 @@ const unprefixedNodeCoreModules = new Set<string>([
7810
7929
  'zlib',
7811
7930
  ]);
7812
7931
 
7813
- const exclusivelyPrefixedNodeCoreModules = new Set<string>([
7932
+ export const exclusivelyPrefixedNodeCoreModules = new Set<string>([
7814
7933
  'node:quic',
7815
7934
  'node:sea',
7816
7935
  'node:sqlite',
@@ -139,6 +139,28 @@ export function isRootedDiskPath(path: string): boolean {
139
139
  return getEncodedRootLength(path) > 0;
140
140
  }
141
141
 
142
+ /**
143
+ * Whether Windows may resolve `path` over the network: a UNC path (`//server/share`), a Win32 device path
144
+ * (`//?/…`, `//./…`) or an NT object path (`/??/…`), with either separator. Device and object paths count even
145
+ * for local volumes, since their `UNC` and `GLOBALROOT` forms reach the network redirector. Accessing one can
146
+ * make Windows authenticate to an arbitrary host, so such paths are never accessed on any platform.
147
+ */
148
+ export function isNetworkPath(path: string): boolean {
149
+ if (path.length < 2 || !isAnyDirectorySeparator(path.charCodeAt(0))) return false;
150
+ if (isAnyDirectorySeparator(path.charCodeAt(1))) return true;
151
+ return (
152
+ path.length >= 3 &&
153
+ path.charCodeAt(1) === 0x3f &&
154
+ path.charCodeAt(2) === 0x3f &&
155
+ (path.length === 3 || isAnyDirectorySeparator(path.charCodeAt(3)))
156
+ );
157
+ }
158
+
159
+ /** Whether a path written in a config or on the command line names a network location once resolved. */
160
+ export function isNetworkPathValue(value: string, basePath: string): boolean {
161
+ return isNetworkPath(getNormalizedAbsolutePath(value, basePath));
162
+ }
163
+
142
164
  export function pathIsAbsolute(path: string): boolean {
143
165
  return getEncodedRootLength(path) !== 0;
144
166
  }
@@ -370,8 +392,6 @@ function isNonDotDotPrefix(normalized: string, rootLength: number): boolean {
370
392
  /** Removes `.`, `..` and duplicate separators, keeping a trailing separator. */
371
393
  export function normalizePath(path: string): string {
372
394
  path = normalizeSlashes(path);
373
- const simple = simpleNormalizePath(path);
374
- if (simple !== undefined) return simple;
375
395
  const normalized = getNormalizedAbsolutePath(path, '');
376
396
  return normalized !== '' && hasTrailingDirectorySeparator(path)
377
397
  ? ensureTrailingDirectorySeparator(normalized)
@@ -1,6 +1,7 @@
1
1
  // Side tables that transforms fill in and the printer reads: original nodes, emit flags,
2
2
  // comment and source map ranges, synthesized comments, generated names and emit helpers.
3
3
  import {
4
+ Block,
4
5
  ExpressionStatement,
5
6
  FunctionDeclaration,
6
7
  Identifier,
@@ -599,6 +600,21 @@ export class EmitContext extends NodeFactory {
599
600
  return node;
600
601
  }
601
602
 
603
+ /** `node` as a function body: a block as it is, an expression as `{ return node; }` with the expression's range. */
604
+ convertToFunctionBlock(node: Node, multiLine: boolean): Block {
605
+ if (node instanceof Block) return node as Block;
606
+ const factory = this.factory;
607
+ const statement = factory.createReturnStatement(node);
608
+ statement.pos = node.pos;
609
+ statement.end = node.end;
610
+ const block = factory.createBlock([statement], multiLine);
611
+ block.statements.pos = node.pos;
612
+ block.statements.end = node.end;
613
+ block.pos = node.pos;
614
+ block.end = node.end;
615
+ return block;
616
+ }
617
+
602
618
  /** Marks the current variable scope as visiting parameters; returns the previous flags. */
603
619
  enterParameters(): number {
604
620
  const scope = this.varScopes[this.varScopes.length - 1]!;
@@ -1831,10 +1831,17 @@ export abstract class NodeFactoryBase {
1831
1831
  modifiers: ModifierList | undefined,
1832
1832
  keyword: SyntaxKind,
1833
1833
  name: ModuleName,
1834
+ attributes: TypeLiteralNode | undefined,
1834
1835
  body: ModuleBody | undefined,
1835
1836
  ): ModuleDeclaration {
1836
- if (modifiers !== node.modifiers || keyword !== node.keyword || name !== node.name || body !== node.body) {
1837
- const updated = new ModuleDeclaration(modifiers, keyword, name, body);
1837
+ if (
1838
+ modifiers !== node.modifiers ||
1839
+ keyword !== node.keyword ||
1840
+ name !== node.name ||
1841
+ attributes !== node.attributes ||
1842
+ body !== node.body
1843
+ ) {
1844
+ const updated = new ModuleDeclaration(modifiers, keyword, name, attributes, body);
1838
1845
  this.finishUpdate(updated, node);
1839
1846
  return updated;
1840
1847
  }
@@ -2121,7 +2128,7 @@ export abstract class NodeFactoryBase {
2121
2128
  return node;
2122
2129
  }
2123
2130
 
2124
- updateQualifiedName(node: QualifiedName, left: EntityName, right: Identifier): QualifiedName {
2131
+ updateQualifiedName(node: QualifiedName, left: EntityName, right: MemberName): QualifiedName {
2125
2132
  if (left !== node.left || right !== node.right) {
2126
2133
  const updated = new QualifiedName(left, right);
2127
2134
  this.finishUpdate(updated, node);
@@ -70,6 +70,7 @@ import {
70
70
  } from './helpers.js';
71
71
  import { formatGeneratedName, isMemberName, nodeIsSynthesized } from './utilities.js';
72
72
  import { OuterExpressionKinds, isOuterExpression, outerExpressionOperand } from '../transformers/utilities.js';
73
+ import { IdentifierName } from '../identifier-name.js';
73
74
 
74
75
  /**
75
76
  * The node factory of an emit context. The context is the factory (`EmitContext` extends it), so the two are one
@@ -108,7 +109,7 @@ export abstract class NodeFactory extends NodeFactoryBase {
108
109
  }
109
110
 
110
111
  cloneIdentifier(node: Identifier): Identifier {
111
- return this.cloneNode(node, new Identifier(node.text));
112
+ return this.cloneNode(node, new Identifier(node.identifierName));
112
113
  }
113
114
 
114
115
  createNodeList(nodes: Node[]): NodeList {
@@ -132,7 +133,7 @@ export abstract class NodeFactory extends NodeFactoryBase {
132
133
  }
133
134
 
134
135
  createIdentifier(text: string): Identifier {
135
- return this.created(new Identifier(text));
136
+ return this.created(new Identifier(new IdentifierName(text)));
136
137
  }
137
138
 
138
139
  createKeywordExpression(kind: SyntaxKind): KeywordExpression {
@@ -318,7 +319,10 @@ export abstract class NodeFactory extends NodeFactoryBase {
318
319
  createExpressionFromEntityName(node: Node): Node {
319
320
  if (node instanceof QualifiedName) {
320
321
  const left = this.createExpressionFromEntityName(node.left);
321
- const right = this.cloneIdentifier(node.right);
322
+ const right =
323
+ node.right instanceof PrivateIdentifier
324
+ ? this.cloneNode(node.right, new PrivateIdentifier(node.right.text))
325
+ : this.cloneIdentifier(node.right as Identifier);
322
326
  right.pos = node.right.pos;
323
327
  right.end = node.right.end;
324
328
  right.parent = node.right.parent;