angular/angular-cli

"NG04014: Invalid configuration of route" when using router with exported variables

Caliv0 opened this issue · 2 comments

Which @angular/* package(s) are the source of the bug?

router

Is this a regression?

Yes

Description

app-routing.module.ts:

const routes: Routes = [
  {
    path: SecondRoutes.Module,
    loadChildren: () =>
      import('./second/second.module').then((m) => m.SecondModule),
    pathMatch: 'prefix',
  },
];

second.routing.ts

export enum SecondRoutes {
  Module = 'second',
  CodeParam = 'code',
}

const routes: Routes = [
  {
    path: `:${SecondRoutes.CodeParam}`,
    component: SecondComponent,
    pathMatch: 'full',
  },
  { path: '**', redirectTo: '/' },
];

This configuration in itself is okay, the is caused in SecondComponent. Note the SecondRoutes enum, it's also part of the problem.

second.component.ts

export class SecondComponent implements OnInit {
  constructor(
    private _route: ActivatedRoute,
    private _router: Router,
  ) {}
  ngOnInit(): void {
    // Causes Bug
    //console.log(this._route.snapshot.paramMap.get(SecondRoutes.CodeParam));
    // Causes Bug too
    //this._router.navigate(['/', SecondRoutes.Module]);
    // Using ThirdRoutes works again
    this._router.navigate(['/', ThirdRoutes.Module]);
  }
}

This works fine too. Note ThirdRoutes.Module which is an enum from a different module.

second.component.ts

export class SecondComponent implements OnInit {
  constructor(
    private _route: ActivatedRoute,
    private _router: Router,
  ) {}
  ngOnInit(): void {
    // Causes Bug
    console.log(this._route.snapshot.paramMap.get(SecondRoutes.CodeParam));
    // Causes Bug too
    this._router.navigate(['/', SecondRoutes.Module]);
    // Using ThirdRoutes works again
    //this._router.navigate(['/', ThirdRoutes.Module]);
  }
}

This causes the bug. I get this error in the console when I try to activate the route:
image

Note SecondRoutes.CodeParam and SecondRoutes.Module hardcoding them solves the issue.

Please provide a link to a minimal reproduction of the bug

https://github.com/Caliv0/angular-routing-bug

Please provide the exception or error you saw

app-routing.module.ts:9 ERROR Error: NG04014: Invalid configuration of route 'second/:code'. One of the following must be provided: component, loadComponent, redirectTo, children or loadChildren
    at validateNode (router.mjs:2843:13)
    at validateConfig (router.mjs:2790:5)
    at router.mjs:4341:56
    at map.js:7:37
    at OperatorSubscriber2._this._next (OperatorSubscriber.js:15:21)
    at Subscriber2.next (Subscriber.js:34:18)
    at mergeInternals.js:25:28
    at OperatorSubscriber2._this._next (OperatorSubscriber.js:15:21)
    at Subscriber2.next (Subscriber.js:34:18)
    at innerFrom.js:61:28

Please provide the environment you discovered this bug in (run ng version)

Angular CLI: 17.3.7
Node: 20.12.2
Package Manager: npm 10.6.0
OS: linux x64

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

Package                         Version
---------------------------------------------------------
@angular-devkit/architect       0.1703.7
@angular-devkit/build-angular   17.3.7
@angular-devkit/core            17.3.7
@angular-devkit/schematics      17.3.7
@angular/cli                    17.3.7
@schematics/angular             17.3.7
rxjs                            7.8.1
typescript                      5.4.5
zone.js                         0.14.5

Anything else?

No response

Transferring issue to the CLI repo. This appears to be a build issue. The SecondComponent variable is not defined at the time the routes variable is read. The error coming from the Router is correct as far as the router is concerned or able to determine.

This is due to a cyclic dependency second.routing.ts <> second.component.ts. You can solve this by moving the SecondRoutes enum to a separate file.