unjs / unbuild

📦 An unified javascript build system
MIT License
2.19k stars 84 forks source link

stubbed d.ts file should import file with extension in ESM package #370

Closed yshrsmz closed 4 weeks ago

yshrsmz commented 4 months ago

Environment

Node.js: v20.11.0 unbuild: 2.0.0

Reproduction

https://github.com/unjs/unbuild/blob/bfb4a348421826ad48072ca1cf70973e6caa5b1d/src/builder/rollup.ts#L129-L140

Describe the bug

Say I have monorepo entirely build with ESM Each package is declared as "type": "module" in its package.json

below is the basic directory structure

.
├── apps/
│   └── api/  // ESM module
├── packages/
│   └── db-provider  // ESM module
│       ├── dist/
│       │   ├── index.d.ts
│       │   └── ...
│       └── src/
│           └── index.ts
├── package.json

When I execute unbuild --stub in db-provider package, it generates 3 stubbed files in dist/ directory: index.d.ts, index.cjs, index.mjs.

JS files are fine, the problem is index.d.ts

export * from "/Users/yshrsmz/repos/github.com/yshrsmz/sample/packages/db-provider/src/index";

In ESM module we need to import files with extension, but there's no extension in the generated code. And this causes resolution errors in consumer(api) package. (such as Module '"db-provider"' has no exported member 'ConnectionOptions'.).

I looked into the unbuild code and found out it always uses file name without the extension

https://github.com/unjs/unbuild/blob/bfb4a348421826ad48072ca1cf70973e6caa5b1d/src/builder/rollup.ts#L129-L140

btw manually adding .js or .ts temporarily solves the issue

Additional context

No response

Logs

No response

yshrsmz commented 4 months ago

My current workaround is to add .js extension by sed command.

"scripts": {
  "stub-fix": "if [[ \"$OSTYPE\" == \"darwin\"* ]]; then pnpm run stub-fix:darwin; else pnpm run stub-fix:linux; fi",
  "stub-fix:darwin": "find ./dist -type f -name \"*.ts\" -exec sed -i '' 's/\";$/.js\"/g' {} \\;",
  "stub-fix:linux": "find ./dist -type f -name \"*.ts\" -exec sed -i 's/\";$/.js\"/g' {} \\;",
  "stub": "unbuild --stub && pnpm run stub-fix",
}
MaximusHaximus commented 2 months ago

@pi0 Would really like if this problem got resolved; in its current state, I get TS errors either when stubbing, or when building, depending on how I configure my package.json for packages in the workspace that I link to eachother. The easy stubbing functionality in unbuild was a really attractive feature when considering using it for our projects.