diff --git a/packages/typescript/src/options/validate.ts b/packages/typescript/src/options/validate.ts index ae53834a3..6c76c925a 100644 --- a/packages/typescript/src/options/validate.ts +++ b/packages/typescript/src/options/validate.ts @@ -65,13 +65,20 @@ export function validatePaths( `@rollup/plugin-typescript: Path of Typescript compiler option '${dirProperty}' must be located inside Rollup 'dir' option.` ); } - } else { + } else if (dirProperty === 'outDir') { const fromTsDirToRollup = relative(compilerOptions[dirProperty]!, outputDir); if (fromTsDirToRollup.startsWith('..')) { context.error( `@rollup/plugin-typescript: Path of Typescript compiler option '${dirProperty}' must be located inside the same directory as the Rollup 'file' option.` ); } + } else { + const fromTsDirToRollup = relative(outputDir, compilerOptions[dirProperty]!); + if (fromTsDirToRollup.startsWith('..')) { + context.error( + `@rollup/plugin-typescript: Path of Typescript compiler option '${dirProperty}' must be located inside the same directory as the Rollup 'file' option.` + ); + } } } } diff --git a/packages/typescript/test/test.js b/packages/typescript/test/test.js index e0b83fd0d..1758779f0 100644 --- a/packages/typescript/test/test.js +++ b/packages/typescript/test/test.js @@ -129,6 +129,28 @@ test.serial( } ); +test.serial( + 'ensures declarationDir is allowed in Rollup output directory when output.file is used', + async (t) => { + const bundle = await rollup({ + input: 'fixtures/basic/main.ts', + plugins: [ + typescript({ + tsconfig: 'fixtures/basic/tsconfig.json', + declarationDir: 'fixtures/basic/dist/other', + declaration: true + }) + ], + onwarn + }); + + // this should not throw an error + await t.notThrowsAsync(() => + getCode(bundle, { format: 'es', file: 'fixtures/basic/dist/index.js' }, true) + ); + } +); + test.serial( 'ensures output files can be written to subdirectories within the tsconfig outDir', async (t) => {