Skip to content

Commit 06f453a

Browse files
committed
fix(external): respect 'external' option provided to Rollup and don't inline typings from modules matched by it
1 parent 2fb666b commit 06f453a

21 files changed

+331
-44
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
"eslint-config-prettier": "^6.11.0",
6666
"eslint-plugin-import": "^2.22.0",
6767
"eslint-plugin-jsdoc": "^30.0.3",
68+
"acorn": "^7.3.1",
6869
"fast-glob": "^3.2.4",
6970
"husky": "^4.2.5",
7071
"np": "5.2.1",

pnpm-lock.yaml

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/index.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
export {CustomTransformerOptions, CustomTransformersFunction} from "./util/merge-transformers/custom-transformer-options";
2-
export {default} from "./plugin/typescript-plugin";
1+
export * from "./util/merge-transformers/custom-transformer-options";
2+
export * from "./type/declaration-stats";
3+
34
export {
45
TypescriptPluginOptions,
56
BrowserslistConfig,
@@ -8,3 +9,5 @@ export {
89
TypescriptPluginBabelOptions,
910
TypescriptPluginTypescriptOptions
1011
} from "./plugin/typescript-plugin-options";
12+
13+
export {default} from "./plugin/typescript-plugin";

src/plugin/typescript-plugin.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ export default function typescriptRollupPlugin(pluginInputOptions: Partial<Types
157157
fileSystem,
158158
typescript,
159159
extensions: SUPPORTED_EXTENSIONS,
160+
externalOption: rollupInputOptions.external,
160161
parsedCommandLineResult,
161162
transformers: mergeTransformers(...transformers)
162163
});
@@ -369,6 +370,7 @@ export default function typescriptRollupPlugin(pluginInputOptions: Partial<Types
369370
emitDeclarations({
370371
host,
371372
bundle,
373+
externalOption: rollupInputOptions.external,
372374
outputOptions,
373375
pluginOptions,
374376
pluginContext: this,

src/service/compiler-host/compiler-host.ts

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import {TS} from "../../type/ts";
22
import {CompilerHostOptions, CustomTransformersInput} from "./compiler-host-options";
33
import {ModuleResolutionHost} from "../module-resolution-host/module-resolution-host";
4-
import {dirname, ensureAbsolute, getExtension, isTypeScriptLib, join, nativeNormalize, normalize} from "../../util/path/path-util";
4+
import {dirname, ensureAbsolute, getExtension, isExternal, isTypeScriptLib, join, nativeNormalize, normalize} from "../../util/path/path-util";
55
import {getNewLineCharacter} from "../../util/get-new-line-character/get-new-line-character";
66
import {resolveId} from "../../util/resolve-id/resolve-id";
77
import {getScriptKindFromPath} from "../../util/get-script-kind-from-path/get-script-kind-from-path";
@@ -10,7 +10,8 @@ import {mergeTransformers} from "../../util/merge-transformers/merge-transformer
1010
import {ensureModuleTransformer} from "../transformer/ensure-module/ensure-module-transformer";
1111
import {SourceFileToDependenciesMap} from "../transformer/declaration-bundler/declaration-bundler-options";
1212
import {ExtendedResolvedModule} from "../cache/resolve-cache/extended-resolved-module";
13-
import {getModuleDependencies} from "../../util/get-module-dependencies/get-module-dependencies";
13+
import {getModuleDependencies, ModuleDependency} from "../../util/get-module-dependencies/get-module-dependencies";
14+
import {pickResolvedModule} from "../../util/pick-resolved-module";
1415

1516
export class CompilerHost extends ModuleResolutionHost implements TS.CompilerHost {
1617
private previousProgram: TS.EmitAndSemanticDiagnosticsBuilderProgram | undefined;
@@ -21,6 +22,7 @@ export class CompilerHost extends ModuleResolutionHost implements TS.CompilerHos
2122
private emitOutput: TS.EmitOutput | undefined;
2223
private creatingProgram = false;
2324
private invalidateProgram = false;
25+
private readonly externalFiles = new Set<string>();
2426

2527
constructor(
2628
protected readonly options: CompilerHostOptions,
@@ -202,7 +204,7 @@ export class CompilerHost extends ModuleResolutionHost implements TS.CompilerHos
202204
return this.options.transformers;
203205
}
204206

205-
private getDependenciesForFileDeep(fileName: string, dependencies: Set<ExtendedResolvedModule> = new Set(), seenModules: Set<string> = new Set()): Set<ExtendedResolvedModule> {
207+
private getDependenciesForFileDeep(fileName: string, dependencies: Set<ModuleDependency> = new Set(), seenModules: Set<string> = new Set()): Set<ModuleDependency> {
206208
if (seenModules.has(fileName)) return dependencies;
207209
seenModules.add(fileName);
208210
const localDependencies = this.sourceFileToDependenciesMap.get(fileName);
@@ -225,7 +227,7 @@ export class CompilerHost extends ModuleResolutionHost implements TS.CompilerHos
225227
return dependencies;
226228
}
227229

228-
getDependenciesForFile(fileName: string, deep = false): Set<ExtendedResolvedModule> | undefined {
230+
getDependenciesForFile(fileName: string, deep = false): Set<ModuleDependency> | undefined {
229231
if (deep) {
230232
return this.getDependenciesForFileDeep(fileName);
231233
}
@@ -236,7 +238,7 @@ export class CompilerHost extends ModuleResolutionHost implements TS.CompilerHos
236238
return this.sourceFileToDependenciesMap;
237239
}
238240

239-
add(fileInput: VirtualFileInput | VirtualFile): VirtualFile {
241+
add(fileInput: VirtualFileInput | VirtualFile, traceDependencies = true): VirtualFile {
240242
const existing = this.get(fileInput.fileName);
241243
if (existing != null && existing.text === fileInput.text) {
242244
return existing;
@@ -255,12 +257,15 @@ export class CompilerHost extends ModuleResolutionHost implements TS.CompilerHos
255257
}
256258

257259
const addedFile = super.add(fileInput);
258-
this.refreshDependenciesForFileName(fileInput.fileName);
260+
if (traceDependencies) {
261+
this.refreshDependenciesForFileName(fileInput.fileName);
262+
}
263+
259264
return addedFile;
260265
}
261266

262267
private refreshDependenciesForFileName(fileName: string, seenModules: Set<string> = new Set()): void {
263-
if (seenModules.has(fileName)) return;
268+
if (seenModules.has(fileName) || this.externalFiles.has(fileName)) return;
264269
seenModules.add(fileName);
265270

266271
const dependencies = getModuleDependencies({
@@ -272,6 +277,13 @@ export class CompilerHost extends ModuleResolutionHost implements TS.CompilerHos
272277
this.sourceFileToDependenciesMap.set(fileName, dependencies);
273278

274279
for (const resolveResult of dependencies) {
280+
// Don't perform a recursive descent into the files that are external
281+
if (isExternal(resolveResult.moduleSpecifier, fileName, this.options.externalOption)) {
282+
// Mark the module as external
283+
this.externalFiles.add(pickResolvedModule(resolveResult, true));
284+
continue;
285+
}
286+
275287
for (const module of [resolveResult.resolvedFileName, resolveResult.resolvedAmbientFileName]) {
276288
if (module == null) continue;
277289
this.refreshDependenciesForFileName(module, seenModules);
@@ -364,7 +376,8 @@ export class CompilerHost extends ModuleResolutionHost implements TS.CompilerHos
364376
if (file == null) {
365377
const text = this.readFile(absoluteFileName);
366378
if (text == null) return undefined;
367-
file = this.add({fileName: absoluteFileName, text, fromRollup: false});
379+
380+
file = this.add({fileName: absoluteFileName, text, fromRollup: false}, false);
368381
}
369382

370383
const sourceFile = this.constructSourceFile(absoluteFileName, file.transformedText, languageVersion);

src/service/emit/declaration/emit-declarations.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {OutputBundle, OutputOptions, PluginContext} from "rollup";
1+
import {ExternalOption, OutputBundle, OutputOptions, PluginContext} from "rollup";
22
import {TypescriptPluginOptions} from "../../../plugin/typescript-plugin-options";
33
import {isOutputChunk} from "../../../util/is-output-chunk/is-output-chunk";
44
import {getDeclarationOutDir} from "../../../util/get-declaration-out-dir/get-declaration-out-dir";
@@ -22,6 +22,7 @@ export interface EmitDeclarationsOptions {
2222
bundle: OutputBundle;
2323
host: CompilerHost;
2424
pluginOptions: TypescriptPluginOptions;
25+
externalOption: ExternalOption | undefined;
2526
outputOptions: OutputOptions;
2627
multiEntryFileNames: Set<string> | undefined;
2728
originalCompilerOptions: TS.CompilerOptions;
@@ -37,7 +38,14 @@ export function emitDeclarations(options: EmitDeclarationsOptions): void {
3738
const chunks = Object.values(options.bundle).filter(isOutputChunk).map(preNormalizeChunk);
3839

3940
// Merge ambient dependencies into the chunks
40-
mergeChunksWithAmbientDependencies(chunks, options.host, options.outputOptions.format, options.outputOptions.chunkFileNames);
41+
mergeChunksWithAmbientDependencies({
42+
chunks,
43+
host: options.host,
44+
externalOption: options.externalOption,
45+
chunkFileNames: options.outputOptions.chunkFileNames,
46+
format: options.outputOptions.format
47+
});
48+
4149
// Normalize the chunks
4250
const normalizedChunks = chunks.map(chunk => normalizeChunk(chunk, {...options, relativeOutDir}));
4351

src/service/module-resolution-host/module-resolution-host-options.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ import {FileSystem} from "../../util/file-system/file-system";
22
import {TS} from "../../type/ts";
33
import {SupportedExtensions} from "../../util/get-supported-extensions/get-supported-extensions";
44
import {ParsedCommandLineResult} from "../../util/get-parsed-command-line/parsed-command-line-result";
5+
import {ExternalOption} from "rollup";
56

67
export interface ModuleResolutionHostOptions {
78
typescript: typeof TS;
89
parsedCommandLineResult: ParsedCommandLineResult;
910
extensions: SupportedExtensions;
11+
externalOption: ExternalOption | undefined;
1012
fileSystem: FileSystem;
1113
cwd: string;
1214
}

src/service/transformer/declaration-bundler/declaration-bundler-options.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ import {CompilerHost} from "../../compiler-host/compiler-host";
77
import {PathsResult} from "./util/prepare-paths/prepare-paths";
88
import {SourceFileToExportedSymbolSet} from "./transformers/track-exports-transformer/track-exports-transformer-visitor-options";
99
import {SourceFileToImportedSymbolSet} from "./transformers/track-imports-transformer/track-imports-transformer-visitor-options";
10-
import {ExtendedResolvedModule} from "../../cache/resolve-cache/extended-resolved-module";
1110
import {TypeReference} from "./util/get-type-reference-module-from-file-name";
1211
import {DeclarationStats} from "../../../type/declaration-stats";
12+
import {ModuleDependency} from "../../../util/get-module-dependencies/get-module-dependencies";
1313

14-
export type SourceFileToDependenciesMap = Map<string, Set<ExtendedResolvedModule>>;
14+
export type SourceFileToDependenciesMap = Map<string, Set<ModuleDependency>>;
1515
export type ModuleSpecifierToSourceFileMap = Map<string, TS.SourceFile>;
1616
export type DeclarationTransformer = (options: SourceFileBundlerVisitorOptions) => TS.SourceFile;
1717

Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
import {TS} from "../../../../../type/ts";
2-
import {ExtendedResolvedModule} from "../../../../cache/resolve-cache/extended-resolved-module";
32
import {CompilerHost} from "../../../../compiler-host/compiler-host";
3+
import {ModuleDependency} from "../../../../../util/get-module-dependencies/get-module-dependencies";
44

55
export interface TrackDependenciesOptions {
66
host: CompilerHost;
7-
typescript: typeof TS;
87
sourceFile: TS.SourceFile;
98
}
109

1110
export interface TrackDependenciesTransformerVisitorOptions<T extends TS.Node> extends TrackDependenciesOptions {
1211
node: T;
1312
shouldDeepTraverse: boolean;
13+
typescript: typeof TS;
1414

1515
childContinuation<U extends TS.Node>(node: U): void;
1616
continuation<U extends TS.Node>(node: U): void;
17-
addDependency(module: ExtendedResolvedModule): void;
17+
addDependency(module: ModuleDependency): void;
1818
}

src/service/transformer/declaration-bundler/transformers/track-dependencies-transformer/track-dependencies-transformer.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
11
import {TS} from "../../../../../type/ts";
22
import {visitNode} from "./visitor/visit-node";
33
import {TrackDependenciesOptions, TrackDependenciesTransformerVisitorOptions} from "./track-dependencies-transformer-visitor-options";
4-
import {ExtendedResolvedModule} from "../../../../cache/resolve-cache/extended-resolved-module";
4+
import {ModuleDependency} from "../../../../../util/get-module-dependencies/get-module-dependencies";
55

6-
export function trackDependenciesTransformer(options: TrackDependenciesOptions): Set<ExtendedResolvedModule> {
7-
const {typescript} = options;
8-
const dependencies: Set<ExtendedResolvedModule> = new Set();
6+
export function trackDependenciesTransformer(options: TrackDependenciesOptions): Set<ModuleDependency> {
7+
const typescript = options.host.getTypescript();
8+
const dependencies: Set<ModuleDependency> = new Set();
99

1010
// Prepare some VisitorOptions
1111
const visitorOptions: Omit<TrackDependenciesTransformerVisitorOptions<TS.Node>, "node"> = {
1212
...options,
13+
typescript,
1314
// Optimization: We only need to traverse nested nodes inside of the SourceFile if it contains at least one ImportTypeNode (or at least what appears to be one)
1415
shouldDeepTraverse: options.sourceFile.text.includes("import("),
1516

16-
addDependency(resolvedModule: ExtendedResolvedModule): void {
17+
addDependency(resolvedModule: ModuleDependency): void {
1718
dependencies.add(resolvedModule);
1819
},
1920

0 commit comments

Comments
 (0)