diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts
index 62241eda9d8e5..617934cbb38be 100644
--- a/src/compiler/checker.ts
+++ b/src/compiler/checker.ts
@@ -6224,6 +6224,7 @@ namespace ts {
factory.createStringLiteral("import")
)
])));
+ context.tracker.reportImportTypeNodeResolutionModeOverride?.();
}
}
if (!specifier) {
@@ -6247,6 +6248,7 @@ namespace ts {
factory.createStringLiteral(swappedMode === ModuleKind.ESNext ? "import" : "require")
)
])));
+ context.tracker.reportImportTypeNodeResolutionModeOverride?.();
}
}
@@ -36029,8 +36031,11 @@ namespace ts {
if (node.assertions) {
const override = getResolutionModeOverrideForClause(node.assertions.assertClause, grammarErrorOnNode);
if (override) {
+ if (!isNightly()) {
+ grammarErrorOnNode(node.assertions.assertClause, Diagnostics.resolution_mode_assertions_are_unstable_Use_nightly_TypeScript_to_silence_this_error_Try_updating_with_npm_install_D_typescript_next);
+ }
if (getEmitModuleResolutionKind(compilerOptions) !== ModuleResolutionKind.Node16 && getEmitModuleResolutionKind(compilerOptions) !== ModuleResolutionKind.NodeNext) {
- grammarErrorOnNode(node.assertions.assertClause, Diagnostics.Resolution_modes_are_only_supported_when_moduleResolution_is_node16_or_nodenext);
+ grammarErrorOnNode(node.assertions.assertClause, Diagnostics.resolution_mode_assertions_are_only_supported_when_moduleResolution_is_node16_or_nodenext);
}
}
}
@@ -40961,11 +40966,11 @@ namespace ts {
const override = getResolutionModeOverrideForClause(declaration.assertClause, validForTypeAssertions ? grammarErrorOnNode : undefined);
if (validForTypeAssertions && override) {
if (!isNightly()) {
- grammarErrorOnNode(declaration.assertClause, Diagnostics.Resolution_mode_assertions_are_unstable_Use_nightly_TypeScript_to_silence_this_error_Try_updating_with_npm_install_D_typescript_next);
+ grammarErrorOnNode(declaration.assertClause, Diagnostics.resolution_mode_assertions_are_unstable_Use_nightly_TypeScript_to_silence_this_error_Try_updating_with_npm_install_D_typescript_next);
}
if (getEmitModuleResolutionKind(compilerOptions) !== ModuleResolutionKind.Node16 && getEmitModuleResolutionKind(compilerOptions) !== ModuleResolutionKind.NodeNext) {
- return grammarErrorOnNode(declaration.assertClause, Diagnostics.Resolution_modes_are_only_supported_when_moduleResolution_is_node16_or_nodenext);
+ return grammarErrorOnNode(declaration.assertClause, Diagnostics.resolution_mode_assertions_are_only_supported_when_moduleResolution_is_node16_or_nodenext);
}
return; // Other grammar checks do not apply to type-only imports with resolution mode assertions
}
diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json
index 05717148ebc33..5f73b02c0746d 100644
--- a/src/compiler/diagnosticMessages.json
+++ b/src/compiler/diagnosticMessages.json
@@ -1436,7 +1436,7 @@
"category": "Error",
"code": 1451
},
- "Resolution modes are only supported when `moduleResolution` is `node16` or `nodenext`.": {
+ "'resolution-mode' assertions are only supported when `moduleResolution` is `node16` or `nodenext`.": {
"category": "Error",
"code": 1452
},
@@ -3479,6 +3479,10 @@
"category": "Error",
"code": 2840
},
+ "The type of this expression cannot be named without a 'resolution-mode' assertion, which is an unstable feature. Use nightly TypeScript to silence this error. Try updating with 'npm install -D typescript@next'.": {
+ "category": "Error",
+ "code": 2841
+ },
"Import declaration '{0}' is using private name '{1}'.": {
"category": "Error",
@@ -3908,7 +3912,7 @@
"category": "Error",
"code": 4124
},
- "Resolution mode assertions are unstable. Use nightly TypeScript to silence this error. Try updating with 'npm install -D typescript@next'.": {
+ "'resolution-mode' assertions are unstable. Use nightly TypeScript to silence this error. Try updating with 'npm install -D typescript@next'.": {
"category": "Error",
"code": 4125
},
diff --git a/src/compiler/program.ts b/src/compiler/program.ts
index aa106a618731e..fbb5be6c7f119 100644
--- a/src/compiler/program.ts
+++ b/src/compiler/program.ts
@@ -3121,7 +3121,7 @@ namespace ts {
setResolvedTypeReferenceDirective(file, fileName, resolvedTypeReferenceDirective);
const mode = ref.resolutionMode || file.impliedNodeFormat;
if (mode && getEmitModuleResolutionKind(options) !== ModuleResolutionKind.Node16 && getEmitModuleResolutionKind(options) !== ModuleResolutionKind.NodeNext) {
- programDiagnostics.add(createDiagnosticForRange(file, ref, Diagnostics.Resolution_modes_are_only_supported_when_moduleResolution_is_node16_or_nodenext));
+ programDiagnostics.add(createDiagnosticForRange(file, ref, Diagnostics.resolution_mode_assertions_are_only_supported_when_moduleResolution_is_node16_or_nodenext));
}
processTypeReferenceDirective(fileName, mode, resolvedTypeReferenceDirective, { kind: FileIncludeKind.TypeReferenceDirective, file: file.path, index, });
}
diff --git a/src/compiler/transformers/declarations.ts b/src/compiler/transformers/declarations.ts
index b855fd4b8dab5..76db95b260377 100644
--- a/src/compiler/transformers/declarations.ts
+++ b/src/compiler/transformers/declarations.ts
@@ -78,7 +78,8 @@ namespace ts {
trackReferencedAmbientModule,
trackExternalModuleSymbolOfImportTypeNode,
reportNonlocalAugmentation,
- reportNonSerializableProperty
+ reportNonSerializableProperty,
+ reportImportTypeNodeResolutionModeOverride,
};
let errorNameNode: DeclarationName | undefined;
let errorFallbackNode: Declaration | undefined;
@@ -235,6 +236,12 @@ namespace ts {
}
}
+ function reportImportTypeNodeResolutionModeOverride() {
+ if (!isNightly() && (errorNameNode || errorFallbackNode)) {
+ context.addDiagnostic(createDiagnosticForNode((errorNameNode || errorFallbackNode)!, Diagnostics.The_type_of_this_expression_cannot_be_named_without_a_resolution_mode_assertion_which_is_an_unstable_feature_Use_nightly_TypeScript_to_silence_this_error_Try_updating_with_npm_install_D_typescript_next));
+ }
+ }
+
function transformDeclarationsForJS(sourceFile: SourceFile, bundled?: boolean) {
const oldDiag = getSymbolAccessibilityDiagnostic;
getSymbolAccessibilityDiagnostic = (s) => (s.errorNode && canProduceDiagnostics(s.errorNode) ? createGetSymbolAccessibilityDiagnosticForNode(s.errorNode)(s) : ({
@@ -792,7 +799,7 @@ namespace ts {
const mode = getResolutionModeOverrideForClause(assertClause);
if (mode !== undefined) {
if (!isNightly()) {
- context.addDiagnostic(createDiagnosticForNode(assertClause!, Diagnostics.Resolution_mode_assertions_are_unstable_Use_nightly_TypeScript_to_silence_this_error_Try_updating_with_npm_install_D_typescript_next));
+ context.addDiagnostic(createDiagnosticForNode(assertClause!, Diagnostics.resolution_mode_assertions_are_unstable_Use_nightly_TypeScript_to_silence_this_error_Try_updating_with_npm_install_D_typescript_next));
}
return assertClause;
}
diff --git a/src/compiler/types.ts b/src/compiler/types.ts
index 5aca9584a99a4..8d5662ac2cf09 100644
--- a/src/compiler/types.ts
+++ b/src/compiler/types.ts
@@ -8524,6 +8524,7 @@ namespace ts {
trackExternalModuleSymbolOfImportTypeNode?(symbol: Symbol): void;
reportNonlocalAugmentation?(containingFile: SourceFile, parentSymbol: Symbol, augmentingSymbol: Symbol): void;
reportNonSerializableProperty?(propertyName: string): void;
+ reportImportTypeNodeResolutionModeOverride?(): void;
}
export interface TextSpan {
diff --git a/tests/baselines/reference/nodeModulesTripleSlashReferenceModeOverrideOldResolutionError.errors.txt b/tests/baselines/reference/nodeModulesTripleSlashReferenceModeOverrideOldResolutionError.errors.txt
index 05f937c37aded..fcec678778db4 100644
--- a/tests/baselines/reference/nodeModulesTripleSlashReferenceModeOverrideOldResolutionError.errors.txt
+++ b/tests/baselines/reference/nodeModulesTripleSlashReferenceModeOverrideOldResolutionError.errors.txt
@@ -1,6 +1,6 @@
-/index.ts(1,23): error TS1452: Resolution modes are only supported when `moduleResolution` is `node16` or `nodenext`.
+/index.ts(1,23): error TS1452: 'resolution-mode' assertions are only supported when `moduleResolution` is `node16` or `nodenext`.
/index.ts(1,23): error TS2688: Cannot find type definition file for 'pkg'.
-/index.ts(2,23): error TS1452: Resolution modes are only supported when `moduleResolution` is `node16` or `nodenext`.
+/index.ts(2,23): error TS1452: 'resolution-mode' assertions are only supported when `moduleResolution` is `node16` or `nodenext`.
/index.ts(2,23): error TS2688: Cannot find type definition file for 'pkg'.
/index.ts(3,1): error TS2304: Cannot find name 'foo'.
/index.ts(4,1): error TS2304: Cannot find name 'bar'.
@@ -9,12 +9,12 @@
==== /index.ts (6 errors) ====
///
~~~
-!!! error TS1452: Resolution modes are only supported when `moduleResolution` is `node16` or `nodenext`.
+!!! error TS1452: 'resolution-mode' assertions are only supported when `moduleResolution` is `node16` or `nodenext`.
~~~
!!! error TS2688: Cannot find type definition file for 'pkg'.
///
~~~
-!!! error TS1452: Resolution modes are only supported when `moduleResolution` is `node16` or `nodenext`.
+!!! error TS1452: 'resolution-mode' assertions are only supported when `moduleResolution` is `node16` or `nodenext`.
~~~
!!! error TS2688: Cannot find type definition file for 'pkg'.
foo; // `resolution-mode` is an error in old resolution settings, which resolves is arbitrary