Description
openedon Nov 19, 2024
Current Behavior
The typescript sync generator adds references for all projects in the dependency graph if they have a tsconfig (with composite: true
).
This currently includes implicit dependencies, which are not explicitly referenced in code and therefore don't require project references.
See #28839 - where batch builds also skip implicit dependencies.
For a tangible example, if I have a monorepo with some infrastructure project (eg CDK), and a website project (eg a React app) - I might have my infrastructure project deploy my website but not directly reference any of its code, and so use an implicit dependency to ensure build order. The sync generator will still add a reference as both of these are TypeScript projects, but I can get an error such as this when moduleResolution
is is different for the two projects:
../website/tsconfig.app.json:3:3 - error TS5095: Option 'bundler' can only be used when 'module' is set to 'preserve' or to 'es2015' or later.
3 "compilerOptions": {
~~~~~~~~~~~~~~~~~
../website/tsconfig.app.json:3:3 - error TS5109: Option 'moduleResolution' must be set to 'NodeNext' (or left unspecified) when option 'module' is set to 'NodeNext'.
3 "compilerOptions": {
~~~~~~~~~~~~~~~~~
Expected Behavior
Implicit dependency tsconfigs should not be referenced by the projects which depend on them. Only explicit dependencies should be referenced in project tsconfigs.
GitHub Repo
https://github.com/cogwirrel/nx-sync-generator-implicit-deps-example
Steps to Reproduce
- Clone the example repo
pnpm i
pnpm nx run-many --target build --all
and observe error
If you then delete the references to the website in packages/infra/tsconfig.json
and packages/infra/tsconfig.lib.json
and rebuild, Nx prompts to run the sync generator. If we skip running the sync generator, the build succeeds, otherwise if we run the sync generator the build fails.
Nx Report
NX Report complete - copy this into the issue template
Node : 20.18.0
OS : darwin-arm64
Native Target : aarch64-macos
pnpm : 9.13.0
nx : 20.1.2
@nx/js : 20.1.2
@nx/eslint : 20.1.1
@nx/workspace : 20.1.2
@nx/devkit : 20.1.2
@nx/react : 20.1.1
@nx/vite : 20.1.2
@nx/web : 20.1.1
typescript : 5.5.4
---------------------------------------
Registered Plugins:
@nx/js/typescript
@nx/vite/plugin
---------------------------------------
The following packages should match the installed version of nx
- @nx/eslint@20.1.1
- @nx/react@20.1.1
- @nx/web@20.1.1
To fix this, run `nx migrate nx@20.1.2`
Failure Logs
Failure logs will vary depending on the use case, but in the example code they are as follows:
../website/tsconfig.app.json:3:3 - error TS5095: Option 'bundler' can only be used when 'module' is set to 'preserve' or to 'es2015' or later.
3 "compilerOptions": {
~~~~~~~~~~~~~~~~~
../website/tsconfig.app.json:3:3 - error TS5109: Option 'moduleResolution' must be set to 'NodeNext' (or left unspecified) when option 'module' is set to 'NodeNext'.
3 "compilerOptions": {
~~~~~~~~~~~~~~~~~
Package Manager Version
pnpm 9.13.0
Operating System
- macOS
- Linux
- Windows
- Other (Please specify)
Additional Information
No response
Activity