diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index c934b723a4e..4746257fb82 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -572,6 +572,12 @@ namespace ts { if (bundleFileInfo) { bundleFileInfo.sections.push({ pos, end: writer.getTextPos(), kind: BundleFileSectionKind.Text }); // Source file metadata if needed later on + + // Store helpes + const helpers = getHelpersFromBundledSourceFiles(bundle); + if (helpers) { + bundleFileInfo.sources.helpers = helpers; + } } reset(); @@ -1142,6 +1148,27 @@ namespace ts { pipelinePhase(hint, substituteNode(hint, node)); } + function getHelpersFromBundledSourceFiles(bundle: Bundle): string[] | undefined { + let result: string[] | undefined; + if (moduleKind === ModuleKind.None || printerOptions.noEmitHelpers) { + return undefined; + } + const bundledHelpers = createMap(); + for (const sourceFile of bundle.sourceFiles) { + const shouldSkip = getExternalHelpersModuleName(sourceFile) !== undefined; + const helpers = getSortedEmitHelpers(sourceFile); + if (!helpers) continue; + for (const helper of helpers) { + if (!helper.scoped && !shouldSkip && !bundledHelpers.get(helper.name)) { + bundledHelpers.set(helper.name, true); + (result || (result = [])).push(helper.name); + } + } + } + + return result; + } + function emitHelpers(node: Node) { let helpersEmitted = false; const bundle = node.kind === SyntaxKind.Bundle ? node : undefined; diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 25c77198255..e44e424da96 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -5529,6 +5529,8 @@ namespace ts { /*@internal*/ export interface SourceFileInfo { + // List of helpers in own source files emitted if no prepend is present + helpers?: string[]; } /*@internal*/ diff --git a/tests/baselines/reference/tsbuild/outFile/incremental-declaration-changes/buildInfo/emitHelpers-in-all-projects.js b/tests/baselines/reference/tsbuild/outFile/incremental-declaration-changes/buildInfo/emitHelpers-in-all-projects.js index a32384c833f..27aeec430fd 100644 --- a/tests/baselines/reference/tsbuild/outFile/incremental-declaration-changes/buildInfo/emitHelpers-in-all-projects.js +++ b/tests/baselines/reference/tsbuild/outFile/incremental-declaration-changes/buildInfo/emitHelpers-in-all-projects.js @@ -31,7 +31,11 @@ } ], "commonSourceDirectory": "/src/first/", - "sources": {} + "sources": { + "helpers": [ + "typescript:rest" + ] + } } //// [/src/first/bin/first-output.d.ts] @@ -498,7 +502,11 @@ const { b, ...rest } = { a: 10, b: 30, yy: 30 }; } ], "commonSourceDirectory": "/src/third/", - "sources": {} + "sources": { + "helpers": [ + "typescript:rest" + ] + } } //// [/src/third/thirdjs/output/third-output.d.ts] diff --git a/tests/baselines/reference/tsbuild/outFile/incremental-declaration-changes/buildInfo/multiple-emitHelpers-in-all-projects.js b/tests/baselines/reference/tsbuild/outFile/incremental-declaration-changes/buildInfo/multiple-emitHelpers-in-all-projects.js index 32ee76a1244..90ade00d108 100644 --- a/tests/baselines/reference/tsbuild/outFile/incremental-declaration-changes/buildInfo/multiple-emitHelpers-in-all-projects.js +++ b/tests/baselines/reference/tsbuild/outFile/incremental-declaration-changes/buildInfo/multiple-emitHelpers-in-all-projects.js @@ -43,7 +43,13 @@ } ], "commonSourceDirectory": "/src/first/", - "sources": {} + "sources": { + "helpers": [ + "typescript:rest", + "typescript:read", + "typescript:spread" + ] + } } //// [/src/first/bin/first-output.d.ts] @@ -695,7 +701,13 @@ const { b, ...rest } = { a: 10, b: 30, yy: 30 }; } ], "commonSourceDirectory": "/src/third/", - "sources": {} + "sources": { + "helpers": [ + "typescript:rest", + "typescript:read", + "typescript:spread" + ] + } } //// [/src/third/thirdjs/output/third-output.d.ts] diff --git a/tests/baselines/reference/tsbuild/outFile/incremental-declaration-changes/buildInfo/multiple-emitHelpers-in-different-projects.js b/tests/baselines/reference/tsbuild/outFile/incremental-declaration-changes/buildInfo/multiple-emitHelpers-in-different-projects.js index d7e0e547163..22d143ba62f 100644 --- a/tests/baselines/reference/tsbuild/outFile/incremental-declaration-changes/buildInfo/multiple-emitHelpers-in-different-projects.js +++ b/tests/baselines/reference/tsbuild/outFile/incremental-declaration-changes/buildInfo/multiple-emitHelpers-in-different-projects.js @@ -31,7 +31,11 @@ } ], "commonSourceDirectory": "/src/first/", - "sources": {} + "sources": { + "helpers": [ + "typescript:rest" + ] + } } //// [/src/first/bin/first-output.d.ts] @@ -510,7 +514,11 @@ const { b, ...rest } = { a: 10, b: 30, yy: 30 }; } ], "commonSourceDirectory": "/src/third/", - "sources": {} + "sources": { + "helpers": [ + "typescript:rest" + ] + } } //// [/src/third/thirdjs/output/third-output.d.ts] diff --git a/tests/baselines/reference/tsbuild/outFile/incremental-declaration-doesnt-change/buildInfo/emitHelpers-in-all-projects.js b/tests/baselines/reference/tsbuild/outFile/incremental-declaration-doesnt-change/buildInfo/emitHelpers-in-all-projects.js index b780822614c..2690ef694b6 100644 --- a/tests/baselines/reference/tsbuild/outFile/incremental-declaration-doesnt-change/buildInfo/emitHelpers-in-all-projects.js +++ b/tests/baselines/reference/tsbuild/outFile/incremental-declaration-doesnt-change/buildInfo/emitHelpers-in-all-projects.js @@ -31,7 +31,11 @@ } ], "commonSourceDirectory": "/src/first/", - "sources": {} + "sources": { + "helpers": [ + "typescript:rest" + ] + } } //// [/src/first/bin/first-output.js] @@ -362,7 +366,11 @@ const { b, ...rest } = { a: 10, b: 30, yy: 30 }; } ], "commonSourceDirectory": "/src/third/", - "sources": {} + "sources": { + "helpers": [ + "typescript:rest" + ] + } } //// [/src/third/thirdjs/output/third-output.js] diff --git a/tests/baselines/reference/tsbuild/outFile/incremental-declaration-doesnt-change/buildInfo/multiple-emitHelpers-in-all-projects.js b/tests/baselines/reference/tsbuild/outFile/incremental-declaration-doesnt-change/buildInfo/multiple-emitHelpers-in-all-projects.js index b883e60f929..a80d7fc8450 100644 --- a/tests/baselines/reference/tsbuild/outFile/incremental-declaration-doesnt-change/buildInfo/multiple-emitHelpers-in-all-projects.js +++ b/tests/baselines/reference/tsbuild/outFile/incremental-declaration-doesnt-change/buildInfo/multiple-emitHelpers-in-all-projects.js @@ -43,7 +43,13 @@ } ], "commonSourceDirectory": "/src/first/", - "sources": {} + "sources": { + "helpers": [ + "typescript:rest", + "typescript:read", + "typescript:spread" + ] + } } //// [/src/first/bin/first-output.js] @@ -528,7 +534,13 @@ const { b, ...rest } = { a: 10, b: 30, yy: 30 }; } ], "commonSourceDirectory": "/src/third/", - "sources": {} + "sources": { + "helpers": [ + "typescript:rest", + "typescript:read", + "typescript:spread" + ] + } } //// [/src/third/thirdjs/output/third-output.js] diff --git a/tests/baselines/reference/tsbuild/outFile/incremental-declaration-doesnt-change/buildInfo/multiple-emitHelpers-in-different-projects.js b/tests/baselines/reference/tsbuild/outFile/incremental-declaration-doesnt-change/buildInfo/multiple-emitHelpers-in-different-projects.js index af0c117b743..53886c4aab3 100644 --- a/tests/baselines/reference/tsbuild/outFile/incremental-declaration-doesnt-change/buildInfo/multiple-emitHelpers-in-different-projects.js +++ b/tests/baselines/reference/tsbuild/outFile/incremental-declaration-doesnt-change/buildInfo/multiple-emitHelpers-in-different-projects.js @@ -31,7 +31,11 @@ } ], "commonSourceDirectory": "/src/first/", - "sources": {} + "sources": { + "helpers": [ + "typescript:rest" + ] + } } //// [/src/first/bin/first-output.js] @@ -374,7 +378,11 @@ const { b, ...rest } = { a: 10, b: 30, yy: 30 }; } ], "commonSourceDirectory": "/src/third/", - "sources": {} + "sources": { + "helpers": [ + "typescript:rest" + ] + } } //// [/src/third/thirdjs/output/third-output.js] diff --git a/tests/baselines/reference/tsbuild/outFile/incremental-headers-change/buildInfo/emitHelpers-in-all-projects.js b/tests/baselines/reference/tsbuild/outFile/incremental-headers-change/buildInfo/emitHelpers-in-all-projects.js index 1ac6631bb80..fe72876dd0f 100644 --- a/tests/baselines/reference/tsbuild/outFile/incremental-headers-change/buildInfo/emitHelpers-in-all-projects.js +++ b/tests/baselines/reference/tsbuild/outFile/incremental-headers-change/buildInfo/emitHelpers-in-all-projects.js @@ -424,7 +424,11 @@ function forfirstfirst_PART1Rest() { } } ], "commonSourceDirectory": "/src/third/", - "sources": {} + "sources": { + "helpers": [ + "typescript:rest" + ] + } } //// [/src/third/thirdjs/output/third-output.d.ts.map] diff --git a/tests/baselines/reference/tsbuild/outFile/incremental-headers-change/buildInfo/emitHelpers-in-only-one-dependency-project.js b/tests/baselines/reference/tsbuild/outFile/incremental-headers-change/buildInfo/emitHelpers-in-only-one-dependency-project.js index 36cfd84683c..0d56046dbc6 100644 --- a/tests/baselines/reference/tsbuild/outFile/incremental-headers-change/buildInfo/emitHelpers-in-only-one-dependency-project.js +++ b/tests/baselines/reference/tsbuild/outFile/incremental-headers-change/buildInfo/emitHelpers-in-only-one-dependency-project.js @@ -31,7 +31,11 @@ } ], "commonSourceDirectory": "/src/first/", - "sources": {} + "sources": { + "helpers": [ + "typescript:rest" + ] + } } //// [/src/first/bin/first-output.d.ts.map] diff --git a/tests/baselines/reference/tsbuild/outFile/incremental-headers-change/buildInfo/multiple-emitHelpers-in-all-projects.js b/tests/baselines/reference/tsbuild/outFile/incremental-headers-change/buildInfo/multiple-emitHelpers-in-all-projects.js index 02680e1a053..449d04dc6f9 100644 --- a/tests/baselines/reference/tsbuild/outFile/incremental-headers-change/buildInfo/multiple-emitHelpers-in-all-projects.js +++ b/tests/baselines/reference/tsbuild/outFile/incremental-headers-change/buildInfo/multiple-emitHelpers-in-all-projects.js @@ -37,7 +37,12 @@ } ], "commonSourceDirectory": "/src/first/", - "sources": {} + "sources": { + "helpers": [ + "typescript:read", + "typescript:spread" + ] + } } //// [/src/first/bin/first-output.d.ts.map] @@ -620,7 +625,13 @@ function forfirstfirst_PART1Rest() { } } ], "commonSourceDirectory": "/src/third/", - "sources": {} + "sources": { + "helpers": [ + "typescript:rest", + "typescript:read", + "typescript:spread" + ] + } } //// [/src/third/thirdjs/output/third-output.d.ts.map] diff --git a/tests/baselines/reference/tsbuild/outFile/incremental-headers-change/buildInfo/multiple-emitHelpers-in-different-projects.js b/tests/baselines/reference/tsbuild/outFile/incremental-headers-change/buildInfo/multiple-emitHelpers-in-different-projects.js index 01da4e074f8..f794740c851 100644 --- a/tests/baselines/reference/tsbuild/outFile/incremental-headers-change/buildInfo/multiple-emitHelpers-in-different-projects.js +++ b/tests/baselines/reference/tsbuild/outFile/incremental-headers-change/buildInfo/multiple-emitHelpers-in-different-projects.js @@ -436,7 +436,11 @@ function forfirstfirst_PART1Rest() { } } ], "commonSourceDirectory": "/src/third/", - "sources": {} + "sources": { + "helpers": [ + "typescript:rest" + ] + } } //// [/src/third/thirdjs/output/third-output.d.ts.map] diff --git a/tests/baselines/reference/tsbuild/outFile/initial-Build/buildInfo/emitHelpers-in-all-projects.js b/tests/baselines/reference/tsbuild/outFile/initial-Build/buildInfo/emitHelpers-in-all-projects.js index 0ef10cf99fc..8764b2fad3a 100644 --- a/tests/baselines/reference/tsbuild/outFile/initial-Build/buildInfo/emitHelpers-in-all-projects.js +++ b/tests/baselines/reference/tsbuild/outFile/initial-Build/buildInfo/emitHelpers-in-all-projects.js @@ -31,7 +31,11 @@ } ], "commonSourceDirectory": "/src/second/", - "sources": {} + "sources": { + "helpers": [ + "typescript:rest" + ] + } } //// [/src/2/second-output.d.ts] @@ -541,7 +545,11 @@ sourceFile:../second/second_part2.ts } ], "commonSourceDirectory": "/src/first/", - "sources": {} + "sources": { + "helpers": [ + "typescript:rest" + ] + } } //// [/src/first/bin/first-output.d.ts] @@ -1024,7 +1032,11 @@ const { b, ...rest } = { a: 10, b: 30, yy: 30 }; } ], "commonSourceDirectory": "/src/third/", - "sources": {} + "sources": { + "helpers": [ + "typescript:rest" + ] + } } //// [/src/third/thirdjs/output/third-output.d.ts] diff --git a/tests/baselines/reference/tsbuild/outFile/initial-Build/buildInfo/emitHelpers-in-only-one-dependency-project.js b/tests/baselines/reference/tsbuild/outFile/initial-Build/buildInfo/emitHelpers-in-only-one-dependency-project.js index a2725903e39..84b77aac864 100644 --- a/tests/baselines/reference/tsbuild/outFile/initial-Build/buildInfo/emitHelpers-in-only-one-dependency-project.js +++ b/tests/baselines/reference/tsbuild/outFile/initial-Build/buildInfo/emitHelpers-in-only-one-dependency-project.js @@ -31,7 +31,11 @@ } ], "commonSourceDirectory": "/src/second/", - "sources": {} + "sources": { + "helpers": [ + "typescript:rest" + ] + } } //// [/src/2/second-output.d.ts] diff --git a/tests/baselines/reference/tsbuild/outFile/initial-Build/buildInfo/multiple-emitHelpers-in-all-projects.js b/tests/baselines/reference/tsbuild/outFile/initial-Build/buildInfo/multiple-emitHelpers-in-all-projects.js index 937f056b7c7..1fbcac58228 100644 --- a/tests/baselines/reference/tsbuild/outFile/initial-Build/buildInfo/multiple-emitHelpers-in-all-projects.js +++ b/tests/baselines/reference/tsbuild/outFile/initial-Build/buildInfo/multiple-emitHelpers-in-all-projects.js @@ -43,7 +43,13 @@ } ], "commonSourceDirectory": "/src/second/", - "sources": {} + "sources": { + "helpers": [ + "typescript:rest", + "typescript:read", + "typescript:spread" + ] + } } //// [/src/2/second-output.d.ts] @@ -740,7 +746,13 @@ sourceFile:../second/second_part2.ts } ], "commonSourceDirectory": "/src/first/", - "sources": {} + "sources": { + "helpers": [ + "typescript:rest", + "typescript:read", + "typescript:spread" + ] + } } //// [/src/first/bin/first-output.d.ts] @@ -1467,7 +1479,13 @@ secondsecond_part2Spread(...[10, 20, 30]); } ], "commonSourceDirectory": "/src/third/", - "sources": {} + "sources": { + "helpers": [ + "typescript:rest", + "typescript:read", + "typescript:spread" + ] + } } //// [/src/third/thirdjs/output/third-output.d.ts] diff --git a/tests/baselines/reference/tsbuild/outFile/initial-Build/buildInfo/multiple-emitHelpers-in-different-projects.js b/tests/baselines/reference/tsbuild/outFile/initial-Build/buildInfo/multiple-emitHelpers-in-different-projects.js index f95dd8282e6..45e6d20311a 100644 --- a/tests/baselines/reference/tsbuild/outFile/initial-Build/buildInfo/multiple-emitHelpers-in-different-projects.js +++ b/tests/baselines/reference/tsbuild/outFile/initial-Build/buildInfo/multiple-emitHelpers-in-different-projects.js @@ -37,7 +37,12 @@ } ], "commonSourceDirectory": "/src/second/", - "sources": {} + "sources": { + "helpers": [ + "typescript:read", + "typescript:spread" + ] + } } //// [/src/2/second-output.d.ts] @@ -633,7 +638,11 @@ sourceFile:../second/second_part2.ts } ], "commonSourceDirectory": "/src/first/", - "sources": {} + "sources": { + "helpers": [ + "typescript:rest" + ] + } } //// [/src/first/bin/first-output.d.ts] @@ -1147,7 +1156,11 @@ secondsecond_part1Spread(...[10, 20, 30]); } ], "commonSourceDirectory": "/src/third/", - "sources": {} + "sources": { + "helpers": [ + "typescript:rest" + ] + } } //// [/src/third/thirdjs/output/third-output.d.ts]