nx: Create a new NestJS through a shcematic doesn't put it in the right folder

Prerequisites

Please answer the following questions for yourself before submitting an issue. YOU MAY DELETE THE PREREQUISITES SECTION.

  • I am running the latest version (no, 8.3.0, since the latest one doesn’t work for me)
  • I checked the documentation and found no answer
  • I checked to make sure that this issue has not already been filed
  • I’m reporting the issue to the correct repository (not related to Angular, AngularCLI or any dependency)

Expected Behavior

I am using the Angular console to create a new NestJs controller. The outputted command is

ng generate @nestjs/schematics:controller mycontroller

I expect the controller to be placed inside my Nest application (apps/api)

Current Behavior

The output of the console is

CREATE src/mycontroller/mycontroller.controller.spec.ts (479 bytes)
CREATE src/mycontroller/mycontroller.controller.ts (97 bytes)

And indeed, the controller is put at the root of the projet, under a new folder src, not under apps/api.

Steps to Reproduce

  1. Create a Nx project
  2. Add a Nest projet
  3. Create a Nest controller as specified above

Context

  • version of Nx used = 8.3.0
  • version of Angular CLI used = 8.1.1
  • angular.json configuration = untouched
  • version of Angular DevKit used = 8.1.1
  • 3rd-party libraries and their versions = non installed

Other

I have tried giving a path as the optional parameter, to no success. (still in src) I have tried giving a source root, to no success (still in src)

About this issue

  • Original URL
  • State: closed
  • Created 5 years ago
  • Comments: 16 (9 by maintainers)

Most upvoted comments

Dear @Maryannah ,

that is most likely, because nrwl/nx does not ship with a nest-cli.json file in the root folder. This file, in turn, is used by nestjs to determine the source folder to put the generated files into…

In order to fix your issue, simply create a nest-cli.json file in the root folder and add the following content:

{
  "language": "ts",
  "collection": "@nestjs/schematics",
  "sourceRoot": "apps/api/src"
}

Please adapt the sourceRoot to your specific folder-structure… That should solve your issues…

@vsavkin or @FrozenPandaz : Maybe we can add this nest-cli.json file to the nest schematics? What do you think about this?

All the best

I was about to submit a similar issue until I came across this issue by @Maryannah - I would like to extend the discussion around this issue to accommodate or consider multiple Nest apps.

In my original case, I am using the Angular Console via VSCode and when I click on “Projects”, find my Nest application and click its “Generate” button, any @nestjs/schematics I go to generate (i.e. controller, module, etc.) results in something similar to the following:

ng generate @nestjs/schematics:module storage --dry-run --no-interactive
CREATE src/storage/storage.module.ts (84 bytes)
NOTE: The "dryRun" flag means no changes were made.
Process completed

When I would expect something like this when generating off a Nest project via the “Projects” page:

ng generate @nestjs/schematics:module storage --path=app --sourceRoot=apps/api/src --dry-run --no-interactive
CREATE apps/api/src/app/storage/storage.module.ts (84 bytes)
UPDATE apps/api/src/app/app.module.ts (426 bytes)
NOTE: The "dryRun" flag means no changes were made.
Process completed

Folks. I looked into it. It looks like generating a nest-cli.json isn’t the best option because a workspace can contain many apps and libs.

So I don’t think there is anything that needs to be done on the Nx side.

Your options are:

  • ng generate @nestjs/schematics:controller mycontroller --source-root=apps/api/src
  • create a workspace schematic that invokes externalSchematic('@nestjs/schematics:controller')

We are also working on improving Angular Console, so you can right click on a folder and invoke a schematic from it. We will keep this use case in mind, such that we either create source-root or project parameter based on the selected schematic.

METACEO, please see my answer. This is, because NestJs requires the nest-cli.json file in the root directory of the nx-workspace (or in fact any structure) to determine where the file should be stored. Currently, the nest-cli.json file is not auto-generated when adding a nest application to nrwl/nx (this may be considered a bug!). However, as this file is not present, it will create everything in the main folder of the project.

Well, while I’m not here to argue if the lack of the nest-cli.json file is a bug or not, my guess is that even if one was generated, I’d still have a problem or the inconvenience of generating Nestjs schematics for a specified Nestjs project.