Skip to content

Commit 1a4643b

Browse files
Flag resolution mode assertions in non-nightly builds (microsoft#49002)
* Flag resolution mode assertions in non-nightly builds * Add checker check
1 parent 8d0393d commit 1a4643b

File tree

5 files changed

+29
-6
lines changed

5 files changed

+29
-6
lines changed

src/compiler/checker.ts

+4
Original file line numberDiff line numberDiff line change
@@ -40718,6 +40718,10 @@ namespace ts {
4071840718
const validForTypeAssertions = isExclusivelyTypeOnlyImportOrExport(declaration);
4071940719
const override = getResolutionModeOverrideForClause(declaration.assertClause, validForTypeAssertions ? grammarErrorOnNode : undefined);
4072040720
if (validForTypeAssertions && override) {
40721+
if (!isNightly()) {
40722+
grammarErrorOnNode(declaration.assertClause, Diagnostics.Resolution_mode_assertions_are_unstable_Use_nightly_TypeScript_to_silence_this_error_Try_updating_with_npm_install_D_typescript_next);
40723+
}
40724+
4072140725
if (getEmitModuleResolutionKind(compilerOptions) !== ModuleResolutionKind.Node16 && getEmitModuleResolutionKind(compilerOptions) !== ModuleResolutionKind.NodeNext) {
4072240726
return grammarErrorOnNode(declaration.assertClause, Diagnostics.Resolution_modes_are_only_supported_when_moduleResolution_is_node16_or_nodenext);
4072340727
}

src/compiler/diagnosticMessages.json

+4
Original file line numberDiff line numberDiff line change
@@ -3880,6 +3880,10 @@
38803880
"category": "Error",
38813881
"code": 4124
38823882
},
3883+
"Resolution mode assertions are unstable. Use nightly TypeScript to silence this error. Try updating with 'npm install -D typescript@next'.": {
3884+
"category": "Error",
3885+
"code": 4125
3886+
},
38833887

38843888
"The current host does not support the '{0}' option.": {
38853889
"category": "Error",

src/compiler/program.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -593,7 +593,7 @@ namespace ts {
593593
}
594594

595595
/* @internal */
596-
export function getResolutionModeOverrideForClause(clause: AssertClause | undefined, grammarErrorOnNode?: (node: Node, diagnostic: DiagnosticMessage) => boolean) {
596+
export function getResolutionModeOverrideForClause(clause: AssertClause | undefined, grammarErrorOnNode?: (node: Node, diagnostic: DiagnosticMessage) => void) {
597597
if (!clause) return undefined;
598598
if (length(clause.elements) !== 1) {
599599
grammarErrorOnNode?.(clause, Diagnostics.Type_import_assertions_should_have_exactly_one_key_resolution_mode_with_value_import_or_require);

src/compiler/transformers/declarations.ts

+16-5
Original file line numberDiff line numberDiff line change
@@ -733,7 +733,7 @@ namespace ts {
733733
decl.modifiers,
734734
decl.importClause,
735735
rewriteModuleSpecifier(decl, decl.moduleSpecifier),
736-
getResolutionModeOverrideForClause(decl.assertClause) ? decl.assertClause : undefined
736+
getResolutionModeOverrideForClauseInNightly(decl.assertClause)
737737
);
738738
}
739739
// The `importClause` visibility corresponds to the default's visibility.
@@ -745,7 +745,7 @@ namespace ts {
745745
decl.importClause.isTypeOnly,
746746
visibleDefaultBinding,
747747
/*namedBindings*/ undefined,
748-
), rewriteModuleSpecifier(decl, decl.moduleSpecifier), getResolutionModeOverrideForClause(decl.assertClause) ? decl.assertClause : undefined);
748+
), rewriteModuleSpecifier(decl, decl.moduleSpecifier), getResolutionModeOverrideForClauseInNightly(decl.assertClause));
749749
}
750750
if (decl.importClause.namedBindings.kind === SyntaxKind.NamespaceImport) {
751751
// Namespace import (optionally with visible default)
@@ -755,7 +755,7 @@ namespace ts {
755755
decl.importClause.isTypeOnly,
756756
visibleDefaultBinding,
757757
namedBindings,
758-
), rewriteModuleSpecifier(decl, decl.moduleSpecifier), getResolutionModeOverrideForClause(decl.assertClause) ? decl.assertClause : undefined) : undefined;
758+
), rewriteModuleSpecifier(decl, decl.moduleSpecifier), getResolutionModeOverrideForClauseInNightly(decl.assertClause)) : undefined;
759759
}
760760
// Named imports (optionally with visible default)
761761
const bindingList = mapDefined(decl.importClause.namedBindings.elements, b => resolver.isDeclarationVisible(b) ? b : undefined);
@@ -771,7 +771,7 @@ namespace ts {
771771
bindingList && bindingList.length ? factory.updateNamedImports(decl.importClause.namedBindings, bindingList) : undefined,
772772
),
773773
rewriteModuleSpecifier(decl, decl.moduleSpecifier),
774-
getResolutionModeOverrideForClause(decl.assertClause) ? decl.assertClause : undefined
774+
getResolutionModeOverrideForClauseInNightly(decl.assertClause)
775775
);
776776
}
777777
// Augmentation of export depends on import
@@ -782,12 +782,23 @@ namespace ts {
782782
decl.modifiers,
783783
/*importClause*/ undefined,
784784
rewriteModuleSpecifier(decl, decl.moduleSpecifier),
785-
getResolutionModeOverrideForClause(decl.assertClause) ? decl.assertClause : undefined
785+
getResolutionModeOverrideForClauseInNightly(decl.assertClause)
786786
);
787787
}
788788
// Nothing visible
789789
}
790790

791+
function getResolutionModeOverrideForClauseInNightly(assertClause: AssertClause | undefined) {
792+
const mode = getResolutionModeOverrideForClause(assertClause);
793+
if (mode !== undefined) {
794+
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));
796+
}
797+
return assertClause;
798+
}
799+
return undefined;
800+
}
801+
791802
function transformAndReplaceLatePaintedStatements(statements: NodeArray<Statement>): NodeArray<Statement> {
792803
// This is a `while` loop because `handleSymbolAccessibilityError` can see additional import aliases marked as visible during
793804
// error handling which must now be included in the output and themselves checked for errors.

src/compiler/utilities.ts

+4
Original file line numberDiff line numberDiff line change
@@ -4121,6 +4121,10 @@ namespace ts {
41214121
return indentStrings[1].length;
41224122
}
41234123

4124+
export function isNightly() {
4125+
return stringContains(version, "-dev") || stringContains(version, "-insiders");
4126+
}
4127+
41244128
export function createTextWriter(newLine: string): EmitTextWriter {
41254129
let output: string;
41264130
let indent: number;

0 commit comments

Comments
 (0)