Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BUGFIX release] Improve assert in default store #19858

Merged
merged 1 commit into from Nov 30, 2021

Commits on Nov 30, 2021

  1. [BUGFIX release] Improve assert in default store

    When a route has a dynamic segment, several implicit behaviors may be
    provided by the Ember framework or by the framework in conjunction with
    a library (commonly Ember Data).
    
    * If the route class exists and has a `model(` hook implemented, then
      that logic is the explicit implementation for data loading on that
      route. In the far future (say, Ember 5), we want explicit data loading
      to be the only way data can be loaded.
    * However, today there are several implicit data loading behaviors.
      First, the user may explicitly inject a `store` service into the
      route. If a `model` hook is not implemented, the `find` method on the
      store will be called. This is, as of this writing, valid in Ember 3 &
      4 and not deprecated.
    * If a `model` hook is not implemented and if an explicit injection
      is not present, a container/owner-based
      implicit type or factor injection may have added the `store`. This
      if valid in Ember 3, but deprecated in Ember 3.28.7 (see
      emberjs#19854), and does not occur
      in Ember 4 since implicit injections are no longer supported.
    * If a `model` hook is not implemented, and if neither an explicit or
      implicit injection of `store` is made, then Ember provides a minimal
      "default store" implementation. This looks up a model matching the
      route name, and calls a `find` method on that model. If there is no
      model, an assertion is thrown. If there a model but it has no `find`,
      an assertion is thrown.
    
    This patch updates those assertions (which are very old) to better coach
    developers toward the APIs we prefer in modern development. These are:
    
    * If you have a route with dynamic segments, you should implement a
      `model` hook on the route.
    * Alternatively, and as a transition step for existing code, you may
      explicitly inject a store on the route to preserve behavior in an
      application which was relying on implicit injections.
    
    There are a lot of edge cases to consider in these copy changes. Many
    apps use Ember Data. Some apps use different data layers which also
    provide a `store` service. Some applications implement their own `store`
    and may implicitly inject it. Some use no `store` at all!
    
    Many apps use dynamic segments. Developers may not realize that if a
    model hook (or route class) has not been defined in Ember and Ember
    Data 3.28, the `store` service is being relied upon and causes
    these assertions to never be run.
    
    In Ember 3.28 accessing the implicit injection of `store` (and indeed
    all implicit injection consumption) is deprecated, so
    existing code should be upgraded to explicit injections and these
    assertions should never come into play.
    
    In Ember 4.0 developers who author:
    
    * A new dynamic segment route.
    * ...with no route class or no model hook.
    * ...and no explicit service injection.
    * ...but who also have `model` type factories (likely through Ember
      Data convention)
    
    Would see the second of the updated assertions here. This patch updates
    the message for 3.28 since it is plausible some non-conventional apps
    could be seeing this message in 3.x, especially as they upgrade to Ember
    4.0.
    mixonic committed Nov 30, 2021
    Copy the full SHA
    caf4511 View commit details
    Browse the repository at this point in the history