diff --git a/packages/typescript/src/index.ts b/packages/typescript/src/index.ts index b7c4181fe..be243d23b 100644 --- a/packages/typescript/src/index.ts +++ b/packages/typescript/src/index.ts @@ -42,7 +42,7 @@ export default function typescript(options: RollupTypescriptOptions = {}): Plugi parsedOptions.fileNames = parsedOptions.fileNames.filter(filter); const formatHost = createFormattingHost(ts, parsedOptions.options); - const resolveModule = createModuleResolver(ts, formatHost); + const resolveModule = createModuleResolver(ts, formatHost, filter); let program: Watch | null = null; diff --git a/packages/typescript/src/moduleResolution.ts b/packages/typescript/src/moduleResolution.ts index 2351a1a02..97aa01e79 100644 --- a/packages/typescript/src/moduleResolution.ts +++ b/packages/typescript/src/moduleResolution.ts @@ -5,6 +5,7 @@ import type { ResolvedProjectReference, ModuleKind } from 'typescript'; +import type { CreateFilter } from '@rollup/pluginutils'; import type { DiagnosticsHost } from './diagnostics/host'; @@ -24,7 +25,8 @@ export type Resolver = ( */ export default function createModuleResolver( ts: typeof typescript, - host: ModuleResolverHost + host: ModuleResolverHost, + filter: ReturnType ): Resolver { const compilerOptions = host.getCompilationSettings(); const cache = ts.createModuleResolutionCache( @@ -35,7 +37,7 @@ export default function createModuleResolver( const moduleHost = { ...ts.sys, ...host }; return (moduleName, containingFile, redirectedReference, mode) => { - const resolved = ts.resolveModuleName( + const { resolvedModule } = ts.resolveModuleName( moduleName, containingFile, compilerOptions, @@ -44,6 +46,13 @@ export default function createModuleResolver( redirectedReference, mode ); - return resolved.resolvedModule; + /** + * If the module's path contains 'node_modules', ts considers it an external library and refuses to compile it, + * so we have to change the value of `isExternalLibraryImport` to false if it's true + * */ + if (resolvedModule?.isExternalLibraryImport && filter(resolvedModule?.resolvedFileName)) { + resolvedModule.isExternalLibraryImport = false; + } + return resolvedModule; }; } diff --git a/packages/typescript/test/fixtures/external-library-import/main.ts b/packages/typescript/test/fixtures/external-library-import/main.ts new file mode 100644 index 000000000..6baf4580a --- /dev/null +++ b/packages/typescript/test/fixtures/external-library-import/main.ts @@ -0,0 +1 @@ +export { dep } from './node_modules/dep'; diff --git a/packages/typescript/test/fixtures/external-library-import/node_modules/dep.ts b/packages/typescript/test/fixtures/external-library-import/node_modules/dep.ts new file mode 100644 index 000000000..e007767e4 --- /dev/null +++ b/packages/typescript/test/fixtures/external-library-import/node_modules/dep.ts @@ -0,0 +1 @@ +export const dep:number = 1; diff --git a/packages/typescript/test/fixtures/external-library-import/tsconfig.json b/packages/typescript/test/fixtures/external-library-import/tsconfig.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/packages/typescript/test/fixtures/external-library-import/tsconfig.json @@ -0,0 +1 @@ +{} diff --git a/packages/typescript/test/test.js b/packages/typescript/test/test.js index 58c5b6986..27cb33a10 100644 --- a/packages/typescript/test/test.js +++ b/packages/typescript/test/test.js @@ -1393,3 +1393,12 @@ test.serial('noForceEmit option defers to tsconfig.json for noEmit', async (t) = const originalCode = fs.readFileSync(path.join(__dirname, input), 'utf8'); t.is(output[0].code, originalCode); }); + +test.serial('compiled external library', async (t) => { + const input = 'fixtures/external-library-import/main.ts'; + await rollup({ + input, + plugins: [typescript({ tsconfig: 'fixtures/external-library-import/tsconfig.json' })] + }); + t.pass(); +});