nx: Workspace Schematics: importing a TS file outside the "tools" directory causes a TS error
Expected Behavior
I should be able to import a TS file from an app or lib into my custom workspace schematic and use it.
Current Behavior
When I try importing a file from an app or lib into my custom schematic, I get a 'rootDir' is expected to contain all source files TS error.
Failure Information (for bugs)
Steps to Reproduce
The specific steps to reproduce are as follows:
- Create a new workspace via
npx create-nx-workspace@latest schematics-playground - Select
Angularas the type of workspace - During the process it asks for the name of the first app, set it to
default - Create a
testschematic viang g workspace-schematic test - Inside the
index.tsfile for that schematic, import theapp.module.tsfor thedefaultapp that was generated (or really any file that requires traversal outside of thetoolsdirectory) - Run the schematic via
./node_modules/.bin/nx workspace-schematic test
Context
nx report
@nrwl/angular : 9.0.2
@nrwl/cli : 9.0.2
@nrwl/cypress : 9.0.2
@nrwl/eslint-plugin-nx : Not Found
@nrwl/express : Not Found
@nrwl/jest : 9.0.2
@nrwl/linter : Not Found
@nrwl/nest : Not Found
@nrwl/next : Not Found
@nrwl/node : Not Found
@nrwl/react : Not Found
@nrwl/schematics : Not Found
@nrwl/tao : 9.0.2
@nrwl/web : Not Found
@nrwl/workspace : 9.0.2
typescript : 3.7.5
Reproduction
A minimal reproduction of the error can be found here.
This was generated using the exact steps outlined in “Steps to Reproduce”.
Just install dependencies and run the test schematic via nx workspace-schematic test.
Failure Logs
In the repro I am trying to import the AppModule from apps/default/src/app/app.module.ts into my schematic at tools/schematics/test/index.ts and it results in this error:
apps/default/src/app/app.module.ts:4:30 - error TS6059: File '/Users/Garve/projects/schematics-playground/apps/default/src/app/app.component.ts' is not under 'rootDir' '/Users/Garve/projects/schematics-playground/tools'. 'rootDir' is expected to contain all source files.
4 import { AppComponent } from './app.component';
~~~~~~~~~~~~~~~~~
tools/schematics/test/index.ts:4:27 - error TS6059: File '/Users/Garve/projects/schematics-playground/apps/default/src/app/app.module.ts' is not under 'rootDir' '/Users/Garve/projects/schematics-playground/tools'. 'rootDir' is expected to contain all source files.
4 import { AppModule } from '../../../apps/default/src/app/app.module';
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Found 2 errors.
Other
For reference, here is the resulting structure of the dist folder when I run the schematic and get the error:

Almost positive the error is coming from this function, because I tried running the tsc -p tools/tsconfig.tools.json command myself and got the same error.
About this issue
- Original URL
- State: closed
- Created 4 years ago
- Reactions: 12
- Comments: 23 (5 by maintainers)
I found that templated ts files in the generator/schematic were being compiled when they shouldn’t be.
They had been excluded in tsconfig.base.json as
"exclude": ["node_modules", "tmp", "tools/schematics/*/files/*]", which no longer worked becauseschematicswas renamed togeneratorsin NX 11.I updated tsconfig.base.json to exclude
tools/**/files/*instead to fix the issue. It would be nice if these exclusions were added with the creation of a generator, and also added to the migration scripts.Same on our side, we have a bash script to do the copy and need to rerun it each time we need to propagate a change from generator A to generator B (generator B using generator A)
The common use case for this (using a workspace library from a workspace generator) should be solved by #9116. One thing to note is that it doesn’t solve it for current workspace generators, but migrating those into a local plugin library (perhaps named workspace or similar) and calling them with
nx g {npmScope}/workspace:{generatorName}would work as one would expect.After this use case is solidified and battle-tested, we may consider migrating existing workspace generators into a similar setup.
This is kind of annoying. Why was this decision made? We have many utility functions in
/libsand/tools. ATM we need to copy and paste them into libs and vice versa…I have the same problem. Can’t use “libs/” inside “tools/”
I also would like to be able to use a generator from another generator of the same monorepo 👍
Hey, thx for reporting this. I’ll give it a look tomorrow
Ok, I’ve tried removing the rootDir but that results in the underlying Nx script not being able to copy over some of the resulting files. I’ll keep playing with it.