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:

  1. Create a new workspace via npx create-nx-workspace@latest schematics-playground
  2. Select Angular as the type of workspace
  3. During the process it asks for the name of the first app, set it to default
  4. Create a test schematic via ng g workspace-schematic test
  5. Inside the index.ts file for that schematic, import the app.module.ts for the default app that was generated (or really any file that requires traversal outside of the tools directory)
  6. 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: image

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)

Most upvoted comments

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 because schematics was renamed to generators in 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 /libs and /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.