@@ -1264,10 +1264,13 @@ namespace ts {
12641264 }
12651265
12661266 const moduleReferenceLiteral = <LiteralExpression>moduleReferenceExpression;
1267+ return resolveExternalModule(location, moduleReferenceLiteral.text, moduleNotFoundError, moduleReferenceLiteral);
1268+ }
12671269
1270+ function resolveExternalModule(location: Node, moduleReference: string, moduleNotFoundError: DiagnosticMessage, errorNode: Node): Symbol {
12681271 // Module names are escaped in our symbol table. However, string literal values aren't.
12691272 // Escape the name in the "require(...)" clause to ensure we find the right symbol.
1270- const moduleName = escapeIdentifier(moduleReferenceLiteral.text );
1273+ const moduleName = escapeIdentifier(moduleReference );
12711274
12721275 if (moduleName === undefined) {
12731276 return;
@@ -1282,7 +1285,7 @@ namespace ts {
12821285 }
12831286 }
12841287
1285- const resolvedModule = getResolvedModule(getSourceFileOfNode(location), moduleReferenceLiteral.text );
1288+ const resolvedModule = getResolvedModule(getSourceFileOfNode(location), moduleReference );
12861289 const sourceFile = resolvedModule && host.getSourceFile(resolvedModule.resolvedFileName);
12871290 if (sourceFile) {
12881291 if (sourceFile.symbol) {
@@ -1291,7 +1294,7 @@ namespace ts {
12911294 }
12921295 if (moduleNotFoundError) {
12931296 // report errors only if it was requested
1294- error(moduleReferenceLiteral , Diagnostics.File_0_is_not_a_module, sourceFile.fileName);
1297+ error(errorNode , Diagnostics.File_0_is_not_a_module, sourceFile.fileName);
12951298 }
12961299 return undefined;
12971300 }
@@ -1305,7 +1308,7 @@ namespace ts {
13051308
13061309 if (moduleNotFoundError) {
13071310 // report errors only if it was requested
1308- error(moduleReferenceLiteral , moduleNotFoundError, moduleName);
1311+ error(errorNode , moduleNotFoundError, moduleName);
13091312 }
13101313 return undefined;
13111314 }
@@ -17445,6 +17448,11 @@ namespace ts {
1744517448
1744617449 function isReferencedAliasDeclaration(node: Node, checkChildren?: boolean): boolean {
1744717450 node = getParseTreeNode(node);
17451+ // Purely synthesized nodes are always emitted.
17452+ if (node === undefined) {
17453+ return true;
17454+ }
17455+
1744817456 if (isAliasSymbolDeclaration(node)) {
1744917457 const symbol = getSymbolOfNode(node);
1745017458 if (symbol && getSymbolLinks(symbol).referenced) {
@@ -17759,27 +17767,37 @@ namespace ts {
1775917767
1776017768 function initializeTypeChecker() {
1776117769 // Bind all source files and propagate errors
17762- forEach( host.getSourceFiles(), file => {
17770+ for (const file of host.getSourceFiles()) {
1776317771 bindSourceFile(file, compilerOptions);
17764- });
17772+ }
1776517773
17766- let augmentations: LiteralExpression[][];
1776717774 // Initialize global symbol table
17768- forEach(host.getSourceFiles(), file => {
17775+ let augmentations: LiteralExpression[][];
17776+ let requestedExternalEmitHelpers: NodeFlags = 0;
17777+ let firstFileRequestingExternalHelpers: SourceFile;
17778+ for (const file of host.getSourceFiles()) {
1776917779 if (!isExternalOrCommonJsModule(file)) {
1777017780 mergeSymbolTable(globals, file.locals);
1777117781 }
1777217782 if (file.patternAmbientModules && file.patternAmbientModules.length) {
1777317783 patternAmbientModules = concatenate(patternAmbientModules, file.patternAmbientModules);
1777417784 }
17775-
1777617785 if (file.moduleAugmentations.length) {
1777717786 (augmentations || (augmentations = [])).push(file.moduleAugmentations);
1777817787 }
1777917788 if (file.symbol && file.symbol.globalExports) {
1778017789 mergeSymbolTable(globals, file.symbol.globalExports);
1778117790 }
17782- });
17791+ if ((compilerOptions.isolatedModules || isExternalModule(file)) && !file.isDeclarationFile) {
17792+ const fileRequestedExternalEmitHelpers = file.flags & NodeFlags.EmitHelperFlags;
17793+ if (fileRequestedExternalEmitHelpers) {
17794+ requestedExternalEmitHelpers |= fileRequestedExternalEmitHelpers;
17795+ if (firstFileRequestingExternalHelpers === undefined) {
17796+ firstFileRequestingExternalHelpers = file;
17797+ }
17798+ }
17799+ }
17800+ }
1778317801
1778417802 if (augmentations) {
1778517803 // merge module augmentations.
@@ -17842,6 +17860,48 @@ namespace ts {
1784217860 const symbol = getGlobalSymbol("ReadonlyArray", SymbolFlags.Type, /*diagnostic*/ undefined);
1784317861 globalReadonlyArrayType = symbol && <GenericType>getTypeOfGlobalSymbol(symbol, /*arity*/ 1);
1784417862 anyReadonlyArrayType = globalReadonlyArrayType ? createTypeFromGenericGlobalType(globalReadonlyArrayType, [anyType]) : anyArrayType;
17863+
17864+ // If we have specified that we are importing helpers, we should report global
17865+ // errors if we cannot resolve the helpers external module, or if it does not have
17866+ // the necessary helpers exported.
17867+ if (compilerOptions.importHelpers && firstFileRequestingExternalHelpers) {
17868+ // Find the first reference to the helpers module.
17869+ const helpersModule = resolveExternalModule(
17870+ firstFileRequestingExternalHelpers,
17871+ externalHelpersModuleNameText,
17872+ Diagnostics.Cannot_find_module_0,
17873+ /*errorNode*/ undefined);
17874+
17875+ // If we found the module, report errors if it does not have the necessary exports.
17876+ if (helpersModule) {
17877+ const exports = helpersModule.exports;
17878+ if (requestedExternalEmitHelpers & NodeFlags.HasClassExtends && languageVersion < ScriptTarget.ES6) {
17879+ verifyHelperSymbol(exports, "__extends", SymbolFlags.Value);
17880+ }
17881+ if (requestedExternalEmitHelpers & NodeFlags.HasJsxSpreadAttributes && compilerOptions.jsx !== JsxEmit.Preserve) {
17882+ verifyHelperSymbol(exports, "__assign", SymbolFlags.Value);
17883+ }
17884+ if (requestedExternalEmitHelpers & NodeFlags.HasDecorators) {
17885+ verifyHelperSymbol(exports, "__decorate", SymbolFlags.Value);
17886+ if (compilerOptions.emitDecoratorMetadata) {
17887+ verifyHelperSymbol(exports, "__metadata", SymbolFlags.Value);
17888+ }
17889+ }
17890+ if (requestedExternalEmitHelpers & NodeFlags.HasParamDecorators) {
17891+ verifyHelperSymbol(exports, "__param", SymbolFlags.Value);
17892+ }
17893+ if (requestedExternalEmitHelpers & NodeFlags.HasAsyncFunctions) {
17894+ verifyHelperSymbol(exports, "__awaiter", SymbolFlags.Value);
17895+ }
17896+ }
17897+ }
17898+ }
17899+
17900+ function verifyHelperSymbol(symbols: SymbolTable, name: string, meaning: SymbolFlags) {
17901+ const symbol = getSymbol(symbols, escapeIdentifier(name), meaning);
17902+ if (!symbol) {
17903+ error(/*location*/ undefined, Diagnostics.Module_0_has_no_exported_member_1, externalHelpersModuleNameText, name);
17904+ }
1784517905 }
1784617906
1784717907 function createInstantiatedPromiseLikeType(): ObjectType {
0 commit comments