@@ -17767,27 +17767,37 @@ namespace ts {
17767
17767
17768
17768
function initializeTypeChecker() {
17769
17769
// Bind all source files and propagate errors
17770
- forEach( host.getSourceFiles(), file => {
17770
+ for (const file of host.getSourceFiles()) {
17771
17771
bindSourceFile(file, compilerOptions);
17772
- });
17772
+ }
17773
17773
17774
- let augmentations: LiteralExpression[][];
17775
17774
// Initialize global symbol table
17776
- forEach(host.getSourceFiles(), file => {
17775
+ let augmentations: LiteralExpression[][];
17776
+ let requestedExternalEmitHelpers: NodeFlags = 0;
17777
+ let firstFileRequestingExternalHelpers: SourceFile;
17778
+ for (const file of host.getSourceFiles()) {
17777
17779
if (!isExternalOrCommonJsModule(file)) {
17778
17780
mergeSymbolTable(globals, file.locals);
17779
17781
}
17780
17782
if (file.patternAmbientModules && file.patternAmbientModules.length) {
17781
17783
patternAmbientModules = concatenate(patternAmbientModules, file.patternAmbientModules);
17782
17784
}
17783
-
17784
17785
if (file.moduleAugmentations.length) {
17785
17786
(augmentations || (augmentations = [])).push(file.moduleAugmentations);
17786
17787
}
17787
17788
if (file.symbol && file.symbol.globalExports) {
17788
17789
mergeSymbolTable(globals, file.symbol.globalExports);
17789
17790
}
17790
- });
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
+ }
17791
17801
17792
17802
if (augmentations) {
17793
17803
// merge module augmentations.
@@ -17854,34 +17864,36 @@ namespace ts {
17854
17864
// If we have specified that we are importing helpers, we should report global
17855
17865
// errors if we cannot resolve the helpers external module, or if it does not have
17856
17866
// the necessary helpers exported.
17857
- if (compilerOptions.importHelpers) {
17858
- forEach(host.getSourceFiles(), sourceFile => {
17859
- const requestedHelpers = sourceFile.flags & NodeFlags.EmitHelperFlags;
17860
- if (requestedHelpers && (compilerOptions.isolatedModules || isExternalModule(sourceFile))) {
17861
- const helpers = resolveExternalModule(sourceFile, externalHelpersModuleNameText, Diagnostics.Cannot_find_module_0, /*errorNode*/ undefined);
17862
- if (helpers) {
17863
- const exports = helpers.exports;
17864
- if (requestedHelpers & NodeFlags.HasClassExtends && languageVersion < ScriptTarget.ES6) {
17865
- verifyHelperSymbol(exports, "__extends", SymbolFlags.Value);
17866
- }
17867
- if (requestedHelpers & NodeFlags.HasJsxSpreadAttributes && compilerOptions.jsx !== JsxEmit.Preserve) {
17868
- verifyHelperSymbol(exports, "__assign", SymbolFlags.Value);
17869
- }
17870
- if (requestedHelpers & NodeFlags.HasDecorators) {
17871
- verifyHelperSymbol(exports, "__decorate", SymbolFlags.Value);
17872
- if (compilerOptions.emitDecoratorMetadata) {
17873
- verifyHelperSymbol(exports, "__metadata", SymbolFlags.Value);
17874
- }
17875
- }
17876
- if (requestedHelpers & NodeFlags.HasParamDecorators) {
17877
- verifyHelperSymbol(exports, "__param", SymbolFlags.Value);
17878
- }
17879
- if (requestedHelpers & NodeFlags.HasAsyncFunctions) {
17880
- verifyHelperSymbol(exports, "__awaiter", SymbolFlags.Value);
17881
- }
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);
17882
17888
}
17883
17889
}
17884
- });
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
+ }
17885
17897
}
17886
17898
}
17887
17899
0 commit comments