From cc55c4403c69ddf20b6377dddbcd27f3523647ea Mon Sep 17 00:00:00 2001 From: michael faith Date: Tue, 15 Oct 2024 21:25:42 -0500 Subject: [PATCH] fix(typescript): allow for files to be nested in folders within outDir (#1783) fix(typescript): allow for files to be nested within outDir This change corrects a regression introduced by #1728, preventing dual bundle configs from writing output files to directories nested within the directory defined in the tsconfig's outDir property. Example: ```js export default { input: 'src/index.ts', // Replace with the path to your entry TypeScript file output: [ { dir: 'dist/cjs', format: 'cjs', sourcemap: true, preserveModules: true }, { dir: 'dist/esm', format: 'esm', sourcemap: true, preserveModules: true } ], plugins: [ json(), resolve(), commonjs(), typescript({ tsconfig: 'tsconfig.json', compilerOptions: { /* Basic Options */ target: 'ES5', module: 'ES2020', lib: ['ES2019', 'ES2020'], allowJs: true, checkJs: false, /* Strict Type-Checking Options */ strict: true, /* Module Resolution Options */ moduleResolution: 'node', esModuleInterop: true, /* Advanced Options */ forceConsistentCasingInFileNames: true, skipDefaultLibCheck: true, skipLibCheck: true, outDir: path.join(__dirname, 'dist') } }) ], external: deps // Add any external dependencies you don't want to bundle }; ``` --- packages/typescript/src/options/validate.ts | 11 +++++--- packages/typescript/test/test.js | 30 +++++++++++++++++++++ 2 files changed, 37 insertions(+), 4 deletions(-) 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