core icon indicating copy to clipboard operation
core copied to clipboard

Cannot read property 'when' of undefined

Open marius-hi opened this issue 5 years ago • 19 comments

I'm running a project that uses angular hybrid with the following versions:

  • "angular": "1.8.0"
  • "@angular/core": "10.0.3"
  • "@uirouter/angular-hybrid": "11.0.2"
  • "@uirouter/angular": "7.0.0"
  • "@uirouter/angularjs": "1.0.28" ....

When executing unit tests I'm getting "Cannot read property 'when' of undefined" in most of the tests (karma with chai and mocha). I tried to debug and see that is pointing to node_modules/@uirouter/core/lib-esm/resolve/resolvable.js this.promise = this.resolved ? services.$q.when(this.data) : undefined; ( https://github.com/ui-router/core/blob/master/src/resolve/resolvable.ts#L84 ) If I guard against this.resolved the error is gone this.promise = this.resolved && services ? services.$q.when(this.data) : undefined;

Could you suggest in which cases services can be undefined and if this can be fixed on master? Should I create a pull request for it?

marius-hi avatar Sep 29 '20 10:09 marius-hi

Hi @marius-hi ,

services.$q should be automatically assigned before each test by the test framework. Try to inject the UIRouter class (or AngularJS $uiRouter) before each test to cause the initialization code to run.

christopherthielen avatar Dec 21 '20 17:12 christopherthielen

I also think this can be caused by multiple copies of @uirouter libraries in your node_modules

Try running:

yarn why @uirouter/core
yarn why @uirouter/angular
yarn why @uirouter/angularjs
yarn why @uirouter/angular-hybrid

or

npm ls @uirouter/core
npm ls @uirouter/angular
npm ls @uirouter/angularjs
npm ls @uirouter/angular-hybrid

Look for any uirouter packages with two different versions listed.

christopherthielen avatar Dec 21 '20 23:12 christopherthielen

Hi @christopherthielen,

Most probably this issue is caused by multiple copies of @uirouter:

├── @uirouter/[email protected] ├── @uirouter/[email protected] └─┬ @uirouter/[email protected] └── @uirouter/[email protected]

What is the possible solution to prevent this issue as we will still need to rely on Angular-hybrid and AngularJs for some time until the project is fully upgraded to Angular?

marius-hi avatar Mar 12 '21 10:03 marius-hi

it is expected to have all four of those packages, as long as none are duplicated.

christopherthielen avatar Mar 12 '21 18:03 christopherthielen

for angularjs/angular-hybrid when uirouter/[email protected] is explicitly installed, exactly this error will happen! Only works with @uirouter/[email protected]

eydrian avatar Jul 18 '21 17:07 eydrian

It's true what @eydrian states. Version @uirouter/[email protected] breaks our teamcity build with the error message of "Cannot read property 'when' of undefined"

mansevmann avatar Jul 21 '21 06:07 mansevmann

@eydrian @mansevmann can you show the output of yarn why @uirouter/core or npm ls @uirouter/core please

christopherthielen avatar Jul 30 '21 20:07 christopherthielen

[email protected] /PATH_TO_REPO
├─┬ @uirouter/[email protected]
│ └── @uirouter/[email protected] deduped
├─┬ @uirouter/[email protected]
│ └── @uirouter/[email protected] deduped
├── @uirouter/[email protected]
├─┬ @uirouter/[email protected]
│ └── @uirouter/[email protected] deduped
└─┬ @uirouter/[email protected]
  └── @uirouter/[email protected] deduped

@christopherthielen

eydrian avatar Aug 06 '21 11:08 eydrian

@eydrian or @mansevmann did you ever solve this?

matthewborgman avatar Nov 15 '21 17:11 matthewborgman

nope

eydrian avatar Jan 06 '22 14:01 eydrian

haha and now ? I have the same problem apparently

ThibaudAV avatar Jan 24 '22 11:01 ThibaudAV

I don't know if this is it. but apparently ui-router/angularjs uses lib-esm which uses lib-esm for import coreservices ui-router/angular uses fesm2015 and so uses llib for import coreservice so for Angular coreservice was never init

ThibaudAV avatar Jan 24 '22 13:01 ThibaudAV

Probably due to my project which looks like frankenstein monster. With this configuration in webpack it seems to solve the problem

      {
        test: /\.mjs$/,
        include: /node_modules/,
        type: 'javascript/auto',
        resolve: { mainFields: ['es2015', 'browser', 'module', 'main'] }, // <-- this ligne
      },

apparently the resolve.mainFields that I added globally is not taken into account I have to give it again for the mjs. now core lib-esm is loaded in both cases. and I no longer have this error

ThibaudAV avatar Jan 24 '22 15:01 ThibaudAV

I use pnpm to install and run start. It fails with error: cannot read properties of undefined (reading 'when') so i remove node_modules and use yarn. It works fine.

WLyKan avatar May 10 '22 08:05 WLyKan

Hi, I am having a similar issue but in my actual live code. It works fine on angular 13's side but not in my AngularJs. As soon as I add the "ui.router.upgrade" dependency to my "app" module, I receive the following error: ERROR TypeError: Cannot read properties of undefined (reading 'when').

As others have mentioned, it comes from the following line of code: this.promise = this.resolved ? services.$q.when(this.data) : undefined;

Almost looks like Resolvable is not able to get any services from my AngularJs. Any idea why?

jozzeed avatar Sep 14 '22 17:09 jozzeed

Had this problem on angularJS+Angular hybrid project because of incorrect require() statements. I had to install @angular-builders/custom-webpack and set such a config for template loading of old JS:

module: {
    rules: [
        {
            test: /\.html$/,
            type: 'asset/source',
            include: [
                path.resolve(__dirname, "YourParentPathToLegacyTemplates"),
            ],
        }
    ]
}

And I had to change require statements from require("raw-loader!../path-to-template/template.html").default to require("../path-to-template/template.html") No loader + no .default at the end of the statement It solved my problem, tested on Angular 12 and 13

zavrakv avatar Dec 09 '22 15:12 zavrakv

Hi, I am having a similar issue but in my actual live code. It works fine on angular 13's side but not in my AngularJs. As soon as I add the "ui.router.upgrade" dependency to my "app" module, I receive the following error: ERROR TypeError: Cannot read properties of undefined (reading 'when').

As others have mentioned, it comes from the following line of code: this.promise = this.resolved ? services.$q.when(this.data) : undefined;

Almost looks like Resolvable is not able to get any services from my AngularJs. Any idea why?

@jozzeed Have you been able to resolve this? I'm having the same issue when adding 'ui.router.upgrade' to my angularjs module.

eaemilio avatar Dec 12 '22 21:12 eaemilio

I had the same problem.

npm ls @uirouter/core

Output:

[email protected] 
+-- @uirouter/[email protected]
| `-- @uirouter/[email protected]
+-- @uirouter/[email protected]
| `-- @uirouter/[email protected]
`-- @uirouter/[email protected]
  `-- @uirouter/[email protected] deduped

As of npm cli v8.3.0 (2021-12-09) this can be solved using the overrides field of package.json

First add an explicit install of @uirouter/core. I used version 6.0.8 because I am not sure if the latest version 6.0.9 is supported on @uirouter/angularjs.

npm i @uirouter/[email protected] --P -E

Your package.json should now have this line added to it.

"@uirouter/core": "6.0.8",

Next specify that this installed version of @uirouter/core should be used by the dependent libraries. Manually update your package.json and add/update the overrides section.

"overrides": {
  "@uirouter/rx": {
    "@uirouter/core": "$@uirouter/core"
  },
  "@uirouter/angular": {
    "@uirouter/core": "$@uirouter/core"
  }
}

Run your install one more time.

npm i

And finally check the dependent versions one last time.

npm ls @uirouter/core

[email protected] 
+-- @uirouter/[email protected] overridden
| `-- @uirouter/[email protected] deduped
+-- @uirouter/[email protected]
| `-- @uirouter/[email protected] deduped
+-- @uirouter/[email protected] overridden
`-- @uirouter/[email protected] overridden
  `-- @uirouter/[email protected] deduped

IgorWolbers avatar Jan 31 '23 16:01 IgorWolbers

For anyone that is still facing this issue, fixed it by also updating uirouter/angularjs from v 1.0.30 to 1.1.0

JonayLo avatar Jan 31 '24 08:01 JonayLo