@@ -60,7 +60,7 @@ namespace ts {
60
60
61
61
const compilerOptions = host.getCompilerOptions();
62
62
const languageVersion = getEmitScriptTarget(compilerOptions);
63
- const modulekind = getEmitModuleKind(compilerOptions);
63
+ const moduleKind = getEmitModuleKind(compilerOptions);
64
64
const allowSyntheticDefaultImports = getAllowSyntheticDefaultImports(compilerOptions);
65
65
const strictNullChecks = getStrictOptionValue(compilerOptions, "strictNullChecks");
66
66
const strictFunctionTypes = getStrictOptionValue(compilerOptions, "strictFunctionTypes");
@@ -443,6 +443,7 @@ namespace ts {
443
443
let deferredGlobalAsyncIteratorType: GenericType;
444
444
let deferredGlobalAsyncIterableIteratorType: GenericType;
445
445
let deferredGlobalTemplateStringsArrayType: ObjectType;
446
+ let deferredGlobalImportMetaType: ObjectType;
446
447
let deferredGlobalExtractSymbol: Symbol;
447
448
448
449
let deferredNodes: Node[];
@@ -1094,7 +1095,7 @@ namespace ts {
1094
1095
const declarationFile = getSourceFileOfNode(declaration);
1095
1096
const useFile = getSourceFileOfNode(usage);
1096
1097
if (declarationFile !== useFile) {
1097
- if ((modulekind && (declarationFile.externalModuleIndicator || useFile.externalModuleIndicator)) ||
1098
+ if ((moduleKind && (declarationFile.externalModuleIndicator || useFile.externalModuleIndicator)) ||
1098
1099
(!compilerOptions.outFile && !compilerOptions.out) ||
1099
1100
isInTypeQuery(usage) ||
1100
1101
declaration.flags & NodeFlags.Ambient) {
@@ -7860,6 +7861,10 @@ namespace ts {
7860
7861
return deferredGlobalTemplateStringsArrayType || (deferredGlobalTemplateStringsArrayType = getGlobalType("TemplateStringsArray" as __String, /*arity*/ 0, /*reportErrors*/ true)) || emptyObjectType;
7861
7862
}
7862
7863
7864
+ function getGlobalImportMetaType() {
7865
+ return deferredGlobalImportMetaType || (deferredGlobalImportMetaType = getGlobalType("ImportMeta" as __String, /*arity*/ 0, /*reportErrors*/ true)) || emptyObjectType;
7866
+ }
7867
+
7863
7868
function getGlobalESSymbolConstructorSymbol(reportErrors: boolean) {
7864
7869
return deferredGlobalESSymbolConstructorSymbol || (deferredGlobalESSymbolConstructorSymbol = getGlobalValueSymbol("Symbol" as __String, reportErrors));
7865
7870
}
@@ -18905,6 +18910,17 @@ namespace ts {
18905
18910
18906
18911
function checkMetaProperty(node: MetaProperty) {
18907
18912
checkGrammarMetaProperty(node);
18913
+
18914
+ if (node.keywordToken === SyntaxKind.NewKeyword) {
18915
+ return checkNewTargetMetaProperty(node);
18916
+ }
18917
+
18918
+ if (node.keywordToken === SyntaxKind.ImportKeyword) {
18919
+ return checkImportMetaProperty(node);
18920
+ }
18921
+ }
18922
+
18923
+ function checkNewTargetMetaProperty(node: MetaProperty) {
18908
18924
const container = getNewTargetContainer(node);
18909
18925
if (!container) {
18910
18926
error(node, Diagnostics.Meta_property_0_is_only_allowed_in_the_body_of_a_function_declaration_function_expression_or_constructor, "new.target");
@@ -18920,6 +18936,16 @@ namespace ts {
18920
18936
}
18921
18937
}
18922
18938
18939
+ function checkImportMetaProperty(node: MetaProperty) {
18940
+ if (languageVersion < ScriptTarget.ESNext || moduleKind < ModuleKind.ESNext) {
18941
+ error(node, Diagnostics.The_import_meta_meta_property_is_only_allowed_using_ESNext_for_the_target_and_module_compiler_options);
18942
+ }
18943
+ const file = getSourceFileOfNode(node);
18944
+ Debug.assert(!!(file.flags & NodeFlags.PossiblyContainsImportMeta), "Containing file is missing import meta node flag.");
18945
+ Debug.assert(!!file.externalModuleIndicator, "Containing file should be a module.");
18946
+ return node.name.escapedText === "meta" ? getGlobalImportMetaType() : unknownType;
18947
+ }
18948
+
18923
18949
function getTypeOfParameter(symbol: Symbol) {
18924
18950
const type = getTypeOfSymbol(symbol);
18925
18951
if (strictNullChecks) {
@@ -22542,7 +22568,7 @@ namespace ts {
22542
22568
22543
22569
function checkCollisionWithRequireExportsInGeneratedCode(node: Node, name: Identifier) {
22544
22570
// No need to check for require or exports for ES6 modules and later
22545
- if (modulekind >= ModuleKind.ES2015 || compilerOptions.noEmit) {
22571
+ if (moduleKind >= ModuleKind.ES2015 || compilerOptions.noEmit) {
22546
22572
return;
22547
22573
}
22548
22574
@@ -24738,7 +24764,7 @@ namespace ts {
24738
24764
}
24739
24765
}
24740
24766
else {
24741
- if (modulekind >= ModuleKind.ES2015 && !(node.flags & NodeFlags.Ambient)) {
24767
+ if (moduleKind >= ModuleKind.ES2015 && !(node.flags & NodeFlags.Ambient)) {
24742
24768
// Import equals declaration is deprecated in es6 or above
24743
24769
grammarErrorOnNode(node, Diagnostics.Import_assignment_cannot_be_used_when_targeting_ECMAScript_modules_Consider_using_import_Asterisk_as_ns_from_mod_import_a_from_mod_import_d_from_mod_or_another_module_format_instead);
24744
24770
}
@@ -24776,7 +24802,7 @@ namespace ts {
24776
24802
error(node.moduleSpecifier, Diagnostics.Module_0_uses_export_and_cannot_be_used_with_export_Asterisk, symbolToString(moduleSymbol));
24777
24803
}
24778
24804
24779
- if (modulekind !== ModuleKind.System && modulekind !== ModuleKind.ES2015 && modulekind !== ModuleKind.ESNext) {
24805
+ if (moduleKind !== ModuleKind.System && moduleKind !== ModuleKind.ES2015 && moduleKind !== ModuleKind.ESNext) {
24780
24806
checkExternalEmitHelpers(node, ExternalEmitHelpers.ExportStar);
24781
24807
}
24782
24808
}
@@ -24849,11 +24875,11 @@ namespace ts {
24849
24875
}
24850
24876
24851
24877
if (node.isExportEquals && !(node.flags & NodeFlags.Ambient)) {
24852
- if (modulekind >= ModuleKind.ES2015) {
24878
+ if (moduleKind >= ModuleKind.ES2015) {
24853
24879
// export assignment is not supported in es6 modules
24854
24880
grammarErrorOnNode(node, Diagnostics.Export_assignment_cannot_be_used_when_targeting_ECMAScript_modules_Consider_using_export_default_or_another_module_format_instead);
24855
24881
}
24856
- else if (modulekind === ModuleKind.System) {
24882
+ else if (moduleKind === ModuleKind.System) {
24857
24883
// system modules does not support export assignment
24858
24884
grammarErrorOnNode(node, Diagnostics.Export_assignment_is_not_supported_when_module_flag_is_system);
24859
24885
}
@@ -27801,10 +27827,18 @@ namespace ts {
27801
27827
}
27802
27828
27803
27829
function checkGrammarMetaProperty(node: MetaProperty) {
27804
- if (node.keywordToken === SyntaxKind.NewKeyword) {
27805
- if (node.name.escapedText !== "target") {
27806
- return grammarErrorOnNode(node.name, Diagnostics._0_is_not_a_valid_meta_property_for_keyword_1_Did_you_mean_2, node.name.escapedText, tokenToString(node.keywordToken), "target");
27807
- }
27830
+ const escapedText = node.name.escapedText;
27831
+ switch (node.keywordToken) {
27832
+ case SyntaxKind.NewKeyword:
27833
+ if (escapedText !== "target") {
27834
+ return grammarErrorOnNode(node.name, Diagnostics._0_is_not_a_valid_meta_property_for_keyword_1_Did_you_mean_2, node.name.escapedText, tokenToString(node.keywordToken), "target");
27835
+ }
27836
+ break;
27837
+ case SyntaxKind.ImportKeyword:
27838
+ if (escapedText !== "meta") {
27839
+ return grammarErrorOnNode(node.name, Diagnostics._0_is_not_a_valid_meta_property_for_keyword_1_Did_you_mean_2, node.name.escapedText, tokenToString(node.keywordToken), "meta");
27840
+ }
27841
+ break;
27808
27842
}
27809
27843
}
27810
27844
@@ -28003,7 +28037,7 @@ namespace ts {
28003
28037
}
28004
28038
28005
28039
function checkGrammarImportCallExpression(node: ImportCall): boolean {
28006
- if (modulekind === ModuleKind.ES2015) {
28040
+ if (moduleKind === ModuleKind.ES2015) {
28007
28041
return grammarErrorOnNode(node, Diagnostics.Dynamic_import_cannot_be_used_when_targeting_ECMAScript_2015_modules);
28008
28042
}
28009
28043
0 commit comments