Skip to content

Commit 34fe835

Browse files
authored
Add nightly-only error on ImportType resolution mode assertion (#49356)
* Add nightly-only error on ImportType resolution mode assertion * Temporarily change version to demonstrate errors * Revert "Temporarily change version to demonstrate errors" This reverts commit 40c2469. * "Resolution mode" -> "resolution-mode"
1 parent 19b2284 commit 34fe835

File tree

6 files changed

+29
-12
lines changed

6 files changed

+29
-12
lines changed

src/compiler/checker.ts

+8-3
Original file line numberDiff line numberDiff line change
@@ -6224,6 +6224,7 @@ namespace ts {
62246224
factory.createStringLiteral("import")
62256225
)
62266226
])));
6227+
context.tracker.reportImportTypeNodeResolutionModeOverride?.();
62276228
}
62286229
}
62296230
if (!specifier) {
@@ -6247,6 +6248,7 @@ namespace ts {
62476248
factory.createStringLiteral(swappedMode === ModuleKind.ESNext ? "import" : "require")
62486249
)
62496250
])));
6251+
context.tracker.reportImportTypeNodeResolutionModeOverride?.();
62506252
}
62516253
}
62526254

@@ -36029,8 +36031,11 @@ namespace ts {
3602936031
if (node.assertions) {
3603036032
const override = getResolutionModeOverrideForClause(node.assertions.assertClause, grammarErrorOnNode);
3603136033
if (override) {
36034+
if (!isNightly()) {
36035+
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);
36036+
}
3603236037
if (getEmitModuleResolutionKind(compilerOptions) !== ModuleResolutionKind.Node16 && getEmitModuleResolutionKind(compilerOptions) !== ModuleResolutionKind.NodeNext) {
36033-
grammarErrorOnNode(node.assertions.assertClause, Diagnostics.Resolution_modes_are_only_supported_when_moduleResolution_is_node16_or_nodenext);
36038+
grammarErrorOnNode(node.assertions.assertClause, Diagnostics.resolution_mode_assertions_are_only_supported_when_moduleResolution_is_node16_or_nodenext);
3603436039
}
3603536040
}
3603636041
}
@@ -40961,11 +40966,11 @@ namespace ts {
4096140966
const override = getResolutionModeOverrideForClause(declaration.assertClause, validForTypeAssertions ? grammarErrorOnNode : undefined);
4096240967
if (validForTypeAssertions && override) {
4096340968
if (!isNightly()) {
40964-
grammarErrorOnNode(declaration.assertClause, Diagnostics.Resolution_mode_assertions_are_unstable_Use_nightly_TypeScript_to_silence_this_error_Try_updating_with_npm_install_D_typescript_next);
40969+
grammarErrorOnNode(declaration.assertClause, Diagnostics.resolution_mode_assertions_are_unstable_Use_nightly_TypeScript_to_silence_this_error_Try_updating_with_npm_install_D_typescript_next);
4096540970
}
4096640971

4096740972
if (getEmitModuleResolutionKind(compilerOptions) !== ModuleResolutionKind.Node16 && getEmitModuleResolutionKind(compilerOptions) !== ModuleResolutionKind.NodeNext) {
40968-
return grammarErrorOnNode(declaration.assertClause, Diagnostics.Resolution_modes_are_only_supported_when_moduleResolution_is_node16_or_nodenext);
40973+
return grammarErrorOnNode(declaration.assertClause, Diagnostics.resolution_mode_assertions_are_only_supported_when_moduleResolution_is_node16_or_nodenext);
4096940974
}
4097040975
return; // Other grammar checks do not apply to type-only imports with resolution mode assertions
4097140976
}

src/compiler/diagnosticMessages.json

+6-2
Original file line numberDiff line numberDiff line change
@@ -1440,7 +1440,7 @@
14401440
"category": "Error",
14411441
"code": 1451
14421442
},
1443-
"Resolution modes are only supported when `moduleResolution` is `node16` or `nodenext`.": {
1443+
"'resolution-mode' assertions are only supported when `moduleResolution` is `node16` or `nodenext`.": {
14441444
"category": "Error",
14451445
"code": 1452
14461446
},
@@ -3483,6 +3483,10 @@
34833483
"category": "Error",
34843484
"code": 2840
34853485
},
3486+
"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'.": {
3487+
"category": "Error",
3488+
"code": 2841
3489+
},
34863490

34873491
"Import declaration '{0}' is using private name '{1}'.": {
34883492
"category": "Error",
@@ -3912,7 +3916,7 @@
39123916
"category": "Error",
39133917
"code": 4124
39143918
},
3915-
"Resolution mode assertions are unstable. Use nightly TypeScript to silence this error. Try updating with 'npm install -D typescript@next'.": {
3919+
"'resolution-mode' assertions are unstable. Use nightly TypeScript to silence this error. Try updating with 'npm install -D typescript@next'.": {
39163920
"category": "Error",
39173921
"code": 4125
39183922
},

src/compiler/program.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -3121,7 +3121,7 @@ namespace ts {
31213121
setResolvedTypeReferenceDirective(file, fileName, resolvedTypeReferenceDirective);
31223122
const mode = ref.resolutionMode || file.impliedNodeFormat;
31233123
if (mode && getEmitModuleResolutionKind(options) !== ModuleResolutionKind.Node16 && getEmitModuleResolutionKind(options) !== ModuleResolutionKind.NodeNext) {
3124-
programDiagnostics.add(createDiagnosticForRange(file, ref, Diagnostics.Resolution_modes_are_only_supported_when_moduleResolution_is_node16_or_nodenext));
3124+
programDiagnostics.add(createDiagnosticForRange(file, ref, Diagnostics.resolution_mode_assertions_are_only_supported_when_moduleResolution_is_node16_or_nodenext));
31253125
}
31263126
processTypeReferenceDirective(fileName, mode, resolvedTypeReferenceDirective, { kind: FileIncludeKind.TypeReferenceDirective, file: file.path, index, });
31273127
}

src/compiler/transformers/declarations.ts

+9-2
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ namespace ts {
7878
trackReferencedAmbientModule,
7979
trackExternalModuleSymbolOfImportTypeNode,
8080
reportNonlocalAugmentation,
81-
reportNonSerializableProperty
81+
reportNonSerializableProperty,
82+
reportImportTypeNodeResolutionModeOverride,
8283
};
8384
let errorNameNode: DeclarationName | undefined;
8485
let errorFallbackNode: Declaration | undefined;
@@ -235,6 +236,12 @@ namespace ts {
235236
}
236237
}
237238

239+
function reportImportTypeNodeResolutionModeOverride() {
240+
if (!isNightly() && (errorNameNode || errorFallbackNode)) {
241+
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));
242+
}
243+
}
244+
238245
function transformDeclarationsForJS(sourceFile: SourceFile, bundled?: boolean) {
239246
const oldDiag = getSymbolAccessibilityDiagnostic;
240247
getSymbolAccessibilityDiagnostic = (s) => (s.errorNode && canProduceDiagnostics(s.errorNode) ? createGetSymbolAccessibilityDiagnosticForNode(s.errorNode)(s) : ({
@@ -792,7 +799,7 @@ namespace ts {
792799
const mode = getResolutionModeOverrideForClause(assertClause);
793800
if (mode !== undefined) {
794801
if (!isNightly()) {
795-
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));
802+
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));
796803
}
797804
return assertClause;
798805
}

src/compiler/types.ts

+1
Original file line numberDiff line numberDiff line change
@@ -8524,6 +8524,7 @@ namespace ts {
85248524
trackExternalModuleSymbolOfImportTypeNode?(symbol: Symbol): void;
85258525
reportNonlocalAugmentation?(containingFile: SourceFile, parentSymbol: Symbol, augmentingSymbol: Symbol): void;
85268526
reportNonSerializableProperty?(propertyName: string): void;
8527+
reportImportTypeNodeResolutionModeOverride?(): void;
85278528
}
85288529

85298530
export interface TextSpan {

tests/baselines/reference/nodeModulesTripleSlashReferenceModeOverrideOldResolutionError.errors.txt

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
/index.ts(1,23): error TS1452: Resolution modes are only supported when `moduleResolution` is `node16` or `nodenext`.
1+
/index.ts(1,23): error TS1452: 'resolution-mode' assertions are only supported when `moduleResolution` is `node16` or `nodenext`.
22
/index.ts(1,23): error TS2688: Cannot find type definition file for 'pkg'.
3-
/index.ts(2,23): error TS1452: Resolution modes are only supported when `moduleResolution` is `node16` or `nodenext`.
3+
/index.ts(2,23): error TS1452: 'resolution-mode' assertions are only supported when `moduleResolution` is `node16` or `nodenext`.
44
/index.ts(2,23): error TS2688: Cannot find type definition file for 'pkg'.
55
/index.ts(3,1): error TS2304: Cannot find name 'foo'.
66
/index.ts(4,1): error TS2304: Cannot find name 'bar'.
@@ -9,12 +9,12 @@
99
==== /index.ts (6 errors) ====
1010
/// <reference types="pkg" resolution-mode="require" />
1111
~~~
12-
!!! error TS1452: Resolution modes are only supported when `moduleResolution` is `node16` or `nodenext`.
12+
!!! error TS1452: 'resolution-mode' assertions are only supported when `moduleResolution` is `node16` or `nodenext`.
1313
~~~
1414
!!! error TS2688: Cannot find type definition file for 'pkg'.
1515
/// <reference types="pkg" resolution-mode="import" />
1616
~~~
17-
!!! error TS1452: Resolution modes are only supported when `moduleResolution` is `node16` or `nodenext`.
17+
!!! error TS1452: 'resolution-mode' assertions are only supported when `moduleResolution` is `node16` or `nodenext`.
1818
~~~
1919
!!! error TS2688: Cannot find type definition file for 'pkg'.
2020
foo; // `resolution-mode` is an error in old resolution settings, which resolves is arbitrary

0 commit comments

Comments
 (0)