@@ -407,6 +407,7 @@ import {
407
407
IdentifierTypePredicate,
408
408
idText,
409
409
IfStatement,
410
+ ImportAttribute,
410
411
ImportAttributes,
411
412
ImportCall,
412
413
ImportClause,
@@ -2178,6 +2179,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2178
2179
var deferredGlobalImportMetaType: ObjectType;
2179
2180
var deferredGlobalImportMetaExpressionType: ObjectType;
2180
2181
var deferredGlobalImportCallOptionsType: ObjectType | undefined;
2182
+ var deferredGlobalImportAttributesType: ObjectType | undefined;
2181
2183
var deferredGlobalDisposableType: ObjectType | undefined;
2182
2184
var deferredGlobalAsyncDisposableType: ObjectType | undefined;
2183
2185
var deferredGlobalExtractSymbol: Symbol | undefined;
@@ -11533,6 +11535,25 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
11533
11535
return widenTypeForVariableLikeDeclaration(getTypeForVariableLikeDeclaration(declaration, /*includeOptionality*/ true, CheckMode.Normal), declaration, reportErrors);
11534
11536
}
11535
11537
11538
+ function getTypeFromImportAttributes(node: ImportAttributes): Type {
11539
+ const links = getNodeLinks(node);
11540
+ if (!links.resolvedType) {
11541
+ const symbol = createSymbol(SymbolFlags.ObjectLiteral, InternalSymbolName.ImportAttributes);
11542
+ const members = createSymbolTable();
11543
+ forEach(node.elements, attr => {
11544
+ const member = createSymbol(SymbolFlags.Property, isIdentifier(attr.name) ? attr.name.escapedText : escapeLeadingUnderscores(attr.name.text));
11545
+ member.parent = symbol;
11546
+ member.links.type = checkImportAttribute(attr);
11547
+ member.links.target = member;
11548
+ members.set(member.escapedName, member);
11549
+ });
11550
+ const type = createAnonymousType(symbol, members, emptyArray, emptyArray, emptyArray);
11551
+ type.objectFlags |= ObjectFlags.ObjectLiteral | ObjectFlags.NonInferrableType;
11552
+ links.resolvedType = type;
11553
+ }
11554
+ return links.resolvedType;
11555
+ }
11556
+
11536
11557
function isGlobalSymbolConstructor(node: Node) {
11537
11558
const symbol = getSymbolOfNode(node);
11538
11559
const globalSymbol = getGlobalESSymbolConstructorTypeSymbol(/*reportErrors*/ false);
@@ -16357,6 +16378,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
16357
16378
return (deferredGlobalImportCallOptionsType ||= getGlobalType("ImportCallOptions" as __String, /*arity*/ 0, reportErrors)) || emptyObjectType;
16358
16379
}
16359
16380
16381
+ function getGlobalImportAttributesType(reportErrors: boolean) {
16382
+ return (deferredGlobalImportAttributesType ||= getGlobalType("ImportAttributes" as __String, /*arity*/ 0, reportErrors)) || emptyObjectType;
16383
+ }
16384
+
16360
16385
function getGlobalESSymbolConstructorSymbol(reportErrors: boolean): Symbol | undefined {
16361
16386
return deferredGlobalESSymbolConstructorSymbol ||= getGlobalValueSymbol("Symbol" as __String, reportErrors);
16362
16387
}
@@ -45827,6 +45852,11 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
45827
45852
function checkImportAttributes(declaration: ImportDeclaration | ExportDeclaration) {
45828
45853
const node = declaration.attributes;
45829
45854
if (node) {
45855
+ const importAttributesType = getGlobalImportAttributesType(/*reportErrors*/ true);
45856
+ if (importAttributesType !== emptyObjectType) {
45857
+ checkTypeAssignableTo(getTypeFromImportAttributes(node), getNullableType(importAttributesType, TypeFlags.Undefined), node);
45858
+ }
45859
+
45830
45860
const validForTypeAttributes = isExclusivelyTypeOnlyImportOrExport(declaration);
45831
45861
const override = getResolutionModeOverride(node, validForTypeAttributes ? grammarErrorOnNode : undefined);
45832
45862
const isImportAttributes = declaration.attributes.token === SyntaxKind.WithKeyword;
@@ -45856,6 +45886,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
45856
45886
}
45857
45887
}
45858
45888
45889
+ function checkImportAttribute(node: ImportAttribute) {
45890
+ return getRegularTypeOfLiteralType(checkExpressionCached(node.value));
45891
+ }
45892
+
45859
45893
function checkImportDeclaration(node: ImportDeclaration) {
45860
45894
if (checkGrammarModuleElementContext(node, isInJSFile(node) ? Diagnostics.An_import_declaration_can_only_be_used_at_the_top_level_of_a_module : Diagnostics.An_import_declaration_can_only_be_used_at_the_top_level_of_a_namespace_or_module)) {
45861
45895
// If we hit an import declaration in an illegal context, just bail out to avoid cascading errors.
0 commit comments