diff --git a/packages/typescript/src/options/validate.ts b/packages/typescript/src/options/validate.ts index d0f22e3de..ae53834a3 100644 --- a/packages/typescript/src/options/validate.ts +++ b/packages/typescript/src/options/validate.ts @@ -58,13 +58,16 @@ export function validatePaths( for (const dirProperty of DIRECTORY_PROPS) { if (compilerOptions[dirProperty] && outputDir) { // Checks if the given path lies within Rollup output dir - const fromRollupDirToTs = relative(outputDir, compilerOptions[dirProperty]!); - if (fromRollupDirToTs.startsWith('..')) { - if (outputOptions.dir) { + if (outputOptions.dir) { + const fromRollupDirToTs = relative(outputDir, compilerOptions[dirProperty]!); + if (fromRollupDirToTs.startsWith('..')) { context.error( `@rollup/plugin-typescript: Path of Typescript compiler option '${dirProperty}' must be located inside Rollup 'dir' option.` ); - } else { + } + } else { + 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.` ); diff --git a/packages/typescript/test/test.js b/packages/typescript/test/test.js index efed9b397..e0b83fd0d 100644 --- a/packages/typescript/test/test.js +++ b/packages/typescript/test/test.js @@ -129,6 +129,36 @@ test.serial( } ); +test.serial( + 'ensures output files can be written to subdirectories within the tsconfig outDir', + async (t) => { + const warnings = []; + const outputOpts = { format: 'es', file: 'fixtures/basic/dist/esm/main.js' }; + const bundle = await rollup({ + input: 'fixtures/basic/main.ts', + output: outputOpts, + plugins: [ + typescript({ + tsconfig: 'fixtures/basic/tsconfig.json', + outDir: 'fixtures/basic/dist' + }) + ], + onwarn(warning) { + warnings.push(warning); + } + }); + + // This should not throw an error + const output = await getFiles(bundle, outputOpts); + + t.deepEqual( + output.map((out) => out.fileName), + ['fixtures/basic/dist/esm/main.js'] + ); + t.is(warnings.length, 0); + } +); + test.serial('ensures multiple outputs can be built', async (t) => { // In a rollup.config.js we would pass an array // The rollup method that's exported as a library won't do that so we must make two calls