plugins
plugins copied to clipboard
[@rollup/plugin-typescript] tsconfig declarationDir is ignored when using single file output
- Rollup Plugin Name: plugin-typescript
- Rollup Plugin Version: 8.3.4
- Rollup Version: 2.77.2
- Operating System (or Browser): Windows
- Node Version: v14.19.1
- Link to reproduction (⚠️ read below): https://replit.com/@BobCarrot/rollup-plugin-typescript-declarationDir-error
Expected Behavior
Declarations generated at the specified location
Actual Behavior
Declarations generated at the same directory as the output file.
Additional Information
I'm using api-extractor to rollup d.ts files into a single one, so the declarations are output at a place that will be removed after
processing.
This works at version 8.3.1 with a problem that it generates file at relative location under output directory, that is when declarationDir
is types
and output.file is dist/index.js
, declarations will be under dist/types
. But after my collegue updated to 8.3.4 (by using ^8.3.1 in package.json), the behavior changes to that declarations generated at dist/
, and the build progress breaks since api-extractor can't find the desired entry for d.ts rollup.
Also confirmed.
In tsconfig.json
I have: "declaration": false
and in rollup.config.js
I got
typescript({
compilerOptions: { declaration: true, declarationDir: './types' }
}),
When rollup runs declaration file(s) are placed in the output directory and not specified ('./types'
)
+1
@himanshuchawla009 please do not post "me too," "+1" type replies. They spam anyone who has notifications on for issues (e.g. all maintainers). Please use the reaction buttons on the original post in the issue instead.
I got the same issue with 8.3.4. Now I have to create new tsconfig.types.json with declaration config "compilerOptions": { "declaration": true, "declarationDir": "./dist/types", "emitDeclarationOnly": true, } then use tsc command to generate d.ts to specific folder. It works but it's ugly. Hope it could be fixed asap.
I got the issue as well. Reverting back to version 8.3.3 fixes the issue, so it seems it was introduced in the 8.3.4 release. The only change in that release is this; #1201, which may very well be the cause (also there's other people talking about problems there as well).
Easiest temporary fix for now: revert back to 8.3.3 and pin this version in your package.json.
I'm also having this problem with the latest version. And I think I found the problem with the recently merged PR #1201. Please correct me if my analysis is wrong.
https://github.com/rollup/plugins/blob/0bbb4fde7ea52f29769d630269982524e73a7ee9/packages/typescript/src/index.ts#L141-L155
Asumming the parsedOptions.options.declaration
is true and we're using single file output.
The outputOptions.dir
will be undefined
, and the baseDir
will be set to the parsedOptions.options.declarationDir
value or fallback to parsedOptions.options.outDir
if its not set (line 141).
And since baseDir
is now defined, the code generation will not be skipped and output files will be generated (line 149).
This seems to be a solid logic, however on line 153 the filename for the file being generated is normalized and make relative to the baseDir
.
https://github.com/rollup/plugins/blob/0bbb4fde7ea52f29769d630269982524e73a7ee9/packages/typescript/src/index.ts#L153
So for example, if user set declarationDir to types
, and foo/bar.d.ts
is to be generated then:
the expected filename relative to the output will be types/foo/bar.d.ts
but the actual filename instead foo/bar.d.ts
this is because:
baseDir = '/some/absolute/path/to/output/types'
id = '/some/absolute/path/to/output/types/foo/bar.d.ts'
filename = relative(baseDir, id) => 'foo/bar.d.ts'
we can see, that whatever value the declarationDir
holds will be useless in single file output since the final filename will always be made relative to the declarationDir
itself.
This appears to still be an issue as of the latest version, v9.0.0
. Locking the version to 8.3.3
seems to be the only way to keep the original behavior working.
I found that there will be similar problems in the case of multi-file output
rollup.config.js
output: [
{
dir: 'dist/cjs',
format: 'cjs'
},
{
dir: 'dist/es',
format: 'es'
},
],
tsconfig.json
compilerOptions: {
declaration: true,
declarationDir: "dist/types"
},
the error log
@rollup/plugin-typescript: Path of Typescript compiler option 'declarationDir' must be located inside Rollup 'dir' option.
Is this caused by the same problem?
Hey folks. This issue hasn't received any traction for 60 days, so we're going to close this for housekeeping. If this is still an ongoing issue, please do consider contributing a Pull Request to resolve it. Further discussion is always welcome even with the issue closed. If anything actionable is posted in the comments, we'll consider reopening it. ⓘ
Did this ever get fixed? Or still just sticking with old rollup version for now?
I'm sticking with the old one at present. I don't believe I saw anything about this getting fixed...
Did this ever get fixed? Or still just sticking with old rollup version for now?
I use a a hack way to avoid error . use ts to generate .d.ts . use rollup to build ......
+1 to get this fixed in the latest Rollup version 🙏
After some debugging, I've noticed that this issue comes up if you have a subfolder for the dir
property.
E.g this is the config we had
output: [
{
file: pkg.main,
format: 'cjs',
exports: 'named',
sourcemap: true,
},
{
dir: 'build/esm',
format: 'esm',
exports: 'named',
sourcemap: true,
preserveModules: true,
preserveModulesRoot: 'src',
},
],
The error went away when I changed build/esm
to just build
Has this problem been solved yet