@@ -3634,6 +3634,7 @@ namespace ts {
36343634
36353635 export const valuesHelper : UnscopedEmitHelper = {
36363636 name : "typescript:values" ,
3637+ importName : "__values" ,
36373638 scoped : false ,
36383639 text : `
36393640 var __values = (this && this.__values) || function(o) {
@@ -3663,6 +3664,7 @@ namespace ts {
36633664
36643665 export const readHelper : UnscopedEmitHelper = {
36653666 name : "typescript:read" ,
3667+ importName : "__read" ,
36663668 scoped : false ,
36673669 text : `
36683670 var __read = (this && this.__read) || function (o, n) {
@@ -3699,6 +3701,7 @@ namespace ts {
36993701
37003702 export const spreadHelper : UnscopedEmitHelper = {
37013703 name : "typescript:spread" ,
3704+ importName : "__spread" ,
37023705 scoped : false ,
37033706 text : `
37043707 var __spread = (this && this.__spread) || function () {
@@ -3722,6 +3725,7 @@ namespace ts {
37223725
37233726 export const spreadArraysHelper : UnscopedEmitHelper = {
37243727 name : "typescript:spreadArrays" ,
3728+ importName : "__spreadArrays" ,
37253729 scoped : false ,
37263730 text : `
37273731 var __spreadArrays = (this && this.__spreadArrays) || function () {
@@ -4863,6 +4867,60 @@ namespace ts {
48634867 return emitNode && emitNode . externalHelpersModuleName ;
48644868 }
48654869
4870+ export function hasRecordedExternalHelpers ( sourceFile : SourceFile ) {
4871+ const parseNode = getOriginalNode ( sourceFile , isSourceFile ) ;
4872+ const emitNode = parseNode && parseNode . emitNode ;
4873+ return ! ! emitNode && ( ! ! emitNode . externalHelpersModuleName || ! ! emitNode . externalHelpers ) ;
4874+ }
4875+
4876+ export function createExternalHelpersImportDeclarationIfNeeded ( sourceFile : SourceFile , compilerOptions : CompilerOptions , hasExportStarsToExportValues ?: boolean , hasImportStar ?: boolean , hasImportDefault ?: boolean ) {
4877+ if ( compilerOptions . importHelpers && isEffectiveExternalModule ( sourceFile , compilerOptions ) ) {
4878+ let namedBindings : NamedImportBindings | undefined ;
4879+ const moduleKind = getEmitModuleKind ( compilerOptions ) ;
4880+ if ( moduleKind >= ModuleKind . ES2015 && moduleKind <= ModuleKind . ESNext ) {
4881+ // use named imports
4882+ const helpers = getEmitHelpers ( sourceFile ) ;
4883+ if ( helpers ) {
4884+ const helperNames : string [ ] = [ ] ;
4885+ for ( const helper of helpers ) {
4886+ if ( ! helper . scoped ) {
4887+ const importName = ( helper as UnscopedEmitHelper ) . importName ;
4888+ if ( importName ) {
4889+ pushIfUnique ( helperNames , importName ) ;
4890+ }
4891+ }
4892+ }
4893+ if ( some ( helperNames ) ) {
4894+ helperNames . sort ( compareStringsCaseSensitive ) ;
4895+ namedBindings = createNamedImports (
4896+ map ( helperNames , name => createImportSpecifier ( /*propertyName*/ undefined , createIdentifier ( name ) ) )
4897+ ) ;
4898+ const parseNode = getOriginalNode ( sourceFile , isSourceFile ) ;
4899+ const emitNode = getOrCreateEmitNode ( parseNode ) ;
4900+ emitNode . externalHelpers = true ;
4901+ }
4902+ }
4903+ }
4904+ else {
4905+ // use a namespace import
4906+ const externalHelpersModuleName = getOrCreateExternalHelpersModuleNameIfNeeded ( sourceFile , compilerOptions , hasExportStarsToExportValues , hasImportStar || hasImportDefault ) ;
4907+ if ( externalHelpersModuleName ) {
4908+ namedBindings = createNamespaceImport ( externalHelpersModuleName ) ;
4909+ }
4910+ }
4911+ if ( namedBindings ) {
4912+ const externalHelpersImportDeclaration = createImportDeclaration (
4913+ /*decorators*/ undefined ,
4914+ /*modifiers*/ undefined ,
4915+ createImportClause ( /*name*/ undefined , namedBindings ) ,
4916+ createLiteral ( externalHelpersModuleNameText )
4917+ ) ;
4918+ addEmitFlags ( externalHelpersImportDeclaration , EmitFlags . NeverApplyImportHelper ) ;
4919+ return externalHelpersImportDeclaration ;
4920+ }
4921+ }
4922+ }
4923+
48664924 export function getOrCreateExternalHelpersModuleNameIfNeeded ( node : SourceFile , compilerOptions : CompilerOptions , hasExportStarsToExportValues ?: boolean , hasImportStarOrImportDefault ?: boolean ) {
48674925 if ( compilerOptions . importHelpers && isEffectiveExternalModule ( node , compilerOptions ) ) {
48684926 const externalHelpersModuleName = getExternalHelpersModuleName ( node ) ;
0 commit comments