1
votes

This question is related to: Does Ember Octane Route class support using mixins? Mixins are officially deprecated in Ember Octane.

Question:

What is the best option to replace Ember mixins with and how do I implement it?

Context:

I have custom mixins that expand functionality offered by ember-simple-auth (~v1.8.2), which was not available at the time the methods were created (see below). I am currently using ember-simple-auth 3.0.0 https://github.com/simplabs/ember-simple-auth. In the documentation on github, they appear to be using their own mixins on Ember Octane as you can see:

// my-engine/addon/routes/index.js
import Route from '@ember/routing/route';
import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin';

export default class IndexRoute extends Route.extend(AuthenticatedRouteMixin) {
  triggerAuthentication() {
    this.transitionToExternal('login');
  }
}

It appears that I am not the only one having this issue as Simple Auth doesn't know what route they want to go down either: https://github.com/simplabs/ember-simple-auth/issues/2185

Options:

  • Pure native classes, sharing functionality via class inheritance.
  • Utility functions which can be imported and used in multiple classes.
  • Services which can be injected into multiple classes, sharing functionality and state between them.

I have the following authentication mixins:

  1. Application Route: This handles whether the user is logged in and whether the user has two-factor authentication (2FA) enabled, and if it is enabled, it verifies that the user has been authenticated through 2FA. This is because simple auth did not offer 2FA at the time of development of the mixin(s)
  2. Authenticated Route: Makes sure the user is logged in. If they are not logged in then the user is routed to the login page. Once they login, they are routed back to the page that they initially tried to go to
  3. UnAuthenticated Route: Prevents logged in users from going to certain routes that logged in users should not go to
3

3 Answers

7
votes

Firstly I want to make very clear that mixins are not "officially deprecated" in Ember, and to my knowledge there's not even an active RFC about it. As the Upgrade Guides explain, Glimmer components do not support mixins due to not extending EmberObject, but the pre-existing framework classes (Route, Controller, etc) necessarily have to or it would be a breaking change.

There is no best option to replace mixins as it depends on the usage of the API. If you are asking how to replace ember-simple-auth mixins, my answer is that you can't until the addon itself provides alternative APIs. Mixins and the example code you posted will continue working for the foreseeable future.
You can see an example of using class inheritance to share functionality in this PR.

1
votes

when i migrated to ember Octane i tried to replace ember-simple-auth mixins, i found that it would take me lot of time than rewriting my own authentication service, my example in this twiddle, i am using cookies, Auth service if you are not using cookies , you could customize your adapter to include a token in the headers

0
votes

I circled back with ESA on Git, and the same issue I cited in my OP has been closed with a new issue that has subsequently been merged:

https://github.com/simplabs/ember-simple-auth/pull/2198

ESA has now updated their library to get rid of route mixins.