diff --git a/lib/cs/diagnosticMessages.generated.json b/lib/cs/diagnosticMessages.generated.json index 6d1a4c2a8d9..1df80098b97 100644 --- a/lib/cs/diagnosticMessages.generated.json +++ b/lib/cs/diagnosticMessages.generated.json @@ -1628,7 +1628,7 @@ "Unexpected_token_1012": "Neočekávaný token", "Unexpected_token_A_constructor_method_accessor_or_property_was_expected_1068": "Neočekávaný token. Očekával se konstruktor, metoda, přístupový objekt nebo vlastnost.", "Unexpected_token_A_type_parameter_name_was_expected_without_curly_braces_1069": "Neočekávaný token. Očekával se název parametru typu bez složených závorek.", - "Unexpected_token_Did_you_mean_or_gt_1382": "Neočekávaný token. Měli jste na mysli {'>'} nebo >?", + "Unexpected_token_Did_you_mean_or_gt_1382": "Neočekávaný token. Měli jste na mysli {'>'} nebo >?", "Unexpected_token_Did_you_mean_or_rbrace_1381": "Neočekávaný token. Měli jste na mysli {'}'} nebo }?", "Unexpected_token_expected_1179": "Neočekávaný token. Očekává se znak {.", "Unknown_build_option_0_5072": "Neznámá možnost sestavení {0}", diff --git a/lib/de/diagnosticMessages.generated.json b/lib/de/diagnosticMessages.generated.json index 1ef32527889..8aa99fe9312 100644 --- a/lib/de/diagnosticMessages.generated.json +++ b/lib/de/diagnosticMessages.generated.json @@ -1628,7 +1628,7 @@ "Unexpected_token_1012": "Unerwartetes Token.", "Unexpected_token_A_constructor_method_accessor_or_property_was_expected_1068": "Unerwartetes Token. Ein Konstruktor, eine Methode, eine Zugriffsmethode oder eine Eigenschaft wurde erwartet.", "Unexpected_token_A_type_parameter_name_was_expected_without_curly_braces_1069": "Unerwartetes Token. Es wurde ein Typparametername ohne geschweifte Klammern erwartet.", - "Unexpected_token_Did_you_mean_or_gt_1382": "Unerwartetes Token. Meinten Sie \"{'>'}\" oder \">\"?", + "Unexpected_token_Did_you_mean_or_gt_1382": "Unerwartetes Token. Meinten Sie \"{'>'}\" oder \">\"?", "Unexpected_token_Did_you_mean_or_rbrace_1381": "Unerwartetes Token. Meinten Sie \"{'}'}\" oder \"}\"?", "Unexpected_token_expected_1179": "Unerwartetes Token. \"{\" wurde erwartet.", "Unknown_build_option_0_5072": "Unbekannte Buildoption \"{0}\".", diff --git a/lib/es/diagnosticMessages.generated.json b/lib/es/diagnosticMessages.generated.json index 3282192532b..242b20b0643 100644 --- a/lib/es/diagnosticMessages.generated.json +++ b/lib/es/diagnosticMessages.generated.json @@ -1628,7 +1628,7 @@ "Unexpected_token_1012": "Token inesperado.", "Unexpected_token_A_constructor_method_accessor_or_property_was_expected_1068": "Token inesperado. Se esperaba un constructor, un método, un descriptor de acceso o una propiedad.", "Unexpected_token_A_type_parameter_name_was_expected_without_curly_braces_1069": "Token inesperado. Se esperaba un nombre de parámetro de tipo sin llaves.", - "Unexpected_token_Did_you_mean_or_gt_1382": "Token inesperado. ¿Pretendía usar \"{'>'}\" o \">\"?", + "Unexpected_token_Did_you_mean_or_gt_1382": "Token inesperado. ¿Pretendía usar \"{'>'}\" o \">\"?", "Unexpected_token_Did_you_mean_or_rbrace_1381": "Token inesperado. ¿Pretendía usar \"{'}'}\" o \"}\"?", "Unexpected_token_expected_1179": "Token inesperado. Se esperaba \"{\".", "Unknown_build_option_0_5072": "Opción de compilación \"{0}\" desconocida.", diff --git a/lib/fr/diagnosticMessages.generated.json b/lib/fr/diagnosticMessages.generated.json index f961e17c4bc..b962857b712 100644 --- a/lib/fr/diagnosticMessages.generated.json +++ b/lib/fr/diagnosticMessages.generated.json @@ -1628,7 +1628,7 @@ "Unexpected_token_1012": "Jeton inattendu.", "Unexpected_token_A_constructor_method_accessor_or_property_was_expected_1068": "Jeton inattendu. Un constructeur, une méthode, un accesseur ou une propriété est attendu.", "Unexpected_token_A_type_parameter_name_was_expected_without_curly_braces_1069": "Jeton inattendu. Un nom de paramètre de type est attendu sans accolades.", - "Unexpected_token_Did_you_mean_or_gt_1382": "Jeton inattendu. Est-ce que vous avez voulu utiliser '{'>'}' ou '>' ?", + "Unexpected_token_Did_you_mean_or_gt_1382": "Jeton inattendu. Est-ce que vous avez voulu utiliser '{'>'}' ou '>' ?", "Unexpected_token_Did_you_mean_or_rbrace_1381": "Jeton inattendu. Est-ce que vous avez voulu utiliser '{'}'}' ou '}' ?", "Unexpected_token_expected_1179": "Jeton inattendu. '{' est attendu.", "Unknown_build_option_0_5072": "Option de build inconnue : '{0}'.", diff --git a/lib/it/diagnosticMessages.generated.json b/lib/it/diagnosticMessages.generated.json index 1e25f62e9b8..2acc6530a8a 100644 --- a/lib/it/diagnosticMessages.generated.json +++ b/lib/it/diagnosticMessages.generated.json @@ -1628,7 +1628,7 @@ "Unexpected_token_1012": "Token imprevisto.", "Unexpected_token_A_constructor_method_accessor_or_property_was_expected_1068": "Token imprevisto. È previsto un costruttore, un metodo, una funzione di accesso o una proprietà.", "Unexpected_token_A_type_parameter_name_was_expected_without_curly_braces_1069": "Token imprevisto. Sono previsti nomi di parametro senza parentesi graffe.", - "Unexpected_token_Did_you_mean_or_gt_1382": "Token imprevisto. Si intendeva `{'>'}` o `>`?", + "Unexpected_token_Did_you_mean_or_gt_1382": "Token imprevisto. Si intendeva `{'>'}` o `>`?", "Unexpected_token_Did_you_mean_or_rbrace_1381": "Token imprevisto. Si intendeva `{'}'}` o `}`?", "Unexpected_token_expected_1179": "Token imprevisto. È previsto '{'.", "Unknown_build_option_0_5072": "L'opzione di compilazione '{0}' è sconosciuta.", diff --git a/lib/ja/diagnosticMessages.generated.json b/lib/ja/diagnosticMessages.generated.json index 9e9277e67f7..5bc780d7a92 100644 --- a/lib/ja/diagnosticMessages.generated.json +++ b/lib/ja/diagnosticMessages.generated.json @@ -1628,7 +1628,7 @@ "Unexpected_token_1012": "予期しないトークンです。", "Unexpected_token_A_constructor_method_accessor_or_property_was_expected_1068": "予期しないトークンです。コンストラクター、メソッド、アクセサー、またはプロパティが必要です。", "Unexpected_token_A_type_parameter_name_was_expected_without_curly_braces_1069": "予期しないトークンです。型パラメーター名には、中かっこを含めることはできません。", - "Unexpected_token_Did_you_mean_or_gt_1382": "予期しないトークンです。`{'>'}` または `>` を意図していましたか?", + "Unexpected_token_Did_you_mean_or_gt_1382": "予期しないトークンです。`{'>'}` または `>` を意図していましたか?", "Unexpected_token_Did_you_mean_or_rbrace_1381": "予期しないトークンです。`{'}'}` または `}` を意図していましたか?", "Unexpected_token_expected_1179": "予期しないトークンです。'{' が必要です。", "Unknown_build_option_0_5072": "'{0}' は不明なビルド オプションです。", diff --git a/lib/ko/diagnosticMessages.generated.json b/lib/ko/diagnosticMessages.generated.json index 7ebb62fe2b6..3fba8e28eea 100644 --- a/lib/ko/diagnosticMessages.generated.json +++ b/lib/ko/diagnosticMessages.generated.json @@ -1628,7 +1628,7 @@ "Unexpected_token_1012": "예기치 않은 토큰입니다.", "Unexpected_token_A_constructor_method_accessor_or_property_was_expected_1068": "예기치 않은 토큰입니다. 생성자, 메서드, 접근자 또는 속성이 필요합니다.", "Unexpected_token_A_type_parameter_name_was_expected_without_curly_braces_1069": "예기치 않은 토큰입니다. 중괄호가 없는 형식 매개 변수 이름이 필요합니다.", - "Unexpected_token_Did_you_mean_or_gt_1382": "예기치 않은 토큰입니다. '{'>'}' 또는 '>'를 사용하시겠습니까?", + "Unexpected_token_Did_you_mean_or_gt_1382": "예기치 않은 토큰입니다. '{'>'}' 또는 '>'를 사용하시겠습니까?", "Unexpected_token_Did_you_mean_or_rbrace_1381": "예기치 않은 토큰입니다. '{'}'}' 또는 '}'를 사용하시겠습니까?", "Unexpected_token_expected_1179": "예기치 않은 토큰입니다. '{'가 있어야 합니다.", "Unknown_build_option_0_5072": "알 수 없는 빌드 옵션 '{0}'입니다.", diff --git a/lib/pl/diagnosticMessages.generated.json b/lib/pl/diagnosticMessages.generated.json index a1d5e9e9408..fc734cc2d16 100644 --- a/lib/pl/diagnosticMessages.generated.json +++ b/lib/pl/diagnosticMessages.generated.json @@ -1628,7 +1628,7 @@ "Unexpected_token_1012": "Nieoczekiwany token.", "Unexpected_token_A_constructor_method_accessor_or_property_was_expected_1068": "Nieoczekiwany token. Oczekiwano konstruktora, metody, metody dostępu lub właściwości.", "Unexpected_token_A_type_parameter_name_was_expected_without_curly_braces_1069": "Nieoczekiwany token. Oczekiwano nazwy parametru typu bez nawiasów klamrowych.", - "Unexpected_token_Did_you_mean_or_gt_1382": "Nieoczekiwany token. Czy chodziło o „{'>'}” lub „>”?", + "Unexpected_token_Did_you_mean_or_gt_1382": "Nieoczekiwany token. Czy chodziło o „{'>'}” lub „>”?", "Unexpected_token_Did_you_mean_or_rbrace_1381": "Nieoczekiwany token. Czy chodziło o „{'}'}” lub „}”?", "Unexpected_token_expected_1179": "Nieoczekiwany token. Oczekiwano znaku „{”.", "Unknown_build_option_0_5072": "Nieznana opcja kompilacji „{0}”.", diff --git a/lib/pt-br/diagnosticMessages.generated.json b/lib/pt-br/diagnosticMessages.generated.json index 5e625fe6dcf..cec13e7f807 100644 --- a/lib/pt-br/diagnosticMessages.generated.json +++ b/lib/pt-br/diagnosticMessages.generated.json @@ -1628,7 +1628,7 @@ "Unexpected_token_1012": "Token inesperado.", "Unexpected_token_A_constructor_method_accessor_or_property_was_expected_1068": "Token inesperado. Um construtor, método, acessador ou propriedade era esperado.", "Unexpected_token_A_type_parameter_name_was_expected_without_curly_braces_1069": "Token inesperado. Era esperado um nome de parâmetro de tipo sem chaves.", - "Unexpected_token_Did_you_mean_or_gt_1382": "Token inesperado. Você quis dizer '{'>'}' ou '>'?", + "Unexpected_token_Did_you_mean_or_gt_1382": "Token inesperado. Você quis dizer '{'>'}' ou '>'?", "Unexpected_token_Did_you_mean_or_rbrace_1381": "Token inesperado. Você quis dizer '{'}'}' ou '}'?", "Unexpected_token_expected_1179": "Token inesperado. '{' esperado.", "Unknown_build_option_0_5072": "Opção de build '{0}' desconhecida.", diff --git a/lib/ru/diagnosticMessages.generated.json b/lib/ru/diagnosticMessages.generated.json index a0eee83b5eb..1de4b2b1c0c 100644 --- a/lib/ru/diagnosticMessages.generated.json +++ b/lib/ru/diagnosticMessages.generated.json @@ -1628,7 +1628,7 @@ "Unexpected_token_1012": "Неожиданный токен.", "Unexpected_token_A_constructor_method_accessor_or_property_was_expected_1068": "Неожиданный токен. Ожидался конструктор, метод, метод доступа или свойство.", "Unexpected_token_A_type_parameter_name_was_expected_without_curly_braces_1069": "Непредвиденная лексема. Ожидалось имя параметра типа без фигурных скобок.", - "Unexpected_token_Did_you_mean_or_gt_1382": "Непредвиденный токен. Возможно, вы хотели использовать \"{'>'}\" или \">\"?", + "Unexpected_token_Did_you_mean_or_gt_1382": "Непредвиденный токен. Возможно, вы хотели использовать \"{'>'}\" или \">\"?", "Unexpected_token_Did_you_mean_or_rbrace_1381": "Непредвиденный токен. Возможно, вы хотели использовать \"{'}'}\" или \"}\"?", "Unexpected_token_expected_1179": "Неожиданный токен. Ожидался символ \"{\".", "Unknown_build_option_0_5072": "Неизвестный параметр сборки \"{0}\".", diff --git a/lib/tr/diagnosticMessages.generated.json b/lib/tr/diagnosticMessages.generated.json index f42f4a74de6..36a7594ca57 100644 --- a/lib/tr/diagnosticMessages.generated.json +++ b/lib/tr/diagnosticMessages.generated.json @@ -1628,7 +1628,7 @@ "Unexpected_token_1012": "Beklenmeyen belirteç.", "Unexpected_token_A_constructor_method_accessor_or_property_was_expected_1068": "Beklenmeyen belirteç. Bir oluşturucu, metot, erişimci veya özellik bekleniyordu.", "Unexpected_token_A_type_parameter_name_was_expected_without_curly_braces_1069": "Beklenmeyen belirteç. Küme ayracı olmadan bir tür parametresi adı bekleniyordu.", - "Unexpected_token_Did_you_mean_or_gt_1382": "Beklenmeyen belirteç. Şunu mu demek istediniz: `{'>'}` veya `>`?", + "Unexpected_token_Did_you_mean_or_gt_1382": "Beklenmeyen belirteç. Şunu mu demek istediniz: `{'>'}` veya `>`?", "Unexpected_token_Did_you_mean_or_rbrace_1381": "Beklenmeyen belirteç. Şunu mu demek istediniz: `{'}'}` veya `}`?", "Unexpected_token_expected_1179": "Beklenmeyen belirteç. '{' bekleniyordu.", "Unknown_build_option_0_5072": "Bilinmeyen '{0}' derleme seçeneği.", diff --git a/lib/tsc.js b/lib/tsc.js index 4a425cf3d9c..19b930bbe16 100644 --- a/lib/tsc.js +++ b/lib/tsc.js @@ -6923,7 +6923,6 @@ var Diagnostics = { Disallow_inconsistently_cased_references_to_the_same_file: diag(6078, 3 /* Message */, "Disallow_inconsistently_cased_references_to_the_same_file_6078", "Disallow inconsistently-cased references to the same file."), Specify_library_files_to_be_included_in_the_compilation: diag(6079, 3 /* Message */, "Specify_library_files_to_be_included_in_the_compilation_6079", "Specify library files to be included in the compilation."), Specify_JSX_code_generation: diag(6080, 3 /* Message */, "Specify_JSX_code_generation_6080", "Specify JSX code generation."), - File_0_has_an_unsupported_extension_so_skipping_it: diag(6081, 3 /* Message */, "File_0_has_an_unsupported_extension_so_skipping_it_6081", "File '{0}' has an unsupported extension, so skipping it."), Only_amd_and_system_modules_are_supported_alongside_0: diag(6082, 1 /* Error */, "Only_amd_and_system_modules_are_supported_alongside_0_6082", "Only 'amd' and 'system' modules are supported alongside --{0}."), Base_directory_to_resolve_non_absolute_module_names: diag(6083, 3 /* Message */, "Base_directory_to_resolve_non_absolute_module_names_6083", "Base directory to resolve non-absolute module names."), Deprecated_Use_jsxFactory_instead_Specify_the_object_invoked_for_createElement_when_targeting_react_JSX_emit: diag(6084, 3 /* Message */, "Deprecated_Use_jsxFactory_instead_Specify_the_object_invoked_for_createElement_when_targeting_react__6084", "[Deprecated] Use '--jsxFactory' instead. Specify the object invoked for createElement when targeting 'react' JSX emit"), @@ -17042,7 +17041,8 @@ function usesExtensionsOnImports({ imports }, hasExtension2 = or(hasJSFileExtens } function getModuleSpecifierEndingPreference(preference, resolutionMode, compilerOptions, sourceFile) { const moduleResolution = getEmitModuleResolutionKind(compilerOptions); - if (preference === "js" || resolutionMode === 99 /* ESNext */ && 3 /* Node16 */ <= moduleResolution && moduleResolution <= 99 /* NodeNext */) { + const moduleResolutionIsNodeNext = 3 /* Node16 */ <= moduleResolution && moduleResolution <= 99 /* NodeNext */; + if (preference === "js" || resolutionMode === 99 /* ESNext */ && moduleResolutionIsNodeNext) { if (!shouldAllowImportingTsExtension(compilerOptions)) { return 2 /* JsExtension */; } @@ -17060,16 +17060,19 @@ function getModuleSpecifierEndingPreference(preference, resolutionMode, compiler return inferPreference(); function inferPreference() { let usesJsExtensions = false; - const specifiers = sourceFile.imports.length ? sourceFile.imports.map((i) => i.text) : isSourceFileJS(sourceFile) ? getRequiresAtTopOfFile(sourceFile).map((r) => r.arguments[0].text) : emptyArray; + const specifiers = sourceFile.imports.length ? sourceFile.imports : isSourceFileJS(sourceFile) ? getRequiresAtTopOfFile(sourceFile).map((r) => r.arguments[0]) : emptyArray; for (const specifier of specifiers) { - if (pathIsRelative(specifier)) { - if (fileExtensionIsOneOf(specifier, extensionsNotSupportingExtensionlessResolution)) { + if (pathIsRelative(specifier.text)) { + if (moduleResolutionIsNodeNext && resolutionMode === 1 /* CommonJS */ && getModeForUsageLocation(sourceFile, specifier, compilerOptions) === 99 /* ESNext */) { continue; } - if (hasTSFileExtension(specifier)) { + if (fileExtensionIsOneOf(specifier.text, extensionsNotSupportingExtensionlessResolution)) { + continue; + } + if (hasTSFileExtension(specifier.text)) { return 3 /* TsExtension */; } - if (hasJSFileExtension(specifier)) { + if (hasJSFileExtension(specifier.text)) { usesJsExtensions = true; } } @@ -32493,7 +32496,7 @@ var Parser; if (!jsDocDiagnostics) { jsDocDiagnostics = []; } - jsDocDiagnostics.push(...parseDiagnostics); + addRange(jsDocDiagnostics, parseDiagnostics, saveParseDiagnosticsLength); } currentToken = saveToken; parseDiagnostics.length = saveParseDiagnosticsLength; @@ -38721,15 +38724,9 @@ function loadNodeModuleFromDirectoryWorker(extensions, candidate, onlyRecordFail } } const loader = (extensions2, candidate2, onlyRecordFailures2, state2) => { - const fromFile = tryFile(candidate2, onlyRecordFailures2, state2); + const fromFile = loadFileNameFromPackageJsonField(extensions2, candidate2, onlyRecordFailures2, state2); if (fromFile) { - const resolved = resolvedIfExtensionMatches(extensions2, fromFile); - if (resolved) { - return noPackageId(resolved); - } - if (state2.traceEnabled) { - trace(state2.host, Diagnostics.File_0_has_an_unsupported_extension_so_skipping_it, fromFile); - } + return noPackageId(fromFile); } const expandedExtensions = extensions2 === 4 /* Declaration */ ? 1 /* TypeScript */ | 4 /* Declaration */ : extensions2; const features = state2.features; @@ -38785,10 +38782,6 @@ function loadNodeModuleFromDirectoryWorker(extensions, candidate, onlyRecordFail return loadModuleFromFile(extensions, indexPath, onlyRecordFailuresForIndex, state); } } -function resolvedIfExtensionMatches(extensions, path, resolvedUsingTsExtension) { - const ext = tryGetExtensionFromPath2(path); - return ext !== void 0 && extensionIsOk(extensions, ext) ? { path, ext, resolvedUsingTsExtension } : void 0; -} function extensionIsOk(extensions, extension) { return extensions & 2 /* JavaScript */ && (extension === ".js" /* Js */ || extension === ".jsx" /* Jsx */ || extension === ".mjs" /* Mjs */ || extension === ".cjs" /* Cjs */) || extensions & 1 /* TypeScript */ && (extension === ".ts" /* Ts */ || extension === ".tsx" /* Tsx */ || extension === ".mts" /* Mts */ || extension === ".cts" /* Cts */) || extensions & 4 /* Declaration */ && (extension === ".d.ts" /* Dts */ || extension === ".d.mts" /* Dmts */ || extension === ".d.cts" /* Dcts */) || extensions & 8 /* Json */ && extension === ".json" /* Json */ || false; } @@ -42636,11 +42629,12 @@ function createGetSymbolWalker(getRestTypeOfSignature, getTypePredicateOfSignatu } // src/compiler/moduleSpecifiers.ts -function getPreferences({ importModuleSpecifierPreference, importModuleSpecifierEnding }, compilerOptions, importingSourceFile, oldImportSpecifier) { - const preferredEnding = getPreferredEnding(); +function getModuleSpecifierPreferences({ importModuleSpecifierPreference, importModuleSpecifierEnding }, compilerOptions, importingSourceFile, oldImportSpecifier) { + const filePreferredEnding = getPreferredEnding(); return { relativePreference: oldImportSpecifier !== void 0 ? isExternalModuleNameRelative(oldImportSpecifier) ? 0 /* Relative */ : 1 /* NonRelative */ : importModuleSpecifierPreference === "relative" ? 0 /* Relative */ : importModuleSpecifierPreference === "non-relative" ? 1 /* NonRelative */ : importModuleSpecifierPreference === "project-relative" ? 3 /* ExternalNonRelative */ : 2 /* Shortest */, getAllowedEndingsInPreferredOrder: (syntaxImpliedNodeFormat) => { + const preferredEnding = syntaxImpliedNodeFormat !== importingSourceFile.impliedNodeFormat ? getPreferredEnding(syntaxImpliedNodeFormat) : filePreferredEnding; if ((syntaxImpliedNodeFormat ?? importingSourceFile.impliedNodeFormat) === 99 /* ESNext */) { if (shouldAllowImportingTsExtension(compilerOptions, importingSourceFile.fileName)) { return [3 /* TsExtension */, 2 /* JsExtension */]; @@ -42665,7 +42659,7 @@ function getPreferences({ importModuleSpecifierPreference, importModuleSpecifier } } }; - function getPreferredEnding() { + function getPreferredEnding(resolutionMode) { if (oldImportSpecifier !== void 0) { if (hasJSFileExtension(oldImportSpecifier)) return 2 /* JsExtension */; @@ -42674,14 +42668,14 @@ function getPreferences({ importModuleSpecifierPreference, importModuleSpecifier } return getModuleSpecifierEndingPreference( importModuleSpecifierEnding, - importingSourceFile.impliedNodeFormat, + resolutionMode ?? importingSourceFile.impliedNodeFormat, compilerOptions, importingSourceFile ); } } function getModuleSpecifier(compilerOptions, importingSourceFile, importingSourceFileName, toFileName2, host, options = {}) { - return getModuleSpecifierWorker(compilerOptions, importingSourceFile, importingSourceFileName, toFileName2, host, getPreferences({}, compilerOptions, importingSourceFile), {}, options); + return getModuleSpecifierWorker(compilerOptions, importingSourceFile, importingSourceFileName, toFileName2, host, getModuleSpecifierPreferences({}, compilerOptions, importingSourceFile), {}, options); } function getModuleSpecifierWorker(compilerOptions, importingSourceFile, importingSourceFileName, toFileName2, host, preferences, userPreferences, options = {}) { const info = getInfo(importingSourceFileName, host); @@ -42753,7 +42747,7 @@ function getModuleSpecifiersWithCacheInfo(moduleSymbol, checker, compilerOptions } function computeModuleSpecifiers(modulePaths, compilerOptions, importingSourceFile, host, userPreferences, options = {}, forAutoImport) { const info = getInfo(importingSourceFile.fileName, host); - const preferences = getPreferences(userPreferences, compilerOptions, importingSourceFile); + const preferences = getModuleSpecifierPreferences(userPreferences, compilerOptions, importingSourceFile); const existingSpecifier = forEach(modulePaths, (modulePath) => forEach( host.getFileIncludeReasons().get(toPath(modulePath.path, host.getCurrentDirectory(), info.getCanonicalFileName)), (reason) => { @@ -43263,7 +43257,7 @@ function tryGetModuleNameAsNodeModule({ path, isRedirect }, { getCanonicalFileNa if (!parts) { return void 0; } - const preferences = getPreferences(userPreferences, options, importingSourceFile); + const preferences = getModuleSpecifierPreferences(userPreferences, options, importingSourceFile); const allowedEndings = preferences.getAllowedEndingsInPreferredOrder(); let moduleSpecifier = path; let isPackageRootPath = false; @@ -45915,6 +45909,11 @@ function createTypeChecker(host) { diagnosticMessage = error(errorLocation, Diagnostics.Class_0_used_before_its_declaration, declarationName); } else if (result.flags & 256 /* RegularEnum */) { diagnosticMessage = error(errorLocation, Diagnostics.Enum_0_used_before_its_declaration, declarationName); + } else { + Debug.assert(!!(result.flags & 128 /* ConstEnum */)); + if (getIsolatedModules(compilerOptions)) { + diagnosticMessage = error(errorLocation, Diagnostics.Enum_0_used_before_its_declaration, declarationName); + } } if (diagnosticMessage) { addRelatedInfo(diagnosticMessage, createDiagnosticForNode(declaration, Diagnostics._0_is_declared_here, declarationName)); @@ -54467,6 +54466,8 @@ function createTypeChecker(host) { result.compositeSignatures = concatenate(left.compositeKind !== 2097152 /* Intersection */ && left.compositeSignatures || [left], [right]); if (paramMapper) { result.mapper = left.compositeKind !== 2097152 /* Intersection */ && left.mapper && left.compositeSignatures ? combineTypeMappers(left.mapper, paramMapper) : paramMapper; + } else if (left.compositeKind !== 2097152 /* Intersection */ && left.mapper && left.compositeSignatures) { + result.mapper = left.mapper; } return result; } @@ -55064,7 +55065,7 @@ function createTypeChecker(host) { return simplified !== type ? simplified : getConstraintOfType(type); } function getConstraintFromIndexedAccess(type) { - if (isMappedTypeGenericIndexedAccess(type) || isGenericMappedType(type.objectType)) { + if (isMappedTypeGenericIndexedAccess(type)) { return substituteIndexedMappedType(type.objectType, type.indexType); } const indexConstraint = getSimplifiedTypeOrConstraint(type.indexType); @@ -55314,11 +55315,15 @@ function createTypeChecker(host) { return type.resolvedApparentType || (type.resolvedApparentType = getResolvedApparentTypeOfMappedType(type)); } function getResolvedApparentTypeOfMappedType(type) { - const typeVariable = getHomomorphicTypeVariable(type); - if (typeVariable && !type.declaration.nameType) { - const constraint = getConstraintOfTypeParameter(typeVariable); - if (constraint && everyType(constraint, isArrayOrTupleType)) { - return instantiateType(type, prependTypeMapping(typeVariable, constraint, type.mapper)); + const target = type.target ?? type; + const typeVariable = getHomomorphicTypeVariable(target); + if (typeVariable && !target.declaration.nameType) { + const constraint = getConstraintTypeFromMappedType(type); + if (constraint.flags & 4194304 /* Index */) { + const baseConstraint = getBaseConstraintOfType(constraint.type); + if (baseConstraint && everyType(baseConstraint, isArrayOrTupleType)) { + return instantiateType(target, prependTypeMapping(typeVariable, baseConstraint, type.mapper)); + } } } return type; @@ -55577,10 +55582,14 @@ function createTypeChecker(host) { return errorInfo; } function getPropertyOfType(type, name, skipObjectFunctionPropertyAugment, includeTypeOnlyMembers) { + var _a, _b; type = getReducedApparentType(type); if (type.flags & 524288 /* Object */) { const resolved = resolveStructuredTypeMembers(type); const symbol = resolved.members.get(name); + if (symbol && !includeTypeOnlyMembers && ((_a = type.symbol) == null ? void 0 : _a.flags) & 512 /* ValueModule */ && ((_b = getSymbolLinks(type.symbol).typeOnlyExportStarMap) == null ? void 0 : _b.has(name))) { + return void 0; + } if (symbol && symbolIsValue(symbol, includeTypeOnlyMembers)) { return symbol; } @@ -57353,7 +57362,7 @@ function createTypeChecker(host) { return target.objectFlags & 8 /* Tuple */ ? createNormalizedTupleType(target, typeArguments) : createTypeReference(target, typeArguments); } function createNormalizedTupleType(target, elementTypes) { - var _a, _b, _c; + var _a, _b, _c, _d; if (!(target.combinedFlags & 14 /* NonRequired */)) { return createTypeReference(target, elementTypes); } @@ -57373,8 +57382,10 @@ function createTypeChecker(host) { const type = elementTypes[i]; const flags = target.elementFlags[i]; if (flags & 8 /* Variadic */) { - if (type.flags & 58982400 /* InstantiableNonPrimitive */ || isGenericMappedType(type)) { - addElement(type, 8 /* Variadic */, (_a = target.labeledElementDeclarations) == null ? void 0 : _a[i]); + if (type.flags & 1 /* Any */) { + addElement(type, 4 /* Rest */, (_a = target.labeledElementDeclarations) == null ? void 0 : _a[i]); + } else if (type.flags & 58982400 /* InstantiableNonPrimitive */ || isGenericMappedType(type)) { + addElement(type, 8 /* Variadic */, (_b = target.labeledElementDeclarations) == null ? void 0 : _b[i]); } else if (isTupleType(type)) { const elements = getElementTypes(type); if (elements.length + expandedTypes.length >= 1e4) { @@ -57389,10 +57400,10 @@ function createTypeChecker(host) { return addElement(t, type.target.elementFlags[n], (_a2 = type.target.labeledElementDeclarations) == null ? void 0 : _a2[n]); }); } else { - addElement(isArrayLikeType(type) && getIndexTypeOfType(type, numberType) || errorType, 4 /* Rest */, (_b = target.labeledElementDeclarations) == null ? void 0 : _b[i]); + addElement(isArrayLikeType(type) && getIndexTypeOfType(type, numberType) || errorType, 4 /* Rest */, (_c = target.labeledElementDeclarations) == null ? void 0 : _c[i]); } } else { - addElement(type, flags, (_c = target.labeledElementDeclarations) == null ? void 0 : _c[i]); + addElement(type, flags, (_d = target.labeledElementDeclarations) == null ? void 0 : _d[i]); } } for (let i = 0; i < lastRequiredIndex; i++) { @@ -58756,10 +58767,6 @@ function createTypeChecker(host) { } return type; } - function maybeCloneTypeParameter(p) { - const constraint = getConstraintOfTypeParameter(p); - return constraint && (isGenericObjectType(constraint) || isGenericIndexType(constraint)) ? cloneTypeParameter(p) : p; - } function isSimpleTupleType(node) { return isTupleTypeNode(node) && length(node.elements) > 0 && !some(node.elements, (e) => isOptionalTypeNode(e) || isRestTypeNode(e) || isNamedTupleMember(e) && !!(e.questionToken || e.dotDotDotToken)); } @@ -58789,27 +58796,19 @@ function createTypeChecker(host) { const checkTypeDeferred = isDeferredType(checkType, checkTuples); let combinedMapper; if (root.inferTypeParameters) { - const freshParams = sameMap(root.inferTypeParameters, maybeCloneTypeParameter); - const freshMapper = freshParams !== root.inferTypeParameters ? createTypeMapper(root.inferTypeParameters, freshParams) : void 0; const context = createInferenceContext( - freshParams, + root.inferTypeParameters, /*signature*/ void 0, 0 /* None */ ); - if (freshMapper) { - const freshCombinedMapper = combineTypeMappers(mapper, freshMapper); - for (let i = 0; i < freshParams.length; i++) { - if (freshParams[i] !== root.inferTypeParameters[i]) { - freshParams[i].mapper = freshCombinedMapper; - } - } + if (mapper) { + context.nonFixingMapper = combineTypeMappers(context.nonFixingMapper, mapper); } if (!checkTypeDeferred) { - inferTypes(context.inferences, checkType, instantiateType(extendsType, freshMapper), 512 /* NoConstraints */ | 1024 /* AlwaysStrict */); + inferTypes(context.inferences, checkType, extendsType, 512 /* NoConstraints */ | 1024 /* AlwaysStrict */); } - const innerMapper = combineTypeMappers(freshMapper, context.mapper); - combinedMapper = mapper ? combineTypeMappers(innerMapper, mapper) : innerMapper; + combinedMapper = mapper ? combineTypeMappers(context.mapper, mapper) : context.mapper; } const inferredExtendsType = combinedMapper ? instantiateType(root.extendsType, combinedMapper) : extendsType; if (!checkTypeDeferred && !isDeferredType(inferredExtendsType, checkTuples)) { @@ -59786,8 +59785,8 @@ function createTypeChecker(host) { if (!result) { const newMapper = createTypeMapper(root.outerTypeParameters, typeArguments); const checkType = root.checkType; - const distributionType = root.isDistributive ? getMappedType(checkType, newMapper) : void 0; - result = distributionType && checkType !== distributionType && distributionType.flags & (1048576 /* Union */ | 131072 /* Never */) ? mapTypeWithAlias(getReducedType(distributionType), (t) => getConditionalType(root, prependTypeMapping(checkType, t, newMapper), forConstraint), aliasSymbol, aliasTypeArguments) : getConditionalType(root, newMapper, forConstraint, aliasSymbol, aliasTypeArguments); + const distributionType = root.isDistributive ? getReducedType(getMappedType(checkType, newMapper)) : void 0; + result = distributionType && checkType !== distributionType && distributionType.flags & (1048576 /* Union */ | 131072 /* Never */) ? mapTypeWithAlias(distributionType, (t) => getConditionalType(root, prependTypeMapping(checkType, t, newMapper), forConstraint), aliasSymbol, aliasTypeArguments) : getConditionalType(root, newMapper, forConstraint, aliasSymbol, aliasTypeArguments); root.instantiations.set(id, result); } return result; @@ -60661,8 +60660,8 @@ function createTypeChecker(host) { const paramCount = sourceRestType || targetRestType ? Math.min(sourceCount, targetCount) : Math.max(sourceCount, targetCount); const restIndex = sourceRestType || targetRestType ? paramCount - 1 : -1; for (let i = 0; i < paramCount; i++) { - const sourceType = i === restIndex ? getRestTypeAtPosition(source, i) : tryGetTypeAtPosition(source, i); - const targetType = i === restIndex ? getRestTypeAtPosition(target, i) : tryGetTypeAtPosition(target, i); + const sourceType = i === restIndex ? getRestOrAnyTypeAtPosition(source, i) : tryGetTypeAtPosition(source, i); + const targetType = i === restIndex ? getRestOrAnyTypeAtPosition(target, i) : tryGetTypeAtPosition(target, i); if (sourceType && targetType) { const sourceSig = checkMode & 3 /* Callback */ || isInstantiatedGenericParameter(source, i) ? void 0 : getSingleCallSignature(getNonNullableType(sourceType)); const targetSig = checkMode & 3 /* Callback */ || isInstantiatedGenericParameter(target, i) ? void 0 : getSingleCallSignature(getNonNullableType(targetType)); @@ -65645,7 +65644,7 @@ function createTypeChecker(host) { function hasMatchingArgument(expression, reference) { if (expression.arguments) { for (const argument of expression.arguments) { - if (isOrContainsMatchingReference(reference, argument) || optionalChainContainsReference(argument, reference)) { + if (isOrContainsMatchingReference(reference, argument) || optionalChainContainsReference(argument, reference) || getCandidateDiscriminantPropertyAccess(argument, reference)) { return true; } } @@ -65655,6 +65654,36 @@ function createTypeChecker(host) { } return false; } + function getCandidateDiscriminantPropertyAccess(expr, reference) { + if (isBindingPattern(reference) || isFunctionExpressionOrArrowFunction(reference) || isObjectLiteralMethod(reference)) { + if (isIdentifier(expr)) { + const symbol = getResolvedSymbol(expr); + const declaration = symbol.valueDeclaration; + if (declaration && (isBindingElement(declaration) || isParameter(declaration)) && reference === declaration.parent && !declaration.initializer && !declaration.dotDotDotToken) { + return declaration; + } + } + } else if (isAccessExpression(expr)) { + if (isMatchingReference(reference, expr.expression)) { + return expr; + } + } else if (isIdentifier(expr)) { + const symbol = getResolvedSymbol(expr); + if (isConstantVariable(symbol)) { + const declaration = symbol.valueDeclaration; + if (isVariableDeclaration(declaration) && !declaration.type && declaration.initializer && isAccessExpression(declaration.initializer) && isMatchingReference(reference, declaration.initializer.expression)) { + return declaration.initializer; + } + if (isBindingElement(declaration) && !declaration.initializer) { + const parent = declaration.parent.parent; + if (isVariableDeclaration(parent) && !parent.type && parent.initializer && (isIdentifier(parent.initializer) || isAccessExpression(parent.initializer)) && isMatchingReference(reference, parent.initializer)) { + return declaration; + } + } + } + } + return void 0; + } function getFlowNodeId(flow) { if (!flow.id || flow.id < 0) { flow.id = nextFlowId; @@ -66754,39 +66783,9 @@ function createTypeChecker(host) { } return result; } - function getCandidateDiscriminantPropertyAccess(expr) { - if (isBindingPattern(reference) || isFunctionExpressionOrArrowFunction(reference) || isObjectLiteralMethod(reference)) { - if (isIdentifier(expr)) { - const symbol = getResolvedSymbol(expr); - const declaration = symbol.valueDeclaration; - if (declaration && (isBindingElement(declaration) || isParameter(declaration)) && reference === declaration.parent && !declaration.initializer && !declaration.dotDotDotToken) { - return declaration; - } - } - } else if (isAccessExpression(expr)) { - if (isMatchingReference(reference, expr.expression)) { - return expr; - } - } else if (isIdentifier(expr)) { - const symbol = getResolvedSymbol(expr); - if (isConstantVariable(symbol)) { - const declaration = symbol.valueDeclaration; - if (isVariableDeclaration(declaration) && !declaration.type && declaration.initializer && isAccessExpression(declaration.initializer) && isMatchingReference(reference, declaration.initializer.expression)) { - return declaration.initializer; - } - if (isBindingElement(declaration) && !declaration.initializer) { - const parent = declaration.parent.parent; - if (isVariableDeclaration(parent) && !parent.type && parent.initializer && (isIdentifier(parent.initializer) || isAccessExpression(parent.initializer)) && isMatchingReference(reference, parent.initializer)) { - return declaration; - } - } - } - } - return void 0; - } function getDiscriminantPropertyAccess(expr, computedType) { if (declaredType.flags & 1048576 /* Union */ || computedType.flags & 1048576 /* Union */) { - const access = getCandidateDiscriminantPropertyAccess(expr); + const access = getCandidateDiscriminantPropertyAccess(expr, reference); if (access) { const name = getAccessedPropertyName(access); if (name) { @@ -73665,6 +73664,11 @@ function createTypeChecker(host) { } return createTupleType(types, flags, readonly, names); } + function getRestOrAnyTypeAtPosition(source, pos) { + const restType = getRestTypeAtPosition(source, pos); + const elementType = restType && getElementTypeOfArrayType(restType); + return elementType && isTypeAny(elementType) ? anyType : restType; + } function getParameterCount(signature) { const length2 = signature.parameters.length; if (signatureHasRestParameter(signature)) { @@ -73721,7 +73725,7 @@ function createTypeChecker(host) { if (signatureHasRestParameter(signature)) { const restType = getTypeOfSymbol(signature.parameters[signature.parameters.length - 1]); if (!isTupleType(restType)) { - return restType; + return isTypeAny(restType) ? anyArrayType : restType; } if (restType.target.hasRestElement) { return sliceTupleType(restType, restType.target.fixedLength); @@ -77025,20 +77029,17 @@ function createTypeChecker(host) { const objectType = type.objectType; const indexType = type.indexType; const objectIndexType = isGenericMappedType(objectType) && getMappedTypeNameTypeKind(objectType) === 2 /* Remapping */ ? getIndexTypeForMappedType(objectType, 0 /* None */) : getIndexType(objectType, 0 /* None */); - if (isTypeAssignableTo(indexType, objectIndexType)) { + const hasNumberIndexInfo = !!getIndexInfoOfType(objectType, numberType); + if (everyType(indexType, (t) => isTypeAssignableTo(t, objectIndexType) || hasNumberIndexInfo && isApplicableIndexType(t, numberType))) { if (accessNode.kind === 212 /* ElementAccessExpression */ && isAssignmentTarget(accessNode) && getObjectFlags(objectType) & 32 /* Mapped */ && getMappedTypeModifiers(objectType) & 1 /* IncludeReadonly */) { error(accessNode, Diagnostics.Index_signature_in_type_0_only_permits_reading, typeToString(objectType)); } return type; } - const apparentObjectType = getApparentType(objectType); - if (getIndexInfoOfType(apparentObjectType, numberType) && isTypeAssignableToKind(indexType, 296 /* NumberLike */)) { - return type; - } if (isGenericObjectType(objectType)) { const propertyName = getPropertyNameFromIndex(indexType, accessNode); if (propertyName) { - const propertySymbol = forEachType(apparentObjectType, (t) => getPropertyOfType(t, propertyName)); + const propertySymbol = forEachType(getApparentType(objectType), (t) => getPropertyOfType(t, propertyName)); if (propertySymbol && getDeclarationModifierFlagsFromSymbol(propertySymbol) & 6 /* NonPublicAccessibilityModifier */) { error(accessNode, Diagnostics.Private_or_protected_member_0_cannot_be_accessed_on_a_type_parameter, unescapeLeadingUnderscores(propertyName)); return errorType; @@ -83098,7 +83099,7 @@ function createTypeChecker(host) { true, location ); - const resolvedSymbol = valueSymbol && valueSymbol.flags & 2097152 /* Alias */ ? resolveAlias(valueSymbol) : valueSymbol; + const resolvedValueSymbol = valueSymbol && valueSymbol.flags & 2097152 /* Alias */ ? resolveAlias(valueSymbol) : valueSymbol; isTypeOnly || (isTypeOnly = !!(valueSymbol && getTypeOnlyAliasDeclaration(valueSymbol, 111551 /* Value */))); const typeSymbol = resolveEntityName( typeName, @@ -83106,26 +83107,30 @@ function createTypeChecker(host) { /*ignoreErrors*/ true, /*dontResolveAlias*/ - false, + true, location ); - if (resolvedSymbol && resolvedSymbol === typeSymbol) { + const resolvedTypeSymbol = typeSymbol && typeSymbol.flags & 2097152 /* Alias */ ? resolveAlias(typeSymbol) : typeSymbol; + if (!valueSymbol) { + isTypeOnly || (isTypeOnly = !!(typeSymbol && getTypeOnlyAliasDeclaration(typeSymbol, 788968 /* Type */))); + } + if (resolvedValueSymbol && resolvedValueSymbol === resolvedTypeSymbol) { const globalPromiseSymbol = getGlobalPromiseConstructorSymbol( /*reportErrors*/ false ); - if (globalPromiseSymbol && resolvedSymbol === globalPromiseSymbol) { + if (globalPromiseSymbol && resolvedValueSymbol === globalPromiseSymbol) { return 9 /* Promise */; } - const constructorType = getTypeOfSymbol(resolvedSymbol); + const constructorType = getTypeOfSymbol(resolvedValueSymbol); if (constructorType && isConstructorType(constructorType)) { return isTypeOnly ? 10 /* TypeWithCallSignature */ : 1 /* TypeWithConstructSignatureAndValue */; } } - if (!typeSymbol) { + if (!resolvedTypeSymbol) { return isTypeOnly ? 11 /* ObjectType */ : 0 /* Unknown */; } - const type = getDeclaredTypeOfSymbol(typeSymbol); + const type = getDeclaredTypeOfSymbol(resolvedTypeSymbol); if (isErrorType(type)) { return isTypeOnly ? 11 /* ObjectType */ : 0 /* Unknown */; } else if (type.flags & 3 /* AnyOrUnknown */) { @@ -88595,9 +88600,50 @@ function transformTypeScript(context) { return visitorWorker(node); } } - function visitElidableStatement(node) { + function isElisionBlocked(node) { const parsed = getParseTreeNode(node); - if (parsed !== node) { + if (parsed === node || isExportAssignment(node)) { + return false; + } + if (!parsed || parsed.kind !== node.kind) { + return true; + } + switch (node.kind) { + case 272 /* ImportDeclaration */: + Debug.assertNode(parsed, isImportDeclaration); + if (node.importClause !== parsed.importClause) { + return true; + } + if (node.attributes !== parsed.attributes) { + return true; + } + break; + case 271 /* ImportEqualsDeclaration */: + Debug.assertNode(parsed, isImportEqualsDeclaration); + if (node.name !== parsed.name) { + return true; + } + if (node.isTypeOnly !== parsed.isTypeOnly) { + return true; + } + if (node.moduleReference !== parsed.moduleReference && (isEntityName(node.moduleReference) || isEntityName(parsed.moduleReference))) { + return true; + } + break; + case 278 /* ExportDeclaration */: + Debug.assertNode(parsed, isExportDeclaration); + if (node.exportClause !== parsed.exportClause) { + return true; + } + if (node.attributes !== parsed.attributes) { + return true; + } + break; + } + return false; + } + function visitElidableStatement(node) { + if (isElisionBlocked(node)) { if (node.transformFlags & 1 /* ContainsTypeScript */) { return visitEachChild(node, visitor, context); } @@ -115236,7 +115282,7 @@ function createPrinter(printerOptions = {}, handlers = {}) { return getLiteralTextOfNode(textSourceNode, neverAsciiEscape, jsxAttributeEscape); } } - const flags = (neverAsciiEscape ? 1 /* NeverAsciiEscape */ : 0) | (jsxAttributeEscape ? 2 /* JsxAttributeEscape */ : 0) | (printerOptions.terminateUnterminatedLiterals ? 4 /* TerminateUnterminatedLiterals */ : 0) | (printerOptions.target && printerOptions.target === 99 /* ESNext */ ? 8 /* AllowNumericSeparator */ : 0); + const flags = (neverAsciiEscape ? 1 /* NeverAsciiEscape */ : 0) | (jsxAttributeEscape ? 2 /* JsxAttributeEscape */ : 0) | (printerOptions.terminateUnterminatedLiterals ? 4 /* TerminateUnterminatedLiterals */ : 0) | (printerOptions.target && printerOptions.target >= 8 /* ES2021 */ ? 8 /* AllowNumericSeparator */ : 0); return getLiteralText(node, currentSourceFile, flags); } function pushNameGenerationScope(node) { diff --git a/lib/tsserver.js b/lib/tsserver.js index 7254b1aff33..6b9cdd0a8db 100644 --- a/lib/tsserver.js +++ b/lib/tsserver.js @@ -10490,7 +10490,6 @@ var Diagnostics = { Disallow_inconsistently_cased_references_to_the_same_file: diag(6078, 3 /* Message */, "Disallow_inconsistently_cased_references_to_the_same_file_6078", "Disallow inconsistently-cased references to the same file."), Specify_library_files_to_be_included_in_the_compilation: diag(6079, 3 /* Message */, "Specify_library_files_to_be_included_in_the_compilation_6079", "Specify library files to be included in the compilation."), Specify_JSX_code_generation: diag(6080, 3 /* Message */, "Specify_JSX_code_generation_6080", "Specify JSX code generation."), - File_0_has_an_unsupported_extension_so_skipping_it: diag(6081, 3 /* Message */, "File_0_has_an_unsupported_extension_so_skipping_it_6081", "File '{0}' has an unsupported extension, so skipping it."), Only_amd_and_system_modules_are_supported_alongside_0: diag(6082, 1 /* Error */, "Only_amd_and_system_modules_are_supported_alongside_0_6082", "Only 'amd' and 'system' modules are supported alongside --{0}."), Base_directory_to_resolve_non_absolute_module_names: diag(6083, 3 /* Message */, "Base_directory_to_resolve_non_absolute_module_names_6083", "Base directory to resolve non-absolute module names."), Deprecated_Use_jsxFactory_instead_Specify_the_object_invoked_for_createElement_when_targeting_react_JSX_emit: diag(6084, 3 /* Message */, "Deprecated_Use_jsxFactory_instead_Specify_the_object_invoked_for_createElement_when_targeting_react__6084", "[Deprecated] Use '--jsxFactory' instead. Specify the object invoked for createElement when targeting 'react' JSX emit"), @@ -21249,7 +21248,8 @@ function usesExtensionsOnImports({ imports }, hasExtension2 = or(hasJSFileExtens } function getModuleSpecifierEndingPreference(preference, resolutionMode, compilerOptions, sourceFile) { const moduleResolution = getEmitModuleResolutionKind(compilerOptions); - if (preference === "js" || resolutionMode === 99 /* ESNext */ && 3 /* Node16 */ <= moduleResolution && moduleResolution <= 99 /* NodeNext */) { + const moduleResolutionIsNodeNext = 3 /* Node16 */ <= moduleResolution && moduleResolution <= 99 /* NodeNext */; + if (preference === "js" || resolutionMode === 99 /* ESNext */ && moduleResolutionIsNodeNext) { if (!shouldAllowImportingTsExtension(compilerOptions)) { return 2 /* JsExtension */; } @@ -21267,16 +21267,19 @@ function getModuleSpecifierEndingPreference(preference, resolutionMode, compiler return inferPreference(); function inferPreference() { let usesJsExtensions = false; - const specifiers = sourceFile.imports.length ? sourceFile.imports.map((i) => i.text) : isSourceFileJS(sourceFile) ? getRequiresAtTopOfFile(sourceFile).map((r) => r.arguments[0].text) : emptyArray; + const specifiers = sourceFile.imports.length ? sourceFile.imports : isSourceFileJS(sourceFile) ? getRequiresAtTopOfFile(sourceFile).map((r) => r.arguments[0]) : emptyArray; for (const specifier of specifiers) { - if (pathIsRelative(specifier)) { - if (fileExtensionIsOneOf(specifier, extensionsNotSupportingExtensionlessResolution)) { + if (pathIsRelative(specifier.text)) { + if (moduleResolutionIsNodeNext && resolutionMode === 1 /* CommonJS */ && getModeForUsageLocation(sourceFile, specifier, compilerOptions) === 99 /* ESNext */) { continue; } - if (hasTSFileExtension(specifier)) { + if (fileExtensionIsOneOf(specifier.text, extensionsNotSupportingExtensionlessResolution)) { + continue; + } + if (hasTSFileExtension(specifier.text)) { return 3 /* TsExtension */; } - if (hasJSFileExtension(specifier)) { + if (hasJSFileExtension(specifier.text)) { usesJsExtensions = true; } } @@ -36928,7 +36931,7 @@ var Parser; if (!jsDocDiagnostics) { jsDocDiagnostics = []; } - jsDocDiagnostics.push(...parseDiagnostics); + addRange(jsDocDiagnostics, parseDiagnostics, saveParseDiagnosticsLength); } currentToken = saveToken; parseDiagnostics.length = saveParseDiagnosticsLength; @@ -43393,15 +43396,9 @@ function loadNodeModuleFromDirectoryWorker(extensions, candidate, onlyRecordFail } } const loader = (extensions2, candidate2, onlyRecordFailures2, state2) => { - const fromFile = tryFile(candidate2, onlyRecordFailures2, state2); + const fromFile = loadFileNameFromPackageJsonField(extensions2, candidate2, onlyRecordFailures2, state2); if (fromFile) { - const resolved = resolvedIfExtensionMatches(extensions2, fromFile); - if (resolved) { - return noPackageId(resolved); - } - if (state2.traceEnabled) { - trace(state2.host, Diagnostics.File_0_has_an_unsupported_extension_so_skipping_it, fromFile); - } + return noPackageId(fromFile); } const expandedExtensions = extensions2 === 4 /* Declaration */ ? 1 /* TypeScript */ | 4 /* Declaration */ : extensions2; const features = state2.features; @@ -43457,10 +43454,6 @@ function loadNodeModuleFromDirectoryWorker(extensions, candidate, onlyRecordFail return loadModuleFromFile(extensions, indexPath, onlyRecordFailuresForIndex, state); } } -function resolvedIfExtensionMatches(extensions, path, resolvedUsingTsExtension) { - const ext = tryGetExtensionFromPath2(path); - return ext !== void 0 && extensionIsOk(extensions, ext) ? { path, ext, resolvedUsingTsExtension } : void 0; -} function extensionIsOk(extensions, extension) { return extensions & 2 /* JavaScript */ && (extension === ".js" /* Js */ || extension === ".jsx" /* Jsx */ || extension === ".mjs" /* Mjs */ || extension === ".cjs" /* Cjs */) || extensions & 1 /* TypeScript */ && (extension === ".ts" /* Ts */ || extension === ".tsx" /* Tsx */ || extension === ".mts" /* Mts */ || extension === ".cts" /* Cts */) || extensions & 4 /* Declaration */ && (extension === ".d.ts" /* Dts */ || extension === ".d.mts" /* Dmts */ || extension === ".d.cts" /* Dcts */) || extensions & 8 /* Json */ && extension === ".json" /* Json */ || false; } @@ -47328,9 +47321,11 @@ function createGetSymbolWalker(getRestTypeOfSignature, getTypePredicateOfSignatu // src/compiler/_namespaces/ts.moduleSpecifiers.ts var ts_moduleSpecifiers_exports = {}; __export(ts_moduleSpecifiers_exports, { + RelativePreference: () => RelativePreference, countPathComponents: () => countPathComponents, forEachFileNameOfModule: () => forEachFileNameOfModule, getModuleSpecifier: () => getModuleSpecifier, + getModuleSpecifierPreferences: () => getModuleSpecifierPreferences, getModuleSpecifiers: () => getModuleSpecifiers, getModuleSpecifiersWithCacheInfo: () => getModuleSpecifiersWithCacheInfo, getNodeModulesPackageName: () => getNodeModulesPackageName, @@ -47341,11 +47336,19 @@ __export(ts_moduleSpecifiers_exports, { }); // src/compiler/moduleSpecifiers.ts -function getPreferences({ importModuleSpecifierPreference, importModuleSpecifierEnding }, compilerOptions, importingSourceFile, oldImportSpecifier) { - const preferredEnding = getPreferredEnding(); +var RelativePreference = /* @__PURE__ */ ((RelativePreference2) => { + RelativePreference2[RelativePreference2["Relative"] = 0] = "Relative"; + RelativePreference2[RelativePreference2["NonRelative"] = 1] = "NonRelative"; + RelativePreference2[RelativePreference2["Shortest"] = 2] = "Shortest"; + RelativePreference2[RelativePreference2["ExternalNonRelative"] = 3] = "ExternalNonRelative"; + return RelativePreference2; +})(RelativePreference || {}); +function getModuleSpecifierPreferences({ importModuleSpecifierPreference, importModuleSpecifierEnding }, compilerOptions, importingSourceFile, oldImportSpecifier) { + const filePreferredEnding = getPreferredEnding(); return { relativePreference: oldImportSpecifier !== void 0 ? isExternalModuleNameRelative(oldImportSpecifier) ? 0 /* Relative */ : 1 /* NonRelative */ : importModuleSpecifierPreference === "relative" ? 0 /* Relative */ : importModuleSpecifierPreference === "non-relative" ? 1 /* NonRelative */ : importModuleSpecifierPreference === "project-relative" ? 3 /* ExternalNonRelative */ : 2 /* Shortest */, getAllowedEndingsInPreferredOrder: (syntaxImpliedNodeFormat) => { + const preferredEnding = syntaxImpliedNodeFormat !== importingSourceFile.impliedNodeFormat ? getPreferredEnding(syntaxImpliedNodeFormat) : filePreferredEnding; if ((syntaxImpliedNodeFormat ?? importingSourceFile.impliedNodeFormat) === 99 /* ESNext */) { if (shouldAllowImportingTsExtension(compilerOptions, importingSourceFile.fileName)) { return [3 /* TsExtension */, 2 /* JsExtension */]; @@ -47370,7 +47373,7 @@ function getPreferences({ importModuleSpecifierPreference, importModuleSpecifier } } }; - function getPreferredEnding() { + function getPreferredEnding(resolutionMode) { if (oldImportSpecifier !== void 0) { if (hasJSFileExtension(oldImportSpecifier)) return 2 /* JsExtension */; @@ -47379,20 +47382,20 @@ function getPreferences({ importModuleSpecifierPreference, importModuleSpecifier } return getModuleSpecifierEndingPreference( importModuleSpecifierEnding, - importingSourceFile.impliedNodeFormat, + resolutionMode ?? importingSourceFile.impliedNodeFormat, compilerOptions, importingSourceFile ); } } function updateModuleSpecifier(compilerOptions, importingSourceFile, importingSourceFileName, toFileName2, host, oldImportSpecifier, options = {}) { - const res = getModuleSpecifierWorker(compilerOptions, importingSourceFile, importingSourceFileName, toFileName2, host, getPreferences({}, compilerOptions, importingSourceFile, oldImportSpecifier), {}, options); + const res = getModuleSpecifierWorker(compilerOptions, importingSourceFile, importingSourceFileName, toFileName2, host, getModuleSpecifierPreferences({}, compilerOptions, importingSourceFile, oldImportSpecifier), {}, options); if (res === oldImportSpecifier) return void 0; return res; } function getModuleSpecifier(compilerOptions, importingSourceFile, importingSourceFileName, toFileName2, host, options = {}) { - return getModuleSpecifierWorker(compilerOptions, importingSourceFile, importingSourceFileName, toFileName2, host, getPreferences({}, compilerOptions, importingSourceFile), {}, options); + return getModuleSpecifierWorker(compilerOptions, importingSourceFile, importingSourceFileName, toFileName2, host, getModuleSpecifierPreferences({}, compilerOptions, importingSourceFile), {}, options); } function getNodeModulesPackageName(compilerOptions, importingSourceFile, nodeModulesFileName, host, preferences, options = {}) { const info = getInfo(importingSourceFile.fileName, host); @@ -47488,7 +47491,7 @@ function getModuleSpecifiersWithCacheInfo(moduleSymbol, checker, compilerOptions } function computeModuleSpecifiers(modulePaths, compilerOptions, importingSourceFile, host, userPreferences, options = {}, forAutoImport) { const info = getInfo(importingSourceFile.fileName, host); - const preferences = getPreferences(userPreferences, compilerOptions, importingSourceFile); + const preferences = getModuleSpecifierPreferences(userPreferences, compilerOptions, importingSourceFile); const existingSpecifier = forEach(modulePaths, (modulePath) => forEach( host.getFileIncludeReasons().get(toPath(modulePath.path, host.getCurrentDirectory(), info.getCanonicalFileName)), (reason) => { @@ -47998,7 +48001,7 @@ function tryGetModuleNameAsNodeModule({ path, isRedirect }, { getCanonicalFileNa if (!parts) { return void 0; } - const preferences = getPreferences(userPreferences, options, importingSourceFile); + const preferences = getModuleSpecifierPreferences(userPreferences, options, importingSourceFile); const allowedEndings = preferences.getAllowedEndingsInPreferredOrder(); let moduleSpecifier = path; let isPackageRootPath = false; @@ -50650,6 +50653,11 @@ function createTypeChecker(host) { diagnosticMessage = error2(errorLocation, Diagnostics.Class_0_used_before_its_declaration, declarationName); } else if (result.flags & 256 /* RegularEnum */) { diagnosticMessage = error2(errorLocation, Diagnostics.Enum_0_used_before_its_declaration, declarationName); + } else { + Debug.assert(!!(result.flags & 128 /* ConstEnum */)); + if (getIsolatedModules(compilerOptions)) { + diagnosticMessage = error2(errorLocation, Diagnostics.Enum_0_used_before_its_declaration, declarationName); + } } if (diagnosticMessage) { addRelatedInfo(diagnosticMessage, createDiagnosticForNode(declaration, Diagnostics._0_is_declared_here, declarationName)); @@ -59202,6 +59210,8 @@ function createTypeChecker(host) { result.compositeSignatures = concatenate(left.compositeKind !== 2097152 /* Intersection */ && left.compositeSignatures || [left], [right]); if (paramMapper) { result.mapper = left.compositeKind !== 2097152 /* Intersection */ && left.mapper && left.compositeSignatures ? combineTypeMappers(left.mapper, paramMapper) : paramMapper; + } else if (left.compositeKind !== 2097152 /* Intersection */ && left.mapper && left.compositeSignatures) { + result.mapper = left.mapper; } return result; } @@ -59799,7 +59809,7 @@ function createTypeChecker(host) { return simplified !== type ? simplified : getConstraintOfType(type); } function getConstraintFromIndexedAccess(type) { - if (isMappedTypeGenericIndexedAccess(type) || isGenericMappedType(type.objectType)) { + if (isMappedTypeGenericIndexedAccess(type)) { return substituteIndexedMappedType(type.objectType, type.indexType); } const indexConstraint = getSimplifiedTypeOrConstraint(type.indexType); @@ -60049,11 +60059,15 @@ function createTypeChecker(host) { return type.resolvedApparentType || (type.resolvedApparentType = getResolvedApparentTypeOfMappedType(type)); } function getResolvedApparentTypeOfMappedType(type) { - const typeVariable = getHomomorphicTypeVariable(type); - if (typeVariable && !type.declaration.nameType) { - const constraint = getConstraintOfTypeParameter(typeVariable); - if (constraint && everyType(constraint, isArrayOrTupleType)) { - return instantiateType(type, prependTypeMapping(typeVariable, constraint, type.mapper)); + const target = type.target ?? type; + const typeVariable = getHomomorphicTypeVariable(target); + if (typeVariable && !target.declaration.nameType) { + const constraint = getConstraintTypeFromMappedType(type); + if (constraint.flags & 4194304 /* Index */) { + const baseConstraint = getBaseConstraintOfType(constraint.type); + if (baseConstraint && everyType(baseConstraint, isArrayOrTupleType)) { + return instantiateType(target, prependTypeMapping(typeVariable, baseConstraint, type.mapper)); + } } } return type; @@ -60312,10 +60326,14 @@ function createTypeChecker(host) { return errorInfo; } function getPropertyOfType(type, name, skipObjectFunctionPropertyAugment, includeTypeOnlyMembers) { + var _a, _b; type = getReducedApparentType(type); if (type.flags & 524288 /* Object */) { const resolved = resolveStructuredTypeMembers(type); const symbol = resolved.members.get(name); + if (symbol && !includeTypeOnlyMembers && ((_a = type.symbol) == null ? void 0 : _a.flags) & 512 /* ValueModule */ && ((_b = getSymbolLinks(type.symbol).typeOnlyExportStarMap) == null ? void 0 : _b.has(name))) { + return void 0; + } if (symbol && symbolIsValue(symbol, includeTypeOnlyMembers)) { return symbol; } @@ -62088,7 +62106,7 @@ function createTypeChecker(host) { return target.objectFlags & 8 /* Tuple */ ? createNormalizedTupleType(target, typeArguments) : createTypeReference(target, typeArguments); } function createNormalizedTupleType(target, elementTypes) { - var _a, _b, _c; + var _a, _b, _c, _d; if (!(target.combinedFlags & 14 /* NonRequired */)) { return createTypeReference(target, elementTypes); } @@ -62108,8 +62126,10 @@ function createTypeChecker(host) { const type = elementTypes[i]; const flags = target.elementFlags[i]; if (flags & 8 /* Variadic */) { - if (type.flags & 58982400 /* InstantiableNonPrimitive */ || isGenericMappedType(type)) { - addElement(type, 8 /* Variadic */, (_a = target.labeledElementDeclarations) == null ? void 0 : _a[i]); + if (type.flags & 1 /* Any */) { + addElement(type, 4 /* Rest */, (_a = target.labeledElementDeclarations) == null ? void 0 : _a[i]); + } else if (type.flags & 58982400 /* InstantiableNonPrimitive */ || isGenericMappedType(type)) { + addElement(type, 8 /* Variadic */, (_b = target.labeledElementDeclarations) == null ? void 0 : _b[i]); } else if (isTupleType(type)) { const elements = getElementTypes(type); if (elements.length + expandedTypes.length >= 1e4) { @@ -62124,10 +62144,10 @@ function createTypeChecker(host) { return addElement(t, type.target.elementFlags[n], (_a2 = type.target.labeledElementDeclarations) == null ? void 0 : _a2[n]); }); } else { - addElement(isArrayLikeType(type) && getIndexTypeOfType(type, numberType) || errorType, 4 /* Rest */, (_b = target.labeledElementDeclarations) == null ? void 0 : _b[i]); + addElement(isArrayLikeType(type) && getIndexTypeOfType(type, numberType) || errorType, 4 /* Rest */, (_c = target.labeledElementDeclarations) == null ? void 0 : _c[i]); } } else { - addElement(type, flags, (_c = target.labeledElementDeclarations) == null ? void 0 : _c[i]); + addElement(type, flags, (_d = target.labeledElementDeclarations) == null ? void 0 : _d[i]); } } for (let i = 0; i < lastRequiredIndex; i++) { @@ -63491,10 +63511,6 @@ function createTypeChecker(host) { } return type; } - function maybeCloneTypeParameter(p) { - const constraint = getConstraintOfTypeParameter(p); - return constraint && (isGenericObjectType(constraint) || isGenericIndexType(constraint)) ? cloneTypeParameter(p) : p; - } function isSimpleTupleType(node) { return isTupleTypeNode(node) && length(node.elements) > 0 && !some(node.elements, (e) => isOptionalTypeNode(e) || isRestTypeNode(e) || isNamedTupleMember(e) && !!(e.questionToken || e.dotDotDotToken)); } @@ -63524,27 +63540,19 @@ function createTypeChecker(host) { const checkTypeDeferred = isDeferredType(checkType, checkTuples); let combinedMapper; if (root.inferTypeParameters) { - const freshParams = sameMap(root.inferTypeParameters, maybeCloneTypeParameter); - const freshMapper = freshParams !== root.inferTypeParameters ? createTypeMapper(root.inferTypeParameters, freshParams) : void 0; const context = createInferenceContext( - freshParams, + root.inferTypeParameters, /*signature*/ void 0, 0 /* None */ ); - if (freshMapper) { - const freshCombinedMapper = combineTypeMappers(mapper, freshMapper); - for (let i = 0; i < freshParams.length; i++) { - if (freshParams[i] !== root.inferTypeParameters[i]) { - freshParams[i].mapper = freshCombinedMapper; - } - } + if (mapper) { + context.nonFixingMapper = combineTypeMappers(context.nonFixingMapper, mapper); } if (!checkTypeDeferred) { - inferTypes(context.inferences, checkType, instantiateType(extendsType, freshMapper), 512 /* NoConstraints */ | 1024 /* AlwaysStrict */); + inferTypes(context.inferences, checkType, extendsType, 512 /* NoConstraints */ | 1024 /* AlwaysStrict */); } - const innerMapper = combineTypeMappers(freshMapper, context.mapper); - combinedMapper = mapper ? combineTypeMappers(innerMapper, mapper) : innerMapper; + combinedMapper = mapper ? combineTypeMappers(context.mapper, mapper) : context.mapper; } const inferredExtendsType = combinedMapper ? instantiateType(root.extendsType, combinedMapper) : extendsType; if (!checkTypeDeferred && !isDeferredType(inferredExtendsType, checkTuples)) { @@ -64521,8 +64529,8 @@ function createTypeChecker(host) { if (!result) { const newMapper = createTypeMapper(root.outerTypeParameters, typeArguments); const checkType = root.checkType; - const distributionType = root.isDistributive ? getMappedType(checkType, newMapper) : void 0; - result = distributionType && checkType !== distributionType && distributionType.flags & (1048576 /* Union */ | 131072 /* Never */) ? mapTypeWithAlias(getReducedType(distributionType), (t) => getConditionalType(root, prependTypeMapping(checkType, t, newMapper), forConstraint), aliasSymbol, aliasTypeArguments) : getConditionalType(root, newMapper, forConstraint, aliasSymbol, aliasTypeArguments); + const distributionType = root.isDistributive ? getReducedType(getMappedType(checkType, newMapper)) : void 0; + result = distributionType && checkType !== distributionType && distributionType.flags & (1048576 /* Union */ | 131072 /* Never */) ? mapTypeWithAlias(distributionType, (t) => getConditionalType(root, prependTypeMapping(checkType, t, newMapper), forConstraint), aliasSymbol, aliasTypeArguments) : getConditionalType(root, newMapper, forConstraint, aliasSymbol, aliasTypeArguments); root.instantiations.set(id, result); } return result; @@ -65396,8 +65404,8 @@ function createTypeChecker(host) { const paramCount = sourceRestType || targetRestType ? Math.min(sourceCount, targetCount) : Math.max(sourceCount, targetCount); const restIndex = sourceRestType || targetRestType ? paramCount - 1 : -1; for (let i = 0; i < paramCount; i++) { - const sourceType = i === restIndex ? getRestTypeAtPosition(source, i) : tryGetTypeAtPosition(source, i); - const targetType = i === restIndex ? getRestTypeAtPosition(target, i) : tryGetTypeAtPosition(target, i); + const sourceType = i === restIndex ? getRestOrAnyTypeAtPosition(source, i) : tryGetTypeAtPosition(source, i); + const targetType = i === restIndex ? getRestOrAnyTypeAtPosition(target, i) : tryGetTypeAtPosition(target, i); if (sourceType && targetType) { const sourceSig = checkMode & 3 /* Callback */ || isInstantiatedGenericParameter(source, i) ? void 0 : getSingleCallSignature(getNonNullableType(sourceType)); const targetSig = checkMode & 3 /* Callback */ || isInstantiatedGenericParameter(target, i) ? void 0 : getSingleCallSignature(getNonNullableType(targetType)); @@ -70380,7 +70388,7 @@ function createTypeChecker(host) { function hasMatchingArgument(expression, reference) { if (expression.arguments) { for (const argument of expression.arguments) { - if (isOrContainsMatchingReference(reference, argument) || optionalChainContainsReference(argument, reference)) { + if (isOrContainsMatchingReference(reference, argument) || optionalChainContainsReference(argument, reference) || getCandidateDiscriminantPropertyAccess(argument, reference)) { return true; } } @@ -70390,6 +70398,36 @@ function createTypeChecker(host) { } return false; } + function getCandidateDiscriminantPropertyAccess(expr, reference) { + if (isBindingPattern(reference) || isFunctionExpressionOrArrowFunction(reference) || isObjectLiteralMethod(reference)) { + if (isIdentifier(expr)) { + const symbol = getResolvedSymbol(expr); + const declaration = symbol.valueDeclaration; + if (declaration && (isBindingElement(declaration) || isParameter(declaration)) && reference === declaration.parent && !declaration.initializer && !declaration.dotDotDotToken) { + return declaration; + } + } + } else if (isAccessExpression(expr)) { + if (isMatchingReference(reference, expr.expression)) { + return expr; + } + } else if (isIdentifier(expr)) { + const symbol = getResolvedSymbol(expr); + if (isConstantVariable(symbol)) { + const declaration = symbol.valueDeclaration; + if (isVariableDeclaration(declaration) && !declaration.type && declaration.initializer && isAccessExpression(declaration.initializer) && isMatchingReference(reference, declaration.initializer.expression)) { + return declaration.initializer; + } + if (isBindingElement(declaration) && !declaration.initializer) { + const parent2 = declaration.parent.parent; + if (isVariableDeclaration(parent2) && !parent2.type && parent2.initializer && (isIdentifier(parent2.initializer) || isAccessExpression(parent2.initializer)) && isMatchingReference(reference, parent2.initializer)) { + return declaration; + } + } + } + } + return void 0; + } function getFlowNodeId(flow) { if (!flow.id || flow.id < 0) { flow.id = nextFlowId; @@ -71489,39 +71527,9 @@ function createTypeChecker(host) { } return result; } - function getCandidateDiscriminantPropertyAccess(expr) { - if (isBindingPattern(reference) || isFunctionExpressionOrArrowFunction(reference) || isObjectLiteralMethod(reference)) { - if (isIdentifier(expr)) { - const symbol = getResolvedSymbol(expr); - const declaration = symbol.valueDeclaration; - if (declaration && (isBindingElement(declaration) || isParameter(declaration)) && reference === declaration.parent && !declaration.initializer && !declaration.dotDotDotToken) { - return declaration; - } - } - } else if (isAccessExpression(expr)) { - if (isMatchingReference(reference, expr.expression)) { - return expr; - } - } else if (isIdentifier(expr)) { - const symbol = getResolvedSymbol(expr); - if (isConstantVariable(symbol)) { - const declaration = symbol.valueDeclaration; - if (isVariableDeclaration(declaration) && !declaration.type && declaration.initializer && isAccessExpression(declaration.initializer) && isMatchingReference(reference, declaration.initializer.expression)) { - return declaration.initializer; - } - if (isBindingElement(declaration) && !declaration.initializer) { - const parent2 = declaration.parent.parent; - if (isVariableDeclaration(parent2) && !parent2.type && parent2.initializer && (isIdentifier(parent2.initializer) || isAccessExpression(parent2.initializer)) && isMatchingReference(reference, parent2.initializer)) { - return declaration; - } - } - } - } - return void 0; - } function getDiscriminantPropertyAccess(expr, computedType) { if (declaredType.flags & 1048576 /* Union */ || computedType.flags & 1048576 /* Union */) { - const access = getCandidateDiscriminantPropertyAccess(expr); + const access = getCandidateDiscriminantPropertyAccess(expr, reference); if (access) { const name = getAccessedPropertyName(access); if (name) { @@ -78400,6 +78408,11 @@ function createTypeChecker(host) { } return createTupleType(types, flags, readonly, names); } + function getRestOrAnyTypeAtPosition(source, pos) { + const restType = getRestTypeAtPosition(source, pos); + const elementType = restType && getElementTypeOfArrayType(restType); + return elementType && isTypeAny(elementType) ? anyType : restType; + } function getParameterCount(signature) { const length2 = signature.parameters.length; if (signatureHasRestParameter(signature)) { @@ -78456,7 +78469,7 @@ function createTypeChecker(host) { if (signatureHasRestParameter(signature)) { const restType = getTypeOfSymbol(signature.parameters[signature.parameters.length - 1]); if (!isTupleType(restType)) { - return restType; + return isTypeAny(restType) ? anyArrayType : restType; } if (restType.target.hasRestElement) { return sliceTupleType(restType, restType.target.fixedLength); @@ -81760,20 +81773,17 @@ function createTypeChecker(host) { const objectType = type.objectType; const indexType = type.indexType; const objectIndexType = isGenericMappedType(objectType) && getMappedTypeNameTypeKind(objectType) === 2 /* Remapping */ ? getIndexTypeForMappedType(objectType, 0 /* None */) : getIndexType(objectType, 0 /* None */); - if (isTypeAssignableTo(indexType, objectIndexType)) { + const hasNumberIndexInfo = !!getIndexInfoOfType(objectType, numberType); + if (everyType(indexType, (t) => isTypeAssignableTo(t, objectIndexType) || hasNumberIndexInfo && isApplicableIndexType(t, numberType))) { if (accessNode.kind === 212 /* ElementAccessExpression */ && isAssignmentTarget(accessNode) && getObjectFlags(objectType) & 32 /* Mapped */ && getMappedTypeModifiers(objectType) & 1 /* IncludeReadonly */) { error2(accessNode, Diagnostics.Index_signature_in_type_0_only_permits_reading, typeToString(objectType)); } return type; } - const apparentObjectType = getApparentType(objectType); - if (getIndexInfoOfType(apparentObjectType, numberType) && isTypeAssignableToKind(indexType, 296 /* NumberLike */)) { - return type; - } if (isGenericObjectType(objectType)) { const propertyName = getPropertyNameFromIndex(indexType, accessNode); if (propertyName) { - const propertySymbol = forEachType(apparentObjectType, (t) => getPropertyOfType(t, propertyName)); + const propertySymbol = forEachType(getApparentType(objectType), (t) => getPropertyOfType(t, propertyName)); if (propertySymbol && getDeclarationModifierFlagsFromSymbol(propertySymbol) & 6 /* NonPublicAccessibilityModifier */) { error2(accessNode, Diagnostics.Private_or_protected_member_0_cannot_be_accessed_on_a_type_parameter, unescapeLeadingUnderscores(propertyName)); return errorType; @@ -87833,7 +87843,7 @@ function createTypeChecker(host) { true, location ); - const resolvedSymbol = valueSymbol && valueSymbol.flags & 2097152 /* Alias */ ? resolveAlias(valueSymbol) : valueSymbol; + const resolvedValueSymbol = valueSymbol && valueSymbol.flags & 2097152 /* Alias */ ? resolveAlias(valueSymbol) : valueSymbol; isTypeOnly || (isTypeOnly = !!(valueSymbol && getTypeOnlyAliasDeclaration(valueSymbol, 111551 /* Value */))); const typeSymbol = resolveEntityName( typeName, @@ -87841,26 +87851,30 @@ function createTypeChecker(host) { /*ignoreErrors*/ true, /*dontResolveAlias*/ - false, + true, location ); - if (resolvedSymbol && resolvedSymbol === typeSymbol) { + const resolvedTypeSymbol = typeSymbol && typeSymbol.flags & 2097152 /* Alias */ ? resolveAlias(typeSymbol) : typeSymbol; + if (!valueSymbol) { + isTypeOnly || (isTypeOnly = !!(typeSymbol && getTypeOnlyAliasDeclaration(typeSymbol, 788968 /* Type */))); + } + if (resolvedValueSymbol && resolvedValueSymbol === resolvedTypeSymbol) { const globalPromiseSymbol = getGlobalPromiseConstructorSymbol( /*reportErrors*/ false ); - if (globalPromiseSymbol && resolvedSymbol === globalPromiseSymbol) { + if (globalPromiseSymbol && resolvedValueSymbol === globalPromiseSymbol) { return 9 /* Promise */; } - const constructorType = getTypeOfSymbol(resolvedSymbol); + const constructorType = getTypeOfSymbol(resolvedValueSymbol); if (constructorType && isConstructorType(constructorType)) { return isTypeOnly ? 10 /* TypeWithCallSignature */ : 1 /* TypeWithConstructSignatureAndValue */; } } - if (!typeSymbol) { + if (!resolvedTypeSymbol) { return isTypeOnly ? 11 /* ObjectType */ : 0 /* Unknown */; } - const type = getDeclaredTypeOfSymbol(typeSymbol); + const type = getDeclaredTypeOfSymbol(resolvedTypeSymbol); if (isErrorType(type)) { return isTypeOnly ? 11 /* ObjectType */ : 0 /* Unknown */; } else if (type.flags & 3 /* AnyOrUnknown */) { @@ -93501,9 +93515,50 @@ function transformTypeScript(context) { return visitorWorker(node); } } - function visitElidableStatement(node) { + function isElisionBlocked(node) { const parsed = getParseTreeNode(node); - if (parsed !== node) { + if (parsed === node || isExportAssignment(node)) { + return false; + } + if (!parsed || parsed.kind !== node.kind) { + return true; + } + switch (node.kind) { + case 272 /* ImportDeclaration */: + Debug.assertNode(parsed, isImportDeclaration); + if (node.importClause !== parsed.importClause) { + return true; + } + if (node.attributes !== parsed.attributes) { + return true; + } + break; + case 271 /* ImportEqualsDeclaration */: + Debug.assertNode(parsed, isImportEqualsDeclaration); + if (node.name !== parsed.name) { + return true; + } + if (node.isTypeOnly !== parsed.isTypeOnly) { + return true; + } + if (node.moduleReference !== parsed.moduleReference && (isEntityName(node.moduleReference) || isEntityName(parsed.moduleReference))) { + return true; + } + break; + case 278 /* ExportDeclaration */: + Debug.assertNode(parsed, isExportDeclaration); + if (node.exportClause !== parsed.exportClause) { + return true; + } + if (node.attributes !== parsed.attributes) { + return true; + } + break; + } + return false; + } + function visitElidableStatement(node) { + if (isElisionBlocked(node)) { if (node.transformFlags & 1 /* ContainsTypeScript */) { return visitEachChild(node, visitor, context); } @@ -120153,7 +120208,7 @@ function createPrinter(printerOptions = {}, handlers = {}) { return getLiteralTextOfNode(textSourceNode, neverAsciiEscape, jsxAttributeEscape); } } - const flags = (neverAsciiEscape ? 1 /* NeverAsciiEscape */ : 0) | (jsxAttributeEscape ? 2 /* JsxAttributeEscape */ : 0) | (printerOptions.terminateUnterminatedLiterals ? 4 /* TerminateUnterminatedLiterals */ : 0) | (printerOptions.target && printerOptions.target === 99 /* ESNext */ ? 8 /* AllowNumericSeparator */ : 0); + const flags = (neverAsciiEscape ? 1 /* NeverAsciiEscape */ : 0) | (jsxAttributeEscape ? 2 /* JsxAttributeEscape */ : 0) | (printerOptions.terminateUnterminatedLiterals ? 4 /* TerminateUnterminatedLiterals */ : 0) | (printerOptions.target && printerOptions.target >= 8 /* ES2021 */ ? 8 /* AllowNumericSeparator */ : 0); return getLiteralText(node, currentSourceFile, flags); } function pushNameGenerationScope(node) { @@ -139603,6 +139658,7 @@ __export(ts_refactor_exports, { addExports: () => addExports, addNewFileToTsconfig: () => addNewFileToTsconfig, addOrRemoveBracesToArrowFunction: () => ts_refactor_addOrRemoveBracesToArrowFunction_exports, + containsJsx: () => containsJsx, convertArrowFunctionOrFunctionExpression: () => ts_refactor_convertArrowFunctionOrFunctionExpression_exports, convertParamsToDestructuredObject: () => ts_refactor_convertParamsToDestructuredObject_exports, convertStringOrTemplateLiteral: () => ts_refactor_convertStringOrTemplateLiteral_exports, @@ -140663,14 +140719,14 @@ registerRefactor(refactorName5, { getEditsForAction: function getRefactorEditsToMoveToNewFile(context, actionName2) { Debug.assert(actionName2 === refactorName5, "Wrong refactor invoked"); const statements = Debug.checkDefined(getStatementsToMove(context)); - const edits = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChange3(context.file, context.program, statements, t, context.host, context.preferences, context)); + const edits = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChange3(context.file, context.program, statements, t, context.host, context.preferences)); return { edits, renameFilename: void 0, renameLocation: void 0 }; } }); -function doChange3(oldFile, program, toMove, changes, host, preferences, context) { +function doChange3(oldFile, program, toMove, changes, host, preferences) { const checker = program.getTypeChecker(); const usage = getUsageInfo(oldFile, toMove.all, checker); - const newFilename = createNewFileName(oldFile, program, context, host); + const newFilename = createNewFileName(oldFile, program, host, toMove); changes.createNewFile(oldFile, newFilename, getNewStatementsAndRemoveFromOldFile(oldFile, usage, changes, toMove, program, host, newFilename, preferences)); addNewFileToTsconfig(program, changes, oldFile.fileName, newFilename, hostGetCanonicalFileName(host)); } @@ -141383,12 +141439,10 @@ function addExportToChanges(sourceFile, decl, name, changes, useEs6Exports) { changes.insertNodesAfter(sourceFile, decl, names.map(createExportAssignment)); } } -function createNewFileName(oldFile, program, context, host) { +function createNewFileName(oldFile, program, host, toMove) { const checker = program.getTypeChecker(); - const toMove = getStatementsToMove(context); - let usage; if (toMove) { - usage = getUsageInfo(oldFile, toMove.all, checker); + const usage = getUsageInfo(oldFile, toMove.all, checker); const currentDirectory = getDirectoryPath(oldFile.fileName); const extension = extensionFromPath(oldFile.fileName); const newFileName = combinePaths( @@ -141446,6 +141500,9 @@ function getStatementsToMove(context) { }); return all.length === 0 ? void 0 : { all, ranges }; } +function containsJsx(statements) { + return find(statements, (statement) => !!(statement.transformFlags & 2 /* ContainsJsx */)); +} function isAllowedStatementToMove(statement) { return !isPureImport(statement) && !isPrologueDirective(statement); } @@ -141469,8 +141526,7 @@ function getUsageInfo(oldFile, toMove, checker, existingTargetLocals = /* @__PUR const movedSymbols = /* @__PURE__ */ new Set(); const oldImportsNeededByTargetFile = /* @__PURE__ */ new Map(); const targetFileImportsFromOldFile = /* @__PURE__ */ new Set(); - const containsJsx = find(toMove, (statement) => !!(statement.transformFlags & 2 /* ContainsJsx */)); - const jsxNamespaceSymbol = getJsxNamespaceSymbol(containsJsx); + const jsxNamespaceSymbol = getJsxNamespaceSymbol(containsJsx(toMove)); if (jsxNamespaceSymbol) { oldImportsNeededByTargetFile.set(jsxNamespaceSymbol, false); } @@ -146873,17 +146929,19 @@ function createLanguageService(host, documentRegistry = createDocumentRegistry(h Debug.assert(isJsxOpeningElement(tag) || isJsxClosingElement(tag), "tag should be opening or closing element"); const openTag = tag.parent.openingElement; const closeTag = tag.parent.closingElement; - const openTagStart = openTag.tagName.getStart(sourceFile); - const openTagEnd = openTag.tagName.end; - const closeTagStart = closeTag.tagName.getStart(sourceFile); - const closeTagEnd = closeTag.tagName.end; - if (!(openTagStart <= position && position <= openTagEnd || closeTagStart <= position && position <= closeTagEnd)) + const openTagNameStart = openTag.tagName.getStart(sourceFile); + const openTagNameEnd = openTag.tagName.end; + const closeTagNameStart = closeTag.tagName.getStart(sourceFile); + const closeTagNameEnd = closeTag.tagName.end; + if (openTagNameStart === openTag.getStart(sourceFile) || closeTagNameStart === closeTag.getStart(sourceFile) || openTagNameEnd === openTag.getEnd() || closeTagNameEnd === closeTag.getEnd()) + return void 0; + if (!(openTagNameStart <= position && position <= openTagNameEnd || closeTagNameStart <= position && position <= closeTagNameEnd)) return void 0; const openingTagText = openTag.tagName.getText(sourceFile); if (openingTagText !== closeTag.tagName.getText(sourceFile)) return void 0; return { - ranges: [{ start: openTagStart, length: openTagEnd - openTagStart }, { start: closeTagStart, length: closeTagEnd - closeTagStart }], + ranges: [{ start: openTagNameStart, length: openTagNameEnd - openTagNameStart }, { start: closeTagNameStart, length: closeTagNameEnd - closeTagNameStart }], wordPattern: jsxTagWordPattern }; } @@ -147196,9 +147254,14 @@ function createLanguageService(host, documentRegistry = createDocumentRegistry(h const sourceFile = getValidSourceFile(fileName); const allFiles = Debug.checkDefined(program.getSourceFiles()); const extension = extensionFromPath(fileName); - const files = mapDefined(allFiles, (file) => !(program == null ? void 0 : program.isSourceFileFromExternalLibrary(sourceFile)) && !(sourceFile === getValidSourceFile(file.fileName) || extension === ".ts" /* Ts */ && extensionFromPath(file.fileName) === ".d.ts" /* Dts */ || extension === ".d.ts" /* Dts */ && startsWith(getBaseFileName(file.fileName), "lib.") && extensionFromPath(file.fileName) === ".d.ts" /* Dts */) && extension === extensionFromPath(file.fileName) ? file.fileName : void 0); - const newFileName = createNewFileName(sourceFile, program, getRefactorContext(sourceFile, positionOrRange, preferences, emptyOptions), host); - return { newFileName, files }; + const toMove = getStatementsToMove(getRefactorContext(sourceFile, positionOrRange, preferences, emptyOptions)); + const toMoveContainsJsx = containsJsx(toMove == null ? void 0 : toMove.all); + const files = mapDefined(allFiles, (file) => { + const fileNameExtension = extensionFromPath(file.fileName); + const isValidSourceFile = !(program == null ? void 0 : program.isSourceFileFromExternalLibrary(sourceFile)) && !(sourceFile === getValidSourceFile(file.fileName) || extension === ".ts" /* Ts */ && fileNameExtension === ".d.ts" /* Dts */ || extension === ".d.ts" /* Dts */ && startsWith(getBaseFileName(file.fileName), "lib.") && fileNameExtension === ".d.ts" /* Dts */); + return isValidSourceFile && (extension === fileNameExtension || (extension === ".tsx" /* Tsx */ && fileNameExtension === ".ts" /* Ts */ || extension === ".jsx" /* Jsx */ && fileNameExtension === ".js" /* Js */) && !toMoveContainsJsx) ? file.fileName : void 0; + }); + return { newFileName: createNewFileName(sourceFile, program, host, toMove), files }; } function getEditsForRefactor2(fileName, formatOptions, positionOrRange, refactorName14, actionName2, preferences = emptyOptions, interactiveRefactorArguments) { synchronizeHostData(); @@ -150971,7 +151034,8 @@ function getTypeExportSpecifiers(originExportSpecifier, context) { // src/services/codefixes/convertToTypeOnlyImport.ts var errorCodes14 = [ Diagnostics.This_import_is_never_used_as_a_value_and_must_use_import_type_because_importsNotUsedAsValues_is_set_to_error.code, - Diagnostics._0_is_a_type_and_must_be_imported_using_a_type_only_import_when_verbatimModuleSyntax_is_enabled.code + Diagnostics._0_is_a_type_and_must_be_imported_using_a_type_only_import_when_verbatimModuleSyntax_is_enabled.code, + Diagnostics._0_resolves_to_a_type_only_declaration_and_must_be_imported_using_a_type_only_import_when_verbatimModuleSyntax_is_enabled.code ]; var fixId13 = "convertToTypeOnlyImport"; registerCodeFix({ @@ -152151,7 +152215,7 @@ function compareModuleSpecifiers(a, b, importingFile, program, allowsImportingSp } function isFixPossiblyReExportingImportingFile(fix, importingFile, compilerOptions, toPath3) { var _a; - if (fix.isReExport && ((_a = fix.exportInfo) == null ? void 0 : _a.moduleFileName) && getEmitModuleResolutionKind(compilerOptions) === 2 /* Node10 */ && isIndexFileName(fix.exportInfo.moduleFileName)) { + if (fix.isReExport && ((_a = fix.exportInfo) == null ? void 0 : _a.moduleFileName) && isIndexFileName(fix.exportInfo.moduleFileName)) { const reExportDir = toPath3(getDirectoryPath(fix.exportInfo.moduleFileName)); return startsWith(importingFile.path, reExportDir); } @@ -152841,7 +152905,7 @@ function addMissingConstraint(changes, program, preferences, host, sourceFile, i } } function tryGetConstraintFromDiagnosticMessage(messageText) { - const [_, constraint] = flattenDiagnosticMessageText(messageText, "\n", 0).match(/`extends (.*)`/) || []; + const [, constraint] = flattenDiagnosticMessageText(messageText, "\n", 0).match(/`extends (.*)`/) || []; return constraint; } function tryGetConstraintType(checker, node) { @@ -153741,7 +153805,7 @@ registerCodeFix({ return createCombinedCodeActions(ts_textChanges_exports.ChangeTracker.with(context, (changes) => { eachDiagnostic(context, errorCodes27, (diag2) => { const info = getInfo10(diag2.file, diag2.start, diag2.code, checker, context.program); - if (!info || !addToSeen(seen, getNodeId(info.parentDeclaration) + "#" + info.token.text)) { + if (!info || !addToSeen(seen, getNodeId(info.parentDeclaration) + "#" + (info.kind === 3 /* ObjectLiteral */ ? info.identifier : info.token.text))) { return; } if (fixId52 === fixMissingFunctionDeclaration && (info.kind === 2 /* Function */ || info.kind === 5 /* Signature */)) { @@ -153813,7 +153877,22 @@ function getInfo10(sourceFile, tokenPos, errorCode, checker, program) { )); if (!length(properties)) return void 0; - return { kind: 3 /* ObjectLiteral */, token: param.name, properties, parentDeclaration: parent2 }; + return { kind: 3 /* ObjectLiteral */, token: param.name, identifier: param.name.text, properties, parentDeclaration: parent2 }; + } + if (token.kind === 19 /* OpenBraceToken */ && isObjectLiteralExpression(parent2)) { + const targetType = checker.getContextualType(parent2) || checker.getTypeAtLocation(parent2); + const properties = arrayFrom(checker.getUnmatchedProperties( + checker.getTypeAtLocation(parent2), + targetType, + /*requireOptionalProperties*/ + false, + /*matchDiscriminantProperties*/ + false + )); + if (!length(properties)) + return void 0; + const identifier = ""; + return { kind: 3 /* ObjectLiteral */, token: parent2, identifier, properties, parentDeclaration: parent2 }; } if (!isMemberName(token)) return void 0; @@ -153829,7 +153908,7 @@ function getInfo10(sourceFile, tokenPos, errorCode, checker, program) { )); if (!length(properties)) return void 0; - return { kind: 3 /* ObjectLiteral */, token, properties, parentDeclaration: parent2.initializer }; + return { kind: 3 /* ObjectLiteral */, token, identifier: token.text, properties, parentDeclaration: parent2.initializer }; } if (isIdentifier(token) && isJsxOpeningLikeElement(token.parent)) { const target = getEmitScriptTarget(program.getCompilerOptions()); @@ -154838,7 +154917,7 @@ function doChange23(changes, sourceFile, arg, expression) { ); } function getSuggestion(messageText) { - const [_, suggestion] = flattenDiagnosticMessageText(messageText, "\n", 0).match(/'(.*)'/) || []; + const [, suggestion] = flattenDiagnosticMessageText(messageText, "\n", 0).match(/'(.*)'/) || []; return suggestion; } @@ -162210,7 +162289,7 @@ function isClassMemberCompletionKeyword(kind) { } } function isFunctionLikeBodyKeyword(kind) { - return kind === 134 /* AsyncKeyword */ || kind === 135 /* AwaitKeyword */ || kind === 130 /* AsKeyword */ || kind === 152 /* SatisfiesKeyword */ || kind === 156 /* TypeKeyword */ || !isContextualKeyword(kind) && !isClassMemberCompletionKeyword(kind); + return kind === 134 /* AsyncKeyword */ || kind === 135 /* AwaitKeyword */ || kind === 160 /* UsingKeyword */ || kind === 130 /* AsKeyword */ || kind === 152 /* SatisfiesKeyword */ || kind === 156 /* TypeKeyword */ || !isContextualKeyword(kind) && !isClassMemberCompletionKeyword(kind); } function keywordForNode(node) { return isIdentifier(node) ? identifierToKeywordKind(node) ?? 0 /* Unknown */ : node.kind; @@ -162992,15 +163071,18 @@ function getCompletionEntriesForDirectoryFragmentWithRootDirs(rootDirs, fragment const basePath = compilerOptions.project || host.getCurrentDirectory(); const ignoreCase = !(host.useCaseSensitiveFileNames && host.useCaseSensitiveFileNames()); const baseDirectories = getBaseDirectoriesFromRootDirs(rootDirs, basePath, scriptDirectory, ignoreCase); - return flatMap(baseDirectories, (baseDirectory) => arrayFrom(getCompletionEntriesForDirectoryFragment( - fragment, - baseDirectory, - extensionOptions, - host, - /*moduleSpecifierIsRelative*/ - true, - exclude - ).values())); + return deduplicate( + flatMap(baseDirectories, (baseDirectory) => arrayFrom(getCompletionEntriesForDirectoryFragment( + fragment, + baseDirectory, + extensionOptions, + host, + /*moduleSpecifierIsRelative*/ + true, + exclude + ).values())), + (itemA, itemB) => itemA.name === itemB.name && itemA.kind === itemB.kind && itemA.extension === itemB.extension + ); } function getCompletionEntriesForDirectoryFragment(fragment, scriptDirectory, extensionOptions, host, moduleSpecifierIsRelative, exclude, result = createNameAndKindSet()) { var _a; @@ -163052,7 +163134,13 @@ function getCompletionEntriesForDirectoryFragment(fragment, scriptDirectory, ext if (exclude && comparePaths(filePath, exclude, scriptDirectory, ignoreCase) === 0 /* EqualTo */) { continue; } - const { name, extension } = getFilenameWithExtensionOption(getBaseFileName(filePath), host.getCompilationSettings(), extensionOptions); + const { name, extension } = getFilenameWithExtensionOption( + getBaseFileName(filePath), + host.getCompilationSettings(), + extensionOptions, + /*isExportsWildcard*/ + false + ); result.add(nameAndKind(name, "script" /* scriptElement */, extension)); } } @@ -163067,7 +163155,7 @@ function getCompletionEntriesForDirectoryFragment(fragment, scriptDirectory, ext } return result; } -function getFilenameWithExtensionOption(name, compilerOptions, extensionOptions) { +function getFilenameWithExtensionOption(name, compilerOptions, extensionOptions, isExportsWildcard) { const nonJsResult = ts_moduleSpecifiers_exports.tryGetRealFileNameForNonJsDeclarationFileName(name); if (nonJsResult) { return { name: nonJsResult, extension: tryGetExtensionFromPath2(nonJsResult) }; @@ -163075,15 +163163,22 @@ function getFilenameWithExtensionOption(name, compilerOptions, extensionOptions) if (extensionOptions.referenceKind === 0 /* Filename */) { return { name, extension: tryGetExtensionFromPath2(name) }; } - const endingPreference = getModuleSpecifierEndingPreference(extensionOptions.endingPreference, extensionOptions.resolutionMode, compilerOptions, extensionOptions.importingSourceFile); - if (endingPreference === 3 /* TsExtension */) { + let allowedEndings = getModuleSpecifierPreferences( + { importModuleSpecifierEnding: extensionOptions.endingPreference }, + compilerOptions, + extensionOptions.importingSourceFile + ).getAllowedEndingsInPreferredOrder(extensionOptions.resolutionMode); + if (isExportsWildcard) { + allowedEndings = allowedEndings.filter((e) => e !== 0 /* Minimal */ && e !== 1 /* Index */); + } + if (allowedEndings[0] === 3 /* TsExtension */) { if (fileExtensionIsOneOf(name, supportedTSImplementationExtensions)) { return { name, extension: tryGetExtensionFromPath2(name) }; } const outputExtension2 = ts_moduleSpecifiers_exports.tryGetJSExtensionForFile(name, compilerOptions); return outputExtension2 ? { name: changeExtension(name, outputExtension2), extension: outputExtension2 } : { name, extension: tryGetExtensionFromPath2(name) }; } - if ((endingPreference === 0 /* Minimal */ || endingPreference === 1 /* Index */) && fileExtensionIsOneOf(name, [".js" /* Js */, ".jsx" /* Jsx */, ".ts" /* Ts */, ".tsx" /* Tsx */, ".d.ts" /* Dts */])) { + if (!isExportsWildcard && (allowedEndings[0] === 0 /* Minimal */ || allowedEndings[0] === 1 /* Index */) && fileExtensionIsOneOf(name, [".js" /* Js */, ".jsx" /* Jsx */, ".ts" /* Ts */, ".tsx" /* Tsx */, ".d.ts" /* Dts */])) { return { name: removeFileExtension(name), extension: tryGetExtensionFromPath2(name) }; } const outputExtension = ts_moduleSpecifiers_exports.tryGetJSExtensionForFile(name, compilerOptions); @@ -163098,9 +163193,20 @@ function addCompletionEntriesFromPaths(result, fragment, baseDirectory, extensio const lengthB = typeof patternB === "object" ? patternB.prefix.length : b.length; return compareValues(lengthB, lengthA); }; - return addCompletionEntriesFromPathsOrExports(result, fragment, baseDirectory, extensionOptions, host, getOwnKeys(paths), getPatternsForKey, comparePaths2); + return addCompletionEntriesFromPathsOrExports( + result, + /*isExports*/ + false, + fragment, + baseDirectory, + extensionOptions, + host, + getOwnKeys(paths), + getPatternsForKey, + comparePaths2 + ); } -function addCompletionEntriesFromPathsOrExports(result, fragment, baseDirectory, extensionOptions, host, keys, getPatternsForKey, comparePaths2) { +function addCompletionEntriesFromPathsOrExports(result, isExports, fragment, baseDirectory, extensionOptions, host, keys, getPatternsForKey, comparePaths2) { let pathResults = []; let matchedPath; for (const key of keys) { @@ -163121,7 +163227,7 @@ function addCompletionEntriesFromPathsOrExports(result, fragment, baseDirectory, if (typeof pathPattern === "string" || matchedPath === void 0 || comparePaths2(key, matchedPath) !== 1 /* GreaterThan */) { pathResults.push({ matchedPattern: isMatch, - results: getCompletionsForPathMapping(keyWithoutLeadingDotSlash, patterns, fragment, baseDirectory, extensionOptions, host).map(({ name, kind, extension }) => nameAndKind(name, kind, extension)) + results: getCompletionsForPathMapping(keyWithoutLeadingDotSlash, patterns, fragment, baseDirectory, extensionOptions, isExports && isMatch, host).map(({ name, kind, extension }) => nameAndKind(name, kind, extension)) }); } } @@ -163224,6 +163330,8 @@ function getCompletionEntriesForNonRelativeModules(fragment, scriptPath, mode, c const conditions = getConditions(compilerOptions, mode); addCompletionEntriesFromPathsOrExports( result, + /*isExports*/ + true, fragmentSubpath, packageDirectory, extensionOptions, @@ -163259,7 +163367,7 @@ function getPatternFromFirstMatchingCondition(target, conditions) { function getFragmentDirectory(fragment) { return containsSlash(fragment) ? hasTrailingDirectorySeparator(fragment) ? fragment : getDirectoryPath(fragment) : void 0; } -function getCompletionsForPathMapping(path, patterns, fragment, packageDirectory, extensionOptions, host) { +function getCompletionsForPathMapping(path, patterns, fragment, packageDirectory, extensionOptions, isExportsWildcard, host) { if (!endsWith(path, "*")) { return !path.includes("*") ? justPathMappingName(path, "script" /* scriptElement */) : emptyArray; } @@ -163269,15 +163377,15 @@ function getCompletionsForPathMapping(path, patterns, fragment, packageDirectory const starIsFullPathComponent = path[path.length - 2] === "/"; return starIsFullPathComponent ? justPathMappingName(pathPrefix, "directory" /* directory */) : flatMap(patterns, (pattern) => { var _a; - return (_a = getModulesForPathsPattern("", packageDirectory, pattern, extensionOptions, host)) == null ? void 0 : _a.map(({ name, ...rest }) => ({ name: pathPrefix + name, ...rest })); + return (_a = getModulesForPathsPattern("", packageDirectory, pattern, extensionOptions, isExportsWildcard, host)) == null ? void 0 : _a.map(({ name, ...rest }) => ({ name: pathPrefix + name, ...rest })); }); } - return flatMap(patterns, (pattern) => getModulesForPathsPattern(remainingFragment, packageDirectory, pattern, extensionOptions, host)); + return flatMap(patterns, (pattern) => getModulesForPathsPattern(remainingFragment, packageDirectory, pattern, extensionOptions, isExportsWildcard, host)); function justPathMappingName(name, kind) { return startsWith(name, fragment) ? [{ name: removeTrailingDirectorySeparator(name), kind, extension: void 0 }] : emptyArray; } } -function getModulesForPathsPattern(fragment, packageDirectory, pattern, extensionOptions, host) { +function getModulesForPathsPattern(fragment, packageDirectory, pattern, extensionOptions, isExportsWildcard, host) { if (!host.readDirectory) { return void 0; } @@ -163310,7 +163418,7 @@ function getModulesForPathsPattern(fragment, packageDirectory, pattern, extensio if (containsSlash(trimmedWithPattern)) { return directoryResult(getPathComponents(removeLeadingDirectorySeparator(trimmedWithPattern))[1]); } - const { name, extension } = getFilenameWithExtensionOption(trimmedWithPattern, host.getCompilationSettings(), extensionOptions); + const { name, extension } = getFilenameWithExtensionOption(trimmedWithPattern, host.getCompilationSettings(), extensionOptions, isExportsWildcard); return nameAndKind(name, "script" /* scriptElement */, extension); } }); @@ -167853,84 +167961,98 @@ function coalesceImportsWorker(importGroup, comparer, sourceFile, preferences) { if (importGroup.length === 0) { return importGroup; } - const { importWithoutClause, typeOnlyImports, regularImports } = getCategorizedImports(importGroup); + const importGroupsByAttributes = groupBy(importGroup, (decl) => { + if (decl.attributes) { + let attrs = decl.attributes.token + " "; + for (const x of sort(decl.attributes.elements, (x2, y) => compareStringsCaseSensitive(x2.name.text, y.name.text))) { + attrs += x.name.text + ":"; + attrs += isStringLiteralLike(x.value) ? `"${x.value.text}"` : x.value.getText() + " "; + } + return attrs; + } + return ""; + }); const coalescedImports = []; - if (importWithoutClause) { - coalescedImports.push(importWithoutClause); - } - for (const group2 of [regularImports, typeOnlyImports]) { - const isTypeOnly = group2 === typeOnlyImports; - const { defaultImports, namespaceImports, namedImports } = group2; - if (!isTypeOnly && defaultImports.length === 1 && namespaceImports.length === 1 && namedImports.length === 0) { - const defaultImport = defaultImports[0]; - coalescedImports.push( - updateImportDeclarationAndClause(defaultImport, defaultImport.importClause.name, namespaceImports[0].importClause.namedBindings) - ); - continue; + for (const attribute in importGroupsByAttributes) { + const importGroupSameAttrs = importGroupsByAttributes[attribute]; + const { importWithoutClause, typeOnlyImports, regularImports } = getCategorizedImports(importGroupSameAttrs); + if (importWithoutClause) { + coalescedImports.push(importWithoutClause); } - const sortedNamespaceImports = stableSort(namespaceImports, (i1, i2) => comparer(i1.importClause.namedBindings.name.text, i2.importClause.namedBindings.name.text)); - for (const namespaceImport of sortedNamespaceImports) { - coalescedImports.push( - updateImportDeclarationAndClause( - namespaceImport, - /*name*/ - void 0, - namespaceImport.importClause.namedBindings - ) - ); - } - const firstDefaultImport = firstOrUndefined(defaultImports); - const firstNamedImport = firstOrUndefined(namedImports); - const importDecl = firstDefaultImport ?? firstNamedImport; - if (!importDecl) { - continue; - } - let newDefaultImport; - const newImportSpecifiers = []; - if (defaultImports.length === 1) { - newDefaultImport = defaultImports[0].importClause.name; - } else { - for (const defaultImport of defaultImports) { - newImportSpecifiers.push( - factory.createImportSpecifier( - /*isTypeOnly*/ - false, - factory.createIdentifier("default"), - defaultImport.importClause.name + for (const group2 of [regularImports, typeOnlyImports]) { + const isTypeOnly = group2 === typeOnlyImports; + const { defaultImports, namespaceImports, namedImports } = group2; + if (!isTypeOnly && defaultImports.length === 1 && namespaceImports.length === 1 && namedImports.length === 0) { + const defaultImport = defaultImports[0]; + coalescedImports.push( + updateImportDeclarationAndClause(defaultImport, defaultImport.importClause.name, namespaceImports[0].importClause.namedBindings) + ); + continue; + } + const sortedNamespaceImports = stableSort(namespaceImports, (i1, i2) => comparer(i1.importClause.namedBindings.name.text, i2.importClause.namedBindings.name.text)); + for (const namespaceImport of sortedNamespaceImports) { + coalescedImports.push( + updateImportDeclarationAndClause( + namespaceImport, + /*name*/ + void 0, + namespaceImport.importClause.namedBindings ) ); } - } - newImportSpecifiers.push(...getNewImportSpecifiers(namedImports)); - const sortedImportSpecifiers = factory.createNodeArray( - sortSpecifiers(newImportSpecifiers, comparer, preferences), - firstNamedImport == null ? void 0 : firstNamedImport.importClause.namedBindings.elements.hasTrailingComma - ); - const newNamedImports = sortedImportSpecifiers.length === 0 ? newDefaultImport ? void 0 : factory.createNamedImports(emptyArray) : firstNamedImport ? factory.updateNamedImports(firstNamedImport.importClause.namedBindings, sortedImportSpecifiers) : factory.createNamedImports(sortedImportSpecifiers); - if (sourceFile && newNamedImports && (firstNamedImport == null ? void 0 : firstNamedImport.importClause.namedBindings) && !rangeIsOnSingleLine(firstNamedImport.importClause.namedBindings, sourceFile)) { - setEmitFlags(newNamedImports, 2 /* MultiLine */); - } - if (isTypeOnly && newDefaultImport && newNamedImports) { - coalescedImports.push( - updateImportDeclarationAndClause( - importDecl, - newDefaultImport, - /*namedBindings*/ - void 0 - ) - ); - coalescedImports.push( - updateImportDeclarationAndClause( - firstNamedImport ?? importDecl, - /*name*/ - void 0, - newNamedImports - ) - ); - } else { - coalescedImports.push( - updateImportDeclarationAndClause(importDecl, newDefaultImport, newNamedImports) + const firstDefaultImport = firstOrUndefined(defaultImports); + const firstNamedImport = firstOrUndefined(namedImports); + const importDecl = firstDefaultImport ?? firstNamedImport; + if (!importDecl) { + continue; + } + let newDefaultImport; + const newImportSpecifiers = []; + if (defaultImports.length === 1) { + newDefaultImport = defaultImports[0].importClause.name; + } else { + for (const defaultImport of defaultImports) { + newImportSpecifiers.push( + factory.createImportSpecifier( + /*isTypeOnly*/ + false, + factory.createIdentifier("default"), + defaultImport.importClause.name + ) + ); + } + } + newImportSpecifiers.push(...getNewImportSpecifiers(namedImports)); + const sortedImportSpecifiers = factory.createNodeArray( + sortSpecifiers(newImportSpecifiers, comparer, preferences), + firstNamedImport == null ? void 0 : firstNamedImport.importClause.namedBindings.elements.hasTrailingComma ); + const newNamedImports = sortedImportSpecifiers.length === 0 ? newDefaultImport ? void 0 : factory.createNamedImports(emptyArray) : firstNamedImport ? factory.updateNamedImports(firstNamedImport.importClause.namedBindings, sortedImportSpecifiers) : factory.createNamedImports(sortedImportSpecifiers); + if (sourceFile && newNamedImports && (firstNamedImport == null ? void 0 : firstNamedImport.importClause.namedBindings) && !rangeIsOnSingleLine(firstNamedImport.importClause.namedBindings, sourceFile)) { + setEmitFlags(newNamedImports, 2 /* MultiLine */); + } + if (isTypeOnly && newDefaultImport && newNamedImports) { + coalescedImports.push( + updateImportDeclarationAndClause( + importDecl, + newDefaultImport, + /*namedBindings*/ + void 0 + ) + ); + coalescedImports.push( + updateImportDeclarationAndClause( + firstNamedImport ?? importDecl, + /*name*/ + void 0, + newNamedImports + ) + ); + } else { + coalescedImports.push( + updateImportDeclarationAndClause(importDecl, newDefaultImport, newNamedImports) + ); + } } } return coalescedImports; @@ -178054,7 +178176,7 @@ var ScriptInfo = class { } break; default: - if (unorderedRemoveItem(this.containingProjects, project)) { + if (orderedRemoveItem(this.containingProjects, project)) { project.onFileAddedOrRemoved(this.isSymlink()); } break; @@ -178423,6 +178545,7 @@ var Project3 = class _Project { /** * Current project's program version. (incremented everytime new program is created that is not complete reuse from the old one) * This property is changed in 'updateGraph' based on the set of files in program + * @internal */ this.projectProgramVersion = 0; /** @@ -178430,6 +178553,7 @@ var Project3 = class _Project { * - new root file was added/removed * - edit happen in some file that is currently included in the project. * This property is different from projectStructureVersion since in most cases edits don't affect set of files in the project + * @internal */ this.projectStateVersion = 0; this.isInitialLoadPending = returnFalse; @@ -179467,7 +179591,7 @@ var Project3 = class _Project { ); const elapsed = timestamp() - start2; this.sendPerformanceEvent("UpdateGraph", elapsed); - this.writeLog(`Finishing updateGraphWorker: Project: ${this.getProjectName()} Version: ${this.getProjectVersion()} structureChanged: ${hasNewProgram}${this.program ? ` structureIsReused:: ${StructureIsReused[this.program.structureIsReused]}` : ""} Elapsed: ${elapsed}ms`); + this.writeLog(`Finishing updateGraphWorker: Project: ${this.getProjectName()} projectStateVersion: ${this.projectStateVersion} projectProgramVersion: ${this.projectProgramVersion} structureChanged: ${hasNewProgram}${this.program ? ` structureIsReused:: ${StructureIsReused[this.program.structureIsReused]}` : ""} Elapsed: ${elapsed}ms`); if (this.projectService.logger.isTestLogger) { if (this.program !== oldProgram) { this.print( @@ -179630,6 +179754,7 @@ var Project3 = class _Project { } /** @internal */ print(writeProjectFileNames, writeFileExplaination, writeFileVersionAndText) { + var _a; this.writeLog(`Project '${this.projectName}' (${ProjectKind[this.projectKind]})`); this.writeLog(this.filesToStringWorker( writeProjectFileNames && this.projectService.logger.hasLevel(3 /* verbose */), @@ -179647,6 +179772,14 @@ var Project3 = class _Project { false ); } + (_a = this.noDtsResolutionProject) == null ? void 0 : _a.print( + /*writeProjectFileNames*/ + false, + /*writeFileExplaination*/ + false, + /*writeFileVersionAndText*/ + false + ); } setCompilerOptions(compilerOptions) { var _a; @@ -180777,7 +180910,7 @@ function convertScriptKindName(scriptKindName) { } } function convertUserPreferences(preferences) { - const { lazyConfiguredProjectsFromExternalProject, ...userPreferences } = preferences; + const { lazyConfiguredProjectsFromExternalProject: _, ...userPreferences } = preferences; return userPreferences; } var fileNamePropertyReader = { @@ -181087,6 +181220,8 @@ var _ProjectService = class _ProjectService { /** @internal */ this.extendedConfigCache = /* @__PURE__ */ new Map(); /** @internal */ + this.baseline = noop; + /** @internal */ this.verifyDocumentRegistry = noop; /** @internal */ this.verifyProgram = noop; @@ -181713,7 +181848,7 @@ var _ProjectService = class _ProjectService { ); project.addRoot(info); if (info.containingProjects[0] !== project) { - info.detachFromProject(project); + orderedRemoveItem(info.containingProjects, project); info.containingProjects.unshift(project); } project.updateGraph(); @@ -182008,8 +182143,7 @@ var _ProjectService = class _ProjectService { * otherwise just file name */ getConfigFileNameForFile(info) { - if (isOpenScriptInfo(info)) { - Debug.assert(info.isScriptOpen()); + if (!isAncestorConfigFileInfo(info)) { const result = this.configFileForOpenFiles.get(info.path); if (result !== void 0) return result || void 0; @@ -183004,11 +183138,13 @@ Dynamic files must always be opened with service's current directory or service } = this.hostConfiguration.preferences; this.hostConfiguration.preferences = { ...this.hostConfiguration.preferences, ...args.preferences }; if (lazyConfiguredProjectsFromExternalProject && !this.hostConfiguration.preferences.lazyConfiguredProjectsFromExternalProject) { - this.configuredProjects.forEach((project) => { - if (project.hasExternalProjectRef() && project.pendingUpdateLevel === 2 /* Full */ && !this.pendingProjectUpdates.has(project.getProjectName())) { - project.updateGraph(); - } - }); + this.externalProjectToConfiguredProjectMap.forEach( + (projects) => projects.forEach((project) => { + if (!project.isClosed() && project.hasExternalProjectRef() && project.pendingUpdateLevel === 2 /* Full */ && !this.pendingProjectUpdates.has(project.getProjectName())) { + project.updateGraph(); + } + }) + ); } if (includePackageJsonAutoImports !== args.preferences.includePackageJsonAutoImports) { this.forEachProject((project) => { @@ -183076,6 +183212,8 @@ Dynamic files must always be opened with service's current directory or service }); this.inferredProjects.forEach((project) => this.clearSemanticCache(project)); this.ensureProjectForOpenFiles(); + this.logger.info("After reloading projects.."); + this.printProjects(); } /** * This function goes through all the openFiles and tries to file the config file for them. @@ -183591,23 +183729,20 @@ Dynamic files must always be opened with service's current directory or service scriptInfo.editContent(change.span.start, change.span.start + change.span.length, change.newText); } } - closeConfiguredProjectReferencedFromExternalProject(configFile) { - const configuredProject = this.findConfiguredProjectByProjectName(configFile); - if (configuredProject) { - configuredProject.deleteExternalProjectReference(); - if (!configuredProject.hasOpenRef()) { - this.removeProject(configuredProject); - return; + closeConfiguredProjectReferencedFromExternalProject(configuredProjects) { + configuredProjects == null ? void 0 : configuredProjects.forEach((configuredProject) => { + if (!configuredProject.isClosed()) { + configuredProject.deleteExternalProjectReference(); + if (!configuredProject.hasOpenRef()) + this.removeProject(configuredProject); } - } + }); } - closeExternalProject(uncheckedFileName) { + closeExternalProject(uncheckedFileName, print) { const fileName = toNormalizedPath(uncheckedFileName); - const configFiles = this.externalProjectToConfiguredProjectMap.get(fileName); - if (configFiles) { - for (const configFile of configFiles) { - this.closeConfiguredProjectReferencedFromExternalProject(configFile); - } + const configuredProjects = this.externalProjectToConfiguredProjectMap.get(fileName); + if (configuredProjects) { + this.closeConfiguredProjectReferencedFromExternalProject(configuredProjects); this.externalProjectToConfiguredProjectMap.delete(fileName); } else { const externalProject = this.findExternalProjectByProjectName(uncheckedFileName); @@ -183615,6 +183750,8 @@ Dynamic files must always be opened with service's current directory or service this.removeProject(externalProject); } } + if (print) + this.printProjects(); } openExternalProjects(projects) { const projectsToClose = arrayToMap(this.externalProjects, (p) => p.getProjectName(), (_) => true); @@ -183622,12 +183759,21 @@ Dynamic files must always be opened with service's current directory or service projectsToClose.set(externalProjectName, true); }); for (const externalProject of projects) { - this.openExternalProject(externalProject); + this.openExternalProject( + externalProject, + /*print*/ + false + ); projectsToClose.delete(externalProject.projectFileName); } forEachKey(projectsToClose, (externalProjectName) => { - this.closeExternalProject(externalProjectName); + this.closeExternalProject( + externalProjectName, + /*print*/ + false + ); }); + this.printProjects(); } static escapeFilenameForRegex(filename) { return filename.replace(this.filenameEscapeRegexp, "\\$&"); @@ -183636,16 +183782,18 @@ Dynamic files must always be opened with service's current directory or service this.safelist = defaultTypeSafeList; } applySafeList(proj) { - const { rootFiles } = proj; const typeAcquisition = proj.typeAcquisition; Debug.assert(!!typeAcquisition, "proj.typeAcquisition should be set by now"); + const result = this.applySafeListWorker(proj, proj.rootFiles, typeAcquisition); + return (result == null ? void 0 : result.excludedFiles) ?? []; + } + applySafeListWorker(proj, rootFiles, typeAcquisition) { if (typeAcquisition.enable === false || typeAcquisition.disableFilenameBasedTypeAcquisition) { - return []; + return void 0; } const typeAcqInclude = typeAcquisition.include || (typeAcquisition.include = []); const excludeRules = []; const normalizedNames = rootFiles.map((f) => normalizeSlashes(f.fileName)); - const excludedFiles = []; for (const name of Object.keys(this.safelist)) { const rule2 = this.safelist[name]; for (const root of normalizedNames) { @@ -183686,12 +183834,12 @@ Dynamic files must always be opened with service's current directory or service } } const excludeRegexes = excludeRules.map((e) => new RegExp(e, "i")); - const filesToKeep = []; - for (let i = 0; i < proj.rootFiles.length; i++) { + let filesToKeep; + let excludedFiles; + for (let i = 0; i < rootFiles.length; i++) { if (excludeRegexes.some((re) => re.test(normalizedNames[i]))) { - excludedFiles.push(normalizedNames[i]); + addExcludedFile(i); } else { - let exclude = false; if (typeAcquisition.enable) { const baseName = getBaseFileName(toFileNameLowerCase(normalizedNames[i])); if (fileExtensionIs(baseName, "js")) { @@ -183700,110 +183848,93 @@ Dynamic files must always be opened with service's current directory or service const typeName = this.legacySafelist.get(cleanedTypingName); if (typeName !== void 0) { this.logger.info(`Excluded '${normalizedNames[i]}' because it matched ${cleanedTypingName} from the legacy safelist`); - excludedFiles.push(normalizedNames[i]); - exclude = true; + addExcludedFile(i); if (!typeAcqInclude.includes(typeName)) { typeAcqInclude.push(typeName); } + continue; } } } - if (!exclude) { - if (/^.+[.-]min\.js$/.test(normalizedNames[i])) { - excludedFiles.push(normalizedNames[i]); - } else { - filesToKeep.push(proj.rootFiles[i]); - } + if (/^.+[.-]min\.js$/.test(normalizedNames[i])) { + addExcludedFile(i); + } else { + filesToKeep == null ? void 0 : filesToKeep.push(rootFiles[i]); } } } - proj.rootFiles = filesToKeep; - return excludedFiles; - } - openExternalProject(proj) { - proj.typeAcquisition = proj.typeAcquisition || {}; - proj.typeAcquisition.include = proj.typeAcquisition.include || []; - proj.typeAcquisition.exclude = proj.typeAcquisition.exclude || []; - if (proj.typeAcquisition.enable === void 0) { - proj.typeAcquisition.enable = hasNoTypeScriptSource(proj.rootFiles.map((f) => f.fileName)); + return excludedFiles ? { + rootFiles: filesToKeep, + excludedFiles + } : void 0; + function addExcludedFile(index) { + if (!excludedFiles) { + Debug.assert(!filesToKeep); + filesToKeep = rootFiles.slice(0, index); + excludedFiles = []; + } + excludedFiles.push(normalizedNames[index]); } - const excludedFiles = this.applySafeList(proj); - let tsConfigFiles; - const rootFiles = []; + } + openExternalProject(proj, print) { + const existingExternalProject = this.findExternalProjectByProjectName(proj.projectFileName); + const existingConfiguredProjects = this.externalProjectToConfiguredProjectMap.get(proj.projectFileName); + let configuredProjects; + let rootFiles = []; for (const file of proj.rootFiles) { const normalized = toNormalizedPath(file.fileName); if (getBaseConfigFileName(normalized)) { if (this.serverMode === 0 /* Semantic */ && this.host.fileExists(normalized)) { - (tsConfigFiles || (tsConfigFiles = [])).push(normalized); + let project = this.findConfiguredProjectByProjectName(normalized); + if (!project) { + project = this.getHostPreferences().lazyConfiguredProjectsFromExternalProject ? this.createConfiguredProjectWithDelayLoad(normalized, `Creating configured project in external project: ${proj.projectFileName}`) : this.createLoadAndUpdateConfiguredProject(normalized, `Creating configured project in external project: ${proj.projectFileName}`); + } + if (!(existingConfiguredProjects == null ? void 0 : existingConfiguredProjects.has(project))) { + project.addExternalProjectReference(); + } + (configuredProjects ?? (configuredProjects = /* @__PURE__ */ new Set())).add(project); + existingConfiguredProjects == null ? void 0 : existingConfiguredProjects.delete(project); } } else { rootFiles.push(file); } } - if (tsConfigFiles) { - tsConfigFiles.sort(); - } - const externalProject = this.findExternalProjectByProjectName(proj.projectFileName); - let exisingConfigFiles; - if (externalProject) { - externalProject.excludedFiles = excludedFiles; - if (!tsConfigFiles) { - const compilerOptions = convertCompilerOptions(proj.options); - const watchOptionsAndErrors = convertWatchOptions(proj.options, externalProject.getCurrentDirectory()); - const lastFileExceededProgramSize = this.getFilenameForExceededTotalSizeLimitForNonTsFiles(proj.projectFileName, compilerOptions, proj.rootFiles, externalFilePropertyReader); - if (lastFileExceededProgramSize) { - externalProject.disableLanguageService(lastFileExceededProgramSize); - } else { - externalProject.enableLanguageService(); - } - externalProject.setProjectErrors(watchOptionsAndErrors == null ? void 0 : watchOptionsAndErrors.errors); - this.updateRootAndOptionsOfNonInferredProject(externalProject, proj.rootFiles, externalFilePropertyReader, compilerOptions, proj.typeAcquisition, proj.options.compileOnSave, watchOptionsAndErrors == null ? void 0 : watchOptionsAndErrors.watchOptions); - externalProject.updateGraph(); - return; - } - this.closeExternalProject(proj.projectFileName); - } else if (this.externalProjectToConfiguredProjectMap.get(proj.projectFileName)) { - if (!tsConfigFiles) { - this.closeExternalProject(proj.projectFileName); - } else { - const oldConfigFiles = this.externalProjectToConfiguredProjectMap.get(proj.projectFileName); - let iNew = 0; - let iOld = 0; - while (iNew < tsConfigFiles.length && iOld < oldConfigFiles.length) { - const newConfig = tsConfigFiles[iNew]; - const oldConfig = oldConfigFiles[iOld]; - if (oldConfig < newConfig) { - this.closeConfiguredProjectReferencedFromExternalProject(oldConfig); - iOld++; - } else if (oldConfig > newConfig) { - iNew++; - } else { - (exisingConfigFiles || (exisingConfigFiles = [])).push(oldConfig); - iOld++; - iNew++; - } - } - for (let i = iOld; i < oldConfigFiles.length; i++) { - this.closeConfiguredProjectReferencedFromExternalProject(oldConfigFiles[i]); - } - } - } - if (tsConfigFiles) { - this.externalProjectToConfiguredProjectMap.set(proj.projectFileName, tsConfigFiles); - for (const tsconfigFile of tsConfigFiles) { - let project = this.findConfiguredProjectByProjectName(tsconfigFile); - if (!project) { - project = this.getHostPreferences().lazyConfiguredProjectsFromExternalProject ? this.createConfiguredProjectWithDelayLoad(tsconfigFile, `Creating configured project in external project: ${proj.projectFileName}`) : this.createLoadAndUpdateConfiguredProject(tsconfigFile, `Creating configured project in external project: ${proj.projectFileName}`); - } - if (project && !contains(exisingConfigFiles, tsconfigFile)) { - project.addExternalProjectReference(); - } - } + if (configuredProjects) { + this.externalProjectToConfiguredProjectMap.set(proj.projectFileName, configuredProjects); + if (existingExternalProject) + this.removeProject(existingExternalProject); } else { this.externalProjectToConfiguredProjectMap.delete(proj.projectFileName); - const project = this.createExternalProject(proj.projectFileName, rootFiles, proj.options, proj.typeAcquisition, excludedFiles); - project.updateGraph(); + const typeAcquisition = proj.typeAcquisition || {}; + typeAcquisition.include = typeAcquisition.include || []; + typeAcquisition.exclude = typeAcquisition.exclude || []; + if (typeAcquisition.enable === void 0) { + typeAcquisition.enable = hasNoTypeScriptSource(rootFiles.map((f) => f.fileName)); + } + const excludeResult = this.applySafeListWorker(proj, rootFiles, typeAcquisition); + const excludedFiles = (excludeResult == null ? void 0 : excludeResult.excludedFiles) ?? []; + rootFiles = (excludeResult == null ? void 0 : excludeResult.rootFiles) ?? rootFiles; + if (existingExternalProject) { + existingExternalProject.excludedFiles = excludedFiles; + const compilerOptions = convertCompilerOptions(proj.options); + const watchOptionsAndErrors = convertWatchOptions(proj.options, existingExternalProject.getCurrentDirectory()); + const lastFileExceededProgramSize = this.getFilenameForExceededTotalSizeLimitForNonTsFiles(proj.projectFileName, compilerOptions, rootFiles, externalFilePropertyReader); + if (lastFileExceededProgramSize) { + existingExternalProject.disableLanguageService(lastFileExceededProgramSize); + } else { + existingExternalProject.enableLanguageService(); + } + existingExternalProject.setProjectErrors(watchOptionsAndErrors == null ? void 0 : watchOptionsAndErrors.errors); + this.updateRootAndOptionsOfNonInferredProject(existingExternalProject, rootFiles, externalFilePropertyReader, compilerOptions, typeAcquisition, proj.options.compileOnSave, watchOptionsAndErrors == null ? void 0 : watchOptionsAndErrors.watchOptions); + existingExternalProject.updateGraph(); + } else { + const project = this.createExternalProject(proj.projectFileName, rootFiles, proj.options, typeAcquisition, excludedFiles); + project.updateGraph(); + } } + this.closeConfiguredProjectReferencedFromExternalProject(existingConfiguredProjects); + if (print) + this.printProjects(); } hasDeferredExtension() { for (const extension of this.hostConfiguration.extraFileExtensions) { @@ -184730,7 +184861,11 @@ var Session3 = class _Session { return this.requiredResponse(response); }, ["openExternalProject" /* OpenExternalProject */]: (request) => { - this.projectService.openExternalProject(request.arguments); + this.projectService.openExternalProject( + request.arguments, + /*print*/ + true + ); return this.requiredResponse( /*response*/ true @@ -184744,7 +184879,11 @@ var Session3 = class _Session { ); }, ["closeExternalProject" /* CloseExternalProject */]: (request) => { - this.projectService.closeExternalProject(request.arguments.projectFileName); + this.projectService.closeExternalProject( + request.arguments.projectFileName, + /*print*/ + true + ); return this.requiredResponse( /*response*/ true diff --git a/lib/typescript.d.ts b/lib/typescript.d.ts index 100081fb8cc..a1317334637 100644 --- a/lib/typescript.d.ts +++ b/lib/typescript.d.ts @@ -3332,18 +3332,6 @@ declare namespace ts { * Last version that was reported. */ private lastReportedVersion; - /** - * Current project's program version. (incremented everytime new program is created that is not complete reuse from the old one) - * This property is changed in 'updateGraph' based on the set of files in program - */ - private projectProgramVersion; - /** - * Current version of the project state. It is changed when: - * - new root file was added/removed - * - edit happen in some file that is currently included in the project. - * This property is different from projectStructureVersion since in most cases edits don't affect set of files in the project - */ - private projectStateVersion; protected projectErrors: Diagnostic[] | undefined; protected isInitialLoadPending: () => boolean; private readonly cancellationToken; @@ -3918,6 +3906,7 @@ declare namespace ts { private static escapeFilenameForRegex; resetSafeList(): void; applySafeList(proj: protocol.ExternalProject): NormalizedPath[]; + private applySafeListWorker; openExternalProject(proj: protocol.ExternalProject): void; hasDeferredExtension(): boolean; private enableRequestedPluginsAsync; diff --git a/lib/typescript.js b/lib/typescript.js index 6cd6c983a31..74c39d0cdad 100644 --- a/lib/typescript.js +++ b/lib/typescript.js @@ -8260,7 +8260,6 @@ ${lanes.join("\n")} Disallow_inconsistently_cased_references_to_the_same_file: diag(6078, 3 /* Message */, "Disallow_inconsistently_cased_references_to_the_same_file_6078", "Disallow inconsistently-cased references to the same file."), Specify_library_files_to_be_included_in_the_compilation: diag(6079, 3 /* Message */, "Specify_library_files_to_be_included_in_the_compilation_6079", "Specify library files to be included in the compilation."), Specify_JSX_code_generation: diag(6080, 3 /* Message */, "Specify_JSX_code_generation_6080", "Specify JSX code generation."), - File_0_has_an_unsupported_extension_so_skipping_it: diag(6081, 3 /* Message */, "File_0_has_an_unsupported_extension_so_skipping_it_6081", "File '{0}' has an unsupported extension, so skipping it."), Only_amd_and_system_modules_are_supported_alongside_0: diag(6082, 1 /* Error */, "Only_amd_and_system_modules_are_supported_alongside_0_6082", "Only 'amd' and 'system' modules are supported alongside --{0}."), Base_directory_to_resolve_non_absolute_module_names: diag(6083, 3 /* Message */, "Base_directory_to_resolve_non_absolute_module_names_6083", "Base directory to resolve non-absolute module names."), Deprecated_Use_jsxFactory_instead_Specify_the_object_invoked_for_createElement_when_targeting_react_JSX_emit: diag(6084, 3 /* Message */, "Deprecated_Use_jsxFactory_instead_Specify_the_object_invoked_for_createElement_when_targeting_react__6084", "[Deprecated] Use '--jsxFactory' instead. Specify the object invoked for createElement when targeting 'react' JSX emit"), @@ -18246,7 +18245,8 @@ ${lanes.join("\n")} } function getModuleSpecifierEndingPreference(preference, resolutionMode, compilerOptions, sourceFile) { const moduleResolution = getEmitModuleResolutionKind(compilerOptions); - if (preference === "js" || resolutionMode === 99 /* ESNext */ && 3 /* Node16 */ <= moduleResolution && moduleResolution <= 99 /* NodeNext */) { + const moduleResolutionIsNodeNext = 3 /* Node16 */ <= moduleResolution && moduleResolution <= 99 /* NodeNext */; + if (preference === "js" || resolutionMode === 99 /* ESNext */ && moduleResolutionIsNodeNext) { if (!shouldAllowImportingTsExtension(compilerOptions)) { return 2 /* JsExtension */; } @@ -18264,16 +18264,19 @@ ${lanes.join("\n")} return inferPreference(); function inferPreference() { let usesJsExtensions = false; - const specifiers = sourceFile.imports.length ? sourceFile.imports.map((i) => i.text) : isSourceFileJS(sourceFile) ? getRequiresAtTopOfFile(sourceFile).map((r) => r.arguments[0].text) : emptyArray; + const specifiers = sourceFile.imports.length ? sourceFile.imports : isSourceFileJS(sourceFile) ? getRequiresAtTopOfFile(sourceFile).map((r) => r.arguments[0]) : emptyArray; for (const specifier of specifiers) { - if (pathIsRelative(specifier)) { - if (fileExtensionIsOneOf(specifier, extensionsNotSupportingExtensionlessResolution)) { + if (pathIsRelative(specifier.text)) { + if (moduleResolutionIsNodeNext && resolutionMode === 1 /* CommonJS */ && getModeForUsageLocation(sourceFile, specifier, compilerOptions) === 99 /* ESNext */) { continue; } - if (hasTSFileExtension(specifier)) { + if (fileExtensionIsOneOf(specifier.text, extensionsNotSupportingExtensionlessResolution)) { + continue; + } + if (hasTSFileExtension(specifier.text)) { return 3 /* TsExtension */; } - if (hasJSFileExtension(specifier)) { + if (hasJSFileExtension(specifier.text)) { usesJsExtensions = true; } } @@ -35006,7 +35009,7 @@ ${lanes.join("\n")} if (!jsDocDiagnostics) { jsDocDiagnostics = []; } - jsDocDiagnostics.push(...parseDiagnostics); + addRange(jsDocDiagnostics, parseDiagnostics, saveParseDiagnosticsLength); } currentToken = saveToken; parseDiagnostics.length = saveParseDiagnosticsLength; @@ -41225,15 +41228,9 @@ ${lanes.join("\n")} } } const loader = (extensions2, candidate2, onlyRecordFailures2, state2) => { - const fromFile = tryFile(candidate2, onlyRecordFailures2, state2); + const fromFile = loadFileNameFromPackageJsonField(extensions2, candidate2, onlyRecordFailures2, state2); if (fromFile) { - const resolved = resolvedIfExtensionMatches(extensions2, fromFile); - if (resolved) { - return noPackageId(resolved); - } - if (state2.traceEnabled) { - trace(state2.host, Diagnostics.File_0_has_an_unsupported_extension_so_skipping_it, fromFile); - } + return noPackageId(fromFile); } const expandedExtensions = extensions2 === 4 /* Declaration */ ? 1 /* TypeScript */ | 4 /* Declaration */ : extensions2; const features = state2.features; @@ -41289,10 +41286,6 @@ ${lanes.join("\n")} return loadModuleFromFile(extensions, indexPath, onlyRecordFailuresForIndex, state); } } - function resolvedIfExtensionMatches(extensions, path, resolvedUsingTsExtension) { - const ext = tryGetExtensionFromPath2(path); - return ext !== void 0 && extensionIsOk(extensions, ext) ? { path, ext, resolvedUsingTsExtension } : void 0; - } function extensionIsOk(extensions, extension) { return extensions & 2 /* JavaScript */ && (extension === ".js" /* Js */ || extension === ".jsx" /* Jsx */ || extension === ".mjs" /* Mjs */ || extension === ".cjs" /* Cjs */) || extensions & 1 /* TypeScript */ && (extension === ".ts" /* Ts */ || extension === ".tsx" /* Tsx */ || extension === ".mts" /* Mts */ || extension === ".cts" /* Cts */) || extensions & 4 /* Declaration */ && (extension === ".d.ts" /* Dts */ || extension === ".d.mts" /* Dmts */ || extension === ".d.cts" /* Dcts */) || extensions & 8 /* Json */ && extension === ".json" /* Json */ || false; } @@ -45194,11 +45187,12 @@ ${lanes.join("\n")} }); // src/compiler/moduleSpecifiers.ts - function getPreferences({ importModuleSpecifierPreference, importModuleSpecifierEnding }, compilerOptions, importingSourceFile, oldImportSpecifier) { - const preferredEnding = getPreferredEnding(); + function getModuleSpecifierPreferences({ importModuleSpecifierPreference, importModuleSpecifierEnding }, compilerOptions, importingSourceFile, oldImportSpecifier) { + const filePreferredEnding = getPreferredEnding(); return { relativePreference: oldImportSpecifier !== void 0 ? isExternalModuleNameRelative(oldImportSpecifier) ? 0 /* Relative */ : 1 /* NonRelative */ : importModuleSpecifierPreference === "relative" ? 0 /* Relative */ : importModuleSpecifierPreference === "non-relative" ? 1 /* NonRelative */ : importModuleSpecifierPreference === "project-relative" ? 3 /* ExternalNonRelative */ : 2 /* Shortest */, getAllowedEndingsInPreferredOrder: (syntaxImpliedNodeFormat) => { + const preferredEnding = syntaxImpliedNodeFormat !== importingSourceFile.impliedNodeFormat ? getPreferredEnding(syntaxImpliedNodeFormat) : filePreferredEnding; if ((syntaxImpliedNodeFormat ?? importingSourceFile.impliedNodeFormat) === 99 /* ESNext */) { if (shouldAllowImportingTsExtension(compilerOptions, importingSourceFile.fileName)) { return [3 /* TsExtension */, 2 /* JsExtension */]; @@ -45223,7 +45217,7 @@ ${lanes.join("\n")} } } }; - function getPreferredEnding() { + function getPreferredEnding(resolutionMode) { if (oldImportSpecifier !== void 0) { if (hasJSFileExtension(oldImportSpecifier)) return 2 /* JsExtension */; @@ -45232,20 +45226,20 @@ ${lanes.join("\n")} } return getModuleSpecifierEndingPreference( importModuleSpecifierEnding, - importingSourceFile.impliedNodeFormat, + resolutionMode ?? importingSourceFile.impliedNodeFormat, compilerOptions, importingSourceFile ); } } function updateModuleSpecifier(compilerOptions, importingSourceFile, importingSourceFileName, toFileName2, host, oldImportSpecifier, options = {}) { - const res = getModuleSpecifierWorker(compilerOptions, importingSourceFile, importingSourceFileName, toFileName2, host, getPreferences({}, compilerOptions, importingSourceFile, oldImportSpecifier), {}, options); + const res = getModuleSpecifierWorker(compilerOptions, importingSourceFile, importingSourceFileName, toFileName2, host, getModuleSpecifierPreferences({}, compilerOptions, importingSourceFile, oldImportSpecifier), {}, options); if (res === oldImportSpecifier) return void 0; return res; } function getModuleSpecifier(compilerOptions, importingSourceFile, importingSourceFileName, toFileName2, host, options = {}) { - return getModuleSpecifierWorker(compilerOptions, importingSourceFile, importingSourceFileName, toFileName2, host, getPreferences({}, compilerOptions, importingSourceFile), {}, options); + return getModuleSpecifierWorker(compilerOptions, importingSourceFile, importingSourceFileName, toFileName2, host, getModuleSpecifierPreferences({}, compilerOptions, importingSourceFile), {}, options); } function getNodeModulesPackageName(compilerOptions, importingSourceFile, nodeModulesFileName, host, preferences, options = {}) { const info = getInfo(importingSourceFile.fileName, host); @@ -45341,7 +45335,7 @@ ${lanes.join("\n")} } function computeModuleSpecifiers(modulePaths, compilerOptions, importingSourceFile, host, userPreferences, options = {}, forAutoImport) { const info = getInfo(importingSourceFile.fileName, host); - const preferences = getPreferences(userPreferences, compilerOptions, importingSourceFile); + const preferences = getModuleSpecifierPreferences(userPreferences, compilerOptions, importingSourceFile); const existingSpecifier = forEach(modulePaths, (modulePath) => forEach( host.getFileIncludeReasons().get(toPath(modulePath.path, host.getCurrentDirectory(), info.getCanonicalFileName)), (reason) => { @@ -45851,7 +45845,7 @@ ${lanes.join("\n")} if (!parts) { return void 0; } - const preferences = getPreferences(userPreferences, options, importingSourceFile); + const preferences = getModuleSpecifierPreferences(userPreferences, options, importingSourceFile); const allowedEndings = preferences.getAllowedEndingsInPreferredOrder(); let moduleSpecifier = path; let isPackageRootPath = false; @@ -46054,19 +46048,29 @@ ${lanes.join("\n")} function isPathRelativeToParent(path) { return startsWith(path, ".."); } + var RelativePreference; var init_moduleSpecifiers = __esm({ "src/compiler/moduleSpecifiers.ts"() { "use strict"; init_ts2(); + RelativePreference = /* @__PURE__ */ ((RelativePreference2) => { + RelativePreference2[RelativePreference2["Relative"] = 0] = "Relative"; + RelativePreference2[RelativePreference2["NonRelative"] = 1] = "NonRelative"; + RelativePreference2[RelativePreference2["Shortest"] = 2] = "Shortest"; + RelativePreference2[RelativePreference2["ExternalNonRelative"] = 3] = "ExternalNonRelative"; + return RelativePreference2; + })(RelativePreference || {}); } }); // src/compiler/_namespaces/ts.moduleSpecifiers.ts var ts_moduleSpecifiers_exports = {}; __export(ts_moduleSpecifiers_exports, { + RelativePreference: () => RelativePreference, countPathComponents: () => countPathComponents, forEachFileNameOfModule: () => forEachFileNameOfModule, getModuleSpecifier: () => getModuleSpecifier, + getModuleSpecifierPreferences: () => getModuleSpecifierPreferences, getModuleSpecifiers: () => getModuleSpecifiers, getModuleSpecifiersWithCacheInfo: () => getModuleSpecifiersWithCacheInfo, getNodeModulesPackageName: () => getNodeModulesPackageName, @@ -48404,6 +48408,11 @@ ${lanes.join("\n")} diagnosticMessage = error2(errorLocation, Diagnostics.Class_0_used_before_its_declaration, declarationName); } else if (result.flags & 256 /* RegularEnum */) { diagnosticMessage = error2(errorLocation, Diagnostics.Enum_0_used_before_its_declaration, declarationName); + } else { + Debug.assert(!!(result.flags & 128 /* ConstEnum */)); + if (getIsolatedModules(compilerOptions)) { + diagnosticMessage = error2(errorLocation, Diagnostics.Enum_0_used_before_its_declaration, declarationName); + } } if (diagnosticMessage) { addRelatedInfo(diagnosticMessage, createDiagnosticForNode(declaration, Diagnostics._0_is_declared_here, declarationName)); @@ -56956,6 +56965,8 @@ ${lanes.join("\n")} result.compositeSignatures = concatenate(left.compositeKind !== 2097152 /* Intersection */ && left.compositeSignatures || [left], [right]); if (paramMapper) { result.mapper = left.compositeKind !== 2097152 /* Intersection */ && left.mapper && left.compositeSignatures ? combineTypeMappers(left.mapper, paramMapper) : paramMapper; + } else if (left.compositeKind !== 2097152 /* Intersection */ && left.mapper && left.compositeSignatures) { + result.mapper = left.mapper; } return result; } @@ -57553,7 +57564,7 @@ ${lanes.join("\n")} return simplified !== type ? simplified : getConstraintOfType(type); } function getConstraintFromIndexedAccess(type) { - if (isMappedTypeGenericIndexedAccess(type) || isGenericMappedType(type.objectType)) { + if (isMappedTypeGenericIndexedAccess(type)) { return substituteIndexedMappedType(type.objectType, type.indexType); } const indexConstraint = getSimplifiedTypeOrConstraint(type.indexType); @@ -57803,11 +57814,15 @@ ${lanes.join("\n")} return type.resolvedApparentType || (type.resolvedApparentType = getResolvedApparentTypeOfMappedType(type)); } function getResolvedApparentTypeOfMappedType(type) { - const typeVariable = getHomomorphicTypeVariable(type); - if (typeVariable && !type.declaration.nameType) { - const constraint = getConstraintOfTypeParameter(typeVariable); - if (constraint && everyType(constraint, isArrayOrTupleType)) { - return instantiateType(type, prependTypeMapping(typeVariable, constraint, type.mapper)); + const target = type.target ?? type; + const typeVariable = getHomomorphicTypeVariable(target); + if (typeVariable && !target.declaration.nameType) { + const constraint = getConstraintTypeFromMappedType(type); + if (constraint.flags & 4194304 /* Index */) { + const baseConstraint = getBaseConstraintOfType(constraint.type); + if (baseConstraint && everyType(baseConstraint, isArrayOrTupleType)) { + return instantiateType(target, prependTypeMapping(typeVariable, baseConstraint, type.mapper)); + } } } return type; @@ -58066,10 +58081,14 @@ ${lanes.join("\n")} return errorInfo; } function getPropertyOfType(type, name, skipObjectFunctionPropertyAugment, includeTypeOnlyMembers) { + var _a, _b; type = getReducedApparentType(type); if (type.flags & 524288 /* Object */) { const resolved = resolveStructuredTypeMembers(type); const symbol = resolved.members.get(name); + if (symbol && !includeTypeOnlyMembers && ((_a = type.symbol) == null ? void 0 : _a.flags) & 512 /* ValueModule */ && ((_b = getSymbolLinks(type.symbol).typeOnlyExportStarMap) == null ? void 0 : _b.has(name))) { + return void 0; + } if (symbol && symbolIsValue(symbol, includeTypeOnlyMembers)) { return symbol; } @@ -59842,7 +59861,7 @@ ${lanes.join("\n")} return target.objectFlags & 8 /* Tuple */ ? createNormalizedTupleType(target, typeArguments) : createTypeReference(target, typeArguments); } function createNormalizedTupleType(target, elementTypes) { - var _a, _b, _c; + var _a, _b, _c, _d; if (!(target.combinedFlags & 14 /* NonRequired */)) { return createTypeReference(target, elementTypes); } @@ -59862,8 +59881,10 @@ ${lanes.join("\n")} const type = elementTypes[i]; const flags = target.elementFlags[i]; if (flags & 8 /* Variadic */) { - if (type.flags & 58982400 /* InstantiableNonPrimitive */ || isGenericMappedType(type)) { - addElement(type, 8 /* Variadic */, (_a = target.labeledElementDeclarations) == null ? void 0 : _a[i]); + if (type.flags & 1 /* Any */) { + addElement(type, 4 /* Rest */, (_a = target.labeledElementDeclarations) == null ? void 0 : _a[i]); + } else if (type.flags & 58982400 /* InstantiableNonPrimitive */ || isGenericMappedType(type)) { + addElement(type, 8 /* Variadic */, (_b = target.labeledElementDeclarations) == null ? void 0 : _b[i]); } else if (isTupleType(type)) { const elements = getElementTypes(type); if (elements.length + expandedTypes.length >= 1e4) { @@ -59878,10 +59899,10 @@ ${lanes.join("\n")} return addElement(t, type.target.elementFlags[n], (_a2 = type.target.labeledElementDeclarations) == null ? void 0 : _a2[n]); }); } else { - addElement(isArrayLikeType(type) && getIndexTypeOfType(type, numberType) || errorType, 4 /* Rest */, (_b = target.labeledElementDeclarations) == null ? void 0 : _b[i]); + addElement(isArrayLikeType(type) && getIndexTypeOfType(type, numberType) || errorType, 4 /* Rest */, (_c = target.labeledElementDeclarations) == null ? void 0 : _c[i]); } } else { - addElement(type, flags, (_c = target.labeledElementDeclarations) == null ? void 0 : _c[i]); + addElement(type, flags, (_d = target.labeledElementDeclarations) == null ? void 0 : _d[i]); } } for (let i = 0; i < lastRequiredIndex; i++) { @@ -61245,10 +61266,6 @@ ${lanes.join("\n")} } return type; } - function maybeCloneTypeParameter(p) { - const constraint = getConstraintOfTypeParameter(p); - return constraint && (isGenericObjectType(constraint) || isGenericIndexType(constraint)) ? cloneTypeParameter(p) : p; - } function isSimpleTupleType(node) { return isTupleTypeNode(node) && length(node.elements) > 0 && !some(node.elements, (e) => isOptionalTypeNode(e) || isRestTypeNode(e) || isNamedTupleMember(e) && !!(e.questionToken || e.dotDotDotToken)); } @@ -61278,27 +61295,19 @@ ${lanes.join("\n")} const checkTypeDeferred = isDeferredType(checkType, checkTuples); let combinedMapper; if (root.inferTypeParameters) { - const freshParams = sameMap(root.inferTypeParameters, maybeCloneTypeParameter); - const freshMapper = freshParams !== root.inferTypeParameters ? createTypeMapper(root.inferTypeParameters, freshParams) : void 0; const context = createInferenceContext( - freshParams, + root.inferTypeParameters, /*signature*/ void 0, 0 /* None */ ); - if (freshMapper) { - const freshCombinedMapper = combineTypeMappers(mapper, freshMapper); - for (let i = 0; i < freshParams.length; i++) { - if (freshParams[i] !== root.inferTypeParameters[i]) { - freshParams[i].mapper = freshCombinedMapper; - } - } + if (mapper) { + context.nonFixingMapper = combineTypeMappers(context.nonFixingMapper, mapper); } if (!checkTypeDeferred) { - inferTypes(context.inferences, checkType, instantiateType(extendsType, freshMapper), 512 /* NoConstraints */ | 1024 /* AlwaysStrict */); + inferTypes(context.inferences, checkType, extendsType, 512 /* NoConstraints */ | 1024 /* AlwaysStrict */); } - const innerMapper = combineTypeMappers(freshMapper, context.mapper); - combinedMapper = mapper ? combineTypeMappers(innerMapper, mapper) : innerMapper; + combinedMapper = mapper ? combineTypeMappers(context.mapper, mapper) : context.mapper; } const inferredExtendsType = combinedMapper ? instantiateType(root.extendsType, combinedMapper) : extendsType; if (!checkTypeDeferred && !isDeferredType(inferredExtendsType, checkTuples)) { @@ -62275,8 +62284,8 @@ ${lanes.join("\n")} if (!result) { const newMapper = createTypeMapper(root.outerTypeParameters, typeArguments); const checkType = root.checkType; - const distributionType = root.isDistributive ? getMappedType(checkType, newMapper) : void 0; - result = distributionType && checkType !== distributionType && distributionType.flags & (1048576 /* Union */ | 131072 /* Never */) ? mapTypeWithAlias(getReducedType(distributionType), (t) => getConditionalType(root, prependTypeMapping(checkType, t, newMapper), forConstraint), aliasSymbol, aliasTypeArguments) : getConditionalType(root, newMapper, forConstraint, aliasSymbol, aliasTypeArguments); + const distributionType = root.isDistributive ? getReducedType(getMappedType(checkType, newMapper)) : void 0; + result = distributionType && checkType !== distributionType && distributionType.flags & (1048576 /* Union */ | 131072 /* Never */) ? mapTypeWithAlias(distributionType, (t) => getConditionalType(root, prependTypeMapping(checkType, t, newMapper), forConstraint), aliasSymbol, aliasTypeArguments) : getConditionalType(root, newMapper, forConstraint, aliasSymbol, aliasTypeArguments); root.instantiations.set(id, result); } return result; @@ -63150,8 +63159,8 @@ ${lanes.join("\n")} const paramCount = sourceRestType || targetRestType ? Math.min(sourceCount, targetCount) : Math.max(sourceCount, targetCount); const restIndex = sourceRestType || targetRestType ? paramCount - 1 : -1; for (let i = 0; i < paramCount; i++) { - const sourceType = i === restIndex ? getRestTypeAtPosition(source, i) : tryGetTypeAtPosition(source, i); - const targetType = i === restIndex ? getRestTypeAtPosition(target, i) : tryGetTypeAtPosition(target, i); + const sourceType = i === restIndex ? getRestOrAnyTypeAtPosition(source, i) : tryGetTypeAtPosition(source, i); + const targetType = i === restIndex ? getRestOrAnyTypeAtPosition(target, i) : tryGetTypeAtPosition(target, i); if (sourceType && targetType) { const sourceSig = checkMode & 3 /* Callback */ || isInstantiatedGenericParameter(source, i) ? void 0 : getSingleCallSignature(getNonNullableType(sourceType)); const targetSig = checkMode & 3 /* Callback */ || isInstantiatedGenericParameter(target, i) ? void 0 : getSingleCallSignature(getNonNullableType(targetType)); @@ -68134,7 +68143,7 @@ ${lanes.join("\n")} function hasMatchingArgument(expression, reference) { if (expression.arguments) { for (const argument of expression.arguments) { - if (isOrContainsMatchingReference(reference, argument) || optionalChainContainsReference(argument, reference)) { + if (isOrContainsMatchingReference(reference, argument) || optionalChainContainsReference(argument, reference) || getCandidateDiscriminantPropertyAccess(argument, reference)) { return true; } } @@ -68144,6 +68153,36 @@ ${lanes.join("\n")} } return false; } + function getCandidateDiscriminantPropertyAccess(expr, reference) { + if (isBindingPattern(reference) || isFunctionExpressionOrArrowFunction(reference) || isObjectLiteralMethod(reference)) { + if (isIdentifier(expr)) { + const symbol = getResolvedSymbol(expr); + const declaration = symbol.valueDeclaration; + if (declaration && (isBindingElement(declaration) || isParameter(declaration)) && reference === declaration.parent && !declaration.initializer && !declaration.dotDotDotToken) { + return declaration; + } + } + } else if (isAccessExpression(expr)) { + if (isMatchingReference(reference, expr.expression)) { + return expr; + } + } else if (isIdentifier(expr)) { + const symbol = getResolvedSymbol(expr); + if (isConstantVariable(symbol)) { + const declaration = symbol.valueDeclaration; + if (isVariableDeclaration(declaration) && !declaration.type && declaration.initializer && isAccessExpression(declaration.initializer) && isMatchingReference(reference, declaration.initializer.expression)) { + return declaration.initializer; + } + if (isBindingElement(declaration) && !declaration.initializer) { + const parent2 = declaration.parent.parent; + if (isVariableDeclaration(parent2) && !parent2.type && parent2.initializer && (isIdentifier(parent2.initializer) || isAccessExpression(parent2.initializer)) && isMatchingReference(reference, parent2.initializer)) { + return declaration; + } + } + } + } + return void 0; + } function getFlowNodeId(flow) { if (!flow.id || flow.id < 0) { flow.id = nextFlowId; @@ -69243,39 +69282,9 @@ ${lanes.join("\n")} } return result; } - function getCandidateDiscriminantPropertyAccess(expr) { - if (isBindingPattern(reference) || isFunctionExpressionOrArrowFunction(reference) || isObjectLiteralMethod(reference)) { - if (isIdentifier(expr)) { - const symbol = getResolvedSymbol(expr); - const declaration = symbol.valueDeclaration; - if (declaration && (isBindingElement(declaration) || isParameter(declaration)) && reference === declaration.parent && !declaration.initializer && !declaration.dotDotDotToken) { - return declaration; - } - } - } else if (isAccessExpression(expr)) { - if (isMatchingReference(reference, expr.expression)) { - return expr; - } - } else if (isIdentifier(expr)) { - const symbol = getResolvedSymbol(expr); - if (isConstantVariable(symbol)) { - const declaration = symbol.valueDeclaration; - if (isVariableDeclaration(declaration) && !declaration.type && declaration.initializer && isAccessExpression(declaration.initializer) && isMatchingReference(reference, declaration.initializer.expression)) { - return declaration.initializer; - } - if (isBindingElement(declaration) && !declaration.initializer) { - const parent2 = declaration.parent.parent; - if (isVariableDeclaration(parent2) && !parent2.type && parent2.initializer && (isIdentifier(parent2.initializer) || isAccessExpression(parent2.initializer)) && isMatchingReference(reference, parent2.initializer)) { - return declaration; - } - } - } - } - return void 0; - } function getDiscriminantPropertyAccess(expr, computedType) { if (declaredType.flags & 1048576 /* Union */ || computedType.flags & 1048576 /* Union */) { - const access = getCandidateDiscriminantPropertyAccess(expr); + const access = getCandidateDiscriminantPropertyAccess(expr, reference); if (access) { const name = getAccessedPropertyName(access); if (name) { @@ -76154,6 +76163,11 @@ ${lanes.join("\n")} } return createTupleType(types, flags, readonly, names); } + function getRestOrAnyTypeAtPosition(source, pos) { + const restType = getRestTypeAtPosition(source, pos); + const elementType = restType && getElementTypeOfArrayType(restType); + return elementType && isTypeAny(elementType) ? anyType : restType; + } function getParameterCount(signature) { const length2 = signature.parameters.length; if (signatureHasRestParameter(signature)) { @@ -76210,7 +76224,7 @@ ${lanes.join("\n")} if (signatureHasRestParameter(signature)) { const restType = getTypeOfSymbol(signature.parameters[signature.parameters.length - 1]); if (!isTupleType(restType)) { - return restType; + return isTypeAny(restType) ? anyArrayType : restType; } if (restType.target.hasRestElement) { return sliceTupleType(restType, restType.target.fixedLength); @@ -79514,20 +79528,17 @@ ${lanes.join("\n")} const objectType = type.objectType; const indexType = type.indexType; const objectIndexType = isGenericMappedType(objectType) && getMappedTypeNameTypeKind(objectType) === 2 /* Remapping */ ? getIndexTypeForMappedType(objectType, 0 /* None */) : getIndexType(objectType, 0 /* None */); - if (isTypeAssignableTo(indexType, objectIndexType)) { + const hasNumberIndexInfo = !!getIndexInfoOfType(objectType, numberType); + if (everyType(indexType, (t) => isTypeAssignableTo(t, objectIndexType) || hasNumberIndexInfo && isApplicableIndexType(t, numberType))) { if (accessNode.kind === 212 /* ElementAccessExpression */ && isAssignmentTarget(accessNode) && getObjectFlags(objectType) & 32 /* Mapped */ && getMappedTypeModifiers(objectType) & 1 /* IncludeReadonly */) { error2(accessNode, Diagnostics.Index_signature_in_type_0_only_permits_reading, typeToString(objectType)); } return type; } - const apparentObjectType = getApparentType(objectType); - if (getIndexInfoOfType(apparentObjectType, numberType) && isTypeAssignableToKind(indexType, 296 /* NumberLike */)) { - return type; - } if (isGenericObjectType(objectType)) { const propertyName = getPropertyNameFromIndex(indexType, accessNode); if (propertyName) { - const propertySymbol = forEachType(apparentObjectType, (t) => getPropertyOfType(t, propertyName)); + const propertySymbol = forEachType(getApparentType(objectType), (t) => getPropertyOfType(t, propertyName)); if (propertySymbol && getDeclarationModifierFlagsFromSymbol(propertySymbol) & 6 /* NonPublicAccessibilityModifier */) { error2(accessNode, Diagnostics.Private_or_protected_member_0_cannot_be_accessed_on_a_type_parameter, unescapeLeadingUnderscores(propertyName)); return errorType; @@ -85587,7 +85598,7 @@ ${lanes.join("\n")} true, location ); - const resolvedSymbol = valueSymbol && valueSymbol.flags & 2097152 /* Alias */ ? resolveAlias(valueSymbol) : valueSymbol; + const resolvedValueSymbol = valueSymbol && valueSymbol.flags & 2097152 /* Alias */ ? resolveAlias(valueSymbol) : valueSymbol; isTypeOnly || (isTypeOnly = !!(valueSymbol && getTypeOnlyAliasDeclaration(valueSymbol, 111551 /* Value */))); const typeSymbol = resolveEntityName( typeName, @@ -85595,26 +85606,30 @@ ${lanes.join("\n")} /*ignoreErrors*/ true, /*dontResolveAlias*/ - false, + true, location ); - if (resolvedSymbol && resolvedSymbol === typeSymbol) { + const resolvedTypeSymbol = typeSymbol && typeSymbol.flags & 2097152 /* Alias */ ? resolveAlias(typeSymbol) : typeSymbol; + if (!valueSymbol) { + isTypeOnly || (isTypeOnly = !!(typeSymbol && getTypeOnlyAliasDeclaration(typeSymbol, 788968 /* Type */))); + } + if (resolvedValueSymbol && resolvedValueSymbol === resolvedTypeSymbol) { const globalPromiseSymbol = getGlobalPromiseConstructorSymbol( /*reportErrors*/ false ); - if (globalPromiseSymbol && resolvedSymbol === globalPromiseSymbol) { + if (globalPromiseSymbol && resolvedValueSymbol === globalPromiseSymbol) { return 9 /* Promise */; } - const constructorType = getTypeOfSymbol(resolvedSymbol); + const constructorType = getTypeOfSymbol(resolvedValueSymbol); if (constructorType && isConstructorType(constructorType)) { return isTypeOnly ? 10 /* TypeWithCallSignature */ : 1 /* TypeWithConstructSignatureAndValue */; } } - if (!typeSymbol) { + if (!resolvedTypeSymbol) { return isTypeOnly ? 11 /* ObjectType */ : 0 /* Unknown */; } - const type = getDeclaredTypeOfSymbol(typeSymbol); + const type = getDeclaredTypeOfSymbol(resolvedTypeSymbol); if (isErrorType(type)) { return isTypeOnly ? 11 /* ObjectType */ : 0 /* Unknown */; } else if (type.flags & 3 /* AnyOrUnknown */) { @@ -91436,9 +91451,50 @@ ${lanes.join("\n")} return visitorWorker(node); } } - function visitElidableStatement(node) { + function isElisionBlocked(node) { const parsed = getParseTreeNode(node); - if (parsed !== node) { + if (parsed === node || isExportAssignment(node)) { + return false; + } + if (!parsed || parsed.kind !== node.kind) { + return true; + } + switch (node.kind) { + case 272 /* ImportDeclaration */: + Debug.assertNode(parsed, isImportDeclaration); + if (node.importClause !== parsed.importClause) { + return true; + } + if (node.attributes !== parsed.attributes) { + return true; + } + break; + case 271 /* ImportEqualsDeclaration */: + Debug.assertNode(parsed, isImportEqualsDeclaration); + if (node.name !== parsed.name) { + return true; + } + if (node.isTypeOnly !== parsed.isTypeOnly) { + return true; + } + if (node.moduleReference !== parsed.moduleReference && (isEntityName(node.moduleReference) || isEntityName(parsed.moduleReference))) { + return true; + } + break; + case 278 /* ExportDeclaration */: + Debug.assertNode(parsed, isExportDeclaration); + if (node.exportClause !== parsed.exportClause) { + return true; + } + if (node.attributes !== parsed.attributes) { + return true; + } + break; + } + return false; + } + function visitElidableStatement(node) { + if (isElisionBlocked(node)) { if (node.transformFlags & 1 /* ContainsTypeScript */) { return visitEachChild(node, visitor, context); } @@ -118184,7 +118240,7 @@ ${lanes.join("\n")} return getLiteralTextOfNode(textSourceNode, neverAsciiEscape, jsxAttributeEscape); } } - const flags = (neverAsciiEscape ? 1 /* NeverAsciiEscape */ : 0) | (jsxAttributeEscape ? 2 /* JsxAttributeEscape */ : 0) | (printerOptions.terminateUnterminatedLiterals ? 4 /* TerminateUnterminatedLiterals */ : 0) | (printerOptions.target && printerOptions.target === 99 /* ESNext */ ? 8 /* AllowNumericSeparator */ : 0); + const flags = (neverAsciiEscape ? 1 /* NeverAsciiEscape */ : 0) | (jsxAttributeEscape ? 2 /* JsxAttributeEscape */ : 0) | (printerOptions.terminateUnterminatedLiterals ? 4 /* TerminateUnterminatedLiterals */ : 0) | (printerOptions.target && printerOptions.target >= 8 /* ES2021 */ ? 8 /* AllowNumericSeparator */ : 0); return getLiteralText(node, currentSourceFile, flags); } function pushNameGenerationScope(node) { @@ -139038,10 +139094,10 @@ ${lanes.join("\n")} }); // src/services/refactors/moveToNewFile.ts - function doChange3(oldFile, program, toMove, changes, host, preferences, context) { + function doChange3(oldFile, program, toMove, changes, host, preferences) { const checker = program.getTypeChecker(); const usage = getUsageInfo(oldFile, toMove.all, checker); - const newFilename = createNewFileName(oldFile, program, context, host); + const newFilename = createNewFileName(oldFile, program, host, toMove); changes.createNewFile(oldFile, newFilename, getNewStatementsAndRemoveFromOldFile(oldFile, usage, changes, toMove, program, host, newFilename, preferences)); addNewFileToTsconfig(program, changes, oldFile.fileName, newFilename, hostGetCanonicalFileName(host)); } @@ -139146,7 +139202,7 @@ ${lanes.join("\n")} getEditsForAction: function getRefactorEditsToMoveToNewFile(context, actionName2) { Debug.assert(actionName2 === refactorName5, "Wrong refactor invoked"); const statements = Debug.checkDefined(getStatementsToMove(context)); - const edits = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChange3(context.file, context.program, statements, t, context.host, context.preferences, context)); + const edits = ts_textChanges_exports.ChangeTracker.with(context, (t) => doChange3(context.file, context.program, statements, t, context.host, context.preferences)); return { edits, renameFilename: void 0, renameLocation: void 0 }; } }); @@ -139750,12 +139806,10 @@ ${lanes.join("\n")} changes.insertNodesAfter(sourceFile, decl, names.map(createExportAssignment)); } } - function createNewFileName(oldFile, program, context, host) { + function createNewFileName(oldFile, program, host, toMove) { const checker = program.getTypeChecker(); - const toMove = getStatementsToMove(context); - let usage; if (toMove) { - usage = getUsageInfo(oldFile, toMove.all, checker); + const usage = getUsageInfo(oldFile, toMove.all, checker); const currentDirectory = getDirectoryPath(oldFile.fileName); const extension = extensionFromPath(oldFile.fileName); const newFileName = combinePaths( @@ -139813,6 +139867,9 @@ ${lanes.join("\n")} }); return all.length === 0 ? void 0 : { all, ranges }; } + function containsJsx(statements) { + return find(statements, (statement) => !!(statement.transformFlags & 2 /* ContainsJsx */)); + } function isAllowedStatementToMove(statement) { return !isPureImport(statement) && !isPrologueDirective(statement); } @@ -139836,8 +139893,7 @@ ${lanes.join("\n")} const movedSymbols = /* @__PURE__ */ new Set(); const oldImportsNeededByTargetFile = /* @__PURE__ */ new Map(); const targetFileImportsFromOldFile = /* @__PURE__ */ new Set(); - const containsJsx = find(toMove, (statement) => !!(statement.transformFlags & 2 /* ContainsJsx */)); - const jsxNamespaceSymbol = getJsxNamespaceSymbol(containsJsx); + const jsxNamespaceSymbol = getJsxNamespaceSymbol(containsJsx(toMove)); if (jsxNamespaceSymbol) { oldImportsNeededByTargetFile.set(jsxNamespaceSymbol, false); } @@ -143554,6 +143610,7 @@ ${newComment.split("\n").map((c) => ` * ${c}`).join("\n")} addExports: () => addExports, addNewFileToTsconfig: () => addNewFileToTsconfig, addOrRemoveBracesToArrowFunction: () => ts_refactor_addOrRemoveBracesToArrowFunction_exports, + containsJsx: () => containsJsx, convertArrowFunctionOrFunctionExpression: () => ts_refactor_convertArrowFunctionOrFunctionExpression_exports, convertParamsToDestructuredObject: () => ts_refactor_convertParamsToDestructuredObject_exports, convertStringOrTemplateLiteral: () => ts_refactor_convertStringOrTemplateLiteral_exports, @@ -144804,17 +144861,19 @@ ${newComment.split("\n").map((c) => ` * ${c}`).join("\n")} Debug.assert(isJsxOpeningElement(tag) || isJsxClosingElement(tag), "tag should be opening or closing element"); const openTag = tag.parent.openingElement; const closeTag = tag.parent.closingElement; - const openTagStart = openTag.tagName.getStart(sourceFile); - const openTagEnd = openTag.tagName.end; - const closeTagStart = closeTag.tagName.getStart(sourceFile); - const closeTagEnd = closeTag.tagName.end; - if (!(openTagStart <= position && position <= openTagEnd || closeTagStart <= position && position <= closeTagEnd)) + const openTagNameStart = openTag.tagName.getStart(sourceFile); + const openTagNameEnd = openTag.tagName.end; + const closeTagNameStart = closeTag.tagName.getStart(sourceFile); + const closeTagNameEnd = closeTag.tagName.end; + if (openTagNameStart === openTag.getStart(sourceFile) || closeTagNameStart === closeTag.getStart(sourceFile) || openTagNameEnd === openTag.getEnd() || closeTagNameEnd === closeTag.getEnd()) + return void 0; + if (!(openTagNameStart <= position && position <= openTagNameEnd || closeTagNameStart <= position && position <= closeTagNameEnd)) return void 0; const openingTagText = openTag.tagName.getText(sourceFile); if (openingTagText !== closeTag.tagName.getText(sourceFile)) return void 0; return { - ranges: [{ start: openTagStart, length: openTagEnd - openTagStart }, { start: closeTagStart, length: closeTagEnd - closeTagStart }], + ranges: [{ start: openTagNameStart, length: openTagNameEnd - openTagNameStart }, { start: closeTagNameStart, length: closeTagNameEnd - closeTagNameStart }], wordPattern: jsxTagWordPattern }; } @@ -145127,9 +145186,14 @@ ${newComment.split("\n").map((c) => ` * ${c}`).join("\n")} const sourceFile = getValidSourceFile(fileName); const allFiles = Debug.checkDefined(program.getSourceFiles()); const extension = extensionFromPath(fileName); - const files = mapDefined(allFiles, (file) => !(program == null ? void 0 : program.isSourceFileFromExternalLibrary(sourceFile)) && !(sourceFile === getValidSourceFile(file.fileName) || extension === ".ts" /* Ts */ && extensionFromPath(file.fileName) === ".d.ts" /* Dts */ || extension === ".d.ts" /* Dts */ && startsWith(getBaseFileName(file.fileName), "lib.") && extensionFromPath(file.fileName) === ".d.ts" /* Dts */) && extension === extensionFromPath(file.fileName) ? file.fileName : void 0); - const newFileName = createNewFileName(sourceFile, program, getRefactorContext(sourceFile, positionOrRange, preferences, emptyOptions), host); - return { newFileName, files }; + const toMove = getStatementsToMove(getRefactorContext(sourceFile, positionOrRange, preferences, emptyOptions)); + const toMoveContainsJsx = containsJsx(toMove == null ? void 0 : toMove.all); + const files = mapDefined(allFiles, (file) => { + const fileNameExtension = extensionFromPath(file.fileName); + const isValidSourceFile = !(program == null ? void 0 : program.isSourceFileFromExternalLibrary(sourceFile)) && !(sourceFile === getValidSourceFile(file.fileName) || extension === ".ts" /* Ts */ && fileNameExtension === ".d.ts" /* Dts */ || extension === ".d.ts" /* Dts */ && startsWith(getBaseFileName(file.fileName), "lib.") && fileNameExtension === ".d.ts" /* Dts */); + return isValidSourceFile && (extension === fileNameExtension || (extension === ".tsx" /* Tsx */ && fileNameExtension === ".ts" /* Ts */ || extension === ".jsx" /* Jsx */ && fileNameExtension === ".js" /* Js */) && !toMoveContainsJsx) ? file.fileName : void 0; + }); + return { newFileName: createNewFileName(sourceFile, program, host, toMove), files }; } function getEditsForRefactor2(fileName, formatOptions, positionOrRange, refactorName14, actionName2, preferences = emptyOptions, interactiveRefactorArguments) { synchronizeHostData(); @@ -149825,7 +149889,8 @@ ${newComment.split("\n").map((c) => ` * ${c}`).join("\n")} init_ts_codefix(); errorCodes14 = [ Diagnostics.This_import_is_never_used_as_a_value_and_must_use_import_type_because_importsNotUsedAsValues_is_set_to_error.code, - Diagnostics._0_is_a_type_and_must_be_imported_using_a_type_only_import_when_verbatimModuleSyntax_is_enabled.code + Diagnostics._0_is_a_type_and_must_be_imported_using_a_type_only_import_when_verbatimModuleSyntax_is_enabled.code, + Diagnostics._0_resolves_to_a_type_only_declaration_and_must_be_imported_using_a_type_only_import_when_verbatimModuleSyntax_is_enabled.code ]; fixId13 = "convertToTypeOnlyImport"; registerCodeFix({ @@ -150850,7 +150915,7 @@ ${newComment.split("\n").map((c) => ` * ${c}`).join("\n")} } function isFixPossiblyReExportingImportingFile(fix, importingFile, compilerOptions, toPath3) { var _a; - if (fix.isReExport && ((_a = fix.exportInfo) == null ? void 0 : _a.moduleFileName) && getEmitModuleResolutionKind(compilerOptions) === 2 /* Node10 */ && isIndexFileName(fix.exportInfo.moduleFileName)) { + if (fix.isReExport && ((_a = fix.exportInfo) == null ? void 0 : _a.moduleFileName) && isIndexFileName(fix.exportInfo.moduleFileName)) { const reExportDir = toPath3(getDirectoryPath(fix.exportInfo.moduleFileName)); return startsWith(importingFile.path, reExportDir); } @@ -151573,7 +151638,7 @@ ${newComment.split("\n").map((c) => ` * ${c}`).join("\n")} } } function tryGetConstraintFromDiagnosticMessage(messageText) { - const [_, constraint] = flattenDiagnosticMessageText(messageText, "\n", 0).match(/`extends (.*)`/) || []; + const [, constraint] = flattenDiagnosticMessageText(messageText, "\n", 0).match(/`extends (.*)`/) || []; return constraint; } function tryGetConstraintType(checker, node) { @@ -152555,7 +152620,22 @@ ${newComment.split("\n").map((c) => ` * ${c}`).join("\n")} )); if (!length(properties)) return void 0; - return { kind: 3 /* ObjectLiteral */, token: param.name, properties, parentDeclaration: parent2 }; + return { kind: 3 /* ObjectLiteral */, token: param.name, identifier: param.name.text, properties, parentDeclaration: parent2 }; + } + if (token.kind === 19 /* OpenBraceToken */ && isObjectLiteralExpression(parent2)) { + const targetType = checker.getContextualType(parent2) || checker.getTypeAtLocation(parent2); + const properties = arrayFrom(checker.getUnmatchedProperties( + checker.getTypeAtLocation(parent2), + targetType, + /*requireOptionalProperties*/ + false, + /*matchDiscriminantProperties*/ + false + )); + if (!length(properties)) + return void 0; + const identifier = ""; + return { kind: 3 /* ObjectLiteral */, token: parent2, identifier, properties, parentDeclaration: parent2 }; } if (!isMemberName(token)) return void 0; @@ -152571,7 +152651,7 @@ ${newComment.split("\n").map((c) => ` * ${c}`).join("\n")} )); if (!length(properties)) return void 0; - return { kind: 3 /* ObjectLiteral */, token, properties, parentDeclaration: parent2.initializer }; + return { kind: 3 /* ObjectLiteral */, token, identifier: token.text, properties, parentDeclaration: parent2.initializer }; } if (isIdentifier(token) && isJsxOpeningLikeElement(token.parent)) { const target = getEmitScriptTarget(program.getCompilerOptions()); @@ -153118,7 +153198,7 @@ ${newComment.split("\n").map((c) => ` * ${c}`).join("\n")} return createCombinedCodeActions(ts_textChanges_exports.ChangeTracker.with(context, (changes) => { eachDiagnostic(context, errorCodes27, (diag2) => { const info = getInfo10(diag2.file, diag2.start, diag2.code, checker, context.program); - if (!info || !addToSeen(seen, getNodeId(info.parentDeclaration) + "#" + info.token.text)) { + if (!info || !addToSeen(seen, getNodeId(info.parentDeclaration) + "#" + (info.kind === 3 /* ObjectLiteral */ ? info.identifier : info.token.text))) { return; } if (fixId52 === fixMissingFunctionDeclaration && (info.kind === 2 /* Function */ || info.kind === 5 /* Signature */)) { @@ -153713,7 +153793,7 @@ ${newComment.split("\n").map((c) => ` * ${c}`).join("\n")} ); } function getSuggestion(messageText) { - const [_, suggestion] = flattenDiagnosticMessageText(messageText, "\n", 0).match(/'(.*)'/) || []; + const [, suggestion] = flattenDiagnosticMessageText(messageText, "\n", 0).match(/'(.*)'/) || []; return suggestion; } var fixId28, errorCodes35; @@ -161410,7 +161490,7 @@ ${newComment.split("\n").map((c) => ` * ${c}`).join("\n")} } } function isFunctionLikeBodyKeyword(kind) { - return kind === 134 /* AsyncKeyword */ || kind === 135 /* AwaitKeyword */ || kind === 130 /* AsKeyword */ || kind === 152 /* SatisfiesKeyword */ || kind === 156 /* TypeKeyword */ || !isContextualKeyword(kind) && !isClassMemberCompletionKeyword(kind); + return kind === 134 /* AsyncKeyword */ || kind === 135 /* AwaitKeyword */ || kind === 160 /* UsingKeyword */ || kind === 130 /* AsKeyword */ || kind === 152 /* SatisfiesKeyword */ || kind === 156 /* TypeKeyword */ || !isContextualKeyword(kind) && !isClassMemberCompletionKeyword(kind); } function keywordForNode(node) { return isIdentifier(node) ? identifierToKeywordKind(node) ?? 0 /* Unknown */ : node.kind; @@ -162258,15 +162338,18 @@ ${newComment.split("\n").map((c) => ` * ${c}`).join("\n")} const basePath = compilerOptions.project || host.getCurrentDirectory(); const ignoreCase = !(host.useCaseSensitiveFileNames && host.useCaseSensitiveFileNames()); const baseDirectories = getBaseDirectoriesFromRootDirs(rootDirs, basePath, scriptDirectory, ignoreCase); - return flatMap(baseDirectories, (baseDirectory) => arrayFrom(getCompletionEntriesForDirectoryFragment( - fragment, - baseDirectory, - extensionOptions, - host, - /*moduleSpecifierIsRelative*/ - true, - exclude - ).values())); + return deduplicate( + flatMap(baseDirectories, (baseDirectory) => arrayFrom(getCompletionEntriesForDirectoryFragment( + fragment, + baseDirectory, + extensionOptions, + host, + /*moduleSpecifierIsRelative*/ + true, + exclude + ).values())), + (itemA, itemB) => itemA.name === itemB.name && itemA.kind === itemB.kind && itemA.extension === itemB.extension + ); } function getCompletionEntriesForDirectoryFragment(fragment, scriptDirectory, extensionOptions, host, moduleSpecifierIsRelative, exclude, result = createNameAndKindSet()) { var _a; @@ -162318,7 +162401,13 @@ ${newComment.split("\n").map((c) => ` * ${c}`).join("\n")} if (exclude && comparePaths(filePath, exclude, scriptDirectory, ignoreCase) === 0 /* EqualTo */) { continue; } - const { name, extension } = getFilenameWithExtensionOption(getBaseFileName(filePath), host.getCompilationSettings(), extensionOptions); + const { name, extension } = getFilenameWithExtensionOption( + getBaseFileName(filePath), + host.getCompilationSettings(), + extensionOptions, + /*isExportsWildcard*/ + false + ); result.add(nameAndKind(name, "script" /* scriptElement */, extension)); } } @@ -162333,7 +162422,7 @@ ${newComment.split("\n").map((c) => ` * ${c}`).join("\n")} } return result; } - function getFilenameWithExtensionOption(name, compilerOptions, extensionOptions) { + function getFilenameWithExtensionOption(name, compilerOptions, extensionOptions, isExportsWildcard) { const nonJsResult = ts_moduleSpecifiers_exports.tryGetRealFileNameForNonJsDeclarationFileName(name); if (nonJsResult) { return { name: nonJsResult, extension: tryGetExtensionFromPath2(nonJsResult) }; @@ -162341,15 +162430,22 @@ ${newComment.split("\n").map((c) => ` * ${c}`).join("\n")} if (extensionOptions.referenceKind === 0 /* Filename */) { return { name, extension: tryGetExtensionFromPath2(name) }; } - const endingPreference = getModuleSpecifierEndingPreference(extensionOptions.endingPreference, extensionOptions.resolutionMode, compilerOptions, extensionOptions.importingSourceFile); - if (endingPreference === 3 /* TsExtension */) { + let allowedEndings = getModuleSpecifierPreferences( + { importModuleSpecifierEnding: extensionOptions.endingPreference }, + compilerOptions, + extensionOptions.importingSourceFile + ).getAllowedEndingsInPreferredOrder(extensionOptions.resolutionMode); + if (isExportsWildcard) { + allowedEndings = allowedEndings.filter((e) => e !== 0 /* Minimal */ && e !== 1 /* Index */); + } + if (allowedEndings[0] === 3 /* TsExtension */) { if (fileExtensionIsOneOf(name, supportedTSImplementationExtensions)) { return { name, extension: tryGetExtensionFromPath2(name) }; } const outputExtension2 = ts_moduleSpecifiers_exports.tryGetJSExtensionForFile(name, compilerOptions); return outputExtension2 ? { name: changeExtension(name, outputExtension2), extension: outputExtension2 } : { name, extension: tryGetExtensionFromPath2(name) }; } - if ((endingPreference === 0 /* Minimal */ || endingPreference === 1 /* Index */) && fileExtensionIsOneOf(name, [".js" /* Js */, ".jsx" /* Jsx */, ".ts" /* Ts */, ".tsx" /* Tsx */, ".d.ts" /* Dts */])) { + if (!isExportsWildcard && (allowedEndings[0] === 0 /* Minimal */ || allowedEndings[0] === 1 /* Index */) && fileExtensionIsOneOf(name, [".js" /* Js */, ".jsx" /* Jsx */, ".ts" /* Ts */, ".tsx" /* Tsx */, ".d.ts" /* Dts */])) { return { name: removeFileExtension(name), extension: tryGetExtensionFromPath2(name) }; } const outputExtension = ts_moduleSpecifiers_exports.tryGetJSExtensionForFile(name, compilerOptions); @@ -162364,9 +162460,20 @@ ${newComment.split("\n").map((c) => ` * ${c}`).join("\n")} const lengthB = typeof patternB === "object" ? patternB.prefix.length : b.length; return compareValues(lengthB, lengthA); }; - return addCompletionEntriesFromPathsOrExports(result, fragment, baseDirectory, extensionOptions, host, getOwnKeys(paths), getPatternsForKey, comparePaths2); + return addCompletionEntriesFromPathsOrExports( + result, + /*isExports*/ + false, + fragment, + baseDirectory, + extensionOptions, + host, + getOwnKeys(paths), + getPatternsForKey, + comparePaths2 + ); } - function addCompletionEntriesFromPathsOrExports(result, fragment, baseDirectory, extensionOptions, host, keys, getPatternsForKey, comparePaths2) { + function addCompletionEntriesFromPathsOrExports(result, isExports, fragment, baseDirectory, extensionOptions, host, keys, getPatternsForKey, comparePaths2) { let pathResults = []; let matchedPath; for (const key of keys) { @@ -162387,7 +162494,7 @@ ${newComment.split("\n").map((c) => ` * ${c}`).join("\n")} if (typeof pathPattern === "string" || matchedPath === void 0 || comparePaths2(key, matchedPath) !== 1 /* GreaterThan */) { pathResults.push({ matchedPattern: isMatch, - results: getCompletionsForPathMapping(keyWithoutLeadingDotSlash, patterns, fragment, baseDirectory, extensionOptions, host).map(({ name, kind, extension }) => nameAndKind(name, kind, extension)) + results: getCompletionsForPathMapping(keyWithoutLeadingDotSlash, patterns, fragment, baseDirectory, extensionOptions, isExports && isMatch, host).map(({ name, kind, extension }) => nameAndKind(name, kind, extension)) }); } } @@ -162490,6 +162597,8 @@ ${newComment.split("\n").map((c) => ` * ${c}`).join("\n")} const conditions = getConditions(compilerOptions, mode); addCompletionEntriesFromPathsOrExports( result, + /*isExports*/ + true, fragmentSubpath, packageDirectory, extensionOptions, @@ -162525,7 +162634,7 @@ ${newComment.split("\n").map((c) => ` * ${c}`).join("\n")} function getFragmentDirectory(fragment) { return containsSlash(fragment) ? hasTrailingDirectorySeparator(fragment) ? fragment : getDirectoryPath(fragment) : void 0; } - function getCompletionsForPathMapping(path, patterns, fragment, packageDirectory, extensionOptions, host) { + function getCompletionsForPathMapping(path, patterns, fragment, packageDirectory, extensionOptions, isExportsWildcard, host) { if (!endsWith(path, "*")) { return !path.includes("*") ? justPathMappingName(path, "script" /* scriptElement */) : emptyArray; } @@ -162535,15 +162644,15 @@ ${newComment.split("\n").map((c) => ` * ${c}`).join("\n")} const starIsFullPathComponent = path[path.length - 2] === "/"; return starIsFullPathComponent ? justPathMappingName(pathPrefix, "directory" /* directory */) : flatMap(patterns, (pattern) => { var _a; - return (_a = getModulesForPathsPattern("", packageDirectory, pattern, extensionOptions, host)) == null ? void 0 : _a.map(({ name, ...rest }) => ({ name: pathPrefix + name, ...rest })); + return (_a = getModulesForPathsPattern("", packageDirectory, pattern, extensionOptions, isExportsWildcard, host)) == null ? void 0 : _a.map(({ name, ...rest }) => ({ name: pathPrefix + name, ...rest })); }); } - return flatMap(patterns, (pattern) => getModulesForPathsPattern(remainingFragment, packageDirectory, pattern, extensionOptions, host)); + return flatMap(patterns, (pattern) => getModulesForPathsPattern(remainingFragment, packageDirectory, pattern, extensionOptions, isExportsWildcard, host)); function justPathMappingName(name, kind) { return startsWith(name, fragment) ? [{ name: removeTrailingDirectorySeparator(name), kind, extension: void 0 }] : emptyArray; } } - function getModulesForPathsPattern(fragment, packageDirectory, pattern, extensionOptions, host) { + function getModulesForPathsPattern(fragment, packageDirectory, pattern, extensionOptions, isExportsWildcard, host) { if (!host.readDirectory) { return void 0; } @@ -162576,7 +162685,7 @@ ${newComment.split("\n").map((c) => ` * ${c}`).join("\n")} if (containsSlash(trimmedWithPattern)) { return directoryResult(getPathComponents(removeLeadingDirectorySeparator(trimmedWithPattern))[1]); } - const { name, extension } = getFilenameWithExtensionOption(trimmedWithPattern, host.getCompilationSettings(), extensionOptions); + const { name, extension } = getFilenameWithExtensionOption(trimmedWithPattern, host.getCompilationSettings(), extensionOptions, isExportsWildcard); return nameAndKind(name, "script" /* scriptElement */, extension); } }); @@ -162720,6 +162829,7 @@ ${newComment.split("\n").map((c) => ` * ${c}`).join("\n")} var init_stringCompletions = __esm({ "src/services/stringCompletions.ts"() { "use strict"; + init_moduleSpecifiers(); init_ts4(); init_ts_Completions(); kindPrecedence = { @@ -167213,84 +167323,98 @@ ${newComment.split("\n").map((c) => ` * ${c}`).join("\n")} if (importGroup.length === 0) { return importGroup; } - const { importWithoutClause, typeOnlyImports, regularImports } = getCategorizedImports(importGroup); + const importGroupsByAttributes = groupBy(importGroup, (decl) => { + if (decl.attributes) { + let attrs = decl.attributes.token + " "; + for (const x of sort(decl.attributes.elements, (x2, y) => compareStringsCaseSensitive(x2.name.text, y.name.text))) { + attrs += x.name.text + ":"; + attrs += isStringLiteralLike(x.value) ? `"${x.value.text}"` : x.value.getText() + " "; + } + return attrs; + } + return ""; + }); const coalescedImports = []; - if (importWithoutClause) { - coalescedImports.push(importWithoutClause); - } - for (const group2 of [regularImports, typeOnlyImports]) { - const isTypeOnly = group2 === typeOnlyImports; - const { defaultImports, namespaceImports, namedImports } = group2; - if (!isTypeOnly && defaultImports.length === 1 && namespaceImports.length === 1 && namedImports.length === 0) { - const defaultImport = defaultImports[0]; - coalescedImports.push( - updateImportDeclarationAndClause(defaultImport, defaultImport.importClause.name, namespaceImports[0].importClause.namedBindings) - ); - continue; + for (const attribute in importGroupsByAttributes) { + const importGroupSameAttrs = importGroupsByAttributes[attribute]; + const { importWithoutClause, typeOnlyImports, regularImports } = getCategorizedImports(importGroupSameAttrs); + if (importWithoutClause) { + coalescedImports.push(importWithoutClause); } - const sortedNamespaceImports = stableSort(namespaceImports, (i1, i2) => comparer(i1.importClause.namedBindings.name.text, i2.importClause.namedBindings.name.text)); - for (const namespaceImport of sortedNamespaceImports) { - coalescedImports.push( - updateImportDeclarationAndClause( - namespaceImport, - /*name*/ - void 0, - namespaceImport.importClause.namedBindings - ) - ); - } - const firstDefaultImport = firstOrUndefined(defaultImports); - const firstNamedImport = firstOrUndefined(namedImports); - const importDecl = firstDefaultImport ?? firstNamedImport; - if (!importDecl) { - continue; - } - let newDefaultImport; - const newImportSpecifiers = []; - if (defaultImports.length === 1) { - newDefaultImport = defaultImports[0].importClause.name; - } else { - for (const defaultImport of defaultImports) { - newImportSpecifiers.push( - factory.createImportSpecifier( - /*isTypeOnly*/ - false, - factory.createIdentifier("default"), - defaultImport.importClause.name + for (const group2 of [regularImports, typeOnlyImports]) { + const isTypeOnly = group2 === typeOnlyImports; + const { defaultImports, namespaceImports, namedImports } = group2; + if (!isTypeOnly && defaultImports.length === 1 && namespaceImports.length === 1 && namedImports.length === 0) { + const defaultImport = defaultImports[0]; + coalescedImports.push( + updateImportDeclarationAndClause(defaultImport, defaultImport.importClause.name, namespaceImports[0].importClause.namedBindings) + ); + continue; + } + const sortedNamespaceImports = stableSort(namespaceImports, (i1, i2) => comparer(i1.importClause.namedBindings.name.text, i2.importClause.namedBindings.name.text)); + for (const namespaceImport of sortedNamespaceImports) { + coalescedImports.push( + updateImportDeclarationAndClause( + namespaceImport, + /*name*/ + void 0, + namespaceImport.importClause.namedBindings ) ); } - } - newImportSpecifiers.push(...getNewImportSpecifiers(namedImports)); - const sortedImportSpecifiers = factory.createNodeArray( - sortSpecifiers(newImportSpecifiers, comparer, preferences), - firstNamedImport == null ? void 0 : firstNamedImport.importClause.namedBindings.elements.hasTrailingComma - ); - const newNamedImports = sortedImportSpecifiers.length === 0 ? newDefaultImport ? void 0 : factory.createNamedImports(emptyArray) : firstNamedImport ? factory.updateNamedImports(firstNamedImport.importClause.namedBindings, sortedImportSpecifiers) : factory.createNamedImports(sortedImportSpecifiers); - if (sourceFile && newNamedImports && (firstNamedImport == null ? void 0 : firstNamedImport.importClause.namedBindings) && !rangeIsOnSingleLine(firstNamedImport.importClause.namedBindings, sourceFile)) { - setEmitFlags(newNamedImports, 2 /* MultiLine */); - } - if (isTypeOnly && newDefaultImport && newNamedImports) { - coalescedImports.push( - updateImportDeclarationAndClause( - importDecl, - newDefaultImport, - /*namedBindings*/ - void 0 - ) - ); - coalescedImports.push( - updateImportDeclarationAndClause( - firstNamedImport ?? importDecl, - /*name*/ - void 0, - newNamedImports - ) - ); - } else { - coalescedImports.push( - updateImportDeclarationAndClause(importDecl, newDefaultImport, newNamedImports) + const firstDefaultImport = firstOrUndefined(defaultImports); + const firstNamedImport = firstOrUndefined(namedImports); + const importDecl = firstDefaultImport ?? firstNamedImport; + if (!importDecl) { + continue; + } + let newDefaultImport; + const newImportSpecifiers = []; + if (defaultImports.length === 1) { + newDefaultImport = defaultImports[0].importClause.name; + } else { + for (const defaultImport of defaultImports) { + newImportSpecifiers.push( + factory.createImportSpecifier( + /*isTypeOnly*/ + false, + factory.createIdentifier("default"), + defaultImport.importClause.name + ) + ); + } + } + newImportSpecifiers.push(...getNewImportSpecifiers(namedImports)); + const sortedImportSpecifiers = factory.createNodeArray( + sortSpecifiers(newImportSpecifiers, comparer, preferences), + firstNamedImport == null ? void 0 : firstNamedImport.importClause.namedBindings.elements.hasTrailingComma ); + const newNamedImports = sortedImportSpecifiers.length === 0 ? newDefaultImport ? void 0 : factory.createNamedImports(emptyArray) : firstNamedImport ? factory.updateNamedImports(firstNamedImport.importClause.namedBindings, sortedImportSpecifiers) : factory.createNamedImports(sortedImportSpecifiers); + if (sourceFile && newNamedImports && (firstNamedImport == null ? void 0 : firstNamedImport.importClause.namedBindings) && !rangeIsOnSingleLine(firstNamedImport.importClause.namedBindings, sourceFile)) { + setEmitFlags(newNamedImports, 2 /* MultiLine */); + } + if (isTypeOnly && newDefaultImport && newNamedImports) { + coalescedImports.push( + updateImportDeclarationAndClause( + importDecl, + newDefaultImport, + /*namedBindings*/ + void 0 + ) + ); + coalescedImports.push( + updateImportDeclarationAndClause( + firstNamedImport ?? importDecl, + /*name*/ + void 0, + newNamedImports + ) + ); + } else { + coalescedImports.push( + updateImportDeclarationAndClause(importDecl, newDefaultImport, newNamedImports) + ); + } } } return coalescedImports; @@ -175336,7 +175460,7 @@ ${options.prefix}` : "\n" : options.prefix } break; default: - if (unorderedRemoveItem(this.containingProjects, project)) { + if (orderedRemoveItem(this.containingProjects, project)) { project.onFileAddedOrRemoved(this.isSymlink()); } break; @@ -175743,6 +175867,7 @@ ${options.prefix}` : "\n" : options.prefix /** * Current project's program version. (incremented everytime new program is created that is not complete reuse from the old one) * This property is changed in 'updateGraph' based on the set of files in program + * @internal */ this.projectProgramVersion = 0; /** @@ -175750,6 +175875,7 @@ ${options.prefix}` : "\n" : options.prefix * - new root file was added/removed * - edit happen in some file that is currently included in the project. * This property is different from projectStructureVersion since in most cases edits don't affect set of files in the project + * @internal */ this.projectStateVersion = 0; this.isInitialLoadPending = returnFalse; @@ -176787,7 +176913,7 @@ ${options.prefix}` : "\n" : options.prefix ); const elapsed = timestamp() - start; this.sendPerformanceEvent("UpdateGraph", elapsed); - this.writeLog(`Finishing updateGraphWorker: Project: ${this.getProjectName()} Version: ${this.getProjectVersion()} structureChanged: ${hasNewProgram}${this.program ? ` structureIsReused:: ${StructureIsReused[this.program.structureIsReused]}` : ""} Elapsed: ${elapsed}ms`); + this.writeLog(`Finishing updateGraphWorker: Project: ${this.getProjectName()} projectStateVersion: ${this.projectStateVersion} projectProgramVersion: ${this.projectProgramVersion} structureChanged: ${hasNewProgram}${this.program ? ` structureIsReused:: ${StructureIsReused[this.program.structureIsReused]}` : ""} Elapsed: ${elapsed}ms`); if (this.projectService.logger.isTestLogger) { if (this.program !== oldProgram) { this.print( @@ -176950,6 +177076,7 @@ ${options.prefix}` : "\n" : options.prefix } /** @internal */ print(writeProjectFileNames, writeFileExplaination, writeFileVersionAndText) { + var _a; this.writeLog(`Project '${this.projectName}' (${ProjectKind[this.projectKind]})`); this.writeLog(this.filesToStringWorker( writeProjectFileNames && this.projectService.logger.hasLevel(3 /* verbose */), @@ -176967,6 +177094,14 @@ ${options.prefix}` : "\n" : options.prefix false ); } + (_a = this.noDtsResolutionProject) == null ? void 0 : _a.print( + /*writeProjectFileNames*/ + false, + /*writeFileExplaination*/ + false, + /*writeFileVersionAndText*/ + false + ); } setCompilerOptions(compilerOptions) { var _a; @@ -178006,7 +178141,7 @@ ${options.prefix}` : "\n" : options.prefix } } function convertUserPreferences(preferences) { - const { lazyConfiguredProjectsFromExternalProject, ...userPreferences } = preferences; + const { lazyConfiguredProjectsFromExternalProject: _, ...userPreferences } = preferences; return userPreferences; } function findProjectByName(projectName, projects) { @@ -178406,6 +178541,8 @@ ${options.prefix}` : "\n" : options.prefix /** @internal */ this.extendedConfigCache = /* @__PURE__ */ new Map(); /** @internal */ + this.baseline = noop; + /** @internal */ this.verifyDocumentRegistry = noop; /** @internal */ this.verifyProgram = noop; @@ -179032,7 +179169,7 @@ ${options.prefix}` : "\n" : options.prefix ); project.addRoot(info); if (info.containingProjects[0] !== project) { - info.detachFromProject(project); + orderedRemoveItem(info.containingProjects, project); info.containingProjects.unshift(project); } project.updateGraph(); @@ -179327,8 +179464,7 @@ ${options.prefix}` : "\n" : options.prefix * otherwise just file name */ getConfigFileNameForFile(info) { - if (isOpenScriptInfo(info)) { - Debug.assert(info.isScriptOpen()); + if (!isAncestorConfigFileInfo(info)) { const result = this.configFileForOpenFiles.get(info.path); if (result !== void 0) return result || void 0; @@ -180323,11 +180459,13 @@ Dynamic files must always be opened with service's current directory or service } = this.hostConfiguration.preferences; this.hostConfiguration.preferences = { ...this.hostConfiguration.preferences, ...args.preferences }; if (lazyConfiguredProjectsFromExternalProject && !this.hostConfiguration.preferences.lazyConfiguredProjectsFromExternalProject) { - this.configuredProjects.forEach((project) => { - if (project.hasExternalProjectRef() && project.pendingUpdateLevel === 2 /* Full */ && !this.pendingProjectUpdates.has(project.getProjectName())) { - project.updateGraph(); - } - }); + this.externalProjectToConfiguredProjectMap.forEach( + (projects) => projects.forEach((project) => { + if (!project.isClosed() && project.hasExternalProjectRef() && project.pendingUpdateLevel === 2 /* Full */ && !this.pendingProjectUpdates.has(project.getProjectName())) { + project.updateGraph(); + } + }) + ); } if (includePackageJsonAutoImports !== args.preferences.includePackageJsonAutoImports) { this.forEachProject((project) => { @@ -180395,6 +180533,8 @@ Dynamic files must always be opened with service's current directory or service }); this.inferredProjects.forEach((project) => this.clearSemanticCache(project)); this.ensureProjectForOpenFiles(); + this.logger.info("After reloading projects.."); + this.printProjects(); } /** * This function goes through all the openFiles and tries to file the config file for them. @@ -180910,23 +181050,20 @@ Dynamic files must always be opened with service's current directory or service scriptInfo.editContent(change.span.start, change.span.start + change.span.length, change.newText); } } - closeConfiguredProjectReferencedFromExternalProject(configFile) { - const configuredProject = this.findConfiguredProjectByProjectName(configFile); - if (configuredProject) { - configuredProject.deleteExternalProjectReference(); - if (!configuredProject.hasOpenRef()) { - this.removeProject(configuredProject); - return; + closeConfiguredProjectReferencedFromExternalProject(configuredProjects) { + configuredProjects == null ? void 0 : configuredProjects.forEach((configuredProject) => { + if (!configuredProject.isClosed()) { + configuredProject.deleteExternalProjectReference(); + if (!configuredProject.hasOpenRef()) + this.removeProject(configuredProject); } - } + }); } - closeExternalProject(uncheckedFileName) { + closeExternalProject(uncheckedFileName, print) { const fileName = toNormalizedPath(uncheckedFileName); - const configFiles = this.externalProjectToConfiguredProjectMap.get(fileName); - if (configFiles) { - for (const configFile of configFiles) { - this.closeConfiguredProjectReferencedFromExternalProject(configFile); - } + const configuredProjects = this.externalProjectToConfiguredProjectMap.get(fileName); + if (configuredProjects) { + this.closeConfiguredProjectReferencedFromExternalProject(configuredProjects); this.externalProjectToConfiguredProjectMap.delete(fileName); } else { const externalProject = this.findExternalProjectByProjectName(uncheckedFileName); @@ -180934,6 +181071,8 @@ Dynamic files must always be opened with service's current directory or service this.removeProject(externalProject); } } + if (print) + this.printProjects(); } openExternalProjects(projects) { const projectsToClose = arrayToMap(this.externalProjects, (p) => p.getProjectName(), (_) => true); @@ -180941,12 +181080,21 @@ Dynamic files must always be opened with service's current directory or service projectsToClose.set(externalProjectName, true); }); for (const externalProject of projects) { - this.openExternalProject(externalProject); + this.openExternalProject( + externalProject, + /*print*/ + false + ); projectsToClose.delete(externalProject.projectFileName); } forEachKey(projectsToClose, (externalProjectName) => { - this.closeExternalProject(externalProjectName); + this.closeExternalProject( + externalProjectName, + /*print*/ + false + ); }); + this.printProjects(); } static escapeFilenameForRegex(filename) { return filename.replace(this.filenameEscapeRegexp, "\\$&"); @@ -180955,16 +181103,18 @@ Dynamic files must always be opened with service's current directory or service this.safelist = defaultTypeSafeList; } applySafeList(proj) { - const { rootFiles } = proj; const typeAcquisition = proj.typeAcquisition; Debug.assert(!!typeAcquisition, "proj.typeAcquisition should be set by now"); + const result = this.applySafeListWorker(proj, proj.rootFiles, typeAcquisition); + return (result == null ? void 0 : result.excludedFiles) ?? []; + } + applySafeListWorker(proj, rootFiles, typeAcquisition) { if (typeAcquisition.enable === false || typeAcquisition.disableFilenameBasedTypeAcquisition) { - return []; + return void 0; } const typeAcqInclude = typeAcquisition.include || (typeAcquisition.include = []); const excludeRules = []; const normalizedNames = rootFiles.map((f) => normalizeSlashes(f.fileName)); - const excludedFiles = []; for (const name of Object.keys(this.safelist)) { const rule2 = this.safelist[name]; for (const root of normalizedNames) { @@ -181005,12 +181155,12 @@ Dynamic files must always be opened with service's current directory or service } } const excludeRegexes = excludeRules.map((e) => new RegExp(e, "i")); - const filesToKeep = []; - for (let i = 0; i < proj.rootFiles.length; i++) { + let filesToKeep; + let excludedFiles; + for (let i = 0; i < rootFiles.length; i++) { if (excludeRegexes.some((re) => re.test(normalizedNames[i]))) { - excludedFiles.push(normalizedNames[i]); + addExcludedFile(i); } else { - let exclude = false; if (typeAcquisition.enable) { const baseName = getBaseFileName(toFileNameLowerCase(normalizedNames[i])); if (fileExtensionIs(baseName, "js")) { @@ -181019,110 +181169,93 @@ Dynamic files must always be opened with service's current directory or service const typeName = this.legacySafelist.get(cleanedTypingName); if (typeName !== void 0) { this.logger.info(`Excluded '${normalizedNames[i]}' because it matched ${cleanedTypingName} from the legacy safelist`); - excludedFiles.push(normalizedNames[i]); - exclude = true; + addExcludedFile(i); if (!typeAcqInclude.includes(typeName)) { typeAcqInclude.push(typeName); } + continue; } } } - if (!exclude) { - if (/^.+[.-]min\.js$/.test(normalizedNames[i])) { - excludedFiles.push(normalizedNames[i]); - } else { - filesToKeep.push(proj.rootFiles[i]); - } + if (/^.+[.-]min\.js$/.test(normalizedNames[i])) { + addExcludedFile(i); + } else { + filesToKeep == null ? void 0 : filesToKeep.push(rootFiles[i]); } } } - proj.rootFiles = filesToKeep; - return excludedFiles; - } - openExternalProject(proj) { - proj.typeAcquisition = proj.typeAcquisition || {}; - proj.typeAcquisition.include = proj.typeAcquisition.include || []; - proj.typeAcquisition.exclude = proj.typeAcquisition.exclude || []; - if (proj.typeAcquisition.enable === void 0) { - proj.typeAcquisition.enable = hasNoTypeScriptSource(proj.rootFiles.map((f) => f.fileName)); + return excludedFiles ? { + rootFiles: filesToKeep, + excludedFiles + } : void 0; + function addExcludedFile(index) { + if (!excludedFiles) { + Debug.assert(!filesToKeep); + filesToKeep = rootFiles.slice(0, index); + excludedFiles = []; + } + excludedFiles.push(normalizedNames[index]); } - const excludedFiles = this.applySafeList(proj); - let tsConfigFiles; - const rootFiles = []; + } + openExternalProject(proj, print) { + const existingExternalProject = this.findExternalProjectByProjectName(proj.projectFileName); + const existingConfiguredProjects = this.externalProjectToConfiguredProjectMap.get(proj.projectFileName); + let configuredProjects; + let rootFiles = []; for (const file of proj.rootFiles) { const normalized = toNormalizedPath(file.fileName); if (getBaseConfigFileName(normalized)) { if (this.serverMode === 0 /* Semantic */ && this.host.fileExists(normalized)) { - (tsConfigFiles || (tsConfigFiles = [])).push(normalized); + let project = this.findConfiguredProjectByProjectName(normalized); + if (!project) { + project = this.getHostPreferences().lazyConfiguredProjectsFromExternalProject ? this.createConfiguredProjectWithDelayLoad(normalized, `Creating configured project in external project: ${proj.projectFileName}`) : this.createLoadAndUpdateConfiguredProject(normalized, `Creating configured project in external project: ${proj.projectFileName}`); + } + if (!(existingConfiguredProjects == null ? void 0 : existingConfiguredProjects.has(project))) { + project.addExternalProjectReference(); + } + (configuredProjects ?? (configuredProjects = /* @__PURE__ */ new Set())).add(project); + existingConfiguredProjects == null ? void 0 : existingConfiguredProjects.delete(project); } } else { rootFiles.push(file); } } - if (tsConfigFiles) { - tsConfigFiles.sort(); - } - const externalProject = this.findExternalProjectByProjectName(proj.projectFileName); - let exisingConfigFiles; - if (externalProject) { - externalProject.excludedFiles = excludedFiles; - if (!tsConfigFiles) { - const compilerOptions = convertCompilerOptions(proj.options); - const watchOptionsAndErrors = convertWatchOptions(proj.options, externalProject.getCurrentDirectory()); - const lastFileExceededProgramSize = this.getFilenameForExceededTotalSizeLimitForNonTsFiles(proj.projectFileName, compilerOptions, proj.rootFiles, externalFilePropertyReader); - if (lastFileExceededProgramSize) { - externalProject.disableLanguageService(lastFileExceededProgramSize); - } else { - externalProject.enableLanguageService(); - } - externalProject.setProjectErrors(watchOptionsAndErrors == null ? void 0 : watchOptionsAndErrors.errors); - this.updateRootAndOptionsOfNonInferredProject(externalProject, proj.rootFiles, externalFilePropertyReader, compilerOptions, proj.typeAcquisition, proj.options.compileOnSave, watchOptionsAndErrors == null ? void 0 : watchOptionsAndErrors.watchOptions); - externalProject.updateGraph(); - return; - } - this.closeExternalProject(proj.projectFileName); - } else if (this.externalProjectToConfiguredProjectMap.get(proj.projectFileName)) { - if (!tsConfigFiles) { - this.closeExternalProject(proj.projectFileName); - } else { - const oldConfigFiles = this.externalProjectToConfiguredProjectMap.get(proj.projectFileName); - let iNew = 0; - let iOld = 0; - while (iNew < tsConfigFiles.length && iOld < oldConfigFiles.length) { - const newConfig = tsConfigFiles[iNew]; - const oldConfig = oldConfigFiles[iOld]; - if (oldConfig < newConfig) { - this.closeConfiguredProjectReferencedFromExternalProject(oldConfig); - iOld++; - } else if (oldConfig > newConfig) { - iNew++; - } else { - (exisingConfigFiles || (exisingConfigFiles = [])).push(oldConfig); - iOld++; - iNew++; - } - } - for (let i = iOld; i < oldConfigFiles.length; i++) { - this.closeConfiguredProjectReferencedFromExternalProject(oldConfigFiles[i]); - } - } - } - if (tsConfigFiles) { - this.externalProjectToConfiguredProjectMap.set(proj.projectFileName, tsConfigFiles); - for (const tsconfigFile of tsConfigFiles) { - let project = this.findConfiguredProjectByProjectName(tsconfigFile); - if (!project) { - project = this.getHostPreferences().lazyConfiguredProjectsFromExternalProject ? this.createConfiguredProjectWithDelayLoad(tsconfigFile, `Creating configured project in external project: ${proj.projectFileName}`) : this.createLoadAndUpdateConfiguredProject(tsconfigFile, `Creating configured project in external project: ${proj.projectFileName}`); - } - if (project && !contains(exisingConfigFiles, tsconfigFile)) { - project.addExternalProjectReference(); - } - } + if (configuredProjects) { + this.externalProjectToConfiguredProjectMap.set(proj.projectFileName, configuredProjects); + if (existingExternalProject) + this.removeProject(existingExternalProject); } else { this.externalProjectToConfiguredProjectMap.delete(proj.projectFileName); - const project = this.createExternalProject(proj.projectFileName, rootFiles, proj.options, proj.typeAcquisition, excludedFiles); - project.updateGraph(); + const typeAcquisition = proj.typeAcquisition || {}; + typeAcquisition.include = typeAcquisition.include || []; + typeAcquisition.exclude = typeAcquisition.exclude || []; + if (typeAcquisition.enable === void 0) { + typeAcquisition.enable = hasNoTypeScriptSource(rootFiles.map((f) => f.fileName)); + } + const excludeResult = this.applySafeListWorker(proj, rootFiles, typeAcquisition); + const excludedFiles = (excludeResult == null ? void 0 : excludeResult.excludedFiles) ?? []; + rootFiles = (excludeResult == null ? void 0 : excludeResult.rootFiles) ?? rootFiles; + if (existingExternalProject) { + existingExternalProject.excludedFiles = excludedFiles; + const compilerOptions = convertCompilerOptions(proj.options); + const watchOptionsAndErrors = convertWatchOptions(proj.options, existingExternalProject.getCurrentDirectory()); + const lastFileExceededProgramSize = this.getFilenameForExceededTotalSizeLimitForNonTsFiles(proj.projectFileName, compilerOptions, rootFiles, externalFilePropertyReader); + if (lastFileExceededProgramSize) { + existingExternalProject.disableLanguageService(lastFileExceededProgramSize); + } else { + existingExternalProject.enableLanguageService(); + } + existingExternalProject.setProjectErrors(watchOptionsAndErrors == null ? void 0 : watchOptionsAndErrors.errors); + this.updateRootAndOptionsOfNonInferredProject(existingExternalProject, rootFiles, externalFilePropertyReader, compilerOptions, typeAcquisition, proj.options.compileOnSave, watchOptionsAndErrors == null ? void 0 : watchOptionsAndErrors.watchOptions); + existingExternalProject.updateGraph(); + } else { + const project = this.createExternalProject(proj.projectFileName, rootFiles, proj.options, typeAcquisition, excludedFiles); + project.updateGraph(); + } } + this.closeConfiguredProjectReferencedFromExternalProject(existingConfiguredProjects); + if (print) + this.printProjects(); } hasDeferredExtension() { for (const extension of this.hostConfiguration.extraFileExtensions) { @@ -182118,7 +182251,11 @@ ${json}${newLine}`; return this.requiredResponse(response); }, ["openExternalProject" /* OpenExternalProject */]: (request) => { - this.projectService.openExternalProject(request.arguments); + this.projectService.openExternalProject( + request.arguments, + /*print*/ + true + ); return this.requiredResponse( /*response*/ true @@ -182132,7 +182269,11 @@ ${json}${newLine}`; ); }, ["closeExternalProject" /* CloseExternalProject */]: (request) => { - this.projectService.closeExternalProject(request.arguments.projectFileName); + this.projectService.closeExternalProject( + request.arguments.projectFileName, + /*print*/ + true + ); return this.requiredResponse( /*response*/ true diff --git a/lib/typingsInstaller.js b/lib/typingsInstaller.js index 691d2a96722..0f4affba980 100644 --- a/lib/typingsInstaller.js +++ b/lib/typingsInstaller.js @@ -6299,7 +6299,6 @@ var Diagnostics = { Disallow_inconsistently_cased_references_to_the_same_file: diag(6078, 3 /* Message */, "Disallow_inconsistently_cased_references_to_the_same_file_6078", "Disallow inconsistently-cased references to the same file."), Specify_library_files_to_be_included_in_the_compilation: diag(6079, 3 /* Message */, "Specify_library_files_to_be_included_in_the_compilation_6079", "Specify library files to be included in the compilation."), Specify_JSX_code_generation: diag(6080, 3 /* Message */, "Specify_JSX_code_generation_6080", "Specify JSX code generation."), - File_0_has_an_unsupported_extension_so_skipping_it: diag(6081, 3 /* Message */, "File_0_has_an_unsupported_extension_so_skipping_it_6081", "File '{0}' has an unsupported extension, so skipping it."), Only_amd_and_system_modules_are_supported_alongside_0: diag(6082, 1 /* Error */, "Only_amd_and_system_modules_are_supported_alongside_0_6082", "Only 'amd' and 'system' modules are supported alongside --{0}."), Base_directory_to_resolve_non_absolute_module_names: diag(6083, 3 /* Message */, "Base_directory_to_resolve_non_absolute_module_names_6083", "Base directory to resolve non-absolute module names."), Deprecated_Use_jsxFactory_instead_Specify_the_object_invoked_for_createElement_when_targeting_react_JSX_emit: diag(6084, 3 /* Message */, "Deprecated_Use_jsxFactory_instead_Specify_the_object_invoked_for_createElement_when_targeting_react__6084", "[Deprecated] Use '--jsxFactory' instead. Specify the object invoked for createElement when targeting 'react' JSX emit"), @@ -24327,7 +24326,7 @@ var Parser; if (!jsDocDiagnostics) { jsDocDiagnostics = []; } - jsDocDiagnostics.push(...parseDiagnostics); + addRange(jsDocDiagnostics, parseDiagnostics, saveParseDiagnosticsLength); } currentToken = saveToken; parseDiagnostics.length = saveParseDiagnosticsLength; @@ -28567,15 +28566,9 @@ function loadNodeModuleFromDirectoryWorker(extensions, candidate, onlyRecordFail } } const loader = (extensions2, candidate2, onlyRecordFailures2, state2) => { - const fromFile = tryFile(candidate2, onlyRecordFailures2, state2); + const fromFile = loadFileNameFromPackageJsonField(extensions2, candidate2, onlyRecordFailures2, state2); if (fromFile) { - const resolved = resolvedIfExtensionMatches(extensions2, fromFile); - if (resolved) { - return noPackageId(resolved); - } - if (state2.traceEnabled) { - trace(state2.host, Diagnostics.File_0_has_an_unsupported_extension_so_skipping_it, fromFile); - } + return noPackageId(fromFile); } const expandedExtensions = extensions2 === 4 /* Declaration */ ? 1 /* TypeScript */ | 4 /* Declaration */ : extensions2; const features = state2.features; @@ -28631,10 +28624,6 @@ function loadNodeModuleFromDirectoryWorker(extensions, candidate, onlyRecordFail return loadModuleFromFile(extensions, indexPath, onlyRecordFailuresForIndex, state); } } -function resolvedIfExtensionMatches(extensions, path2, resolvedUsingTsExtension) { - const ext = tryGetExtensionFromPath2(path2); - return ext !== void 0 && extensionIsOk(extensions, ext) ? { path: path2, ext, resolvedUsingTsExtension } : void 0; -} function extensionIsOk(extensions, extension) { return extensions & 2 /* JavaScript */ && (extension === ".js" /* Js */ || extension === ".jsx" /* Jsx */ || extension === ".mjs" /* Mjs */ || extension === ".cjs" /* Cjs */) || extensions & 1 /* TypeScript */ && (extension === ".ts" /* Ts */ || extension === ".tsx" /* Tsx */ || extension === ".mts" /* Mts */ || extension === ".cts" /* Cts */) || extensions & 4 /* Declaration */ && (extension === ".d.ts" /* Dts */ || extension === ".d.mts" /* Dmts */ || extension === ".d.cts" /* Dcts */) || extensions & 8 /* Json */ && extension === ".json" /* Json */ || false; } diff --git a/lib/zh-cn/diagnosticMessages.generated.json b/lib/zh-cn/diagnosticMessages.generated.json index 2c6ace19f16..b222445278e 100644 --- a/lib/zh-cn/diagnosticMessages.generated.json +++ b/lib/zh-cn/diagnosticMessages.generated.json @@ -1628,7 +1628,7 @@ "Unexpected_token_1012": "意外的标记。", "Unexpected_token_A_constructor_method_accessor_or_property_was_expected_1068": "意外的标记。应为构造函数、方法、访问器或属性。", "Unexpected_token_A_type_parameter_name_was_expected_without_curly_braces_1069": "意外的标记。类型参数名不应包含大括号。", - "Unexpected_token_Did_you_mean_or_gt_1382": "意外的标记。你是想使用 `{'>'}` 还是 `>`?", + "Unexpected_token_Did_you_mean_or_gt_1382": "意外的标记。你是想使用 `{'>'}` 还是 `>`?", "Unexpected_token_Did_you_mean_or_rbrace_1381": "意外的标记。你是想使用 `{'}'}` 还是 `}`?", "Unexpected_token_expected_1179": "意外标记。应为 \"{\"。", "Unknown_build_option_0_5072": "未知的生成选项 \"{0}\"。", diff --git a/lib/zh-tw/diagnosticMessages.generated.json b/lib/zh-tw/diagnosticMessages.generated.json index 5bd88ad57a1..b53887e8cc5 100644 --- a/lib/zh-tw/diagnosticMessages.generated.json +++ b/lib/zh-tw/diagnosticMessages.generated.json @@ -1628,7 +1628,7 @@ "Unexpected_token_1012": "未預期的語彙基元。", "Unexpected_token_A_constructor_method_accessor_or_property_was_expected_1068": "未預期的語彙基元。必須是建構函式、方法、存取子或屬性。", "Unexpected_token_A_type_parameter_name_was_expected_without_curly_braces_1069": "權杖錯誤。類型參數名稱不應有大括號。", - "Unexpected_token_Did_you_mean_or_gt_1382": "未預期的語彙基元。您是指 `{'>'}` 或 `>` 嗎?", + "Unexpected_token_Did_you_mean_or_gt_1382": "未預期的語彙基元。您是指 `{'>'}` 或 `>` 嗎?", "Unexpected_token_Did_you_mean_or_rbrace_1381": "未預期的語彙基元。您是指 `{'}'}` 或 `}` 嗎?", "Unexpected_token_expected_1179": "未預期的語彙基元。必須是 '{'。", "Unknown_build_option_0_5072": "未知的組建選項 '{0}'。",