Skip to content

Commit

Permalink
fix(typescript): allow for files to be nested in folders within outDir (
Browse files Browse the repository at this point in the history
#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
};
```
michaelfaith authored Oct 16, 2024
1 parent 4799541 commit cc55c44
Showing 2 changed files with 37 additions and 4 deletions.
11 changes: 7 additions & 4 deletions packages/typescript/src/options/validate.ts
Original file line number Diff line number Diff line change
@@ -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.`
);
30 changes: 30 additions & 0 deletions packages/typescript/test/test.js
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit cc55c44

Please sign in to comment.