ember.js icon indicating copy to clipboard operation
ember.js copied to clipboard

Cannot destructure property 'manager' of '.for' as it is undefined.

Open amk221 opened this issue 1 year ago • 13 comments

🔬 Minimal Reproduction

Minimal reproduction of an error in ember-modifier

 Cannot destructure property 'manager' of '.for' as it is undefined.

https://github.com/amk221/-ember-modifier-manager/commit/a3765c5e3bcfe9e094f8febcfc971f98b72e0efa#diff-91d02793f5c4fd5e02a401c33509cafcb6fc7613aef16d97afe18f4b4a080d5cR18-R20

🌍 Environment

  • Ember: - 5.8
  • Ember-CLI: -
  • Node.js/npm: -
  • OS: -
  • Browser: -

amk221 avatar Jun 20 '24 10:06 amk221

Does the issue appear in

  • ember-source 5.9?
  • gjs?

Thanks!

NullVoxPopuli avatar Jun 20 '24 11:06 NullVoxPopuli

ember-source 5.9 = yes, still occurs

gjs = yes, it still occurs in our app, which is gjs with the original error as above. But, in terms of focusing on the minimal reproduction, no, it instead outputs:

Attempted to set the same type of manager multiple times on a value. You can only associate one manager of each type with a given value. Value was (unknown function)

amk221 avatar Jun 20 '24 11:06 amk221

That second error seems like the deps got messed up. Does using pnpm reproduce nhe original error?

NullVoxPopuli avatar Jun 20 '24 11:06 NullVoxPopuli

relooking

amk221 avatar Jun 20 '24 11:06 amk221

You're right.

Here's a gjs branch, with the original error

https://github.com/amk221/-ember-modifier-manager/commit/783298200e28f65e9e636cb5ce5d8ec85056eeab#diff-8b01f9fcdd7fd5370da514614ab30fe4ea2ebfd452dac4b7e4fd3482dc0e5421R55-R57

amk221 avatar Jun 20 '24 12:06 amk221

In the gjs branch, there was an issue. the modifier import was shadowing the keyword.

After the fix (https://github.com/amk221/-ember-modifier-manager/pull/1), the new error is

Uncaught (in promise) TypeError: scheduledUpdateModifiers[Symbol.iterator]().next().value is undefined
    commit runtime.js:3904
    commit runtime.js:3972
    inTransaction runtime.js:3991
    Ember 3
    invoke backburner.js.js:272
    flush backburner.js.js:188
    flush backburner.js.js:344
    _end backburner.js.js:773
    _boundAutorunEnd backburner.js.js:509
    promise callback*buildNext/< backburner.js.js:26
    flush Ember

which is another issue :thinking:

NullVoxPopuli avatar Jun 20 '24 13:06 NullVoxPopuli

It's possible that one of these caused the issue:

  • https://github.com/glimmerjs/glimmer-vm/pull/1565
  • https://github.com/glimmerjs/glimmer-vm/pull/1573

just kidding, these landed in 5.9

NullVoxPopuli avatar Jun 20 '24 13:06 NullVoxPopuli

ah, no the repro has a problem

NullVoxPopuli avatar Jun 20 '24 14:06 NullVoxPopuli

Here is the fix:

  • don't have two click listeners changing data for the modifier at the same time
diff --git a/app/components/foo.gjs b/app/components/foo.gjs
index 2dd2640..56f7ba3 100644
--- a/app/components/foo.gjs
+++ b/app/components/foo.gjs
@@ -23,12 +23,7 @@ export default class Foo extends Component {
   close() {
     console.log("close");
     this.isOpen = false;
-  }
-
-  @action
-  setValue(value) {
-    console.log("setValue");
-    this.value = value;
+    this.value = "foo";
   }
 
   <template>
@@ -44,7 +39,6 @@ export default class Foo extends Component {
       type="button"
       class="close"
       {{on "click" this.close}}
-      {{on "click" (fn this.setValue "foo")}}
     >
       Close
     </button>

Now... should it work? probably. why doesn't it work? idk.

maybe @chancancode can provide some insights there.

NullVoxPopuli avatar Jun 20 '24 14:06 NullVoxPopuli

Thanks for looking!

~I don't think it's the fact that it uses two click handlers, rather, that it updates another tracked property that is an argument to the modifier? Since, you can combine the click handler and the error still happens.~

Anyway, I really would like this to work of course, since the code is 'valid' also don't forget this is an unrealistic minimal production and in reality, one might not be in control to be able to do your suggested fix

amk221 avatar Jun 20 '24 14:06 amk221

Since, you can combine the click handler and the error still happens.

that's not what happens in my PR to your repro :thinking:

Anyway, I really would like this to work of course

yeah, the fact it doesn't work does seem bad

NullVoxPopuli avatar Jun 20 '24 14:06 NullVoxPopuli

Im also having this error with ember-focus-trap

Attempted to set the same type of manager multiple times on a value. You can only associate one manager of each type with a given value. Value was (unknown function)

But with FocusTrapModifier, while on host app using ember-eui components

betocantu93 avatar Jun 28 '24 20:06 betocantu93

After having ran ember-cli-update from 5.9.0 to 6.1.0 this is occurring a lot more in our app now

Uncaught (in promise) Error: Attempted to set the same type of manager multiple times on a value. You can only associate one manager of each type with a given value. Value was (unknown function)

As already mentioned, it may be an addon author applying a modifier, and then, a consumer of the addon applying one of the same type again. Which should be allowed because they aren't in control of 'the fix'.

As you have already seen my minimal re-production repo, here is a more realistic scenario.

amk221 avatar Jan 08 '25 14:01 amk221

Fixed by avoiding name clash

import { modifier as _modifier } from 'ember-modifier';
const mod1 = _modifier(() => {})

//...

<template><div {{modifier mod2 ...}}></div></template>

amk221 avatar Jul 24 '25 13:07 amk221

New replication but a slightly different scenario. Please re-open

https://github.com/amk221/-ember-modifier-manager-issue/commit/8d6850b9cdd5918d1885bfaf344406b8564bac05

amk221 avatar Sep 10 '25 16:09 amk221

In the REPL -- how do I see the issue?

NullVoxPopuli avatar Sep 10 '25 17:09 NullVoxPopuli

Run the tests

Image

amk221 avatar Sep 10 '25 17:09 amk221

REPL with clicks

gonna try your 6.3 app now (the REPL is using 6.8)

NullVoxPopuli avatar Sep 10 '25 17:09 NullVoxPopuli

I think this has something to do with the route template and controller combo. if I just use components, the problem goes away.

NullVoxPopuli avatar Sep 10 '25 18:09 NullVoxPopuli

I ran ember-cli-update (commit), but the error is still there

amk221 avatar Sep 10 '25 19:09 amk221

If you're wanting to be unblocked -- can you try moving to components instead of controller + template? does that fix your issue?

NullVoxPopuli avatar Sep 10 '25 19:09 NullVoxPopuli

Thanks its a good idea, but I tried it: First by removing use of controllers, and Secondly by switching to ember-route-templates to make doubly sure.

amk221 avatar Sep 10 '25 19:09 amk221

did I mess something up here? test passes: https://github.com/amk221/-ember-modifier-manager-issue/pull/1/files#r2337741343

NullVoxPopuli avatar Sep 10 '25 19:09 NullVoxPopuli

Well its not a true representation of the minimal reproduction of the issue, its not using arguments

amk221 avatar Sep 10 '25 19:09 amk221

Image

amk221 avatar Sep 10 '25 19:09 amk221

yup -- and with the debug tools open, it can be debugged the same as your repro repo 🎉

though, the error is slightly different. I was never able to see .for in the error

NullVoxPopuli avatar Sep 10 '25 19:09 NullVoxPopuli

(Thats why I made the github repo, to be as close to the real problem in our app as possible!)

amk221 avatar Sep 10 '25 20:09 amk221

Please can the issue be reopened?

amk221 avatar Sep 10 '25 20:09 amk221

Based on the discussion and prior triage at the top of this issue, i'd prefer a new issue so we start with a clean slate -- in this issue, there are like 5 different problems being looked at

e.g.: Image

good news though -- you already have a good reproduction, and that's a great place to start. 🎉

NullVoxPopuli avatar Sep 10 '25 20:09 NullVoxPopuli