Skip to content

Commit

Permalink
Disable composite for type declarations
Browse files Browse the repository at this point in the history
We are using pkgroll with Typescript monorepos (managed by pnpm
workspaces) and project references. The latter requires
`compilerOptions.composite = true` in referenced projects for most `tsc`
invocations. If you set `references` without `compilerOptions.composite
= true`, `tsc` will fail, indicating that `composite` needs to be set.

When I run `pkgroll` and have `composite` set, I get TS6307 for every
file included from `src/index.ts`. rollup-plugin-dts does not handle
`composite` (see Swatinem/rollup-plugin-dts#127, which was closed
without fix or explanation). I looked at several other related tools
(rollup-plugin-typescript2, rollup-plugin-ts, others mentioned in
Swatinem/rollup-plugin-dts) and could not get any of them working to
build *just* the DTS files (rollup-plugin-typescript2 was the most
promising, but I could not get it working in the time that I allotted
for this investigation).

Going back to rollup-plugin-dts, we find the `compilerOptions` option,
and I tried explicitly setting `composite: false`, which allows my type
files to build again without errors.

I don't think that this is the *correct* fix; ideally, rollup-plugin-dts
would be fixed to better handle composite projects *or* would override
`composite` at all times. An alternative change, although much more
invasive to pkgroll, would be to have pkgroll accept an *alternate*
`tsconfig.json` as a parameter:

```console
$ pkgroll --tsconfig tsconfig.pkgroll.json
```

In the short term, this has eliminated the build issue that I have been
seeing, and it may be sufficient to resolve this until a better fix can
be determined in some way, whether by a `--tsconfig` parameter, upstream
fixes, or changing to a different bundler plugin for type declaration
plugins.

This issue can be seen at:

https://github.com/halostatue/pkgroll-monorepo-types-issue
  • Loading branch information
halostatue committed Mar 5, 2024
1 parent fca7722 commit a0386f5
Show file tree
Hide file tree
Showing 8 changed files with 74 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/utils/get-rollup-configs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ const getConfig = {
resolveTypescriptMjsCts(),
dts.default({
respectExternal: true,
compilerOptions: { composite: false },
}) as Plugin,
],
output: [] as unknown as Output,
Expand Down
1 change: 1 addition & 0 deletions tests/fixture-monorepo/packages/one/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { Name } from './name.js';
3 changes: 3 additions & 0 deletions tests/fixture-monorepo/packages/one/src/name.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
declare const name: unique symbol;

export type Name = string & { [name]: never };
9 changes: 9 additions & 0 deletions tests/fixture-monorepo/packages/one/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"compilerOptions": {
"jsx": "react",
"moduleResolution": "node",
"composite": true,
"outDir": "dist"
},
"include": ["src/index.ts"]
}
5 changes: 5 additions & 0 deletions tests/fixture-monorepo/packages/two/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { Name } from '@org/one';

Check failure on line 1 in tests/fixture-monorepo/packages/two/src/index.ts

View workflow job for this annotation

GitHub Actions / Test (ubuntu-latest)

Unable to resolve path to module '@org/one'

export function sayHello(name: Name) {
console.log('Hello', name);

Check warning on line 4 in tests/fixture-monorepo/packages/two/src/index.ts

View workflow job for this annotation

GitHub Actions / Test (ubuntu-latest)

Unexpected console statement
}
10 changes: 10 additions & 0 deletions tests/fixture-monorepo/packages/two/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"compilerOptions": {
"jsx": "react",
"moduleResolution": "node",
"composite": true,
"outDir": "dist"
},
"include": ["src/index.ts"],
"references": [{ "path": "../one" }]
}
6 changes: 6 additions & 0 deletions tests/fixture-monorepo/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"compilerOptions": {
"moduleResolution": "node"
},
"resources": [{ "path": "./packages/one" }, { "path": "./packages/two" }]
}
39 changes: 39 additions & 0 deletions tests/specs/builds/output-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -219,5 +219,44 @@ export default testSuite(({ describe }, nodePath: string) => {
const content = await fixture.readFile('dist/dts.d.ts', 'utf8');
expect(content).toMatch('declare const');
});

test('handles types in composite monorepos correctly', async ({ onTestFinish }) => {
const fixture = await createFixture('./tests/fixture-monorepo');
onTestFinish(async () => await fixture.rm());

await installTypeScript(fixture.path);

await fixture.writeJson('package.json', {
workspaces: ['packages/*'],
});

await fixture.writeJson('packages/one/package.json', {
name: '@org/one',
type: 'module',
exports: { types: './dist/index.d.mts' },
});

const pkgrollOne = await pkgroll([], { cwd: `${fixture.path}/packages/one`, nodePath });
expect(pkgrollOne.exitCode).toBe(0);
expect(pkgrollOne.stderr).toBe('');

const contentOne = await fixture.readFile('packages/one/dist/index.d.mts', 'utf8');
expect(contentOne).toMatch('export type { Name };');

await fixture.writeJson('packages/two/package.json', {
main: './dist/index.mjs',
type: 'module',
dependencies: {
'@org/one': 'workspace:*',
},
});

const pkgrollTwo = await pkgroll([], { cwd: `${fixture.path}/packages/two`, nodePath });
expect(pkgrollTwo.exitCode).toBe(0);
expect(pkgrollTwo.stderr).toBe('');

const contentTwo = await fixture.readFile('packages/two/dist/index.mjs', 'utf8');
expect(contentTwo).toMatch('export { sayHello };');
});
});
});

0 comments on commit a0386f5

Please sign in to comment.