Skip to content

Passing null options to RunSchematicTask leads to CLI crash #21023

@da-mkay

Description

@da-mkay

🐞 Bug report

Command (mark with an x)

  • new
  • build
  • serve
  • test
  • e2e
  • generate
  • add
  • update
  • lint
  • extract-i18n
  • run
  • config
  • help
  • version
  • doc

Is this a regression?

Yes, the previous version in which this bug was not present was: 11.x

Description

Using context.addTask(new RunSchematicTask(schematicName, Options)) inside a schematic, we can schedule another schematic. Until (including) Angular 11 we could simply pass null as second Options parameter.
Starting with Angular 12 the CLI will crash with the error message Cannot read property 'project' of null.

🔬 Minimal Reproduction

Run a schematic (using ng add or ng g) that itself tries to run another schematic using context.addTask(new RunSchematicTask(schematicName, null)) (null is important here).

Since the ng-add schematic of @da-mkay/ng-builder-electron uses the above mentioned code you can use these commands to reproduce the issue:

$ ng new workspace --create-application=false
$ cd workspace
$ ng add @da-mkay/ng-builder-electron@0.2.0

(Version 0.2.0 is important as I will release a new version in a moment)

🔥 Exception or Error


Cannot read property 'project' of null

🌍 Your Environment


Angular CLI: 12.0.2
Node: 14.17.0
Package Manager: npm 6.14.13
OS: darwin x64

Angular: 12.0.2
... animations, cli, common, compiler, compiler-cli, core, forms
... platform-browser, platform-browser-dynamic, router

Package                      Version
------------------------------------------------------
@angular-devkit/architect    0.1200.2
@angular-devkit/core         12.0.2
@angular-devkit/schematics   12.0.2
@schematics/angular          12.0.2
rxjs                         6.6.7
typescript                   4.2.4

Anything else relevant?

The issue is caused by the following line inside SchematicCommand class:
https://github.com/angular/angular-cli/blob/master/packages/angular/cli/models/schematic-command.ts#L247

typeof (current as Record<string, unknown>).project === 'string'

Here, current is what we pass as second argument to the RunSchematicTask constructor (null). Since that parameter is typed as generic T, IMHO we should be able to pass null here. But maybe I'm wrong 😉

As a workaround I can pass {} instead of null to the RunSchematicTask constructor.

A solution would be to change the above line to:

typeof (current as Record<string, unknown>)?.project === 'string'

(added ?)

I can also create a PR for that gigantic change if needed 😋

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions