ember-codemods / ember-native-class-codemod

A codemod-cli project for converting Ember objects to es6 native classes
68 stars 38 forks source link

Won't transform class with `actions` hash #536

Open DArrigoni opened 1 year ago

DArrigoni commented 1 year ago

Ember Objects with objects or arrays as direct properties (actions and queryParams are the exception). See eslint-plugin-ember/avoid-leaking-state-in-ember-objects for more details.

I have a file with an actions hash that is kicking out this error:

2023-06-20T15:50:48.604Z ERROR: [app/controllers/authenticated/customers/index.js]
    RuntimeDataError: Could not find runtime data
2023-06-20T15:50:48.613Z ERROR: [app/controllers/authenticated/customers/index.js]
    ValidationError: Validation errors for class 'Index':
        [actions]: Transform not supported - value is of type object. For more details: eslint-plugin-ember/avoid-leaking-state-in-ember-objects

I'm assuming that the issue is something that fixing the "Could not find runtime data" error would resolve, although it works fine if I remove the actions hash and run it without it.

I'm invoking it with: npx ember-native-class-codemod http://localhost:4202/partner/ app/controllers/authenticated/customers/index.js

And I can verify the app is loaded at http://localhost:4202/partner/

Build successful (2925ms) – Serving on http://localhost:4202/partner/

Slowest Nodes (totalTime >= 5%)                               | Total (avg)
--------------------------------------------------------------+----------------
AssetRewrite (2)                                              | 1376ms (688 ms)
SassCompiler (1)                                              | 699ms
Packaged Application Javascript (1)                           | 147ms

Any assistance would be greatly appreciated.

DArrigoni commented 1 year ago

After some more playing around with it I'm getting inconsistent results with this. Some times it works fine, sometimes it does not.

patocallaghan commented 1 year ago

I've just come across the same issue. It seems this is because of the ignoreLeakingState option in the config. This looks like it only supports queryParams by default even though in the README it calls out queryParams and actions.

Ember Objects with objects or arrays as direct properties (actions and queryParams are the exception). See eslint-plugin-ember/avoid-leaking-state-in-ember-objects for more details.

Adding actions to ignoreLeakingState options does go a step further and do a migration but in my testing it looks like it translates to actions = { ... }

@gitKrystan should actions be added as a default option in ignoreLeakingState?

patocallaghan commented 1 year ago

Did a bit more digging and it seems the codemod supports actions using ObjectMethod notation but not FunctionExpression.

Works

actions: {
  foo() {}
}

Doesn't work

actions: {
  foo: function() {}
}

I'll see about putting together a PR

Edit: hmm weirdly i can't replicate this behaviour in the tests

gitKrystan commented 1 year ago

IIRC adding something to ignoreLeakingState means it won't be transformed from an object literal. The actions hash is special-cased, as you found.

Are you seeing anything about this file in codemods.log?