@@ -60,7 +60,7 @@ namespace ts {
6060
6161 const compilerOptions = host.getCompilerOptions();
6262 const languageVersion = getEmitScriptTarget(compilerOptions);
63- const modulekind = getEmitModuleKind(compilerOptions);
63+ const moduleKind = getEmitModuleKind(compilerOptions);
6464 const allowSyntheticDefaultImports = getAllowSyntheticDefaultImports(compilerOptions);
6565 const strictNullChecks = getStrictOptionValue(compilerOptions, "strictNullChecks");
6666 const strictFunctionTypes = getStrictOptionValue(compilerOptions, "strictFunctionTypes");
@@ -443,6 +443,7 @@ namespace ts {
443443 let deferredGlobalAsyncIteratorType: GenericType;
444444 let deferredGlobalAsyncIterableIteratorType: GenericType;
445445 let deferredGlobalTemplateStringsArrayType: ObjectType;
446+ let deferredGlobalImportMetaType: ObjectType;
446447 let deferredGlobalExtractSymbol: Symbol;
447448
448449 let deferredNodes: Node[];
@@ -1094,7 +1095,7 @@ namespace ts {
10941095 const declarationFile = getSourceFileOfNode(declaration);
10951096 const useFile = getSourceFileOfNode(usage);
10961097 if (declarationFile !== useFile) {
1097- if ((modulekind && (declarationFile.externalModuleIndicator || useFile.externalModuleIndicator)) ||
1098+ if ((moduleKind && (declarationFile.externalModuleIndicator || useFile.externalModuleIndicator)) ||
10981099 (!compilerOptions.outFile && !compilerOptions.out) ||
10991100 isInTypeQuery(usage) ||
11001101 declaration.flags & NodeFlags.Ambient) {
@@ -7860,6 +7861,10 @@ namespace ts {
78607861 return deferredGlobalTemplateStringsArrayType || (deferredGlobalTemplateStringsArrayType = getGlobalType("TemplateStringsArray" as __String, /*arity*/ 0, /*reportErrors*/ true)) || emptyObjectType;
78617862 }
78627863
7864+ function getGlobalImportMetaType() {
7865+ return deferredGlobalImportMetaType || (deferredGlobalImportMetaType = getGlobalType("ImportMeta" as __String, /*arity*/ 0, /*reportErrors*/ true)) || emptyObjectType;
7866+ }
7867+
78637868 function getGlobalESSymbolConstructorSymbol(reportErrors: boolean) {
78647869 return deferredGlobalESSymbolConstructorSymbol || (deferredGlobalESSymbolConstructorSymbol = getGlobalValueSymbol("Symbol" as __String, reportErrors));
78657870 }
@@ -18905,6 +18910,17 @@ namespace ts {
1890518910
1890618911 function checkMetaProperty(node: MetaProperty) {
1890718912 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) {
1890818924 const container = getNewTargetContainer(node);
1890918925 if (!container) {
1891018926 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 {
1892018936 }
1892118937 }
1892218938
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+
1892318949 function getTypeOfParameter(symbol: Symbol) {
1892418950 const type = getTypeOfSymbol(symbol);
1892518951 if (strictNullChecks) {
@@ -22542,7 +22568,7 @@ namespace ts {
2254222568
2254322569 function checkCollisionWithRequireExportsInGeneratedCode(node: Node, name: Identifier) {
2254422570 // 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) {
2254622572 return;
2254722573 }
2254822574
@@ -24738,7 +24764,7 @@ namespace ts {
2473824764 }
2473924765 }
2474024766 else {
24741- if (modulekind >= ModuleKind.ES2015 && !(node.flags & NodeFlags.Ambient)) {
24767+ if (moduleKind >= ModuleKind.ES2015 && !(node.flags & NodeFlags.Ambient)) {
2474224768 // Import equals declaration is deprecated in es6 or above
2474324769 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);
2474424770 }
@@ -24776,7 +24802,7 @@ namespace ts {
2477624802 error(node.moduleSpecifier, Diagnostics.Module_0_uses_export_and_cannot_be_used_with_export_Asterisk, symbolToString(moduleSymbol));
2477724803 }
2477824804
24779- if (modulekind !== ModuleKind.System && modulekind !== ModuleKind.ES2015 && modulekind !== ModuleKind.ESNext) {
24805+ if (moduleKind !== ModuleKind.System && moduleKind !== ModuleKind.ES2015 && moduleKind !== ModuleKind.ESNext) {
2478024806 checkExternalEmitHelpers(node, ExternalEmitHelpers.ExportStar);
2478124807 }
2478224808 }
@@ -24849,11 +24875,11 @@ namespace ts {
2484924875 }
2485024876
2485124877 if (node.isExportEquals && !(node.flags & NodeFlags.Ambient)) {
24852- if (modulekind >= ModuleKind.ES2015) {
24878+ if (moduleKind >= ModuleKind.ES2015) {
2485324879 // export assignment is not supported in es6 modules
2485424880 grammarErrorOnNode(node, Diagnostics.Export_assignment_cannot_be_used_when_targeting_ECMAScript_modules_Consider_using_export_default_or_another_module_format_instead);
2485524881 }
24856- else if (modulekind === ModuleKind.System) {
24882+ else if (moduleKind === ModuleKind.System) {
2485724883 // system modules does not support export assignment
2485824884 grammarErrorOnNode(node, Diagnostics.Export_assignment_is_not_supported_when_module_flag_is_system);
2485924885 }
@@ -27801,10 +27827,18 @@ namespace ts {
2780127827 }
2780227828
2780327829 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;
2780827842 }
2780927843 }
2781027844
@@ -28003,7 +28037,7 @@ namespace ts {
2800328037 }
2800428038
2800528039 function checkGrammarImportCallExpression(node: ImportCall): boolean {
28006- if (modulekind === ModuleKind.ES2015) {
28040+ if (moduleKind === ModuleKind.ES2015) {
2800728041 return grammarErrorOnNode(node, Diagnostics.Dynamic_import_cannot_be_used_when_targeting_ECMAScript_2015_modules);
2800828042 }
2800928043
0 commit comments